Showing preview only (484K chars total). Download the full file or copy to clipboard to get everything.
Repository: Hacker0x01/hacker101
Branch: master
Commit: df1c09d60511
Files: 246
Total size: 14.8 MB
Directory structure:
gitextract_psj7c2bh/
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── bug_report.md
│ ├── content-feature-request.md
│ └── feature_request.md
├── .gitignore
├── 404.html
├── CNAME
├── Gemfile
├── LICENSE
├── README.md
├── _config.yml
├── _includes/
│ ├── footer.html
│ ├── head.html
│ ├── header.html
│ └── resources_sidebar.html
├── _layouts/
│ ├── default.html
│ ├── home.html
│ ├── page.html
│ └── post.html
├── _resources/
│ ├── 00_what_is_hacker101.md
│ ├── 01_what_is_hacker101_ctf.md
│ ├── 02_how_do_i_start.md
│ ├── 03_how_do_i_do_bug_bounties.md
│ ├── 04_programming_languages.md
│ ├── 05_web_hacking_tools.md
│ ├── 06_burp_suite_plugins.md
│ ├── 07_mobile_hacking_tools.md
│ ├── 08_android_hacking_tools.md
│ ├── 09_desktop_hacking_tools.md
│ ├── 10_exploitation_resources.md
│ ├── 11_scanners_frameworks.md
│ ├── 12_datasets_freemium_services.md
│ └── 13_misc_hacking_tools.md
├── _sass/
│ ├── _bootstrap_customization.scss
│ ├── _syntax-highlighting.scss
│ ├── _variables.scss
│ ├── bootstrap/
│ │ ├── __DO_NOT_MODIFY
│ │ ├── _alert.scss
│ │ ├── _badge.scss
│ │ ├── _breadcrumb.scss
│ │ ├── _button-group.scss
│ │ ├── _buttons.scss
│ │ ├── _card.scss
│ │ ├── _carousel.scss
│ │ ├── _close.scss
│ │ ├── _code.scss
│ │ ├── _custom-forms.scss
│ │ ├── _dropdown.scss
│ │ ├── _forms.scss
│ │ ├── _functions.scss
│ │ ├── _grid.scss
│ │ ├── _images.scss
│ │ ├── _input-group.scss
│ │ ├── _jumbotron.scss
│ │ ├── _list-group.scss
│ │ ├── _media.scss
│ │ ├── _mixins.scss
│ │ ├── _modal.scss
│ │ ├── _nav.scss
│ │ ├── _navbar.scss
│ │ ├── _pagination.scss
│ │ ├── _popover.scss
│ │ ├── _print.scss
│ │ ├── _progress.scss
│ │ ├── _reboot.scss
│ │ ├── _root.scss
│ │ ├── _spinners.scss
│ │ ├── _tables.scss
│ │ ├── _toasts.scss
│ │ ├── _tooltip.scss
│ │ ├── _transitions.scss
│ │ ├── _type.scss
│ │ ├── _utilities.scss
│ │ ├── _variables.scss
│ │ ├── bootstrap-grid.scss
│ │ ├── bootstrap-reboot.scss
│ │ ├── bootstrap.scss
│ │ ├── mixins/
│ │ │ ├── _alert.scss
│ │ │ ├── _background-variant.scss
│ │ │ ├── _badge.scss
│ │ │ ├── _border-radius.scss
│ │ │ ├── _box-shadow.scss
│ │ │ ├── _breakpoints.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _caret.scss
│ │ │ ├── _clearfix.scss
│ │ │ ├── _deprecate.scss
│ │ │ ├── _float.scss
│ │ │ ├── _forms.scss
│ │ │ ├── _gradients.scss
│ │ │ ├── _grid-framework.scss
│ │ │ ├── _grid.scss
│ │ │ ├── _hover.scss
│ │ │ ├── _image.scss
│ │ │ ├── _list-group.scss
│ │ │ ├── _lists.scss
│ │ │ ├── _nav-divider.scss
│ │ │ ├── _pagination.scss
│ │ │ ├── _reset-text.scss
│ │ │ ├── _resize.scss
│ │ │ ├── _screen-reader.scss
│ │ │ ├── _size.scss
│ │ │ ├── _table-row.scss
│ │ │ ├── _text-emphasis.scss
│ │ │ ├── _text-hide.scss
│ │ │ ├── _text-truncate.scss
│ │ │ ├── _transition.scss
│ │ │ └── _visibility.scss
│ │ └── utilities/
│ │ ├── _align.scss
│ │ ├── _background.scss
│ │ ├── _borders.scss
│ │ ├── _clearfix.scss
│ │ ├── _display.scss
│ │ ├── _embed.scss
│ │ ├── _flex.scss
│ │ ├── _float.scss
│ │ ├── _interactions.scss
│ │ ├── _overflow.scss
│ │ ├── _position.scss
│ │ ├── _screenreaders.scss
│ │ ├── _shadows.scss
│ │ ├── _sizing.scss
│ │ ├── _spacing.scss
│ │ ├── _stretched-link.scss
│ │ ├── _text.scss
│ │ └── _visibility.scss
│ └── bootstrap-4-jekyll/
│ └── _bootstrap-4-jekyll.scss
├── announcements.md
├── assets/
│ ├── css/
│ │ └── main.scss
│ └── javascript/
│ ├── bootstrap/
│ │ └── __DO_NOT_MODIFY
│ └── dark-mode.js
├── conferences/
│ ├── hacktivitycon2020/
│ │ ├── 0tomvh.md
│ │ ├── beyondscope.md
│ │ ├── burnouts.md
│ │ ├── carivi.md
│ │ ├── codeql.md
│ │ ├── exploiting_email_systems.md
│ │ ├── gitlab.md
│ │ ├── grafanassrf.md
│ │ ├── keynote.md
│ │ ├── offsec_panel.md
│ │ ├── parse.md
│ │ ├── pentester_blueprint.md
│ │ ├── penteststories.md
│ │ ├── tbhm.md
│ │ ├── waf.md
│ │ └── web_cache_deception.md
│ └── hacktivitycon2021/
│ ├── bugbountyfor5years.md
│ ├── ctfdev.md
│ ├── haptyc.md
│ ├── infosec_insecure_risky.md
│ ├── keynote.md
│ ├── networking_security_tiktok.md
│ ├── offsec_panel.md
│ ├── trufflehog.md
│ └── vulnerability_research.md
├── discord.html
├── index.md
├── playlists/
│ ├── burp_suite.md
│ ├── cryptography.md
│ ├── hacktivitycon.md
│ ├── mentorshipmondays.md
│ ├── misc.md
│ ├── mobile_hacking.md
│ ├── newcomers.md
│ ├── pentesting_series.md
│ ├── playlists.html
│ └── web_hacking.md
├── resources/
│ ├── articles/
│ │ ├── asking_for_help.md
│ │ ├── code_of_conduct.md
│ │ └── writing_a_report_and_cvss.md
│ ├── hackerone_threat_model.md
│ └── slides/
│ ├── Clickjacking.pptx
│ ├── Crypto Attacks.pptx
│ ├── Crypto Crash Course.pptx
│ ├── Crypto Wrap-up.pptx
│ ├── File Inclusion.pptx
│ ├── File Upload Bugs.pptx
│ ├── Introduction.pptx
│ ├── Null Termination.pptx
│ ├── Password Storage.pptx
│ ├── SQL Injection and Friends.pptx
│ ├── Session Fixation.pptx
│ ├── The Web in Depth.pptx
│ ├── Threat Modeling.pptx
│ ├── Unchecked Redirects.pptx
│ └── XSS and Authorization.pptx
├── resources.md
├── sessions/
│ ├── android/
│ │ ├── common_android_bugs_1.md
│ │ ├── common_android_bugs_2.md
│ │ ├── hacking_workshop_b3nac.md
│ │ └── quickstart.md
│ ├── burp101.md
│ ├── burp201.md
│ ├── burp301.md
│ ├── clickjacking.md
│ ├── cookie_tampering.md
│ ├── crypto_attacks.md
│ ├── crypto_crash_course.md
│ ├── crypto_wrap_up.md
│ ├── docker_hacking.md
│ ├── file_inclusion.md
│ ├── file_uploads.md
│ ├── good_reports.md
│ ├── iOS/
│ │ ├── app_transport.md
│ │ ├── application_basics.md
│ │ ├── filesystem.md
│ │ ├── interapp_communication.md
│ │ ├── ios_quickstart.md
│ │ └── webviews.md
│ ├── introduction.md
│ ├── javascript_for_hackers.md
│ ├── mm/
│ │ ├── s01/
│ │ │ ├── ctf_vs_bugbounty.md
│ │ │ ├── h1-elite.md
│ │ │ ├── hackthegovt.md
│ │ │ ├── how_to_pentest.md
│ │ │ ├── howtoshodan.md
│ │ │ ├── mentalhealth.md
│ │ │ └── mobile_hacking.md
│ │ └── s02/
│ │ ├── getting_started.md
│ │ ├── h1_CHO.md
│ │ ├── how_to_pick_a_target.md
│ │ ├── how_to_write_reports.md
│ │ ├── industry_certificates.md
│ │ └── starting_a_career.md
│ ├── mobile_crash_course.md
│ ├── native_code_crash_course.md
│ ├── null_termination.md
│ ├── password_storage.md
│ ├── pentest_owasp.md
│ ├── pentest_reporting.md
│ ├── pentest_resources.md
│ ├── pentest_vs_bug_bounty.md
│ ├── secure_architecture.md
│ ├── session_fixation.md
│ ├── sessions.html
│ ├── source_review.md
│ ├── sqli.md
│ ├── ssrf.md
│ ├── threat_modeling.md
│ ├── unchecked_redirects.md
│ ├── web_in_depth.md
│ ├── xss.md
│ └── xxe.md
├── start-here.md
├── update_bootstrap.sh
└── videos.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG] "
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/content-feature-request.md
================================================
---
name: Content Feature request
about: Suggest an idea for this project
title: "[CONTENT] "
labels: 'content request'
assignees: ''
---
**Is your content request driven by a specific need or issue? Please elaborate.**
A clear and concise explanation of the issue or need prompting your request. For example, "I often find it challenging when..."
**What specific content are you hoping to see added?**
Describe clearly and precisely what content you would like to see included.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE] "
labels: 'feature request'
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .gitignore
================================================
.DS_Store
.jekyll-cache/
.jekyll-metadata
.sass-cache/
Gemfile.lock
_site/
vendor/
================================================
FILE: 404.html
================================================
---
layout: default
---
<div class="d-flex h-100 align-items-center">
<div class="container text-center">
<h1>404</h1>
<p><strong>Page not found :(</strong></p>
<p>The requested page could not be found.</p>
</div>
</div>
================================================
FILE: CNAME
================================================
www.hacker101.com
================================================
FILE: Gemfile
================================================
source "https://rubygems.org"
gem "github-pages", group: :jekyll_plugins
gem "webrick", "~> 1.8"
================================================
FILE: LICENSE
================================================
Copyright © 2020 HackerOne Inc.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License:
Attribution-NonCommercial-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More_considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International Public License
("Public License"). To the extent this Public License may be
interpreted as a contract, You are granted the Licensed Rights in
consideration of Your acceptance of these terms and conditions, and the
Licensor grants You such rights in consideration of benefits the
Licensor receives from making the Licensed Material available under
these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-NC-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution, NonCommercial, and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. NonCommercial means not primarily intended for or directed towards
commercial advantage or monetary compensation. For purposes of
this Public License, the exchange of the Licensed Material for
other material subject to Copyright and Similar Rights by digital
file-sharing or similar means is NonCommercial provided there is
no payment of monetary compensation in connection with the
exchange.
l. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
m. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
n. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part, for NonCommercial purposes only; and
b. produce, reproduce, and Share Adapted Material for
NonCommercial purposes only.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties, including when
the Licensed Material is used other than for NonCommercial
purposes.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-NC-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database for NonCommercial purposes
only;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.
================================================
FILE: README.md
================================================
# Hacker101
[Hacker101](https://www.hacker101.com/) is a free class for web security.
Whether you're a programmer with an interest in bug bounties or a seasoned
security professional, Hacker101 has something to teach you.
## Getting Started
### Prerequisites
- Ruby
- Suggestion: use [`rbenv`](https://github.com/rbenv/rbenv)
- `bundler`
- Run `gem install bundler`, if needed
### Installing
Clone this repo:
```
git clone https://github.com/Hacker0x01/hacker101.git
```
In the project directory, run:
```
bundle install
```
Build the site and spin up the server:
```
bundle exec jekyll serve
```
Browse to [http://localhost:4000](http://localhost:4000)
## Contributing
Issues and pull requests are welcome on [GitHub](
https://github.com/Hacker0x01/hacker101)!
================================================
FILE: _config.yml
================================================
title: Hacker101
email: support@hackerone.com
description: >-
Hacker101 is a free class for web security. Whether you're a programmer with
an interest in bug bounties or a seasoned security professional, Hacker101
has something to teach you.
author:
name: HackerOne
twitter: Hacker0x01
google_analytics: UA-49905813-8
markdown: kramdown
url: https://www.hacker101.com
twitter:
username: Hacker0x01
facebook:
app_id: 345444188982280
github:
username: Hacker0x01
social:
links:
- https://twitter.com/Hacker0x01
- https://www.facebook.com/Hacker0x01
- https://www.linkedin.com/company/hackerone
- https://github.com/Hacker0x01
plugins:
- jekyll-redirect-from
- jekyll-seo-tag
- jekyll-sitemap
# A list of the pages to display in the navigation bar
header_pages:
collections:
resources:
exclude:
[
.bundle,
.gitignore,
CNAME,
Gemfile,
Gemfile.lock,
LICENSE,
node_modules,
README.md,
update_bootstrap.sh,
vendor,
]
================================================
FILE: _includes/footer.html
================================================
<footer class="flex-shrink-0 bg-dark py-3">
<div class="container d-flex justify-content-between">
<a href="https://www.hackerone.com/start-hacking" class="text-light d-flex align-items-center">
<img src="/assets/logo_h1.png" alt="Start hacking on HackerOne" width="16" height="30" class="mr-3">
Powered by HackerOne
</a>
<div>
<a href="{{ site.github.repository_url }}/edit/master/{{ page.path }}"
class="text-light mr-2 d-none d-md-inline">
Edit this page
</a>
<a href="{{ site.github.repository_url }}">
<img src="/assets/github.png" alt="Contribute on GitHub" width="30" height="30" class="mr-3">
</a>
<a href="https://twitter.com/Hacker0x01">
<img src="/assets/twitter.png" alt="Follow us on Twitter" width="30" height="30">
</a>
</div>
</div>
</footer>
================================================
FILE: _includes/head.html
================================================
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
{%- seo -%}
<link rel="icon" type="image/png" href="{{ "/assets/images/favicon.png" | relative_url }}" />
<link rel="stylesheet" href="{{ "/assets/css/main.css" | relative_url }}">
<link rel="preload" href="{{ "/assets/fonts/effra-light.woff" | relative_url }}" as="font" type="font/woff" crossorigin>
<link rel="preload" href="{{ "/assets/fonts/effra-regular.woff" | relative_url }}" as="font" type="font/woff" crossorigin>
<link rel="preload" href="{{ "/assets/fonts/effra-medium.woff" | relative_url }}" as="font" type="font/woff" crossorigin>
<script src="{{ "/assets/javascript/bootstrap/jquery.min.js" | relative_url }}"></script>
<script src="{{ "/assets/javascript/bootstrap/bootstrap.bundle.min.js" | relative_url }}"></script>
</head>
================================================
FILE: _includes/header.html
================================================
<header class="flex-shrink-0">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a href="{{ "/" | relative_url }}" class="navbar-brand" rel="author">
<img src="/assets/Hacker101_logo.png" alt="View Hacker101 homepage" height="30">
</a>
{%- assign page_paths = site.header_pages -%}
<button class="navbar-toggler p-0 border-0" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a href="{{ "/start-here" | relative_url }}" class="nav-link text-light">
Getting Started
</a>
</li>
<li class="nav-item">
<a href="{{ "/videos" | relative_url }}" class="nav-link text-light">
Videos
</a>
</li>
<li class="nav-item">
<a href="https://ctf.hacker101.com/" target="_blank" class="nav-link text-light">
CTF
</a>
</li>
<li class="nav-item">
<a href="{{ "/resources" | relative_url }}" class="nav-link text-light">
Resources
</a>
</li>
<li class="nav-item">
<a href="{{ "/discord" | relative_url }}" class="nav-link text-light">
Discord
</a>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<a href="#" id="mode-light" title="Toggle dark mode" class="mode-toggle d-none">
<img src="/assets/images/icons/dark-mode.svg" alt="Toggle dark mode" width="20" height="20"/>
</a>
<a href="#" id="mode-dark" title="Toggle light mode" class="mode-toggle">
<img src="/assets/images/icons/light-mode.svg" alt="Toggle light mode" width="20" height="20"/>
</a>
</ul>
</div>
</div>
</nav>
</header>
================================================
FILE: _includes/resources_sidebar.html
================================================
<ul>
{% for resource in site.resources %}
<li>
<a href="/resources#{{ resource.title | url_encode }}">{{ resource.title }}</a>
</li>
{% endfor %}
</ul>
================================================
FILE: _layouts/default.html
================================================
<!DOCTYPE html>
<html class="bg-dark" lang="{{ page.lang | default: site.lang | default: "en" }}">
{%- include head.html -%}
<body class="d-flex flex-column vh-100">
{%- include header.html -%}
<main role="main" class="flex-grow-1 bg-black text-light">
{{ content }}
</main>
{%- include footer.html -%}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ site.google_analytics }}');
</script>
<script async src="/assets/javascript/dark-mode.js"></script>
</body>
</html>
================================================
FILE: _layouts/home.html
================================================
---
layout: default
---
<div>
{%- if page.title -%}
<header>
<h1>{{ page.title }}</h1>
</header>
{%- endif -%}
<section>
{{ content }}
</section>
{%- if site.posts.size > 0 -%}
<p class="h4">{{ page.list_title | default: "Posts" }}</p>
<ul class="list-unstyled">
{%- for post in site.posts -%}
<li>
<span class="text-muted">
{%- assign date_format = "%b %-d, %Y" -%}
{{ post.date | date: date_format }}
</span>
<p class="h5">
<a href="{{ post.url | relative_url }}">
{{ post.title | escape }}
</a>
</p>
{%- if site.show_excerpts -%}
{{ post.excerpt }}
{%- endif -%}
</li>
{%- endfor -%}
</ul>
<p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | relative_url }}">via RSS</a></p>
{%- endif -%}
</div>
================================================
FILE: _layouts/page.html
================================================
---
layout: default
---
<div class="container py-4">
<div class="row">
<div class="col-lg-8">
<article>
{%- if page.title -%}
<div class="row">
<header class="col-md-12 mb-4">
<h1 class="text-uppercase">{{ page.title | escape }}</h1>
<span class="h3 font-weight-light text-uppercase">{{ page.subtitle | escape }}</span>
</header>
</div>
{%- endif -%}
<section>
{{ content }}
</section>
{% if page.video_src %}
<h2 id="video">Video</h2>
<div class="embed-responsive embed-responsive-16by9">
{% if page.video_src contains "?" %}
{% assign symbol = "&" %}
{% else %}
{% assign symbol = "?" %}
{% endif %}
<iframe
id="ytplayer"
type="text/html"
src="{{ page.video_src }}{{ symbol }}rel=0&autoplay=0&origin={{ site.url }}"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
</div>
{% endif %}
{% if page.previous_url or page.next_url %}
<hr />
{% if page.cta_description %}
<div class="mb-3">
{{ page.cta_description }}
</div>
{% endif %}
{% if page.previous_url %}
<a href="{{ page.previous_url }}" class="btn btn-outline-primary float-left">
{{ page.previous_text | default: "Previous video" }}
</a>
{% endif %}
{% if page.next_url %}
<a href="{{ page.next_url }}" class="btn btn-primary float-right">
{{ page.next_text | default: "Next video" }}
</a>
{% endif %}
{% endif %}
</article>
</div>
{% if page.sidebar %}
<div class="col-lg-4" id="sidebar">
<section>
{% for section in page.sidebar %}
{% if section.title %}
<div class="h5">{{ section.title }}</div>
{% endif %}
{% if section.subtitle %}
<div class="h6">{{ section.subtitle }}</div>
{% endif %}
{% if section.links %}
<ul>
{% for link in section.links %}
<li>
<a href={{ link.url }}>{{ link.text }}</a>
{% if link.updated %}
<span class="badge badge-pill badge-secondary">Updated!</span>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
{% if section.resources %}
{% include resources_sidebar.html %}
{% endif %}
{% endfor %}
</section>
</div>
{% endif %}
</div>
</div>
================================================
FILE: _layouts/post.html
================================================
---
layout: default
---
<article>
<header>
<h1>{{ page.title | escape }}</h1>
<p class="text-muted">
<time datetime="{{ page.date | date_to_xmlschema }}">
{%- assign date_format = "%b %-d, %Y" -%}
{{ page.date | date: date_format }}
</time>
{%- if page.author -%}
• {{ page.author }}
{%- endif -%}
</p>
</header>
<section>
{{ content }}
</section>
</article>
================================================
FILE: _resources/00_what_is_hacker101.md
================================================
---
title: What is Hacker101?
---
Hacker101 is a free educational resource developed by [HackerOne](https://www.hackerone.com/) to grow and empower the hacker community at large. We have video lessons and curated resources to help you learn the concepts of hacking and a <a href="https://ctf.hacker101.com/" target="_blank">Capture the Flag</a> where you can turn that theory into practice.
================================================
FILE: _resources/01_what_is_hacker101_ctf.md
================================================
---
title: What is the Hacker101 CTF?
---
The <a href="https://ctf.hacker101.com/" target="_blank">Hacker101 CTF</a> -- or Capture the Flag -- is a game where you hack through levels to find bits of data called flags. These flags mark your progress and allow you to receive invitations to private programs on [HackerOne](https://www.hackerone.com/), where you can use your newly-learned skills.
================================================
FILE: _resources/02_how_do_i_start.md
================================================
---
title: I'm new to all of this; how do I get started?
---
Congratulations on taking the first step to becoming a hacker! We recommend starting with our [Hacker101 for Newcomers](/playlists/newcomers) and [Burp Suite](/playlists/burp_suite) playlists. Once you've completed that, start working through the <a href="https://ctf.hacker101.com/" target="_blank">Hacker101 CTF</a> and watching the other [video lessons](/videos) as you need them. While there are no prerequisites for Hacker101, strictly speaking, there are things you can learn to accelerate your hacking education. Note that you don't need to know all of this -- or any -- to get started. Here's a curated list of resources:
* Programming
* [JavaScript](https://javascript.info/): This is the language used on the majority of web pages. Understanding it is useful for bug hunting because many bugs actually stem from JS code.
* [Python](https://docs.python.org/3/tutorial/): Commonly used for automating various activities during testing, as well as being useful for general programming.
* [SQL](https://sqlbolt.com/): Used by most applications for accessing and manipulating data. Knowledge of SQL will help in discovering and exploiting critical SQL Injection vulnerabilities.
* Networking
* [Terminology guide](https://www.digitalocean.com/community/tutorials/an-introduction-to-networking-terminology-interfaces-and-protocols): You'll hear many terms from IP address to port to DNS. This guide will help you understand that.
* [Common Port Numbers](https://www.utilizewindows.com/list-of-common-network-port-numbers/): A useful list of common port numbers and the associated services.
* Linux
* [Setting up your own web server](https://www.linux.com/training-tutorials/easy-lamp-server-installation): While not security-related in itself, this will teach you many of the commands and concepts you need to know to become a great hacker.
* [Setting up Kali Linux on Virtualbox](https://linuxconfig.org/how-to-install-kali-linux-on-virtualbox): Kali is a hacking-oriented Linux distribution, used by many bug hunters. This guide will help you set it up in a virtual machine.
* [Command Line Guide](https://lifehacker.com/a-command-line-primer-for-beginners-5633909?IR=T): You'll end up using many command-line tools as a hacker, so a familiarity with its structure and use is valuable.
================================================
FILE: _resources/03_how_do_i_do_bug_bounties.md
================================================
---
title: I've been hacking for a while now; how do I get into bug bounties?
---
We recommend <a href="https://hackerone.com/users/sign_up" target="_blank">signing up</a> for a HackerOne account and checking out our extensive programs. Additionally, you can earn invitations to private programs on HackerOne via the <a href="https://ctf.hacker101.com/" target="_blank">Hacker101 CTF</a>. This gets you into programs with fewer hackers, often making it easier to find interesting and impactful bugs.
================================================
FILE: _resources/04_programming_languages.md
================================================
---
title: Programming languages
---
Programming is an important part of being a successful hacker. This isn't a comprehensive list of programming languages and nearly any can be used for most hacking tasks, especially on the web, but rather a list of languages we find especially useful or notable.
* Python and Ruby: Useful for automation and quick testing and analysis, particularly for web hacking.
* JavaScript: Can be used for the same tasks as Python and Ruby (albeit with fewer relevant libraries), but mostly useful to know for analysis of code on the web, as well as exploitation.
* Objective-C and Swift: The ability to read these will be essential if you plan to do source code review of iOS applications.
* Java and Kotlin: The ability to read these will be essential if you plan to do source code review of Android applications. Java is produced by decompilers for Android applications, which allows you to read code (roughly) equivalent to the original source, even when you only have a compiled application.
* AArch64 assembly: For advanced embedded and mobile hacking, understanding the very lowest level of abstraction is essential.
================================================
FILE: _resources/05_web_hacking_tools.md
================================================
---
title: Web hacking tools
---
This is a curated list of web hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [Altdns](https://github.com/infosec-au/altdns): Altdns is a DNS recon tool that allows for the discovery of subdomains that conform to patterns. Altdns takes in words that could be present in subdomains under a domain (such as test, dev, staging), as well as a list of known subdomains.
* [Amass](https://github.com/OWASP/Amass): The OWASP Amass Project performs network mapping of attack surfaces and external asset discovery using open source information gathering and active reconnaissance techniques.
* [Aquatone](https://github.com/michenriksen/aquatone): Aquatone is a tool for visual inspection of websites across a large number of hosts, which provides a convenient overview of HTTP-based attack surface.
* [BBHT](https://github.com/nahamsec/bbht): Bug Bounty Hunting Tools is a script to install the most popular tools used while looking for vulnerabilities for a bug bounty program.
* [Burp Suite](https://portswigger.net/burp): This is the most popular proxy in web hacking circles due to its cross-platform nature and extensive featureset. See [our playlist](/playlists/burp_suite) to make the most of it. Also see our "Burp Suite Plugins" list for useful plugins to use.
* [chaos](https://chaos.projectdiscovery.io): Chaos actively scans and maintains internet-wide assets' data. This project is meant to enhance research and analyze changes around DNS for better insights.
* [Commit-stream](https://github.com/x1sec/commit-stream): Commit-stream extracts commit logs from the Github event API, exposing the author details (name and email address) associated with Github repositories in real time.
* [Dirb](https://github.com/v0re/dirb): DIRB is a web content scanner. It launches a dictionary based attack against a web server and analyzes the response.
* [Dirsearch](https://github.com/maurosoria/dirsearch): a simple command line tool designed to brute force directories and files in websites.
* [Dngrep](https://github.com/erbbysam/DNSGrep): A utility for quickly searching presorted DNS names. Built around the Rapid7 rdns & fdns dataset.
* [Dnscan](https://github.com/rbsec/dnscan): dnscan is a python wordlist-based DNS subdomain scanner
* [Dnsgen](https://github.com/ProjectAnte/dnsgen): This tool generates a combination of domain names from the provided input. Combinations are created based on wordlist. Custom words are extracted per execution.
* [Dnsprobe](https://github.com/projectdiscovery/dnsprobe): DNSProbe is a tool built on top of retryabledns that allows you to perform multiple dns queries of your choice with a list of user supplied resolvers.
* [EyeWitnees](https://github.com/FortyNorthSecurity/EyeWitness): EyeWitness is designed to take screenshots of websites, provide some server header info, and identify any default credentials. EyeWitness is designed to run on Kali Linux. It will auto detect the file you give it with the -f flag as either being a text file with URLs on each new line, nmap xml output, or nessus xml output. The --timeout flag is completely optional, and lets you provide the max time to wait when trying to render and screenshot a web page.
* [Ffuf](https://github.com/ffuf/ffuf): A fast web fuzzer written in Go.
* [Findomain](https://github.com/Findomain/Findomain): Findomain offers a dedicated monitoring service hosted in Amazon (only the local version is free), that allows you to monitor your target domains and send alerts to Discord and Slack webhooks or Telegram chats when new subdomains are found.
* [Gau](https://github.com/lc/gau): getallurls (gau) fetches known URLs from AlienVault's Open Threat Exchange, the Wayback Machine, and Common Crawl for any given domain. Inspired by Tomnomnom's waybackurls.
* [gitGraber](https://github.com/hisxo/gitGraber): gitGraber is a tool developed in Python3 to monitor GitHub to search and find sensitive data in real time for different online services.
* [Httprobe](https://github.com/tomnomnom/httprobe): Takes a list of domains and probes for working http and https servers.
* [Jok3r](https://hub.docker.com/r/koutto/jok3r/): Jok3r is a framework that helps penetration testers with network infrastructure and web security assessments. Its goal is to automate as much as possible in order to quickly identify and exploit "low-hanging fruit" and "quick win" vulnerabilities on most common TCP/UDP services and most common web technologies (servers, CMS, languages...).
* [JSParser](https://github.com/nahamsec/JSParser): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. This is especially useful for discovering AJAX requests when performing security research or bug bounty hunting.
* [Knockpy](https://github.com/guelfoweb/knock): Knockpy is a python tool designed to enumerate subdomains on a target domain through a word list. It is designed to scan for a DNS zone transfer and bypass the wildcard DNS record automatically, if it is enabled. Knockpy now supports queries to VirusTotal subdomains, you can set the API_KEY within the config.json file.
* [lazyrecon](https://github.com/nahamsec/lazyrecon): This is an assembled collection of tools for performing recon.
* [lazys3](https://github.com/nahamsec/lazys3): A Ruby script to brute-force for AWS s3 buckets using different permutations.
* [Masscan](https://github.com/robertdavidgraham/masscan): This is an Internet-scale port scanner. It can scan the entire Internet in under 6 minutes, transmitting 10 million packets per second, all from a single machine.
* [Massdns](https://github.com/blechschmidt/massdns): MassDNS is a simple high-performance DNS stub resolver targeting those who seek to resolve a massive amount of domain names in the order of millions or even billions. Without special configuration, MassDNS is capable of resolving over 350,000 names per second using publicly available resolvers.
* [Meg](https://github.com/tomnomnom/meg): Meg is a tool for fetching lots of URLs without taking a toll on the servers. It can be used to fetch many paths for many hosts, or fetching a single path for all hosts before moving on to the next path and repeating.
* [mitmproxy](https://mitmproxy.org/): This is an open-source proxy written in Python. Not recommended for beginners, but this can be a powerful tool.
* [Naabu](https://github.com/projectdiscovery/naabu): naabu is a port scanning tool written in Go that allows you to enumerate valid ports for hosts in a fast and reliable manner. It is a really simple tool that does fast SYN scans on the host/list of hosts and lists all ports that return a reply.
* [Nikto2](https://cirt.net/Nikto2): Like DirBuster, but also does some basic checks for known vulnerabilities.
* [Nuclei](https://github.com/projectdiscovery/nuclei): Nuclei is a fast tool for configurable targeted scanning based on templates offering massive extensibility and ease of use.
* [OWASP Zed](https://www.zaproxy.org/): OWASP Zed Attack Proxy (ZAP) is an open source tool which is offered by OWASP (Open Web Application Security Project), for penetration testing of your website/web application. It helps you find the security vulnerabilities in your application.
* [Recon_profile](https://github.com/nahamsec/recon_profile): This tool is to help create easy aliases to run via an SSH/terminal.
* [Recon-ng](https://github.com/lanmaster53/recon-ng): Recon-ng is a full-featured reconnaissance framework designed with the goal of providing a powerful environment to conduct open source, web-based reconnaissance quickly and thoroughly.
* [Shhgit](https://github.com/eth0izzle/shhgit): Shhgit finds secrets and sensitive files across GitHub code and Gists committed in nearly real-time by listening to the GitHub Events API.
* [Shuffledns](https://github.com/projectdiscovery/shuffledns): shuffleDNS is a wrapper around massdns written in go that allows you to enumerate valid subdomains using active bruteforce, as well as resolve subdomains with wildcard handling and easy input-output support.
* [sqlmap](https://sqlmap.org/): This allows for easy discovery and exploitation of SQL injection vulnerabilities. It **will not** catch every bug or even be able to exploit some known SQLi bugs. What it will do is make your life much easier in the 80% of cases it will work for.
* [SSL Labs Server Test](https://www.ssllabs.com/ssltest/): This is an easy to use webapp for testing the SSL configuration of web servers.
* [Subfinder](https://github.com/projectdiscovery/subfinder): subfinder is a subdomain discovery tool that discovers valid subdomains for websites by using passive online sources. It has a simple modular architecture and is optimized for speed. subfinder is built for doing one thing only - passive subdomain enumeration, and it does that very well.
* [Subjack](https://github.com/haccer/subjack): Subjack is a Subdomain Takeover tool written in Go designed to scan a list of subdomains concurrently and identify ones that are able to be hijacked. With Go's speed and efficiency, this tool really stands out when it comes to mass-testing. Always double check the results manually to rule out false positives.
* [Sublert](https://github.com/yassineaboukir/sublert): Sublert is a security and reconnaissance tool that was written in Python to leverage certificate transparency for the sole purpose of monitoring new subdomains deployed by specific organizations and an issued TLS/SSL certificate. The tool is supposed to be scheduled to run periodically at fixed times, dates, or intervals (Ideally each day). New identified subdomains will be sent to Slack workspace with a notification push. Furthermore, the tool performs DNS resolution to determine working subdomains.
* [Sublist3r](https://github.com/aboul3la/Sublist3r): Sublist3r is a python tool designed to enumerate subdomains of websites using OSINT. It helps penetration testers and bug hunters collect and gather subdomains for the domain they are targeting. Sublist3r enumerates subdomains using many search engines such as Google, Yahoo, Bing, Baidu and Ask. Sublist3r also enumerates subdomains using Netcraft, Virustotal, ThreatCrowd, DNSdumpster and ReverseDNS.
* [Teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers): Teh_s3_bucketeers is a security tool to discover S3 buckets on Amazon's AWS platform.
* [Unfurl](https://github.com/JLospinoso/unfurl): Unfurl is a tool that analyzes large collections of URLs and estimates their entropies to sift out URLs that might be vulnerable to attack.
* [Virtual-host-discovery](https://github.com/jobertabma/virtual-host-discovery): This is a basic HTTP scanner that enumerates virtual hosts on a given IP address. During recon, this might help expand the target by detecting old or deprecated code. It may also reveal hidden hosts that are statically mapped in the developer's /etc/hosts file.
* [Waybackurls](https://github.com/tomnomnom/waybackurls): Accept line-delimited domains on stdin, fetch known URLs from the Wayback Machine for \*.domain and output them on stdout.
* [Webscreenshot](https://github.com/maaaaz/webscreenshot): A simple script to screenshot a list of websites, based on the url-to-image PhantomJS script.
* [Wfuzz](https://github.com/xmendez/wfuzz): Wfuzz has been created to facilitate the task in web applications assessments and it is based on a simple concept: it replaces any reference to the FUZZ keyword by the value of a given payload.
* [Whatweb](https://github.com/urbanadventurer/WhatWeb): WhatWeb recognises web technologies including content management systems (CMS), blogging platforms, statistic/analytics packages, JavaScript libraries, web servers, and embedded devices. WhatWeb has over 1800 plugins, each to recognise something different. WhatWeb also identifies version numbers, email addresses, account IDs, web framework modules, SQL errors, and more.
* [Wpscan](https://github.com/wpscanteam/wpscan): WPScan is a free (for non-commercial use) black box WordPress security scanner written for security professionals and bloggers to test the security of their sites.
* [nmmapper](https://www.nmmapper.com/sys/tools/subdomainfinder/): A Collection of 8 subdomain finders hosted online for quick usage, this include, sublist3r, amass, findomain,knocky,anubis subdomain finder, dnscan, nmap subrute,lepu subdomain and even waybackurl.
================================================
FILE: _resources/06_burp_suite_plugins.md
================================================
---
title: Burp Suite plugins
---
[Burp Suite](https://portswigger.net/burp): The quintessential web app hacking tool. Once you hit 500 reputation on HackerOne, you are eligible for a free 3-month license of Burp Suite Pro!
This is a curated list of Burp plugins and is not intended to be comprehensive; rather, we want to highlight the plugins we find especially useful.
* [ActiveScan++](https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1acc4976): ActiveScan++ extends Burp Suite's active and passive scanning capabilities. Designed to add minimal network overhead, it identifies application behavior that may be of interest to advanced testers.
* [Autorepeater Burp](https://github.com/nccgroup/AutoRepeater): Automated HTTP request repeating with Burp Suite.
* [Autorize Burp](https://portswigger.net/bappstore/f9bbac8c4acf4aefa4d7dc92a991af2f): Autorize is an extension aimed at helping the penetration tester to detect authorization vulnerabilities —one of the more time-consuming tasks in a web application penetration test.
* [BurpSentinel](https://github.com/dobin/BurpSentinel): With BurpSentinel it is possible for the penetration tester to quickly and easily send a lot of malicious requests to parameters of a HTTP request. Not only that, but it also shows a lot of information of the HTTP responses, corresponding to the attack requests. It's easy to find low-hanging fruit and hidden vulnerabilities like this, and it also allows the tester to focus on more important stuff!
* [Flow](https://portswigger.net/bappstore/ee1c45f4cc084304b2af4b7e92c0a49d): This extension provides a Proxy history-like view along with search filter capabilities for all Burp tools.
* [Headless Burp](https://portswigger.net/bappstore/d54b11f7af3c4dfeb6b81fb5db72e381): This extension allows you to run Burp Suite's Spider and Scanner tools in headless mode via the command-line.
* [Logger++](https://portswigger.net/bappstore/470b7057b86f41c396a97903377f3d81): Logger++ is a multi-threaded logging extension for Burp Suite. In addition to logging requests and responses from all Burp Suite tools, the extension allows advanced filters to be defined to highlight interesting entries or filter logs to only those which match the filter.
* [WSDL Wizard](https://portswigger.net/bappstore/ef2f3f1a593d417987bb2ddded760aee): This extension scans a target server for WSDL files. After performing normal mapping of an application's content, right click on the relevant target in the site map, and choose "Scan for WSDL files" from the context menu. The extension will search the already discovered contents for URLs with the .wsdl file extension, and guess the locations of any additional WSDL files based on the file names known to be in use. The results of the scanning appear within the extension's output tab in the Burp Extender tool.
================================================
FILE: _resources/07_mobile_hacking_tools.md
================================================
---
title: Mobile hacking tools
---
This is a curated list of mobile hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [dex2jar](https://github.com/pxb1988/dex2jar): Converts dex code (Android bytecode) into Java JAR files for manipulation or decompilation.
* [dotPeek](https://www.jetbrains.com/decompiler/): A .NET decompiler, for use with Xamarin Android applications.
* [Frida "Universal" SSL Unpinner](https://gist.github.com/teknogeek/4dc35fb3801bd7f13e5f0da5b784c725): Universal unpinner.
* [Frida](https://frida.re/): This is an instrumentation system allowing injection of JavaScript or native libraries into arbitrary mobile applications on iOS and Android. In essence, it makes it painless to change, enhance, or disable functionality in applications.
* [Genymotion](https://www.genymotion.com/): Cross-platform Android emulator for developers & QA engineers. Develop & automate your tests to deliver best quality apps.
* [Jadx](https://github.com/skylot/jadx): Jadx is a dex to Java decompiler. The command line and GUI tools for producing Java source code from Android Dex and Apk files.
* [JD-GUI](https://java-decompiler.github.io/): This is a Java decompiler, useful after dex2jar for easy analysis of Android apps.
* [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF): An automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis.
* [Online Decompiler](https://www.decompiler.com/): APK, JAR and .NET online decompiler.
* [Radare2](https://rada.re/n/): A free/libre toolchain for easing several low level tasks, such as forensics, software reverse engineering, exploiting, debugging, etc. It is composed by a large number of libraries (which are extended with plugins) and programs that can be automated with almost any programming language.
================================================
FILE: _resources/08_android_hacking_tools.md
================================================
---
title: Android hacking tools
---
This is a curated list of Android hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
### Videos
- [Hacker101 - Android Quickstart](https://www.youtube.com/watch?v=y0O3sCX9ftM)
- [Hacker101 - Mobile Hacking Crash Course](https://www.youtube.com/watch?v=hKF89TXttnw)
- [Hacker101: Common Android Bugs Pt. 1](https://www.youtube.com/watch?v=sQ_34dI_geU)
- [Hacker101: Common Android Bugs Pt. 2](https://www.youtube.com/watch?v=tt1f4pcI0jo)
- [Android Pentesting Video Playlist](https://www.youtube.com/playlist?list=PLgnrksnL_Rn09gGTTLgi-FL7HxPOoDk3R)
- [Low Competition Bug Hunting (What to Learn) - ft. #AndroidHackingMonth](https://www.youtube.com/watch?v=Pkd_j31Jtfc)
### Blog Posts
- [#Androidhackingmonth: Introduction to Android Hacking by @0xteknogeek](https://www.hackerone.com/blog/androidhackingmonth-intro-to-android-hacking)
- [QA with Android Hacker: Bagipro](https://www.hackerone.com/blog/AndroidHackingMonth-qa-with-bagipro)
- [Hacking SMS API Service Provider of a Company - Android App Static Security Analysis](https://blog.securitybreached.org/2020/02/19/hacking-sms-api-service-provider-of-a-company-android-app-static-security-analysis-bug-bounty-poc/)
- [Getting Started in Android Apps Pen-testing (Part-1)](https://blog.securitybreached.org/2020/03/17/getting-started-in-android-apps-pentesting/)
### Example Reports
- [Periscope android app deeplink leads to CSRF in follow action](https://hackerone.com/reports/583987)
- [Twitter lite(Android): Vulnerable to local file steal, Javascript injection, Open redirect](https://hackerone.com/reports/499348)
- [Golden techniques to bypass host validations in Android apps](https://hackerone.com/reports/431002)
- [SQL Injection found in NextCloud Android App Content Provider](https://hackerone.com/reports/291764)
- [Quora Android - Possible to steal arbitrary files from mobile device](https://hackerone.com/reports/258460)
- [Opening arbitrary URLs/XSS in SAMLAuthActivity](https://hackerone.com/reports/283058)
- [Access of Android protected components via embedded intent](https://hackerone.com/reports/200427)
### Other Resources
- [The Mobile Hacking CheatSheet](https://github.com/randorisec/MobileHackingCheatSheet)
- [Mobile App Pentest Cheatsheet](https://github.com/tanprathan/MobileApp-Pentest-Cheatsheet)
- [Awesome Mobile Security](https://github.com/vaib25vicky/awesome-mobile-security)
- [Mobile Penetration Testing Kit](https://www.eshlomo.us/mobile-penetration-testing-kit/)
- [Periscope android app deeplink leads to CSRF in follow action](https://hackerone.com/reports/583987)
### Practice Labs
- [Damn Insecure and vulnerable App for Android](https://github.com/payatu/diva-android)
- [InjuredAndroid](https://github.com/B3nac/InjuredAndroid)
- [Android-InsecureBankv2](https://github.com/dineshshetty/Android-InsecureBankv2)
================================================
FILE: _resources/09_desktop_hacking_tools.md
================================================
---
title: Desktop / embedded hacking tools
---
This is a curated list of hacking tools for native applications and embedded devices and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [american fuzzy lop](https://lcamtuf.coredump.cx/afl/): AFL is an extremely powerful fuzzer, enabling detection of complicated bugs in many applications and libraries.
* [Binary Ninja](https://binary.ninja/): Another low-cost alternative to IDA. Its API is perhaps the most powerful of the three for automating analysis of code.
* [Binwalk](https://github.com/ReFirmLabs/binwalk): Used for firmware analysis and extraction. This is primarily useful for embedded Linux devices.
* [dotPeek](https://www.jetbrains.com/decompiler/): A powerful decompiler for .NET assemblies.
* [GNU strings](https://en.wikipedia.org/wiki/Strings_(Unix)): Finds strings in arbitrary binaries. While not strictly for reverse-engineering, it is among the most useful tools around.
* [Hopper](https://www.hopperapp.com/): This is a fantastic, low-cost disassembler and decompiler that runs on macOS and Linux. While it's no replacement for IDA, it is a great choice for most applications.
* [HxD](https://mh-nexus.de/en/hxd/) (Windows) [0xED](https://www.suavetech.com/0xed/) (macOS): These are graphical hex editors, useful for analysis and manipulation of files and block devices.
* [IDA Pro and Hex-Rays Decompiler](https://hex-rays.com/ida-pro/): IDA is the absolute gold standard for disassemblers and its decompiler plugins are the gold standard for decompilation. It is a wonderful tool with support for nearly every obscure platform and an extensive (if confusing) SDK to add nearly any feature you can imagine. However, its price makes it difficult to justify.
* [PE Explorer](http://www.heaventools.com/overview.htm): This is a great tool for analyzing the PE binaries used on Windows. It allows for exploration of the structures of the executable itself, as well as resources.
* [PEiD](https://www.aldeid.com/wiki/PEiD): Tool for detecting cryptors, packers, and encryption routines in Windows PE binaries.
* [QEMU](https://www.qemu.org/): An emulator and virtual machine supporting a large number of systems/architectures. This makes it useful for things like running embedded firmware, but also includes [debugging facilities](https://en.wikibooks.org/wiki/QEMU/Debugging_with_QEMU) that make it an optimal tool for hacking. Can be combined with AFL for fuzzing of binaries that aren't for your native architecture.
* [Radare2](https://rada.re/n/radare2.html): This is a set of tools for doing analysis of binaries. It includes everything from disassembly to debugging and more.
* [Unicorn Engine](https://www.unicorn-engine.org/): This is a library rather than a standalone tool, but it makes writing quick emulators a breeze. Particularly useful for reverse-engineering.
================================================
FILE: _resources/10_exploitation_resources.md
================================================
---
title: Exploitation resources
---
This is a curated list of exploitation resources and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [NoSQLMap](https://github.com/codingo/NoSQLMap): NoSQLMap is an open source Python tool designed to audit for, as well as automate injection attacks, and exploit default configuration weaknesses in NoSQL databases and web applications using NoSQL to disclose or clone data from the database.
* [Retire.JS](https://addons.mozilla.org/en-US/firefox/addon/retire-js/): Scanning website for vulnerable js libraries.
* [Spiderfoot](https://github.com/smicallef/spiderfoot): SpiderFoot is an open source intelligence (OSINT) automation tool. It integrates with just about every data source available, and automates OSINT collection so that you can focus on data analysis.
* [sqlmap](https://sqlmap.org/): sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester, and a broad range of switches including: database fingerprinting, over data fetching from the database, accessing the underlying file system, and executing commands on the operating system via out-of-band connections.
* [SQLNinja](http://sqlninja.sourceforge.net/): Sqlninja is a tool targeted to exploit SQL Injection vulnerabilities on a web application that uses Microsoft SQL Server as its back-end.
* [SSRFTest](https://github.com/daeken/SSRFTest): SSRF testing tool.
* [XSS Hunter](https://xsshunter.com/): XSS Hunter allows you to find all kinds of cross-site scripting vulnerabilities, including the often-missed blind XSS. The service works by hosting specialized XSS probes which, upon firing, scan the page and send information about the vulnerable page to the XSS Hunter service.
* [Ysoserial](https://github.com/frohoff/ysoserial): A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.
================================================
FILE: _resources/11_scanners_frameworks.md
================================================
---
title: Scanners / frameworks
---
This is a curated list of scanners and frameworks and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [Canvas](https://www.immunityinc.com/products/canvas/): CANVAS offers hundreds of exploits, an automated exploitation system, and a comprehensive, reliable exploit development framework to penetration testers and security professionals worldwide.
* [IronWASP](https://resources.infosecinstitute.com/topic/ironwasp-part-1-2): IronWASP (Iron Web Application Advanced Security testing Platform) is an open source tool used for web application vulnerability testing. It is designed in such a way that users having the right knowledge can create their own scanners using this as a framework. IronWASP is built using Python and Ruby and users having knowledge of them would be able to make full use of the platform. However, IronWASP provides a lot of features that are simple to understand.
* [Lazyrecon](https://github.com/nahamsec/lazyrecon): LazyRecon is a script written in Bash, intended to automate the tedious tasks of reconnaissance and information gathering. The information is organized in an html report at the end, which helps you identify next steps.
* [Maltego](https://www.maltego.com/): Maltego is an open source intelligence (OSINT) and graphical link analysis tool for gathering and connecting information for investigative tasks.
* [Metasploit](https://www.metasploit.com/): Metasploit is an open source penetration testing framework.
* [Nikto](https://cirt.net/Nikto2): Nikto is an Open Source (GPL) web server scanner which performs comprehensive tests against web servers for multiple items, including over 6700 potentially dangerous files/programs, checks for outdated versions of over 1250 servers, and version specific problems on over 270 servers.
* [Nmap](https://nmap.org/): Nmap ("Network Mapper") is a free and open source (license) utility for network discovery and security auditing.
* [OpenVAS](https://www.openvas.org/): OpenVAS is a full-featured vulnerability scanner. Its capabilities include unauthenticated testing, authenticated testing, various high level and low level Internet and industrial protocols, performance tuning for large-scale scans and a powerful internal programming language to implement any type of vulnerability test.
* [Osmedeus](https://github.com/j3ssie/Osmedeus): Osmedeus allows you to automatically run the collection of awesome tools for reconnaissance and vulnerability scanning against the target.
* [Reconness](https://github.com/reconness/reconness): ReconNess helps you to run and keep all your #recon in the same place allowing you to focus only on the potentially vulnerable targets without distraction and without requiring a lot of bash skill, or programming skill in general.
* [Sn1per](https://github.com/1N3/Sn1per): Sn1per Community Edition is an automated scanner that can be used during a penetration test to enumerate and scan for vulnerabilities. Sn1per Professional is Xero Security's premium reporting addon for Professional Penetration Testers, Bug Bounty Researchers and Corporate Security teams to manage large environments and pentest scopes.
* [Wapiti](https://wapiti.sourceforge.io/): Wapiti allows you to audit the security of your websites or web applications. It performs "black-box" scans (it does not study the source code) of the web application by crawling the web pages of the deployed webapp, looking for scripts and forms where it can inject data.
================================================
FILE: _resources/12_datasets_freemium_services.md
================================================
---
title: Datasets / freemium services
---
This is a curated list of datasets and freemium services and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [C99.nl](https://api.c99.nl/): Subdomain Finder is a scanner that scans an entire domain to find as many subdomains as possible.
* [Censys](https://censys.io/): Censys scans the most ports and houses the biggest certificate database in the world, and provides the most up-to-date, thorough view of your known and unknown assets.
* [Payloads All The Things](https://github.com/swisskyrepo/PayloadsAllTheThings): A list of useful payloads and bypasses for Web Application Security. Feel free to improve with your payloads and techniques.
* [Rapid7 Forward DNS (FDNS)](https://opendata.rapid7.com/sonar.fdns_v2/): This dataset contains the responses to DNS requests for all forward DNS names known by Rapid7's Project Sonar.
* [Seclists](https://github.com/danielmiessler/SecLists): SecLists is the security tester's companion. It's a collection of multiple types of lists used during security assessments, collected in one place. List types include usernames, passwords, URLs, sensitive data patterns, fuzzing payloads, web shells, and many more. The goal is to enable a security tester to pull this repository onto a new testing box and have access to every type of list that may be needed.
* [Shodan](https://www.shodan.io/): Shodan provides a public API that allows other tools to access all of Shodan's data. Integrations are available for Nmap, Metasploit, Maltego, FOCA, Chrome, Firefox and many more.
================================================
FILE: _resources/13_misc_hacking_tools.md
================================================
---
title: Miscellaneous hacking tools
---
This is a curated list of miscellaneous hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.
* [Altair](https://altair.sirmuel.design/): Altair GraphQL Client helps you debug GraphQL queries and implementations - taking care of the hard part so you can focus on actually getting things done.
* [BuiltWith](https://addons.mozilla.org/en-US/firefox/addon/builtwith/): BuiltWith's goal is to help developers, researchers and designers find out what technologies web pages are using, which may help them decide what technologies to implement themselves.
* [Ettercap](https://www.ettercap-project.org/): Ettercap is a comprehensive suite which features sniffing of live connections, content filtering, and support for active and passive dissection of many protocols, including multiple features for network and host analysis.
* [Foxyproxy](https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/): FoxyProxy is an advanced proxy management tool that completely replaces Firefox's limited proxying capabilities. For a simpler tool and less advanced configuration options, please use FoxyProxy Basic.
* [John the Ripper](https://www.openwall.com/john/): John the Ripper is free and Open Source software, distributed primarily in a source code form.
* [Swiftness X](https://github.com/ehrishirajsharma/SwiftnessX): A note taking tool for BB and pentesting.
* [THC Hydra](https://github.com/vanhauser-thc/thc-hydra): This tool is a proof-of-concept code, designed to give researchers and security consultants the possibility to show how easy it would be to gain unauthorized access from remote to a system.
* [Transformations](https://transformations.jobertabma.nl/): Transformations makes it easier to detect common data obscurities, which may uncover security vulnerabilities or give insight into bypassing defenses.
* [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/): Wappalyzer is a browser extension that uncovers the technologies used on websites. It detects content management systems, eCommerce platforms, web servers, JavaScript frameworks, analytics tools and many more.
* [Wireshark](https://www.wireshark.org/): Wireshark® is a network protocol analyzer that lets you capture and interactively browse the traffic running on a computer network.
================================================
FILE: _sass/_bootstrap_customization.scss
================================================
// Buttons
@each $color, $value in $theme-colors {
.btn-#{$color} {
&:focus,
&.focus {
box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active {
&:focus {
box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);
}
}
}
}
@each $color, $value in $theme-colors {
.btn-outline-#{$color} {
&:hover {
background: rgba(0, 0, 0, 0.02);
color: theme-color($color);
}
&:focus,
&.focus {
box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active {
background: rgba(0, 0, 0, 0.04);
color: theme-color($color);
&:focus {
box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);
}
}
}
.bg-black {
.btn-outline-#{$color} {
&:hover {
background: rgba(255, 255, 255, 0.05);
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active {
background: rgba(255, 255, 255, 0.1);
}
}
.btn-outline-secondary {
color: $white;
border-color: $white;
}
}
}
.mode-toggle:hover {
filter:
brightness(0)
saturate(100%)
invert(91%)
sepia(23%)
saturate(6279%)
hue-rotate(335deg)
brightness(105%)
contrast(91%);
}
.bg-white {
background-color: $white !important;
a:not(.btn) {
color: $blue;
&:hover {
color: $blue-500;
}
&:active {
color: $blue-600;
}
}
}
.bg-black {
background-color: $black !important;
a:not(.btn) {
color: $blue-500;
&:hover {
color: $blue;
}
&:active {
color: $blue-300;
}
}
}
.bg-lighter {
background-color: $gray-300 !important;
}
.bg-darker {
background-color: $gray-850 !important;
}
@include media-breakpoint-down(md) {
#sidebar {
border-top: $border-width solid $black;
margin-top: 1em;
padding-top: 0.75em;
}
.bg-black {
#sidebar {
border-top: $border-width solid $gray-800;
}
}
}
@include media-breakpoint-up(lg) {
#sidebar {
border-left: $border-width solid $black;
}
.bg-black {
#sidebar {
border-left: $border-width solid $gray-800;
}
}
}
article {
img {
width: 100%;
}
}
main {
code {
color: $gray-200;
background-color: $gray-800;
border-radius: 0.25em;
border: $border-width solid $gray-500;
padding: 0.1em;
}
h2,
h3 {
¬:first-child {
margin-top: 0.75em;
}
}
hr {
border-radius: 1px;
border-width: 0;
height: 2px;
color: gray;
background-color: gray;
}
}
================================================
FILE: _sass/_syntax-highlighting.scss
================================================
// Syntax highlighting styles, can be modified to match the theme
.highlight {
color: #111;
pre {
margin: 0;
padding: 8px 12px;
background: #eef;
border: 1px solid #e8e8e8;
}
.c { color: #998; font-style: italic } // Comment
.err { color: #a61717; background-color: #e3d2d2 } // Error
.k { font-weight: bold } // Keyword
.o { font-weight: bold } // Operator
.cm { color: #998; font-style: italic } // Comment.Multiline
.cp { color: #999; font-weight: bold } // Comment.Preproc
.c1 { color: #998; font-style: italic } // Comment.Single
.cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
.gd { color: #000; background-color: #fdd } // Generic.Deleted
.gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
.ge { font-style: italic } // Generic.Emph
.gr { color: #a00 } // Generic.Error
.gh { color: #999 } // Generic.Heading
.gi { color: #000; background-color: #dfd } // Generic.Inserted
.gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
.go { color: #888 } // Generic.Output
.gp { color: #555 } // Generic.Prompt
.gs { font-weight: bold } // Generic.Strong
.gu { color: #aaa } // Generic.Subheading
.gt { color: #a00 } // Generic.Traceback
.kc { font-weight: bold } // Keyword.Constant
.kd { font-weight: bold } // Keyword.Declaration
.kp { font-weight: bold } // Keyword.Pseudo
.kr { font-weight: bold } // Keyword.Reserved
.kt { color: #458; font-weight: bold } // Keyword.Type
.m { color: #099 } // Literal.Number
.s { color: #d14 } // Literal.String
.na { color: #008080 } // Name.Attribute
.nb { color: #0086B3 } // Name.Builtin
.nc { color: #458; font-weight: bold } // Name.Class
.no { color: #008080 } // Name.Constant
.ni { color: #800080 } // Name.Entity
.ne { color: #900; font-weight: bold } // Name.Exception
.nf { color: #900; font-weight: bold } // Name.Function
.nn { color: #555 } // Name.Namespace
.nt { color: #000080 } // Name.Tag
.nv { color: #008080 } // Name.Variable
.ow { font-weight: bold } // Operator.Word
.w { color: #bbb } // Text.Whitespace
.mf { color: #099 } // Literal.Number.Float
.mh { color: #099 } // Literal.Number.Hex
.mi { color: #099 } // Literal.Number.Integer
.mo { color: #099 } // Literal.Number.Oct
.sb { color: #d14 } // Literal.String.Backtick
.sc { color: #d14 } // Literal.String.Char
.sd { color: #d14 } // Literal.String.Doc
.s2 { color: #d14 } // Literal.String.Double
.se { color: #d14 } // Literal.String.Escape
.sh { color: #d14 } // Literal.String.Heredoc
.si { color: #d14 } // Literal.String.Interpol
.sx { color: #d14 } // Literal.String.Other
.sr { color: #009926 } // Literal.String.Regex
.s1 { color: #d14 } // Literal.String.Single
.ss { color: #990073 } // Literal.String.Symbol
.bp { color: #999 } // Name.Builtin.Pseudo
.vc { color: #008080 } // Name.Variable.Class
.vg { color: #008080 } // Name.Variable.Global
.vi { color: #008080 } // Name.Variable.Instance
.il { color: #099 } // Literal.Number.Integer.Long
}
================================================
FILE: _sass/_variables.scss
================================================
// Brand Colors
$blue-300: #124ddb;
$blue: #2d68f4;
$blue-500: #477eff;
$blue-600: #7aa2ff;
$indigo: #6610f2;
$purple: #6f42c1;
$pink: #e10e71;
$red: #df2935;
$orange: #ff6f22;
$yellow: #f3b234;
$green: #02c996;
$teal: #20c997;
$cyan: #5bc0de;
$white: #ffffff;
$gray-100: #f9f9f9;
$gray-200: #f5f5f5;
$gray-300: #e9e9e9;
$gray-400: #c4c4c4;
$gray-500: #9e9e9e;
$gray-600: #868e96;
$gray-700: #585858;
$gray-800: #3e3e3e;
$gray-850: #303030;
$gray-900: #232323;
$black: #171717;
$grays: (
"100": $gray-100,
"200": $gray-200,
"300": $gray-300,
"400": $gray-400,
"500": $gray-500,
"600": $gray-600,
"700": $gray-700,
"800": $gray-800,
"850": $gray-850,
"900": $gray-900
);
$theme-colors: (
"primary": $pink,
"secondary": $blue,
"success": $green,
"info": $cyan,
"warning": $yellow,
"danger": $red,
"light": $gray-300,
"dark": $gray-900
);
$colors: (
"blue": $blue,
"indigo": $indigo,
"purple": $purple,
"pink": $pink,
"red": $red,
"orange": $orange,
"yellow": $yellow,
"green": $green,
"teal": $teal,
"cyan": $cyan,
"white": $white,
"gray": $gray-600,
"gray-dark": $gray-800
);
$theme-color-interval: 8%;
// Spacing
$spacer: 1rem;
$spacers: (
0: 0,
1: (
$spacer * 0.25
),
2: (
$spacer * 0.5
),
3: $spacer,
4: (
$spacer * 1.5
),
5: (
$spacer * 3
)
);
$sizes: (
25: 25%,
50: 50%,
75: 75%,
100: 100%
);
// Options
$enable-rounded: true;
$enable-shadows: false;
$enable-gradients: false;
$enable-transitions: true;
$enable-hover-media-query: false;
$enable-grid-classes: true;
$enable-print-styles: true;
$yiq-contrasted-threshold: 170 !default;
// Body
$body-bg: $white;
$body-color: $gray-900;
// Links
$link-color: theme-color("primary");
$link-decoration: none;
$link-hover-color: darken($link-color, 15%);
$link-hover-decoration: underline;
// Grid
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px
);
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px
);
$grid-columns: 12;
$grid-gutter-width: 30px;
// Components
$line-height-lg: 1.5;
$line-height-sm: 1.5;
$border-width: 1px;
$border-radius: 0.25rem;
$border-radius-lg: 0.5rem;
$border-radius-sm: 0.2rem;
$component-active-color: $white;
$component-active-bg: theme-color("primary");
$caret-width: 0.3em;
$transition-base: all 0.2s ease-in-out;
$transition-fade: opacity 0.15s linear;
$transition-collapse: height 0.35s ease;
// Fonts
@font-face {
font-family: "Effra";
font-weight: 300;
font-style: normal;
src: url("../fonts/effra-light.woff") format("woff");
font-display: swap;
}
@font-face {
font-family: "Effra";
font-weight: 400;
font-style: normal;
src: url("../fonts/effra-regular.woff") format("woff");
font-display: swap;
}
@font-face {
font-family: "Effra";
font-weight: 500;
font-style: normal;
src: url("../fonts/effra-medium.woff") format("woff");
font-display: swap;
}
@font-face {
font-family: "Effra";
font-weight: 600;
font-style: normal;
src: url("../fonts/effra-medium.woff") format("woff");
font-display: swap;
}
$font-family-sans-serif: "Effra", -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
$font-family-monospace: Consolas, "Liberation Mono", Courier, monospace;
$font-family-base: $font-family-sans-serif;
$font-size-base: 1rem;
$font-size-lg: 1.25rem;
$font-size-sm: 0.875rem;
$font-weight-normal: normal;
$font-weight-bold: bold;
$font-weight-base: $font-weight-normal;
$line-height-base: 1.5;
$h1-font-size: 2.5rem;
$h2-font-size: 2rem;
$h3-font-size: 1.75rem;
$h4-font-size: 1.5rem;
$h5-font-size: 1.25rem;
$h6-font-size: 1rem;
$headings-margin-bottom: ($spacer / 2);
$headings-font-family: inherit;
$headings-font-weight: 500;
$headings-line-height: 1.1;
$headings-color: inherit;
$display1-size: 6rem;
$display2-size: 5.5rem;
$display3-size: 4.5rem;
$display4-size: 3.5rem;
$display1-weight: 300;
$display2-weight: 300;
$display3-weight: 300;
$display4-weight: 300;
$display-line-height: $headings-line-height;
$lead-font-size: 1.25rem;
$lead-font-weight: 300;
$small-font-size: 80%;
$text-muted: $gray-600;
$blockquote-small-color: $gray-600;
$blockquote-font-size: ($font-size-base * 1.25);
$hr-border-color: rgba($black, 0.1);
$hr-border-width: $border-width;
$mark-padding: 0.2em;
$dt-font-weight: $font-weight-bold;
$kbd-box-shadow: inset 0 -0.1rem 0 rgba($black, 0.25);
$nested-kbd-font-weight: $font-weight-bold;
$list-inline-padding: 0.5rem;
$mark-bg: #fcf8e3;
// Buttons
$input-btn-padding-y: 0.5rem;
$input-btn-padding-x: 1.5rem;
$input-btn-line-height: 1.25;
$input-btn-padding-y-sm: 0.25rem;
$input-btn-padding-x-sm: 0.75rem;
$input-btn-line-height-sm: 1.5;
$input-btn-padding-y-lg: 0.75rem;
$input-btn-padding-x-lg: 2.25rem;
$input-btn-line-height-lg: 1.5;
$input-btn-focus-width: 6px !default;
$btn-font-weight: $font-weight-normal;
$btn-box-shadow: inset 0 1px 0 rgba($white, 0.15), 0 1px 1px rgba($black, 0.075);
$btn-focus-box-shadow: 0 0 6px rgba(theme-color("primary"), 0.25);
$btn-active-box-shadow: none;
$btn-link-disabled-color: $gray-600;
$btn-block-spacing-y: 0.5rem;
$btn-border-radius: $border-radius;
$btn-border-radius-lg: $border-radius-lg;
$btn-border-radius-sm: $border-radius-sm;
$btn-transition: all 0.15s ease-in-out;
// Forms
$input-bg: $white;
$input-disabled-bg: $gray-200;
$input-color: $gray-700;
$input-border-color: rgba($black, 0.15);
$input-btn-border-width: $border-width;
$input-box-shadow: inset 0 0 6px rgba($black, 0.075);
$input-border-radius: $border-radius;
$input-border-radius-lg: $border-radius-lg;
$input-border-radius-sm: $border-radius-sm;
$input-focus-bg: $input-bg;
$input-focus-border-color: lighten(theme-color("primary"), 25%);
$input-focus-box-shadow: $input-box-shadow, $btn-focus-box-shadow;
$input-focus-color: $input-color;
$input-placeholder-color: $gray-600;
$input-height-border: $input-btn-border-width * 2;
$input-height-inner: ($font-size-base * $input-btn-line-height) +
($input-btn-padding-y * 2);
$input-height: calc(#{$input-height-inner} + #{$input-height-border});
$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) +
($input-btn-padding-y-sm * 2);
$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border});
$input-height-inner-lg: ($font-size-sm * $input-btn-line-height-lg) +
($input-btn-padding-y-lg * 2);
$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border});
$input-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
$form-text-margin-top: 0.25rem;
$form-check-margin-bottom: 0.5rem;
$form-check-input-gutter: 1.25rem;
$form-check-input-margin-y: 0.25rem;
$form-check-input-margin-x: 0.25rem;
$form-check-inline-margin-x: 0.75rem;
$form-group-margin-bottom: 1rem;
$input-group-addon-bg: $gray-200;
$input-group-addon-border-color: $input-border-color;
$custom-control-gutter: 1.5rem;
$custom-control-spacer-y: 0.25rem;
$custom-control-spacer-x: 1rem;
$custom-control-indicator-size: 1rem;
$custom-control-indicator-bg: #ddd;
$custom-control-indicator-bg-size: 50% 50%;
$custom-control-indicator-box-shadow: inset 0 0.25rem 0.25rem rgba($black, 0.1);
$custom-control-indicator-disabled-bg: $gray-200;
$custom-control-description-disabled-color: $gray-600;
$custom-control-indicator-checked-color: $white;
$custom-control-indicator-checked-bg: theme-color("primary");
$custom-control-indicator-checked-box-shadow: none;
$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg,
0 0 0 3px theme-color("primary");
$custom-control-indicator-active-color: $white;
$custom-control-indicator-active-bg: lighten(theme-color("primary"), 35%);
$custom-control-indicator-active-box-shadow: none;
$custom-checkbox-indicator-border-radius: $border-radius;
$custom-checkbox-indicator-indeterminate-bg: theme-color("primary");
$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color;
$custom-checkbox-indicator-indeterminate-box-shadow: none;
$custom-radio-indicator-border-radius: 50%;
$custom-select-padding-y: 0.375rem;
$custom-select-padding-x: 0.75rem;
$custom-select-height: $input-height;
$custom-select-indicator-padding: 1rem;
$custom-select-line-height: $input-btn-line-height;
$custom-select-color: $input-color;
$custom-select-disabled-color: $gray-600;
$custom-select-bg: $white;
$custom-select-disabled-bg: $gray-200;
$custom-select-bg-size: 8px 10px;
$custom-select-indicator-color: #333;
$custom-select-border-width: $input-btn-border-width;
$custom-select-border-color: $input-border-color;
$custom-select-border-radius: $border-radius;
$custom-select-focus-border-color: lighten(theme-color("primary"), 25%);
$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, 0.075),
0 0 5px rgba($custom-select-focus-border-color, 0.5);
$custom-select-font-size-sm: 75%;
$custom-select-height-sm: $input-height-sm;
$custom-file-height: 2.5rem;
$custom-file-width: 14rem;
$custom-file-focus-box-shadow: 0 0 0 0.075rem $white,
0 0 0 0.2rem theme-color("primary");
$custom-file-padding-y: 1rem;
$custom-file-padding-x: 0.5rem;
$custom-file-line-height: 1.5;
$custom-file-color: $gray-700;
$custom-file-bg: $white;
$custom-file-border-width: $border-width;
$custom-file-border-color: $input-border-color;
$custom-file-border-radius: $border-radius;
$custom-file-box-shadow: inset 0 0.2rem 0.4rem rgba($black, 0.05);
$custom-file-button-color: $custom-file-color;
$custom-file-button-bg: $gray-200;
$custom-file-text: (
en: "Browse"
);
$form-feedback-valid-color: theme-color("success");
$form-feedback-invalid-color: theme-color("danger");
// Dropdown
$dropdown-min-width: 10rem;
$dropdown-padding-y: 0.5rem;
$dropdown-spacer: 0.125rem;
$dropdown-bg: $white;
$dropdown-border-color: rgba($black, 0.15);
$dropdown-border-width: $border-width;
$dropdown-divider-bg: $gray-200;
$dropdown-box-shadow: 0 0.5rem 1rem rgba($black, 0.175);
$dropdown-link-color: $gray-900;
$dropdown-link-hover-color: darken($gray-900, 5%);
$dropdown-link-hover-bg: $gray-100;
$dropdown-link-active-color: $component-active-color;
$dropdown-link-active-bg: $component-active-bg;
$dropdown-link-disabled-color: $gray-600;
$dropdown-item-padding-y: 0.25rem;
$dropdown-item-padding-x: 1.5rem;
$dropdown-header-color: $gray-600;
$dropdown-link-active-color: $dropdown-link-hover-color !default;
$dropdown-link-active-bg: $dropdown-link-hover-bg !default;
// Navs
$nav-link-padding-y: 0.5rem;
$nav-link-padding-x: 1rem;
$nav-link-disabled-color: $gray-600;
$nav-tabs-border-color: #ddd;
$nav-tabs-border-width: $border-width;
$nav-tabs-border-radius: $border-radius;
$nav-tabs-link-hover-border-color: $gray-200;
$nav-tabs-link-active-color: $gray-700;
$nav-tabs-link-active-bg: $body-bg;
$nav-tabs-link-active-border-color: #ddd;
$nav-pills-border-radius: $border-radius;
$nav-pills-link-active-color: $component-active-color;
$nav-pills-link-active-bg: $component-active-bg;
// Navbar
$navbar-padding-y: ($spacer / 2);
$navbar-padding-x: $spacer;
$navbar-brand-font-size: $font-size-lg;
$nav-link-height: $navbar-brand-font-size * $line-height-base;
$navbar-brand-height: (
$font-size-base * $line-height-base + $nav-link-padding-y * 2
);
$navbar-brand-padding-y: ($navbar-brand-height - $nav-link-height) / 2;
$navbar-toggler-padding-y: 0.25rem;
$navbar-toggler-padding-x: 0.75rem;
$navbar-toggler-font-size: $font-size-lg;
$navbar-toggler-border-radius: $btn-border-radius;
$navbar-dark-color: rgba($white, 0.5);
$navbar-dark-hover-color: rgba($white, 0.75);
$navbar-dark-active-color: rgba($white, 1);
$navbar-dark-disabled-color: rgba($white, 0.25);
$navbar-dark-toggler-border-color: rgba($white, 0.1);
$navbar-light-color: rgba($black, 0.5);
$navbar-light-hover-color: rgba($black, 0.7);
$navbar-light-active-color: rgba($black, 0.9);
$navbar-light-disabled-color: rgba($black, 0.3);
$navbar-light-toggler-border-color: rgba($black, 0.1);
// Tables
$table-cell-padding: 0.75rem;
$table-cell-padding-sm: 0.3rem;
$table-bg: transparent;
$table-accent-bg: rgba($black, 0.05);
$table-hover-bg: rgba($black, 0.075);
$table-active-bg: $table-hover-bg;
$table-border-width: $border-width;
$table-border-color: $gray-200;
$table-head-bg: $gray-200;
$table-head-color: $gray-700;
$table-inverse-bg: $gray-900;
$table-inverse-accent-bg: rgba($white, 0.05);
$table-inverse-hover-bg: rgba($white, 0.075);
$table-inverse-border-color: lighten($gray-900, 7.5%);
$table-inverse-color: $body-bg;
// Z Index
$zindex-dropdown: 1000;
$zindex-sticky: 1020;
$zindex-fixed: 1030;
$zindex-modal-backdrop: 1040;
$zindex-modal: 1050;
$zindex-popover: 1060;
$zindex-tooltip: 1070;
// Pagination
$pagination-padding-y: 0.5rem;
$pagination-padding-x: 0.75rem;
$pagination-padding-y-sm: 0.25rem;
$pagination-padding-x-sm: 0.5rem;
$pagination-padding-y-lg: 0.75rem;
$pagination-padding-x-lg: 1.5rem;
$pagination-line-height: 1.25;
$pagination-color: $link-color;
$pagination-bg: $white;
$pagination-border-width: $border-width;
$pagination-border-color: #ddd;
$pagination-hover-color: $link-hover-color;
$pagination-hover-bg: $gray-200;
$pagination-hover-border-color: #ddd;
$pagination-active-color: $white;
$pagination-active-bg: theme-color("primary");
$pagination-active-border-color: theme-color("primary");
$pagination-disabled-color: $gray-600;
$pagination-disabled-bg: $white;
$pagination-disabled-border-color: #ddd;
// Jumbotron
$jumbotron-padding: 2rem;
$jumbotron-bg: $gray-200;
// Cards
$card-spacer-y: 0.75rem;
$card-spacer-x: 1.25rem;
$card-border-width: 1px;
$card-border-radius: $border-radius;
$card-border-color: rgba($black, 0.125);
$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width});
$card-cap-bg: rgba($black, 0.03);
$card-bg: $white;
$card-img-overlay-padding: 1.25rem;
$card-deck-margin: ($grid-gutter-width / 2);
$card-columns-count: 3;
$card-columns-gap: 1.25rem;
$card-columns-margin: $card-spacer-y;
// Tooltip
$tooltip-max-width: 200px;
$tooltip-color: $white;
$tooltip-bg: $black;
$tooltip-opacity: 0.9;
$tooltip-padding-y: 3px;
$tooltip-padding-x: 8px;
$tooltip-margin: 0;
$tooltip-arrow-width: 5px;
$tooltip-arrow-height: 5px;
$tooltip-arrow-color: $tooltip-bg;
// Popovers
$popover-inner-padding: 1px;
$popover-bg: $white;
$popover-max-width: 276px;
$popover-border-width: $border-width;
$popover-border-color: rgba($black, 0.2);
$popover-box-shadow: 0 5px 10px rgba($black, 0.2);
$popover-header-bg: darken($popover-bg, 3%);
$popover-header-color: $headings-color;
$popover-header-padding-y: 8px;
$popover-header-padding-x: 14px;
$popover-body-color: $body-color;
$popover-body-padding-y: 9px;
$popover-body-padding-x: 14px;
$popover-arrow-width: 10px;
$popover-arrow-height: 5px;
$popover-arrow-color: $popover-bg;
$popover-arrow-outer-width: ($popover-arrow-width + 1px);
$popover-arrow-outer-color: fade-in($popover-border-color, 0.05);
// Badges
$badge-color: $white;
$badge-font-size: 75%;
$badge-font-weight: $font-weight-bold;
$badge-padding-y: 0.25em;
$badge-padding-x: 0.4em;
$badge-pill-padding-x: 0.6em;
$badge-pill-border-radius: 10rem;
// Toasts
$toast-background-color: lighten($body-bg, 5%) !default;
$toast-border-color: rgba(0, 0, 0, 0.2) !default;
$toast-header-color: $body-color !default;
$toast-header-background-color: $toast-background-color !default;
$toast-header-border-color: $toast-border-color !default;
// Modals
$modal-inner-padding: 1rem;
$modal-dialog-margin: 0.5rem;
$modal-dialog-margin-y-sm-up: 1.75rem;
$modal-title-line-height: $line-height-base;
$modal-content-bg: $white;
$modal-content-border-color: rgba($black, 0.2);
$modal-content-border-width: $border-width;
$modal-content-box-shadow-xs: 0 3px 9px rgba($black, 0.5);
$modal-content-box-shadow-sm-up: 0 5px 15px rgba($black, 0.5);
$modal-backdrop-bg: $black;
$modal-backdrop-opacity: 0.5;
$modal-header-border-color: $gray-200;
$modal-footer-border-color: $modal-header-border-color;
$modal-header-border-width: $modal-content-border-width;
$modal-footer-border-width: $modal-header-border-width;
$modal-header-padding: 15px;
$modal-lg: 800px;
$modal-md: 500px;
$modal-sm: 300px;
$modal-transition: transform 0.3s ease-out;
// Alerts
$alert-padding-y: 0.75rem;
$alert-padding-x: 1.25rem;
$alert-margin-bottom: 1rem;
$alert-border-radius: $border-radius;
$alert-link-font-weight: $font-weight-bold;
$alert-border-width: $border-width;
// Progress bars
$progress-height: 1rem;
$progress-font-size: 0.75rem;
$progress-bg: $gray-200;
$progress-border-radius: $border-radius;
$progress-box-shadow: inset 0 0.1rem 0.1rem rgba($black, 0.1);
$progress-bar-color: $white;
$progress-bar-bg: theme-color("primary");
$progress-bar-animation-timing: 1s linear infinite;
$progress-bar-transition: width 0.6s ease;
// List group
$list-group-bg: $white;
$list-group-border-color: rgba($black, 0.125);
$list-group-border-width: $border-width;
$list-group-border-radius: $border-radius;
$list-group-item-padding-y: 0.75rem;
$list-group-item-padding-x: 1.25rem;
$list-group-hover-bg: $gray-100;
$list-group-active-color: $component-active-color;
$list-group-active-bg: $component-active-bg;
$list-group-active-border-color: $list-group-active-bg;
$list-group-disabled-color: $gray-600;
$list-group-disabled-bg: $list-group-bg;
$list-group-action-color: $gray-700;
$list-group-action-hover-color: $list-group-action-color;
$list-group-action-active-color: $body-color;
$list-group-action-active-bg: $gray-200;
// Image thumbnails
$thumbnail-padding: 0.25rem;
$thumbnail-bg: $body-bg;
$thumbnail-border-width: $border-width;
$thumbnail-border-color: #ddd;
$thumbnail-border-radius: $border-radius;
$thumbnail-box-shadow: 0 1px 2px rgba($black, 0.075);
$thumbnail-transition: all 0.2s ease-in-out;
// Figures
$figure-caption-font-size: 90%;
$figure-caption-color: $gray-600;
// Breadcrumbs
$breadcrumb-padding-y: 0.75rem;
$breadcrumb-padding-x: 1rem;
$breadcrumb-item-padding: 0.5rem;
$breadcrumb-bg: $gray-200;
$breadcrumb-divider-color: $gray-600;
$breadcrumb-active-color: $gray-600;
$breadcrumb-divider: "/";
// Carousel
$carousel-control-color: $white;
$carousel-control-width: 15%;
$carousel-control-opacity: 0.5;
$carousel-indicator-width: 30px;
$carousel-indicator-height: 3px;
$carousel-indicator-spacer: 3px;
$carousel-indicator-active-bg: $white;
$carousel-caption-width: 70%;
$carousel-caption-color: $white;
$carousel-control-icon-width: 20px;
$carousel-transition: transform 0.6s ease;
// Close
$close-font-size: $font-size-base * 1.5;
$close-font-weight: $font-weight-bold;
$close-color: $black;
$close-text-shadow: 0 1px 0 $white;
// Code
$code-font-size: 90%;
$code-padding-y: 0.2rem;
$code-padding-x: 0.4rem;
$code-color: #bd4147;
$code-bg: $gray-100;
$kbd-color: $white;
$kbd-bg: $gray-900;
$pre-color: $gray-900;
$pre-scrollable-max-height: 340px;
// Options
$enable-rounded: true;
$enable-shadows: false;
$enable-gradients: false;
$enable-transitions: true;
$enable-hover-media-query: false;
$enable-grid-classes: true;
$enable-print-styles: true;
================================================
FILE: _sass/bootstrap/__DO_NOT_MODIFY
================================================
================================================
FILE: _sass/bootstrap/_alert.scss
================================================
//
// Base styles
//
.alert {
position: relative;
padding: $alert-padding-y $alert-padding-x;
margin-bottom: $alert-margin-bottom;
border: $alert-border-width solid transparent;
@include border-radius($alert-border-radius);
}
// Headings for larger alerts
.alert-heading {
// Specified to prevent conflicts of changing $headings-color
color: inherit;
}
// Provide class for links that match alerts
.alert-link {
font-weight: $alert-link-font-weight;
}
// Dismissible alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissible {
padding-right: $close-font-size + $alert-padding-x * 2;
// Adjust close link position
.close {
position: absolute;
top: 0;
right: 0;
z-index: 2;
padding: $alert-padding-y $alert-padding-x;
color: inherit;
}
}
// Alternate styles
//
// Generate contextual modifier classes for colorizing the alert.
@each $color, $value in $theme-colors {
.alert-#{$color} {
@include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
}
}
================================================
FILE: _sass/bootstrap/_badge.scss
================================================
// Base class
//
// Requires one of the contextual, color modifier classes for `color` and
// `background-color`.
.badge {
display: inline-block;
padding: $badge-padding-y $badge-padding-x;
@include font-size($badge-font-size);
font-weight: $badge-font-weight;
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
@include border-radius($badge-border-radius);
@include transition($badge-transition);
@at-root a#{&} {
@include hover-focus() {
text-decoration: none;
}
}
// Empty badges collapse automatically
&:empty {
display: none;
}
}
// Quick fix for badges in buttons
.btn .badge {
position: relative;
top: -1px;
}
// Pill badges
//
// Make them extra rounded with a modifier to replace v3's badges.
.badge-pill {
padding-right: $badge-pill-padding-x;
padding-left: $badge-pill-padding-x;
@include border-radius($badge-pill-border-radius);
}
// Colors
//
// Contextual variations (linked badges get darker on :hover).
@each $color, $value in $theme-colors {
.badge-#{$color} {
@include badge-variant($value);
}
}
================================================
FILE: _sass/bootstrap/_breadcrumb.scss
================================================
.breadcrumb {
display: flex;
flex-wrap: wrap;
padding: $breadcrumb-padding-y $breadcrumb-padding-x;
margin-bottom: $breadcrumb-margin-bottom;
@include font-size($breadcrumb-font-size);
list-style: none;
background-color: $breadcrumb-bg;
@include border-radius($breadcrumb-border-radius);
}
.breadcrumb-item {
// The separator between breadcrumbs (by default, a forward-slash: "/")
+ .breadcrumb-item {
padding-left: $breadcrumb-item-padding;
&::before {
float: left; // Suppress inline spacings and underlining of the separator
padding-right: $breadcrumb-item-padding;
color: $breadcrumb-divider-color;
content: escape-svg($breadcrumb-divider);
}
}
// IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
// without `<ul>`s. The `::before` pseudo-element generates an element
// *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
//
// To trick IE into suppressing the underline, we give the pseudo-element an
// underline and then immediately remove it.
+ .breadcrumb-item:hover::before {
text-decoration: underline;
}
// stylelint-disable-next-line no-duplicate-selectors
+ .breadcrumb-item:hover::before {
text-decoration: none;
}
&.active {
color: $breadcrumb-active-color;
}
}
================================================
FILE: _sass/bootstrap/_button-group.scss
================================================
// stylelint-disable selector-no-qualifying-type
// Make the div behave like a button
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-flex;
vertical-align: middle; // match .btn alignment given font-size hack above
> .btn {
position: relative;
flex: 1 1 auto;
// Bring the hover, focused, and "active" buttons to the front to overlay
// the borders properly
@include hover() {
z-index: 1;
}
&:focus,
&:active,
&.active {
z-index: 1;
}
}
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
.input-group {
width: auto;
}
}
.btn-group {
// Prevent double borders when buttons are next to each other
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-left: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-right-radius(0);
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) > .btn {
@include border-left-radius(0);
}
}
// Sizing
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-sm > .btn { @extend .btn-sm; }
.btn-group-lg > .btn { @extend .btn-lg; }
//
// Split button dropdowns
//
.dropdown-toggle-split {
padding-right: $btn-padding-x * .75;
padding-left: $btn-padding-x * .75;
&::after,
.dropup &::after,
.dropright &::after {
margin-left: 0;
}
.dropleft &::before {
margin-right: 0;
}
}
.btn-sm + .dropdown-toggle-split {
padding-right: $btn-padding-x-sm * .75;
padding-left: $btn-padding-x-sm * .75;
}
.btn-lg + .dropdown-toggle-split {
padding-right: $btn-padding-x-lg * .75;
padding-left: $btn-padding-x-lg * .75;
}
// The clickable button for toggling the menu
// Set the same inset shadow as the :active state
.btn-group.show .dropdown-toggle {
@include box-shadow($btn-active-box-shadow);
// Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link {
@include box-shadow(none);
}
}
//
// Vertical button groups
//
.btn-group-vertical {
flex-direction: column;
align-items: flex-start;
justify-content: center;
> .btn,
> .btn-group {
width: 100%;
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-top: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-bottom-radius(0);
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) > .btn {
@include border-top-radius(0);
}
}
// Checkbox and radio options
//
// In order to support the browser's form validation feedback, powered by the
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
// `display: none;` or `visibility: hidden;` as that also hides the popover.
// Simply visually hiding the inputs via `opacity` would leave them clickable in
// certain cases which is prevented by using `clip` and `pointer-events`.
// This way, we ensure a DOM element is visible to position the popover from.
//
// See https://github.com/twbs/bootstrap/pull/12794 and
// https://github.com/twbs/bootstrap/pull/14559 for more information.
.btn-group-toggle {
> .btn,
> .btn-group > .btn {
margin-bottom: 0; // Override default `<label>` value
input[type="radio"],
input[type="checkbox"] {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
}
}
}
================================================
FILE: _sass/bootstrap/_buttons.scss
================================================
// stylelint-disable selector-no-qualifying-type
//
// Base styles
//
.btn {
display: inline-block;
font-family: $btn-font-family;
font-weight: $btn-font-weight;
color: $body-color;
text-align: center;
text-decoration: if($link-decoration == none, null, none);
white-space: $btn-white-space;
vertical-align: middle;
user-select: none;
background-color: transparent;
border: $btn-border-width solid transparent;
@include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
@include transition($btn-transition);
@include hover() {
color: $body-color;
text-decoration: none;
}
&:focus,
&.focus {
outline: 0;
box-shadow: $btn-focus-box-shadow;
}
// Disabled comes first so active can properly restyle
&.disabled,
&:disabled {
opacity: $btn-disabled-opacity;
@include box-shadow(none);
}
&:not(:disabled):not(.disabled) {
cursor: if($enable-pointer-cursor-for-buttons, pointer, null);
&:active,
&.active {
@include box-shadow($btn-active-box-shadow);
&:focus {
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
}
}
}
}
// Future-proof disabling of clicks on `<a>` elements
a.btn.disabled,
fieldset:disabled a.btn {
pointer-events: none;
}
//
// Alternate buttons
//
@each $color, $value in $theme-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}
@each $color, $value in $theme-colors {
.btn-outline-#{$color} {
@include button-outline-variant($value);
}
}
//
// Link buttons
//
// Make a button look and behave like a link
.btn-link {
font-weight: $font-weight-normal;
color: $link-color;
text-decoration: $link-decoration;
@include hover() {
color: $link-hover-color;
text-decoration: $link-hover-decoration;
}
&:focus,
&.focus {
text-decoration: $link-hover-decoration;
}
&:disabled,
&.disabled {
color: $btn-link-disabled-color;
pointer-events: none;
}
// No need for an active state here
}
//
// Button Sizes
//
.btn-lg {
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
}
.btn-sm {
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
}
//
// Block button
//
.btn-block {
display: block;
width: 100%;
// Vertically space out multiple block buttons
+ .btn-block {
margin-top: $btn-block-spacing-y;
}
}
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
&.btn-block {
width: 100%;
}
}
================================================
FILE: _sass/bootstrap/_card.scss
================================================
//
// Base styles
//
.card {
position: relative;
display: flex;
flex-direction: column;
min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
height: $card-height;
word-wrap: break-word;
background-color: $card-bg;
background-clip: border-box;
border: $card-border-width solid $card-border-color;
@include border-radius($card-border-radius);
> hr {
margin-right: 0;
margin-left: 0;
}
> .list-group {
border-top: inherit;
border-bottom: inherit;
&:first-child {
border-top-width: 0;
@include border-top-radius($card-inner-border-radius);
}
&:last-child {
border-bottom-width: 0;
@include border-bottom-radius($card-inner-border-radius);
}
}
// Due to specificity of the above selector (`.card > .list-group`), we must
// use a child selector here to prevent double borders.
> .card-header + .list-group,
> .list-group + .card-footer {
border-top: 0;
}
}
.card-body {
// Enable `flex-grow: 1` for decks and groups so that card blocks take up
// as much space as possible, ensuring footers are aligned to the bottom.
flex: 1 1 auto;
// Workaround for the image size bug in IE
// See: https://github.com/twbs/bootstrap/pull/28855
min-height: 1px;
padding: $card-spacer-x;
color: $card-color;
}
.card-title {
margin-bottom: $card-spacer-y;
}
.card-subtitle {
margin-top: -$card-spacer-y / 2;
margin-bottom: 0;
}
.card-text:last-child {
margin-bottom: 0;
}
.card-link {
@include hover() {
text-decoration: none;
}
+ .card-link {
margin-left: $card-spacer-x;
}
}
//
// Optional textual caps
//
.card-header {
padding: $card-spacer-y $card-spacer-x;
margin-bottom: 0; // Removes the default margin-bottom of <hN>
color: $card-cap-color;
background-color: $card-cap-bg;
border-bottom: $card-border-width solid $card-border-color;
&:first-child {
@include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
}
}
.card-footer {
padding: $card-spacer-y $card-spacer-x;
color: $card-cap-color;
background-color: $card-cap-bg;
border-top: $card-border-width solid $card-border-color;
&:last-child {
@include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
}
}
//
// Header navs
//
.card-header-tabs {
margin-right: -$card-spacer-x / 2;
margin-bottom: -$card-spacer-y;
margin-left: -$card-spacer-x / 2;
border-bottom: 0;
}
.card-header-pills {
margin-right: -$card-spacer-x / 2;
margin-left: -$card-spacer-x / 2;
}
// Card image
.card-img-overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: $card-img-overlay-padding;
@include border-radius($card-inner-border-radius);
}
.card-img,
.card-img-top,
.card-img-bottom {
flex-shrink: 0; // For IE: https://github.com/twbs/bootstrap/issues/29396
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
}
.card-img,
.card-img-top {
@include border-top-radius($card-inner-border-radius);
}
.card-img,
.card-img-bottom {
@include border-bottom-radius($card-inner-border-radius);
}
// Card deck
.card-deck {
.card {
margin-bottom: $card-deck-margin;
}
@include media-breakpoint-up(sm) {
display: flex;
flex-flow: row wrap;
margin-right: -$card-deck-margin;
margin-left: -$card-deck-margin;
.card {
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
margin-right: $card-deck-margin;
margin-bottom: 0; // Override the default
margin-left: $card-deck-margin;
}
}
}
//
// Card groups
//
.card-group {
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
margin-bottom: $card-group-margin;
}
@include media-breakpoint-up(sm) {
display: flex;
flex-flow: row wrap;
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
margin-bottom: 0;
+ .card {
margin-left: 0;
border-left: 0;
}
// Handle rounded corners
@if $enable-rounded {
&:not(:last-child) {
@include border-right-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-disallowed-list
border-top-right-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-disallowed-list
border-bottom-right-radius: 0;
}
}
&:not(:first-child) {
@include border-left-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-disallowed-list
border-top-left-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-disallowed-list
border-bottom-left-radius: 0;
}
}
}
}
}
}
//
// Columns
//
.card-columns {
.card {
margin-bottom: $card-columns-margin;
}
@include media-breakpoint-up(sm) {
column-count: $card-columns-count;
column-gap: $card-columns-gap;
orphans: 1;
widows: 1;
.card {
display: inline-block; // Don't let them vertically span multiple columns
width: 100%; // Don't let their width change
}
}
}
//
// Accordion
//
.accordion {
overflow-anchor: none;
> .card {
overflow: hidden;
&:not(:last-of-type) {
border-bottom: 0;
@include border-bottom-radius(0);
}
&:not(:first-of-type) {
@include border-top-radius(0);
}
> .card-header {
@include border-radius(0);
margin-bottom: -$card-border-width;
}
}
}
================================================
FILE: _sass/bootstrap/_carousel.scss
================================================
// Notes on the classes:
//
// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
// even when their scroll action started on a carousel, but for compatibility (with Firefox)
// we're preventing all actions instead
// 2. The .carousel-item-left and .carousel-item-right is used to indicate where
// the active slide is heading.
// 3. .active.carousel-item is the current slide.
// 4. .active.carousel-item-left and .active.carousel-item-right is the current
// slide in its in-transition state. Only one of these occurs at a time.
// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
// is the upcoming slide in transition.
.carousel {
position: relative;
}
.carousel.pointer-event {
touch-action: pan-y;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
@include clearfix();
}
.carousel-item {
position: relative;
display: none;
float: left;
width: 100%;
margin-right: -100%;
backface-visibility: hidden;
@include transition($carousel-transition);
}
.carousel-item.active,
.carousel-item-next,
.carousel-item-prev {
display: block;
}
.carousel-item-next:not(.carousel-item-left),
.active.carousel-item-right {
transform: translateX(100%);
}
.carousel-item-prev:not(.carousel-item-right),
.active.carousel-item-left {
transform: translateX(-100%);
}
//
// Alternate transitions
//
.carousel-fade {
.carousel-item {
opacity: 0;
transition-property: opacity;
transform: none;
}
.carousel-item.active,
.carousel-item-next.carousel-item-left,
.carousel-item-prev.carousel-item-right {
z-index: 1;
opacity: 1;
}
.active.carousel-item-left,
.active.carousel-item-right {
z-index: 0;
opacity: 0;
@include transition(opacity 0s $carousel-transition-duration);
}
}
//
// Left/right controls for nav
//
.carousel-control-prev,
.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
// Use flex for alignment (1-3)
display: flex; // 1. allow flex styles
align-items: center; // 2. vertically center contents
justify-content: center; // 3. horizontally center contents
width: $carousel-control-width;
color: $carousel-control-color;
text-align: center;
opacity: $carousel-control-opacity;
@include transition($carousel-control-transition);
// Hover/focus state
@include hover-focus() {
color: $carousel-control-color;
text-decoration: none;
outline: 0;
opacity: $carousel-control-hover-opacity;
}
}
.carousel-control-prev {
left: 0;
@if $enable-gradients {
background-image: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
}
}
.carousel-control-next {
right: 0;
@if $enable-gradients {
background-image: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
}
}
// Icons for within
.carousel-control-prev-icon,
.carousel-control-next-icon {
display: inline-block;
width: $carousel-control-icon-width;
height: $carousel-control-icon-width;
background: 50% / 100% 100% no-repeat;
}
.carousel-control-prev-icon {
background-image: escape-svg($carousel-control-prev-icon-bg);
}
.carousel-control-next-icon {
background-image: escape-svg($carousel-control-next-icon-bg);
}
// Optional indicator pips
//
// Add an ordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators {
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: 15;
display: flex;
justify-content: center;
padding-left: 0; // override <ol> default
// Use the .carousel-control's width as margin so we don't overlay those
margin-right: $carousel-control-width;
margin-left: $carousel-control-width;
list-style: none;
li {
box-sizing: content-box;
flex: 0 1 auto;
width: $carousel-indicator-width;
height: $carousel-indicator-height;
margin-right: $carousel-indicator-spacer;
margin-left: $carousel-indicator-spacer;
text-indent: -999px;
cursor: pointer;
background-color: $carousel-indicator-active-bg;
background-clip: padding-box;
// Use transparent borders to increase the hit area by 10px on top and bottom.
border-top: $carousel-indicator-hit-area-height solid transparent;
border-bottom: $carousel-indicator-hit-area-height solid transparent;
opacity: .5;
@include transition($carousel-indicator-transition);
}
.active {
opacity: 1;
}
}
// Optional captions
//
//
.carousel-caption {
position: absolute;
right: (100% - $carousel-caption-width) / 2;
bottom: 20px;
left: (100% - $carousel-caption-width) / 2;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: $carousel-caption-color;
text-align: center;
}
================================================
FILE: _sass/bootstrap/_close.scss
================================================
.close {
float: right;
@include font-size($close-font-size);
font-weight: $close-font-weight;
line-height: 1;
color: $close-color;
text-shadow: $close-text-shadow;
opacity: .5;
// Override <a>'s hover style
@include hover() {
color: $close-color;
text-decoration: none;
}
&:not(:disabled):not(.disabled) {
@include hover-focus() {
opacity: .75;
}
}
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
// stylelint-disable-next-line selector-no-qualifying-type
button.close {
padding: 0;
background-color: transparent;
border: 0;
}
// Future-proof disabling of clicks on `<a>` elements
// stylelint-disable-next-line selector-no-qualifying-type
a.close.disabled {
pointer-events: none;
}
================================================
FILE: _sass/bootstrap/_code.scss
================================================
// Inline code
code {
@include font-size($code-font-size);
color: $code-color;
word-wrap: break-word;
// Streamline the style when inside anchors to avoid broken underline and more
a > & {
color: inherit;
}
}
// User input typically entered via keyboard
kbd {
padding: $kbd-padding-y $kbd-padding-x;
@include font-size($kbd-font-size);
color: $kbd-color;
background-color: $kbd-bg;
@include border-radius($border-radius-sm);
@include box-shadow($kbd-box-shadow);
kbd {
padding: 0;
@include font-size(100%);
font-weight: $nested-kbd-font-weight;
@include box-shadow(none);
}
}
// Blocks of code
pre {
display: block;
@include font-size($code-font-size);
color: $pre-color;
// Account for some code outputs that place code tags in pre tags
code {
@include font-size(inherit);
color: inherit;
word-break: normal;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: $pre-scrollable-max-height;
overflow-y: scroll;
}
================================================
FILE: _sass/bootstrap/_custom-forms.scss
================================================
// Embedded icons from Open Iconic.
// Released under MIT and copyright 2014 Waybury.
// https://useiconic.com/open
// Checkboxes and radios
//
// Base class takes care of all the key behavioral aspects.
.custom-control {
position: relative;
z-index: 1;
display: block;
min-height: $font-size-base * $line-height-base;
padding-left: $custom-control-gutter + $custom-control-indicator-size;
color-adjust: exact; // Keep themed appearance for print
}
.custom-control-inline {
display: inline-flex;
margin-right: $custom-control-spacer-x;
}
.custom-control-input {
position: absolute;
left: 0;
z-index: -1; // Put the input behind the label so it doesn't overlay text
width: $custom-control-indicator-size;
height: ($font-size-base * $line-height-base + $custom-control-indicator-size) / 2;
opacity: 0;
&:checked ~ .custom-control-label::before {
color: $custom-control-indicator-checked-color;
border-color: $custom-control-indicator-checked-border-color;
@include gradient-bg($custom-control-indicator-checked-bg);
@include box-shadow($custom-control-indicator-checked-box-shadow);
}
&:focus ~ .custom-control-label::before {
// the mixin is not used here to make sure there is feedback
@if $enable-shadows {
box-shadow: $input-box-shadow, $custom-control-indicator-focus-box-shadow;
} @else {
box-shadow: $custom-control-indicator-focus-box-shadow;
}
}
&:focus:not(:checked) ~ .custom-control-label::before {
border-color: $custom-control-indicator-focus-border-color;
}
&:not(:disabled):active ~ .custom-control-label::before {
color: $custom-control-indicator-active-color;
background-color: $custom-control-indicator-active-bg;
border-color: $custom-control-indicator-active-border-color;
@include box-shadow($custom-control-indicator-active-box-shadow);
}
// Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
&[disabled],
&:disabled {
~ .custom-control-label {
color: $custom-control-label-disabled-color;
&::before {
background-color: $custom-control-indicator-disabled-bg;
}
}
}
}
// Custom control indicators
//
// Build the custom controls out of pseudo-elements.
.custom-control-label {
position: relative;
margin-bottom: 0;
color: $custom-control-label-color;
vertical-align: top;
cursor: $custom-control-cursor;
// Background-color and (when enabled) gradient
&::before {
position: absolute;
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
left: -($custom-control-gutter + $custom-control-indicator-size);
display: block;
width: $custom-control-indicator-size;
height: $custom-control-indicator-size;
pointer-events: none;
content: "";
background-color: $custom-control-indicator-bg;
border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
@include box-shadow($custom-control-indicator-box-shadow);
}
// Foreground (icon)
&::after {
position: absolute;
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
left: -($custom-control-gutter + $custom-control-indicator-size);
display: block;
width: $custom-control-indicator-size;
height: $custom-control-indicator-size;
content: "";
background: 50% / #{$custom-control-indicator-bg-size} no-repeat;
}
}
// Checkboxes
//
// Tweak just a few things for checkboxes.
.custom-checkbox {
.custom-control-label::before {
@include border-radius($custom-checkbox-indicator-border-radius);
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-image: escape-svg($custom-checkbox-indicator-icon-checked);
}
}
.custom-control-input:indeterminate ~ .custom-control-label {
&::before {
border-color: $custom-checkbox-indicator-indeterminate-border-color;
@include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
@include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
}
&::after {
background-image: escape-svg($custom-checkbox-indicator-icon-indeterminate);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
@include gradient-bg($custom-control-indicator-checked-disabled-bg);
}
&:indeterminate ~ .custom-control-label::before {
@include gradient-bg($custom-control-indicator-checked-disabled-bg);
}
}
}
// Radios
//
// Tweak just a few things for radios.
.custom-radio {
.custom-control-label::before {
// stylelint-disable-next-line property-disallowed-list
border-radius: $custom-radio-indicator-border-radius;
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-image: escape-svg($custom-radio-indicator-icon-checked);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
@include gradient-bg($custom-control-indicator-checked-disabled-bg);
}
}
}
// switches
//
// Tweak a few things for switches
.custom-switch {
padding-left: $custom-switch-width + $custom-control-gutter;
.custom-control-label {
&::before {
left: -($custom-switch-width + $custom-control-gutter);
width: $custom-switch-width;
pointer-events: all;
// stylelint-disable-next-line property-disallowed-list
border-radius: $custom-switch-indicator-border-radius;
}
&::after {
top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2, $custom-control-indicator-border-width * 2);
left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2);
width: $custom-switch-indicator-size;
height: $custom-switch-indicator-size;
background-color: $custom-control-indicator-border-color;
// stylelint-disable-next-line property-disallowed-list
border-radius: $custom-switch-indicator-border-radius;
@include transition(transform .15s ease-in-out, $custom-forms-transition);
}
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-color: $custom-control-indicator-bg;
transform: translateX($custom-switch-width - $custom-control-indicator-size);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
@include gradient-bg($custom-control-indicator-checked-disabled-bg);
}
}
}
// Select
//
// Replaces the browser default select with a custom one, mostly pulled from
// https://primer.github.io/.
//
.custom-select {
display: inline-block;
width: 100%;
height: $custom-select-height;
padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
font-family: $custom-select-font-family;
@include font-size($custom-select-font-size);
font-weight: $custom-select-font-weight;
line-height: $custom-select-line-height;
color: $custom-select-color;
vertical-align: middle;
background: $custom-select-bg $custom-select-background;
border: $custom-select-border-width solid $custom-select-border-color;
@include border-radius($custom-select-border-radius, 0);
@include box-shadow($custom-select-box-shadow);
appearance: none;
&:focus {
border-color: $custom-select-focus-border-color;
outline: 0;
@if $enable-shadows {
@include box-shadow($custom-select-box-shadow, $custom-select-focus-box-shadow);
} @else {
// Avoid using mixin so we can pass custom focus shadow properly
box-shadow: $custom-select-focus-box-shadow;
}
&::-ms-value {
// For visual consistency with other platforms/browsers,
// suppress the default white text on blue background highlight given to
// the selected option text when the (still closed) <select> receives focus
// in IE and (under certain conditions) Edge.
// See https://github.com/twbs/bootstrap/issues/19398.
color: $input-color;
background-color: $input-bg;
}
}
&[multiple],
&[size]:not([size="1"]) {
height: auto;
padding-right: $custom-select-padding-x;
background-image: none;
}
&:disabled {
color: $custom-select-disabled-color;
background-color: $custom-select-disabled-bg;
}
// Hides the default caret in IE11
&::-ms-expand {
display: none;
}
// Remove outline from select box in FF
&:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 $custom-select-color;
}
}
.custom-select-sm {
height: $custom-select-height-sm;
padding-top: $custom-select-padding-y-sm;
padding-bottom: $custom-select-padding-y-sm;
padding-left: $custom-select-padding-x-sm;
@include font-size($custom-select-font-size-sm);
}
.custom-select-lg {
height: $custom-select-height-lg;
padding-top: $custom-select-padding-y-lg;
padding-bottom: $custom-select-padding-y-lg;
padding-left: $custom-select-padding-x-lg;
@include font-size($custom-select-font-size-lg);
}
// File
//
// Custom file input.
.custom-file {
position: relative;
display: inline-block;
width: 100%;
height: $custom-file-height;
margin-bottom: 0;
}
.custom-file-input {
position: relative;
z-index: 2;
width: 100%;
height: $custom-file-height;
margin: 0;
overflow: hidden;
opacity: 0;
&:focus ~ .custom-file-label {
border-color: $custom-file-focus-border-color;
box-shadow: $custom-file-focus-box-shadow;
}
// Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
&[disabled] ~ .custom-file-label,
&:disabled ~ .custom-file-label {
background-color: $custom-file-disabled-bg;
}
@each $lang, $value in $custom-file-text {
&:lang(#{$lang}) ~ .custom-file-label::after {
content: $value;
}
}
~ .custom-file-label[data-browse]::after {
content: attr(data-browse);
}
}
.custom-file-label {
position: absolute;
top: 0;
right: 0;
left: 0;
z-index: 1;
height: $custom-file-height;
padding: $custom-file-padding-y $custom-file-padding-x;
overflow: hidden;
font-family: $custom-file-font-family;
font-weight: $custom-file-font-weight;
line-height: $custom-file-line-height;
color: $custom-file-color;
background-color: $custom-file-bg;
border: $custom-file-border-width solid $custom-file-border-color;
@include border-radius($custom-file-border-radius);
@include box-shadow($custom-file-box-shadow);
&::after {
position: absolute;
top: 0;
right: 0;
bottom: 0;
z-index: 3;
display: block;
height: $custom-file-height-inner;
padding: $custom-file-padding-y $custom-file-padding-x;
line-height: $custom-file-line-height;
color: $custom-file-button-color;
content: "Browse";
@include gradient-bg($custom-file-button-bg);
border-left: inherit;
@include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
}
}
// Range
//
// Style range inputs the same across browsers. Vendor-specific rules for pseudo
// elements cannot be mixed. As such, there are no shared styles for focus or
// active states on prefixed selectors.
.custom-range {
width: 100%;
height: add($custom-range-thumb-height, $custom-range-thumb-focus-box-shadow-width * 2);
padding: 0; // Need to reset padding
background-color: transparent;
appearance: none;
&:focus {
outline: 0;
// Pseudo-elements must be split across multiple rulesets to have an effect.
// No box-shadow() mixin for focus accessibility.
&::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
&::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
&::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
}
&::-moz-focus-outer {
border: 0;
}
&::-webkit-slider-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-webkit-slider-runnable-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent; // Why?
cursor: $custom-range-track-cursor;
background-color: $custom-range-track-bg;
border-color: transparent;
@include border-radius($custom-range-track-border-radius);
@include box-shadow($custom-range-track-box-shadow);
}
&::-moz-range-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-moz-range-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent;
cursor: $custom-range-track-cursor;
background-color: $custom-range-track-bg;
border-color: transparent; // Firefox specific?
@include border-radius($custom-range-track-border-radius);
@include box-shadow($custom-range-track-box-shadow);
}
&::-ms-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
margin-top: 0; // Edge specific
margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-ms-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent;
cursor: $custom-range-track-cursor;
background-color: transparent;
border-color: transparent;
border-width: $custom-range-thumb-height / 2;
@include box-shadow($custom-range-track-box-shadow);
}
&::-ms-fill-lower {
background-color: $custom-range-track-bg;
@include border-radius($custom-range-track-border-radius);
}
&::-ms-fill-upper {
margin-right: 15px; // arbitrary?
background-color: $custom-range-track-bg;
@include border-radius($custom-range-track-border-radius);
}
&:disabled {
&::-webkit-slider-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
&::-webkit-slider-runnable-track {
cursor: default;
}
&::-moz-range-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
&::-moz-range-track {
cursor: default;
}
&::-ms-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
}
}
.custom-control-label::before,
.custom-file-label,
.custom-select {
@include transition($custom-forms-transition);
}
================================================
FILE: _sass/bootstrap/_dropdown.scss
================================================
// The dropdown wrapper (`<div>`)
.dropup,
.dropright,
.dropdown,
.dropleft {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
// Generate the caret automatically
@include caret();
}
// The dropdown menu
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: $zindex-dropdown;
display: none; // none by default, but block on "open" of the menu
float: left;
min-width: $dropdown-min-width;
padding: $dropdown-padding-y $dropdown-padding-x;
margin: $dropdown-spacer 0 0; // override default ul
@include font-size($dropdown-font-size);
color: $dropdown-color;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
list-style: none;
background-color: $dropdown-bg;
background-clip: padding-box;
border: $dropdown-border-width solid $dropdown-border-color;
@include border-radius($dropdown-border-radius);
@include box-shadow($dropdown-box-shadow);
}
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-left {
right: auto;
left: 0;
}
.dropdown-menu#{$infix}-right {
right: 0;
left: auto;
}
}
}
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// Just add .dropup after the standard .dropdown class and you're set.
.dropup {
.dropdown-menu {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(up);
}
}
.dropright {
.dropdown-menu {
top: 0;
right: auto;
left: 100%;
margin-top: 0;
margin-left: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(right);
&::after {
vertical-align: 0;
}
}
}
.dropleft {
.dropdown-menu {
top: 0;
right: 100%;
left: auto;
margin-top: 0;
margin-right: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(left);
&::before {
vertical-align: 0;
}
}
}
// When Popper is enabled, reset the basic dropdown position
// stylelint-disable-next-line no-duplicate-selectors
.dropdown-menu {
&[x-placement^="top"],
&[x-placement^="right"],
&[x-placement^="bottom"],
&[x-placement^="left"] {
right: auto;
bottom: auto;
}
}
// Dividers (basically an `<hr>`) within the dropdown
.dropdown-divider {
@include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y, true);
}
// Links, buttons, and more within the dropdown menu
//
// `<button>`-specific styles are denoted with `// For <button>s`
.dropdown-item {
display: block;
width: 100%; // For `<button>`s
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
clear: both;
font-weight: $font-weight-normal;
color: $dropdown-link-color;
text-align: inherit; // For `<button>`s
text-decoration: if($link-decoration == none, null, none);
white-space: nowrap; // prevent links from randomly breaking onto new lines
background-color: transparent; // For `<button>`s
border: 0; // For `<button>`s
// Prevent dropdown overflow if there's no padding
// See https://github.com/twbs/bootstrap/pull/27703
@if $dropdown-padding-y == 0 {
&:first-child {
@include border-top-radius($dropdown-inner-border-radius);
}
&:last-child {
@include border-bottom-radius($dropdown-inner-border-radius);
}
}
@include hover-focus() {
color: $dropdown-link-hover-color;
text-decoration: none;
@include gradient-bg($dropdown-link-hover-bg);
}
&.active,
&:active {
color: $dropdown-link-active-color;
text-decoration: none;
@include gradient-bg($dropdown-link-active-bg);
}
&.disabled,
&:disabled {
color: $dropdown-link-disabled-color;
pointer-events: none;
background-color: transparent;
// Remove CSS gradients if they're enabled
@if $enable-gradients {
background-image: none;
}
}
}
.dropdown-menu.show {
display: block;
}
// Dropdown section headers
.dropdown-header {
display: block;
padding: $dropdown-header-padding;
margin-bottom: 0; // for use with heading elements
@include font-size($font-size-sm);
color: $dropdown-header-color;
white-space: nowrap; // as with > li > a
}
// Dropdown text
.dropdown-item-text {
display: block;
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
color: $dropdown-link-color;
}
================================================
FILE: _sass/bootstrap/_forms.scss
================================================
// stylelint-disable selector-no-qualifying-type
//
// Textual form controls
//
.form-control {
display: block;
width: 100%;
height: $input-height;
padding: $input-padding-y $input-padding-x;
font-family: $input-font-family;
@include font-size($input-font-size);
font-weight: $input-font-weight;
line-height: $input-line-height;
color: $input-color;
background-color: $input-bg;
background-clip: padding-box;
border: $input-border-width solid $input-border-color;
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
@include border-radius($input-border-radius, 0);
@include box-shadow($input-box-shadow);
@include transition($input-transition);
// Unstyle the caret on `<select>`s in IE10+.
&::-ms-expand {
background-color: transparent;
border: 0;
}
// Remove select outline from select box in FF
&:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 $input-color;
}
// Customize the `:focus` state to imitate native WebKit styles.
@include form-control-focus($ignore-warning: true);
// Placeholder
&::placeholder {
color: $input-placeholder-color;
// Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
opacity: 1;
}
// Disabled and read-only inputs
//
// HTML5 says that controls under a fieldset > legend:first-child won't be
// disabled if the fieldset is disabled. Due to implementation difficulty, we
// don't honor that edge case; we style them as disabled anyway.
&:disabled,
&[readonly] {
background-color: $input-disabled-bg;
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
opacity: 1;
}
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
&.form-control {
appearance: none; // Fix appearance for date inputs in Safari
}
}
select.form-control {
&:focus::-ms-value {
// Suppress the nested default white text on blue background highlight given to
// the selected option text when the (still closed) <select> receives focus
// in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
// match the appearance of the native widget.
// See https://github.com/twbs/bootstrap/issues/19398.
color: $input-color;
background-color: $input-bg;
}
}
// Make file inputs better match text inputs by forcing them to new lines.
.form-control-file,
.form-control-range {
display: block;
width: 100%;
}
//
// Labels
//
// For use with horizontal and inline forms, when you need the label (or legend)
// text to align with the form controls.
.col-form-label {
padding-top: add($input-padding-y, $input-border-width);
padding-bottom: add($input-padding-y, $input-border-width);
margin-bottom: 0; // Override the `<label>/<legend>` default
@include font-size(inherit); // Override the `<legend>` default
line-height: $input-line-height;
}
.col-form-label-lg {
padding-top: add($input-padding-y-lg, $input-border-width);
padding-bottom: add($input-padding-y-lg, $input-border-width);
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
}
.col-form-label-sm {
padding-top: add($input-padding-y-sm, $input-border-width);
padding-bottom: add($input-padding-y-sm, $input-border-width);
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
}
// Readonly controls as plain text
//
// Apply class to a readonly input to make it appear like regular plain
// text (without any border, background color, focus indicator)
.form-control-plaintext {
display: block;
width: 100%;
padding: $input-padding-y 0;
margin-bottom: 0; // match inputs if this class comes on inputs with default margins
@include font-size($input-font-size);
line-height: $input-line-height;
color: $input-plaintext-color;
background-color: transparent;
border: solid transparent;
border-width: $input-border-width 0;
&.form-control-sm,
&.form-control-lg {
padding-right: 0;
padding-left: 0;
}
}
// Form control sizing
//
// Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls.
//
// Repeated in `_input_group.scss` to avoid Sass extend issues.
.form-control-sm {
height: $input-height-sm;
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
@include border-radius($input-border-radius-sm);
}
.form-control-lg {
height: $input-height-lg;
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
@include border-radius($input-border-radius-lg);
}
// stylelint-disable-next-line no-duplicate-selectors
select.form-control {
&[size],
&[multiple] {
height: auto;
}
}
textarea.form-control {
height: auto;
}
// Form groups
//
// Designed to help with the organization and spacing of vertical forms. For
// horizontal forms, use the predefined grid classes.
.form-group {
margin-bottom: $form-group-margin-bottom;
}
.form-text {
display: block;
margin-top: $form-text-margin-top;
}
// Form grid
//
// Special replacement for our grid system's `.row` for tighter form layouts.
.form-row {
display: flex;
flex-wrap: wrap;
margin-right: -$form-grid-gutter-width / 2;
margin-left: -$form-grid-gutter-width / 2;
> .col,
> [class*="col-"] {
padding-right: $form-grid-gutter-width / 2;
padding-left: $form-grid-gutter-width / 2;
}
}
// Checkboxes and radios
//
// Indent the labels to position radios/checkboxes as hanging controls.
.form-check {
position: relative;
display: block;
padding-left: $form-check-input-gutter;
}
.form-check-input {
position: absolute;
margin-top: $form-check-input-margin-y;
margin-left: -$form-check-input-gutter;
// Use [disabled] and :disabled for workaround https://github.com/twbs/bootstrap/issues/28247
&[disabled] ~ .form-check-label,
&:disabled ~ .form-check-label {
color: $text-muted;
}
}
.form-check-label {
margin-bottom: 0; // Override default `<label>` bottom margin
}
.form-check-inline {
display: inline-flex;
align-items: center;
padding-left: 0; // Override base .form-check
margin-right: $form-check-inline-margin-x;
// Undo .form-check-input defaults and add some `margin-right`.
.form-check-input {
position: static;
margin-top: 0;
margin-right: $form-check-inline-input-margin-x;
margin-left: 0;
}
}
// Form validation
//
// Provide feedback to users when form field values are valid or invalid. Works
// primarily for client-side validation via scoped `:invalid` and `:valid`
// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
// server side validation.
@each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
}
// Inline forms
//
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
// forms begin stacked on extra small (mobile) devices and then go inline when
// viewports reach <768px.
//
// Requires wrapping inputs and labels with `.form-group` for proper display of
// default HTML form controls and our custom form controls (e.g., input groups).
.form-inline {
display: flex;
flex-flow: row wrap;
align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
// Because we use flex, the initial sizing of checkboxes is collapsed and
// doesn't occupy the full-width (which is what we want for xs grid tier),
// so we force that here.
.form-check {
width: 100%;
}
// Kick in the inline
@include media-breakpoint-up(sm) {
label {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0;
}
// Inline-block all the things for "inline"
.form-group {
display: flex;
flex: 0 0 auto;
flex-flow: row wrap;
align-items: center;
margin-bottom: 0;
}
// Allow folks to *not* use `.form-group`
.form-control {
display: inline-block;
width: auto; // Prevent labels from stacking above inputs in `.form-group`
vertical-align: middle;
}
// Make static controls behave like regular ones
.form-control-plaintext {
display: inline-block;
}
.input-group,
.custom-select {
width: auto;
}
// Remove default margin on radios/checkboxes that were used for stacking, and
// then undo the floating of radios and checkboxes to match.
.form-check {
display: flex;
align-items: center;
justify-content: center;
width: auto;
padding-left: 0;
}
.form-check-input {
position: relative;
flex-shrink: 0;
margin-top: 0;
margin-right: $form-check-input-margin-x;
margin-left: 0;
}
.custom-control {
align-items: center;
justify-content: center;
}
.custom-control-label {
margin-bottom: 0;
}
}
}
================================================
FILE: _sass/bootstrap/_functions.scss
================================================
// Bootstrap functions
//
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
// Ascending
// Used to evaluate Sass maps like our grid breakpoints.
@mixin _assert-ascending($map, $map-name) {
$prev-key: null;
$prev-num: null;
@each $key, $num in $map {
@if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
// Do nothing
} @else if not comparable($prev-num, $num) {
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
} @else if $prev-num >= $num {
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
}
$prev-key: $key;
$prev-num: $num;
}
}
// Starts at zero
// Used to ensure the min-width of the lowest breakpoint starts at 0.
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
@if length($map) > 0 {
$values: map-values($map);
$first-value: nth($values, 1);
@if $first-value != 0 {
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
}
}
}
// Replace `$search` with `$replace` in `$string`
// Used on our SVG icon backgrounds for custom forms.
//
// @author Hugo Giraudel
// @param {String} $string - Initial string
// @param {String} $search - Substring to replace
// @param {String} $replace ('') - New value
// @return {String} - Updated string
@function str-replace($string, $search, $replace: "") {
$index: str-index($string, $search);
@if $index {
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
}
@return $string;
}
// See https://codepen.io/kevinweber/pen/dXWoRw
//
// Requires the use of quotes around data URIs.
@function escape-svg($string) {
@if str-index($string, "data:image/svg+xml") {
@each $char, $encoded in $escaped-characters {
// Do not escape the url brackets
@if str-index($string, "url(") == 1 {
$string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}");
} @else {
$string: str-replace($string, $char, $encoded);
}
}
}
@return $string;
}
// Color contrast
@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
$r: red($color);
$g: green($color);
$b: blue($color);
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
@if ($yiq >= $yiq-contrasted-threshold) {
@return $dark;
} @else {
@return $light;
}
}
// Retrieve color Sass maps
@function color($key: "blue") {
@return map-get($colors, $key);
}
@function theme-color($key: "primary") {
@return map-get($theme-colors, $key);
}
@function gray($key: "100") {
@return map-get($grays, $key);
}
// Request a theme color level
@function theme-color-level($color-name: "primary", $level: 0) {
$color: theme-color($color-name);
$color-base: if($level > 0, $black, $white);
$level: abs($level);
@return mix($color-base, $color, $level * $theme-color-interval);
}
// Return valid calc
@function add($value1, $value2, $return-calc: true) {
@if $value1 == null {
@return $value2;
}
@if $value2 == null {
@return $value1;
}
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 + $value2;
}
@return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2);
}
@function subtract($value1, $value2, $return-calc: true) {
@if $value1 == null and $value2 == null {
@return null;
}
@if $value1 == null {
@return -$value2;
}
@if $value2 == null {
@return $value1;
}
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 - $value2;
}
@return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
}
================================================
FILE: _sass/bootstrap/_grid.scss
================================================
// Container widths
//
// Set the container width, and override it for fixed navbars in media queries.
@if $enable-grid-classes {
// Single container class with breakpoint max-widths
.container,
// 100% wide container at all breakpoints
.container-fluid {
@include make-container();
}
// Responsive containers that are 100% wide until a breakpoint
@each $breakpoint, $container-max-width in $container-max-widths {
.container-#{$breakpoint} {
@extend .container-fluid;
}
@include media-breakpoint-up($breakpoint, $grid-breakpoints) {
%responsive-container-#{$breakpoint} {
max-width: $container-max-width;
}
// Extend each breakpoint which is smaller or equal to the current breakpoint
$extend-breakpoint: true;
@each $name, $width in $grid-breakpoints {
@if ($extend-breakpoint) {
.container#{breakpoint-infix($name, $grid-breakpoints)} {
@extend %responsive-container-#{$breakpoint};
}
// Once the current breakpoint is reached, stop extending
@if ($breakpoint == $name) {
$extend-breakpoint: false;
}
}
}
}
}
}
// Row
//
// Rows contain your columns.
@if $enable-grid-classes {
.row {
@include make-row();
}
// Remove the negative margin from default .row, then the horizontal padding
// from all immediate children columns (to prevent runaway style inheritance).
.no-gutters {
margin-right: 0;
margin-left: 0;
> .col,
> [class*="col-"] {
padding-right: 0;
padding-left: 0;
}
}
}
// Columns
//
// Common styles for small and large grid columns
@if $enable-grid-classes {
@include make-grid-columns();
}
================================================
FILE: _sass/bootstrap/_images.scss
================================================
// Responsive images (ensure images don't scale beyond their parents)
//
// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
// We previously tried the "images are responsive by default" approach in Bootstrap v2,
// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
// which weren't expecting the images within themselves to be involuntarily resized.
// See also https://github.com/twbs/bootstrap/issues/18178
.img-fluid {
@include img-fluid();
}
// Image thumbnails
.img-thumbnail {
padding: $thumbnail-padding;
background-color: $thumbnail-bg;
border: $thumbnail-border-width solid $thumbnail-border-color;
@include border-radius($thumbnail-border-radius);
@include box-shadow($thumbnail-box-shadow);
// Keep them at most 100% wide
@include img-fluid();
}
//
// Figures
//
.figure {
// Ensures the caption's text aligns with the image.
display: inline-block;
}
.figure-img {
margin-bottom: $spacer / 2;
line-height: 1;
}
.figure-caption {
@include font-size($figure-caption-font-size);
color: $figure-caption-color;
}
================================================
FILE: _sass/bootstrap/_input-group.scss
================================================
// stylelint-disable selector-no-qualifying-type
//
// Base styles
//
.input-group {
position: relative;
display: flex;
flex-wrap: wrap; // For form validation feedback
align-items: stretch;
width: 100%;
> .form-control,
> .form-control-plaintext,
> .custom-select,
> .custom-file {
position: relative; // For focus state's z-index
flex: 1 1 auto;
width: 1%;
min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
margin-bottom: 0;
+ .form-control,
+ .custom-select,
+ .custom-file {
margin-left: -$input-border-width;
}
}
// Bring the "active" form control to the top of surrounding elements
> .form-control:focus,
> .custom-select:focus,
> .custom-file .custom-file-input:focus ~ .custom-file-label {
z-index: 3;
}
// Bring the custom file input above the label
> .custom-file .custom-file-input:focus {
z-index: 4;
}
> .form-control,
> .custom-select {
&:not(:first-child) { @include border-left-radius(0); }
}
// Custom file inputs have more complex markup, thus requiring different
// border-radius overrides.
> .custom-file {
display: flex;
align-items: center;
&:not(:last-child) .custom-file-label,
&:not(:first-child) .custom-file-label { @include border-left-radius(0); }
}
&:not(.has-validation) {
> .form-control:not(:last-child),
> .custom-select:not(:last-child),
> .custom-file:not(:last-child) .custom-file-label::after {
@include border-right-radius(0);
}
}
&.has-validation {
> .form-control:nth-last-child(n + 3),
> .custom-select:nth-last-child(n + 3),
> .custom-file:nth-last-child(n + 3) .custom-file-label::after {
@include border-right-radius(0);
}
}
}
// Prepend and append
//
// While it requires one extra layer of HTML for each, dedicated prepend and
// append elements allow us to 1) be less clever, 2) simplify our selectors, and
// 3) support HTML5 form validation.
.input-group-prepend,
.input-group-append {
display: flex;
// Ensure buttons are always above inputs for more visually pleasing borders.
// This isn't needed for `.input-group-text` since it shares the same border-color
// as our inputs.
.btn {
position: relative;
z-index: 2;
&:focus {
z-index: 3;
}
}
.btn + .btn,
.btn + .input-group-text,
.input-group-text + .input-group-text,
.input-group-text + .btn {
margin-left: -$input-border-width;
}
}
.input-group-prepend { margin-right: -$input-border-width; }
.input-group-append { margin-left: -$input-border-width; }
// Textual addons
//
// Serves as a catch-all element for any text or radio/checkbox input you wish
// to prepend or append to an input.
.input-group-text {
display: flex;
align-items: center;
padding: $input-padding-y $input-padding-x;
margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
@include font-size($input-font-size); // Match inputs
font-weight: $font-weight-normal;
line-height: $input-line-height;
color: $input-group-addon-color;
text-align: center;
white-space: nowrap;
background-color: $input-group-addon-bg;
border: $input-border-width solid $input-group-addon-border-color;
@include border-radius($input-border-radius);
// Nuke default margins from checkboxes and radios to vertically center within.
input[type="radio"],
input[type="checkbox"] {
margin-top: 0;
}
}
// Sizing
//
// Remix the default form control sizing classes into new ones for easier
// manipulation.
.input-group-lg > .form-control:not(textarea),
.input-group-lg > .custom-select {
height: $input-height-lg;
}
.input-group-lg > .form-control,
.input-group-lg > .custom-select,
.input-group-lg > .input-group-prepend > .input-group-text,
.input-group-lg > .input-group-append > .input-group-text,
.input-group-lg > .input-group-prepend > .btn,
.input-group-lg > .input-group-append > .btn {
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
@include border-radius($input-border-radius-lg);
}
.input-group-sm > .form-control:not(textarea),
.input-group-sm > .custom-select {
height: $input-height-sm;
}
.input-group-sm > .form-control,
.input-group-sm > .custom-select,
.input-group-sm > .input-group-prepend > .input-group-text,
.input-group-sm > .input-group-append > .input-group-text,
.input-group-sm > .input-group-prepend > .btn,
.input-group-sm > .input-group-append > .btn {
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
@include border-radius($input-border-radius-sm);
}
.input-group-lg > .custom-select,
.input-group-sm > .custom-select {
padding-right: $custom-select-padding-x + $custom-select-indicator-padding;
}
// Prepend and append rounded corners
//
// These rulesets must come after the sizing ones to properly override sm and lg
// border-radius values when extending. They're more specific than we'd like
// with the `.input-group >` part, but without it, we cannot override the sizing.
.input-group > .input-group-prepend > .btn,
.input-group > .input-group-prepend > .input-group-text,
.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,
.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,
.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn,
.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text,
.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
@include border-right-radius(0);
}
.input-group > .input-group-append > .btn,
.input-group > .input-group-append > .input-group-text,
.input-group > .input-group-prepend:not(:first-child) > .btn,
.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
@include border-left-radius(0);
}
================================================
FILE: _sass/bootstrap/_jumbotron.scss
================================================
.jumbotron {
padding: $jumbotron-padding ($jumbotron-padding / 2);
margin-bottom: $jumbotron-padding;
color: $jumbotron-color;
background-color: $jumbotron-bg;
@include border-radius($border-radius-lg);
@include media-breakpoint-up(sm) {
padding: ($jumbotron-padding * 2) $jumbotron-padding;
}
}
.jumbotron-fluid {
padding-right: 0;
padding-left: 0;
@include border-radius(0);
}
================================================
FILE: _sass/bootstrap/_list-group.scss
================================================
// Base class
//
// Easily usable on <ul>, <ol>, or <div>.
.list-group {
display: flex;
flex-direction: column;
// No need to set list-style: none; since .list-group-item is block level
padding-left: 0; // reset padding because ul and ol
margin-bottom: 0;
@include border-radius($list-group-border-radius);
}
// Interactive list items
//
// Use anchor or button elements instead of `li`s or `div`s to create interactive
// list items. Includes an extra `.active` modifier class for selected items.
.list-group-item-action {
width: 100%; // For `<button>`s (anchors become 100% by default though)
color: $list-group-action-color;
text-align: inherit; // For `<button>`s (anchors inherit)
// Hover state
@include hover-focus() {
z-index: 1; // Place hover/focus items above their siblings for proper border styling
color: $list-group-action-hover-color;
text-decoration: none;
background-color: $list-group-hover-bg;
}
&:active {
color: $list-group-action-active-color;
background-color: $list-group-action-active-bg;
}
}
// Individual list items
//
// Use on `li`s or `div`s within the `.list-group` parent.
.list-group-item {
position: relative;
display: block;
padding: $list-group-item-padding-y $list-group-item-padding-x;
color: $list-group-color;
text-decoration: if($link-decoration == none, null, none);
background-color: $list-group-bg;
border: $list-group-border-width solid $list-group-border-color;
&:first-child {
@include border-top-radius(inherit);
}
&:last-child {
@include border-bottom-radius(inherit);
}
&.disabled,
&:disabled {
color: $list-group-disabled-color;
pointer-events: none;
background-color: $list-group-disabled-bg;
}
// Include both here for `<a>`s and `<button>`s
&.active {
z-index: 2; // Place active items above their siblings for proper border styling
color: $list-group-active-color;
background-color: $list-group-active-bg;
border-color: $list-group-active-border-color;
}
& + & {
border-top-width: 0;
&.active {
margin-top: -$list-group-border-width;
border-top-width: $list-group-border-width;
}
}
}
// Horizontal
//
// Change the layout of list group items from vertical (default) to horizontal.
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.list-group-horizontal#{$infix} {
flex-direction: row;
> .list-group-item {
&:first-child {
@include border-bottom-left-radius($list-group-border-radius);
@include border-top-right-radius(0);
}
&:last-child {
@include border-top-right-radius($list-group-border-radius);
@include border-bottom-left-radius(0);
}
&.active {
margin-top: 0;
}
+ .list-group-item {
border-top-width: $list-group-border-width;
border-left-width: 0;
&.active {
margin-left: -$list-group-border-width;
border-left-width: $list-group-border-width;
}
}
}
}
}
}
// Flush list items
//
// Remove borders and border-radius to keep list group items edge-to-edge. Most
// useful within other components (e.g., cards).
.list-group-flush {
@include border-radius(0);
> .list-group-item {
border-width: 0 0 $list-group-border-width;
&:last-child {
border-bottom-width: 0;
}
}
}
// Contextual variants
//
// Add modifier classes to change text and background color on individual items.
// Organizationally, this must come after the `:hover` states.
@each $color, $value in $theme-colors {
@include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
}
================================================
FILE: _sass/bootstrap/_media.scss
================================================
.media {
display: flex;
align-items: flex-start;
}
.media-body {
flex: 1;
}
================================================
FILE: _sass/bootstrap/_mixins.scss
================================================
// Toggles
//
// Used in conjunction with global variables to enable certain theme features.
// Vendor
@import "vendor/rfs";
// Deprecate
@import "mixins/deprecate";
// Utilities
@import "mixins/breakpoints";
@import "mixins/hover";
@import "mixins/image";
@import "mixins/badge";
@import "mixins/resize";
@import "mixins/screen-reader";
@import "mixins/size";
@import "mixins/reset-text";
@import "mixins/text-emphasis";
@import "mixins/text-hide";
@import "mixins/text-truncate";
@import "mixins/visibility";
// Components
@import "mixins/alert";
@import "mixins/buttons";
@import "mixins/caret";
@import "mixins/pagination";
@import "mixins/lists";
@import "mixins/list-group";
@import "mixins/nav-divider";
@import "mixins/forms";
@import "mixins/table-row";
// Skins
@import "mixins/background-variant";
@import "mixins/border-radius";
@import "mixins/box-shadow";
@import "mixins/gradients";
@import "mixins/transition";
// Layout
@import "mixins/clearfix";
@import "mixins/grid-framework";
@import "mixins/grid";
@import "mixins/float";
================================================
FILE: _sass/bootstrap/_modal.scss
================================================
// .modal-open - body class for killing the scroll
// .modal - container to scroll within
// .modal-dialog - positioning shell for the actual modal
// .modal-content - actual modal w/ bg and corners and stuff
.modal-open {
// Kill the scroll on the body
overflow: hidden;
.modal {
overflow-x: hidden;
overflow-y: auto;
}
}
// Container that the modal scrolls within
.modal {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-modal;
display: none;
width: 100%;
height: 100%;
overflow: hidden;
// Prevent Chrome on Windows from adding a focus outline. For details, see
// https://github.com/twbs/bootstrap/pull/10951.
outline: 0;
// We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
// gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
// See also https://github.com/twbs/bootstrap/issues/17695
}
// Shell div to position the modal with bottom padding
.modal-dialog {
position: relative;
width: auto;
margin: $modal-dialog-margin;
// allow clicks to pass through for custom click handling to close modal
pointer-events: none;
// When fading in the modal, animate it to slide down
.modal.fade & {
@include transition($modal-transition);
transform: $modal-fade-transform;
}
.modal.show & {
transform: $modal-show-transform;
}
// When trying to close, animate focus to scale
.modal.modal-static & {
transform: $modal-scale-transform;
}
}
.modal-dialog-scrollable {
display: flex; // IE10/11
max-height: subtract(100%, $modal-dialog-margin * 2);
.modal-content {
max-height: subtract(100vh, $modal-dialog-margin * 2); // IE10/11
overflow: hidden;
}
.modal-header,
.modal-footer {
flex-shrink: 0;
}
.modal-body {
overflow-y: auto;
}
}
.modal-dialog-centered {
display: flex;
align-items: center;
min-height: subtract(100%, $modal-dialog-margin * 2);
// Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)
&::before {
display: block; // IE10
height: subtract(100vh, $modal-dialog-margin * 2);
height: min-content; // Reset height to 0 except on IE
content: "";
}
// Ensure `.modal-body` shows scrollbar (IE10/11)
&.modal-dialog-scrollable {
flex-direction: column;
justify-content: center;
height: 100%;
.modal-content {
max-height: none;
}
&::before {
content: none;
}
}
}
// Actual modal
.modal-content {
position: relative;
display: flex;
flex-direction: column;
width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
// counteract the pointer-events: none; in the .modal-dialog
color: $modal-content-color;
pointer-events: auto;
background-color: $modal-content-bg;
background-clip: padding-box;
border: $modal-content-border-width solid $modal-content-border-color;
@include border-radius($modal-content-border-radius);
@include box-shadow($modal-content-box-shadow-xs);
// Remove focus outline from opened modal
outline: 0;
}
// Modal background
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-modal-backdrop;
width: 100vw;
height: 100vh;
background-color: $modal-backdrop-bg;
// Fade for backdrop
&.fade { opacity: 0; }
&.show { opacity: $modal-backdrop-opacity; }
}
// Modal header
// Top section of the modal w/ title and dismiss
.modal-header {
display: flex;
align-items: flex-start; // so the close btn always stays on the upper right corner
justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
padding: $modal-header-padding;
border-bottom: $modal-header-border-width solid $modal-header-border-color;
@include border-top-radius($modal-content-inner-border-radius);
.close {
padding: $modal-header-padding;
// auto on the left force icon to the right even when there is no .modal-title
margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;
}
}
// Title text within header
.modal-title {
margin-bottom: 0;
line-height: $modal-title-line-height;
}
// Modal body
// Where all modal content resides (sibling of .modal-header and .modal-footer)
.modal-body {
position: relative;
// Enable `flex-grow: 1` so that the body take up as much space as possible
// when there should be a fixed height on `.modal-dialog`.
flex: 1 1 auto;
padding: $modal-inner-padding;
}
// Footer (for actions)
.modal-footer {
display: flex;
flex-wrap: wrap;
align-items: center; // vertically center
justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
padding: $modal-inner-padding - $modal-footer-margin-between / 2;
border-top: $modal-footer-border-width solid $modal-footer-border-color;
@include border-bottom-radius($modal-content-inner-border-radius);
// Place margin between footer elements
// This solution is far from ideal because of the universal selector usage,
// but is needed to fix https://github.com/twbs/bootstrap/issues/24800
> * {
margin: $modal-footer-margin-between / 2;
}
}
// Measure scrollbar width for padding body during modal show/hide
.modal-scrollbar-measure {
position: absolute;
top: -9999px;
width: 50px;
height: 50px;
overflow: scroll;
}
// Scale up the modal
@include media-breakpoint-up(sm) {
// Automatically set modal's width for larger viewports
.modal-dialog {
max-width: $modal-md;
margin: $modal-dialog-margin-y-sm-up auto;
}
.modal-dialog-scrollable {
max-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
.modal-content {
max-height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
}
}
.modal-dialog-centered {
min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
&::before {
height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
height: min-content;
}
}
.modal-content {
@include box-shadow($modal-content-box-shadow-sm-up);
}
.modal-sm { max-width: $modal-sm; }
}
@include media-breakpoint-up(lg) {
.modal-lg,
.modal-xl {
max-width: $modal-lg;
}
}
@include media-breakpoint-up(xl) {
.modal-xl { max-width: $modal-xl; }
}
================================================
FILE: _sass/bootstrap/_nav.scss
================================================
// Base class
//
// Kickstart any navigation component with a set of style resets. Works with
// `<nav>`s, `<ul>`s or `<ol>`s.
.nav {
display: flex;
flex-wrap: wrap;
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav-link {
display: block;
padding: $nav-link-padding-y $nav-link-padding-x;
text-decoration: if($link-decoration == none, null, none);
@include hover-focus() {
text-decoration: none;
}
// Disabled state lightens text
&.disabled {
color: $nav-link-disabled-color;
pointer-events: none;
cursor: default;
}
}
//
// Tabs
//
.nav-tabs {
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
.nav-link {
margin-bottom: -$nav-tabs-border-width;
border: $nav-tabs-border-width solid transparent;
@include border-top-radius($nav-tabs-border-radius);
@include hover-focus() {
border-color: $nav-tabs-link-hover-border-color;
}
&.disabled {
color: $nav-link-disabled-color;
background-color: transparent;
border-color: transparent;
}
}
.nav-link.active,
.nav-item.show .nav-link {
color: $nav-tabs-link-active-color;
background-color: $nav-tabs-link-active-bg;
border-color: $nav-tabs-link-active-border-color;
}
.dropdown-menu {
// Make dropdown border overlap tab border
margin-top: -$nav-tabs-border-width;
// Remove the top rounded corners here since there is a hard edge above the menu
@include border-top-radius(0);
}
}
//
// Pills
//
.nav-pills {
.nav-link {
@include border-radius($nav-pills-border-radius);
}
.nav-link.active,
.show > .nav-link {
color: $nav-pills-link-active-color;
background-color: $nav-pills-link-active-bg;
}
}
//
// Justified variants
//
.nav-fill {
> .nav-link,
.nav-item {
flex: 1 1 auto;
text-align: center;
}
}
.nav-justified {
> .nav-link,
.nav-item {
flex-basis: 0;
flex-grow: 1;
text-align: center;
}
}
// Tabbable tabs
//
// Hide tabbable panes to start, show them when `.active`
.tab-content {
> .tab-pane {
display: none;
}
> .active {
display: block;
}
}
================================================
FILE: _sass/bootstrap/_navbar.scss
================================================
// Contents
//
// Navbar
// Navbar brand
// Navbar nav
// Navbar text
// Navbar divider
// Responsive navbar
// Navbar position
// Navbar themes
// Navbar
//
// Provide a static navbar from which we expand to create full-width, fixed, and
// other navbar variations.
.navbar {
position: relative;
display: flex;
flex-wrap: wrap; // allow us to do the line break for collapsing content
align-items: center;
justify-content: space-between; // space out brand from logo
padding: $navbar-padding-y $navbar-padding-x;
// Because flex properties aren't inherited, we need to redeclare these first
// few properties so that content nested within behave properly.
%container-flex-properties {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
}
.container,
.container-fluid {
@extend %container-flex-properties;
}
@each $breakpoint, $container-max-width in $container-max-widths {
> .container#{breakpoint-infix($breakpoint, $container-max-widths)} {
@extend %container-flex-properties;
}
}
}
// Navbar brand
//
// Used for brand, project, or site names.
.navbar-brand {
display: inline-block;
padding-top: $navbar-brand-padding-y;
padding-bottom: $navbar-brand-padding-y;
margin-right: $navbar-padding-x;
@include font-size($navbar-brand-font-size);
line-height: inherit;
white-space: nowrap;
@include hover-focus() {
text-decoration: none;
}
}
// Navbar nav
//
// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
.navbar-nav {
display: flex;
flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
padding-left: 0;
margin-bottom: 0;
list-style: none;
.nav-link {
padding-right: 0;
padding-left: 0;
}
.dropdown-menu {
position: static;
float: none;
}
}
// Navbar text
//
//
.navbar-text {
display: inline-block;
padding-top: $nav-link-padding-y;
padding-bottom: $nav-link-padding-y;
}
// Responsive navbar
//
// Custom styles for responsive collapsing and toggling of navbar contents.
// Powered by the collapse Bootstrap JavaScript plugin.
// When collapsed, prevent the toggleable navbar contents from appearing in
// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
// on the `.navbar` parent.
.navbar-collapse {
flex-basis: 100%;
flex-grow: 1;
// For always expanded or extra full navbars, ensure content aligns itself
// properly vertically. Can be easily overridden with flex utilities.
align-items: center;
}
// Button for toggling the navbar when in its collapsed state
.navbar-toggler {
padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
@include font-size($navbar-toggler-font-size);
line-height: 1;
background-color: transparent; // remove default button style
border: $border-width solid transparent; // remove default button style
@include border-radius($navbar-toggler-border-radius);
@include hover-focus() {
text-decoration: none;
}
}
// Keep as a separate element so folks can easily override it with another icon
// or image file as needed.
.navbar-toggler-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
content: "";
background: 50% / 100% 100% no-repeat;
}
.navbar-nav-scroll {
max-height: $navbar-nav-scroll-max-height;
overflow-y: auto;
}
// Generate series of `.navbar-expand-*` responsive classes for configuring
// where your navbar collapses.
.navbar-expand {
@each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints);
$infix: breakpoint-infix($next, $grid-breakpoints);
&#{$infix} {
@include media-breakpoint-down($breakpoint) {
%container-navbar-expand-#{$breakpoint} {
padding-right: 0;
padding-left: 0;
}
> .container,
> .container-fluid {
@extend %container-navbar-expand-#{$breakpoint};
}
@each $size, $container-max-width in $container-max-widths {
> .container#{breakpoint-infix($size, $container-max-widths)} {
@extend %container-navbar-expand-#{$breakpoint};
}
}
}
@include media-breakpoint-up($next) {
flex-flow: row nowrap;
justify-content: flex-start;
.navbar-nav {
flex-direction: row;
.dropdown-menu {
position: absolute;
}
.nav-link {
padding-right: $navbar-nav-link-padding-x;
padding-left: $navbar-nav-link-padding-x;
}
}
// For nesting containers, have to redeclare for alignment purposes
%container-nesting-#{$breakpoint} {
flex-wrap: nowrap;
}
> .container,
> .container-fluid {
@extend %container-nesting-#{$breakpoint};
}
@each $size, $container-max-width in $container-max-widths {
> .container#{breakpoint-infix($size, $container-max-widths)} {
@extend %container-nesting-#{$breakpoint};
}
}
.navbar-nav-scroll {
overflow: visible;
}
.navbar-collapse {
display: flex !important; // stylelint-disable-line declaration-no-important
// Changes flex-bases to auto because of an IE10 bug
flex-basis: auto;
}
.navbar-toggler {
display: none;
}
}
}
}
}
// Navbar themes
//
// Styles for switching between navbars with light or dark background.
// Dark links against a light background
.navbar-light {
.navbar-brand {
color: $navbar-light-brand-color;
@include hover-focus() {
color: $navbar-light-brand-hover-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-light-color;
@include hover-focus() {
color: $navbar-light-hover-color;
}
&.disabled {
color: $navbar-light-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: $navbar-light-active-color;
}
}
.navbar-toggler {
color: $navbar-light-color;
border-color: $navbar-light-toggler-border-color;
}
.navbar-toggler-icon {
background-image: escape-svg($navbar-light-toggler-icon-bg);
}
.navbar-text {
color: $navbar-light-color;
a {
color: $navbar-light-active-color;
@include hover-focus() {
color: $navbar-light-active-color;
}
}
}
}
// White links against a dark background
.navbar-dark {
.navbar-brand {
color: $navbar-dark-brand-color;
@include hover-focus() {
color: $navbar-dark-brand-hover-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-dark-color;
@include hover-focus() {
color: $navbar-dark-hover-color;
}
&.disabled {
color: $navbar-dark-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: $navbar-dark-active-color;
}
}
.navbar-toggler {
color: $navbar-dark-color;
border-color: $navbar-dark-toggler-border-color;
}
.navbar-toggler-icon {
background-image: escape-svg($navbar-dark-toggler-icon-bg);
}
.navbar-text {
color: $navbar-dark-color;
a {
color: $navbar-dark-active-color;
@include hover-focus() {
color: $navbar-dark-active-color;
}
}
}
}
================================================
FILE: _sass/bootstrap/_pagination.scss
================================================
.pagination {
display: flex;
@include list-unstyled();
@include border-radius();
}
.page-link {
position: relative;
display: block;
padding: $pagination-padding-y $pagination-padding-x;
margin-left: -$pagination-border-width;
line-height: $pagination-line-height;
color: $pagination-color;
text-decoration: if($link-decoration == none, null, none);
background-color: $pagination-bg;
border: $pagination-border-width solid $pagination-border-color;
&:hover {
z-index: 2;
color: $pagination-hover-color;
text-decoration: none;
background-color: $pagination-hover-bg;
border-color: $pagination-hover-border-color;
}
&:focus {
z-index: 3;
outline: $pagination-focus-outline;
box-shadow: $pagination-focus-box-shadow;
}
}
.page-item {
&:first-child {
.page-link {
margin-left: 0;
@include border-left-radius($border-radius);
}
}
&:last-child {
.page-link {
@include border-right-radius($border-radius);
}
}
&.active .page-link {
z-index: 3;
color: $pagination-active-color;
background-color: $pagination-active-bg;
border-color: $pagination-active-border-color;
}
&.disabled .page-link {
color: $pagination-disabled-color;
pointer-events: none;
// Opinionated: remove the "hand" cursor set previously for .page-link
cursor: auto;
background-color: $pagination-disabled-bg;
border-color: $pagination-disabled-border-color;
}
}
//
// Sizing
//
.pagination-lg {
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $pagination-border-radius-lg);
}
.pagination-sm {
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $pagination-border-radius-sm);
}
================================================
FILE: _sass/bootstrap/_popover.scss
================================================
.popover {
position: absolute;
top: 0;
left: 0;
z-index: $zindex-popover;
display: block;
max-width: $popover-max-width;
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
// So reset our font and text properties to avoid inheriting weird values.
@include reset-text();
@include font-size($popover-font-size);
// Allow breaking very long words so they don't overflow the popover's bounds
word-wrap: break-word;
background-color: $popover-bg;
background-clip: padding-box;
border: $popover-border-width solid $popover-border-color;
@include border-radius($popover-border-radius);
@include box-shadow($popover-box-shadow);
.arrow {
position: absolute;
display: block;
width: $popover-arrow-width;
height: $popover-arrow-height;
margin: 0 $popover-border-radius;
&::before,
&::after {
position: absolute;
display: block;
content: "";
border-color: transparent;
border-style: solid;
}
}
}
.bs-popover-top {
margin-bottom: $popover-arrow-height;
> .arrow {
bottom: subtract(-$popover-arrow-height, $popover-border-width);
&::before {
bottom: 0;
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
border-top-color: $popover-arrow-outer-color;
}
&::after {
bottom: $popover-border-width;
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
border-top-color: $popover-arrow-color;
}
}
}
.bs-popover-right {
margin-left: $popover-arrow-height;
> .arrow {
left: subtract(-$popover-arrow-height, $popover-border-width);
width: $popover-arrow-height;
height: $popover-arrow-width;
margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners
&::before {
left: 0;
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
border-right-color: $popover-arrow-outer-color;
}
&::after {
left: $popover-border-width;
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
border-right-color: $popover-arrow-color;
}
}
}
.bs-popover-bottom {
margin-top: $popover-arrow-height;
> .arrow {
top: subtract(-$popover-arrow-height, $popover-border-width);
&::before {
top: 0;
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
border-bottom-color: $popover-arrow-outer-color;
}
&::after {
top: $popover-border-width;
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
border-bottom-color: $popover-arrow-color;
}
}
// This will remove the popover-header's border just below the arrow
.popover-header::before {
position: absolute;
top: 0;
left: 50%;
display: block;
width: $popover-arrow-width;
margin-left: -$popover-arrow-width / 2;
content: "";
border-bottom: $popover-border-width solid $popover-header-bg;
}
}
.bs-popover-left {
margin-right: $popover-arrow-height;
> .arrow {
right: subtract(-$popover-arrow-height, $popover-border-width);
width: $popover-arrow-height;
height: $popover-arrow-width;
margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners
&::before {
right: 0;
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
border-left-color: $popover-arrow-outer-color;
}
&::after {
right: $popover-border-width;
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
border-left-color: $popover-arrow-color;
}
}
}
.bs-popover-auto {
&[x-placement^="top"] {
@extend .bs-popover-top;
}
&[x-placement^="right"] {
@extend .bs-popover-right;
}
&[x-placement^="bottom"] {
@extend .bs-popover-bottom;
}
&[x-placement^="left"] {
@extend .bs-popover-left;
}
}
// Offset the popover to account for the popover arrow
.popover-header {
padding: $popover-header-padding-y $popover-header-padding-x;
margin-bottom: 0; // Reset the default from Reboot
@include font-size($font-size-base);
color: $popover-header-color;
background-color: $popover-header-bg;
border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);
@include border-top-radius($popover-inner-border-radius);
&:empty {
display: none;
}
}
.popover-body {
padding: $popover-body-padding-y $popover-body-padding-x;
color: $popover-body-color;
}
================================================
FILE: _sass/bootstrap/_print.scss
================================================
// stylelint-disable declaration-no-important, selector-no-qualifying-type
// Source: https://github.com/h5bp/main.css/blob/master/src/_print.css
// ==========================================================================
// Print styles.
// Inlined to avoid the additional HTTP request:
// https://www.phpied.com/delay-loading-your-print-css/
// ==========================================================================
@if $enable-print-styles {
@media print {
*,
*::before,
*::after {
// Bootstrap specific; comment out `color` and `background`
//color: $black !important; // Black prints faster
text-shadow: none !important;
//background: transparent !important;
box-shadow: none !important;
}
a {
&:not(.btn) {
text-decoration: underline;
}
}
// Bootstrap specific; comment the following selector out
//a[href]::after {
// content: " (" attr(href) ")";
//}
abbr[title]::after {
content: " (" attr(title) ")";
}
// Bootstrap specific; comment the following selector out
//
// Don't show links that are fragment identifiers,
// or use the `javascript:` pseudo protocol
//
//a[href^="#"]::after,
//a[href^="javascript:"]::after {
// content: "";
//}
pre
gitextract_psj7c2bh/ ├── .github/ │ └── ISSUE_TEMPLATE/ │ ├── bug_report.md │ ├── content-feature-request.md │ └── feature_request.md ├── .gitignore ├── 404.html ├── CNAME ├── Gemfile ├── LICENSE ├── README.md ├── _config.yml ├── _includes/ │ ├── footer.html │ ├── head.html │ ├── header.html │ └── resources_sidebar.html ├── _layouts/ │ ├── default.html │ ├── home.html │ ├── page.html │ └── post.html ├── _resources/ │ ├── 00_what_is_hacker101.md │ ├── 01_what_is_hacker101_ctf.md │ ├── 02_how_do_i_start.md │ ├── 03_how_do_i_do_bug_bounties.md │ ├── 04_programming_languages.md │ ├── 05_web_hacking_tools.md │ ├── 06_burp_suite_plugins.md │ ├── 07_mobile_hacking_tools.md │ ├── 08_android_hacking_tools.md │ ├── 09_desktop_hacking_tools.md │ ├── 10_exploitation_resources.md │ ├── 11_scanners_frameworks.md │ ├── 12_datasets_freemium_services.md │ └── 13_misc_hacking_tools.md ├── _sass/ │ ├── _bootstrap_customization.scss │ ├── _syntax-highlighting.scss │ ├── _variables.scss │ ├── bootstrap/ │ │ ├── __DO_NOT_MODIFY │ │ ├── _alert.scss │ │ ├── _badge.scss │ │ ├── _breadcrumb.scss │ │ ├── _button-group.scss │ │ ├── _buttons.scss │ │ ├── _card.scss │ │ ├── _carousel.scss │ │ ├── _close.scss │ │ ├── _code.scss │ │ ├── _custom-forms.scss │ │ ├── _dropdown.scss │ │ ├── _forms.scss │ │ ├── _functions.scss │ │ ├── _grid.scss │ │ ├── _images.scss │ │ ├── _input-group.scss │ │ ├── _jumbotron.scss │ │ ├── _list-group.scss │ │ ├── _media.scss │ │ ├── _mixins.scss │ │ ├── _modal.scss │ │ ├── _nav.scss │ │ ├── _navbar.scss │ │ ├── _pagination.scss │ │ ├── _popover.scss │ │ ├── _print.scss │ │ ├── _progress.scss │ │ ├── _reboot.scss │ │ ├── _root.scss │ │ ├── _spinners.scss │ │ ├── _tables.scss │ │ ├── _toasts.scss │ │ ├── _tooltip.scss │ │ ├── _transitions.scss │ │ ├── _type.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── bootstrap-grid.scss │ │ ├── bootstrap-reboot.scss │ │ ├── bootstrap.scss │ │ ├── mixins/ │ │ │ ├── _alert.scss │ │ │ ├── _background-variant.scss │ │ │ ├── _badge.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _box-shadow.scss │ │ │ ├── _breakpoints.scss │ │ │ ├── _buttons.scss │ │ │ ├── _caret.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _deprecate.scss │ │ │ ├── _float.scss │ │ │ ├── _forms.scss │ │ │ ├── _gradients.scss │ │ │ ├── _grid-framework.scss │ │ │ ├── _grid.scss │ │ │ ├── _hover.scss │ │ │ ├── _image.scss │ │ │ ├── _list-group.scss │ │ │ ├── _lists.scss │ │ │ ├── _nav-divider.scss │ │ │ ├── _pagination.scss │ │ │ ├── _reset-text.scss │ │ │ ├── _resize.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _size.scss │ │ │ ├── _table-row.scss │ │ │ ├── _text-emphasis.scss │ │ │ ├── _text-hide.scss │ │ │ ├── _text-truncate.scss │ │ │ ├── _transition.scss │ │ │ └── _visibility.scss │ │ └── utilities/ │ │ ├── _align.scss │ │ ├── _background.scss │ │ ├── _borders.scss │ │ ├── _clearfix.scss │ │ ├── _display.scss │ │ ├── _embed.scss │ │ ├── _flex.scss │ │ ├── _float.scss │ │ ├── _interactions.scss │ │ ├── _overflow.scss │ │ ├── _position.scss │ │ ├── _screenreaders.scss │ │ ├── _shadows.scss │ │ ├── _sizing.scss │ │ ├── _spacing.scss │ │ ├── _stretched-link.scss │ │ ├── _text.scss │ │ └── _visibility.scss │ └── bootstrap-4-jekyll/ │ └── _bootstrap-4-jekyll.scss ├── announcements.md ├── assets/ │ ├── css/ │ │ └── main.scss │ └── javascript/ │ ├── bootstrap/ │ │ └── __DO_NOT_MODIFY │ └── dark-mode.js ├── conferences/ │ ├── hacktivitycon2020/ │ │ ├── 0tomvh.md │ │ ├── beyondscope.md │ │ ├── burnouts.md │ │ ├── carivi.md │ │ ├── codeql.md │ │ ├── exploiting_email_systems.md │ │ ├── gitlab.md │ │ ├── grafanassrf.md │ │ ├── keynote.md │ │ ├── offsec_panel.md │ │ ├── parse.md │ │ ├── pentester_blueprint.md │ │ ├── penteststories.md │ │ ├── tbhm.md │ │ ├── waf.md │ │ └── web_cache_deception.md │ └── hacktivitycon2021/ │ ├── bugbountyfor5years.md │ ├── ctfdev.md │ ├── haptyc.md │ ├── infosec_insecure_risky.md │ ├── keynote.md │ ├── networking_security_tiktok.md │ ├── offsec_panel.md │ ├── trufflehog.md │ └── vulnerability_research.md ├── discord.html ├── index.md ├── playlists/ │ ├── burp_suite.md │ ├── cryptography.md │ ├── hacktivitycon.md │ ├── mentorshipmondays.md │ ├── misc.md │ ├── mobile_hacking.md │ ├── newcomers.md │ ├── pentesting_series.md │ ├── playlists.html │ └── web_hacking.md ├── resources/ │ ├── articles/ │ │ ├── asking_for_help.md │ │ ├── code_of_conduct.md │ │ └── writing_a_report_and_cvss.md │ ├── hackerone_threat_model.md │ └── slides/ │ ├── Clickjacking.pptx │ ├── Crypto Attacks.pptx │ ├── Crypto Crash Course.pptx │ ├── Crypto Wrap-up.pptx │ ├── File Inclusion.pptx │ ├── File Upload Bugs.pptx │ ├── Introduction.pptx │ ├── Null Termination.pptx │ ├── Password Storage.pptx │ ├── SQL Injection and Friends.pptx │ ├── Session Fixation.pptx │ ├── The Web in Depth.pptx │ ├── Threat Modeling.pptx │ ├── Unchecked Redirects.pptx │ └── XSS and Authorization.pptx ├── resources.md ├── sessions/ │ ├── android/ │ │ ├── common_android_bugs_1.md │ │ ├── common_android_bugs_2.md │ │ ├── hacking_workshop_b3nac.md │ │ └── quickstart.md │ ├── burp101.md │ ├── burp201.md │ ├── burp301.md │ ├── clickjacking.md │ ├── cookie_tampering.md │ ├── crypto_attacks.md │ ├── crypto_crash_course.md │ ├── crypto_wrap_up.md │ ├── docker_hacking.md │ ├── file_inclusion.md │ ├── file_uploads.md │ ├── good_reports.md │ ├── iOS/ │ │ ├── app_transport.md │ │ ├── application_basics.md │ │ ├── filesystem.md │ │ ├── interapp_communication.md │ │ ├── ios_quickstart.md │ │ └── webviews.md │ ├── introduction.md │ ├── javascript_for_hackers.md │ ├── mm/ │ │ ├── s01/ │ │ │ ├── ctf_vs_bugbounty.md │ │ │ ├── h1-elite.md │ │ │ ├── hackthegovt.md │ │ │ ├── how_to_pentest.md │ │ │ ├── howtoshodan.md │ │ │ ├── mentalhealth.md │ │ │ └── mobile_hacking.md │ │ └── s02/ │ │ ├── getting_started.md │ │ ├── h1_CHO.md │ │ ├── how_to_pick_a_target.md │ │ ├── how_to_write_reports.md │ │ ├── industry_certificates.md │ │ └── starting_a_career.md │ ├── mobile_crash_course.md │ ├── native_code_crash_course.md │ ├── null_termination.md │ ├── password_storage.md │ ├── pentest_owasp.md │ ├── pentest_reporting.md │ ├── pentest_resources.md │ ├── pentest_vs_bug_bounty.md │ ├── secure_architecture.md │ ├── session_fixation.md │ ├── sessions.html │ ├── source_review.md │ ├── sqli.md │ ├── ssrf.md │ ├── threat_modeling.md │ ├── unchecked_redirects.md │ ├── web_in_depth.md │ ├── xss.md │ └── xxe.md ├── start-here.md ├── update_bootstrap.sh └── videos.md
Condensed preview — 246 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (473K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 841,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG] \"\nlabels: bug\nassignees: ''\n\n---\n\n**Describ"
},
{
"path": ".github/ISSUE_TEMPLATE/content-feature-request.md",
"chars": 575,
"preview": "---\nname: Content Feature request\nabout: Suggest an idea for this project\ntitle: \"[CONTENT] \"\nlabels: 'content request'\n"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 620,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE] \"\nlabels: 'feature request'\nassignee"
},
{
"path": ".gitignore",
"chars": 83,
"preview": ".DS_Store\n.jekyll-cache/\n.jekyll-metadata\n.sass-cache/\nGemfile.lock\n_site/\nvendor/\n"
},
{
"path": "404.html",
"chars": 239,
"preview": "---\nlayout: default\n---\n\n<div class=\"d-flex h-100 align-items-center\">\n <div class=\"container text-center\">\n <h1>404"
},
{
"path": "CNAME",
"chars": 17,
"preview": "www.hacker101.com"
},
{
"path": "Gemfile",
"chars": 99,
"preview": "source \"https://rubygems.org\"\n\ngem \"github-pages\", group: :jekyll_plugins\n\ngem \"webrick\", \"~> 1.8\"\n"
},
{
"path": "LICENSE",
"chars": 20984,
"preview": "Copyright © 2020 HackerOne Inc.\nThis work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 "
},
{
"path": "README.md",
"chars": 781,
"preview": "# Hacker101\n\n[Hacker101](https://www.hacker101.com/) is a free class for web security.\nWhether you're a programmer with "
},
{
"path": "_config.yml",
"chars": 1002,
"preview": "title: Hacker101\nemail: support@hackerone.com\ndescription: >-\n Hacker101 is a free class for web security. Whether you'"
},
{
"path": "_includes/footer.html",
"chars": 859,
"preview": "<footer class=\"flex-shrink-0 bg-dark py-3\">\n <div class=\"container d-flex justify-content-between\">\n <a href=\"https:"
},
{
"path": "_includes/head.html",
"chars": 998,
"preview": "<head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <meta name=\"viewport\" content="
},
{
"path": "_includes/header.html",
"chars": 2154,
"preview": "<header class=\"flex-shrink-0\">\n <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\">\n <div class=\"container\">\n "
},
{
"path": "_includes/resources_sidebar.html",
"chars": 170,
"preview": "<ul>\n {% for resource in site.resources %}\n <li>\n <a href=\"/resources#{{ resource.title | url_encode }}\">{{ res"
},
{
"path": "_layouts/default.html",
"chars": 735,
"preview": "<!DOCTYPE html>\n<html class=\"bg-dark\" lang=\"{{ page.lang | default: site.lang | default: \"en\" }}\">\n\n {%- include head.h"
},
{
"path": "_layouts/home.html",
"chars": 888,
"preview": "---\nlayout: default\n---\n\n<div>\n\n {%- if page.title -%}\n <header>\n <h1>{{ page.title }}</h1>\n </header>\n {%- endif"
},
{
"path": "_layouts/page.html",
"chars": 2919,
"preview": "---\nlayout: default\n---\n\n<div class=\"container py-4\">\n <div class=\"row\">\n <div class=\"col-lg-8\">\n <article>\n "
},
{
"path": "_layouts/post.html",
"chars": 434,
"preview": "---\nlayout: default\n---\n<article>\n\n <header>\n <h1>{{ page.title | escape }}</h1>\n <p class=\"text-muted\">\n <t"
},
{
"path": "_resources/00_what_is_hacker101.md",
"chars": 393,
"preview": "---\ntitle: What is Hacker101?\n---\n\nHacker101 is a free educational resource developed by [HackerOne](https://www.hackero"
},
{
"path": "_resources/01_what_is_hacker101_ctf.md",
"chars": 397,
"preview": "---\ntitle: What is the Hacker101 CTF?\n---\n\nThe <a href=\"https://ctf.hacker101.com/\" target=\"_blank\">Hacker101 CTF</a> --"
},
{
"path": "_resources/02_how_do_i_start.md",
"chars": 2389,
"preview": "---\ntitle: I'm new to all of this; how do I get started?\n---\n\nCongratulations on taking the first step to becoming a hac"
},
{
"path": "_resources/03_how_do_i_do_bug_bounties.md",
"chars": 501,
"preview": "---\ntitle: I've been hacking for a while now; how do I get into bug bounties?\n---\n\nWe recommend <a href=\"https://hackero"
},
{
"path": "_resources/04_programming_languages.md",
"chars": 1153,
"preview": "---\ntitle: Programming languages\n---\n\nProgramming is an important part of being a successful hacker. This isn't a compre"
},
{
"path": "_resources/05_web_hacking_tools.md",
"chars": 12465,
"preview": "---\ntitle: Web hacking tools\n---\n\nThis is a curated list of web hacking tools and is not intended to be comprehensive; r"
},
{
"path": "_resources/06_burp_suite_plugins.md",
"chars": 2838,
"preview": "---\ntitle: Burp Suite plugins\n---\n\n[Burp Suite](https://portswigger.net/burp): The quintessential web app hacking tool. "
},
{
"path": "_resources/07_mobile_hacking_tools.md",
"chars": 1968,
"preview": "---\ntitle: Mobile hacking tools\n---\n\nThis is a curated list of mobile hacking tools and is not intended to be comprehens"
},
{
"path": "_resources/08_android_hacking_tools.md",
"chars": 2930,
"preview": "---\ntitle: Android hacking tools\n---\n\nThis is a curated list of Android hacking tools and is not intended to be comprehe"
},
{
"path": "_resources/09_desktop_hacking_tools.md",
"chars": 2906,
"preview": "---\ntitle: Desktop / embedded hacking tools\n---\n\nThis is a curated list of hacking tools for native applications and emb"
},
{
"path": "_resources/10_exploitation_resources.md",
"chars": 2098,
"preview": "---\ntitle: Exploitation resources\n---\n\nThis is a curated list of exploitation resources and is not intended to be compre"
},
{
"path": "_resources/11_scanners_frameworks.md",
"chars": 3542,
"preview": "---\ntitle: Scanners / frameworks\n---\n\nThis is a curated list of scanners and frameworks and is not intended to be compre"
},
{
"path": "_resources/12_datasets_freemium_services.md",
"chars": 1619,
"preview": "---\ntitle: Datasets / freemium services\n---\n\nThis is a curated list of datasets and freemium services and is not intende"
},
{
"path": "_resources/13_misc_hacking_tools.md",
"chars": 2396,
"preview": "---\ntitle: Miscellaneous hacking tools\n---\n\nThis is a curated list of miscellaneous hacking tools and is not intended to"
},
{
"path": "_sass/_bootstrap_customization.scss",
"chars": 2773,
"preview": "// Buttons\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n &:focus,\n &.focus {\n box-shadow: 0 0 "
},
{
"path": "_sass/_syntax-highlighting.scss",
"chars": 3277,
"preview": "// Syntax highlighting styles, can be modified to match the theme\n\n\n.highlight {\n\n color: #111;\n\n pre {\n margin: 0;"
},
{
"path": "_sass/_variables.scss",
"chars": 18974,
"preview": "// Brand Colors\n$blue-300: #124ddb;\n$blue: #2d68f4;\n$blue-500: #477eff;\n$blue-600: #7aa2ff;\n$indigo: #6610f2;\n$purple: #"
},
{
"path": "_sass/bootstrap/__DO_NOT_MODIFY",
"chars": 0,
"preview": ""
},
{
"path": "_sass/bootstrap/_alert.scss",
"chars": 1164,
"preview": "//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $ale"
},
{
"path": "_sass/bootstrap/_badge.scss",
"chars": 1121,
"preview": "// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badg"
},
{
"path": "_sass/bootstrap/_breadcrumb.scss",
"chars": 1326,
"preview": ".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-botto"
},
{
"path": "_sass/bootstrap/_button-group.scss",
"chars": 3626,
"preview": "// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {"
},
{
"path": "_sass/bootstrap/_buttons.scss",
"chars": 2685,
"preview": "// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $"
},
{
"path": "_sass/bootstrap/_card.scss",
"chars": 5935,
"preview": "//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See ht"
},
{
"path": "_sass/bootstrap/_carousel.scss",
"chars": 4794,
"preview": "// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertical"
},
{
"path": "_sass/bootstrap/_close.scss",
"chars": 940,
"preview": ".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n "
},
{
"path": "_sass/bootstrap/_code.scss",
"chars": 1012,
"preview": "// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Stream"
},
{
"path": "_sass/bootstrap/_custom-forms.scss",
"chars": 15688,
"preview": "// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n//"
},
{
"path": "_sass/bootstrap/_dropdown.scss",
"chars": 4436,
"preview": "// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle "
},
{
"path": "_sass/bootstrap/_forms.scss",
"chars": 9242,
"preview": "// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n wi"
},
{
"path": "_sass/bootstrap/_functions.scss",
"chars": 4181,
"preview": "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mix"
},
{
"path": "_sass/bootstrap/_grid.scss",
"chars": 1745,
"preview": "// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid"
},
{
"path": "_sass/bootstrap/_images.scss",
"chars": 1157,
"preview": "// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit "
},
{
"path": "_sass/bootstrap/_input-group.scss",
"chars": 6318,
"preview": "// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: "
},
{
"path": "_sass/bootstrap/_jumbotron.scss",
"chars": 405,
"preview": ".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumb"
},
{
"path": "_sass/bootstrap/_list-group.scss",
"chars": 3870,
"preview": "// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n "
},
{
"path": "_sass/bootstrap/_media.scss",
"chars": 83,
"preview": ".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n"
},
{
"path": "_sass/bootstrap/_mixins.scss",
"chars": 1050,
"preview": "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/"
},
{
"path": "_sass/bootstrap/_modal.scss",
"chars": 6308,
"preview": "// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialo"
},
{
"path": "_sass/bootstrap/_nav.scss",
"chars": 2154,
"preview": "// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s, `<ul>`s or `<"
},
{
"path": "_sass/bootstrap/_navbar.scss",
"chars": 7529,
"preview": "// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar p"
},
{
"path": "_sass/bootstrap/_pagination.scss",
"chars": 1823,
"preview": ".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n.page-link {\n position: relat"
},
{
"path": "_sass/bootstrap/_popover.scss",
"chars": 4705,
"preview": ".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popove"
},
{
"path": "_sass/bootstrap/_print.scss",
"chars": 3033,
"preview": "// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/main.css/"
},
{
"path": "_sass/bootstrap/_progress.scss",
"chars": 1171,
"preview": "// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from "
},
{
"path": "_sass/bootstrap/_reboot.scss",
"chars": 11539,
"preview": "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// N"
},
{
"path": "_sass/bootstrap/_root.scss",
"chars": 572,
"preview": ":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$c"
},
{
"path": "_sass/bootstrap/_spinners.scss",
"chars": 1263,
"preview": "//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display"
},
{
"path": "_sass/bootstrap/_tables.scss",
"chars": 3544,
"preview": "//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-co"
},
{
"path": "_sass/bootstrap/_toasts.scss",
"chars": 1132,
"preview": ".toast {\n // Prevents from shrinking in IE11, when in a flex container\n // See https://github.com/twbs/bootstrap/issue"
},
{
"path": "_sass/bootstrap/_tooltip.scss",
"chars": 2512,
"preview": "// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n"
},
{
"path": "_sass/bootstrap/_transitions.scss",
"chars": 261,
"preview": ".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n "
},
{
"path": "_sass/bootstrap/_type.scss",
"chars": 2222,
"preview": "// stylelint-disable selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, ."
},
{
"path": "_sass/bootstrap/_utilities.scss",
"chars": 536,
"preview": "@import \"utilities/align\";\n@import \"utilities/background\";\n@import \"utilities/borders\";\n@import \"utilities/clearfix\";\n@i"
},
{
"path": "_sass/bootstrap/_variables.scss",
"chars": 48498,
"preview": "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $n"
},
{
"path": "_sass/bootstrap/bootstrap-grid.scss",
"chars": 598,
"preview": "/*!\n * Bootstrap Grid v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-"
},
{
"path": "_sass/bootstrap/bootstrap-reboot.scss",
"chars": 409,
"preview": "/*!\n * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 201"
},
{
"path": "_sass/bootstrap/bootstrap.scss",
"chars": 918,
"preview": "/*!\n * Bootstrap v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 "
},
{
"path": "_sass/bootstrap/mixins/_alert.scss",
"chars": 242,
"preview": "@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-colo"
},
{
"path": "_sass/bootstrap/mixins/_background-variant.scss",
"chars": 695,
"preview": "// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color, $ignore-war"
},
{
"path": "_sass/bootstrap/mixins/_badge.scss",
"chars": 320,
"preview": "@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-foc"
},
{
"path": "_sass/bootstrap/mixins/_border-radius.scss",
"chars": 1828,
"preview": "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative value"
},
{
"path": "_sass/bootstrap/mixins/_box-shadow.scss",
"chars": 532,
"preview": "@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @if (length($shadow) == 1) {\n // We c"
},
{
"path": "_sass/bootstrap/mixins/_breakpoints.scss",
"chars": 4482,
"preview": "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order f"
},
{
"path": "_sass/bootstrap/mixins/_buttons.scss",
"chars": 3525,
"preview": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for"
},
{
"path": "_sass/bootstrap/mixins/_caret.scss",
"chars": 1422,
"preview": "@mixin caret-down() {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom:"
},
{
"path": "_sass/bootstrap/mixins/_clearfix.scss",
"chars": 93,
"preview": "@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n"
},
{
"path": "_sass/bootstrap/mixins/_deprecate.scss",
"chars": 613,
"preview": "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a"
},
{
"path": "_sass/bootstrap/mixins/_float.scss",
"chars": 392,
"preview": "// stylelint-disable declaration-no-important\n\n@mixin float-left() {\n float: left !important;\n @include deprecate(\"The"
},
{
"path": "_sass/bootstrap/mixins/_forms.scss",
"chars": 5324,
"preview": "// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which"
},
{
"path": "_sass/bootstrap/mixins/_gradients.scss",
"chars": 2050,
"preview": "// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix("
},
{
"path": "_sass/bootstrap/mixins/_grid-framework.scss",
"chars": 2087,
"preview": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any va"
},
{
"path": "_sass/bootstrap/mixins/_grid.scss",
"chars": 2045,
"preview": "/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-wid"
},
{
"path": "_sass/bootstrap/mixins/_hover.scss",
"chars": 757,
"preview": "// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained d"
},
{
"path": "_sass/bootstrap/mixins/_image.scss",
"chars": 1155,
"preview": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the "
},
{
"path": "_sass/bootstrap/mixins/_list-group.scss",
"chars": 433,
"preview": "// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: "
},
{
"path": "_sass/bootstrap/mixins/_lists.scss",
"chars": 170,
"preview": "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unst"
},
{
"path": "_sass/bootstrap/mixins/_nav-divider.scss",
"chars": 369,
"preview": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-"
},
{
"path": "_sass/bootstrap/mixins/_pagination.scss",
"chars": 462,
"preview": "// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {"
},
{
"path": "_sass/bootstrap/mixins/_reset-text.scss",
"chars": 481,
"preview": "@mixin reset-text() {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font"
},
{
"path": "_sass/bootstrap/mixins/_resize.scss",
"chars": 202,
"preview": "// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflo"
},
{
"path": "_sass/bootstrap/mixins/_screen-reader.scss",
"chars": 826,
"preview": "// Only display content to screen readers\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n/"
},
{
"path": "_sass/bootstrap/mixins/_size.scss",
"chars": 148,
"preview": "// Sizing shortcuts\n\n@mixin size($width, $height: $width) {\n width: $width;\n height: $height;\n @include deprecate(\"`s"
},
{
"path": "_sass/bootstrap/mixins/_table-row.scss",
"chars": 794,
"preview": "// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to overrid"
},
{
"path": "_sass/bootstrap/mixins/_text-emphasis.scss",
"chars": 474,
"preview": "// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color, $ignore-warn"
},
{
"path": "_sass/bootstrap/mixins/_text-hide.scss",
"chars": 326,
"preview": "// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-miss"
},
{
"path": "_sass/bootstrap/mixins/_text-truncate.scss",
"chars": 168,
"preview": "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n te"
},
{
"path": "_sass/bootstrap/mixins/_transition.scss",
"chars": 681,
"preview": "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $"
},
{
"path": "_sass/bootstrap/mixins/_visibility.scss",
"chars": 189,
"preview": "// stylelint-disable declaration-no-important\n\n// Visibility\n\n@mixin invisible($visibility) {\n visibility: $visibility "
},
{
"path": "_sass/bootstrap/utilities/_align.scss",
"chars": 420,
"preview": "// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser de"
},
{
"path": "_sass/bootstrap/utilities/_background.scss",
"chars": 355,
"preview": "// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$col"
},
{
"path": "_sass/bootstrap/utilities/_borders.scss",
"chars": 1771,
"preview": "// stylelint-disable property-disallowed-list, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $bor"
},
{
"path": "_sass/bootstrap/utilities/_clearfix.scss",
"chars": 37,
"preview": ".clearfix {\n @include clearfix();\n}\n"
},
{
"path": "_sass/bootstrap/utilities/_display.scss",
"chars": 519,
"preview": "// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-"
},
{
"path": "_sass/bootstrap/utilities/_embed.scss",
"chars": 846,
"preview": "// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n "
},
{
"path": "_sass/bootstrap/utilities/_flex.scss",
"chars": 2769,
"preview": "// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment optio"
},
{
"path": "_sass/bootstrap/utilities/_float.scss",
"chars": 376,
"preview": "// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-break"
},
{
"path": "_sass/bootstrap/utilities/_interactions.scss",
"chars": 142,
"preview": "// stylelint-disable declaration-no-important\n\n@each $value in $user-selects {\n .user-select-#{$value} { user-select: $"
},
{
"path": "_sass/bootstrap/utilities/_overflow.scss",
"chars": 133,
"preview": "// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !im"
},
{
"path": "_sass/bootstrap/utilities/_position.scss",
"chars": 484,
"preview": "// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position}"
},
{
"path": "_sass/bootstrap/utilities/_screenreaders.scss",
"chars": 115,
"preview": "//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n"
},
{
"path": "_sass/bootstrap/utilities/_shadows.scss",
"chars": 249,
"preview": "// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shado"
},
{
"path": "_sass/bootstrap/utilities/_sizing.scss",
"chars": 498,
"preview": "// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @e"
},
{
"path": "_sass/bootstrap/utilities/_spacing.scss",
"chars": 2101,
"preview": "// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {"
},
{
"path": "_sass/bootstrap/utilities/_stretched-link.scss",
"chars": 431,
"preview": "//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;"
},
{
"path": "_sass/bootstrap/utilities/_text.scss",
"chars": 2106,
"preview": "// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !imp"
},
{
"path": "_sass/bootstrap/utilities/_visibility.scss",
"chars": 174,
"preview": "// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !importan"
},
{
"path": "_sass/bootstrap-4-jekyll/_bootstrap-4-jekyll.scss",
"chars": 164,
"preview": "// Some CSS to ease the integration between Jekyll and Bootstrap 4.\n// It is not recommended to edit this file.\n\n.page-c"
},
{
"path": "announcements.md",
"chars": 2297,
"preview": "---\nlayout: page\ntitle: Announcements \n---\n\n# Hacky Holidays 2021!\n\n\nThe Grinch h"
},
{
"path": "assets/css/main.scss",
"chars": 276,
"preview": "---\n# Only the main Sass file needs front matter (the dashes are enough)\n---\n\n@import \"bootstrap/functions\";\n@import \"va"
},
{
"path": "assets/javascript/bootstrap/__DO_NOT_MODIFY",
"chars": 0,
"preview": ""
},
{
"path": "assets/javascript/dark-mode.js",
"chars": 738,
"preview": "$(document).ready(function() {\n var darkModeOff = localStorage.getItem('darkModeOff');\n\n var toggleDarkMode = function"
},
{
"path": "conferences/hacktivitycon2020/0tomvh.md",
"chars": 1063,
"preview": "---\nlayout: page\ntitle: How I got from 0 to MVH\nvideo_src: https://www.youtube-nocookie.com/embed/M48hOtExUII\n---\n\nAbout"
},
{
"path": "conferences/hacktivitycon2020/beyondscope.md",
"chars": 1233,
"preview": "---\nlayout: page\ntitle: Beyond the Borders of Scope\nvideo_src: https://www.youtube-nocookie.com/embed/ZV7Xz8p12fo\n---\n\nS"
},
{
"path": "conferences/hacktivitycon2020/burnouts.md",
"chars": 1124,
"preview": "---\nlayout: page\ntitle: How to Deal with Burnouts\nvideo_src: https://www.youtube-nocookie.com/embed/I6eUy4XIYrY\n---\n\nAbo"
},
{
"path": "conferences/hacktivitycon2020/carivi.md",
"chars": 592,
"preview": "---\nlayout: page\ntitle: From an 'IVI in a box' to a 'CAR in a box'\nvideo_src: https://www.youtube-nocookie.com/embed/e_7"
},
{
"path": "conferences/hacktivitycon2020/codeql.md",
"chars": 986,
"preview": "---\nlayout: page\ntitle: Discover vulnerabilities with CodeQL\nvideo_src: https://www.youtube-nocookie.com/embed/NygVkQKmG"
},
{
"path": "conferences/hacktivitycon2020/exploiting_email_systems.md",
"chars": 1013,
"preview": "---\nlayout: page\ntitle: You've Got Pwned\nsubtitle: Exploiting E-mail Systems\nvideo_src: https://www.youtube-nocookie.com"
},
{
"path": "conferences/hacktivitycon2020/gitlab.md",
"chars": 645,
"preview": "---\nlayout: page\ntitle: The journey of finding and exploiting a bug in GitLab\nvideo_src: https://www.youtube-nocookie.co"
},
{
"path": "conferences/hacktivitycon2020/grafanassrf.md",
"chars": 2044,
"preview": "---\nlayout: page\ntitle: Graphing Out Internal Networks with CVE-2020-13379 (Unauthed Grafana SSRF)\nvideo_src: https://w"
},
{
"path": "conferences/hacktivitycon2020/keynote.md",
"chars": 1372,
"preview": "---\nlayout: page\ntitle: Keynote\nvideo_src: https://www.youtube-nocookie.com/embed/F_W3mV-EC9w\n---\n\nAbout the Speaker \n"
},
{
"path": "conferences/hacktivitycon2020/offsec_panel.md",
"chars": 566,
"preview": "---\nlayout: page\ntitle: Breaking Down Offensive Security Certifications\nvideo_src: \n---\n\nPanelists\n-----------------\n- B"
},
{
"path": "conferences/hacktivitycon2020/parse.md",
"chars": 1631,
"preview": "---\nlayout: page\ntitle: The problem with Parse\nsubtitle: A low-code server that endangers over 64,000,000 users\nvideo_s"
},
{
"path": "conferences/hacktivitycon2020/pentester_blueprint.md",
"chars": 1603,
"preview": "---\nlayout: page\ntitle: The Pentester Blueprint\nsubtitle: A Guide to Becoming a Pentester\nvideo_src: https://www.youtube"
},
{
"path": "conferences/hacktivitycon2020/penteststories.md",
"chars": 1571,
"preview": "---\nlayout: page\ntitle: Pentest Story Time\nsubtitle: My Favorite Hacks From the Past Year\nvideo_src: https://www.youtub"
},
{
"path": "conferences/hacktivitycon2020/tbhm.md",
"chars": 1450,
"preview": "---\nlayout: page\ntitle: The Bug Hunter's Methodology v4\nsubtitle: Recon Edition\nvideo_src: https://www.youtube-nocookie"
},
{
"path": "conferences/hacktivitycon2020/waf.md",
"chars": 1084,
"preview": "---\nlayout: page\ntitle: WAF Bypass In Depth\nvideo_src: https://www.youtube-nocookie.com/embed/zhkCf8tldbk\n---\n\nAbout the"
},
{
"path": "conferences/hacktivitycon2020/web_cache_deception.md",
"chars": 3232,
"preview": "---\nlayout: page\ntitle: Cached and Confused\nsubtitle: Web Cache Deception in the Wild\nvideo_src: https://www.youtube-noc"
},
{
"path": "conferences/hacktivitycon2021/bugbountyfor5years.md",
"chars": 1387,
"preview": "---\nlayout: page\ntitle: Hacking on Bug Bounties for Five Years\nvideo_src: https://www.youtube-nocookie.com/embed/iG7-c0Y"
},
{
"path": "conferences/hacktivitycon2021/ctfdev.md",
"chars": 1102,
"preview": "---\nlayout: page\ntitle: Developing CTFs\nsubtitle: Writing and hosting intentionally vulnerable applications\nvideo_src: h"
},
{
"path": "conferences/hacktivitycon2021/haptyc.md",
"chars": 1825,
"preview": "---\nlayout: page\ntitle: Haptyc\nsubtitle: A Library for Building Microfuzzers in Turbo Intruder\nvideo_src: https://www.yo"
},
{
"path": "conferences/hacktivitycon2021/infosec_insecure_risky.md",
"chars": 1757,
"preview": "---\nlayout: page\ntitle: InfoSec - A broken industry that keeps it insecure and risky\nvideo_src: https://www.youtube-noco"
},
{
"path": "conferences/hacktivitycon2021/keynote.md",
"chars": 980,
"preview": "---\nlayout: page\ntitle: Launching an InfoSec Career\nvideo_src: https://www.youtube-nocookie.com/embed/Rwkx8yzY6IU\n---\n\n\n"
},
{
"path": "conferences/hacktivitycon2021/networking_security_tiktok.md",
"chars": 900,
"preview": "---\nlayout: page\ntitle: Introducing Networking and Security through TikTok\nvideo_src: https://www.youtube-nocookie.com/e"
},
{
"path": "conferences/hacktivitycon2021/offsec_panel.md",
"chars": 604,
"preview": "---\nlayout: page\ntitle: Breaking Down Offsec Certifications\nvideo_src: https://www.youtube-nocookie.com/embed/Ir1CIn393U"
},
{
"path": "conferences/hacktivitycon2021/trufflehog.md",
"chars": 735,
"preview": "---\nlayout: page\ntitle: TruffleHog Chrome Extension\nsubtitle: Open CORS in SAAS API's lead to leaky keys on web pages\nvi"
},
{
"path": "conferences/hacktivitycon2021/vulnerability_research.md",
"chars": 1376,
"preview": "---\nlayout: page\ntitle: All Your (Data)base Are Belong To Us\nsubtitle: Getting Started in Vulnerability Research with Co"
},
{
"path": "discord.html",
"chars": 193,
"preview": "<meta http-equiv=\"refresh\" content=\"0; URL='https://discord.gg/32ZNZVN'\" />\nRedirecting to Discord. If you're not automa"
},
{
"path": "index.md",
"chars": 1853,
"preview": "---\nlayout: default\ntitle: Home\n---\n\n<div class=\"container\">\n <div class=\"row\">\n <div class=\"col-md-6 py-4 align-sel"
},
{
"path": "playlists/burp_suite.md",
"chars": 600,
"preview": "---\nlayout: page\ntitle: Burp Suite Playlist\nvideo_src: https://www.youtube-nocookie.com/embed/videoseries?list=PLxhvVyxY"
},
{
"path": "playlists/cryptography.md",
"chars": 545,
"preview": "---\nlayout: page\ntitle: Cryptography Playlist\nvideo_src: https://www.youtube-nocookie.com/embed/videoseries?list=PLxhvVy"
},
{
"path": "playlists/hacktivitycon.md",
"chars": 2639,
"preview": "---\nlayout: page\ntitle: h@cktivitycon\n---\n\nh@cktivitycon is a HackerOne hosted hacker conference built by the community "
},
{
"path": "playlists/mentorshipmondays.md",
"chars": 1722,
"preview": "---\nlayout: page\ntitle: Mentorship Mondays\nsidebar:\n - title: \"Season 01\"\n links:\n - text: \"Introducing 2021 Ha"
},
{
"path": "playlists/misc.md",
"chars": 362,
"preview": "---\nlayout: page\ntitle: Miscellaneous Playlist\n---\n\nIn this playlist we cover a number of different topics that didn't m"
},
{
"path": "playlists/mobile_hacking.md",
"chars": 2182,
"preview": "---\nlayout: page\ntitle: Mobile Hacking\n---\n\nThis learning track is dedicated to learning the most popular mobile vulnera"
},
{
"path": "playlists/newcomers.md",
"chars": 525,
"preview": "---\nlayout: page\ntitle: Newcomers Playlist\nvideo_src: https://www.youtube-nocookie.com/embed/videoseries?list=PLxhvVyxYR"
},
{
"path": "playlists/pentesting_series.md",
"chars": 800,
"preview": "---\nlayout: page\ntitle: Pentesting Basics\nredirect_from:\n - /playlists/pentesting_basics\n---\n\nIn collaboration with [@t"
},
{
"path": "playlists/playlists.html",
"chars": 362,
"preview": "---\nlayout: page\ntitle: Playlists\npermalink: /playlists/\n---\n\n{% for child_page in site.pages %}\n {% assign target_di"
},
{
"path": "playlists/web_hacking.md",
"chars": 901,
"preview": "---\nlayout: page\ntitle: Web Hacking\n---\n\nThis learning track is dedicated to learning the most popular web application v"
},
{
"path": "resources/articles/asking_for_help.md",
"chars": 6024,
"preview": "---\nlayout: page\ntitle: How and When to Ask for More Help\nsidebar:\n - title: Suggested Articles\n links:\n - text"
},
{
"path": "resources/articles/code_of_conduct.md",
"chars": 6426,
"preview": "---\nlayout: page\ntitle: Understanding the HackerOne Code of Conduct\nsidebar:\n - title: Suggested Articles\n links:\n "
},
{
"path": "resources/articles/writing_a_report_and_cvss.md",
"chars": 15449,
"preview": "---\nlayout: page\ntitle: How to Write a Good Report and Use the CVSS Calculator\nsidebar:\n - title: Examples of Good Repo"
},
{
"path": "resources/hackerone_threat_model.md",
"chars": 1402,
"preview": "---\nlayout: page\ntitle: Example HackerOne Threat Model\n---\n\nAccess levels:\n\n- Unauthenticated\n\nEntrypoints [non-static]:"
},
{
"path": "resources.md",
"chars": 234,
"preview": "---\nlayout: page\ntitle: Resources\nsidebar:\n - title: Jump to\n resources: true\n---\n\n{% for resource in site.resources"
},
{
"path": "sessions/android/common_android_bugs_1.md",
"chars": 585,
"preview": "---\nlayout: page\ntitle: Common Android Bugs (Part 1)\nvideo_src: https://www.youtube-nocookie.com/embed/sQ_34dI_geU\nprevi"
},
{
"path": "sessions/android/common_android_bugs_2.md",
"chars": 550,
"preview": "---\nlayout: page\ntitle: Common Android Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/tt1f4pcI0jo\nprevious_url: "
},
{
"path": "sessions/android/hacking_workshop_b3nac.md",
"chars": 495,
"preview": "---\nlayout: page\ntitle: Android Hacking Workshop by b3nac\nvideo_src: https://www.youtube-nocookie.com/embed/lhRXV9LZ7bY\n"
},
{
"path": "sessions/android/quickstart.md",
"chars": 1515,
"preview": "---\nlayout: page\ntitle: Android Quickstart\nvideo_src: https://www.youtube-nocookie.com/embed/y0O3sCX9ftM\nprevious_url: ."
},
{
"path": "sessions/burp101.md",
"chars": 918,
"preview": "---\nlayout: page\ntitle: Burp 101\nsubtitle: Getting Started\nvideo_src: https://www.youtube-nocookie.com/embed/LSqC9qgEMi0"
},
{
"path": "sessions/burp201.md",
"chars": 806,
"preview": "---\nlayout: page\ntitle: Burp 201\nsubtitle: Maximizing Burp\nvideo_src: https://www.youtube-nocookie.com/embed/bHTxJIC_jGI"
},
{
"path": "sessions/burp301.md",
"chars": 720,
"preview": "---\nlayout: page\ntitle: Burp 301\nsubtitle: Burp Hacks for Bounty Hunters\nvideo_src: https://www.youtube-nocookie.com/emb"
},
{
"path": "sessions/clickjacking.md",
"chars": 336,
"preview": "---\nlayout: page\ntitle: Clickjacking\nvideo_src: https://www.youtube-nocookie.com/embed/jcp5t8PsMsY\n---\n\nIn this session "
},
{
"path": "sessions/cookie_tampering.md",
"chars": 379,
"preview": "---\nlayout: page\ntitle: Cookie Tampering Techniques\nvideo_src: https://www.youtube-nocookie.com/embed/rH61-9ovYd4\n---\n\nI"
},
{
"path": "sessions/crypto_attacks.md",
"chars": 448,
"preview": "---\nlayout: page\ntitle: Crypto Attacks\nvideo_src: https://www.youtube-nocookie.com/embed/jtcpREJLN1Y\n---\n\nThis is the se"
},
{
"path": "sessions/crypto_crash_course.md",
"chars": 574,
"preview": "---\nlayout: page\ntitle: Crypto Crash Course\nvideo_src: https://www.youtube-nocookie.com/embed/NTpzmPML42E\n---\n\nThis is t"
},
{
"path": "sessions/crypto_wrap_up.md",
"chars": 592,
"preview": "---\nlayout: page\ntitle: Crypto Wrap-Up\nvideo_src: https://www.youtube-nocookie.com/embed/Zj6Z4QMzObE\nredirect_from:\n - "
},
{
"path": "sessions/docker_hacking.md",
"chars": 711,
"preview": "---\nlayout: page\ntitle: Docker Hacking \nvideo_src: https://www.youtube-nocookie.com/embed/XiLfEU9wK-w\n---\n\nAbout This Vi"
},
{
"path": "sessions/file_inclusion.md",
"chars": 341,
"preview": "---\nlayout: page\ntitle: File Inclusion Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/ehp9TdmXWr0\n---\n\nIn this s"
},
{
"path": "sessions/file_uploads.md",
"chars": 392,
"preview": "---\nlayout: page\ntitle: File Upload Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/xpCLMz3efUw\n---\n\nIn this sess"
},
{
"path": "sessions/good_reports.md",
"chars": 387,
"preview": "---\nlayout: page\ntitle: Writing Good Reports\nvideo_src: https://www.youtube-nocookie.com/embed/z60CFFFyZWE\n---\n\nIn this "
},
{
"path": "sessions/iOS/app_transport.md",
"chars": 651,
"preview": "---\nlayout: page\ntitle: iOS Hacking - App Transport Basics\nvideo_src: https://www.youtube-nocookie.com/embed/-TMHx-LLOGE"
},
{
"path": "sessions/iOS/application_basics.md",
"chars": 445,
"preview": "---\nlayout: page\ntitle: iOS Hacking - Application Basics\nvideo_src: https://www.youtube-nocookie.com/embed/VQTQ0VaIXF0\np"
},
{
"path": "sessions/iOS/filesystem.md",
"chars": 700,
"preview": "---\nlayout: page\ntitle: iOS Hacking - Filesystem Basics\nvideo_src: https://www.youtube-nocookie.com/embed/voYFTRoH4CU\npr"
},
{
"path": "sessions/iOS/interapp_communication.md",
"chars": 665,
"preview": "---\nlayout: page\ntitle: iOS Hacking - Inter-app Communication\nvideo_src: https://www.youtube-nocookie.com/embed/zld8Vuih"
},
{
"path": "sessions/iOS/ios_quickstart.md",
"chars": 1502,
"preview": "---\nlayout: page\ntitle: iOS Quickstart\nvideo_src: https://www.youtube-nocookie.com/embed/c4M8sd9lcFU\nprevious_url: ../an"
},
{
"path": "sessions/iOS/webviews.md",
"chars": 798,
"preview": "---\nlayout: page\ntitle: iOS Hacking - Webviews\nvideo_src: https://www.youtube-nocookie.com/embed/7Ozn9t7tp88\ncta_descrip"
},
{
"path": "sessions/introduction.md",
"chars": 641,
"preview": "---\nlayout: page\ntitle: Introduction\nvideo_src: https://www.youtube-nocookie.com/embed/zPYfT9azdK8\n---\n\nIn this session "
},
{
"path": "sessions/javascript_for_hackers.md",
"chars": 680,
"preview": "---\nlayout: page\ntitle: JavaScript for Hackers\nvideo_src: https://www.youtube-nocookie.com/embed/FTeE3OrTNoA\n---\n\nCheck "
},
{
"path": "sessions/mm/s01/ctf_vs_bugbounty.md",
"chars": 1114,
"preview": "---\nlayout: page\ntitle: CTF vs Bug Bounty \nsidebar:\n - title: \"Season 01\"\n links:\n - text: \"Introducing 2021 Ha"
},
{
"path": "sessions/mm/s01/h1-elite.md",
"chars": 1156,
"preview": "---\nlayout: page\ntitle: Introducing 2021 HackerOne Elite\nsidebar:\n - title: \"More from Season 01\"\n links:\n - te"
},
{
"path": "sessions/mm/s01/hackthegovt.md",
"chars": 1121,
"preview": "---\nlayout: page\ntitle: Hacking with the Government\nsidebar:\n - title: \"More from Season 01\"\n links:\n - text: \""
},
{
"path": "sessions/mm/s01/how_to_pentest.md",
"chars": 1215,
"preview": "---\nlayout: page\ntitle: Breaking Into Pentesting\nsidebar:\n - title: \"Season 01\"\n links:\n - text: \"Introducing 2"
}
]
// ... and 46 more files (download for full content)
About this extraction
This page contains the full source code of the Hacker0x01/hacker101 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 246 files (14.8 MB), approximately 116.7k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.