diff --git a/.ai/skills/baseball-rules/SKILL.md b/.ai/skills/baseball-rules/SKILL.md new file mode 100644 index 0000000..cec2899 --- /dev/null +++ b/.ai/skills/baseball-rules/SKILL.md @@ -0,0 +1,149 @@ +--- +name: baseball-rules +description: Use this skill for baseball rules interpretations, rulebook citation work, cross-code comparisons, and local policy drafting that depends on baseball rulebooks stored locally in this repository. It covers Official Baseball Rules, NFHS baseball rules, American Legion Baseball senior rules, and NCAA baseball rules. +--- + +# Baseball Rules + +Use this skill when the answer depends on a governing baseball code, not just general baseball knowledge. + +## When To Use + +- Use this skill for eligibility, lineup, substitution, re-entry, batting out of order, protest, appeal, obstruction, interference, ejection, suspension, pitching, and game-administration questions. +- Use this skill when the user wants rulebook-backed answers, citations, or draft language grounded in an existing baseball code. +- Use this skill when writing local league policies that borrow from, override, or reconcile an existing ruleset. +- Use this skill when comparing how multiple baseball codes treat the same situation. + +## Rule Sets In Scope + +- `references/2026-official-baseball-rules.pdf`: Official Baseball Rules, used as the pro-style baseline unless local context says otherwise. +- `references/NFHS-Baseball-RB.pdf`: NFHS baseball rules for high-school play. +- `references/39ACY1225-Baseball-Rule-Book-Senior.pdf`: American Legion Baseball Rule Book, including senior baseball rules and Legion-specific administrative rules. +- `references/PRMBA_RulesBook.pdf`: NCAA baseball rules for college play. + +Do not merge these codes into one composite answer unless the user explicitly asks for a comparison. + +## Ruleset Selection + +Choose the governing source before answering. + +- If the user says MLB, professional, pro-style, or cites OBR rule numbers, start with Official Baseball Rules. +- If the user says high school, varsity, state association, or NFHS, use the NFHS book. +- If the user says college, NCAA, collegiate, or NCAA mechanics, use the NCAA book. +- If the user says American Legion, Legion, department tournament, roster certification, or Legion protest, use the American Legion rule book. +- If the user says local league, tournament, or house rules, determine whether the local rules adopt one of the base codes and then identify any local overrides. + +If the governing code is uncertain: + +- State the uncertainty explicitly. +- Give a conditional answer by ruleset when the likely codes differ in outcome. +- Avoid presenting one code as universal baseball law. + +## Source Handling + +Prefer local sources in `references/`. + +Use `mutool` to inspect PDFs without converting entire books unless needed. + +Examples: + +```bash +mutool draw -F txt -o - references/2026-official-baseball-rules.pdf 1 +mutool draw -F txt -o - references/NFHS-Baseball-RB.pdf 45 +``` + +For broader searching, extract text into a temporary file under `.ai/` and then search with `rg`. + +Example workflow: + +```bash +mkdir -p .ai/tmp +mutool draw -F txt -o .ai/tmp/obr.txt references/2026-official-baseball-rules.pdf +rg -n "batting out of order|appeal play|courtesy runner" .ai/tmp/obr.txt +``` + +Working rules for source use: + +- Read only the relevant book and section for the current question. +- Prefer rule text, definitions, and explicit penalties over memory. +- If the book has a table of contents, definitions, case plays, approved rulings, or comments, use those to narrow the search before reading widely. +- If a rulebook answer depends on a definition, cite both the operative rule and the definition when helpful. + +## Analysis Workflow + +1. Identify the governing ruleset. +2. Classify the question: + lineup/substitution, dead-ball/live-ball, timing play, force/tag, appeal/protest, equipment, eligibility, discipline, pitching, mercy/time limits, or administrative procedure. +3. Read the minimum rulebook text needed to answer the question. +4. Separate explicit rule text from interpretation. +5. Check for exceptions, penalties, and restart/resume mechanics. +6. If local rules are involved, state the base code first and then the local override. +7. If comparing rulesets, answer side-by-side instead of blending language. + +## Common Risk Areas + +Be careful in these categories because different codes often diverge: + +- Courtesy runners +- Re-entry and substitution rules +- Batting out of order +- Force-play slide / collision / interference rules +- Malicious contact / flagrant conduct terminology +- Pitching restrictions, visits, and batter minimums +- Protest rights and timing +- Appeal mechanics and live-ball versus dead-ball requirements +- Ejections, suspensions, and administrative penalties +- Game-ending procedures, run limits, time limits, and tie-game handling + +## Interpretation Rules + +- Treat the rulebook as controlling and your reasoning as secondary. +- Say when an answer is explicit in the book versus inferred from multiple sections. +- Do not overstate certainty when the text is ambiguous or fact-sensitive. +- Distinguish between playing rules and tournament or roster-administration rules. +- Distinguish between what is permitted, what is a violation, and what the penalty or remedy is. +- When the answer depends on timing, identify the trigger: + pitch, play, appeal, substitution, discovery, or protest timing. + +## Citation Style + +Keep citations precise and compact. + +- Prefer rule numbers, section names, or page numbers when available. +- Quote only the minimum text needed. +- If you cannot reliably identify a rule number from the extracted text, cite the rulebook and page or nearby heading instead of guessing. +- When comparing codes, give each citation next to its own conclusion. + +## Policy Drafting Guidance + +When using these books to draft local rules: + +- State the base code being adopted. +- List each intentional departure from that base code. +- Preserve terminology from the governing code unless the local rule deliberately redefines it. +- Avoid creating local rules that conflict with penalty enforcement or protest procedures unless the local league clearly intends that result. +- Flag places where a short local rule has hidden downstream effects, especially on substitutions, forfeits, eligibility, and discipline. + +## Output Patterns + +For a single-code interpretation, prefer: + +1. Governing ruleset. +2. Short answer. +3. Why, with concise rule support. +4. Citation. +5. Any material caveat, exception, or unresolved ambiguity. + +For a multi-code comparison, prefer: + +1. Brief statement of the issue. +2. One subsection per ruleset. +3. A short bottom-line comparison noting where the outcomes differ. + +## What Not To Do + +- Do not answer from memory when the local PDFs can be checked. +- Do not assume OBR controls amateur, school, college, or Legion play. +- Do not confuse NCAA with NFHS. +- Do not confuse playing rules with administrative tournament regulations. +- Do not claim a citation you have not actually verified in the source. diff --git a/.ai/skills/baseball-rules/references/2026-official-baseball-rules.pdf b/.ai/skills/baseball-rules/references/2026-official-baseball-rules.pdf new file mode 100644 index 0000000..d44e2fc Binary files /dev/null and b/.ai/skills/baseball-rules/references/2026-official-baseball-rules.pdf differ diff --git a/.ai/skills/baseball-rules/references/39ACY1225-Baseball-Rule-Book-Senior.pdf b/.ai/skills/baseball-rules/references/39ACY1225-Baseball-Rule-Book-Senior.pdf new file mode 100644 index 0000000..71e7cdd Binary files /dev/null and b/.ai/skills/baseball-rules/references/39ACY1225-Baseball-Rule-Book-Senior.pdf differ diff --git a/.ai/skills/baseball-rules/references/NFHS-Baseball-RB.pdf b/.ai/skills/baseball-rules/references/NFHS-Baseball-RB.pdf new file mode 100644 index 0000000..cb291f3 Binary files /dev/null and b/.ai/skills/baseball-rules/references/NFHS-Baseball-RB.pdf differ diff --git a/.ai/skills/baseball-rules/references/PRMBA_RulesBook.pdf b/.ai/skills/baseball-rules/references/PRMBA_RulesBook.pdf new file mode 100644 index 0000000..f4fa30f Binary files /dev/null and b/.ai/skills/baseball-rules/references/PRMBA_RulesBook.pdf differ diff --git a/.ai/skills/cmba-historical-bylaws/SKILL.md b/.ai/skills/cmba-historical-bylaws/SKILL.md new file mode 100644 index 0000000..8ef6b6f --- /dev/null +++ b/.ai/skills/cmba-historical-bylaws/SKILL.md @@ -0,0 +1,38 @@ +--- +name: cmba-historical-bylaws +description: Use when answering questions about historical CMBA constitution/bylaws text from this repository's git history. This skill restricts references to the approved historical sources only: the initial commit containing the 2016 constitution/bylaws content, plus the tagged releases 2022-01-09, 2023, and 2024. Do not use newer draft, rc, test, or other tags as authority. +--- + +# CMBA Historical Bylaws + +Use this skill when the user asks what the CMBA rules/bylaws said in a prior year, how language changed over time, or to quote or compare historical versions. + +## Approved sources + +Read [references/source-map.md](references/source-map.md) first. Treat its whitelist as authoritative. + +Only use these git refs as historical authority: + +- `1e16926c5f76989d8821dc3f2b0df0c1c500e8e9` for the imported 2016 constitution/bylaws text +- `refs/tags/2022-01-09` +- `refs/tags/2023` +- `refs/tags/2024` + +Do not cite or summarize newer tags such as `draft*`, `rc*`, `v2026*`, or similar release-prep tags. + +## Workflow + +1. Identify which approved version or comparison the user wants. +2. Use the path listed in `references/source-map.md` for that ref. +3. Prefer direct git reads over working tree files, for example: + - `git show refs/tags/2024:src/cmba-bylaws.md` + - `git show 1e16926c5f76989d8821dc3f2b0df0c1c500e8e9:content` +4. When comparing versions, use `git diff --word-diff=color -- ` and adjust paths if the file moved between refs. +5. In the answer, name the exact ref and the document path used. + +## Guardrails + +- Be explicit about dates and refs. The initial commit date is `2021-11-09`, but it imports the `2016` constitution/bylaws text. +- If a user asks for "latest" historical bylaws, interpret that as the latest approved historical tag: `refs/tags/2024`. +- If a request would rely on an unapproved newer tag, say that newer tags are drafts and are intentionally excluded from historical reference. +- If wording differs because of formatting or conversion, say so rather than claiming a substantive rule change. diff --git a/.ai/skills/cmba-historical-bylaws/references/source-map.md b/.ai/skills/cmba-historical-bylaws/references/source-map.md new file mode 100644 index 0000000..f77d11b --- /dev/null +++ b/.ai/skills/cmba-historical-bylaws/references/source-map.md @@ -0,0 +1,48 @@ +# Approved Historical Sources + +Use only these refs when answering historical CMBA constitution/bylaws questions. + +## Whitelist + +- `1e16926c5f76989d8821dc3f2b0df0c1c500e8e9` + - Commit date: `2021-11-09` + - Commit subject: `initial commit, 2016 constitution and bylaws` + - Historical meaning: imported 2016 constitution/bylaws text + - Content path: `content` +- `refs/tags/2022-01-09` + - Content path: `src/cmba-bylaws.md` +- `refs/tags/2023` + - Content path: `src/cmba-bylaws.md` +- `refs/tags/2024` + - Content path: `src/cmba-bylaws.md` + +## Non-authoritative refs + +Do not use these as historical authority: + +- `draft*` +- `rc*` +- `v2026*` +- `v2024` + +If a user asks about one of those refs, explain that they are draft or test-era refs and not approved for historical citation. + +## Useful commands + +Read a full version: + +```bash +git show refs/tags/2024:src/cmba-bylaws.md +git show refs/tags/2023:src/cmba-bylaws.md +git show refs/tags/2022-01-09:src/cmba-bylaws.md +git show 1e16926c5f76989d8821dc3f2b0df0c1c500e8e9:content +``` + +Compare approved versions: + +```bash +git diff --word-diff=color refs/tags/2023 refs/tags/2024 -- src/cmba-bylaws.md +git diff --word-diff=color refs/tags/2022-01-09 refs/tags/2023 -- src/cmba-bylaws.md +``` + +When comparing the imported 2016 text to later tagged versions, diff the extracted file contents rather than assuming the path is the same across refs. diff --git a/.ai/skills/example-sports-org-bylaws/SKILL.md b/.ai/skills/example-sports-org-bylaws/SKILL.md new file mode 100644 index 0000000..f95df34 --- /dev/null +++ b/.ai/skills/example-sports-org-bylaws/SKILL.md @@ -0,0 +1,82 @@ +--- +name: example-sports-org-bylaws +description: Use this skill when drafting or reviewing bylaws, constitutions, or governance provisions for sports organizations and you want to compare against local example documents for leagues, youth baseball organizations, or sport-specific associations stored in this repository. +--- + +# Sports Organization Bylaws Examples + +Use this skill when the task benefits from comparing governance language across existing sports-organization bylaws rather than drafting from scratch. + +## When To Use + +- Use this skill when drafting or revising bylaws, constitutions, or governance articles for a sports league, club, or association. +- Use this skill when the user wants example language for membership, board structure, meetings, officers, elections, discipline, dues, or dissolution provisions in a sports context. +- Use this skill when the draft needs operational articles that are common in sports organizations, such as eligibility, team structure, postseason rules, awards, or volunteer requirements. +- Use this skill when comparing how different sports organizations separate core governance from game- or league-administration rules. + +## Scope + +These are example documents, not governing authorities. + +- Use them as comparative models for structure, article sequencing, and clause options. +- Do not treat any one example as the default best practice for every organization. +- Where a task also depends on nonprofit corporate law or tax-exempt language, pair this skill with the local `nonprofit` skill and check the legal framework separately. + +## References + +- `references/chesapeake-msbl.md`: adult baseball league bylaws with nonprofit framing, board governance, dues, meetings, discipline, finances, all-star provisions, and postseason awards. +- `references/dartball.md`: church dartball league rules and governance mix, useful as an example of where sport operations and governance provisions are combined in one document. +- `references/little-league.md`: Little League local league constitution template with member classes, board composition, officer duties, compliance expectations, and strong youth-sports governance structure. + +Load only the reference file or files that match the organization's type and drafting need. + +## Selection Guidance + +- Start with `little-league.md` when the organization is youth-focused, volunteer-heavy, member-driven, or needs a formal board-and-officer constitution structure. +- Start with `chesapeake-msbl.md` when the organization is an adult amateur league and needs examples for dues, team participation, disciplinary authority, league operations, or baseball-specific administration. +- Read `dartball.md` when the organization blends league governance and sport rules in one document, or when you need a cautionary example of how those layers can become mixed together. + +## Workflow + +1. Identify the organization's type: + youth league, adult league, club, association, or faith/community-based sports organization. +2. Decide whether the task is about core governance, sport operations, or both. +3. Read the most relevant example document first instead of loading all examples. +4. Extract the useful structure and clause patterns, then rewrite them to fit the target organization. +5. Separate reusable governance concepts from sport-specific procedural rules unless the user explicitly wants them combined. +6. Normalize terminology, thresholds, officer titles, and article numbering so the final draft is internally consistent. + +## Drafting Rules + +- Treat examples as source material for adaptation, not copy-paste boilerplate. +- Distinguish governance provisions from playing rules, roster rules, award rules, and tournament procedures. +- If the target organization wants a clean bylaws document, move sport-specific competition rules into separate policies, league rules, or appendices. +- Keep membership, voting, board powers, officer duties, and amendment procedures coherent as a set. +- Remove organization-specific names, places, sport terms, thresholds, and compliance references that do not belong in the target draft. +- If using Little League-derived material, preserve only what fits the target organization's actual governing framework and external obligations. + +## Comparison Use Cases + +These references are especially useful for: + +- comparing member-based versus board-centric governance; +- choosing how much operational detail belongs in bylaws; +- drafting officer duty sections with enough specificity to be useful; +- modeling discipline, suspension, and removal procedures; and +- deciding whether financial controls such as dual signatures, budgets, and audits should appear in the bylaws. + +## Output Pattern + +For drafting support, prefer: + +1. the recommended model source or mix of sources; +2. the revised clause or article outline; +3. short notes explaining which example informed each major choice; and +4. any provisions that should be split into separate league rules instead of staying in the bylaws. + +## What Not To Do + +- Do not assume an example organization's governance model fits the user's organization unchanged. +- Do not copy sport-specific operating rules into a general bylaws draft unless that is intentional. +- Do not import organization-specific facts, placeholders, or external-regime requirements without confirming they apply. +- Do not confuse illustrative example language with legal requirements. diff --git a/.ai/skills/example-sports-org-bylaws/references/chesapeake-msbl.md b/.ai/skills/example-sports-org-bylaws/references/chesapeake-msbl.md new file mode 100644 index 0000000..c814afb --- /dev/null +++ b/.ai/skills/example-sports-org-bylaws/references/chesapeake-msbl.md @@ -0,0 +1,297 @@ +**BYLAWS OF CHESAPEAKE MEN'S SENIOR BASEBALL LEAGUE, INC.** + +# ARTICLE I -- ORGANIZATION + +## SECTION 1. INCORPORATION +Chesapeake Men's Senior Baseball League, Inc., herein called Chesapeake MSBL, is incorporated in the State of Maryland under Maryland non-profit corporation code to qualify as a tax-exempt organization, and shall be managed at all times in such a manner as to qualify the corporation for such exemption. + +## SECTION 2. PURPOSE +The purpose of Chesapeake MSBL shall include the following: +To provide an opportunity for all adults eligible for membership (as defined in Article II) to engage in the sport of baseball; To promote involvement in Men's Senior Baseball League (MSBL) and Men's Adult Baseball League (MABL) MSBL-MABL programs and provide an opportunity for members to compete in sanctioned baseball competitions; To provide training in physical fitness, good patterns of physical development, and proper conditioning habits; +To provide opportunities for social, emotional, educational and character development, and to encourage peer and family participation in team and community activities; +To promote the sport of baseball to the community; +To provide financial aid, in the form of educational scholarships, to individuals who qualify for assistance and; +To give back to our community in the form of charitable contributions to registered charities and other local organizations. + +## SECTION 3. MANAGEMENT +The Chesapeake MSBL shall be managed and directed by a board of directors, acting in accordance with these by-laws. + +# ARTICLE II -- MEMBERSHIP + +## SECTION 1. MEMBERSHIP +The benefits and services of Chesapeake MSBL shall be made available to any person who desires to participate in any program sponsored by Chesapeake MSBL and who is physically able to do so, subject to any limitations set forth elsewhere in these bylaws. Membership shall be contingent upon payment of such periodic registration fees and membership dues as the board of directors may from time to time determine. + +a. Active Member -- An active member shall be any person who is a registered member of Chesapeake MSBL whose fees and/or fee waivers are current and who is in good standing with the board of directors. +b. Division -- The Chesapeake MSBL shall establish Divisions comprising of members or teams within a specific age group and/or skill level. +c. Team -- A team participating in the Chesapeake MSBL shall have a minimum of 12 members. + +## SECTION 2. LIMITATION +Membership may not be limited in number and shall be open to anyone who qualifies under Article II, Section 1 unless space is not available due to a limit on the number of teams that can participate each year due to limitation of Chesapeake MSBL resources. + +## SECTION 3. VOTING +Each board member shall be entitled to one vote in the election of directors, amendment changes and any other matters brought before the board of directors by a majority vote of the board of directors as designated in these by-laws. Voting shall be limited to board members or their official designate. A designate may be submitted to Board with three days prior notice to Secretary (as defined in Article II, Section 1.a.). + +## SECTION 4. RIGHTS + +a. A member shall be entitled to participate in any activity sponsored by Chesapeake MSBL, with the exception of competitive and training opportunities which may be limited by the board of directors, the coaching staff, or the rules of baseball for reasons of age, achievement or ability to participate. +b. The property rights and interests of all members shall be equal on a per member basis. + +## SECTION 5. TERMINATION + +a. Baseball privileges and membership may be suspended if dues, fees, or other required documentation is not submitted to the Chesapeake MSBL by the deadline approved by the board of directors. The board of directors has the right to approve extensions in case of hardship. +b. A member may resign membership at any time by giving notice in writing to the board of directors or its designee provided all obligations to Chesapeake MSBL have been met in full. +c. The head coach of any Chesapeake MSBL team (a.k.a. manager) shall have the authority to expel from his team for disciplinary, unsportsmanlike, or insubordination reasons for any baseball player or assistant coach, from any practice, game or league-sponsored event. +d. The board of directors shall have the authority to expel from membership any member deemed to cause damage to the Chesapeake MSBL organization, or to the image of Chesapeake or the sport of baseball. Damage must be of a degree judged to be excessive beyond what is usual and too great to be reasonably endured, and, must in the judgment of the board, place the continued existence of Chesapeake in jeopardy. This authority is to be exercised only upon a vote of two-thirds (2/3) of the board. + +# ARTICLE III -- DUES, FEES AND ASSESSMENTS + +## SECTION 1. FISCAL YEAR +The fiscal year of Chesapeake MSBL shall be from January 1 to the following December 31. + +## SECTION 2. FEES +Fees shall be set and approved by the board of directors and shall not exceed that necessary to provide for the anticipated expenses of the organization. +a. Registration -- Registration for active members shall be assessed on a yearly basis. Reregistration will be required prior to re-activation of membership. +b. Changes in Fee Schedule -- The fee schedule may be changed at any time if approved by the board of directors, but shall not be changed retroactively. +c. Refunds -- There shall be no refund of fees or release of obligation to pay fees. +d. Service Requirement -- The board of directors may assess a service requirement consistent with the purposes of the club. + +# ARTICLE IV -- MEETINGS OF MEMBERS + +## SECTION 1. ANNUAL MEETING + +a. Time and Place -- The annual meeting of the members shall be held in February, unless otherwise approved by the board of directors, at such place and reasonable time within Anne Arundel County as the board of directors may designate. +b. Purpose -- The annual meeting shall be held for the purpose (of) presenting program goals, evaluations and long-range plans. +c. Notice of Meeting -- Notice of the meeting of members shall be given to each board member and team manager not less than ten (10) or more than forty-five (45) days prior to such meeting. Each team managers will be responsible for notifying members of his team. + +## SECTION 2. SPECIAL MEETINGS + +a. Call -- Special meetings of Chesapeake MSBL shall be held upon the call of the board of directors, and must be conducted within thirty (30) days upon notification to each active member family by the board of directors. +b. Time and Place -- Special meetings of Chesapeake MSBL shall be held at such reasonable time and place within Anne Arundel County or nearby areas as the board of directors may designate. +c. Purpose -- The purpose of any special meeting shall be stated in the notice of call, and no other business shall be transacted. +d. Notice of Meeting -- Written notice of the special meeting shall be given to each board member not less than ten (10) days or more than thirty (30) days prior to such meeting. + +## SECTION 3. QUORUM +The president or vice-president and a majority of board members shall constitute a quorum for the transaction of business. + +## SECTION 4. MEETING ORGANIZATION + +a. Presiding Officer -- The president of the board of directors shall preside at any meeting of members, and in his or her absence the vice-president of the board of directors shall preside.  If neither is present, the members present shall elect a presiding officer from among the members of the board of directors. +b. Secretary -- The secretary shall serve as secretary for the meeting, and in his or her absence, the presiding officer shall appoint an acting secretary. + +## SECTION 5. VOTING + +a. Decision -- The decision of a majority of the members voting shall be the decision of Chesapeake MSBL, unless otherwise established by the Articles of Incorporation, or these by-laws. +b. Method -- Voting may be viva-voce, but twenty-five (25) percent of board members in good standing shall have the right to demand voting by roll call. + +## SECTION 6. MINUTES OF MEETINGS +Minutes of each annual meeting and special meeting shall be made available to all board members as soon as possible but no later than with the notice of the next immediate annual or special meeting of board members. + +# ARTICLE V -- BOARD OF DIRECTORS + +## SECTION 1. BOARD COMPOSITION +The board shall be composed of the following voting members: executive committee (president, vice-president, secretary, and treasurer),  and two (2) Division Directors.  One will be the primary representative and the second will be an alternate that can step in if needed for each active Division within the Chesapeake MSBL.  Only one person from any particular family may serve as a member of the board of directors at any one time, unless otherwise approved by the board.  The voting quorum consists of the President, Vice President, Secretary and 3 division representatives (one for each age division, 21+, 35+ and 45+),   with the Treasurer serving as a tie breaker if necessary.  + +## SECTION 2. TERMS +Executive committee members shall be elected by the Board of Directors and serve until such time the executive committee member resigns in writing to the board of directors, a member of the league desires to run and is nominated for the position in which the board of directors must vote in with 2/3 majority, or death of the executive committee member.  Executive committee members can serve without term limits. + +## SECTION 3. ELECTION OF EXECUTIVE COMMITTEE MEMBERS + +a. Nominating Committee -- The nominating committee for replacement of Executive Committee members shall consist of all board members.      1. Nomination -- The candidates for the Executive Committee selected by the nominating committee shall be placed in nomination automatically at the annual meeting. +b. Election -- Voting may be viva-voce, but twenty-five (25) percent of board members in good standing shall have the right to demand voting by secret ballot. If secret ballot is used, each active board member shall have one vote, and shall vote for the appropriate number of nominees on one ballot. +c. Vacancies -- Should a vacancy occur on the board of directors for reasons other than normal expiration of term, the board of directors shall appoint a member to fill the unexpired term. + +## SECTION 4. REMOVAL OF DIRECTORS FROM OFFICE + +a. Missing two (2) meetings in a Fiscal Year or two (2) consecutive unexcused board meetings by a board member will be considered a resignation and the other board members may accept the resignation and appoint another board member to fill the unexpired term of such board member. +b. A director may be removed from the board for reasonable cause by majority vote of the board of directors. + +## SECTION 5. MEETINGS OF THE BOARD + +a. Time of Meeting -- Meetings of the board of directors shall be held at least quarterly, or at times set by the board, or on call of either the president or the majority of directors. +b. Notice -- Three (3) days notice, in person, by phone, e-mail or regular mail, shall be given to all directors of meetings called by the president or by the majority of the board. Notice of board meetings shall be conveyed to the board members by posting to the annual calendar and in any other appropriate manner as time permits. +c. Waiver of Notice -- Required notice shall be waived if all absent directors sign the minutes of the meeting or a separate waiver of notice, which shall become a part of the minutes.  Attendance at a meeting constitutes automatic waiver of notice. +d. Open Meetings -- All meetings of the board, except those executive sessions held for the purpose of contract negotiations, shall be open to any board member. A majority of the executive committee must approve attendance by any non-board members in advance. +e. Quorum -- The president or vice-president and a majority of board members shall constitute a quorum for the transaction of business. The act of a majority of directors present at a meeting at which a quorum is present shall be the act of the board. +f. Voting -- All matters coming before t¬se by-laws. + +# ARTICLE VI -- OFFICERS + +## SECTION 1. POWERS OF THE BOARD OF DIRECTORS +The board shall regulate and supervise the management and operation of the Chesapeake MSBL. It shall attend to all internal affairs of the Chesapeake MSBL and shall make such arrangements for conducting the business as it deems best. In addition to the power by these by-laws expressly conferred upon the board of directors, it may exercise all the powers of the corporation and all such lawful acts and things as are not by statute or by the charter or by these by-laws required to be done or exercised by the members. + +## SECTION 2. DUTIES OF THE BOARD OF DIRECTORS +The duties and powers of the board of directors shall be such as usually devolve upon the directors of any club or association and may include the selection of the place, fixing the date, and making all arrangements necessary for holding meetings of the Chesapeake MSBL and the publication of whatever data the directors deem essential to the benefit of the Chesapeake MSBL. The directors shall have the power to adopt rules and regulations, and to alter and amend the same from time to time, for the conduct of the business and activities of the Chesapeake MSBL. The board of directors shall have the authority to generally conduct the business and activities of the Chesapeake MSBL.  The board of directors shall have the authority to generally conduct all of the lawful affairs of the Chesapeake MSBL, including but not limited to, entering into any contracts, leases, or other agreements necessary to carry out the purposes of the Chesapeake MSBL. The directors shall exercise all the power of the Chesapeake MSBL as permitted by law, subject to the provision of the Articles of Incorporation and these by-laws. + +## SECTION 3. COMMITTEES OF THE BOARD OF DIRECTORS +The board of directors shall also have the authority to establish committees as may be necessary to further and promote the interests and activities of the Chesapeake MSBL. Such committees may be comprised of both directors and other active members. + +## SECTION 4. PRESIDENT +The president shall preside at all meetings of the membership and of the board of directors, shall perform such other duties as may be determined by the board of directors, and shall perform and discharge such other duties as generally devolve upon a chief executive officer. + +## SECTION 5. VICE-PRESIDENT +The vice-president shall perform all duties incumbent upon the president during the absence or disability of the president and perform such other duties as may be prescribed by the board of directors. + +## SECTION 6. SECRETARY +The Secretary shall have the custody and care of the corporate records of the Chesapeake MSBL, shall attend all meetings of the members and of the board of directors, shall keep a true and complete record of the proceedings of all such meetings, shall file and take charge of all papers and documents belonging to the Chesapeake MSBL, and shall perform such duties as may be prescribed by the board of directors. + +## SECTION 7. TREASURER +The treasurer shall keep or, at the discretion of the board cause to be kept, correct and complete records showing accurately at all times the financial condition of Chesapeake MSBL; shall be legal custodian of all monies and other valuables which may from time to time come into the possession of the Chesapeake MSBL; shall maintain a bank account in the name of Chesapeake MSBL; shall prepare and file or, at the discretion of the board, cause to be prepared and filed, all required corporation tax forms and reports; shall furnish at meetings of the board of directors and membership or whenever requested by the board of directors, a statement of the financial condition of the Chesapeake MSBL; shall maintain or, at the discretion of the board, cause to be maintained a roster of active members in good standing; and shall perform such other duties as the board of directors may prescribe. + +## SECTION 8. DIVISION REPRESENTATIVE +The division rep shall perform all duties assigned to them by the board of directors. They will serve as a liaison with the Board of Directors to express the wants and needs of each specific division.  They serve to conduct internal voting on topics pertaining to potential changes within their respective divisions and report results to the BOD for review and/or change approval.  Each age division will have one vote if required during league wide operations such as budget, capital expenditures, rules, etc.  + +If additional age divisions are created due to league reorganization or expansion in the future requiring an increase in representatives, the President and/or BOD retain the ability to nominate, assign and/or appoint additional board members to preserve the original voting integrity and balance intended for voting purposes. + +## SECTION 9. TRANSFER OF DUTIES +In case of the absence of any officer of the Chesapeake MSBL, or for any other reason that the board of directors may deem sufficient, the board of directors may delegate the powers or duties of such officer to any other director, for the time being, provided a majority of the board of directors concurs therein. + +# ARTICLE VII -- ACCOUNTING, BUDGET AND CONTRACTS + +## SECTION 1. CONTRACTS, CHECKS, NOTES, ETC. +All contracts and agreements authorized by the board of directors shall, unless otherwise directed by the board of directors, be signed by the president, or such other person as may be from time to time so authorized by the board of directors. All checks and drafts issued by the Chesapeake MSBL in the amount of five hundred dollars ($500.00) or more, will require two signatures and shall be signed by the president or treasurer, or such other person as may be from time to time authorized by the board of directors. Any check written for more than $7,500 shall require the vote of approval of a majority of the board of directors and must be signed by the president and treasurer. + +## SECTION 2. AUDITS + +a. Annual Audits -- The books of the corporation shall be closed on the last day of December of each year. Within 45 days of the end of each calendar year, the Executive Committee will audit the books. The audit shall encompass all assets of or under the control of the Chesapeake MSBL, with property valued at cost, depreciated value, or replacement cost, whichever is least. Separate "funds" shall have a separate accounting with the net gain or loss shown in the consolidated statement. +b. Special Audits -- An audit similar to the annual audit shall be prepared at any time the positions of president or treasurer are vacated before the end of their terms. + +## SECTION 3. BUDGET +A budget for the next fiscal year shall be prepared by the president and treasurer for presentation and approval of the board. The board shall present the approved budget for information to the membership. + +## SECTION 4. APPROVAL OF CONTRACTS +Contracts for coaching or administrative services shall require approval of two-thirds (2/3) of the board of directors. Contracts involving loans, leases, or other obligations of more than twelve (12) months shall require unanimous approval of the board of directors. + +# ARTICLE VIII -- NON-PROFIT ORGANIZATION + +## SECTION 1. COMPENSATION +The Chesapeake MSBL shall, at all times, be operated on a non-profit basis for the mutual benefit of its members. No dividends or other interests in the assets of the Chesapeake MSBL shall be paid by the Chesapeake MSBL to its members. No part of the earnings of the Chesapeake MSBL shall inure to the benefit of, or be distributed to, its members, officers, directors, or any other private persons, except that the Chesapeake MSBL shall be authorized and empowered to pay reasonable compensation for services rendered and expenses incurred and to make payments and distributions in full furtherance of the purposes set forth herein. + +## SECTION 2. TAX-EXEMPT STATUS +No substantial part of the activities of the Chesapeake MSBL shall be the carrying on of propaganda or other attempts to influence legislation, and the Chesapeake MSBL shall not participate in any political campaign on behalf of any candidate for public office. Notwithstanding any other provision of the Articles of Incorporation or these by-laws, the Chesapeake MSBL shall refrain from engaging in any other activities not permitted of any tax-exempt organization under Section 501 of the Internal Revenue Code. + +# ARTICLE IX -- BY-LAWS, RULES OF ORDER, AND INDEMNIFICATION OF DIRECTORS + +## SECTION 1. BY-LAWS +These by-laws succeed any and all previous by-laws and amendments thereto, which are declared null and void. + +## SECTION 2. AMENDMENTS +These by-laws may be amended by a majority of the board members present in person at any regular or special meeting provided that the proposed amendment has been submitted to the board members not less than (10) days prior to the meeting. In order to be submitted to the membership, the proposed amendment shall have been approved by the board of directors. + +## SECTION 3. INTERPRETATION +Any question as to the proper interpretation of these bylaws shall be determined by the board of directors. + +## SECTION 4. RULES OF ORDER +Roberts Revised Rules of Order shall be the parliamentary guide for all meetings of members and the board of directors, but shall not take precedence over these by-laws. + +## SECTION 5. INDEMNIFICATION +The Chesapeake MSBL shall indemnify and hold harmless any individuals against the expense of any action, suit or proceedings in which they are made a part by reason of being or having been a director, officer or duly authorized agent of the Chesapeake MSBL, except in relation as to matters to which they shall be adjudged in such action, suit or proceedings to be liable for gross negligence or willful misconduct in the performance of their duties. This right shall extend to all such persons, their successors, heirs and legal representatives. + +# ARTICLE X -- TERMINATION AND DISSOLUTION + +The Chesapeake MSBL may be terminated and dissolved upon the affirmative vote of at least two-thirds (2/3) of all board members entitled to vote. In the event of such termination, the board of directors shall, after paying or making provision for the payment of all liabilities of Chesapeake MSBL, disburse any remaining assets to a non-profit organization or organizations.  A majority of the Board of Directors shall determine these organizations. + +# ARTICLE XI--CHESAPEAKE MSBL ALL STAR TEAMS + +## SECTION 1. ELIGIBILITY CRITERIA + +a. The Player must be on the final roster of the team which he is representing and the player must be affiliated and in good standing with the Chesapeake MSBL. +b. The Player must have participated in at least 50% of the games played with the team he is representing in the Chesapeake MSBL. + +## SECTION 2. SELECTION PROCESS + +a. The Chesapeake MSBL All-Star Game Managers shall meet the same criteria as Article XI, Section 1. +b. The Chesapeake MSBL All-Star Game Managers shall be the Managers of teams who played in the previous season play-off Championship Game that meet Eligibility Criteria under Article XI, Section1. All Chesapeake MSBL Team Managers are encouraged and invited to participate in the event as base coaches, bench coaches, score keepers, etc. +c. A Chesapeake MSBL All-Star Game Selection Committee shall convene under Article 4, Section 2, to select Chesapeake MSBL All-Star Team roster(s) of not more than twenty-eight (28) players to represent the Chesapeake MSBL League in the All-Star game for a particular division. +d. If the Chesapeake MSBL All-Star Game Managers are not selected by the Chesapeake MSBL All-Star Game Committee, they are not eligible to participate in the game as a player in any capacity. + +## SECTION 3. PARTICIPATION + +a. A player representative meeting the criteria in Article XI, Section 1, from each Chesapeake MSBL League team in good standing will have representation on the Chesapeake MSBL All-Star Team. +b. If selected for the Chesapeake MSBL All-Star Team, the player may be required to pay a participation fee to offset expenses associated with the operation of the All-Star Game to the Chesapeake MSBL President or Treasurer ten (10) days before the scheduled All-Star Game.  Failure to provide payment by the deadline will result in forfeiture of participation and the next leading vote getter for the position vacated will be invited to fill the spot (provided the substitute player submits the participation fee). +c. Each player selected to represent the Chesapeake MSBL All-Star Team shall get at least one at-bat (AB) or one inning playing in the field. It is the responsibility of the Chesapeake MSBL All-Star Team Managers to ensure every player representing the Chesapeake MSBL participates in the All-Star Game. + +# ARTICLE XII -- POST SEASON AWARDS + +## SECTION 1. ELIGIBILITY CRITERIA + +a. The Manager/Player must be on the final roster of the Team which he is representing and the Manager/Player and Team must be affiliated and in good standing with the Chesapeake MSBL League. +b. The Player must have participated in at least 50% of the games played by the team he is representing in the Chesapeake MSBL League. +c. Umpires who have umpired at least ten (10) County Adult and/or Chesapeake MSBL Baseball Games are eligible for Chesapeake MSBL League Recognition. +d. Post Season Award Ceremony will take place as a General Membership Meeting upon conclusion of the baseball season at a date, time and location to be determined by the Chesapeake MSBL Executive Committee and Board of Directors. + +## SECTION 2. AWARD CATEGORIES + - At a minimum, Post-Season Awards will be established for the following categories for each Chesapeake MSBL Division (except Outstanding Umpire Award) and may be presented if such awards are deserved or warranted as determined by the Chesapeake MSBL Awards Committee: +a. Sportsmanship Award: Recognition of player and/or manager who consistently exhibits good sportsmanship and respect towards teammates, opponents, umpires, spectators, and representatives of the Anne Arundel County Department of Parks & Recreation before, after, and during competition. Players may be nominated by anyone in the league, including umpires, or other representatives of the Anne Arundel County Department of Parks & Recreation. +b. Chesapeake MSBL Service Award: Recognition of a Manager, Player, Umpire, Sponsor or other person who has volunteered significant time or made a significant contribution to improve the quality and visibility of the Chesapeake MSBL to the Community. +c. Outstanding Umpire Award: Recognition of one Umpire meeting the eligibility requirements in Article XII, Section 1, who receives the highest scores among Chesapeake MSBL Team feedback in areas of Umpiring Consistency, Game Control, Hustle, Attitude, and Respect towards Managers, Players, and Spectators. + +## SECTION 3. SELECTION PROCESS + - A Chesapeake MSBL Awards Committee, lead by the Chesapeake MSBL Executive Committee and Board of Directors, shall convene under Article 4, Section 2, to nominate and select category winners for Post-Season Awards. +a. Nominations for Sportsmanship Award candidates should be presented to the Chesapeake MSBL Post-Season Award Committee with written a recommendation for the person nominated with specific documented instances in which good sportsmanship was exhibited by the candidate. Only one person from each Division of the Chesapeake MSBL may receive this award. +b. Nominations for the Chesapeake MSBL Service Award candidates shall be presented to the Chesapeake MSBL Post-Season Award Committee with written a recommendation for the person nominated with specific documented instances in which he or she has made volunteered significant time or made a significant contribution to improve the quality and visibility of the Chesapeake MSBL to the Community. Only one person from each Division of the Chesapeake MSBL may receive this award. +c. Outstanding Umpires Award will be determined based on post-game feedback forms from team managers or representatives based upon Umpiring Consistency, Game Control, Hustle, Attitude, and Respect towards Managers, Players, and Spectators. Only one umpire may receive this award. + +# ARTICLE XIII -- CHESAPEAKE MSBL HALL OF FAME + +****Selection procedures for the CMSBL HOF was changed on January 24, 2023.  A new proposal was submitted and approved by unanimous BOD vote**** + +## SECTION 1. ELIGIBILITY CRITERIA + +a. Any Current Player, Manager, Umpire or League Sponsor who is currently affiliated and in good standing with the Chesapeake MSBL who has participated in the Chesapeake MSBL for ten (10) or more years and consistently demonstrates good sportsmanship, character and respect towards teammates, opponents, and umpires; competitive skill; and, provides unselfish devotion to the continuing improvement to the quality and experience of Amateur Adult Baseball within the Chesapeake MSBL and the community at large. + +## SECTION 2. NOMINATION PROCESS + +a. Former and Current Players, Managers, Umpires, or League Sponsors may be nominated by any member or organization affiliated with the Chesapeake MSBL. (See section 1.a) +b. Nominations should be submitted to the Chesapeake MSBL Hall-Of-Fame Chairman and the Executive Committee in writing describing the qualifications that warrant consideration for induction into the Chesapeake MSBL Hall of Fame. The nomination must include the name, team, primary position played, years affiliated with Chesapeake MSBL, stats (if available), accomplishments and other additional information related to community activities which may assist the Chesapeake MSBL Hall of Fame Selection Committee in reaching a decision for induction. +c. Nominations for annual induction must be submitted to the Chesapeake MSBL Executive Committee prior to July 1st for Chesapeake MSBL Hall of Fame induction consideration. This will allow the presentation of a HOF plaque to inductees on the field prior to the conclusion of the season. Each inductee will also receive a credit for a Chesapeake Hall of Fame Ring of their choosing. See Section 4.f. + +## SECTION 3. SELECTION PROCESS + +a. The Chesapeake MSBL Executive Committee and Board of Directors will select a Hall of Fame Chairman to convene Chesapeake MSBL Hall of Fame Selection Committee under Article 4, Section 2. +b. The CMSBL HOF Selection Committee will be selected by the HOF Chairman in conjunction with the Board of directors. It will be made up of 5 members, preferably at least 1 member from each age group, if possible. + +## SECTION 4. Hall of Fame Selection Process** + +a. In order for a member to be inducted into the Chesapeake MSBL Hall of Fame, the Chesapeake MSBL Hall of Fame Committee will conduct an in-person meeting to discuss the nomination and weigh each candidate's merits and to ensure there is a complete understanding of the metrics of the league scoring parameters. (Addendum A) After discussions have concluded the committee will proceed with a transparent vote on each nominee rating them on the enclosed scale for their accomplishments. Note: If a member of the Hall of Fame Committee cannot attend the vote meeting, a member of the Board of Directors will substitute and vote in their place. +b. Voting Score: Votes will be tabulated by the Chesapeake MSBL secretary and results will be revealed to the committee upon completion. Nominees, who achieve a minimum of 70% of the points (350 points) required for induction, as counted by the Secretary, will be inducted as members into the Chesapeake MSBL Hall of Fame. +c. Candidate Re-Review process: Any Candidate who receives a score between 60- 69% will be discussed and then a second vote will be conducted to ensure there is a proper understanding and review of the grading. +d. To ensure the credibility and integrity of the Chesapeake MSBL Hall of Fame is not compromised, marginalized, or undermined, no more than three (3) persons shall be inducted into the Chesapeake MSBL Hall of Fame in any given year unless it is determined by the HOF chairman that there are additional worthy candidates warranting consideration. +e. Special Circumstances exception appointment. The current League President, Board of Directors, and/or Hall of Fame Committee may induct a new Hall of Fame member without the normal nomination/voting process.  This could be an umpire, league sponsor, historical player, critically ill person, or post mortem of a former player/official that embodies the qualities and qualifications to warrant induction. +f. There is no annual minimum selection requirement for the Chesapeake MSBL Hall of Fame induction. +g. Expenses- League will provide a $300.00 stipend for the Hall of Fame Ring. Inductees are to contact Brian Sands at Recognition Concepts. sands@recognitionconcepts.com for sizing and  additional costs depending on the type of ring chosen. +Addendum A: Metrics for HOF Induction +1. Criteria +   1.    Playing ability 15% +   2.    Character 20% +   3.    Service to league 30% +   4.    Service to community 35% +Each Attribute for admission is assigned a Maximum point value 15, 20, 30, & 35 = 100 points +Define and examples of each. +   1.    (15 points) Playing Ability: Rate player in comparison to the best players in the league during their tenure. Self explanatory. +   2.    (20 points) Character: How do other players/ people in the league refer to said player? Is he well respected and do others think highly of them? Is he a respected team leader? What is the one word that best describes his character as a person? + 3.    (30 points) Service to the League: What has he done to benefit the league other than playing. Does he volunteer, or donate time? Does he participate in before and after team field activities on a regular basis? Does he go above and beyond just playing to make the league better? Do they work only for their team or the rest of the league? Do they hold a league position or volunteer to run specific league events? (Such as the league draft or HOF voting etc) Example: Managing a team is 5 points maximum. +   4.    (35 points) Service to the Community: We are looking for things where the nominee does acts to benefit others rather than for himself/herself, team or family. What does the player do to benefit the community? Do they volunteer their time to baseball and or other athletic/community organizations or projects? Example: Coaching your own child is 5 points. Being compensated in a paid coaching position also would count no more than 5 points. + +# ARTICLE XIV-- MISCELLANEOUS + +## SECTION 1. NOTIFICATION OF MEETINGS + +a. Notification Method -- Notification of meetings shall be made in writing via e-mail, phone, mail correspondence, or via notification on Chesapeake MSBL Website League News or Message Board. +b. Contact Information -- Board members are required to provide contact information to Chesapeake MSBL. Failure to do so would constitute a waiver of right to receive notice of any meetings. + +## SECTION 2. GOVERNANCE + +a. These bylaws are governed by the applicable laws of the State of Maryland.  The foregoing was adopted this 30th day of January, 2018, to be the Bylaws for Chesapeake Men's Senior Baseball League, Inc. + +By (Signatures on File in Corporate Records): + +**Alex Brunet, Chairman  ** +**Michael Largent, Vice-President** +**Joe DiMonda, Secretary** +**Wayne Vance, Treasurer ** +**Danny Tyler, Director-Field Maintenance** +**Ron Ebelein, Division Representative (45+)** +**Tom Finch, Division Representative (45+)** +**Jeff Wolf, Division Representative (35+)** +**Tim Biggs, Division Representative (21+)** +**Alan Kietz, Division Representative (21+)** diff --git a/.ai/skills/example-sports-org-bylaws/references/dartball.md b/.ai/skills/example-sports-org-bylaws/references/dartball.md new file mode 100644 index 0000000..55d6f27 --- /dev/null +++ b/.ai/skills/example-sports-org-bylaws/references/dartball.md @@ -0,0 +1,95 @@ +Lockport Church Dartball League +*Amended April 2011, August 2013, August 2014 + +Bi-laws + +# Article I: Dartboard and Dart Information + +## Section 1: Dartboard Regulations +The fundamental dartboard is a square piece of 1/4” thick dense fiberboard measuring 48” by 48”. To provide rigidity, this board requires backer plywood to be either glued or stapled to its back. The bottom of the board should be positioned 24” from the floor, placing the board’s center at 48” from the floor. The board is printed with seven distinct bright colors and displays various elements of a baseball game, including first base, second base, third base, home run, strike, ball, out, foul, double play, and sacrifice hit. The board is wired, allowing players to determine how to score their darts. Wires are run between each distinct spot on the board. For instance, if a dart lands precisely between the first base box and the out, the player can determine whether it should be scored as a hit or an out by observing which side of the wire the dart has landed on. These wires effectively act as the umpire. Host teams have the option of using the “tilt board setup method,” which is popular among other dartball leagues. + +## Section 2: Pitching Line + +The pitching of the darts shall be 20' from the base of the board to front edge of pitching line. The preferred pitching line shall be 6 long and 2" wide directly in front of board and adhered to the floor. The batters foot may be on the pitching line up to the very front edge without penalty. If he oversteps the line, a warning should be issued by any player. Continued overstepping the line will result in the batter being called out. + +## Section 3: Dartboard Information + +These boards are available through the league or from the supplier, Davis manufacturing at www.dartballusa.com + +## Section 4: Dart Information + +All darts must be thrown underhand. Apex #2 three feathered darts are the only darts approved for play. Loading or modifications of darts is prohibited. + +# Article II: Playing Regulations + +## Section 1: John Doe + +A. Regular Season +A team is required to have seven players as the minimum during the regular season, with no maximum amount of players. If a team does not have seven players, John Doe [s] must be added to bring the team to the required minimum of seven players. No more than four John Does are recommended, but the teanm captain can decide either to play or forfeit the evening's games if they have less than four players. Each John Doe counts as an out as it comes up in the batting order. Women will be allowed to play in place of a John Doe if a team is short but only during regular season games. John Doe[s] can be present anywhere in the batting order. When a late player arrives, his name can be inserted in place of a John Doe or at the end of the line up. Lineups may be changed at the beginning of each game. Any team may postpone or reschedule a game night as long as it is agreeable between both captains and every effort is made to make up the games in the same half as the occurrence. +B. Postseason (Bezold and Championship Games) +Same rules apply from the Regular Season except a team must have a minimum of eight players. +C. Tournament +Same rules apply from the Regular Season except a team must have a minimum of nine players. + +## Section 2: Batting out of Turn +Any player batting out of turn (A dart must be thrown] will be called out. Any hit or subsequent runs do not count. Any skipped batter can then continue with his turn. The out of turn batter then loses his next turn with no penalty whether it is in the same inning or the next. + +## Section 3: Throwing Darts +Any darts sticking for 3 seconds or more is considered a live dart. Umpires must call out each dart's disposition and keep the thrower aware of his count [balls and strikes]. Darts will be used to indicate base runners and placed on the board near the represented base. The batter is automatically out if the dart fails to hit the board or hits any other object in flight before hitting the board. Dropping of darts at the throwing line is not considered a penalty. If a dart falls to the floor immediately [or within 3 seconds] after striking the board It shall be ruled a dead dart with no penalty to the thrower. If a dart is thrown into a board in such a way that the wire dividers cannot be used to determine the call, then the dart shall be considered a dead dart with no penalty to the thrower. If a thrown dart sticks into the body of another dart already in the board, the last thrown dart shall be ruled a dead dart with no penalty to the thrower. Darts shall be removed from the board only when the thrower completes his time at bat. The dart shaft must be completely encircled by green board to be considered a foul ball, otherwise it is a "woody". If a dart hits any board mounting hardware, and fails to stick, it's considered a dead dart unless there is no question as to its determination. + +A. Center Strike Rule +If a player is batting .199 or less they are allowed to have the center strike area around the 2BS considered as a single. Batters must have played two weeks in the season and captains must have current stats. + +## Section 4: Running the Bases +All runners shall advance one base on a single, two bases on a double, three bases on a triple and four bases on a home run. On a two-base single (2BS), all runners advance two bases and the batter goes to first base. On a double play (DP), the batter is out as well as the lead runner. Remaining runner/runners advance one base. On a sacrifice hit (SH), all runners advance one base including any runner on third. If no one is on base, both the DP and SH are just a strike. The batter is out for computing batting averages. A walk is considered a hit for computing batting averages. If the walk forces a run to be scored the RBI counts for season statistics. 2BS, SH and Walks should be recorded as described to insure that RBI's are appropriately computed. + +# Article III: Governance + +## Section 1: Umpiring + +In league play, each captain will designate a player from their team to serve as an umpire. These umpires shall make all decisions. It is recommended that the non batting team umpire call or announce the play but this is not enforced as long as the two umpires are in agreement. In the case of a dispute, the umpires may call upon the captains to make a determination on the call. If no agreement is made the said dart will be ruled a dead dart with no penalty to the thrower. In league play, each team shall provide an umpire, score marker and a pitching line judge. The pitching line judge and the umpire can be the same person. Teams must announce if a separate line judge is being used and only he can call a player out for overstepping the line. This is only to be used after warnings have not corrected the batters overstepping of the line. Under no circumstances shall one umpire remove darts from the board before the other umpire has had a chance to verify the location of the darts. + +Calling of [ it doesn't matter darts ] All darts regardless of immediate impact will be called. In an effort to speed up play, the side umpire nearest will call the close dart and leave it available for inspection after the play. + +## Section 2: End of the Year Awards + +The minimum number of at bats to qualify for any trophy is 150. + +A. MVP +The most valuable player will be selected by ballot. Each team will select its most valuable player with the names turned into the statistician the last night of regular season play. At the single elimination tournament each team will be given a ballot with all teams' selection for MVP except that of their own player. It is the captain's responsibility to have his men to vote for MVP of each members choosing. The ballots will be returned to the league statistician and another officer. The ballots should be counted by individuals who are not on the ballot. The MVP will be announced at the banquet. + +B. Rookie of the year: +A rookie is defined as his first year in any dartball league. If rookie has less than 75 at bats he is considered a fill in player and not considered for Rookie of the year. To be considered, the batter must have at least 150 at bats with no more than 75 at bats for the previous season. Rookie of the year will be selected by ballot along side and in the same manner as the MVP. A team may vote for their own teammate. + +## Section 3: Dues +The annual team dues are payable at the captains meeting at the beginning of the season or make arrangements with the Treasurer to pay the dues. The officers and league board will determine the amount due. Currently at time of revision this amount per team is $50. All team players with the exception of 1s timers must contribute $1 to the host church every night that a game is played including postseason. + +## Section 4: Manners +Profanity and alcoholic beverages on church property is not acceptable. If after warnings this rule is not followed, the host church captain has every right to ask them to leave and they will have the full support of the officers and league board. If a team and or any of their team members are consuming alcohol on church property, the team will forfeit all 3 games. + +## Section 5: Officer Duties +The Treasurer is responsible for all dues, collection for supplies and sponsor donations to be deposited in league account for audit and review at any time by the officers and league board. All bills for needed equipment and supplies including the banquet must be paid for from the league account and subject for review at anytime. Treasurer must retain checks and statements for 84 Months and subject for review at any time. All funds collected for league use [banquet, sponsors, dues, ect ] will be given to treasurer directly. + +## Section 6: Postseason Play +The team captains will flip a coin to determine who will have home field advantage for all postseason play (1s and 2nd half Bezold, Championship and Tournament games). + +A. Bezold playoff guidelines: +The 1s Half Bezold is to be played between the 1$ and 2n place team at the mid-season break. The 2nd Half Bezold is to be played between the 1st and 2nd place teams at season end. If the winner of the first half Bezold is the 1t or 2nd place team then the 3e place team will play. No one team can win both Bezold trophies. The team that wins the best of three games wins the Bezold. For the Bezold games, each team must have a minimum of eight players. + +B. Championship Playoff Guidelines: +The championship game will be played between the team with the best 1st half record and the team with the best 2nd half record. If a team has the best record for both halves, then they will be named the League Champion. For the Championship game, each team must have a minimum of eight players. + +C. Tournament Guidelines: +The tournament will be played by all teams. Teams ill be randomly drawn in order to determine matchups. There is also a consolation bracket for teams that lose their 1 game. Each team must have a minimum of nine players. + +## Section 7: Tie Breakers +In the event we have ties between teams based on their league won/lost records, the tie breaker will be based on heads up play between the two or more said teams. If still no clear winner then total runs for that half. If that continues a tie then Highest total team batting average based on all players that have participated. In the highly unlikely event that this ends in a tie we will base the tiebreaker on total triples for the half. + +## Section 8: Captains Meeting Protocol +Topics can be introduced and reviewed as normal business. Motions must be announced prior to any voting. A second to the motion must be announced or the motion will not be considered. After the second to the motion, each captain and officers allowed to present opinions and ask questions to the person originating the motion. The secretary will take roll call and include in the minutes of all attending the meeting. A majority is required to pass a motion. + +## Section 9: Minimum Age +There is no minimum age. + +## Section 10: Other +No one is to pass behind the board while play is happening. \ No newline at end of file diff --git a/.ai/skills/example-sports-org-bylaws/references/little-league.md b/.ai/skills/example-sports-org-bylaws/references/little-league.md new file mode 100644 index 0000000..afcafda --- /dev/null +++ b/.ai/skills/example-sports-org-bylaws/references/little-league.md @@ -0,0 +1,375 @@ +# CONSTITUTION: + +# Little League +> **Date submitted:** [PLACEHOLDER] +> **Date accepted:** [PLACEHOLDER] **Not accepted:** +> [PLACEHOLDER] + +## ARTICLE I -- NAME + +> This organization shall be known as the [PLACEHOLDER] Little League, hereinafter referred to as "Local League." + +## ARTICLE II -- OBJECTIVE + +### SECTION 1 + +The objective of the Local League shall be to positively impact youth and communities using the power of youth baseball and/or softball to teach life lessons to build stronger individuals and communities. + +### SECTION 2 + +To achieve this objective, the Local League will provide a supervised program of baseball and/or softball consistent with the Rules and Regulations of Little League Baseball, Incorporated. All Directors, Officers and Members shall consider and incorporate the values of Little League: Teamwork, Community, Inclusion, Fun, and Integrity. The molding of future citizens is of prime importance and the attainment of exceptional athletic skill or the winning of games is secondary. In accordance with Section 501(c)(3) of the Federal Internal Revenue Code, the Local League shall operate exclusively as a nonprofit educational organization providing a supervised program of competitive baseball and/or softball games. No part of the net earnings shall benefit any individual or be used in any substantial part to influence legislation or intervene in any political campaign on behalf of any candidate for public office. + +## ARTICLE III -- MEMBERSHIP + +### SECTION 1 + +Any person sincerely interested in active participation to further the objective of the Local League may apply to become a Member. + +### SECTION 2 + +There shall be the following classes of Members: + +### Regular Members ("Members") shall include: -- + +a. Current year Managers, Coaches, Board Members, Local League Officers, and any registered volunteer, who have completed a background check. + +b. One Parent or one Legal Guardian of each registered player. Parents or Guardians of multiple registered players are limited to a maximum of two memberships. + +c. Any adult person actively interested in furthering the objectives of the Local League may become a Regular Member upon approval by the Board and payment if applicable. Upon receipt of a written request to become a member, the Board of Directors shall vote upon the request at the next scheduled Board of Directors meeting. + +d. All Members must annually complete the Little League Official Application, submit to a background check pursuant to Regulation I(8) and (9), and complete abuse awareness training pursuant to Regulation I(10) before the commencement of the season. + +e. The Secretary shall maintain the roll of membership to qualify voting Members. Only Members in good standing are eligible to vote at General Membership Meetings. Each Member is entitled to one vote. + + + +2. **Player Members** - Any player candidate meeting the requirements of Little League Regulation IV shall be eligible to compete for participation. Player Members shall have no rights, duties, or obligations in the management or in the property of the Local League. + +3. **Honorary Members (Optional)** -- Any person may be elected as Honorary Member by the unanimous vote of all Directors present at any duly held meeting of the Board of Directors but shall have no rights, duties, or obligations in the management or in the property of the Local League. + +4. **Sustaining Members (Optional)** -- Any person not a Regular Member who makes financial or other contribution to the Local League may by a majority vote of the Board of Directors become a Sustaining Member, but such person shall have no rights, duties, or obligations in the management of or in the property of the Local League. + +### SECTION 3 + +Members, whether Regular or Player, shall not be required to be affiliated with another organization or group to qualify as members of the Local League. Members shall not be actively engaged in the organization, operation and/or leadership of any other baseball and/or softball program. + +### SECTION 4 + +> Dues, if any, for Members may be fixed at such amounts as the Board of Directors shall determine for a particular fiscal year. Dues for Members are separate from registration fees for Player Members, which are determined annually by the Board of Directors in accordance with Little League Regulation XIII (c). + +### SECTION 5 + +> **Suspension or Termination** -- Membership may be terminated by resignation or action of the Board of Directors as follows. + +(a) The Board of Directors, by a two-thirds vote of those present at any duly constituted Board meeting, shall have the authority to discipline, suspend or terminate the membership of any Member of any class, including managers, coaches, and other volunteers when the conduct of such person is inconsistent with the values of Little League Baseball, Incorporated and is considered detrimental to the best interests of the players, Local League and/or Little League Baseball, Incorporated. The Member involved shall be notified of such meeting, informed of the general nature of the charges, and be given an opportunity to appear at the meeting to answer such charges. + +(b) The Board of Directors shall, in case of a Player Member, give notice to the Manager of the team for which the player is a Player Member. Said Manager shall appear, in the capacity of an adviser, with the player before the Board of Directors or a duly appointed committee of the Board of Directors. The player's parent(s) or legal guardian(s) may also be present. The Board of Directors shall have full power to suspend or revoke such player's right to future participation in the Local League by two-thirds vote of those present at any duly constituted Board meeting. + +(c) If membership dues are collected, Members who fail to pay their fixed dues may, by a two-thirds vote of the Board present at any duly constituted Board meeting, be dropped from the rolls and shall forfeit all rights and privileges of membership. The Board of Directors will establish the number of days within which applicants have to pay membership dues as part of the annual Policies and Procedures which shall be voted on at the first Board meeting of each fiscal year. + +## ARTICLE IV -- BOARD OF DIRECTORS + +### SECTION 1 + +The management of the property and affairs of the Local League shall be vested in the Board of Directors. + +### SECTION 2 + +The Board of Directors shall be comprised of no fewer than seven (7) and no more than fifteen (15) Members in good standing. The Officers of the Board of Directors shall include, at a minimum: President, Vice President, Treasurer, Secretary, Player Agent, Safety Officer, and Coaching Coordinator, per Little League Regulation I(b). + +### SECTION 3 + +If any vacancy occurs on the Board of Directors, by death, resignation or otherwise, it may be filled, for the balance of the absent Board Member's term of office, by a majority vote of the remaining Directors at any duly constituted Board meeting or Special Board Meeting called for that purpose. + +### SECTION 4 + +Regular meetings of the Board of Directors shall be held immediately following the Annual Meeting and, on such days, thereafter as shall be determined by the Board. + +(a) The President or Secretary shall at the request in writing of + + - [ ] 3 Directors + + - [ ] 4 Directors + + - [ ] 5 Directors + +> Issue the call for a Special Board Meeting. In the case of Special Board Meetings, such notice shall include the purpose of the meeting and only matters so stated in such notice may be acted upon at the Special meeting. Meetings of the Board of Directors may be held in-person and/or by telephonic or electronic means and such means shall be clearly stated in any meeting notice. + +(b) Notice of every Board meeting shall be given by the Secretary personally, electronically or by mail to each Director at a minimum {{Five (5), Ten (10), Fourteen (14), Twenty-one (21), Thirty (30)}} Calendar day(s) before the time appointed for the meeting to the last recorded address of each Director. + +(c) At any meeting of the Board of Directors, the presence of {{One-third (33.3 percent), One-fourth (25 percent), One-fifth (20 percent) }} of the Board of Directors shall constitute a quorum for the transaction of regular business. If a quorum is not present, no business shall be conducted. + +(d) Only members of the Board of Directors may make motions and vote at meetings of the Board of Directors. However, the Board of Directors may invite, admit, and recognize guests for presentations or comments during Board meetings. + +(e) A simple majority vote of the Directors present during a duly constituted Board of Directors meeting is necessary to approve any action relating to the general business of the Local league. + +(f) No Director shall be allowed to vote by proxy at any meeting of the Board of Directors. + +### SECTION 5 + +The Board of Directors shall have the power to appoint such standing committees as it shall determine appropriate and to delegate such powers to them as the Board shall deem advisable and which it may properly delegate. + +The Board may adopt such rules and regulations for the conduct of its meetings and the management of the Local League as it may deem proper, provided such rules and regulations do not conflict with this Constitution or the Rules and Regulations of Little League Baseball, Incorporated. + +The Board shall have the power by a two-thirds vote of those present at any regular Board or Special Board Meeting to discipline, suspend or remove any Director, Officer, Committee Member, or Member of the Local League in accordance with the procedure set forth in Article III, Section 5. + +### SECTION 6 + +Robert's Rules of Order shall govern the proceedings of all Local League meetings, including Board of Directors meetings. Any action taken by the Board of Directors at a meeting at which a quorum is present will be deemed the action of the Board of Directors, except where same conflicts with this Constitution. Minutes of all meetings will be recorded and will accurately reflect the action(s) taken. + +## ARTICLE V -- DUTIES AND POWERS OF THE BOARD + +### SECTION 1 + +The Board of Directors may appoint such other officers or agents as it may deem necessary or desirable and may prescribe the powers and duties of each. Appointed officers or agents shall have no vote on actions taken by the Board of Directors unless such individuals have been elected to the Board by the membership or have been elected to fill a vacancy on the Board. + +### SECTION 2 + +> **President** -- The President shall: + +(a) Conduct the affairs of the Local League and execute the policies established by the Board of Directors. + +(b) Present a report of the condition of the Local League at the Annual Meeting. + +(c) Communicate to the Board of Directors such matters as deemed appropriate and make such suggestions as may tend to promote the welfare of the Local League. + +(d) Be responsible for the conduct of the Local League in strict conformity to the policies, principles, and Rules and Regulations of Little League Baseball, Incorporated, as agreed to under the conditions of charter issued to the Local League by that organization. + +(e) Investigate complaints, irregularities, and conditions detrimental to the Local League and report thereon to the Board or Executive Committee as circumstances warrant. + +(f) Prepare and submit an annual budget to the Board of Directors and be responsible for the proper execution thereof. + +(g) With the assistance of the Player Agent, examine the application and support proof-of age documents of every player candidate and + +(h) certify to residence or school enrollment, and age eligibility before the player may be accepted for tryouts and selection. + +(i) Complete the required background checks per Little League Regulation I (b) and I (c) 8 & 9; or delegate this responsibility to the league Safety Officer, or other designated Board member. + +(j) Ensure that all individuals who submit the Volunteer Application complete the Abuse Awareness Training as outlined in the Little League Child Protection Program or delegate this responsibility to the league Safety Officer, or other designated Board member. + +(k) Ensure the Local League compliance with the requirements of the Little League Child Protection Program or delegate this responsibility to the league Safety Officer, or other designated Board Member. + +### SECTION 3 + +> **Vice President** -- The Vice President shall: + +(a) Perform the duties of the President in the absence or disability of the President, provided he or she is authorized by the President or Board to so act. When so acting, the Vice President shall have all the powers of that office. + +(b) Perform such duties as from time to time may be assigned by the Board of Directors or by the President. + +### SECTION 4 + +> **Secretary** -- The Secretary shall: + +(a) Be responsible for recording the activities of the Local League and maintain appropriate files, mailing lists, email lists and necessary records. + +(b) Perform such duties as are herein specifically set forth, in addition to such other duties as are customarily incident to the office of Secretary or as may be assigned by the Board of Directors. + +(c) Maintain a list of all Regular, Sustaining and Honorary Members, Directors and Committee Members and give notice of all meetings of the Local League, the Board of Directors, and Committees. + +(d) Maintain a current list of all Regular Members in good standing and determine the number of Regular + +> Members needed to constitute a quorum. + +(e) Issue membership cards to Regular Members, if approved by the Board of Directors. + +(f) Keep the minutes of the meetings of the Members, the Board of Directors, and the Executive Committee, and cause them to be recorded in a book kept for that purpose. + +(g) Conduct all correspondence not otherwise specifically delegated in connection with said meeting and shall be responsible for carrying out all orders, votes and resolutions not otherwise committed. + +(h) Notify Members, Directors, Officers and Committee Members of their election or appointment. Provide each of these individuals with a copy of the Local League Constitution. + +### SECTION 5 + +> **Treasurer** -- The Treasurer shall: + +(a) Perform such duties as are herein set forth and such other duties as are customarily incident to the Office of Treasurer or may be assigned by the Board of Directors. + +(b) Receive all moneys and securities, and deposit same in a depository approved by the Board of Directors. + +(c) Keep records for the receipt and disbursement of all moneys and securities of the Local League, including the Auxiliary, approve all payments from allotted funds and draw checks therefore in agreement with policies established in advance of such actions by the Board of Directors. All disbursements by check must have dual signatures. + +(d) Prepare an annual budget, under the direction of the President, for submission to the Board of Directors at the Annual Meeting. + +(e) Prepare an annual financial report, under the direction of the President, for submission to the Membership and Board of Directors at the Annual Meeting, and to Little League International. + +### SECTION 6 + +> **Player Agent** -- The Player Agent shall: + +(a) Record all player transactions and maintain an accurate and up-to-date record thereof. + +(b) Receive and review applications for player candidates and assist the President in verifying residence or school enrollment and age eligibility. + +(c) Conduct tryouts, player draft, and all other player transactions or selection meetings. + +(d) Prepare the Player Agent's list. + +(e) Prepare for the President's signature and submission to Little League Baseball, Incorporated team rosters, including players claimed, and the tournament team eligibility affidavit. + +(f) Notify Little League Baseball, Incorporated of any subsequent player replacements or trades. + +### SECTION 7 + +> **Safety Officer** -- The Safety Officer shall: + +(a) Be responsible to create awareness, through education and information, of the opportunities to provide a safer environment for Players and all participants of Little League. + +(b) Develop and implement a plan for increasing safety of activities, equipment and facilities through education, compliance and reporting which may include: + + 1. Education -- Facilitate meetings and distribute information among participants including players, managers, coaches, umpires, league officials, parents, guardians, and other volunteers. + + 2. Compliance -- Promote safety compliance leadership by increasing awareness of the safety opportunities that arise from these responsibilities. + + 3. Reporting -- Define a process to assure that incidents are recorded, information is sent to league/district and national offices, and follow-up information on medical and other data is forwarded as available. + + 4. Background Checks - If the League President so designates, the Safety Officer will complete the required background checks per Little League Regulation I(b) and I(c)(8) & (9). + + 5. Training -- If the League President so designates, the Safety Officer shall ensure that all individuals who submit the Volunteer Application complete the Abuse Awareness Training per Little League Regulation I(c)10 and as outlined in the Little League Child Protection Program. + + 6. Child Protection Program -- If the League President so designates, the Safety Officer will ensure the league is compliant with all aspects of the Little League Child Protection Program. + +### SECTION 8 + +Additional Managers and Committees may be established by the Board of Directors and may be filled by persons who do not serve on the Board of Directors but report to such. The need for and responsibilities of those positions will be reviewed annually and included in the Local League's Policies and Procedures. + +## ARTICLE VI -- COMMITTEES + +### SECTION 1 + +> **Executive Committee** + +(a) The Board of Directors may appoint an Executive Committee which shall consist of not less than three (3) nor more than five (5) Directors, one of whom shall be the President of the Local League. + +(b) The Executive Committee shall advise with and assist the Officers of the Local League in all matters concerning its interests and the management of its affairs, and shall have such other powers as may be delegated to it by the Board, but in no event will the Executive Committee have authority over the Board of Directors. + +(c) At any meeting of the Executive Committee, a majority of the total number of members then in office shall constitute a quorum for the transaction of business, and the act of a majority present at any meeting at which there is a quorum shall be the act of the Committee. + +### SECTION 2 + +The Board of Directors may appoint such Committees as it may deem necessary or desirable and may prescribe the powers and duties of each Committee in Policies and Procedures. Committee Chairs and members of the Committees shall have no vote on actions taken by the Board of Directors unless such individuals have been elected to the Board by the membership or have been elected to fill a vacancy on the Board. + +## ARTICLE VII -- GENERAL MEMBERSHIP MEETINGS + +### SECTION 1 + +**Definition** -- A General Membership Meeting is any meeting of the membership of the league which is called in accordance with this Constitution. A minimum of one meeting per year (Annual Meeting, see Section 6) is required. General Membership Meetings may be held in-person and/or by other electronic means which allow for full participation by all Members. + +### SECTION 2 + +**Notice of Meeting** -- Notice of each General Membership Meeting shall be delivered personally, electronically, or by mail to each Member at the last recorded address at least 10 calendar days in advance of the meeting, setting forth the place, time, and purpose of the meeting. + +### SECTION 3 + +**Quorum** -- At any General Membership Meeting, the presence in person or representation by absentee ballot of twenty (20) percent of the Regular Members or forty (40) Regular Members, whichever is less, shall be necessary to constitute a quorum. If a quorum is not present, no business shall be conducted. The Secretary shall be responsible for providing a list of all Regular Members in good standing. + +### SECTION 4 + +**Voting** -- Only Regular Members in good standing shall be entitled to attend, make motions and vote at General Membership Meetings. However, the Board of Directors may invite, admit, and recognize guests for presentations or comments during General Membership Meetings. + +### SECTION 5 + +**Absentee Ballot** -- For the expressed purpose of accommodating a Regular Member in good standing who cannot attend a General Membership Meeting at which new Board members will be elected, an absentee ballot may be requested and obtained from the Secretary of the Local League. The absentee ballot shall be properly completed, signed, and returned in a sealed envelope to the Secretary prior to the date of the election. The Secretary shall present all absentee ballots to the Election Chairman (appointed at the meeting) on the date of the meeting, prior to the voting portion of the election process. + +### SECTION 6 + +> **Annual Meeting of the Members** -- The Annual Meeting of the Members of the Local League shall be held [PLACEHOLDER] (Insert date/time. For example: "The third Wednesday of (month) at 8 p.m.") each year for the purpose of electing the Board of Directors, receiving reports, reviewing the Constitution, appointing committees, and for the transaction of such business as may properly come before the meeting. + +(a) The Membership shall receive at the Annual Meeting of the Members of the Local League a report, verified by the President and Treasurer, or a majority of the Directors, showing: + + 1. The condition of the Local League, to be presented by the President or his/her designee. + + 2. A general summary of funds received and expended by the Local League for the previous year, the amount of funds currently in possession of the Local League, and the name of the financial institution in which such funds are maintained. + + 3. The whole amount of real and personal property owned by the Local League, where located, and where and how invested. + + 4. For the year immediately preceding, the amount and nature of the property acquired, with the date of the report and the manner of the acquisition, the amount applied, appropriated, or expended, and the purposes, objects, or persons to or for which such applications, appropriations or expenditures have been made. + + 5. The names of the persons who have been admitted to Membership in the Local League during the preceding year. + +(b) This report shall be filed with the records of the Local League and entered in the minutes of the proceedings of the Annual Meeting. A copy of such report shall be forwarded to Little League International. + +(c) At the Annual Meeting, the Regular Members shall elect the Board of Directors. If the total number of Board candidates exceeds the number of available Board positions, then those Board candidates receiving the most votes will be considered elected to the Board. Regular Members may only cast a number of votes equal to or less than the board positions available. In the event of a tie in the number of votes received by two or more Board candidates for unfilled Board seats, a run-off election, in which all Members may vote, will be held for the tied Board candidates. + +(d) After the Board of Directors is elected, the Board shall meet to elect the Officers of the Board. + +(e) After the election, the Board of Directors shall assume the performance of its duties on [PLACEHOLDER] \[Insert Month / Day and delete content in brackets.\] The Board's term of office shall continue until its successors are elected and qualified under this section at the next annual meeting. + +### SECTION 7 + +**Special General Membership Meetings** -- Special General Membership Meetings may be called by the Board of Directors, by the Secretary or President at their discretion. Additionally, upon the written request of a minimum of five (5) Members, the President or Secretary shall call a Special General Membership Meeting to consider the subject specified in the request. No business other than that specified in the notice of the Special General Membership Meeting shall be transacted at any Special General Membership Meeting. Such Special General Membership Meeting shall be scheduled to take place not less than (choos, {{Five (5), Ten (10), Fourteen (14), Twenty-one (21), Thirty (30)}} calendar days after the request is received by the President or Secretary. + +### SECTION 8 + +Any vote by the Regular Members at a meeting at which a quorum is present will be deemed the action of the Regular Members, except where same conflicts with this Constitution. Minutes of all meetings will be kept and will accurately reflect the action(s) taken. + +## ARTICLE VIII -- AFFILIATION + +### SECTION 1 + +The Local League shall annually apply for a charter from Little League Baseball, Incorporated, and shall do all things necessary to obtain and maintain such charter. The Local League shall devote its entire energies to the activities authorized by such charter, and it shall not be affiliated with any other program or organization or operate any other program. + +### SECTION 2 + +The Official Playing Rules and Regulations as published by Little League Baseball, Incorporated shall be binding on the Local League. + +### SECTION 3 + +The local rules, ground rules and/or bylaws of the Local League shall be adopted by the Board of Directors at a meeting to be held not less than one month before the first scheduled game of the season, but shall in no way conflict with the Rules, Regulations and Policies of Little League Baseball, Incorporated, nor shall they conflict with this Constitution. The local rules, ground rules and/or bylaws of this Local League shall expire at the end of each playing season and are not considered part of this Constitution. + +## ARTICLE IX -- FINANCIAL AND ACCOUNTING + +### SECTION 1 + +The Board of Directors shall decide all matters pertaining to the finances of the Local League and it shall place all income including auxiliary funds, in a common league treasury, directing the expenditure of funds in such manner as will give no individual or team an advantage over those in competition with such individual or team. + +### SECTION 2 + +The Board shall not permit the contribution of funds or property to individual teams but shall solicit funds for the common treasury of the Local League, thereby to discourage favoritism among teams and to endeavor to equalize the benefits of the Local League. + +### SECTION 3 + +The Board shall not permit the solicitation of funds in the name of Little League Baseball, Incorporated unless all funds so raised be placed in the Local League treasury. + +### SECTION 4 + +The Board shall not permit the disbursement of Local League funds for other than the conduct of Little League activities in accordance with the Rules, Regulations, and Policies of Little League Baseball, Incorporated. All disbursements shall be made by check, or league credit or debit card. All checks shall be signed by both the Local League Treasurer and such other officer or officers, or person or persons, as the Board of Directors shall determine. + +### SECTION 5 + +No Board member authorized to disburse funds may be the spouse or family relative of the Local League President or Treasurer or have direct access to league funds without the approval of the majority of the Board of Directors with such vote recorded in the minutes. The use of a league credit or debit card is permitted, and the card is returned to the Local League President, Treasurer, or Chairman of the Audit Committee with receipt for all purchases made within three (3) days of the purchase date. + +### SECTION 6 + +No Director, Officer, or Member of the Local League shall receive, directly or indirectly any salary, compensation, or payment from the Local League for services rendered as Director, Officer, or Member. + +### SECTION 7 + +All moneys received, including sponsorship and fundraising, shall be deposited into the financial account of the Local League which must be a federally insured bank or other certified financial intuition as determined by the Board. The establishment of the Local League account or change of account must be noted in the board minutes. + +### SECTION 8 + +### + +The fiscal year of the Local League shall begin on (Check one): {{October 1 and shall end on September 30., January 1 and shall end on December 31, Other -- Specify dates: [PLACEHOLDER]}} + +### SECTION 9 + +Upon dissolution of the Local League program for any reason and after all outstanding debts and claims have been satisfied, the Regular Members may either direct the remaining property of the Local League to another chartered Little League program in good standing with Little League Baseball, Incorporated or may direct the funds to Little League Baseball, Incorporated. + +## ARTICLE X -- AMENDMENTS + +This Constitution may only be amended, repealed, or altered in whole or in part by a majority vote of sixty-six (66) percent of the Members at a duly organized meeting, provided notice of the proposed change is included in the notice of such meeting. A draft of all proposed amendments shall be submitted to Little League Baseball, Incorporated for approval before a vote of the Membership is held. + +This Constitution was approved by the Local League Membership on (date) + +> [PLACEHOLDER] + +President's Name (Printed) + +President's Signature + +> Little League ID No. [PLACEHOLDER]. +> Federal ID No. (if available) [PLACEHOLDER]. +> State ID No. (if available) [PLACEHOLDER]. +> *Little League Baseball, Incorporated does not limit participation in its activities on the basis of disability, race, creed, color, national origin, gender, sexual preference or religious preference.* diff --git a/.ai/skills/local-domain-template/SKILL.md b/.ai/skills/local-domain-template/SKILL.md new file mode 100644 index 0000000..bc88489 --- /dev/null +++ b/.ai/skills/local-domain-template/SKILL.md @@ -0,0 +1,39 @@ +--- +name: local-domain-template +description: Use this skill for project-local domain knowledge that should not be installed system-wide. Replace this description with what the domain is, when the skill should trigger, and what kinds of tasks it should guide. +--- + +# Local Domain Skill + +Replace this template with the domain knowledge you want available only in this repository. + +## When To Use + +- Use this skill when working on: +- Use this skill when the user asks about: +- Use this skill when decisions depend on: + +## Core Rules + +- Put the most important domain constraints here. +- Keep these as concrete rules, not general commentary. +- Prefer short bullets over long explanations. + +## Workflow + +1. Identify the domain-specific question or task. +2. Load only the references needed for that task. +3. Apply the domain rules before making edits or recommendations. +4. Validate the result against the domain constraints. + +## References + +- Add optional files under `references/` when detailed material is needed. +- Add scripts under `scripts/` when parts of the workflow should be deterministic. +- Add assets under `assets/` only when the skill needs files used in output. + +## Notes + +- Keep this skill local under `.ai/skills/` so it stays repo-specific. +- Rename the folder and the `name` field to match the real domain. +- Tighten the `description` so the skill triggers only for the intended work. diff --git a/.ai/skills/mkdocs/SKILL.md b/.ai/skills/mkdocs/SKILL.md new file mode 100644 index 0000000..86fd486 --- /dev/null +++ b/.ai/skills/mkdocs/SKILL.md @@ -0,0 +1,166 @@ +--- +name: mkdocs +description: "Use when creating, configuring, debugging, or customizing MkDocs sites pinned to MkDocs 1.6.1 with Material for MkDocs 9.7.1, including mkdocs.yml, nav, Markdown authoring, theme overrides, plugins, search, deployment, and version-safe upgrades." +--- + +# MkDocs + +## When to use + +Use this skill for work on documentation sites that use: + +- `mkdocs==1.6.1` +- `mkdocs-material==9.7.1` + +Typical tasks: + +- create or restructure a docs site +- update `mkdocs.yml` +- fix navigation, links, assets, or Markdown rendering +- enable or tune Material features, plugins, and extensions +- add CSS/JS overrides or theme template overrides +- prepare deployment for GitHub Pages or another static host + +## Version guardrails + +- Treat `MkDocs 1.6.1` and `Material for MkDocs 9.7.1` as fixed unless the user explicitly asks to upgrade. +- Keep recommendations compatible with those versions. +- If a repo is missing pinned versions, prefer adding explicit pins rather than floating latest versions. + +## Procedure + +### 1) Inspect the current site shape first + +Check: + +- `mkdocs.yml` +- `docs/` +- dependency files such as `requirements.txt`, `pyproject.toml`, `uv.lock`, or `poetry.lock` +- any `overrides/`, `docs/stylesheets/`, `docs/javascripts/`, or CI deploy workflow + +### 2) Start from the canonical baseline + +Prefer this baseline unless the existing site already has an intentional alternative: + +```yaml +site_name: Example Docs +site_url: https://example.com/docs/ +theme: + name: material +``` + +Recommendations drawn from the versioned docs: + +- Always set `site_url`. Material relies on it for several features, and MkDocs uses it for canonical URLs and path-aware local serving. +- Prefer an explicit `nav` for stable ordering once a site has more than a few pages. +- Keep internal links relative between Markdown files. Avoid absolute doc links. +- Put static assets under `docs/` so MkDocs copies them through unchanged. +- Keep `site/` out of version control. + +### 3) Author content the MkDocs way + +- Use `index.md` for section landing pages. `README.md` is also supported for index pages, but do not keep both `index.md` and `README.md` in the same directory. +- Prefer shallow, readable navigation over deep nesting. +- If pages are intentionally hidden from global navigation, remember they still build and must still have valid links. +- When fixing broken anchors, verify the generated heading slug rather than guessing. + +Primary references: + +- `references/upstream/mkdocs-1.6.1-docs/user-guide/writing-your-docs.md` +- `references/upstream/mkdocs-1.6.1-docs/user-guide/configuration.md` + +### 4) Customize Material with the lowest-friction tool first + +Choose the least invasive option that solves the task: + +1. small visual tweaks: `extra_css` and `extra_javascript` under `docs/` +2. theme HTML changes: `theme.custom_dir: overrides` +3. template changes: prefer block overrides with `main.html` and `{{ super() }}` over copying full templates + +Recommendations: + +- Prefer `docs/stylesheets/extra.css` and `docs/javascripts/extra.js` for minor changes. +- For HTML customization, install Material via package name and set `theme.name: material`; do not fork the theme when `custom_dir` will do. +- When overriding templates, prefer extending `base.html` or overriding blocks instead of replacing whole partials. +- If custom JavaScript must run after client-side navigation, attach it via Material's `document$` observable. + +Primary references: + +- `references/upstream/mkdocs-material-9.7.1-docs/customization.md` +- `references/upstream/mkdocs-1.6.1-docs/user-guide/customizing-your-theme.md` +- `references/upstream/mkdocs-material-9.7.1-docs/setup/` + +### 5) Use Material features intentionally + +- Keep `theme.name: material` unless the repo deliberately uses another theme. +- Add only the features actually needed; avoid turning on large feature sets blindly. +- For search, analytics, navigation, blog, tags, privacy, social cards, and versioning, consult the matching Material setup/plugin page before editing config. +- If editing `mkdocs.yml` directly is error-prone, use Material's schema support in the editor. + +Primary references: + +- `references/upstream/mkdocs-material-9.7.1-docs/creating-your-site.md` +- `references/upstream/mkdocs-material-9.7.1-schema.json` +- `references/upstream/mkdocs-material-9.7.1-docs/setup/` +- `references/upstream/mkdocs-material-9.7.1-docs/plugins/` +- `references/upstream/mkdocs-material-9.7.1-docs/reference/` + +### 6) Validate before deployment + +Default verification flow: + +```bash +mkdocs build --strict +mkdocs serve +``` + +For large sites, consider: + +```bash +mkdocs serve --dirtyreload +``` + +Deployment guardrails: + +- Review the local build before `mkdocs gh-deploy`. +- Do not run `mkdocs gh-deploy` from a dirty working tree unless the deployed output is meant to include those changes. +- For GitHub Pages custom domains, keep `CNAME` in `docs/`. +- For offline or `file://` output, set `site_url: ""`, set `use_directory_urls: false`, and do not rely on the default search plugin. + +Primary references: + +- `references/upstream/mkdocs-1.6.1-docs/user-guide/deploying-your-docs.md` +- `references/upstream/mkdocs-1.6.1-docs/user-guide/cli.md` +- `references/upstream/mkdocs-material-9.7.1-docs/publishing-your-site.md` +- `references/upstream/mkdocs-material-9.7.1-docs/setup/building-for-offline-usage.md` + +## Reference map + +Open only the specific files needed: + +- core MkDocs usage: + `references/upstream/mkdocs-1.6.1-docs/getting-started.md` +- config: + `references/upstream/mkdocs-1.6.1-docs/user-guide/configuration.md` +- authoring and links: + `references/upstream/mkdocs-1.6.1-docs/user-guide/writing-your-docs.md` +- deployment: + `references/upstream/mkdocs-1.6.1-docs/user-guide/deploying-your-docs.md` +- Material bootstrap: + `references/upstream/mkdocs-material-9.7.1-docs/getting-started.md` +- Material site setup: + `references/upstream/mkdocs-material-9.7.1-docs/creating-your-site.md` +- Material customization: + `references/upstream/mkdocs-material-9.7.1-docs/customization.md` +- Material setup pages: + `references/upstream/mkdocs-material-9.7.1-docs/setup/` +- Material plugin pages: + `references/upstream/mkdocs-material-9.7.1-docs/plugins/` +- Material writing features: + `references/upstream/mkdocs-material-9.7.1-docs/reference/` + +For quick discovery inside the bundled docs: + +```bash +rg -n "^#|^##" references/upstream/mkdocs-1.6.1-docs references/upstream/mkdocs-material-9.7.1-docs +``` diff --git a/.ai/skills/mkdocs/agents/openai.yaml b/.ai/skills/mkdocs/agents/openai.yaml new file mode 100644 index 0000000..5f4aee3 --- /dev/null +++ b/.ai/skills/mkdocs/agents/openai.yaml @@ -0,0 +1,7 @@ +interface: + display_name: "MkDocs" + short_description: "Work on MkDocs and Material sites" + default_prompt: "Use $mkdocs to create or update this documentation site for MkDocs 1.6.1 and Material for MkDocs 9.7.1." + +policy: + allow_implicit_invocation: true diff --git a/.ai/skills/mkdocs/references/README.md b/.ai/skills/mkdocs/references/README.md new file mode 100644 index 0000000..d788a1b --- /dev/null +++ b/.ai/skills/mkdocs/references/README.md @@ -0,0 +1,21 @@ +# MkDocs Skill References + +This skill vendors official documentation from the tagged upstream source trees for: + +- `mkdocs==1.6.1` +- `mkdocs-material==9.7.1` + +Included files: + +- `upstream/mkdocs-1.6.1-docs/` +- `upstream/mkdocs-1.6.1-mkdocs.yml` +- `upstream/mkdocs-material-9.7.1-docs/` +- `upstream/mkdocs-material-9.7.1-mkdocs.yml` +- `upstream/mkdocs-material-9.7.1-schema.json` + +Source bundles used: + +- `https://codeload.github.com/mkdocs/mkdocs/tar.gz/refs/tags/1.6.1` +- `https://codeload.github.com/squidfunk/mkdocs-material/tar.gz/refs/tags/9.7.1` + +Use the reference files directly for version-specific details. Keep `SKILL.md` procedural and concise. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/CNAME b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/CNAME new file mode 100644 index 0000000..d7525f1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/CNAME @@ -0,0 +1 @@ +www.mkdocs.org diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/contributing.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/contributing.md new file mode 100644 index 0000000..ea38c9b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/contributing.md @@ -0,0 +1 @@ +--8<-- "CONTRIBUTING.md" diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/license.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/license.md new file mode 100644 index 0000000..44546d3 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/license.md @@ -0,0 +1,37 @@ +# License + +The legal stuff. + +--- + +## Included projects + +Themes used under license from the ReadTheDocs projects. + +* ReadTheDocs theme - [View license](https://github.com/snide/sphinx_rtd_theme/blob/master/LICENSE). + +Many thanks to the authors and contributors of those wonderful projects. + +## MkDocs License (BSD) + +Copyright © 2014, Tom Christie. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. Redistributions in binary form must +reproduce the above copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/release-notes.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/release-notes.md new file mode 100644 index 0000000..4fd81c1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/about/release-notes.md @@ -0,0 +1,2206 @@ +# Release Notes + +--- + +## Upgrading + +To upgrade MkDocs to the latest version, use pip: + +```bash +pip install -U mkdocs +``` + +You can determine your currently installed version using `mkdocs --version`: + +```console +$ mkdocs --version +mkdocs, version 1.5.0 from /path/to/mkdocs (Python 3.10) +``` + +## Maintenance team + +The current and past members of the MkDocs team. + +* [@tomchristie](https://github.com/tomchristie/) +* [@d0ugal](https://github.com/d0ugal/) +* [@waylan](https://github.com/waylan/) +* [@oprypin](https://github.com/oprypin/) +* [@ultrabug](https://github.com/ultrabug/) + +## Version 1.6.1 (2024-08-30) + +### Fixed + +* Fix build error when environment variable `SOURCE_DATE_EPOCH=0` is set. #3795 +* Fix build error when `mkdocs_theme.yml` config is empty. #3700 +* Support `python -W` and `PYTHONWARNINGS` instead of overriding the configuration. #3809 +* Support running with Docker under strict mode, by removing `0.0.0.0` dev server warning. #3784 +* Drop unnecessary `changefreq` from `sitemap.xml`. #3629 +* Fix JavaScript console error when closing menu dropdown. #3774 +* Fix JavaScript console error that occur on repeated clicks. #3730 +* Fix JavaScript console error that can occur on dropdown selections. #3694 + +### Added + +* Added translations for Dutch. #3804 +* Added and updated translations for Chinese (Simplified). #3684 + +## Version 1.6.0 (2024-04-20) + +### Local preview + +* `mkdocs serve` no longer locks up the browser when more than 5 tabs are open. This is achieved by closing the polling connection whenever a tab becomes inactive. Background tabs will no longer auto-reload either - that will instead happen as soon the tab is opened again. Context: #3391 + +* New flag `serve --open` to open the site in a browser. + After the first build is finished, this flag will cause the default OS Web browser to be opened at the home page of the local site. + Context: #3500 + +#### Drafts + +> DANGER: **Changed from version 1.5.** + +**The `exclude_docs` config was split up into two separate concepts.** + +The `exclude_docs` config no longer has any special behavior for `mkdocs serve` - it now always completely excludes the listed documents from the site. + +If you wish to use the "drafts" functionality like the `exclude_docs` key used to do in MkDocs 1.5, please switch to the **new config key `draft_docs`**. + +See [documentation](../user-guide/configuration.md#exclude_docs). + +Other changes: + +* Reduce warning levels when a "draft" page has a link to a non-existent file. Context: #3449 + +### Update to deduction of page titles + +MkDocs 1.5 had a change in behavior in deducing the page titles from the first heading. Unfortunately this could cause unescaped HTML tags or entities to appear in edge cases. + +Now tags are always fully sanitized from the title. Though it still remains the case that [`Page.title`][mkdocs.structure.pages.Page.title] is expected to contain HTML entities and is passed directly to the themes. + +Images (notably, emojis in some extensions) get preserved in the title only through their `alt` attribute's value. + +Context: #3564, #3578 + +### Themes + +* Built-in themes now also support Polish language (#3613) + +#### "readthedocs" theme + +* Fix: "readthedocs" theme can now correctly handle deeply nested nav configurations (over 2 levels deep), without confusedly expanding all sections and jumping around vertically. (#3464) + +* Fix: "readthedocs" theme now shows a link to the repository (with a generic logo) even when isn't one of the 3 known hosters. (#3435) + +* "readthedocs" theme now also has translation for the word "theme" in the footer that mistakenly always remained in English. (#3613, #3625) + +#### "mkdocs" theme + +The "mkdocs" theme got a big update to a newer version of Bootstrap, meaning a slight overhaul of styles. Colors (most notably of admonitions) have much better contrast. + +The "mkdocs" theme now has support for dark mode - both automatic (based on the OS/browser setting) and with a manual toggle. Both of these options are **not** enabled by default and need to be configured explicitly. +See `color_mode`, `user_color_mode_toggle` in [**documentation**](../user-guide/choosing-your-theme.md#mkdocs). + +> WARNING: **Possible breaking change.** +> +> jQuery is no longer included into the "mkdocs" theme. If you were relying on it in your scripts, you will need to separately add it first (into mkdocs.yml) as an extra script: +> +> ```yaml +> extra_javascript: +> - https://code.jquery.com/jquery-3.7.1.min.js +> ``` +> +> Or even better if the script file is copied and included from your docs dir. + +Context: #3493, #3649 + +### Configuration + +#### New "`enabled`" setting for all plugins + +You may have seen some plugins take up the convention of having a setting `enabled: false` (or usually controlled through an environment variable) to make the plugin do nothing. + +Now *every* plugin has this setting. Plugins can still *choose* to implement this config themselves and decide how it behaves (and unless they drop older versions of MkDocs, they still should for now), but now there's always a fallback for every plugin. + +See [**documentation**](../user-guide/configuration.md/#enabled-option). Context: #3395 + +### Validation + +#### Validation of hyperlinks between pages + +##### Absolute links + +> Historically, within Markdown, MkDocs only recognized **relative** links that lead to another physical `*.md` document (or media file). This is a good convention to follow because then the source pages are also freely browsable without MkDocs, for example on GitHub. Whereas absolute links were left unmodified (making them often not work as expected or, more recently, warned against). + +If you dislike having to always use relative links, now you can opt into absolute links and have them work correctly. + +If you set the setting `validation.links.absolute_links` to the new value `relative_to_docs`, all Markdown links starting with `/` will be understood as being relative to the `docs_dir` root. The links will then be validated for correctness according to all the other rules that were already working for relative links in prior versions of MkDocs. For the HTML output, these links will still be turned relative so that the site still works reliably. + +So, now any document (e.g. "dir1/foo.md") can link to the document "dir2/bar.md" as `[link](/dir2/bar.md)`, in addition to the previously only correct way `[link](../dir2/bar.md)`. + +You have to enable the setting, though. The default is still to just skip any processing of such links. + +See [**documentation**](../user-guide/configuration.md#validation-of-absolute-links). Context: #3485 + +###### Absolute links within nav + +Absolute links within the `nav:` config were also always skipped. It is now possible to also validate them in the same way with `validation.nav.absolute_links`. Though it makes a bit less sense because then the syntax is simply redundant with the syntax that comes without the leading slash. + +##### Anchors + +There is a new config setting that is recommended to enable warnings for: + +```yaml +validation: + anchors: warn +``` + +Example of a warning that this can produce: + +```text +WARNING - Doc file 'foo/example.md' contains a link '../bar.md#some-heading', but the doc 'foo/bar.md' does not contain an anchor '#some-heading'. +``` + +Any of the below methods of declaring an anchor will be detected by MkDocs: + +```markdown +## Heading producing an anchor + +## Another heading {#custom-anchor-for-heading-using-attr-list} + + + +[](){#markdown-anchor-using-attr-list} +``` + +Plugins and extensions that insert anchors, in order to be compatible with this, need to be developed as treeprocessors that insert `etree` elements as their mode of operation, rather than raw HTML which is undetectable for this purpose. + +If you as a user are dealing with falsely reported missing anchors and there's no way to resolve this, you can choose to disable these messages by setting this option to `ignore` (and they are at INFO level by default anyway). + +See [**documentation**](../user-guide/configuration.md#validation). Context: #3463 + +Other changes: + +* When the `nav` config is not specified at all, the `not_in_nav` setting (originally added in 1.5.0) gains an additional behavior: documents covered by `not_in_nav` will not be part of the automatically deduced navigation. Context: #3443 + +* Fix: the `!relative` YAML tag for `markdown_extensions` (originally added in 1.5.0) - it was broken in many typical use cases. + + See [**documentation**](../user-guide/configuration.md#paths-relative-to-the-current-file-or-site). Context: #3466 + +* Config validation now exits on first error, to avoid showing bizarre secondary errors. Context: #3437 + +* MkDocs used to shorten error messages for unexpected errors such as "file not found", but that is no longer the case, the full error message and stack trace will be possible to see (unless the error has a proper handler, of course). Context: #3445 + +### Upgrades for plugin developers + +#### Plugins can add multiple handlers for the same event type, at multiple priorities + +See [`mkdocs.plugins.CombinedEvent`][] in [**documentation**](../dev-guide/plugins.md#event-priorities). Context: #3448 + +#### Enabling true generated files and expanding the [`File`][mkdocs.structure.files.File] API + +See [**documentation**][mkdocs.structure.files.File]. + +* There is a new pair of attributes [`File.content_string`][mkdocs.structure.files.File.content_string]/[`content_bytes`][mkdocs.structure.files.File.content_bytes] that becomes the official API for obtaining the content of a file and is used by MkDocs itself. + + This replaces the old approach where one had to manually read the file located at [`File.abs_src_path`][mkdocs.structure.files.File.abs_src_path], although that is still the primary action that these new attributes do under the hood. + +* The content of a `File` can be backed by a string and no longer has to be a real existing file at `abs_src_path`. + + It is possible to **set** the attribute `File.content_string` or `File.content_bytes` and it will take precedence over `abs_src_path`. + + Further, `abs_src_path` is no longer guaranteed to be present and can be `None` instead. MkDocs itself still uses physical files in all cases, but eventually plugins will appear that don't populate this attribute. + +* There is a new constructor [`File.generated()`][mkdocs.structure.files.File.generated] that should be used by plugins instead of the `File()` constructor. It is much more convenient because one doesn't need to manually look up the values such as `docs_dir` and `use_directory_urls`. Its signature is one of: + + ```python + f = File.generated(config: MkDocsConfig, src_uri: str, content: str | bytes) + f = File.generated(config: MkDocsConfig, src_uri: str, abs_src_path: str) + ``` + + This way, it is now extremely easy to add a virtual file even from a hook: + + ```python + def on_files(files: Files, config: MkDocsConfig): + files.append(File.generated(config, 'fake/path.md', content="Hello, world!")) + ``` + + For large content it is still best to use physical files, but one no longer needs to manipulate the path by providing a fake unused `docs_dir`. + +* There is a new attribute [`File.generated_by`][mkdocs.structure.files.File.generated_by] that arose by convention - for generated files it should be set to the name of the plugin (the key in the `plugins:` collection) that produced this file. This attribute is populated automatically when using the `File.generated()` constructor. + +* It is possible to set the [`edit_uri`][mkdocs.structure.files.File.edit_uri] attribute of a `File`, for example from a plugin or hook, to make it different from the default (equal to `src_uri`), and this will be reflected in the edit link of the document. This can be useful because some pages aren't backed by a real file and are instead created dynamically from some other source file or script. So a hook could set the `edit_uri` to that source file or script accordingly. + +* The `File` object now stores its original `src_dir`, `dest_dir`, `use_directory_urls` values as attributes. + +* Fields of `File` are computed on demand but cached. Only the three above attributes are primary ones, and partly also [`dest_uri`][mkdocs.structure.files.File.dest_uri]. This way, it is possible to, for example, overwrite `dest_uri` of a `File`, and `abs_dest_path` will be calculated based on it. However you need to clear the attribute first using `del f.abs_dest_path`, because the values are cached. + +* `File` instances are now hashable (can be used as keys of a `dict`). Two files can no longer be considered "equal" unless it's the exact same instance of `File`. + +Other changes: + +* The internal storage of `File` objects inside a `Files` object has been reworked, so any plugins that choose to access `Files._files` will get a deprecation warning. + +* The order of `File` objects inside a `Files` collection is no longer significant when automatically inferring the `nav`. They get forcibly sorted according to the default alphabetic order. + +Context: #3451, #3463 + +### Hooks and debugging + +* Hook files can now import adjacent *.py files using the `import` statement. Previously this was possible to achieve only through a `sys.path` workaround. See the new mention in [documentation](../user-guide/configuration.md#hooks). Context: #3568 + +* Verbose `-v` log shows the sequence of plugin events in more detail - shows each invoked plugin one by one, not only the event type. Context: #3444 + +### Deprecations + +* Python 3.7 is no longer supported, Python 3.12 is officially supported. Context: #3429 + +* The theme config file `mkdocs_theme.yml` no longer executes YAML tags. Context: #3465 + +* The plugin event `on_page_read_source` is soft-deprecated because there is always a better alternative to it (see the new `File` API or just `on_page_markdown`, depending on the desired interaction). + + When multiple plugins/hooks apply this event handler, they trample over each other, so now there is a warning in that case. + + See [**documentation**](../dev-guide/plugins.md#on_page_read_source). Context: #3503 + +#### API deprecations + +* It is no longer allowed to set `File.page` to a type other than `Page` or a subclass thereof. Context: #3443 - following the deprecation in version 1.5.3 and #3381. + +* `Theme._vars` is deprecated - use `theme['foo']` instead of `theme._vars['foo']` + +* `utils`: `modified_time()`, `get_html_path()`, `get_url_path()`, `is_html_file()`, `is_template_file()` are removed. `path_to_url()` is deprecated. + +* `LiveReloadServer.watch()` no longer accepts a custom callback. + +Context: #3429 + +### Misc + +* The `sitemap.xml.gz` file is slightly more reproducible and no longer changes on every build, but instead only once per day (upon a date change). Context: #3460 + +Other small improvements; see [commit log](https://github.com/mkdocs/mkdocs/compare/1.5.3...1.6.0). + +## Version 1.5.3 (2023-09-18) + +* Fix `mkdocs serve` sometimes locking up all browser tabs when navigating quickly (#3390) + +* Add many new supported languages for "search" plugin - update lunr-languages to 1.12.0 (#3334) + +* Bugfix (regression in 1.5.0): In "readthedocs" theme the styling of "breadcrumb navigation" was broken for nested pages (#3383) + +* Built-in themes now also support Chinese (Traditional, Taiwan) language (#3154) + +* Plugins can now set `File.page` to their own subclass of `Page`. There is also now a warning if `File.page` is set to anything other than a strict subclass of `Page`. (#3367, #3381) + + Note that just instantiating a `Page` [sets the file automatically](https://github.com/mkdocs/mkdocs/blob/f94ab3f62d0416d484d81a0c695c8ca86ab3b975/mkdocs/structure/pages.py#L34), so care needs to be taken not to create an unneeded `Page`. + +Other small improvements; see [commit log](https://github.com/mkdocs/mkdocs/compare/1.5.2...1.5.3). + +## Version 1.5.2 (2023-08-02) + +* Bugfix (regression in 1.5.0): Restore functionality of `--no-livereload`. (#3320) + +* Bugfix (regression in 1.5.0): The new page title detection would sometimes be unable to drop anchorlinks - fix that. (#3325) + +* Partly bring back pre-1.5 API: `extra_javascript` items will once again be mostly strings, and only sometimes `ExtraScriptValue` (when the extra `script` functionality is used). + + Plugins should be free to append strings to `config.extra_javascript`, but when reading the values, they must still make sure to read it as `str(value)` in case it is an `ExtraScriptValue` item. For querying the attributes such as `.type` you need to check `isinstance` first. Static type checking will guide you in that. (#3324) + +See [commit log](https://github.com/mkdocs/mkdocs/compare/1.5.1...1.5.2). + +## Version 1.5.1 (2023-07-28) + +* Bugfix (regression in 1.5.0): Make it possible to treat `ExtraScriptValue` as a path. This lets some plugins still work despite the breaking change. + +* Bugfix (regression in 1.5.0): Prevent errors for special setups that have 3 conflicting files, such as `index.html`, `index.md` *and* `README.md` (#3314) + +See [commit log](https://github.com/mkdocs/mkdocs/compare/1.5.0...1.5.1). + +## Version 1.5.0 (2023-07-26) + +### New command `mkdocs get-deps` + +This command guesses the Python dependencies that a MkDocs site requires in order to build. It simply prints the PyPI packages that need to be installed. In the terminal it can be combined directly with an installation command as follows: + +```bash +pip install $(mkdocs get-deps) +``` + +The idea is that right after running this command, you can directly follow it up with `mkdocs build` and it will almost always "just work", without needing to think which dependencies to install. + +The way it works is by scanning `mkdocs.yml` for `themes:`, `plugins:`, `markdown_extensions:` items and doing a reverse lookup based on a large list of known projects (catalog, see below). + +Of course, you're welcome to use a "virtualenv" with such a command. Also note that for environments that require stability (for example CI) directly installing deps in this way is not a very reliable approach as it precludes dependency pinning. + +The command allows overriding which config file is used (instead of `mkdocs.yml` in the current directory) as well as which catalog of projects is used (instead of downloading it from the default location). See [`mkdocs get-deps --help`](../user-guide/cli.md#mkdocs-get-deps). + +Context: #3205 + +### MkDocs has an official catalog of plugins + +Check out and add all your general-purpose plugins, themes and extensions there, so that they can be looked up through `mkdocs get-deps`. + +This was renamed from "best-of-mkdocs" and received significant updates. In addition to `pip` installation commands, the page now shows the config boilerplate needed to add a plugin. + +### Expanded validation of links + +#### Validated links in Markdown + +> As you may know, within Markdown, MkDocs really only recognizes **relative** links that lead to another physical `*.md` document (or media file). This is a good convention to follow because then the source pages are also freely browsable without MkDocs, for example on GitHub. MkDocs knows that in the output it should turn those `*.md` links into `*.html` as appropriate, and it would also always tell you if such a link doesn't actually lead to an existing file. + +However, the checks for links were really loose and had many concessions. For example, links that started with `/` ("absolute") and links that *ended* with `/` were left as is and no warning was shown, which allowed such very fragile links to sneak into site sources: links that happen to work right now but get no validation and links that confusingly need an extra level of `..` with `use_directory_urls` enabled. + +Now, in addition to validating relative links, MkDocs will print `INFO` messages for unrecognized types of links (including absolute links). They look like this: + +```text +INFO - Doc file 'example.md' contains an absolute link '/foo/bar/', it was left as is. Did you mean 'foo/bar.md'? +``` + +If you don't want any changes, not even the `INFO` messages, and wish to revert to the silence from MkDocs 1.4, add the following configs to `mkdocs.yml` (**not** recommended): + +```yaml +validation: + absolute_links: ignore + unrecognized_links: ignore +``` + +If, on the opposite end, you want these to print `WARNING` messages and cause `mkdocs build --strict` to fail, you are recommended to configure these to `warn` instead. + +See [**documentation**](../user-guide/configuration.md#validation) for actual recommended settings and more details. Context: #3283 + +#### Validated links in the nav + +Links to documents in the [`nav` configuration](../user-guide/configuration.md#nav) now also have configurable validation, though with no changes to the defaults. + +You are welcomed to turn on validation for files that were forgotten and excluded from the nav. Example: + +```yaml +validation: + nav: + omitted_files: warn + absolute_links: warn +``` + +This can make the following message appear with the `WARNING` level (as opposed to `INFO` as the only option previously), thus being caught by `mkdocs --strict`: + +```text +INFO - The following pages exist in the docs directory, but are not included in the "nav" configuration: ... +``` + +See [**documentation**](../user-guide/configuration.md#validation). Context: #3283, #1755 + +#### Mark docs as intentionally "not in nav" + +There is a new config `not_in_nav`. With it, you can mark particular patterns of files as exempt from the above `omitted_files` warning type; no messages will be printed for them anymore. (As a corollary, setting this config to `*` is the same as ignoring `omitted_files` altogether.) + +This is useful if you generally like these warnings about files that were forgotten from the nav, but still have some pages that you knowingly excluded from the nav and just want to build and copy them. + +The `not_in_nav` config is a set of gitignore-like patterns. See the next section for an explanation of another such config. + +See [**documentation**](../user-guide/configuration.md#not_in_nav). Context: #3224, #1888 + +### Excluded doc files + +There is a new config `exclude_docs` that tells MkDocs to ignore certain files under `docs_dir` and *not* copy them to the built `site` as part of the build. + +Historically MkDocs would always ignore file names starting with a dot, and that's all. Now this is all configurable: you can un-ignore these and/or ignore more patterns of files. + +The `exclude_docs` config follows the [.gitignore pattern format](https://git-scm.com/docs/gitignore#_pattern_format) and is specified as a multiline YAML string. For example: + +```yaml +exclude_docs: | + *.py # Excludes e.g. docs/hooks/foo.py + /requirements.txt # Excludes docs/requirements.txt +``` + +Validation of links (described above) is also affected by `exclude_docs`. During `mkdocs serve` the messages explain the interaction, whereas during `mkdocs build` excluded files are as good as nonexistent. + +As an additional related change, if you have a need to have both `README.md` and `index.md` files in a directory but publish only one of them, you can now use this feature to explicitly ignore one of them and avoid warnings. + +See [**documentation**](../user-guide/configuration.md#exclude_docs). Context: #3224 + +#### Drafts + +> DANGER: **Dropped from version 1.6:** +> +> The `exclude_docs` config no longer applies the "drafts" functionality for `mkdocs serve`. This was renamed to [`draft_docs`](../user-guide/configuration.md#draft_docs). + +The `exclude_docs` config has another behavior: all excluded Markdown pages will still be previewable in `mkdocs serve` only, just with a "DRAFT" marker on top. Then they will of course be excluded from `mkdocs build` or `gh-deploy`. + +If you don't want `mkdocs serve` to have any special behaviors and instead want it to perform completely normal builds, use the new flag `mkdocs serve --clean`. + +See [**documentation**](../user-guide/configuration.md#exclude_docs). Context: #3224 + +### `mkdocs serve` no longer exits after build errors + +If there was an error (from the config or a plugin) during a site re-build, `mkdocs serve` used to exit after printing a stack trace. Now it will simply freeze the server until the author edits the files to fix the problem, and then will keep reloading. + +But errors on the *first* build still cause `mkdocs serve` to exit, as before. + +Context: #3255 + +### Page titles will be deduced from any style of heading + +MkDocs always had the ability to infer the title of a page (if it's not specified in the `nav`) based on the first line of the document, if it had a `

` heading that had to written starting with the exact character `#`. Now any style of Markdown heading is understood (#1886). Due to the previous simplistic parsing, it was also impossible to use `attr_list` attributes in that first heading (#3136). Now that is also fixed. + +### Markdown extensions can use paths relative to the current document + +This is aimed at extensions such as `pymdownx.snippets` or `markdown_include.include`: you can now specify their include paths to be relative to the currently rendered Markdown document, or relative to the `docs_dir`. Any other extension can of course also make use of the new `!relative` YAML tag. + +```yaml +markdown_extensions: + - pymdownx.snippets: + base_path: !relative +``` + +See [**documentation**](../user-guide/configuration.md#paths-relative-to-the-current-file-or-site). Context: #2154, #3258 + +### ` +> > {%- endfor %} +> > ``` +> > +> > This old-style example even uses the obsolete top-level `extra_javascript` list. Please always use `config.extra_javascript` instead. +> > +> > So, a slightly more modern approach is the following, but it is still obsolete because it ignores the extra attributes of the script: +> > +> > ```django +> > {%- for path in config.extra_javascript %} +> > +> > {%- endfor %} +> > ``` +> +> >? EXAMPLE: **New style:** +> > +> > ```django +> > {%- for script in config.extra_javascript %} +> > {{ script | script_tag }} +> > {%- endfor %} +> > ``` +> +> If you wish to be able to pick up the new customizations while keeping your theme compatible with older versions of MkDocs, use this snippet: +> +> >! EXAMPLE: **Backwards-compatible style:** +> > +> > ```django +> > {%- for script in config.extra_javascript %} +> > {%- if script.path %} {# Detected MkDocs 1.5+ which has `script.path` and `script_tag` #} +> > {{ script | script_tag }} +> > {%- else %} {# Fallback - examine the file name directly #} +> > +> > {%- endif %} +> > {%- endfor %} +> > ``` + +## Theme Files + +There are various files which a theme treats special in some way. Any other +files are simply copied from the theme directory to the same path in the +`site_dir` when the site it built. For example image and CSS files have no +special significance and are copied as-is. Note, however, that if the user +provides a file with the same path in their `docs_dir`, then the user's file +will replace the theme file. + +### Template Files + +Any files with the `.html` extension are considered to be template files and are +not copied from the theme directory or any subdirectories. Also, any files +listed in [static_templates] are treated as templates regardless of their file +extension. + +[static_templates]: #static_templates + +### Theme Meta Files + +The various files required for packaging a theme are also ignored. Specifically, +the `mkdocs_theme.yml` configuration file and any Python files. + +### Dot Files + +Theme authors can explicitly force MkDocs to ignore files by starting a file or +directory name with a dot. Any of the following files would be ignored: + +```text +.ignored.txt +.ignored/file.txt +foo/.ignored.txt +foo/.ignored/file.txt +``` + +### Documentation Files + +All documentation files are ignored. Specifically, any Markdown files (using any +of the file extensions supported by MKDocs). Additionally, any README files +which may exist in the theme directories are ignored. + +## Template Variables + +Each template in a theme is built with a template context. These are the +variables that are available to themes. The context varies depending on the +template that is being built. At the moment templates are either built with +the global context or with a page specific context. The global context is used +for HTML pages that don't represent an individual Markdown document, for +example a 404.html page or search.html. + +### Global Context + +The following variables are available globally on any template. + +#### config + +The `config` variable is an instance of MkDocs' config object generated from the +`mkdocs.yml` config file. While you can use any config option, some commonly +used options include: + +* [config.site_name](../user-guide/configuration.md#site_name) +* [config.site_url](../user-guide/configuration.md#site_url) +* [config.site_author](../user-guide/configuration.md#site_author) +* [config.site_description](../user-guide/configuration.md#site_description) +* [config.theme.locale](../user-guide/configuration.md#locale) (See also [Theme Configuration](#locale) below) +* [config.extra_javascript](../user-guide/configuration.md#extra_javascript) +* [config.extra_css](../user-guide/configuration.md#extra_css) +* [config.repo_url](../user-guide/configuration.md#repo_url) +* [config.repo_name](../user-guide/configuration.md#repo_name) +* [config.copyright](../user-guide/configuration.md#copyright) + +#### nav + +The `nav` variable is used to create the navigation for the documentation. The +`nav` object is an iterable of [navigation objects](#navigation-objects) as +defined by the [nav] configuration setting. + +[nav]: ../user-guide/configuration.md#nav + +::: mkdocs.structure.nav.Navigation + options: + show_root_heading: false + show_root_toc_entry: true + members: [] + heading_level: 4 + +In addition to the iterable of [navigation objects](#navigation-objects), the +`nav` object contains the following attributes: + +::: mkdocs.structure.nav.Navigation.homepage + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Navigation.pages + options: + show_root_full_path: false + heading_level: 5 + +This list is not necessarily a complete list of all site pages as it does not contain +pages which are not included in the navigation. This list does match the list +and order of pages used for all "next page" and "previous page" links. For a +list of all pages, use the [pages](#pages) template variable. + +##### Nav Example + +Following is a basic usage example which outputs the first and second level +navigation as a nested list. + +```django +{% if nav|length > 1 %} +
    + {% for nav_item in nav %} + {% if nav_item.children %} +
  • {{ nav_item.title }} + +
  • + {% else %} + + {% endif %} + {% endfor %} +
+{% endif %} +``` + +#### base_url + +The `base_url` provides a relative path to the root of the MkDocs project. While +this can be used directly by prepending it to a local relative URL, it is best +to use the [url](#url) template filter, which is smarter about how it applies +`base_url`. + +#### mkdocs_version + +Contains the current MkDocs version. + +#### build_date_utc + +A Python datetime object that represents the date and time the documentation +was built in UTC. This is useful for showing how recently the documentation +was updated. + +#### pages + +A flat list of `File` objects for *all* pages in the project. This list can +contain pages not included in the global [navigation](#nav) and may not match +the order of pages within that navigation. The [page](#page) object for each +`File` can be accessed from `file.page`. + +#### page + +In templates which are not rendered from a Markdown source file, the `page` +variable is `None`. In templates which are rendered from a Markdown source file, +the `page` variable contains a `page` object. The same `page` objects are used +as `page` [navigation objects](#navigation-objects) in the global +[navigation](#nav) and in the [pages](#pages) template variable. + +::: mkdocs.structure.pages.Page + options: + show_root_heading: false + show_root_toc_entry: true + members: [] + heading_level: 4 + +All `page` objects contain the following attributes: + +::: mkdocs.structure.pages.Page.title + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.content + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.toc + options: + show_root_full_path: false + heading_level: 5 + +The following example would display the top two levels of the Table of Contents +for a page. + +```django + +``` + +::: mkdocs.structure.pages.Page.meta + options: + show_root_full_path: false + heading_level: 5 + +In this example we define a `source` property above the page title: + +```text +source: generics.py + mixins.py + +# Page title + +Content... +``` + +A template can access this metadata for the page with the `meta.source` +variable. This could then be used to link to source files related to the +documentation page. + +```django +{% for filename in page.meta.source %} + + {{ filename }} + +{% endfor %} +``` + +::: mkdocs.structure.pages.Page.url + options: + show_root_full_path: false + heading_level: 5 + +It is expected that this be used with the [url](#url) filter to ensure the URL is relative to the current +page. + +```django +{{ page.title }} +``` + +::: mkdocs.structure.pages.Page.file + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.abs_url + options: + show_root_full_path: false + heading_level: 5 + +For example, if `site_url: https://example.com/`, then the value of +`page.abs_url` for the page `foo.md` would be `/foo/`. However, if +`site_url: https://example.com/bar/`, then the value of `page.abs_url` for the +page `foo.md` would be `/bar/foo/`. + +::: mkdocs.structure.pages.Page.canonical_url + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.edit_url + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.is_homepage + options: + show_root_full_path: false + heading_level: 5 + +This can be used in conjunction with other attributes of the `page` +object to alter the behavior. For example, to display a different title +on the homepage: + +```django +{% if not page.is_homepage %}{{ page.title }} - {% endif %}{{ site_name }} +``` + +::: mkdocs.structure.pages.Page.previous_page + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.next_page + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.StructureItem.parent + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.children + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.active + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.is_section + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.is_page + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.pages.Page.is_link + options: + show_root_full_path: false + heading_level: 5 + +#### AnchorLink + +::: mkdocs.structure.toc.AnchorLink + options: + show_root_heading: false + show_root_toc_entry: true + heading_level: 5 + +### Navigation Objects + +Navigation objects contained in the [nav](#nav) template variable may be one of +[section](#section) objects, [page](#page) objects, and [link](#link) objects. +While section objects may contain nested navigation objects, pages and links do +not. + +Page objects are the full page object as used for the current [page](#page) with +all of the same attributes available. Section and Link objects contain a subset +of those attributes as defined below: + +#### Section + +A `section` navigation object defines a named section in the navigation and +contains a list of child navigation objects. Note that sections do not contain +URLs and are not links of any kind. However, by default, MkDocs sorts index +pages to the top and the first child might be used as the URL for a section if a +theme chooses to do so. + +::: mkdocs.structure.nav.Section + options: + show_root_heading: false + show_root_toc_entry: true + members: [] + heading_level: 4 + +The following attributes are available on `section` objects: + +::: mkdocs.structure.nav.Section.title + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.StructureItem.parent + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Section.children + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Section.active + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Section.is_section + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Section.is_page + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Section.is_link + options: + show_root_full_path: false + heading_level: 5 + +#### Link + +A `link` navigation object contains a link which does not point to an internal +MkDocs page. + +::: mkdocs.structure.nav.Link + options: + show_root_heading: false + show_root_toc_entry: true + members: [] + heading_level: 4 + +The following attributes are available on `link` objects: + +::: mkdocs.structure.nav.Link.title + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Link.url + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.StructureItem.parent + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Link.children + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Link.active + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Link.is_section + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Link.is_page + options: + show_root_full_path: false + heading_level: 5 + +::: mkdocs.structure.nav.Link.is_link + options: + show_root_full_path: false + heading_level: 5 + +### Extra Context + +Additional variables can be passed to the template with the +[`extra`](../user-guide/configuration.md#extra) configuration option. This is a +set of key value pairs that can make custom templates far more flexible. + +For example, this could be used to include the project version of all pages +and a list of links related to the project. This can be achieved with the +following `extra` configuration: + +```yaml +extra: + version: 0.13.0 + links: + - https://github.com/mkdocs + - https://docs.readthedocs.org/en/latest/builds.html#mkdocs + - https://www.mkdocs.org/ +``` + +And then displayed with this HTML in the custom theme. + +```django +{{ config.extra.version }} + +{% if config.extra.links %} +
    + {% for link in config.extra.links %} +
  • {{ link }}
  • + {% endfor %} +
+{% endif %} +``` + +## Template Filters + +In addition to [Jinja's default filters], the following custom filters are +available to use in MkDocs templates: + +### url + +Normalizes a URL. Absolute URLs are passed through unaltered. If the URL is +relative and the template context includes a page object, then the URL is +returned relative to the page object. Otherwise, the URL is returned with +[base_url](#base_url) prepended. + +```django +{{ page.title }} +``` + +### tojson + +Safely convert a Python object to a value in a JavaScript script. + +```django + +``` + +### script_tag + +NEW: **New in version 1.5.** + +Convert an item from `extra_javascript` to a ` +``` + +With properly configured settings, the following HTML in a template will add a +full search implementation to your theme. + +```django +

Search Results

+ +
+ +
+ +
+ Sorry, page not found. +
+``` + +The JavaScript in the plugin works by looking for the specific ID's used in the +above HTML. The form input for the user to type the search query must be +identified with `id="mkdocs-search-query"` and the div where the results will be +placed must be identified with `id="mkdocs-search-results"`. + +The plugin supports the following options being set in the [theme's +configuration file], `mkdocs_theme.yml`: + +### include_search_page + +Determines whether the search plugin expects the theme to provide a dedicated +search page via a template located at `search/search.html`. + +When `include_search_page` is set to `true`, the search template will be built +and available at `search/search.html`. This method is used by the `readthedocs` +theme. + +When `include_search_page` is set to `false` or not defined, it is expected that +the theme provide some other mechanisms for displaying search results. For +example, the `mkdocs` theme displays results on any page via a modal. + +### search_index_only + +Determines whether the search plugin should only generate a search index or a +complete search solution. + +When `search_index_only` is set to `false`, then the search plugin modifies the +Jinja environment by adding its own `templates` directory (with a lower +precedence than the theme) and adds its scripts to the `extra_javascript` config +setting. + +When `search_index_only` is set to `true` or not defined, the search plugin +makes no modifications to the Jinja environment. A complete solution using the +provided index file is the responsibility of the theme. + +The search index is written to a JSON file at `search/search_index.json` in the +[site_dir]. The JSON object contained within the file may contain up to three +objects. + +```json +{ + config: {...}, + docs: [...], + index: {...} +} +``` + +If present, the `config` object contains the key/value pairs of config options +defined for the plugin in the user's `mkdocs.yml` config file under +`plugings.search`. The `config` object was new in MkDocs version *1.0*. + +The `docs` object contains a list of document objects. Each document object is +made up of a `location` (URL), a `title`, and `text` which can be used to create +a search index and/or display search results. + +If present, the `index` object contains a pre-built index which offers +performance improvements for larger sites. Note that the pre-built index is only +created if the user explicitly enables the [prebuild_index] config option. +Themes should expect the index to not be present, but can choose to use the +index when it is available. The `index` object was new in MkDocs version *1.0*. + +[Jinja2 template]: https://jinja.palletsprojects.com/ +[built-in themes]: https://github.com/mkdocs/mkdocs/tree/master/mkdocs/themes +[theme's configuration file]: #theme-configuration +[lunr.js]: https://lunrjs.com/ +[site_dir]: ../user-guide/configuration.md#site_dir +[prebuild_index]: ../user-guide/configuration.md#prebuild_index +[Jinja's default filters]: https://jinja.palletsprojects.com/en/latest/templates/#builtin-filters + +## Packaging Themes + +MkDocs makes use of [Python packaging] to distribute themes. This comes with a +few requirements. + +To see an example of a package containing one theme, see the [MkDocs Bootstrap +theme] and to see a package that contains many themes, see the [MkDocs +Bootswatch theme]. + +NOTE: +It is not strictly necessary to package a theme, as the entire theme +can be contained in the `custom_dir`. If you have created a "one-off theme," +that should be sufficient. However, if you intend to distribute your theme +for others to use, packaging the theme has some advantages. By packaging +your theme, your users can more easily install it, they can rely on a default +[configuration] being defined, and they can then take advantage of the +[custom_dir] to make tweaks to your theme to better suit their needs. + +[Python packaging]: https://packaging.python.org/en/latest/ +[MkDocs Bootstrap theme]: https://mkdocs.github.io/mkdocs-bootstrap/ +[MkDocs Bootswatch theme]: https://mkdocs.github.io/mkdocs-bootswatch/ + +### Package Layout + +The following layout is recommended for themes. Two files at the top level +directory called `MANIFEST.in` and `setup.py` beside the theme directory which +contains an empty `__init__.py` file, a theme configuration file +(`mkdocs_theme.yml`), and your template and media files. + +```text +. +|-- MANIFEST.in +|-- theme_name +| |-- __init__.py +| |-- mkdocs_theme.yml +| |-- main.html +| |-- styles.css +`-- setup.py +``` + +The `MANIFEST.in` file should contain the following contents but with +theme_name updated and any extra file extensions added to the include. + +```text +recursive-include theme_name *.ico *.js *.css *.png *.html *.eot *.svg *.ttf *.woff +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] +``` + +The `setup.py` should include the following text with the modifications +described below. + +```python +from setuptools import setup, find_packages + +VERSION = '0.0.1' + +setup( + name="mkdocs-themename", + version=VERSION, + url='', + license='', + description='', + author='', + author_email='', + packages=find_packages(), + include_package_data=True, + entry_points={ + 'mkdocs.themes': [ + 'themename = theme_name', + ] + }, + zip_safe=False +) +``` + +Fill in the URL, license, description, author and author email address. + +The name should follow the convention `mkdocs-themename` (like +`mkdocs-bootstrap` and `mkdocs-bootswatch`), starting with MkDocs, using +hyphens to separate words and including the name of your theme. + +Most of the rest of the file can be left unedited. The last section we need to +change is the entry_points. This is how MkDocs finds the theme(s) you are +including in the package. The name on the left is the one that users will use +in their mkdocs.yml and the one on the right is the directory containing your +theme files. + +The directory you created at the start of this section with the main.html file +should contain all of the other theme files. The minimum requirement is that +it includes a `main.html` for the theme. It **must** also include a +`__init__.py` file which should be empty, this file tells Python that the +directory is a package. + +### Theme Configuration + +A packaged theme is required to include a configuration file named +`mkdocs_theme.yml` which is placed in the root of your template files. The file +should contain default configuration options for the theme. However, if the +theme offers no configuration options, the file is still required and can be +left blank. A theme which is not packaged does not need a `mkdocs_theme.yml` +file as that file is not loaded from `theme.custom_dir`. + +The theme author is free to define any arbitrary options deemed necessary and +those options will be made available in the templates to control behavior. +For example, a theme might want to make a sidebar optional and include the +following in the `mkdocs_theme.yml` file: + +```yaml +show_sidebar: true +``` + +Then in a template, that config option could be referenced: + +```django +{% if config.theme.show_sidebar %} + +{% endif %} +``` + +And the user could override the default in their project's `mkdocs.yml` config +file: + +```yaml +theme: + name: themename + show_sidebar: false +``` + +In addition to arbitrary options defined by the theme, MkDocs defines a few +special options which alters its behavior: + +> BLOCK: +> +> #### locale +> +> This option mirrors the [theme] config option of the same name. If this +> value is not defined in the `mkdocs_theme.yml` file and the user does not +> set it in `mkdocs.yml` then it will default to `en` (English). The value +> is expected to match the language used in the text provided by the theme +> (such a "next" and "previous" links) and should be used as the value of +> the `` tag's `lang` attribute. See [Supporting theme localization/ +> translation](#supporting-theme-localizationtranslation) for more +> information. +> +> Note that during configuration validation, the provided string is converted +> to a `Locale` object. The object contains `Locale.language` and +> `Locale.territory` attributes and will resolve as a string from within a +> template. Therefore, the following will work fine: +> +> ```html +> +> ``` +> +> If the locale was set to `fr_CA` (Canadian French), then the above template +> would render as: +> +> ```html +> +> ``` +> +> If you did not want the territory attribute to be included, then reference +> the `language` attribute directly: +> +> ```html +> +> ``` +> +> That would render as: +> +> ```html +> +> ``` +> +> #### static_templates +> +> This option mirrors the [theme] config option of the same name and allows +> some defaults to be set by the theme. Note that while the user can add +> templates to this list, the user cannot remove templates included in the +> theme's config. +> +> #### extends +> +> Defines a parent theme that this theme inherits from. The value should be +> the string name of the parent theme. Normal [Jinja inheritance rules] +> apply. + +Plugins may also define some options which allow the theme to inform a plugin +about which set of plugin options it expects. See the documentation for any +plugins you may wish to support in your theme. + +### Distributing Themes + +With the above changes, your theme should now be ready to install. This can be +done with pip, using `pip install .` if you are still in the same directory as +the setup.py. + +Most Python packages, including MkDocs, are distributed on PyPI. To do this, +you should run the following command. + +```bash +python setup.py register +``` + +If you don't have an account setup, you should be prompted to create one. + +For a much more detailed guide, see the official Python packaging +documentation for [Packaging and Distributing Projects]. + +[Packaging and Distributing Projects]: https://packaging.python.org/en/latest/distributing/ +[Jinja inheritance rules]: https://jinja.palletsprojects.com/en/latest/templates/#template-inheritance + +## Supporting theme Localization/Translation + +While the built-in themes provide support for [localization/translation] of +templates, custom themes and third-party themes may choose not to. Regardless, +the [`locale`](#locale) setting of the `theme` configuration option is always +present and is relied upon by other parts of the system. Therefore, it is +recommended that all third-party themes use the same setting for designating a +language regardless of the system they use for translation. In that way, users +will experience consistent behavior regardless of the theme they may choose. + +The method for managing translations is up to the developers of a theme. +However, if a theme developer chooses to use the same mechanisms used by the +built-in themes, the sections below outline how to enable and make use of the +same commands utilized by MkDocs. + +[localization/translation]: ../user-guide/localizing-your-theme.md + +### Using the Localization/Translation commands + +WARNING: +As **[pybabel] is not installed by default** and most users will not have +pybabel installed, theme developers and/or translators should make sure to +have installed the necessary dependencies +(using `pip install 'mkdocs[i18n]'`) in order for the commands to be +available for use. + +The translation commands should be called from the root of your theme's working tree. + +For an overview of the workflow used by MkDocs to translate the built-in +themes, see the appropriate [section] of the Contributing Guide and the +[Translation Guide]. + +[pybabel]: https://babel.pocoo.org/en/latest/setup.html +[section]: ../about/contributing.md#submitting-changes-to-the-builtin-themes +[Translation Guide]: translations.md + +### Example custom theme Localization/Translation workflow + +> NOTE: If your theme inherits from an existing theme which already provides +> translation catalogs, your theme's translations will be merged with the +> parent theme's translations during a MkDocs build. +> +> This means that you only need to concentrate on the added translations. +> Yet, you will still benefit from the translations of the parent theme. At +> the same time, you may override any of parent theme's translations! + +Let's suppose that you're working on your own fork of the +[mkdocs-basic-theme][basic theme] and want to add translations to it. + +Edit the templates by wrapping text in your HTML sources with +`{% trans %}` and `{% endtrans %}` as follows: + +```diff +--- a/basic_theme/base.html ++++ b/basic_theme/base.html +@@ -88,7 +88,7 @@ + + + +-

This is an example theme for MkDocs.

++

{% trans %}This is an example theme for MkDocs.{% endtrans %}

+ +

+ It is designed to be read by looking at the theme HTML which is heavily +``` + +Then you would follow the [Translation Guide] as usual to get your translations +running. + +### Packaging Translations with your theme + +While the Portable Object Template (`pot`) file created by the +`extract_messages` command and the Portable Object (`po`) files created by the +`init_catalog` and `update_catalog` commands are useful for creating and +editing translations, they are not used by MkDocs directly and do not need to +be included in a packaged release of a theme. When MkDocs builds a site with +translations, it only makes use of the binary `mo` files(s) for the specified +locale. Therefore, when [packaging a theme], make sure to include it in the +"wheels", using a `MANIFEST.in` file or otherwise. + +Then, before building your Python package, you will want to ensure that the +binary `mo` file for each locale is up-to-date by running the `compile_catalog` +command for each locale. MkDocs expects the binary `mo` files to be located at +`locales//LC_MESSAGES/messages.mo`, which the `compile_catalog` +command automatically does for you. See [Testing theme translations] for +details. + +NOTE: +As outlined in our [Translation Guide], the MkDocs project has chosen to +include the `pot` and `po` files in our code repository, but not the +`mo` files. This requires us to always run `compile_catalog` before +packaging a new release regardless of whether any changes were made to a +translation or not. However, you may chose an alternate workflow for your +theme. At a minimum, you need to ensure that up-to-date `mo` files are +included at the correct location in each release. However, you may use a +different process for generating those `mo` files if you chose to do so. + +[packaging a theme]: #packaging-themes +[Testing theme translations]: translations.md#testing-theme-translations diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/dev-guide/translations.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/dev-guide/translations.md new file mode 100644 index 0000000..4c408b2 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/dev-guide/translations.md @@ -0,0 +1,221 @@ +# Translations + +Theme localization guide. + +--- + +The [built-in themes] that are included with MkDocs provide support for +translations. This is a guide for translators, which documents the process for +contributing new translations and/or updating existing translations. For +guidance on modifying the existing themes, see the [Contributing Guide][update +themes]. To enable a specific translation see the documentation about the +specific theme you are using in the [User Guide][built-in themes]. For +translations of third-party themes, please see the documentation for those +themes. For a third-party theme to make use of MkDocs' translation tools and +methods, that theme must be properly [configured] to make use of those tools. + +NOTE: +Translations only apply to text contained within a theme's template, such +as "next" and "previous" links. The Markdown content of a page is not +translated. If you wish to create multilingual documentation, you need to +combine theme localization with a third-party +internationalization/localization plugin. + +[built-in themes]: ../user-guide/choosing-your-theme.md +[update themes]: ../about/contributing.md#submitting-changes-to-the-builtin-themes +[configured]: themes.md#supporting-theme-localizationtranslation + +## Localization tooling prerequisites + +Theme localization makes use of the [babel][babel] project for generation and +compilation of localization files. You will need to be working from the +git working tree on your local machine to make use of the translation commands. + +See the [Contributing Guide] for direction on how to [Install for Development] +and [Submit a Pull Request]. The instructions in this document assume that you +are working from a properly configured development environment. + +Make sure translation requirements are installed in your environment: + +```bash +pip install 'mkdocs[i18n]' +``` + +[babel]: https://babel.pocoo.org/en/latest/cmdline.html +[Contributing Guide]: ../about/contributing.md +[Install for Development]: ../about/contributing.md#installing-for-development +[Submit a Pull Request]: ../about/contributing.md#submitting-pull-requests + +## Adding language translations to themes + +If your favorite language locale is not yet supported on one (or both) of the +built-in themes (`mkdocs` and `readthedocs`), you can easily contribute a +translation by following the steps below. + +Here is a quick summary of what you'll need to do: + +1. [Fork and clone the MkDocs repository](#fork-and-clone-the-mkdocs-repository) and then [install MkDocs for development](../about/contributing.md#installing-for-development) for adding and testing translations. +2. [Initialize new localization catalogs](#initializing-the-localization-catalogs) for your language (if a translation for your locale already exists, follow the instructions for [updating theme localization files](#updating-the-translation-catalogs) instead). +3. [Add a translation](#translating-the-mkdocs-themes) for every text placeholder in the localized catalogs. +4. [Locally serve and test](#testing-theme-translations) the translated themes for your language. +5. [Update the documentation](#updating-theme-documentation) about supported translations for each translated theme. +6. [Contribute your translation](#contributing-translations) through a Pull Request. + +NOTE: +Translation locales are usually identified using the [ISO-639-1] (2-letter) +language codes. While territory/region/county codes are also supported, +location specific translations should only be added after the general +language translation has been completed and the regional dialect requires +use of a term which differs from the general language translation. + +[ISO-639-1]: https://en.wikipedia.org/wiki/ISO_639-1 + +### Fork and clone the MkDocs repository + +In the following steps you'll work with a fork of the MkDocs repository. Follow +the instructions for [forking and cloning the MkDocs +repository](../about/contributing.md#installing-for-development). + +To test the translations you also need to [install MkDocs for +development](../about/contributing.md#installing-for-development) from your fork. + +### Initializing the localization catalogs + +The templates for each theme contain text placeholders that have been extracted +into a Portable Object Template (`messages.pot`) file, which is present in each +theme's folder. + +Initializing a catalog consists of running a command which will create a +directory structure for your desired language and prepare a Portable Object +(`messages.po`) file derived from the `pot` file of the theme. + +Use the `init_catalog` command on each theme's directory and provide the appropriate language code (`-l `). + +The language code is almost always just two lowercase letters, such as `sv`, but in some cases it needs to be further disambiguated. + +See: + +* [Already translated languages for built-in themes](../user-guide/choosing-your-theme.md#mkdocs-locale) +* [ISO 639 Language List](https://www.localeplanet.com/icu/iso639.html) +* [Language subtag registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry) + +In particular, the way to know that the `pt` language should be disambiguated as `pt_PT` and `pt_BR` is that the *Language subtag registry* page contains `pt-` if you search for it. Whereas `sv` should remain just `sv`, because that page does *not* contain `sv-`. + +So, if we pick `es` (Spanish) as our example language code, to add a translation for it to both built-in themes, run these commands: + +```bash +pybabel init --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l es +pybabel init --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l es +``` + +The above command will create a file structure as follows: + +```text +mkdocs/themes/mkdocs/locales +├── es +│   └── LC_MESSAGES +│   └── messages.po +``` + +You can now move on to the next step and [add a +translation](#translating-the-mkdocs-themes) for every text placeholder in the +localized catalog. + +## Updating a theme translation + +If a theme's `messages.pot` template file has been [updated][update themes] +since the `messages.po` was last updated for your locale, follow the steps +below to update the theme's `messages.po` file: + +1. [Update the theme's translation catalog](#updating-the-translation-catalogs) to refresh the translatable text placeholders of each theme. +2. [Translate](#translating-the-mkdocs-themes) the newly added translatable text placeholders on every `messages.po` catalog file language you can. +3. [Locally serve and test](#testing-theme-translations) the translated themes for your language. +4. [Contribute your translation](#contributing-translations) through a Pull Request. + +### Updating the translation catalogs + +This step should be completed after a theme template have been [updated][update +themes] for each language that you are comfortable contributing a translation +for. + +To update the `fr` translation catalog of both built-in themes, use the following commands: + +```bash +pybabel update --ignore-obsolete --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l fr +pybabel update --ignore-obsolete --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l fr +``` + +You can now move on to the next step and [add a translation] for every updated +text placeholder in the localized catalog. + +[add a translation]: #translating-the-mkdocs-themes + +### Translating the MkDocs themes + +Now that your localized `messages.po` files are ready, all you need to do is +add a translation in each `msgstr` item for each `msgid` item in the file. + +```text +msgid "Next" +msgstr "Siguiente" +``` + +WARNING: +Do not modify the `msgid` as it is common to all translations. Just add +its translation in the `msgstr` item. + +Once you have finished translating all of the terms listed in the `po` file, +you'll want to [test your localized theme](#testing-theme-translations). + +### Testing theme translations + +To test a theme with translations, you need to first compile the `messages.po` +files of your theme into `messages.mo` files. The following commands will compile +the `es` translation for both built-in themes: + +```bash +pybabel compile --statistics --directory mkdocs/themes/mkdocs/locales -l es +pybabel compile --statistics --directory mkdocs/themes/readthedocs/locales -l es +``` + +The above command results in the following file structure: + +```text +mkdocs/themes/mkdocs/locales +├── es +│   └── LC_MESSAGES +│   ├── messages.mo +│   └── messages.po +``` + +Note that the compiled `messages.mo` file was generated based on the +`messages.po` file that you just edited. + +Then modify the `mkdocs.yml` file at the root of the project to test the new +and/or updated locale: + +```yaml +theme: + name: mkdocs + locale: es +``` + +Finally, run `mkdocs serve` to check out your new localized version of the theme. + +> NOTE: +> The build and release process takes care of compiling and distributing +> all locales to end users so you only have to worry about contributing the +> actual text translation `messages.po` files (the rest is ignored by git). +> +> After you have finished testing your work, be sure to undo the change to +> the `locale` setting in the `mkdocs.yml` file before submitting your +> changes. + +## Updating theme documentation + +The page [Choosing your theme](../user-guide/choosing-your-theme.md) updates by itself with all available locale options. + +## Contributing translations + +It is now time for you to [contribute](../about/contributing.md) your nice work +to the project. Thank you! diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/getting-started.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/getting-started.md new file mode 100644 index 0000000..490b95d --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/getting-started.md @@ -0,0 +1,213 @@ +# Getting Started with MkDocs + +An introductory tutorial! + +--- + +## Installation + +To install MkDocs, run the following command from the command line: + +```bash +pip install mkdocs +``` + +For more details, see the [Installation Guide]. + +## Creating a new project + +Getting started is super easy. To create a new project, run the following +command from the command line: + +```bash +mkdocs new my-project +cd my-project +``` + +Take a moment to review the initial project that has been created for you. + +![The initial MkDocs layout](img/initial-layout.png) + +There's a single configuration file named `mkdocs.yml`, and a folder named +`docs` that will contain your documentation source files (`docs` is +the default value for the [docs_dir] configuration setting). Right now the `docs` +folder just contains a single documentation page, named `index.md`. + +MkDocs comes with a built-in dev-server that lets you preview your documentation +as you work on it. Make sure you're in the same directory as the `mkdocs.yml` +configuration file, and then start the server by running the `mkdocs serve` +command: + +```console +$ mkdocs serve +INFO - Building documentation... +INFO - Cleaning site directory +INFO - Documentation built in 0.22 seconds +INFO - [15:50:43] Watching paths for changes: 'docs', 'mkdocs.yml' +INFO - [15:50:43] Serving on http://127.0.0.1:8000/ +``` + +Open up in your browser, and you'll see the default +home page being displayed: + +![The MkDocs live server](img/screenshot.png) + +The dev-server also supports auto-reloading, and will rebuild your documentation +whenever anything in the configuration file, documentation directory, or theme +directory changes. + +Open the `docs/index.md` document in your text editor of choice, change the +initial heading to `MkLorum`, and save your changes. Your browser will +auto-reload and you should see your updated documentation immediately. + +Now try editing the configuration file: `mkdocs.yml`. Change the +[`site_name`][site_name] setting to `MkLorum` and save the file. + +```yaml +site_name: MkLorum +``` + +Your browser should immediately reload, and you'll see your new site name take +effect. + +![The site_name setting](img/site-name.png) + +NOTE: +The [`site_name`][site_name] configuration +option is the only required option in your configuration file. + +## Adding pages + +Now add a second page to your documentation: + +```bash +curl 'https://jaspervdj.be/lorem-markdownum/markdown.txt' > docs/about.md +``` + +As our documentation site will include some navigation headers, you may want to +edit the configuration file and add some information about the order, title, and +nesting of each page in the navigation header by adding a [`nav`][nav] +setting: + +```yaml +site_name: MkLorum +nav: + - Home: index.md + - About: about.md +``` + +Save your changes and you'll now see a navigation bar with `Home` and `About` +items on the left as well as `Search`, `Previous`, and `Next` items on the +right. + +![Screenshot](img/multipage.png) + +Try the menu items and navigate back and forth between pages. Then click on +`Search`. A search dialog will appear, allowing you to search for any text on +any page. Notice that the search results include every occurrence of the search +term on the site and links directly to the section of the page in which the +search term appears. You get all of that with no effort or configuration on your +part! + +![Screenshot](img/search.png) + +## Theming our documentation + +Now change the configuration file to alter how the documentation is displayed by +changing the theme. Edit the `mkdocs.yml` file and add a [`theme`][theme] setting: + +```yaml +site_name: MkLorum +nav: + - Home: index.md + - About: about.md +theme: readthedocs +``` + +Save your changes, and you'll see the ReadTheDocs theme being used. + +![Screenshot](img/readthedocs.png) + +## Changing the Favicon Icon + +By default, MkDocs uses the [MkDocs favicon] icon. To use a different icon, create +an `img` subdirectory in the `docs` directory and copy your custom `favicon.ico` +file to that directory. MkDocs will automatically detect and use that file as your +favicon icon. + +[MkDocs favicon]: img/favicon.ico + +## Building the site + +That's looking good. You're ready to deploy the first pass of your `MkLorum` +documentation. First build the documentation: + +```bash +mkdocs build +``` + +This will create a new directory, named `site`. Take a look inside the +directory: + +```console +$ ls site +about fonts index.html license search.html +css img js mkdocs sitemap.xml +``` + +Notice that your source documentation has been output as two HTML files named +`index.html` and `about/index.html`. You also have various other media that's +been copied into the `site` directory as part of the documentation theme. You +even have a `sitemap.xml` file and `mkdocs/search_index.json`. + +If you're using source code control such as `git` you probably don't want to +check your documentation builds into the repository. Add a line containing +`site/` to your `.gitignore` file. + +```bash +echo "site/" >> .gitignore +``` + +If you're using another source code control tool you'll want to check its +documentation on how to ignore specific directories. + +## Other Commands and Options + +There are various other commands and options available. For a complete list of +commands, use the `--help` flag: + +```bash +mkdocs --help +``` + +To view a list of options available on a given command, use the `--help` flag +with that command. For example, to get a list of all options available for the +`build` command run the following: + +```bash +mkdocs build --help +``` + +## Deploying + +The documentation site that you just built only uses static files so you'll be +able to host it from pretty much anywhere. Simply upload the contents of the +entire `site` directory to wherever you're hosting your website from and +you're done. For specific instructions on a number of common hosts, see the +[Deploying your Docs][deploy] page. + +## Getting help + +See the [User Guide] for more complete documentation of all of MkDocs' features. + +To get help with MkDocs, please use the [GitHub discussions] or [GitHub issues]. + +[Installation Guide]: user-guide/installation.md +[docs_dir]: user-guide/configuration.md#docs_dir +[deploy]: user-guide/deploying-your-docs.md +[nav]: user-guide/configuration.md#nav +[GitHub discussions]: https://github.com/mkdocs/mkdocs/discussions +[GitHub issues]: https://github.com/mkdocs/mkdocs/issues +[site_name]: user-guide/configuration.md#site_name +[theme]: user-guide/configuration.md#theme +[User Guide]: user-guide/README.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/hooks.py b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/hooks.py new file mode 100644 index 0000000..15e52db --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/hooks.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import re +from pathlib import Path +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from mkdocs.config.defaults import MkDocsConfig + from mkdocs.structure.nav import Page + + +def _get_language_of_translation_file(path: Path) -> str: + with path.open(encoding='utf-8') as f: + translation_line = f.readline() + m = re.search('^# (.+) translations ', translation_line) + assert m + return m[1] + + +def on_page_markdown(markdown: str, page: Page, config: MkDocsConfig, **kwargs) -> str | None: + if page.file.src_uri == 'user-guide/choosing-your-theme.md': + here = Path(config.config_file_path).parent + + def replacement(m: re.Match) -> str: + lines = [] + for d in sorted(here.glob(m[2])): + lang = _get_language_of_translation_file(Path(d, 'LC_MESSAGES', 'messages.po')) + lines.append(f'{m[1]}`{d.name}`: {lang}') + return '\n'.join(lines) + + return re.sub( + r'^( *\* )\(see the list of existing directories `(.+)`\)$', + replacement, + markdown, + flags=re.MULTILINE, + ) diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/color_mode_toggle_menu.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/color_mode_toggle_menu.png new file mode 100644 index 0000000..684c3d6 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/color_mode_toggle_menu.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/initial-layout.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/initial-layout.png new file mode 100644 index 0000000..e11b424 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/initial-layout.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/mkdocs_theme_dark_mode.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/mkdocs_theme_dark_mode.png new file mode 100644 index 0000000..f69b999 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/mkdocs_theme_dark_mode.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/mkdocs_theme_light_mode.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/mkdocs_theme_light_mode.png new file mode 100644 index 0000000..91a9705 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/mkdocs_theme_light_mode.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/multipage.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/multipage.png new file mode 100644 index 0000000..57fcbe8 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/multipage.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/plugin-events.py b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/plugin-events.py new file mode 100644 index 0000000..0ad1f98 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/plugin-events.py @@ -0,0 +1,171 @@ +# Run this to re-generate 'plugin-events.svg'. +# Requires `pip install graphviz`. + +import contextlib +import pathlib +import re + +from graphviz import Digraph + +graph = Digraph("MkDocs", format="svg") +graph.attr(compound="true", bgcolor="transparent") +graph.graph_attr.update(fontname="inherit", tooltip=" ") +graph.node_attr.update(fontname="inherit", tooltip=" ", style="filled") +graph.edge_attr.update(fontname="inherit", tooltip=" ") + + +def strip_suffix(name): + return re.sub(r"_.$", "", name) + + +subgraph_to_first_node = {} +subgraph_to_last_node = {} + + +def node(g, name, **kwargs): + if "_point" in name: + kwargs.setdefault("shape", "point") + else: + kwargs.setdefault("fillcolor", "#77ff7788") + kwargs.setdefault("color", "#00000099") + kwargs.setdefault("label", strip_suffix(name)) + + g.node(name, **kwargs) + + subgraph_to_first_node.setdefault(g.name, name) + subgraph_to_last_node[g.name] = name + + +def edge(g, a, b, dashed=False, **kwargs): + if kwargs.get("style") == "dashed": + kwargs.setdefault("penwidth", "1.5") + + if a in subgraph_to_last_node: + kwargs.setdefault("ltail", a) + a = subgraph_to_last_node[a] + if b in subgraph_to_first_node: + kwargs.setdefault("lhead", b) + b = subgraph_to_first_node[b] + + if a.startswith(("on_", "placeholder_")): + a += ":s" + else: + node(g, a.split(":")[0]) + if b.startswith(("on_", "placeholder_")): + b += ":n" + else: + node(g, b.split(":")[0]) + + g.edge(a, b, **kwargs) + + +def ensure_order(a, b): + edge(graph, a, b, style="invis") + + +@contextlib.contextmanager +def cluster(g, name, **kwargs): + assert name.startswith("cluster_") + kwargs.setdefault("label", strip_suffix(name)[len("cluster_") :]) + kwargs.setdefault("bgcolor", "#dddddd55") + kwargs.setdefault("pencolor", "#00000066") + with g.subgraph(name=name) as c: + c.attr(**kwargs) + yield c + + +def event(g, name, parameters): + with cluster( + g, f"cluster_{name}", href=f"#{name}", bgcolor="#ffff3388", pencolor="#00000088" + ) as c: + label = "|".join(f"<{p}>{p}" for p in parameters.split()) + node(c, name, shape="record" if parameters else "point", label=label, fillcolor="#ffffff55") + + +def placeholder_cluster(g, name): + with cluster(g, name) as c: + node(c, f"placeholder_{name}", label="...", fillcolor="transparent", color="transparent") + + +event(graph, "on_startup", "command dirty") + +with cluster(graph, "cluster_build", bgcolor="#dddddd11") as g: + event(g, "on_config", "config") + event(g, "on_pre_build", "config") + event(g, "on_files", "files config") + event(g, "on_nav", "nav config files") + + edge(g, "load_config", "on_config:config") + edge(g, "on_config:config", "on_pre_build:config") + edge(g, "on_config:config", "get_files") + edge(g, "get_files", "on_files:files") + edge(g, "on_files:files", "get_nav") + edge(g, "get_nav", "on_nav:nav") + edge(g, "on_files:files", "on_nav:files") + + with cluster(g, "cluster_populate_page") as c: + event(c, "on_pre_page", "page config files") + event(c, "on_page_read_source", "page config") + event(c, "on_page_markdown", "markdown page config files") + event(c, "on_page_content", "html page config files") + + edge(c, "on_pre_page:page", "on_page_read_source:page", style="dashed") + edge(c, "cluster_on_page_read_source", "on_page_markdown:markdown", style="dashed") + edge(c, "on_page_markdown:markdown", "render_p", style="dashed") + edge(c, "render_p", "on_page_content:html", style="dashed") + + edge(g, "on_nav:files", "pages_point_a", arrowhead="none") + edge(g, "pages_point_a", "on_pre_page:page", style="dashed") + edge(g, "pages_point_a", "cluster_populate_page") + + for i in 2, 3: + placeholder_cluster(g, f"cluster_populate_page_{i}") + edge(g, "pages_point_a", f"cluster_populate_page_{i}", style="dashed") + edge(g, f"cluster_populate_page_{i}", "pages_point_b", style="dashed") + + event(g, "on_env", "env config files") + + edge(g, "on_page_content:html", "pages_point_b", style="dashed") + edge(g, "pages_point_b", "on_env:files") + + edge(g, "pages_point_b", "pages_point_c", arrowhead="none") + edge(g, "pages_point_c", "on_page_context:page", style="dashed") + + with cluster(g, "cluster_build_page") as c: + event(c, "on_page_context", "context page config nav") + event(c, "on_post_page", "output page config") + + edge(c, "get_context", "on_page_context:context") + edge(c, "on_page_context:context", "render") + edge(c, "get_template", "render") + edge(c, "render", "on_post_page:output") + edge(c, "on_post_page:output", "write_file") + + edge(g, "on_nav:nav", "cluster_build_page") + edge(g, "on_env:env", "cluster_build_page") + + for i in 2, 3: + placeholder_cluster(g, f"cluster_build_page_{i}") + edge(g, "pages_point_c", f"cluster_build_page_{i}", style="dashed") + + event(g, "on_post_build", "config") + +event(graph, "on_serve", "server config") +event(graph, "on_shutdown", "") + + +ensure_order("on_startup", "cluster_build") +ensure_order("on_pre_build", "on_files") +ensure_order("on_nav", "cluster_populate_page") +ensure_order("cluster_populate_page_2", "cluster_populate_page_3") +ensure_order("on_page_content", "on_env") +ensure_order("pages_point_c", "cluster_build_page") +ensure_order("cluster_build_page_2", "cluster_build_page_3") +ensure_order("cluster_build_page", "on_post_build") +ensure_order("on_post_build", "on_serve") +ensure_order("on_serve", "on_shutdown") + + +data = graph.pipe() +data = data[data.index(b" + +MkDocs + + + + +cluster_on_startup + + +on_startup + + + + +cluster_build + + +build + + + + +cluster_on_config + + +on_config + + + + +cluster_on_pre_build + + +on_pre_build + + + + +cluster_on_files + + +on_files + + + + +cluster_on_nav + + +on_nav + + + + +cluster_populate_page + + +populate_page + + + + +cluster_on_pre_page + + +on_pre_page + + + + +cluster_on_page_read_source + + +on_page_read_source + + + + +cluster_on_page_markdown + + +on_page_markdown + + + + +cluster_on_page_content + + +on_page_content + + + + +cluster_on_env + + +on_env + + + + +cluster_populate_page_2 + + +populate_page + + + + +cluster_populate_page_3 + + +populate_page + + + + +cluster_build_page + + +build_page + + + + +cluster_on_page_context + + +on_page_context + + + + +cluster_on_post_page + + +on_post_page + + + + +cluster_build_page_2 + + +build_page + + + + +cluster_build_page_3 + + +build_page + + + + +cluster_on_post_build + + +on_post_build + + + + +cluster_on_serve + + +on_serve + + + + +cluster_on_shutdown + + +on_shutdown + + + + + +on_startup + + +command + +dirty + + + + + +load_config + + +load_config + + + + + + +on_config + + +config + + + + + +on_pre_build + + +config + + + + + +on_config:s->on_pre_build:n + + + + + + + + +get_files + + +get_files + + + + + +on_config:s->get_files + + + + + + + + +on_files + + +files + +config + + + + + + +on_nav + + +nav + +config + +files + + + + + +on_files:s->on_nav:n + + + + + + + + +get_nav + + +get_nav + + + + + +on_files:s->get_nav + + + + + + + + +render_p + + +render + + + + + + +pages_point_a + + + + + + + +on_nav:s->pages_point_a + + + + + + + +get_context + + +get_context + + + + + +on_nav:s->get_context + + + + + + + + +load_config->on_config:n + + + + + + + + +get_files->on_files:n + + + + + + + + +get_nav->on_nav:n + + + + + + + + +on_pre_page + + +page + +config + +files + + + + + +on_page_read_source + + +page + +config + + + + + +on_pre_page:s->on_page_read_source:n + + + + + + + + +on_page_markdown + + +markdown + +page + +config + +files + + + + + +on_page_read_source:s->on_page_markdown:n + + + + + + + + +on_page_markdown:s->render_p + + + + + + + + +on_page_content + + +html + +page + +config + +files + + + + + +pages_point_b + + + + + + + +on_page_content:s->pages_point_b + + + + + + + + +on_env + + +env + +config + +files + + + + + + +render_p->on_page_content:n + + + + + + + + +pages_point_a->on_pre_page:n + + + + + + + + +pages_point_a->render_p + + + + + + + + +placeholder_cluster_populate_page_2 + + +... + + + + + +pages_point_a->placeholder_cluster_populate_page_2:n + + + + + + + + +placeholder_cluster_populate_page_3 + + +... + + + + + +pages_point_a->placeholder_cluster_populate_page_3:n + + + + + + + + +placeholder_cluster_populate_page_2:s->pages_point_b + + + + + + + + + +pages_point_b->on_env:n + + + + + + + + +pages_point_c + + + + + + + +pages_point_b->pages_point_c + + + + + + + +placeholder_cluster_populate_page_3:s->pages_point_b + + + + + + + + +on_env:s->get_context + + + + + + + + +on_page_context + + +context + +page + +config + +nav + + + + + +pages_point_c->on_page_context:n + + + + + + + + + +placeholder_cluster_build_page_2 + + +... + + + + + +pages_point_c->placeholder_cluster_build_page_2:n + + + + + + + + +placeholder_cluster_build_page_3 + + +... + + + + + +pages_point_c->placeholder_cluster_build_page_3:n + + + + + + + + +render + + +render + + + + + +on_page_context:s->render + + + + + + + + +on_post_page + + +output + +page + +config + + + + + +write_file + + +write_file + + + + + +on_post_page:s->write_file + + + + + + + + +get_context->on_page_context:n + + + + + + + + +render->on_post_page:n + + + + + + + + +get_template + + +get_template + + + + + +get_template->render + + + + + + + + +on_post_build + + +config + + + + + + + +on_serve + + +server + +config + + + + + + +on_shutdown + + + + + + + + diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/readthedocs.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/readthedocs.png new file mode 100644 index 0000000..b5456bb Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/readthedocs.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/screenshot.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/screenshot.png new file mode 100644 index 0000000..9eae03e Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/screenshot.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/search.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/search.png new file mode 100644 index 0000000..555fecd Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/search.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/site-name.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/site-name.png new file mode 100644 index 0000000..6c33837 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/site-name.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/win-py-install.png b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/win-py-install.png new file mode 100644 index 0000000..736c764 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/img/win-py-install.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/index.md new file mode 100644 index 0000000..f796a05 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/index.md @@ -0,0 +1,89 @@ +# MkDocs + +Project documentation with Markdown. + +--- + +MkDocs is a **fast**, **simple** and **downright gorgeous** static site +generator that's geared towards building project documentation. Documentation +source files are written in Markdown, and configured with a single YAML +configuration file. Start by reading the [introductory tutorial], then check the +[User Guide] for more information. + +[introductory tutorial]: getting-started.md +[User Guide]: user-guide/README.md + +

+ +
+

Features

+ +
+
+
+
+

Great themes available

+

+ There's a stack of good looking themes available for MkDocs. + Choose between the built in themes: + mkdocs and + readthedocs, + select one of the third-party themes + (on the MkDocs Themes wiki page + as well as the MkDocs Catalog), + or build your own. +

+
+
+
+
+
+
+

Easy to customize

+

+ Get your project documentation looking just the way you want it by + customizing your + theme and/or installing some plugins. Modify + Markdown's behavior with Markdown + extensions. Many configuration options are + available. +

+
+
+
+
+ +
+
+
+
+

Preview your site as you work

+

+ The built-in dev-server allows you to preview your documentation + as you're writing it. It will even auto-reload and refresh your + browser whenever you save your changes. +

+
+
+
+
+
+
+

Host anywhere

+

+ MkDocs builds completely static HTML sites that you can host on + GitHub Pages, Amazon S3, or anywhere else you + choose. +

+
+
+
+
+
diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/README.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/README.md new file mode 100644 index 0000000..aea3ba8 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/README.md @@ -0,0 +1,21 @@ +# User Guide + +Building Documentation with MkDocs + +--- + +The MkDocs User Guide provides documentation for users of MkDocs. See +[Getting Started] for an introductory tutorial. You can jump directly to a +page listed below, or use the *next* and *previous* buttons in the navigation +bar at the top of the page to move through the documentation in order. + +- [Installation](installation.md) +- [Writing Your Docs](writing-your-docs.md) +- [Choosing Your Theme](choosing-your-theme.md) +- [Customizing Your Theme](customizing-your-theme.md) +- [Localizing Your Theme](localizing-your-theme.md) +- [Configuration](configuration.md) +- [Command Line Interface](cli.md) +- [Deploying Your Docs](deploying-your-docs.md) + +[Getting Started]: ../getting-started.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/choosing-your-theme.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/choosing-your-theme.md new file mode 100644 index 0000000..92d0eb6 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/choosing-your-theme.md @@ -0,0 +1,229 @@ +# Choosing your Theme + +Selecting and configuring a theme. + +--- + +MkDocs includes two built-in themes ([mkdocs](#mkdocs) and +[readthedocs](#readthedocs)), as documented below. However, many [third party +themes] are available to choose from as well. + +To choose a theme, set the [theme] configuration option in your `mkdocs.yml` +config file. + +```yaml +theme: + name: readthedocs +``` + +## mkdocs + +The default theme, which was built as a custom [Bootstrap] theme, supports almost +every feature of MkDocs. + + + +In addition to the default [theme configuration options][theme], the `mkdocs` theme +supports the following options: + +* **`color_mode`**: Set the default color mode for the theme to one of `light`, + `dark`, or `auto`. The `auto` mode will switch to `light` or `dark` based on + the system configuration of the user's device. Default: `light`. + +* **`user_color_mode_toggle`**: Enable a toggle menu in the navigation bar + which allows users to select their preferred `color_mode` (light, dark, auto) + from within the browser and save their preference for future page loads. The + default selection of the toggle menu on first page load is the value set to + `color_mode`. Default: `false`. + + ![color mode toggle menu](../img/color_mode_toggle_menu.png) + +* **`nav_style`**: Adjust the visual style of the top navigation bar. Set to + one of `primary`, `dark` or `light`. Default: `primary`. This option is + independent of the `color_mode` option and must be defined separately. + +* **`highlightjs`**: Enables highlighting of source code in code blocks using + the [highlight.js] JavaScript library. Default: `True`. + +* **`hljs_style`**: The highlight.js library provides many different [styles] + (color variations) for highlighting source code in code blocks. Set this to + the name of the desired style when in `light` mode. Default: `github`. + +* **`hljs_style_dark`**: Set this to the name of the desired highlight.js + style when in `dark` mode. Default: `github_dark`. + +* **`hljs_languages`**: By default, highlight.js only supports 23 common + languages. List additional languages here to include support for them. + + ```yaml + theme: + name: mkdocs + highlightjs: true + hljs_languages: + - yaml + - rust + ``` + +* **`analytics`**: Defines configuration options for an analytics service. + Currently, only Google Analytics v4 is supported via the `gtag` option. + + * **`gtag`**: To enable Google Analytics, set to a Google Analytics v4 + tracking ID, which uses the `G-` format. See Google's documentation to + [Set up Analytics for a website and/or app (GA4)][setup-GA4] or to + [Upgrade to a Google Analytics 4 property][upgrade-GA4]. + + ```yaml + theme: + name: mkdocs + analytics: + gtag: G-ABC123 + ``` + + When set to the default (`null`) Google Analytics is disabled for the + site. + +* **`shortcuts`**: Defines keyboard shortcut keys. + + ```yaml + theme: + name: mkdocs + shortcuts: + help: 191 # ? + next: 78 # n + previous: 80 # p + search: 83 # s + ``` + + All values must be numeric key codes. It is best to use keys that are + available on all keyboards. You may use to determine + the key code for a given key. + + * **`help`**: Display a help modal that lists the keyboard shortcuts. + Default: `191` (?) + + * **`next`**: Navigate to the "next" page. Default: `78` (n) + + * **`previous`**: Navigate to the "previous" page. Default: `80` (p) + + * **`search`**: Display the search modal. Default: `83` (s) + +* **`navigation_depth`**: The maximum depth of the navigation tree in the + sidebar. Default: `2`. + +* **`locale`**{ #mkdocs-locale }: The locale (language/location) used to + build the theme. If your locale is not yet supported, it will fall back + to the default. + + The following locales are supported by this theme: + + * `en`: English (default) + * (see the list of existing directories `mkdocs/themes/mkdocs/locales/*/`) + + See the guide on [localizing your theme] for more information. + +## readthedocs + +A clone of the default theme used by the [Read the Docs] service, which offers +the same restricted feature set as its parent theme. Like its parent theme, only +two levels of navigation are supported. + +![ReadTheDocs](../img/readthedocs.png) + +In addition to the default [theme configuration options][theme], the `readthedocs` +theme supports the following options: + +* **`highlightjs`**: Enables highlighting of source code in code blocks using + the [highlight.js] JavaScript library. Default: `True`. + +* **`hljs_languages`**: By default, highlight.js only supports 23 common + languages. List additional languages here to include support for them. + + ```yaml + theme: + name: readthedocs + highlightjs: true + hljs_languages: + - yaml + - rust + ``` + +* **`analytics`**: Defines configuration options for an analytics service. + + * **`gtag`**: To enable Google Analytics, set to a Google Analytics v4 + tracking ID, which uses the `G-` format. See Google's documentation to + [Set up Analytics for a website and/or app (GA4)][setup-GA4] or to + [Upgrade to a Google Analytics 4 property][upgrade-GA4]. + + ```yaml + theme: + name: readthedocs + analytics: + gtag: G-ABC123 + ``` + + When set to the default (`null`) Google Analytics is disabled for the + + * **`anonymize_ip`**: To enable anonymous IP address for Google Analytics, + set this to `True`. Default: `False`. + +* **`include_homepage_in_sidebar`**: Lists the homepage in the sidebar menu. As + MkDocs requires that the homepage be listed in the `nav` configuration + option, this setting allows the homepage to be included or excluded from + the sidebar. Note that the site name/logo always links to the homepage. + Default: `True`. + +* **`prev_next_buttons_location`**: One of `bottom`, `top`, `both` , or `none`. + Displays the “Next” and “Previous” buttons accordingly. Default: `bottom`. + +* **`navigation_depth`**: The maximum depth of the navigation tree in the + sidebar. Default: `4`. + +* **`collapse_navigation`**: Only include the page section headers in the + sidebar for the current page. Default: `True`. + +* **`titles_only`**: Only include page titles in the sidebar, excluding all + section headers for all pages. Default: `False`. + +* **`sticky_navigation`**: If True, causes the sidebar to scroll with the main + page content as you scroll the page. Default: `True`. + +* **`locale`**{ #readthedocs-locale }: The locale (language/location) used to + build the theme. If your locale is not yet supported, it will fall back + to the default. + + The following locales are supported by this theme: + + * `en`: English (default) + * (see the list of existing directories `mkdocs/themes/readthedocs/locales/*/`) + + See the guide on [localizing your theme] for more information. + +* **`logo`**: To set a logo on your project instead of the plain text + `site_name`, set this variable to be the location of your image. Default: `null`. + +## Third Party Themes + +A list of third party themes can be found at the [community wiki] page and [the ranked catalog][catalog]. If you have created your own, please add them there. + +WARNING: Installing an MkDocs theme means installing a Python package and executing any code that the author has put in there. So, exercise the usual caution; there's no attempt at sandboxing. + +[third party themes]: #third-party-themes +[theme]: configuration.md#theme +[Bootstrap]: https://getbootstrap.com/ +[highlight.js]: https://highlightjs.org/ +[styles]: https://highlightjs.org/static/demo/ +[setup-GA4]: https://support.google.com/analytics/answer/9304153?hl=en&ref_topic=9303319 +[upgrade-GA4]: https://support.google.com/analytics/answer/9744165?hl=en&ref_topic=9303319 +[Read the Docs]: https://readthedocs.org/ +[community wiki]: https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes +[catalog]: https://github.com/mkdocs/catalog#-theming +[localizing your theme]: localizing-your-theme.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/cli.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/cli.md new file mode 100644 index 0000000..987c138 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/cli.md @@ -0,0 +1,8 @@ +# Command Line Interface + +::: mkdocs-click + :module: mkdocs.__main__ + :command: cli + :prog_name: mkdocs + :style: table + :list_subcommands: true diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/configuration.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/configuration.md new file mode 100644 index 0000000..69992c1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/configuration.md @@ -0,0 +1,1276 @@ +# Configuration + +Guide to all available configuration settings. + +--- + +## Introduction + +Project settings are configured by default using a YAML configuration file in +the project directory named `mkdocs.yml`. You can specify another path for it +by using the `-f`/`--config-file` option (see `mkdocs build --help`). + +At a minimum, this configuration file must contain the `site_name`. All other settings are optional. + +## Project information + +### site_name + +This is a **required setting**, and should be a string that is used as the main +title for the project documentation. For example: + +```yaml +site_name: Marshmallow Generator +``` + +When rendering the theme this setting will be passed as the `site_name` context +variable. + +### site_url + +Set the canonical URL of the site. This will add a `link` tag with the +`canonical` URL to the `head` section of each HTML page. If the 'root' of the +MkDocs site will be within a subdirectory of a domain, be sure to include that +subdirectory in the setting (`https://example.com/foo/`). + +This setting is also used for `mkdocs serve`: the server will be mounted onto a +path taken from the path component of the URL, e.g. `some/page.md` will be +served from `http://127.0.0.1:8000/foo/some/page/` to mimic the expected remote +layout. + +**default**: `null` + +### repo_url + +When set, provides a link to your repository (GitHub, Bitbucket, GitLab, ...) +on each page. + +```yaml +repo_url: https://github.com/example/repository/ +``` + +**default**: `null` + +### repo_name + +When set, provides the name for the link to your repository on each page. + +**default**: `'GitHub'`, `'Bitbucket'` or `'GitLab'` if the `repo_url` matches +those domains, otherwise the hostname from the `repo_url`. + +### edit_uri + +The path from the base `repo_url` to the docs directory when directly viewing a +page, accounting for specifics of the repository host (e.g. GitHub, Bitbucket, +etc), the branch, and the docs directory itself. MkDocs concatenates `repo_url` +and `edit_uri`, and appends the input path of the page. + +When set, and if your theme supports it, provides a link directly to the page in +your source repository. This makes it easier to find and edit the source for the +page. If `repo_url` is not set, this option is ignored. On some themes, setting +this option may cause an edit link to be used in place of a repository link. +Other themes may show both links. + +The `edit_uri` supports query ('?') and fragment ('#') characters. For +repository hosts that use a query or a fragment to access the files, the +`edit_uri` might be set as follows. (Note the `?` and `#` in the URI...) + +```yaml +# Query string example +edit_uri: '?query=root/path/docs/' +``` + +```yaml +# Hash fragment example +edit_uri: '#root/path/docs/' +``` + +For other repository hosts, simply specify the relative path to the docs +directory. + +```yaml +# Query string example +edit_uri: root/path/docs/ +``` + +For example, having this config: + +```yaml +repo_url: https://example.com/project/repo +edit_uri: blob/main/docs/ +``` + +means that a page named 'foo/bar.md' will have its edit link lead to: + + +`edit_uri` can actually be just an absolute URL, not necessarily relative to `repo_url`, so this can achieve the same result: + +```yaml +edit_uri: https://example.com/project/repo/blob/main/docs/ +``` + +For more flexibility, see [edit_uri_template](#edit_uri_template) below. + +> NOTE: +> On a few known hosts (specifically GitHub, Bitbucket and GitLab), the +> `edit_uri` is derived from the 'repo_url' and does not need to be set +> manually. Simply defining a `repo_url` will automatically populate the +> `edit_uri` configs setting. +> +> For example, for a GitHub- or GitLab-hosted repository, the `edit_uri` +> would be automatically set as `edit/master/docs/` (Note the `edit` path +> and `master` branch). +> +> For a Bitbucket-hosted repository, the equivalent `edit_uri` would be +> automatically set as `src/default/docs/` (note the `src` path and `default` +> branch). +> +> To use a different URI than the default (for example a different branch), +> simply set the `edit_uri` to your desired string. If you do not want any +> "edit URL link" displayed on your pages, then set `edit_uri` to an empty +> string to disable the automatic setting. + +WARNING: +On GitHub and GitLab, the default "edit" path (`edit/master/docs/`) opens +the page in the online editor. This functionality requires that the user +have and be logged in to a GitHub/GitLab account. Otherwise, the user will +be redirected to a login/signup page. Alternatively, use the "blob" path +(`blob/master/docs/`) to open a read-only view, which supports anonymous +access. + +**default**: `edit/master/docs/` for GitHub and GitLab repos or +`src/default/docs/` for a Bitbucket repo, if `repo_url` matches those domains, +otherwise `null` + +### edit_uri_template + +The more flexible variant of [edit_uri](#edit_uri). These two are equivalent: + +```yaml +edit_uri: 'blob/main/docs/' +edit_uri_template: 'blob/main/docs/{path}' +``` + +(they are also mutually exclusive -- don't specify both). + +Starting from here, you can change the positioning or formatting of the path, in case the default behavior of appending the path isn't enough. + +The contents of `edit_uri_template` are normal [Python format strings](https://docs.python.org/3/library/string.html#formatstrings), with only these fields available: + +* `{path}`, e.g. `foo/bar.md` +* `{path_noext}`, e.g. `foo/bar` + +And the conversion flag `!q` is available, to percent-encode the field: + +* `{path!q}`, e.g. `foo%2Fbar.md` + +>? NOTE: **Suggested useful configurations:** +> +> * GitHub Wiki: +> (e.g. `https://github.com/project/repo/wiki/foo/bar/_edit`) +> +> ```yaml +> repo_url: 'https://github.com/project/repo/wiki' +> edit_uri_template: '{path_noext}/_edit' +> ``` +> +> * BitBucket editor: +> (e.g. `https://bitbucket.org/project/repo/src/master/docs/foo/bar.md?mode=edit`) +> +> ```yaml +> repo_url: 'https://bitbucket.org/project/repo/' +> edit_uri_template: 'src/master/docs/{path}?mode=edit' +> ``` +> +> * GitLab Static Site Editor: +> (e.g. `https://gitlab.com/project/repo/-/sse/master/docs%2Ffoo%2bar.md`) +> +> ```yaml +> repo_url: 'https://gitlab.com/project/repo' +> edit_uri_template: '-/sse/master/docs%2F{path!q}' +> ``` +> +> * GitLab Web IDE: +> (e.g. `https://gitlab.com/-/ide/project/repo/edit/master/-/docs/foo/bar.md`) +> +> ```yaml +> edit_uri_template: 'https://gitlab.com/-/ide/project/repo/edit/master/-/docs/{path}' +> ``` + +**default**: `null` + +### site_description + +Set the site description. This will add a meta tag to the generated HTML header. + +**default**: `null` + +### site_author + +Set the name of the author. This will add a meta tag to the generated HTML +header. + +**default**: `null` + +### copyright + +Set the copyright information to be included in the documentation by the theme. + +**default**: `null` + +### remote_branch + +Set the remote branch to commit to when using `gh-deploy` to deploy to GitHub +Pages. This option can be overridden by a command line option in `gh-deploy`. + +**default**: `gh-pages` + +### remote_name + +Set the remote name to push to when using `gh-deploy` to deploy to GitHub Pages. +This option can be overridden by a command line option in `gh-deploy`. + +**default**: `origin` + +## Documentation layout + +### nav + +This setting is used to determine the format and layout of the global navigation +for the site. A minimal navigation configuration could look like this: + +```yaml +nav: + - 'index.md' + - 'about.md' +``` + +All paths in the navigation configuration must be relative to the +[`docs_dir`](#docs_dir) configuration option. See the section on [configuring +pages and navigation] for a more detailed breakdown, including how to create +sub-sections. + +Navigation items may also include links to external sites. While titles are +optional for internal links, they are required for external links. An external +link may be a full URL or a relative URL. Any path which is not found in the +files is assumed to be an external link. See the section about [Meta-Data] on +how MkDocs determines the page title of a document. + +```yaml +nav: + - Introduction: 'index.md' + - 'about.md' + - 'Issue Tracker': 'https://example.com/' +``` + +In the above example, the first two items point to local files while the third +points to an external site. + +However, sometimes the MkDocs site is hosted in a subdirectory of a project's +site and you may want to link to other parts of the same site without including +the full domain. In that case, you may use an appropriate relative URL. + +```yaml +site_url: https://example.com/foo/ + +nav: + - Home: '../' + - 'User Guide': 'user-guide.md' + - 'Bug Tracker': '/bugs/' +``` + +In the above example, two different styles of external links are used. First, +note that the `site_url` indicates that the MkDocs site is hosted in the `/foo/` +subdirectory of the domain. Therefore, the `Home` navigation item is a relative +link that steps up one level to the server root and effectively points to +`https://example.com/`. The `Bug Tracker` item uses an absolute path from the +server root and effectively points to `https://example.com/bugs/`. Of course, the +`User Guide` points to a local MkDocs page. + +**default**: By default `nav` will contain an alphanumerically sorted, nested +list of all the Markdown files found within the `docs_dir` and its +sub-directories. Index files will always be listed first within a sub-section. + +### exclude_docs + +NEW: **New in version 1.5.** + +> DANGER: **Changed in version 1.6:** +> +> This config no longer applies the "drafts" functionality for `mkdocs serve`. If you have draft documents that you want available in "serve" and not "build", replace `exclude_docs` with the new [`draft_docs`](#draft_docs) config option. + +This config defines patterns of files (under [`docs_dir`](#docs_dir)) to not be picked up into the built site. + +Example: + +```yaml +exclude_docs: | + api-config.json # A file with this name anywhere. + /requirements.txt # Top-level "docs/requirements.txt". + *.py # Any file with this extension anywhere. + !/foo/example.py # But keep this particular file. +``` + +This follows the [.gitignore pattern format](https://git-scm.com/docs/gitignore#_pattern_format). + +The following defaults are always implicitly prepended - to exclude dot-files (and directories) as well as the top-level `templates` directory: + +```yaml +exclude_docs: | + .* + /templates/ +``` + +So, in order to really start this config fresh, you'd need to specify a negated version of these entries first. + +Otherwise you could for example opt only certain dot-files back into the site: + +```yaml +exclude_docs: | + !.assets # Don't exclude '.assets' although all other '.*' are excluded +``` + +### draft_docs + +NEW: **New in version 1.6.** + +This config defines patterns of files (under [`docs_dir`](#docs_dir)) to be treated as a draft. Draft files are available during `mkdocs serve` and include a "DRAFT" mark but will not be included in the build. To prevent this effect and make "serve" behave the same as "build", you can run `mkdocs serve --clean`. + +Example: + +```yaml +draft_docs: | + drafts/ # A "drafts" directory anywhere. + _unpublished.md # A md file ending in _unpublished.md + !/foo_unpublished.md # But keep this particular file. +``` + +This follows the [.gitignore pattern format](https://git-scm.com/docs/gitignore#_pattern_format). + +### not_in_nav + +NEW: **New in version 1.5.** + +> NEW: **New in version 1.6:** +> +> If the [`nav`](#nav) config is not specified at all, pages specified in this config will now be excluded from the inferred navigation. + +If you want to include some docs into the site but intentionally exclude them from the nav, normally MkDocs warns about this. + +Adding such patterns of files (relative to [`docs_dir`](#docs_dir)) into the `not_in_nav` config will prevent such warnings. + +Example: + +```yaml +nav: + - Foo: foo.md + - Bar: bar.md + +not_in_nav: | + /private.md +``` + +As the previous option, this follows the .gitignore pattern format. + +NOTE: Adding a given file to [`exclude_docs`](#exclude_docs) takes precedence over and implies `not_in_nav`. + +### validation + +NEW: **New in version 1.5.** + +Configure the strictness of MkDocs' diagnostic messages when validating links to documents. + +This is a tree of configs, and for each one the value can be one of the three: `warn`, `info`, `ignore`. Which cause a logging message of the corresponding severity to be produced. The `warn` level is, of course, intended for use with `mkdocs build --strict` (where it becomes an error), which you can employ in continuous testing. + +The config `validation.links.absolute_links` additionally has a special value `relative_to_docs`, for [validation of absolute links](#validation-of-absolute-links). + +>? EXAMPLE: **Defaults of this config as of MkDocs 1.6:** +> +> ```yaml +> validation: +> nav: +> omitted_files: info +> not_found: warn +> absolute_links: info +> links: +> not_found: warn +> anchors: info +> absolute_links: info +> unrecognized_links: info +> ``` +> +> (Note: you shouldn't copy this whole example, because it only duplicates the defaults. Only individual items that differ should be set.) + +The defaults of some of the behaviors already differ from MkDocs 1.4 and below - they were ignored before. + +>? EXAMPLE: **Configure MkDocs 1.6 to behave like MkDocs 1.4 and below (reduce strictness):** +> +> ```yaml +> validation: +> absolute_links: ignore +> unrecognized_links: ignore +> anchors: ignore +> ``` + +>! EXAMPLE: **Recommended settings for most sites (maximal strictness):** +> +> ```yaml +> validation: +> omitted_files: warn +> absolute_links: warn # Or 'relative_to_docs' - new in MkDocs 1.6 +> unrecognized_links: warn +> anchors: warn # New in MkDocs 1.6 +> ``` + +Note how in the above examples we omitted the 'nav' and 'links' keys. Here `absolute_links:` means setting both `nav: absolute_links:` and `links: absolute_links:`. + +Full list of values and examples of log messages that they can hide or make more prominent: + +* `validation.nav.omitted_files` + * > The following pages exist in the docs directory, but are not included in the "nav" configuration: ... +* `validation.nav.not_found` + * > A reference to 'foo/bar.md' is included in the 'nav' configuration, which is not found in the documentation files. + * > A reference to 'foo/bar.md' is included in the 'nav' configuration, but this file is excluded from the built site. +* `validation.nav.absolute_links` + * > An absolute path to '/foo/bar.html' is included in the 'nav' configuration, which presumably points to an external resource. + +* `validation.links.not_found` + * > Doc file 'example.md' contains a link '../foo/bar.md', but the target is not found among documentation files. + * > Doc file 'example.md' contains a link to 'foo/bar.md' which is excluded from the built site. +* `validation.links.anchors` + * > Doc file 'example.md' contains a link '../foo/bar.md#some-heading', but the doc 'foo/bar.md' does not contain an anchor '#some-heading'. + * > Doc file 'example.md' contains a link '#some-heading', but there is no such anchor on this page. +* `validation.links.absolute_links` + * > Doc file 'example.md' contains an absolute link '/foo/bar.html', it was left as is. Did you mean 'foo/bar.md'? +* `validation.links.unrecognized_links` + * > Doc file 'example.md' contains an unrecognized relative link '../foo/bar/', it was left as is. Did you mean 'foo/bar.md'? + * > Doc file 'example.md' contains an unrecognized relative link 'mail\@example.com', it was left as is. Did you mean 'mailto:mail\@example.com'? + +#### Validation of absolute links + +NEW: **New in version 1.6.** + +> Historically, within Markdown, MkDocs only recognized **relative** links that lead to another physical `*.md` document (or media file). This is a good convention to follow because then the source pages are also freely browsable without MkDocs, for example on GitHub. Whereas absolute links were left unmodified (making them often not work as expected) or, more recently, warned against. If you dislike having to always use relative links, now you can opt into absolute links and have them work correctly. + +If you set the setting `validation.links.absolute_links` to the new value `relative_to_docs`, all Markdown links starting with `/` will be understood as being relative to the `docs_dir` root. The links will then be validated for correctness according to all the other rules that were already working for relative links in prior versions of MkDocs. For the HTML output, these links will still be turned relative so that the site still works reliably. + +So, now any document (e.g. "dir1/foo.md") can link to the document "dir2/bar.md" as `[link](/dir2/bar.md)`, in addition to the previously only correct way `[link](../dir2/bar.md)`. + +You have to enable the setting, though. The default is still to just skip the link. + +> EXAMPLE: **Settings to recognize absolute links and validate them:** +> +> ```yaml +> validation: +> links: +> absolute_links: relative_to_docs +> anchors: warn +> unrecognized_links: warn +> ``` + +## Build directories + +### theme + +Sets the theme and theme specific configuration of your documentation site. +May be either a string or a set of key/value pairs. + +If a string, it must be the string name of a known installed theme. For a list +of available themes visit [Choosing Your Theme]. + +An example set of key/value pairs might look something like this: + +```yaml +theme: + name: mkdocs + locale: en + custom_dir: my_theme_customizations/ + static_templates: + - sitemap.html + include_sidebar: false +``` + +If a set of key/value pairs, the following nested keys can be defined: + +> BLOCK: +> +> #### name +> +> The string name of a known installed theme. For a list of available themes +> visit [Choosing Your Theme]. +> +> #### locale +> +> A code representing the language of your site. See [Localizing your theme] +> for details. +> +> #### custom_dir +> +> A directory containing a custom theme. This can either be a relative +> directory, in which case it is resolved relative to the directory containing +> your configuration file or it can be an absolute directory path from the +> root of your local file system. +> +> See [Customizing Your Theme][theme_dir] for details if you would like to tweak an +> existing theme. +> +> See the [Theme Developer Guide] if you would like to build your own theme +> from the ground up. +> +> #### static_templates +> +> A list of templates to render as static pages. The templates must be located +> in either the theme's template directory or in the `custom_dir` defined in +> the theme configuration. +> +> #### (theme specific keywords) +> +> Any additional keywords supported by the theme can also be defined. See the +> documentation for the theme you are using for details. + +**default**: `'mkdocs'` + +### docs_dir + +The directory containing the documentation source markdown files. This can +either be a relative directory, in which case it is resolved relative to the +directory containing your configuration file, or it can be an absolute directory +path from the root of your local file system. + +**default**: `'docs'` + +### site_dir + +The directory where the output HTML and other files are created. This can either +be a relative directory, in which case it is resolved relative to the directory +containing your configuration file, or it can be an absolute directory path from +the root of your local file system. + +**default**: `'site'` + +> NOTE: +> If you are using source code control you will normally want to ensure that +> your *build output* files are not committed into the repository, and only +> keep the *source* files under version control. For example, if using `git` +> you might add the following line to your `.gitignore` file: +> +> ```text +> site/ +> ``` +> +> If you're using another source code control tool, you'll want to check its +> documentation on how to ignore specific directories. + +### extra_css + +Set a list of CSS files (relative to `docs_dir`) to be included by the theme, typically as `` tags. + +Example: + +```yaml +extra_css: + - css/extra.css + - css/second_extra.css +``` + +**default**: `[]` (an empty list). + +### extra_javascript + +Set a list of JavaScript files in your `docs_dir` to be included by the theme, as ` + # New behavior in MkDocs 1.5: + - implicitly_as_module.mjs # + # Config keys only supported since MkDocs 1.5: + - path: explicitly_as_module.mjs # + type: module + - path: deferred_plain.js # + defer: true + - path: scripts/async_module.mjs # + type: module + async: true +``` + +So, each item can be either: + +* a plain string, or +* a mapping that has the required `path` key and 3 optional keys `type` (string), `async` (boolean), `defer` (boolean). + +Only the plain string variant detects the `.mjs` extension and adds `type="module"`, otherwise `type: module` must be written out regardless of extension. + +**default**: `[]` (an empty list). + +NOTE: `*.js` and `*.css` files, just like any other type of file, are always copied from `docs_dir` into the site's deployed copy, regardless if they're linked to the pages via the above configs or not. + +### extra_templates + +Set a list of templates in your `docs_dir` to be built by MkDocs. To see more +about writing templates for MkDocs read the documentation about [custom themes] +and specifically the section about the [available variables] to +templates. See the example in [extra_css] for usage. + +**default**: `[]` (an empty list). + +### extra + +A set of key-value pairs, where the values can be any valid YAML construct, that +will be passed to the template. This allows for great flexibility when creating +custom themes. + +For example, if you are using a theme that supports displaying the project +version, you can pass it to the theme like this: + +```yaml +extra: + version: 1.0 +``` + +**default**: By default `extra` will be an empty key-value mapping. + +## Preview controls + +## Live Reloading + +### watch + +Determines additional directories to watch when running `mkdocs serve`. +Configuration is a YAML list. + +```yaml +watch: + - directory_a + - directory_b +``` + +Allows a custom default to be set without the need to pass it through the `-w`/`--watch` +option every time the `mkdocs serve` command is called. + +> NOTE: +> The paths provided via the configuration file are relative to the configuration file. +> +> The paths provided via the `-w`/`--watch` CLI parameters are not. + +### use_directory_urls + +This setting controls the directory structure of the generated documentation, and thereby the URL format used for linking to pages. + +The following tables demonstrate how the directory structure and URLs used on the site differ when +setting `use_directory_urls` to `true` or `false`. + +**`use_directory_urls: false`** + +This setting is needed when the documentation is hosted on systems that can't +access the file `X/index.html` when given the URL `X`. When set to `false`, +no additional `X` directory is created, and the file is simply stored as `X.html`. +Links are created that point directly to the target *file* rather than a target +*directory*. + +Source file | Generated File | URL Format +---------------- | ------------------ | ------------------- +index.md | index.html | /index.html +api-guide.md | api-guide.html | /api-guide.html +about/license.md | about/license.html | /about/license.html + +For example, this needs to be set to `false` when: + +* opening pages directly from the file system +* publishing the documentation to a static S3 website. + +**`use_directory_urls: true`** + +The default style of `use_directory_urls: true` creates more user friendly URLs, +and is usually what you'll want to use. + +Source file | Generated File | URL Format +---------------- | ------------------------- | -------------- +index.md | /index.html | / +api-guide.md | /api-guide/index.html | /api-guide/ +about/license.md | /about/license/index.html | /about/license + +**default**: `true` + +### strict + +Determines how warnings are handled. Set to `true` to halt processing when a +warning is raised. Set to `false` to print a warning and continue processing. + +This is also available as a command line flag: `--strict`. + +**default**: `false` + +### dev_addr + +Determines the address used when running `mkdocs serve`. Must be of the format +`IP:PORT`. + +Allows a custom default to be set without the need to pass it through the +`--dev-addr` option every time the `mkdocs serve` command is called. + +**default**: `'127.0.0.1:8000'` + +See also: [site_url](#site_url). + +## Formatting options + +### markdown_extensions + +MkDocs uses the [Python Markdown][pymkd] library to translate Markdown files +into HTML. Python Markdown supports a variety of [extensions][pymdk-extensions] +that customize how pages are formatted. This setting lets you enable a list of +extensions beyond the ones that MkDocs uses by default (`meta`, `toc`, `tables`, +and `fenced_code`). + +For example, to enable the [SmartyPants typography extension][smarty], use: + +```yaml +markdown_extensions: + - smarty +``` + +Some extensions provide configuration options of their own. If you would like to +set any configuration options, then you can nest a key/value mapping +(`option_name: option value`) of any options that a given extension supports. +See the documentation for the extension you are using to determine what options +they support. + +For example, to enable permalinks in the (included) `toc` extension, use: + +```yaml +markdown_extensions: + - toc: + permalink: true +``` + +Note that a colon (`:`) must follow the extension name (`toc`) and then on a new +line the option name and value must be indented and separated by a colon. If you +would like to define multiple options for a single extension, each option must be +defined on a separate line: + +```yaml +markdown_extensions: + - toc: + permalink: true + separator: "_" +``` + +Add an additional item to the list for each extension. If you have no +configuration options to set for a specific extension, then simply omit options +for that extension: + +```yaml +markdown_extensions: + - smarty + - toc: + permalink: true + - sane_lists +``` + +> NOTE: **Dynamic config values.** +> +> To dynamically configure the extensions, you can get the config values from [environment variables](#environment-variables) or [obtain paths](#paths-relative-to-the-current-file-or-site) of the currently rendered Markdown file or the overall MkDocs site. + +In the above examples, each extension is a list item (starts with a `-`). As an +alternative, key/value pairs can be used instead. However, in that case an empty +value must be provided for extensions for which no options are defined. +Therefore, the last example above could also be defined as follows: + +```yaml +markdown_extensions: + smarty: {} + toc: + permalink: true + sane_lists: {} +``` + +This alternative syntax is required if you intend to override some options via +[inheritance]. + +> NOTE: **More extensions.** +> +> The Python-Markdown documentation provides a [list of extensions][exts] +> which are available out-of-the-box. For a list of configuration options +> available for a given extension, see the documentation for that extension. +> +> You may also install and use various third party extensions ([Python-Markdown wiki], [MkDocs project catalog][catalog]). Consult +> the documentation provided by those extensions for installation instructions +> and available configuration options. + +**default**: `[]` (an empty list). + +### hooks + +NEW: **New in version 1.4.** + +A list of paths to Python scripts (relative to `mkdocs.yml`) that are loaded and used as [plugin](#plugins) instances. + +For example: + +```yaml +hooks: + - my_hooks.py +``` + +Then the file `my_hooks.py` can contain any [plugin event handlers](../dev-guide/plugins.md#events) (without `self`), e.g.: + +```python +def on_page_markdown(markdown, **kwargs): + return markdown.replace('a', 'z') +``` + +>? EXAMPLE: **Advanced example:** +> +> This produces warnings based on the Markdown content (and warnings are fatal in [strict](#strict) mode): +> +> ```python +> import logging, re +> import mkdocs.plugins +> +> log = logging.getLogger('mkdocs') +> +> @mkdocs.plugins.event_priority(-50) +> def on_page_markdown(markdown, page, **kwargs): +> path = page.file.src_uri +> for m in re.finditer(r'\bhttp://[^) ]+', markdown): +> log.warning(f"Documentation file '{path}' contains a non-HTTPS link: {m[0]}") +> ``` + +This does not enable any new abilities compared to [plugins][], it only simplifies one-off usages, as these don't need to be *installed* like plugins do. + +Note that for `mkdocs serve` the hook module will *not* be reloaded on each build. + +You might have seen this feature in the [mkdocs-simple-hooks plugin](https://github.com/aklajnert/mkdocs-simple-hooks). If using standard method names, it can be directly replaced, e.g.: + +```diff +-plugins: +- - mkdocs-simple-hooks: +- hooks: +- on_page_markdown: 'my_hooks:on_page_markdown' ++hooks: ++ - my_hooks.py +``` + +> NEW: **New in MkDocs 1.6.** +> +> If a hook file has a file `foo.py` adjacent to it, it can use the normal Python syntax `import foo` to access its functions. +> +> In older versions of MkDocs, a workaround was necessary to make this work - adding the path to `sys.path`. + +### plugins + +A list of plugins (with optional configuration settings) to use when building +the site. See the [Plugins] documentation for full details. + +**default**: `['search']` (the "search" plugin included with MkDocs). + +If the `plugins` config setting is defined in the `mkdocs.yml` config file, then +any defaults (such as `search`) are ignored and you need to explicitly re-enable +the defaults if you would like to continue using them: + +```yaml +plugins: + - search + - your_other_plugin +``` + +To define options for a given plugin, use a nested set of key/value pairs: + +```yaml +plugins: + - search + - your_other_plugin: + option1: value + option2: other value +``` + +To completely disable all plugins, including any defaults, set the `plugins` +setting to an empty list: + +```yaml +plugins: [] +``` + +#### `enabled` option + +> NEW: **New in MkDocs 1.6.** +> +> Each plugin has its own options keys. However MkDocs also ensures that each plugin has the `enabled` boolean option. This can be used to conditionally enable a particular plugin, as in the following example: +> +> ```yaml +> plugins: +> - search +> - code-validator: +> enabled: !ENV [LINT, false] +> ``` +> +> See: [Environment variables](#environment-variables) + +#### Alternate syntax + +In the above examples, each plugin is a list item (starts with a `-`). As an +alternative, key/value pairs can be used instead. However, in that case an empty +value must be provided for plugins for which no options are defined. Therefore, +the last example above could also be defined as follows: + +```yaml +plugins: + search: {} + your_other_plugin: + option1: value + option2: other value +``` + +This alternative syntax is required if you intend to override some options via +[inheritance]. + +#### Search + +A search plugin is provided by default with MkDocs which uses [lunr.js] as a +search engine. The following config options are available to alter the behavior +of the search plugin: + +##### **separator** + +A regular expression which matches the characters used as word separators when +building the index. By default whitespace and the hyphen (`-`) are used. To add +the dot (`.`) as a word separator you might do this: + +```yaml +plugins: + - search: + separator: '[\s\-\.]+' +``` + +**default**: `'[\s\-]+'` + +##### **min_search_length** + +An integer value that defines the minimum length for a search query. By default +searches shorter than 3 chars in length are ignored as search result quality with +short search terms are poor. However, for some use cases (such as documentation +about Message Queues which might generate searches for 'MQ') it may be preferable +to set a shorter limit. + +```yaml +plugins: + - search: + min_search_length: 2 +``` + +**default**: 3 + +##### **lang** + +A list of languages to use when building the search index as identified by their +[ISO 639-1] language codes. With [Lunr Languages], the following languages are +supported: + +* `ar`: Arabic +* `da`: Danish +* `nl`: Dutch +* `en`: English +* `fi`: Finnish +* `fr`: French +* `de`: German +* `hu`: Hungarian +* `it`: Italian +* `ja`: Japanese +* `no`: Norwegian +* `pt`: Portuguese +* `ro`: Romanian +* `ru`: Russian +* `es`: Spanish +* `sv`: Swedish +* `th`: Thai +* `tr`: Turkish +* `vi`: Vietnamese + +You may [contribute additional languages]. + +WARNING: +While search does support using multiple languages together, it is best not +to add additional languages unless you really need them. Each additional +language adds significant bandwidth requirements and uses more browser +resources. Generally, it is best to keep each instance of MkDocs to a single +language. + +NOTE: +Lunr Languages does not currently include support for Chinese or other Asian +languages. However, some users have reported decent results using Japanese. + +**default**: The value of `theme.locale` if set, otherwise `[en]`. + +##### **prebuild_index** + +Optionally generates a pre-built index of all pages, which provides some +performance improvements for larger sites. Before enabling, confirm that the +theme you are using explicitly supports using a prebuilt index (the builtin +themes do). Set to `true` to enable. + +WARNING: +This option requires that [Node.js] be installed and the command `node` be +on the system path. If the call to `node` fails for any reason, a warning +is issued and the build continues uninterrupted. You may use the `--strict` +flag when building to cause such a failure to raise an error instead. + +NOTE: +On smaller sites, using a pre-built index is not recommended as it creates a +significant increase is bandwidth requirements with little to no noticeable +improvement to your users. However, for larger sites (hundreds of pages), +the bandwidth increase is relatively small and your users will notice a +significant improvement in search performance. + +**default**: `False` + +##### **indexing** + +Configures what strategy the search indexer will use when building the index +for your pages. This property is particularly useful if your project is large +in scale, and the index takes up an enormous amount of disk space. + +```yaml +plugins: + - search: + indexing: 'full' +``` + +###### Options + +Option | Description +------ | ----------- +`full` | Indexes the title, section headings, and full text of each page. +`sections` | Indexes the title and section headings of each page. +`titles` | Indexes only the title of each page. + +**default**: `full` + +## Special YAML tags + +### Environment variables + +In most cases, the value of a configuration option is set directly in the +configuration file. However, as an option, the value of a configuration option +may be set to the value of an environment variable using the `!ENV` tag. For +example, to set the value of the `site_name` option to the value of the +variable `SITE_NAME` the YAML file may contain the following: + +```yaml +site_name: !ENV SITE_NAME +``` + +If the environment variable is not defined, then the configuration setting +would be assigned a `null` (or `None` in Python) value. A default value can be +defined as the last value in a list. Like this: + +```yaml +site_name: !ENV [SITE_NAME, 'My default site name'] +``` + +Multiple fallback variables can be used as well. Note that the last value is +not an environment variable, but must be a value to use as a default if none +of the specified environment variables are defined. + +```yaml +site_name: !ENV [SITE_NAME, OTHER_NAME, 'My default site name'] +``` + +Simple types defined within an environment variable such as string, bool, +integer, float, datestamp and null are parsed as if they were defined directly +in the YAML file, which means that the value will be converted to the +appropriate type. However, complex types such as lists and key/value pairs +cannot be defined within a single environment variable. + +For more details, see the [pyyaml_env_tag](https://github.com/waylan/pyyaml-env-tag) +project. + +### Paths relative to the current file or site + +NEW: **New in version 1.5.** + +Some Markdown extensions can benefit from knowing the path of the Markdown file that's currently being processed, or just the root path of the current site. For that, the special tag `!relative` can be used in most contexts within the config file, though the only known usecases are within [`markdown_extensions`](#markdown_extensions). + +Examples of the possible values are: + +```yaml +- !relative # Relative to the directory of the current Markdown file +- !relative $docs_dir # Path of the docs_dir +- !relative $config_dir # Path of the directory that contains the main mkdocs.yml +- !relative $config_dir/some/child/dir # Some subdirectory of the root config directory +``` + +(Here, `$docs_dir` and `$config_dir` are currently the *only* special prefixes that are recognized.) + +Example: + +```yaml +markdown_extensions: + - pymdownx.snippets: + base_path: !relative # Relative to the current Markdown file +``` + +This allows the [pymdownx.snippets] extension to include files relative to the current Markdown file, which without this tag it would have no way of knowing. + +> NOTE: Even for the default case, any extension's base path is technically the *current working directory* although the assumption is that it's the *directory of mkdocs.yml*. So even if you don't want the paths to be relative, to improve the default behavior, always prefer to use this idiom: +> +> ```yaml +> markdown_extensions: +> - pymdownx.snippets: +> base_path: !relative $config_dir # Relative to the root directory with mkdocs.yml +> ``` + +## Configuration Inheritance + +Generally, a single file would hold the entire configuration for a site. +However, some organizations may maintain multiple sites which all share a common +configuration across them. Rather than maintaining separate configurations for +each, the common configuration options can be defined in a parent configuration +file which each site's primary configuration file inherits. + +To define the parent for a configuration file, set the `INHERIT` (all caps) key +to the path of the parent file. The path must be relative to the location of the +primary file. + +For configuration options to be merged with a parent configuration, those +options must be defined as key/value pairs. Specifically, the +[markdown_extensions] and [plugins](#plugins) options must use the alternative syntax +which does not use list items (lines which start with `-`). + +For example, suppose the common (parent) configuration is defined in `base.yml`: + +```yaml +theme: + name: mkdocs + locale: en + highlightjs: true + +markdown_extensions: + toc: + permalink: true + admonition: {} +``` + +Then, for the "foo" site, the primary configuration file would be defined at +`foo/mkdocs.yml`: + +```yml +INHERIT: ../base.yml +site_name: Foo Project +site_url: https://example.com/foo +``` + +When running `mkdocs build`, the file at `foo/mkdocs.yml` would be passed in as +the configuration file. MkDocs will then parse that file, retrieve and parse the +parent file `base.yml` and deep merge the two. This would result in MkDocs +receiving the following merged configuration: + +```yaml +site_name: Foo Project +site_url: https://example.com/foo + +theme: + name: mkdocs + locale: en + highlightjs: true + +markdown_extensions: + toc: + permalink: true + admonition: {} +``` + +Deep merging allows you to add and/or override various values in your primary +configuration file. For example, suppose for one site you wanted to add support +for definition lists, use a different symbol for permalinks, and define a +different separator. In that site's primary configuration file you could do: + +```yaml +INHERIT: ../base.yml +site_name: Bar Project +site_url: https://example.com/bar + +markdown_extensions: + def_list: {} + toc: + permalink:  + separator: "_" +``` + +In that case, the above configuration would be deep merged with `base.yml` and +result in the following configuration: + +```yaml +site_name: Bar Project +site_url: https://example.com/bar + +theme: + name: mkdocs + locale: en + highlightjs: true + +markdown_extensions: + def_list: {} + toc: + permalink:  + separator: "_" + admonition: {} +``` + +Notice that the `admonition` extension was retained from the parent +configuration, the `def_list` extension was added, the value of +`toc.permalink` was replaced, and the value of `toc.separator` was added. + +You can replace or merge the value of any key. However, any non-key is always +replaced. Therefore, you cannot append items to a list. You must redefine the +entire list. + +As the [nav] configuration is made up of nested lists, this means that you +cannot merge navigation items. Of course, you can replace the entire `nav` +configuration with a new one. However, it is generally expected that the entire +navigation would be defined in the primary configuration file for a project. + +WARNING: +As a reminder, all path based configuration options must be relative to the +primary configuration file and MkDocs does not alter the paths when merging. +Therefore, defining paths in a parent file which is inherited by multiple +different sites may not work as expected. It is generally best to define +path based options in the primary configuration file only. + +The inheritance can also be used as a quick way to override keys on the command line - by using stdin as the config file. For example: + +```bash +echo '{INHERIT: mkdocs.yml, site_name: "Renamed site"}' | mkdocs build -f - +``` + +[Theme Developer Guide]: ../dev-guide/themes.md +[custom themes]: ../dev-guide/themes.md +[available variables]: ../dev-guide/themes.md#template-variables +[pymdk-extensions]: https://python-markdown.github.io/extensions/ +[pymkd]: https://python-markdown.github.io/ +[smarty]: https://python-markdown.github.io/extensions/smarty/ +[exts]: https://python-markdown.github.io/extensions/ +[Python-Markdown wiki]: https://github.com/Python-Markdown/markdown/wiki/Third-Party-Extensions +[catalog]: https://github.com/mkdocs/catalog +[configuring pages and navigation]: writing-your-docs.md#configure-pages-and-navigation +[Meta-Data]: writing-your-docs.md#meta-data +[theme_dir]: customizing-your-theme.md#using-the-theme-custom_dir +[choosing your theme]: choosing-your-theme.md +[Localizing your theme]: localizing-your-theme.md +[extra_css]: #extra_css +[Plugins]: ../dev-guide/plugins.md +[lunr.js]: https://lunrjs.com/ +[ISO 639-1]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes +[Lunr Languages]: https://github.com/MihaiValentin/lunr-languages#lunr-languages----- +[contribute additional languages]: https://github.com/MihaiValentin/lunr-languages/blob/master/CONTRIBUTING.md +[Node.js]: https://nodejs.org/ +[markdown_extensions]: #markdown_extensions +[nav]: #nav +[inheritance]: #configuration-inheritance +[pymdownx.snippets]: https://facelessuser.github.io/pymdown-extensions/extensions/snippets/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/customizing-your-theme.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/customizing-your-theme.md new file mode 100644 index 0000000..0b3357f --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/customizing-your-theme.md @@ -0,0 +1,226 @@ +# Customizing Your Theme + +Altering a theme to suit your needs. + +--- + +If you would like to make a few tweaks to an existing theme, there is no need +to create your own theme from scratch. For minor tweaks which only require +some CSS and/or JavaScript, you can [use the docs_dir](#using-the-docs_dir). +However, for more complex customizations, including overriding templates, you +will need to [use the theme custom_dir](#using-the-theme-custom_dir) setting. + +## Using the docs_dir + +The [extra_css] and [extra_javascript] configuration options can be used to +make tweaks and customizations to existing themes. To use these, you simply +need to include either CSS or JavaScript files within your [documentation +directory]. + +For example, to change the color of the headers in your documentation, create +a file called (for example) `style.css` and place it next to the documentation Markdown. In +that file add the following CSS. + +```css +h1 { + color: red; +} +``` + +Then you need to add it to `mkdocs.yml`: + +```yaml +extra_css: + - style.css +``` + +After making these changes, they should be visible when you run +`mkdocs serve` - if you already had this running, you should see that the CSS +changes were automatically picked up and the documentation will be updated. + +NOTE: +Any extra CSS or JavaScript files will be added to the generated HTML +document after the page content. If you desire to include a JavaScript +library, you may have better success including the library by using the +theme [custom_dir]. + +## Using the theme custom_dir + +The [`theme.custom_dir`][custom_dir] configuration option can be used to point +to a directory of files which override the files in a parent theme. The parent +theme would be the theme defined in the [`theme.name`][name] configuration +option. Any file in the `custom_dir` with the same name as a file in the +parent theme will replace the file of the same name in the parent theme. Any +additional files in the `custom_dir` will be added to the parent theme. The +contents of the `custom_dir` should mirror the directory structure of the +parent theme. You may include templates, JavaScript files, CSS files, images, +fonts, or any other media included in a theme. + +NOTE: +For this to work, the `theme.name` setting must be set to a known +installed theme. If the `name` setting is instead set to `null` (or not +defined), then there is no theme to override and the contents of the +`custom_dir` must be a complete, standalone theme. See the [Theme +Developer Guide][custom theme] for more information. + +For example, the [mkdocs] theme ([browse source]), contains the following +directory structure (in part): + +```text +- css\ +- fonts\ +- img\ + - favicon.ico + - grid.png +- js\ +- 404.html +- base.html +- content.html +- nav-sub.html +- nav.html +- toc.html +``` + +To override any of the files contained in that theme, create a new directory +next to your `docs_dir`: + +```bash +mkdir custom_theme +``` + +And then point your `mkdocs.yml` configuration file at the new directory: + +```yaml +theme: + name: mkdocs + custom_dir: custom_theme/ +``` + +To override the 404 error page ("file not found"), add a new template file named +`404.html` to the `custom_theme` directory. For information on what can be +included in a template, review the [Theme Developer Guide][custom theme]. + +To override the favicon, you can add a new icon file at +`custom_theme/img/favicon.ico`. + +To include a JavaScript library, copy the library to the `custom_theme/js/` +directory. + +Your directory structure should now look like this: + +```text +- docs/ + - index.html +- custom_theme/ + - img/ + - favicon.ico + - js/ + - somelib.js + - 404.html +- config.yml +``` + +NOTE: +Any files included in the parent theme (defined in `name`) but not +included in the `custom_dir` will still be utilized. The `custom_dir` will +only override/replace files in the parent theme. If you want to remove +files, or build a theme from scratch, then you should review the [Theme +Developer Guide][custom theme]. + +### Overriding Template Blocks + +The built-in themes implement many of their parts inside template blocks which +can be individually overridden in the `main.html` template. Simply create a +`main.html` template file in your `custom_dir` and define replacement blocks +within that file. Just make sure that the `main.html` extends `base.html`. For +example, to alter the title of the MkDocs theme, your replacement `main.html` +template would contain the following: + +```django +{% extends "base.html" %} + +{% block htmltitle %} +Custom title goes here +{% endblock %} +``` + +In the above example, the `htmltitle` block defined in your custom `main.html` file +will be used in place of the default `htmltitle` block defined in the parent theme. +You may re-define as many blocks as you desire, as long as those blocks are +defined in the parent. For example, you could replace the Google Analytics +script with one for a different service or replace the search feature with your +own. You will need to consult the parent theme you are using to determine what +blocks are available to override. The MkDocs and ReadTheDocs themes provide the +following blocks: + +* `site_meta`: Contains meta tags in the document head. +* `htmltitle`: Contains the page title in the document head. +* `styles`: Contains the link tags for stylesheets. +* `libs`: Contains the JavaScript libraries (jQuery, etc) included in the page header. +* `scripts`: Contains JavaScript scripts which should execute after a page loads. +* `analytics`: Contains the analytics script. +* `extrahead`: An empty block in the `` to insert custom tags/scripts/etc. +* `site_name`: Contains the site name in the navigation bar. +* `site_nav`: Contains the site navigation in the navigation bar. +* `search_button`: Contains the search box in the navigation bar. +* `next_prev`: Contains the next and previous buttons in the navigation bar. +* `repo`: Contains the repository link in the navigation bar. +* `content`: Contains the page content and table of contents for the page. +* `footer`: Contains the page footer. + +You may need to view the source template files to ensure your modifications will +work with the structure of the site. See [Template Variables] for a list of +variables you can use within your custom blocks. For a more complete +explanation of blocks, consult the [Jinja documentation]. + +### Combining the custom_dir and Template Blocks + +Adding a JavaScript library to the `custom_dir` will make it available, but +won't include it in the pages generated by MkDocs. Therefore, a link needs to +be added to the library from the HTML. + +Starting the with directory structure above (truncated): + +```text +- docs/ +- custom_theme/ + - js/ + - somelib.js +- config.yml +``` + +A link to the `custom_theme/js/somelib.js` file needs to be added to the +template. As `somelib.js` is a JavaScript library, it would logically go in the +`libs` block. However, a new `libs` block that only includes the new script will +replace the block defined in the parent template and any links to libraries in +the parent template will be removed. To avoid breaking the template, a +[super block] can be used with a call to `super` from within the block: + +```django +{% extends "base.html" %} + +{% block libs %} + {{ super() }} + +{% endblock %} +``` + +Note that the [base_url] template variable was used to ensure that the link is +always relative to the current page. + +Now the generated pages will include links to the template provided libraries as +well as the library included in the `custom_dir`. The same would be required for +any additional CSS files included in the `custom_dir`. + +[custom theme]: ../dev-guide/themes.md +[extra_css]: ./configuration.md#extra_css +[extra_javascript]: ./configuration.md#extra_javascript +[documentation directory]: ./configuration.md#docs_dir +[custom_dir]: ./configuration.md#custom_dir +[name]: ./configuration.md#name +[mkdocs]: ./choosing-your-theme.md#mkdocs +[browse source]: https://github.com/mkdocs/mkdocs/tree/master/mkdocs/themes/mkdocs +[Template Variables]: ../dev-guide/themes.md#template-variables +[Jinja documentation]: https://jinja.palletsprojects.com/en/latest/templates/#template-inheritance +[super block]: https://jinja.palletsprojects.com/en/latest/templates/#super-blocks +[base_url]: ../dev-guide/themes.md#base_url diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/deploying-your-docs.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/deploying-your-docs.md new file mode 100644 index 0000000..8224cb9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/deploying-your-docs.md @@ -0,0 +1,223 @@ +# Deploying your docs + +A basic guide to deploying your docs to various hosting providers + +--- + +## GitHub Pages + +If you host the source code for a project on [GitHub], you can easily use +[GitHub Pages] to host the documentation for your project. There are two basic +[types of GitHub Pages sites]: Project Pages sites, and User and Organization +Pages sites. They are nearly identical but have some important differences, +which require a different work flow when deploying. + +### Project Pages + +Project Pages sites are simpler as the site files get deployed to a branch +within the project repository (`gh-pages` by default). After you `checkout` the +primary working branch (usually `master`) of the git repository where you +maintain the source documentation for your project, run the following command: + +```sh +mkdocs gh-deploy +``` + +That's it! Behind the scenes, MkDocs will build your docs and use the +[ghp-import] tool to commit them to the `gh-pages` branch and push the +`gh-pages` branch to GitHub. + +Use `mkdocs gh-deploy --help` to get a full list of options available for the +`gh-deploy` command. + +Be aware that you will not be able to review the built site before it is pushed +to GitHub. Therefore, you may want to verify any changes you make to the docs +beforehand by using the `build` or `serve` commands and reviewing the built +files locally. + +WARNING: +You should never edit files in your pages repository by hand if you're using +the `gh-deploy` command because you will lose your work the next time you +run the command. + +WARNING: +If there are untracked files or uncommitted work in the local repository where +`mkdocs gh-deploy` is run, these will be included in the pages that are deployed. + +### Organization and User Pages + +User and Organization Pages sites are not tied to a specific project, and the +site files are deployed to the `master` branch in a dedicated repository named +with the GitHub account name. Therefore, you need working copies of two +repositories on our local system. For example, consider the following file +structure: + +```text +my-project/ + mkdocs.yml + docs/ +orgname.github.io/ +``` + +After making and verifying updates to your project you need to change +directories to the `orgname.github.io` repository and call the +`mkdocs gh-deploy` command from there: + +```sh +cd ../orgname.github.io/ +mkdocs gh-deploy --config-file ../my-project/mkdocs.yml --remote-branch master +``` + +Note that you need to explicitly point to the `mkdocs.yml` configuration file as +it is no longer in the current working directory. You also need to inform the +deploy script to commit to the `master` branch. You may override the default +with the [remote_branch] configuration setting, but if you forget to change +directories before running the deploy script, it will commit to the `master` +branch of your project, which you probably don't want. + +### Custom Domains + +GitHub Pages includes support for using a [Custom Domain] for your site. In +addition to the steps documented by GitHub, you need to take one additional step +so that MkDocs will work with your custom domain. You need to add a `CNAME` file +to the root of your [docs_dir]. The file must contain a single bare domain or +subdomain on a single line (see MkDocs' own [CNAME file] as an example). You may +create the file manually, or use GitHub's web interface to set up the custom +domain (under Settings / Custom Domain). If you use the web interface, GitHub +will create the `CNAME` file for you and save it to the root of your "pages" +branch. So that the file does not get removed the next time you deploy, you need +to copy the file to your `docs_dir`. With the file properly included in your +`docs_dir`, MkDocs will include the file in your built site and push it to your +"pages" branch each time you run the `gh-deploy` command. + +If you are having problems getting a custom domain to work, see GitHub's +documentation on [Troubleshooting custom domains]. + +[GitHub]: https://github.com/ +[GitHub Pages]: https://pages.github.com/ +[types of GitHub Pages sites]: https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#types-of-github-pages-sites +[ghp-import]: https://github.com/davisp/ghp-import +[remote_branch]: ./configuration.md#remote_branch +[Custom Domain]: https://help.github.com/articles/adding-or-removing-a-custom-domain-for-your-github-pages-site +[docs_dir]: ./configuration.md#docs_dir +[CNAME file]: https://github.com/mkdocs/mkdocs/blob/master/docs/CNAME +[Troubleshooting custom domains]: https://help.github.com/articles/troubleshooting-custom-domains/ + +## Read the Docs + +[Read the Docs][rtd] offers free documentation hosting. You can import your docs +using the Git version control system. Read the Docs supports MkDocs out-of-the-box. +Follow the [instructions] on their site to arrange the files in your repository properly, +create an account and point it at your publicly hosted repository. If properly +configured, your documentation will update each time you push commits to your +public repository. + +[rtd]: https://readthedocs.org/ +[instructions]: https://docs.readthedocs.io/en/stable/intro/getting-started-with-mkdocs.html + +## Other Providers + +Any hosting provider which can serve static files can be used to serve +documentation generated by MkDocs. While it would be impossible to document how +to upload the docs to every hosting provider out there, the following guidelines +should provide some general assistance. + +When you build your site (using the `mkdocs build` command), all of the files +are written to the directory assigned to the [site_dir] configuration option +(defaults to `"site"`) in your `mkdocs.yaml` config file. Generally, you will +simply need to copy the contents of that directory to the root directory of your +hosting provider's server. Depending on your hosting provider's setup, you may +need to use a graphical or command line [ftp], [ssh] or [scp] client to transfer +the files. + +For example, a typical set of commands from the command line might look +something like this: + +```sh +mkdocs build +scp -r ./site user@host:/path/to/server/root +``` + +Of course, you will need to replace `user` with the username you have with your +hosting provider and `host` with the appropriate domain name. Additionally, you +will need to adjust the `/path/to/server/root` to match the configuration of +your hosts' file system. + +[ftp]: https://en.wikipedia.org/wiki/File_Transfer_Protocol +[ssh]: https://en.wikipedia.org/wiki/Secure_Shell +[scp]: https://en.wikipedia.org/wiki/Secure_copy + +See your host's documentation for specifics. You will likely want to search +their documentation for "ftp" or "uploading site". + +## Local Files + +Rather than hosting your documentation on a server, you may instead distribute +the files directly, which can then be viewed in a browser using the `file://` +scheme. + +Note that, due to the security settings of all modern browsers, some things +will not work the same and some features may not work at all. In fact, a few +settings will need to be customized in very specific ways. + +- [site_url]: + + The `site_url` must be set to an empty string, which instructs MkDocs to + build your site so that it will work with the `file://` scheme. + + ```yaml + site_url: "" + ``` + +- [use_directory_urls]: + + Set `use_directory_urls` to `false`. Otherwise, internal links between + pages will not work properly. + + ```yaml + use_directory_urls: false + ``` + +- [search]: + + You will need to either disable the search plugin, or use a third-party + search plugin which is specifically designed to work with the `file://` + scheme. To disable all plugins, set the `plugins` setting to an empty list. + + ```yaml + plugins: [] + ``` + + If you have other plugins enabled, simply ensure that `search` is not + included in the list. + +When writing your documentation, it is imperative that all internal links use +relative URLs as [documented][internal links]. Remember, each reader of your +documentation will be using a different device and the files will likely be in a +different location on that device. + +If you expect your documentation to be viewed off-line, you may also need to be +careful about which themes you choose. Many themes make use of CDNs for various +support files, which require a live Internet connection. You will need to choose +a theme which includes all support files directly in the theme. + +When you build your site (using the `mkdocs build` command), all of the files +are written to the directory assigned to the [site_dir] configuration option +(defaults to `"site"`) in your `mkdocs.yaml` config file. Generally, you will +simply need to copy the contents of that directory and distribute it to your +readers. Alternatively, you may choose to use a third party tool to convert the +HTML files to some other documentation format. + +## 404 Pages + +When MkDocs builds the documentation it will include a 404.html file in the +[build directory][site_dir]. This file will be automatically used when +deploying to [GitHub](#github-pages) but only on a custom domain. Other web +servers may be configured to use it but the feature won't always be available. +See the documentation for your server of choice for more information. + +[site_dir]: ./configuration.md#site_dir +[site_url]: ./configuration.md#site_url +[use_directory_urls]: ./configuration.md#use_directory_urls +[search]: ./configuration.md#search +[internal links]: ./writing-your-docs.md#internal-links diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/installation.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/installation.md new file mode 100644 index 0000000..fbf0b91 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/installation.md @@ -0,0 +1,107 @@ +# MkDocs Installation + +A detailed guide. + +--- + +## Requirements + +MkDocs requires a recent version of [Python] and the Python package +manager, [pip], to be installed on your system. + +You can check if you already have these installed from the command line: + +```console +$ python --version +Python 3.8.2 +$ pip --version +pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) +``` + +If you already have those packages installed, you may skip down to [Installing +MkDocs](#installing-mkdocs). + +### Installing Python + +Install [Python] using your package manager of choice, or by downloading an +installer appropriate for your system from [python.org] and running it. + +> NOTE: +> If you are installing Python on Windows, be sure to check the box to have +> Python added to your PATH if the installer offers such an option (it's +> normally off by default). +> +> ![Add Python to PATH](../img/win-py-install.png) + +### Installing pip + +If you're using a recent version of Python, the Python package manager, [pip], +is most likely installed by default. However, you may need to upgrade pip to the +lasted version: + +```bash +pip install --upgrade pip +``` + +If you need to install pip for the first time, download [get-pip.py]. +Then run the following command to install it: + +```bash +python get-pip.py +``` + +## Installing MkDocs + +Install the `mkdocs` package using pip: + +```bash +pip install mkdocs +``` + +You should now have the `mkdocs` command installed on your system. Run `mkdocs +--version` to check that everything worked okay. + +```console +$ mkdocs --version +mkdocs, version 1.2.0 from /usr/local/lib/python3.8/site-packages/mkdocs (Python 3.8) +``` + +> NOTE: +> If you would like manpages installed for MkDocs, the [click-man] tool can +> generate and install them for you. Simply run the following two commands: +> +> ```bash +> pip install click-man +> click-man --target path/to/man/pages mkdocs +> ``` +> +> See the [click-man documentation] for an explanation of why manpages are +> not automatically generated and installed by pip. + +> NOTE: +> If you are using Windows, some of the above commands may not work +> out-of-the-box. +> +> A quick solution may be to preface every Python command with `python -m` +> like this: +> +> ```bash +> python -m pip install mkdocs +> python -m mkdocs +> ``` +> +> For a more permanent solution, you may need to edit your `PATH` environment +> variable to include the `Scripts` directory of your Python installation. +> Recent versions of Python include a script to do this for you. Navigate to +> your Python installation directory (for example `C:\Python38\`), open the +> `Tools`, then `Scripts` folder, and run the `win_add2path.py` file by double +> clicking on it. Alternatively, you can download the [script][a2p] and run it +> (`python win_add2path.py`). + +[Python]: https://www.python.org/ +[python.org]: https://www.python.org/downloads/ +[pip]: https://pip.readthedocs.io/en/stable/installing/ +[get-pip.py]: https://bootstrap.pypa.io/get-pip.py +[click-man]: https://github.com/click-contrib/click-man +[click-man documentation]: https://github.com/click-contrib/click-man#automatic-man-page-installation-with-setuptools-and-pip +[a2p]: https://github.com/python/cpython/blob/master/Tools/scripts/win_add2path.py diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/localizing-your-theme.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/localizing-your-theme.md new file mode 100644 index 0000000..279f4a8 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/localizing-your-theme.md @@ -0,0 +1,63 @@ +# Localizing Your Theme + +Display your theme in your preferred language. + +--- + +NOTE: +Theme localization only translates the text elements of the theme itself +(such as "next" and "previous" links), not the actual content of your +documentation. If you wish to create multilingual documentation, you need +to combine theme localization as described here with a third-party +internationalization/localization plugin. + +## Installation + +For theme localization to work, you must use a theme which supports it and +enable `i18n` (internationalization) support by installing `mkdocs[i18n]`: + +```bash +pip install 'mkdocs[i18n]' +``` + +## Supported locales + +In most cases a locale is designated by the [ISO-639-1] (2-letter) abbreviation +for your language. However, a locale may also include a territory (or region or +county) code as well. The language and territory must be separated by an +underscore. For example, some possible locales for English might include `en`, +`en_AU`, `en_GB`, and `en_US`. + +For a list of locales supported by the theme you are using, see that theme's +documentation. + +- [mkdocs](choosing-your-theme.md#mkdocs-locale) +- [readthedocs](choosing-your-theme.md#readthedocs-locale) + +WARNING: +If you configure a language locale which is not yet supported by the theme +that you are using, MkDocs will fall back to the theme's default locale. + +## Usage + +To specify the locale that MkDocs should use, set the [locale] +parameter of the [theme] configuration option to the appropriate code. + +For example, to build the `mkdocs` theme in French you would use the following +in your `mkdocs.yml` configuration file: + +```yaml +theme: + name: mkdocs + locale: fr +``` + +## Contributing theme translations + +If a theme has not yet been translated into your language, feel free to +contribute a translation using the [Translation Guide]. + +[Translation Guide]: ../dev-guide/translations.md +[locale]: configuration.md#locale +[theme]: configuration.md#theme +[ISO-639-1]: https://en.wikipedia.org/wiki/ISO_639-1 diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/writing-your-docs.md b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/writing-your-docs.md new file mode 100644 index 0000000..8327b10 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-docs/user-guide/writing-your-docs.md @@ -0,0 +1,540 @@ +# Writing your docs + +How to layout and write your Markdown source files. + +--- + +## File layout + +Your documentation source should be written as regular Markdown files (see +[Writing with Markdown](#writing-with-markdown) below), and placed in the +[documentation directory](configuration.md#docs_dir). By default, this directory +will be named `docs` and will exist at the top level of your project, alongside +the `mkdocs.yml` configuration file. + +The simplest project you can create will look something like this: + +```text +mkdocs.yml +docs/ + index.md +``` + +By convention your project homepage should be named `index.md` (see [Index +pages](#index-pages) below for details). Any of the following file +extensions may be used for your Markdown source files: `markdown`, `mdown`, +`mkdn`, `mkd`, `md`. All Markdown files included in your documentation +directory will be rendered in the built site regardless of any settings. + +NOTE: +Files and directories with names which begin with a dot (for example: `.foo.md` or `.bar/baz.md`) are ignored by MkDocs. This can be overridden with the [`exclude_docs` config](configuration.md#exclude_docs). + +You can also create multi-page documentation, by creating several Markdown +files: + +```text +mkdocs.yml +docs/ + index.md + about.md + license.md +``` + +The file layout you use determines the URLs that are used for the generated +pages. Given the above layout, pages would be generated for the following URLs: + +```text +/ +/about/ +/license/ +``` + +You can also include your Markdown files in nested directories if that better +suits your documentation layout. + +```text +docs/ + index.md + user-guide/getting-started.md + user-guide/configuration-options.md + license.md +``` + +Source files inside nested directories will cause pages to be generated with +nested URLs, like so: + +```text +/ +/user-guide/getting-started/ +/user-guide/configuration-options/ +/license/ +``` + +Any files which are not identified as Markdown files (by their file extension) +within the [documentation directory](configuration.md#docs_dir) are copied by +MkDocs to the built site unaltered. See +[how to link to images and media](#linking-to-images-and-media) below for details. + +### Index pages + +When a directory is requested, by default, most web servers will return an index +file (usually named `index.html`) contained within that directory if one exists. +For that reason, the homepage in all of the examples above has been named +`index.md`, which MkDocs will render to `index.html` when building the site. + +Many repository hosting sites provide special treatment for README files by +displaying the contents of the README file when browsing the contents of a +directory. Therefore, MkDocs will allow you to name your index pages as +`README.md` instead of `index.md`. In that way, when users are browsing your +source code, the repository host can display the index page of that directory as +it is a README file. However, when MkDocs renders your site, the file will be +renamed to `index.html` so that the server will serve it as a proper index file. + +If both an `index.md` file and a `README.md` file are found in the same +directory, then the `index.md` file is used and the `README.md` file is +ignored. + +### Configure Pages and Navigation + +The [nav](configuration.md#nav) configuration setting in your `mkdocs.yml` file +defines which pages are included in the global site navigation menu as well as +the structure of that menu. If not provided, the navigation will be +automatically created by discovering all the Markdown files in the +[documentation directory](configuration.md#docs_dir). An automatically created +navigation configuration will always be sorted alphanumerically by file name +(except that index files will always be listed first within a sub-section). You +will need to manually define your navigation configuration if you would like +your navigation menu sorted differently. + +A minimal navigation configuration could look like this: + +```yaml +nav: + - index.md + - about.md +``` + +All paths in the navigation configuration must be relative to the `docs_dir` +configuration option. If that option is set to the default value, `docs`, the +source files for the above configuration would be located at `docs/index.md` and +`docs/about.md`. + +The above example will result in two navigation items being created at the top +level and with their titles inferred from the contents of the Markdown file or, +if no title is defined within the file, of the file name. To override the title +in the `nav` setting add a title right before the filename. + +```yaml +nav: + - Home: index.md + - About: about.md +``` + +Note that if a title is defined for a page in the navigation, that title will be +used throughout the site for that page and will override any title defined +within the page itself. + +Navigation sub-sections can be created by listing related pages together under a +section title. For example: + +```yaml +nav: + - Home: index.md + - User Guide: + - Writing your docs: writing-your-docs.md + - Styling your docs: styling-your-docs.md + - About: + - License: license.md + - Release Notes: release-notes.md +``` + +With the above configuration we have three top level items: "Home", "User Guide" +and "About." "Home" is a link to the homepage for the site. Under the "User +Guide" section two pages are listed: "Writing your docs" and "Styling your +docs." Under the "About" section two more pages are listed: "License" and +"Release Notes." + +Note that a section cannot have a page assigned to it. Sections are only +containers for child pages and sub-sections. You may nest sections as deeply as +you like. However, be careful that you don't make it too difficult for your +users to navigate through the site navigation by over-complicating the nesting. +While sections may mirror your directory structure, they do not have to. + +Any pages not listed in your navigation configuration will still be rendered and +included with the built site, however, they will not be linked from the global +navigation and will not be included in the `previous` and `next` links. Such +pages will be "hidden" unless linked to directly. + +## Writing with Markdown + +MkDocs pages must be authored in [Markdown][md], a lightweight markup language +which results in easy-to-read, easy-to-write plain text documents that can be +converted to valid HTML documents in a predictable manner. + +MkDocs uses the [Python-Markdown] library to render Markdown documents to HTML. +Python-Markdown is almost completely compliant with the [reference +implementation][md], although there are a few very minor [differences]. + +In addition to the base Markdown [syntax] which is common across all Markdown +implementations, MkDocs includes support for extending the Markdown syntax with +Python-Markdown [extensions]. See the MkDocs' [markdown_extensions] +configuration setting for details on how to enable extensions. + +MkDocs includes some extensions by default, which are highlighted below. + +[Python-Markdown]: https://python-markdown.github.io/ +[md]: https://daringfireball.net/projects/markdown/ +[differences]: https://python-markdown.github.io/#differences +[syntax]: https://daringfireball.net/projects/markdown/syntax +[extensions]: https://python-markdown.github.io/extensions/ +[markdown_extensions]: configuration.md#markdown_extensions + +### Internal links + +MkDocs allows you to interlink your documentation by using regular Markdown +[links]. However, there are a few additional benefits to formatting those links +specifically for MkDocs as outlined below. + +[links]: https://daringfireball.net/projects/markdown/syntax#link + +#### Linking to pages + +When linking between pages in the documentation you can simply use the regular +Markdown [linking][links] syntax, including the *relative path* to the Markdown +document you wish to link to. + +```markdown +Please see the [project license](license.md) for further details. +``` + +When the MkDocs build runs, these Markdown links will automatically be +transformed into an HTML hyperlink to the appropriate HTML page. + +WARNING: +Using absolute paths with links is not officially supported. Relative paths +are adjusted by MkDocs to ensure they are always relative to the page. Absolute +paths are not modified at all. This means that your links using absolute paths +might work fine in your local environment but they might break once you deploy +them to your production server. + +If the target documentation file is in another directory you'll need to make +sure to include any relative directory path in the link. + +```markdown +Please see the [project license](../about/license.md) for further details. +``` + +The [toc] extension is used by MkDocs to generate an ID for every header in your +Markdown documents. You can use that ID to link to a section within a target +document by using an anchor link. The generated HTML will correctly transform +the path portion of the link, and leave the anchor portion intact. + +```markdown +Please see the [project license](about.md#license) for further details. +``` + +Note that IDs are created from the text of a header. All text is converted to +lowercase and any disallowed characters, including white-space, are converted to +dashes. Consecutive dashes are then reduced to a single dash. + +There are a few configuration settings provided by the toc extension which you +can set in your `mkdocs.yml` configuration file to alter the default behavior: + +* **`permalink`** + + Generate permanent links at the end of each header. Default: `False`. + + When set to True the paragraph symbol (¶ or `¶`) is used as the + link text. When set to a string, the provided string is used as the link + text. For example, to use the hash symbol (`#`) instead, do: + + ```yaml + markdown_extensions: + - toc: + permalink: "#" + ``` + +* **`baselevel`** + + Base level for headers. Default: `1`. + + This setting allows the header levels to be automatically adjusted to fit + within the hierarchy of your HTML templates. For example, if the Markdown + text for a page should not contain any headers higher than level 2 (`

`), + do: + + ```yaml + markdown_extensions: + - toc: + baselevel: 2 + ``` + + Then any headers in your document would be increased by 1. For example, the + header `# Header` would be rendered as a level 2 header (`

`) in the HTML + output. + +* **`separator`** + + Word separator. Default: `-`. + + Character which replaces white-space in generated IDs. If you prefer + underscores, then do: + + ```yaml + markdown_extensions: + - toc: + separator: "_" + ``` + +Note that if you would like to define multiple of the above settings, you must +do so under a single `toc` entry in the `markdown_extensions` configuration +option. + +```yml +markdown_extensions: + - toc: + permalink: "#" + baselevel: 2 + separator: "_" +``` + +[toc]: https://python-markdown.github.io/extensions/toc/ + +#### Linking to images and media + +As well as the Markdown source files, you can also include other file types in +your documentation, which will be copied across when generating your +documentation site. These might include images and other media. + +For example, if your project documentation needed to include a [GitHub Pages +CNAME file] and a PNG formatted screenshot image then your file layout might +look as follows: + +```text +mkdocs.yml +docs/ + CNAME + index.md + about.md + license.md + img/ + screenshot.png +``` + +To include images in your documentation source files, simply use any of the +regular Markdown image syntaxes: + +```Markdown +Cupcake indexer is a snazzy new project for indexing small cakes. + +![Screenshot](img/screenshot.png) + +*Above: Cupcake indexer in progress* +``` + +Your image will now be embedded when you build the documentation, and should +also be previewed if you're working on the documentation with a Markdown editor. + +[GitHub Pages CNAME file]: https://help.github.com/articles/using-a-custom-domain-with-github-pages/ + +#### Linking from raw HTML + +Markdown allows document authors to fall back to raw HTML when the Markdown +syntax does not meets the author's needs. MkDocs does not limit Markdown in this +regard. However, as all raw HTML is ignored by the Markdown parser, MkDocs is +not able to validate or convert links contained in raw HTML. When including +internal links within raw HTML, you will need to manually format the link +appropriately for the rendered document. + +### Meta-Data + +MkDocs includes support for both YAML and MultiMarkdown style meta-data (often +called front-matter). Meta-data consists of a series of keywords and values +defined at the beginning of a Markdown document, which are stripped from the +document prior to it being processing by Python-Markdown. The key/value pairs +are passed by MkDocs to the page template. Therefore, if a theme includes +support, the values of any keys can be displayed on the page or used to control +the page rendering. See your theme's documentation for information about which +keys may be supported, if any. + +In addition to displaying information in a template, MkDocs includes support for +a few predefined meta-data keys which can alter the behavior of MkDocs for that +specific page. The following keys are supported: + +* **`template`** + + The template to use with the current page. + + By default, MkDocs uses the `main.html` template of a theme to render + Markdown pages. You can use the `template` meta-data key to define a + different template file for that specific page. The template file must be + available on the path(s) defined in the theme's environment. + +* **`title`** + + The "title" to use for the document. + + MkDocs will attempt to determine the title of a document in the following + ways, in order: + + 1. A title defined in the [nav] configuration setting for a document. + + 2. A title defined in the `title` meta-data key of a document. + + 3. A level 1 Markdown header on the first line of the document body. + ([Setext-style] headers are supported *only since MkDocs 1.5*.) + + 4. The filename of a document. + + Upon finding a title for a page, MkDoc does not continue checking any + additional sources in the above list. + +[Setext-style]: https://daringfireball.net/projects/markdown/syntax#header + +#### YAML Style Meta-Data + +YAML style meta-data consists of [YAML] key/value pairs wrapped in YAML style +delimiters to mark the start and/or end of the meta-data. The first line of +a document must be `---`. The meta-data ends at the first line containing an +end deliminator (either `---` or `...`). The content between the delimiters is +parsed as [YAML]. + +```text +--- +title: My Document +summary: A brief description of my document. +authors: + - Waylan Limberg + - Tom Christie +date: 2018-07-10 +some_url: https://example.com +--- +This is the first paragraph of the document. +``` + +YAML is able to detect data types. Therefore, in the above example, the values +of `title`, `summary` and `some_url` are strings, the value of `authors` is a +list of strings and the value of `date` is a `datetime.date` object. Note that +the YAML keys are case sensitive and MkDocs expects keys to be all lowercase. +The top level of the YAML must be a collection of key/value pairs, which results +in a Python `dict` being returned. If any other type is returned or the YAML +parser encounters an error, then MkDocs does not recognize the section as +meta-data, the page's `meta` attribute will be empty, and the section is not +removed from the document. + +#### MultiMarkdown Style Meta-Data + +MultiMarkdown style meta-data uses a format first introduced by the +[MultiMarkdown] project. The data consists of a series of keywords and values +defined at the beginning of a Markdown document, like this: + +```text +Title: My Document +Summary: A brief description of my document. +Authors: Waylan Limberg + Tom Christie +Date: January 23, 2018 +blank-value: +some_url: https://example.com + +This is the first paragraph of the document. +``` + +The keywords are case-insensitive and may consist of letters, numbers, +underscores and dashes and must end with a colon. The values consist of anything +following the colon on the line and may even be blank. + +If a line is indented by 4 or more spaces, that line is assumed to be an +additional line of the value for the previous keyword. A keyword may have as +many lines as desired. All lines are joined into a single string. + +The first blank line ends all meta-data for the document. Therefore, the first +line of a document must not be blank. + +NOTE: +MkDocs does not support YAML style delimiters (`---` or `...`) for +MultiMarkdown style meta-data. In fact, MkDocs relies on the the presence or +absence of the delimiters to determine whether YAML style meta-data or +MultiMarkdown style meta-data is being used. If the delimiters are +detected, but the content between the delimiters is not valid YAML +meta-data, MkDocs does not attempt to parse the content as MultiMarkdown +style meta-data. + +[YAML]: https://yaml.org +[MultiMarkdown]: https://fletcherpenney.net/MultiMarkdown_Syntax_Guide#metadata +[nav]: configuration.md#nav + +### Tables + +The [tables] extension adds a basic table syntax to Markdown which is popular +across multiple implementations. The syntax is rather simple and is generally +only useful for simple tabular data. + +A simple table looks like this: + +```markdown +First Header | Second Header | Third Header +------------ | ------------- | ------------ +Content Cell | Content Cell | Content Cell +Content Cell | Content Cell | Content Cell +``` + +If you wish, you can add a leading and tailing pipe to each line of the table: + +```markdown +| First Header | Second Header | Third Header | +| ------------ | ------------- | ------------ | +| Content Cell | Content Cell | Content Cell | +| Content Cell | Content Cell | Content Cell | +``` + +Specify alignment for each column by adding colons to separator lines: + +```markdown +First Header | Second Header | Third Header +:----------- |:-------------:| -----------: +Left | Center | Right +Left | Center | Right +``` + +Note that table cells cannot contain any block level elements and cannot contain +multiple lines of text. They can, however, include inline Markdown as defined in +Markdown's [syntax] rules. + +Additionally, a table must be surrounded by blank lines. There must be a blank +line before and after the table. + +[tables]: https://python-markdown.github.io/extensions/tables/ + +### Fenced code blocks + +The [fenced code blocks] extension adds an alternate method of defining code +blocks without indentation. + +The first line should contain 3 or more backtick (`` ` ``) characters, and the +last line should contain the same number of backtick characters (`` ` ``): + +````markdown +``` +Fenced code blocks are like Standard +Markdown’s regular code blocks, except that +they’re not indented and instead rely on +start and end fence lines to delimit the +code block. +``` +```` + +With this approach, the language can optionally be specified on the first line +after the backticks which informs any syntax highlighters of the language used: + +````markdown +```python +def fn(): + pass +``` +```` + +Note that fenced code blocks can not be indented. Therefore, they cannot be +nested inside list items, blockquotes, etc. + +[fenced code blocks]: https://python-markdown.github.io/extensions/fenced_code_blocks/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-mkdocs.yml b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-mkdocs.yml new file mode 100644 index 0000000..7246e14 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-1.6.1-mkdocs.yml @@ -0,0 +1,79 @@ +site_name: MkDocs +site_url: https://www.mkdocs.org/ +site_description: Project documentation with Markdown. +site_author: MkDocs Team + +repo_url: https://github.com/mkdocs/mkdocs/ +edit_uri: blob/master/docs/ + +theme: + name: mkdocs + color_mode: auto + user_color_mode_toggle: true + locale: en + analytics: {gtag: 'G-274394082'} + highlightjs: true + hljs_languages: + - yaml + - django + +nav: + - Home: index.md + - Getting Started: getting-started.md + - User Guide: user-guide/ + - Developer Guide: dev-guide/ + - About: + - Release Notes: about/release-notes.md + - Contributing: about/contributing.md + - License: about/license.md + +extra_css: + - css/extra.css + +exclude_docs: | + *.py + +markdown_extensions: + - toc: + permalink:  + - attr_list + - def_list + - tables + - pymdownx.highlight: + use_pygments: false + - pymdownx.snippets + - pymdownx.superfences + - callouts + - mdx_gh_links: + user: mkdocs + repo: mkdocs + - mkdocs-click + +copyright: Copyright © 2014 Tom Christie, Maintained by the MkDocs Team. + +hooks: + - docs/hooks.py + +plugins: + - search + - redirects: + redirect_maps: + user-guide/plugins.md: dev-guide/plugins.md + user-guide/custom-themes.md: dev-guide/themes.md + user-guide/styling-your-docs.md: user-guide/choosing-your-theme.md + - autorefs + - literate-nav: + nav_file: README.md + implicit_index: true + - mkdocstrings: + handlers: + python: + options: + docstring_section_style: list + members_order: source + show_root_heading: true + show_source: false + show_signature_annotations: true + +watch: + - mkdocs diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/alternatives.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/alternatives.md new file mode 100644 index 0000000..dcfbda7 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/alternatives.md @@ -0,0 +1,112 @@ +# Alternatives + +There are tons of static site generators and themes out there and choosing the +right one for your tech stack is a tough decision. If you're unsure if Material +for MkDocs is the right solution for you, this section should help you evaluate +alternative solutions. + +## Docusaurus + +[Docusaurus] by Facebook is a very popular documentation generator and a good +choice if you or your company are already using [React] to build your site. +It will generate a [single page application] which is fundamentally different +from the site Material for MkDocs generates for you. + +__Advantages__ + +- Very powerful, customizable and extendable +- Provides many components that aid in technical writing +- Large and rich ecosystem, backed by Facebook + +__Challenges__ + +- High learning curve, JavaScript knowledge mandatory +- JavaScript ecosystem is very volatile, rather high maintenance +- More time needed to get up and running + +While [Docusaurus] is one of the best choices when it comes to documentation +sites that output a single page application, there are many more solutions, +including [Docz], [Gatsby], [Vuepress] and [Docsify] that approach +this problem similarly. + + [Docusaurus]: https://docusaurus.io/ + [React]: https://reactjs.org/ + [single page application]: https://en.wikipedia.org/wiki/Single-page_application + [Docz]: https://www.docz.site/ + [Gatsby]: https://www.gatsbyjs.com/ + [VuePress]: https://vuepress.vuejs.org/ + [Docsify]: https://docsify.js.org/ + +## Jekyll + +[Jekyll] is probably one of the most mature and widespread static site +generators and is written in [Ruby]. It is not specifically geared towards +technical project documentation and has many themes to choose from, which +can be challenging. + +__Advantages__ + +- Battle-tested, rich ecosystem, many themes to choose from +- Brings great capabilities for blogging (permalinks, tags, etc.) +- Generates a SEO-friendly site, similar to Material for MkDocs + +__Challenges__ + +- Not specifically geared towards technical project documentation +- Limited Markdown capabilities, not as advanced as Python Markdown +- More time needed to get up and running + + [Jekyll]: https://jekyllrb.com/ + [Ruby]: https://www.ruby-lang.org/de/ + +## Sphinx + +[Sphinx] is an alternative static site generator specifically geared towards +generating reference documentation, offering powerful capabilities that are +lacking in MkDocs. It uses [reStructured text], a format similar to Markdown, +which some users find harder to use. + +__Advantages__ + +- Very powerful, customizable and extendable +- Generates reference documentation from [Python docstrings] +- Large and rich ecosystem, used by many Python projects + +__Challenges__ + +- High learning curve, [reStructured text] syntax might be challenging +- Search is less powerful than the one provided by MkDocs +- More time needed to get up and running + +If you're considering using Sphinx because you need to generate reference +documentation, you should give [mkdocstrings] a try – an actively maintained +and popular framework building on top of MkDocs, implementing Sphinx-like +functionality. + + [Sphinx]: https://www.sphinx-doc.org/ + [reStructured text]: https://en.wikipedia.org/wiki/ReStructuredText + [Python docstrings]: https://www.python.org/dev/peps/pep-0257/ + [mkdocstrings]: https://github.com/mkdocstrings/mkdocstrings + +## GitBook + +[GitBook] offers a hosted documentation solution that generates a beautiful and +functional site from Markdown files in your GitHub repository. However, it was +once Open Source, but turned into a closed source solution some time ago. + +__Advantages__ + +- Hosted solution, minimal technical knowledge required +- Custom domains, authentication and other enterprise features +- Great collaboration features for teams + +__Challenges__ + +- Closed source, not free for proprietary projects +- Limited Markdown capabilities, not as advanced as Python Markdown +- Many Open Source projects moved away from GitBook + +Many users switched from [GitBook] to Material for MkDocs, as they want to keep +control and ownership of their documentation, favoring an Open Source solution. + + [GitBook]: https://www.gitbook.com/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/favicon.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/favicon.png new file mode 100644 index 0000000..6771c11 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/favicon.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/illustration.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/illustration.png new file mode 100644 index 0000000..69f739c Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/illustration.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zelda-dark-world.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zelda-dark-world.png new file mode 100644 index 0000000..275f858 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zelda-dark-world.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zelda-light-world.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zelda-light-world.png new file mode 100644 index 0000000..aaf9f71 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zelda-light-world.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical-bg.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical-bg.png new file mode 100644 index 0000000..56ed91c Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical-bg.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical-social.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical-social.png new file mode 100644 index 0000000..abf1d15 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical-social.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical.png new file mode 100644 index 0000000..30ce460 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/images/zensical.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/annotations.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/annotations.png new file mode 100644 index 0000000..a4422bc Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/annotations.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/back-to-top.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/back-to-top.png new file mode 100644 index 0000000..6771bad Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/back-to-top.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/consent.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/consent.png new file mode 100644 index 0000000..2ab700a Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/consent.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/content-tabs-link.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/content-tabs-link.png new file mode 100644 index 0000000..c0edb59 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/content-tabs-link.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/content-tabs.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/content-tabs.png new file mode 100644 index 0000000..1c68d5b Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/content-tabs.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/creating-your-site.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/creating-your-site.png new file mode 100644 index 0000000..0243b61 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/creating-your-site.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/feedback-report.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/feedback-report.png new file mode 100644 index 0000000..eb7e3be Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/feedback-report.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-navigation-toc.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-navigation-toc.png new file mode 100644 index 0000000..12fd440 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-navigation-toc.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-navigation.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-navigation.png new file mode 100644 index 0000000..e6c8b34 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-navigation.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-toc.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-toc.png new file mode 100644 index 0000000..ab94778 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/hide-toc.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/language-selection.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/language-selection.png new file mode 100644 index 0000000..964c671 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/language-selection.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-expand.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-expand.png new file mode 100644 index 0000000..a37c66a Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-expand.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-index-off.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-index-off.png new file mode 100644 index 0000000..ab3751c Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-index-off.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-index-on.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-index-on.png new file mode 100644 index 0000000..819069c Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-index-on.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-path-off.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-path-off.png new file mode 100644 index 0000000..b212e78 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-path-off.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-path-on.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-path-on.png new file mode 100644 index 0000000..0afb80f Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-path-on.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-sections.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-sections.png new file mode 100644 index 0000000..b0edf57 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-sections.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs-collapsed.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs-collapsed.png new file mode 100644 index 0000000..1c5d64e Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs-collapsed.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs-sticky.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs-sticky.png new file mode 100644 index 0000000..b8bd595 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs-sticky.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs.png new file mode 100644 index 0000000..96af83d Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation-tabs.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation.png new file mode 100644 index 0000000..82864b5 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/navigation.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-highlighting.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-highlighting.png new file mode 100644 index 0000000..69556e7 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-highlighting.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-share.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-share.png new file mode 100644 index 0000000..0271ba1 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-share.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-suggestions.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-suggestions.png new file mode 100644 index 0000000..20ccde9 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/search-suggestions.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-accent.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-accent.png new file mode 100644 index 0000000..8531f69 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-accent.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-debug.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-debug.png new file mode 100644 index 0000000..bef1c0a Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-debug.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-invert.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-invert.png new file mode 100644 index 0000000..156a4e9 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-invert.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-0.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-0.png new file mode 100644 index 0000000..063d5f9 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-0.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-1.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-1.png new file mode 100644 index 0000000..af66e76 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-1.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-2.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-2.png new file mode 100644 index 0000000..05efa9d Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-2.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-3.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-3.png new file mode 100644 index 0000000..1511b99 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-3.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-4.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-4.png new file mode 100644 index 0000000..45ad3cd Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-4.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-5.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-5.png new file mode 100644 index 0000000..7595600 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-5.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background-color.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background-color.png new file mode 100644 index 0000000..95ade51 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background-color.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background-image.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background-image.png new file mode 100644 index 0000000..d66cff1 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background-image.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background.png new file mode 100644 index 0000000..11d0f99 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-background.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-icon-circles.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-icon-circles.png new file mode 100644 index 0000000..c30d86f Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-icon-circles.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-icon.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-icon.png new file mode 100644 index 0000000..d3b82ac Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-icon.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-size.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-size.png new file mode 100644 index 0000000..a0a260e Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-size.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-align.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-align.png new file mode 100644 index 0000000..e05e4ab Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-align.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-ellipsis.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-ellipsis.png new file mode 100644 index 0000000..34750ae Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-ellipsis.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-shrink.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-shrink.png new file mode 100644 index 0000000..82670c3 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography-shrink.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography.png new file mode 100644 index 0000000..c4e97c7 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-layer-typography.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-variant.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-variant.png new file mode 100644 index 0000000..7bdaae3 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards-variant.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards.png new file mode 100644 index 0000000..40c51d7 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/social-cards.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags-index.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags-index.png new file mode 100644 index 0000000..35de440 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags-index.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags-search.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags-search.png new file mode 100644 index 0000000..4bea802 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags-search.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags.png new file mode 100644 index 0000000..9e93a9c Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/tags.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/toc-integrate.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/toc-integrate.png new file mode 100644 index 0000000..04fe87d Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/toc-integrate.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/version-warning.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/version-warning.png new file mode 100644 index 0000000..d7262c4 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/version-warning.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/versioning.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/versioning.png new file mode 100644 index 0000000..114334c Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/assets/screenshots/versioning.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/.authors.yml b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/.authors.yml new file mode 100644 index 0000000..a2a5dd4 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/.authors.yml @@ -0,0 +1,21 @@ +authors: + squidfunk: + name: Martin Donath + description: Creator + avatar: https://avatars.githubusercontent.com/u/932156 + url: https://github.com/squidfunk + alexvoss: + name: Alex Voss + description: Solutions Architect + avatar: https://avatars.githubusercontent.com/u/4134224 + url: https://github.com/alexvoss + pawamoy: + name: Timothée Mazzucotelli + description: Developer + avatar: https://avatars.githubusercontent.com/u/3999221 + url: https://github.com/pawamoy + katharinalisalin: + name: Kathi + description: Communications + avatar: https://avatars.githubusercontent.com/u/105352741 + url: https://github.com/katharinalisalin diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/.meta.yml b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/.meta.yml new file mode 100644 index 0000000..f71e2a2 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/.meta.yml @@ -0,0 +1,2 @@ +hide: + - feedback diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/index.md new file mode 100644 index 0000000..05761ac --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/index.md @@ -0,0 +1 @@ +# Blog diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/adding-a-badge-to-your-project.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/adding-a-badge-to-your-project.md new file mode 100644 index 0000000..26fd7bd --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/adding-a-badge-to-your-project.md @@ -0,0 +1,37 @@ +--- +title: Adding a badge to your project +date: 2023-11-30 +authors: [squidfunk] +slug: adding-a-badge-to-your-project +description: > + Share the love – you can now add a badge to your README, showing that your + project is built with Material for MkDocs +categories: + - General +--- + +# Adding a :simple-materialformkdocs: badge to your project + +__You enjoy working with Material for MkDocs? Share the love! You can now add +a badge to your project's README, showing that your project is built with +Material for MkDocs.__ + +Material for MkDocs' logo was just added to [Simple Icons], which is used by +[Shields.io] to include logos in badges. We generated a badge for you, which +you can add to your project's README: + +[![Material for MkDocs][badge]](#usage) + + + +## Usage + +Just copy the following snippet and paste it into your project's `README.md`: + +``` markdown +[![Built with Material for MkDocs](https://img.shields.io/badge/Material_for_MkDocs-526CFE?style=for-the-badge&logo=MaterialForMkDocs&logoColor=white)](https://squidfunk.github.io/mkdocs-material/) +``` + + [Simple Icons]: https://simpleicons.org/ + [Shields.io]: https://shields.io/ + [badge]: https://img.shields.io/badge/Material_for_MkDocs-526CFE?style=for-the-badge&logo=MaterialForMkDocs&logoColor=white diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/blog-support-just-landed.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/blog-support-just-landed.md new file mode 100644 index 0000000..8d83ecf --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/blog-support-just-landed.md @@ -0,0 +1,228 @@ +--- +date: 2022-09-12 +authors: [squidfunk] +description: > + Our new blog is built with the brand new built-in blog plugin. You can build + a blog alongside your documentation or standalone +categories: + - Blog +links: + - setup/setting-up-a-blog.md + - plugins/blog.md +--- + +# Blog support just landed + +__Hey there! You're looking at our new blog, built with the brand new +[built-in blog plugin]. With this plugin, you can easily build a blog alongside +your documentation or standalone.__ + +Proper support for blogging, as requested by many users over the past few years, +was something that was desperately missing from Material for MkDocs' feature set. +While everybody agreed that blogging support was a blind spot, it was not +obvious whether MkDocs could be extended in a way to allow for blogging as we +know it from [Jekyll] and friends. The [built-in blog plugin] proves that it is, +after all, possible to build a blogging engine on top of MkDocs, in order to +create a technical blog alongside your documentation, or as the main thing. + + + +_This article explains how to build a standalone blog with Material for MkDocs. +If you want to build a blog alongside your documentation, please refer to +[the plugin's documentation][built-in blog plugin]._ + + [built-in blog plugin]: ../../plugins/blog.md + [Jekyll]: https://jekyllrb.com/ + +## Quick start + +### Creating a standalone blog + +You can bootstrap a new project using the `mkdocs` executable: + +``` +mkdocs new . +``` + +This will create the following structure: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ index.md +└─ mkdocs.yml +``` + +#### Configuration + +In this article, we're going to build a standalone blog, which means that the +blog lives at the root of your project. For this reason, open `mkdocs.yml`, +and replace its contents with: + +``` yaml +site_name: My Blog +theme: + name: material + features: + - navigation.sections +plugins: + - blog: + blog_dir: . # (1)! + - search + - tags +nav: + - index.md +``` + +1. This is the important part – we're hosting the blog at the root of the + project, and not in a subdirectory. For more information, see the + [`blog_dir`][blog_dir] configuration option. + + [blog_dir]: ../../plugins/blog.md#config.blog_dir + +#### Blog setup + +The blog index page lives in `docs/index.md`. This page was pre-filled by +MkDocs with some content, so we're going to replace it with what we need to +bootstrap the blog: + +``` markdown +# Blog +``` + +That's it. + +### Writing your first post + +Now that we have set up the [built-in blog plugin], we can start writing our +first post. All blog posts are written with the [exact same Markdown flavor] as +already included with Material for MkDocs. First, create a folder called `posts` +with a file called `hello-world.md`: + +``` { .sh .no-copy } +. +├─ docs/ +│ ├─ posts/ +│ │ └─ hello-world.md # (1)! +│ └─ index.md +└─ mkdocs.yml +``` + +1. If you'd like to arrange posts differently, you're free to do so. The URLs + are built from the format specified in [`post_url_format`][post slugs] and + the titles and dates of posts, no matter how they are organized + inside the `posts` directory. + +Then, open up `hello-world.md`, and add the following lines: + +``` yaml +--- +draft: true # (1)! +date: 2022-01-31 +categories: + - Hello + - World +--- + +# Hello world! + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque nec +maximus ex. Sed consequat, nulla quis malesuada dapibus, elit metus vehicula +erat, ut egestas tellus eros at risus. In hac habitasse platea dictumst. +Phasellus id lacus pulvinar erat consequat pretium. Morbi malesuada arcu mauris +Nam vel justo sem. Nam placerat purus non varius luctus. Integer pretium leo in +sem rhoncus, quis gravida orci mollis. Proin id aliquam est. Vivamus in nunc ac +metus tristique pellentesque. Suspendisse viverra urna in accumsan aliquet. + + + +Donec volutpat, elit ac volutpat laoreet, turpis dolor semper nibh, et dictum +massa ex pulvinar elit. Curabitur commodo sit amet dolor sed mattis. Etiam +tempor odio eu nisi gravida cursus. Maecenas ante enim, fermentum sit amet +molestie nec, mollis ac libero. Vivamus sagittis suscipit eros ut luctus. + +Nunc vehicula sagittis condimentum. Cras facilisis bibendum lorem et feugiat. +In auctor accumsan ligula, at consectetur erat commodo quis. Morbi ac nunc +pharetra, pellentesque risus in, consectetur urna. Nulla id enim facilisis +arcu tincidunt pulvinar. Vestibulum laoreet risus scelerisque porta congue. +In velit purus, dictum quis neque nec, molestie viverra risus. Nam pellentesque +tellus id elit ultricies, vel finibus erat cursus. +``` + +1. If you mark a post as a [draft], a red marker appears next to the post date + on index pages. When the site is built, drafts are not included in the + output. [This behavior can be changed], e.g. for rendering drafts when + building deploy previews. + +When you spin up the [live preview server], you should be greeted by your first +post! You'll also realize, that [archive] and [category] indexes have been +automatically generated for you: + + ![Blog] + +However, this is just the start. The [built-in blog plugin] packs a lot of +functionality needed in day-to-day blogging. Visit the documentation of the +plugin to learn about the following topics: + +
+ +- [Adding an excerpt] +- [Adding authors] +- [Adding categories] +- [Adding tags] +- [Adding related links] +- [Linking from and to posts] +- [Setting the reading time] +- [Setting defaults] + +
+ +Additionally, the [built-in blog plugin] has dozens of [configuration options] +which allow for fine-tuning the output. You can configure post slugs, general +behavior and much more. + + [exact same Markdown flavor]: ../../reference/index.md + [post slugs]: ../../plugins/blog.md#config.post_url_format + [draft]: ../../plugins/blog.md#meta.draft + [This behavior can be changed]: ../../plugins/blog.md#config.draft + [live preview server]: ../../creating-your-site.md#previewing-as-you-write + [archive]: ../../plugins/blog.md#config.archive + [category]: ../../plugins/blog.md#config.categories + [Blog]: blog-support-just-landed/blog.png + [Blog post]: blog-support-just-landed/blog-post.png + [Adding an excerpt]: ../../setup/setting-up-a-blog.md#adding-an-excerpt + [Adding authors]: ../../setup/setting-up-a-blog.md#adding-authors + [Adding categories]: ../../setup/setting-up-a-blog.md#adding-categories + [Adding tags]: ../../setup/setting-up-a-blog.md#adding-tags + [Adding related links]: ../../setup/setting-up-a-blog.md#adding-related-links + [Linking from and to posts]: ../../setup/setting-up-a-blog.md#linking-from-and-to-posts + [Setting the reading time]: ../../setup/setting-up-a-blog.md#setting-the-reading-time + [Setting defaults]: ../../setup/setting-up-a-blog.md#setting-defaults + [configuration options]: ../../setup/setting-up-a-blog.md#configuration + +## What's next? + +Getting basic blogging support out the door was quite a challenge – the +[built-in blog plugin] is probably the biggest release this year and already +packs a lot of functionality. However, Material for MkDocs is used in many +different contexts, which is why we'd expect to iterate, as always. + +Some ideas already proposed by users: + +- __Blog series__: Authors should be able to create so called blog series and + assign posts to a blog series using simple identifiers. For each post that is + part of a series, a list with links to all other posts should be included in + the post's content. + +- __Author indexes__: Besides [archive] and [category] indexes, authors should + be able to create per-author indexes, which list all posts linked to an + author. Additionally, a profile should be created for each author and linked + from posts. + +- __Social share buttons__: It should be easy to share blog posts via social + media or other ways. For this reason, it should be possible to automatically + include social sharing buttons with each post. + +What's still missing from the brand new [built-in blog plugin]? Feel free to +share your ideas in the comments. Together, we can build one of the best modern +engines for technical blogging! diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/blog-support-just-landed/blog.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/blog-support-just-landed/blog.png new file mode 100644 index 0000000..a1ea1ea Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/blog-support-just-landed/blog.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/chinese-search-support.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/chinese-search-support.md new file mode 100644 index 0000000..541da99 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/chinese-search-support.md @@ -0,0 +1,82 @@ +--- +date: 2022-05-05 +authors: [squidfunk] +title: Chinese search support +description: > + Insiders adds Chinese language support for the built-in search plugin – a + feature that has been requested many times +categories: + - Search +links: + - blog/posts/search-better-faster-smaller.md + - plugins/search.md#segmentation +--- + +# Chinese search support – 中文搜索​支持 + +__Insiders adds experimental Chinese language support for the [built-in search +plugin] – a feature that has been requested for a long time given the large +number of Chinese users.__ + +After the United States and Germany, the third-largest country of origin of +Material for MkDocs users is China. For a long time, the [built-in search plugin] +didn't allow for proper segmentation of Chinese characters, mainly due to +missing support in [lunr-languages] which is used for search tokenization and +stemming. The latest Insiders release adds long-awaited Chinese language support +for the built-in search plugin, something that has been requested by many users. + + + +_Material for MkDocs終於​支持​中文​了!文本​被​正確​分割​並且​更​容易​找到。_ +{ style="display: inline" } + +_This article explains how to set up Chinese language support for the built-in +search plugin in a few minutes._ +{ style="display: inline" } + + [built-in search plugin]: ../../plugins/search.md + [lunr-languages]: https://github.com/MihaiValentin/lunr-languages + +## Configuration + +Chinese language support for Material for MkDocs is provided by [jieba], an +excellent Chinese text segmentation library. If [jieba] is installed, the +built-in search plugin automatically detects Chinese characters and runs them +through the segmenter. You can install [jieba] with: + +``` +pip install jieba +``` + +The next step is only required if you specified the [`separator`][separator] +configuration in `mkdocs.yml`. Text is segmented with [zero-width whitespace] +characters, so it renders exactly the same in the search modal. Adjust +`mkdocs.yml` so that the [`separator`][separator] includes the `\u200b` +character: + +``` yaml +plugins: + - search: + separator: '[\s\u200b\-]' +``` + +That's all that is necessary. + +## Usage + +If you followed the instructions in the configuration guide, Chinese words will +now be tokenized using [jieba]. Try searching for +[:octicons-search-24: 支持][q=支持] to see how it integrates with the +built-in search plugin. + +--- + +Note that this is an experimental feature, and I, @squidfunk, am not +proficient in Chinese (yet?). If you find a bug or think something can be +improved, please [open an issue]. + + [jieba]: https://pypi.org/project/jieba/ + [zero-width whitespace]: https://en.wikipedia.org/wiki/Zero-width_space + [separator]: ../../plugins/search.md#config.separator + [q=支持]: ?q=支持 + [open an issue]: https://github.com/squidfunk/mkdocs-material/issues/new/choose diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/excluding-content-from-search.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/excluding-content-from-search.md new file mode 100644 index 0000000..b838008 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/excluding-content-from-search.md @@ -0,0 +1,206 @@ +--- +date: 2021-09-26 +authors: [squidfunk] +description: > + Three new simple ways to exclude dedicated parts of a document from the search + index, allowing for more fine-grained control +categories: + - Search +links: + - blog/posts/search-better-faster-smaller.md + - setup/setting-up-site-search.md#search-exclusion +--- + +# Excluding content from search + +__The latest Insiders release brings three new simple ways to exclude +dedicated parts of a document from the search index, allowing for more +fine-grained control.__ + +Two weeks ago, Material for MkDocs Insiders shipped a [brand new search +plugin], yielding [massive improvements in usability], but also in [speed +and size] of the search index. Interestingly, as discussed in the previous +blog article, we only scratched the surface of what's now possible. This +release brings some useful features that enhance the writing experience, +allowing for more fine-grained control of what pages, sections and blocks of a +Markdown file should be indexed by the built-in search functionality. + + + +_The following section discusses existing solutions for excluding pages and +sections from the search index. If you immediately want to learn what's new, +skip to the [section just after that][what's new]._ + + [brand new search plugin]: search-better-faster-smaller.md + [massive improvements in usability]: search-better-faster-smaller.md#whats-new + [speed and size]: search-better-faster-smaller.md#benchmarks + [what's new]: #whats-new + +## Prior art + +MkDocs has a rich and thriving ecosystem of [plugins], and it comes as no +surprise that there's already a fantastic plugin by @chrieke to exclude specific +sections of a Markdown file – the [mkdocs-exclude-search] plugin. It can be +installed with: + +``` +pip install mkdocs-exclude-search +``` + +__How it works__: the plugin post-processes the `search_index.json` file that +is generated by the built-in search plugin, giving the author the ability to +exclude certain pages and sections by adding a few lines of configuration to +`mkdocs.yml`. An example: + +``` yaml +plugins: + - search + - exclude-search: + exclude: + - page.md + - page.md#section + - directory/* + - /*/page.md +``` + +It's easy to see that the plugin follows a configuration-centric approach, which +adds support for advanced filtering techniques like infix- and suffix-filtering +using wildcards. While this is a very powerful idea, it comes with some +downsides: + +1. __Exclusion patterns and content are not co-located__: exclusion patterns + need to be defined in `mkdocs.yml`, and not as part of the respective + document or section to be excluded. This might result in stale exclusion + patterns, leading to unintended behavior: + + - When a headline is changed, its slug (permalink) also changes, which might + suddenly match (or unmatch) a pattern, e.g., when an author fixes a typo + in a headline. + + - As exclusion patterns support the use of wildcards, different authors + might overwrite each other's patterns without any immediate feedback since + the plugin does only report the number of excluded documents – not _what_ + has been excluded.[^1] + + [^1]: + When the log level is set to `DEBUG`, the plugin will report exactly which + pages and sections have been excluded from the search index, but MkDocs will + now flood the terminal with debug output from its core and other plugins. + +2. __Exclusion control might be too coarse__: The [mkdocs-exclude-search] + plugin only allows for the exclusion of pages and sections. It's not + possible to exclude parts of a section, e.g., content that is irrelevant + to search but must be included as part of the documentation. + + [plugins]: https://github.com/mkdocs/mkdocs/wiki/MkDocs-Plugins + [mkdocs-exclude-search]: https://github.com/chrieke/mkdocs-exclude-search + +## What's new? + +The latest Insiders release brings fine-grained control for [__excluding pages, +sections, and blocks__][search exclusion] from the search index, implemented +through front matter, as well as the [Attribute Lists]. Note that it doesn't +replace the [mkdocs-exclude-search] plugin but __complements__ it. + + [search exclusion]: ../../setup/setting-up-site-search.md#search-exclusion + [Attribute Lists]: ../../setup/extensions/python-markdown.md#attribute-lists + +### Excluding pages + +An entire page can be excluded from the search index by adding a simple +directive to the front matter of the respective Markdown file. The good thing +is that the author now only has to check the top of the document to learn +whether it is excluded or not: + +``` yaml +--- +search: + exclude: true +--- + +# Page title +... +``` + +### Excluding sections + +If a section should be excluded, the author can use the [Attribute Lists] +extension to add a __pragma__ called `data-search-exclude` at the end of a +heading. The pragma is not included in the final HTML, as search pragmas are +filtered by the search plugin before the page is rendered: + +=== ":octicons-file-code-16: `docs/page.md`" + + ``` markdown + # Page title + + ## Section 1 + + The content of this section is included + + ## Section 2 { data-search-exclude } + + The content of this section is excluded + ``` + +=== ":octicons-codescan-16: `search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"", + "title":"Document title" + }, + { + "location":"page/#section-1", + "text":"

The content of this section is included

", + "title":"Section 1" + } + ] + } + ``` + +### Excluding blocks + +If even more fine-grained control is desired, the __pragma__ can be added to +any [block-level element] or [inline-level element] that is officially +supported by the [Attribute Lists] extension: + +=== ":octicons-file-code-16: `docs/page.md`" + + ``` markdown + # Page title + + The content of this block is included + + The content of this block is excluded + { data-search-exclude } + ``` + +=== ":octicons-codescan-16: `search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"

The content of this block is included

", + "title":"Document title" + }, + ] + } + ``` + + [block-level element]: https://python-markdown.github.io/extensions/attr_list/#block-level + [inline-level element]: https://python-markdown.github.io/extensions/attr_list/#inline + +## Conclusion + +The latest release brings three simple ways to control more precisely what goes +into the search index and what doesn't. It complements the already very powerful +[mkdocs-exclude-search] plugin, allowing for new methods of shaping the +structure, size and content of the search index. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/git-sparse-checkout.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/git-sparse-checkout.md new file mode 100644 index 0000000..e16b2a6 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/git-sparse-checkout.md @@ -0,0 +1,100 @@ +--- +date: 2023-09-22 +authors: [squidfunk] +categories: + - Build + - Performance +links: + - publishing-your-site.md#with-github-actions + - creating-your-site.md#building-your-site +--- + +# Using `git sparse-checkout` for faster documentation builds + +__Leveraging `git sparse-checkout` in GitHub Actions enabled us to speed up +documentation builds in our repository, cutting checkout times from 20 to 30 +seconds to just 2 seconds.__ + +Developing an efficient approach to build documentation in CI workflows is +essential, especially when working in large repositories with thousands of +commits, like ours. Of course, we want to build documentation quickly and +efficiently, ensuring fast and productive workflows. When using both the +wonderful [`git-committers`][git-committers] and [`git-revision-date-localized`] +[git-revision-date-localized] plugins to display [document contributors] and +[dates] at the bottom of each page, we are required to set `fetch-depth: 0`, +which resulted in checkout times of 20 to 30 seconds on our repository. By +leveraging [`git sparse-checkout`][git sparse-checkout] within [GitHub Actions], +check out time was brought down to 2 seconds. + + [git sparse-checkout]: https://git-scm.com/docs/git-sparse-checkout + [GitHub Actions]: ../../publishing-your-site.md#with-github-actions + [git-revision-date-localized]: https://github.com/timvink/mkdocs-git-revision-date-localized-plugin + [git-committers]: https://github.com/ojacques/mkdocs-git-committers-plugin-2 + [document contributors]: ../../setup/adding-a-git-repository.md#document-contributors + [dates]: ../../setup/adding-a-git-repository.md#document-dates + + + +## A Primer + +[`git sparse-checkout`][git sparse-checkout] allows you to check out only a +subset of the files in a repository, making it incredibly useful for large +repositories where a full checkout takes long and includes many files that are +not relevant when building documentation. + +## GitHub Actions + +To enable [`git sparse-checkout`][git sparse-checkout] within [GitHub Actions] +and ensure that you are only building the documentation that you need, add the +following lines to your workflow file: + +``` yaml +- uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + docs + includes +``` + +[`git sparse-checkout`][git sparse-checkout] always checks out all files +residing in the repository’s root. This means that regardless of the specified +paths or directories for sparse checkout, the files located in the root of the +repository will always be included in the checkout process. + +Thus, you only need to specify the directories that are necessary for building +documentation. In our case, we only need the `docs` and `includes` folders, +but if you need additional directories, you can just add them to the end of the +list. A complete example workflow for [GitHub Actions]: + +``` yaml hl_lines="13-18" +name: documentation +on: + push: + branches: + - master + - main +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + docs + includes + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force +``` + +## Conclusion + +That's all there is! We're super happy with the results and hope that this will +help you to speed up your documentation builds in [GitHub Actions] as well. As +always, feel free to share your thoughts and experiences in the comments below. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/goodbye-github-discussions.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/goodbye-github-discussions.md new file mode 100644 index 0000000..6747caf --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/goodbye-github-discussions.md @@ -0,0 +1,164 @@ +--- +date: 2025-11-18 +authors: + - squidfunk + - alexvoss + - katharinalisalin + - pawamoy +categories: + - General +icon: material/comment-off-outline +description: > + As Material for MkDocs entered maintenance mode and we're focusing our efforts on Zensical, our discussion board is now read-only +--- + +# Goodbye, GitHub Discussions + +__With the launch of [Zensical], we're evolving how we work together with the community to ensure long-term sustainability and professional support, fostering meaningful collaboration.__ + +The launch of Zensical [two weeks ago] marked a significant milestone, as it establishes a new foundation for our mission to build scalable Open Source systems for technical writing. Additionally, we're adopting a structured, transparent, and community-driven approach to guide the evolution of our projects – prioritizing what to build, and shaping Zensical's future together. + +[Our new approach] distills a decade of experience maintaining Material for MkDocs, allowing us to professionalize and scale our efforts from a small team to a fully organized operation, while keeping the software free and open to everyone. + +As Material for MkDocs has entered [maintenance mode], __our discussion board is now read-only__. + +In this article, we reflect on the challenges we've navigated, the lessons we've learned, as these experiences have shaped our approach to community management and support that we're building with Zensical. + +_You can subscribe to [our newsletter] to stay in the loop_. + + + + [Our new approach]: https://zensical.org/docs/community/how-we-work/ + [maintenance mode]: https://github.com/squidfunk/mkdocs-material/issues/8523 + [Zensical]: https://zensical.org + [two weeks ago]: zensical.md + [our newsletter]: https://zensical.org/about/newsletter/ + +--- + +__This is the fourth and final article in a four-part series:__ + +1. [Transforming Material for MkDocs] +2. [Zensical – A modern static site generator built by the creators of Material for MkDocs] +3. [Material for MkDocs Insiders – Now free for everyone] +4. [Goodbye, GitHub Discussions] + + [Transforming Material for MkDocs]: transforming-material-for-mkdocs.md + [Zensical – A modern static site generator built by the creators of Material for MkDocs]: zensical.md + [Material for MkDocs Insiders – Now free for everyone]: insiders-now-free-for-everyone.md + [Goodbye, GitHub Discussions]: goodbye-github-discussions.md + +## GitHub Issues + +Engagement with an Open Source project can take many forms – reporting bugs, submitting feature requests, seeking help, sharing ideas, participating in discussions, and contributing code. Each type of interaction requires a distinct approach to management. + +Historically, we relied on our GitHub issue tracker to handle bug reports and feature requests. However, a significant portion of user inquiries – questions, support requests, and guidance – also found their way into the issue tracker. Over time, this blurred the lines between development work and support, making it increasingly difficult to maintain focus on core development tasks. + +This is not unique to our project; many Open Source maintainers face similar challenges due to diverse skill levels and varying expectations within their communities. Clearly, Open Source projects needed a better solution to separate user support from development work. + +## GitHub Discussions + +In 2020, GitHub launched [GitHub Discussions] as a dedicated space for community interaction – a new channel to move support requests away from issue trackers. We immediately enabled discussions for Material for MkDocs, and redirected users to post questions and seek help.[^1] + + [^1]: + Before adopting GitHub Discussions, we maintained a Gitter channel, but ultimately chose to [consolidate our support efforts into a single platform]. While GitHub Discussions appeared promising, its mechanics proved ineffective. + + [consolidate our support efforts into a single platform]: sunsetting-gitter.md + +Then, as our community continued to expand – and as the vast majority of participants were seeking help rather than offering it – we launched the [Community Experts Program], giving those community members free access to Insiders for consistently providing high-quality assistance. + +### Structural challenges + +Despite these measures, we faced serveral structural challenges: + +1. __Material for MkDocs? MkDocs? Same, same__ – All too often, we were perceived as the entry point for the entire ecosystem. As a result, many issues and discussions that actually belonged upstream – such as problems with Python Markdown, MkDocs plugins, or MkDocs itself – landed on our desk. This created additional triage work for redirecting issues. + +2. __Yet another inbox__ – Although the discussion board was separate from the issue tracker, we ended up handling the majority of questions, effectively turning the discussion board into yet another inbox for us. Because the board is tied to the repository, unanswered discussions could be perceived as the project being unmaintained, putting pressure on us to respond. + +3. __A notification for everything__ – GitHub's notification system contributed to this problem. Any interaction within an issue or a discussion subscribes you to the entire thread, resulting in notifications for every comment, including: __+1__ – taking 2 seconds to type and submit, delivering a notification to the inbox of all other participants. + +4. __GitHub Discussions is a chat__ – Many users began treating GitHub Discussions more like a chat platform than a structured knowledge base. This created notification fatigue, reinforcing a pattern in which the community implicitly relied on maintainers to handle support requests. Everybody got a message, so the assumption was that things were taken care of – right? + +5. __Bug reports on our discussion board__ – From time to time, our [contribution guidelines] were ignored, leading to spurious bug reports on our discussion board instead of our issue tracker – "search doesn't work" is not an actionable bug report. However, when users followed our [bug reporting guidelines], we were able to fix most bugs within 24-48 hours. + + [Community Experts Program]: https://github.com/squidfunk/mkdocs-material/discussions/6363 + [GitHub Discussions]: https://github.com/features/discussions + [contribution guidelines]: https://squidfunk.github.io/mkdocs-material/contributing/ + [bug reporting guidelines]: https://squidfunk.github.io/mkdocs-material/contributing/reporting-a-bug/ + +### Addressing these challenges + +We actively addressed these challenges in various ways over time: by introducing carefully crafted issue templates on our issue tracker and creating detailed step-by-step guides on how to report bugs, request changes, and create pull requests effectively. + +Despite these efforts, success was limited. The underlying problem was that GitHub Discussions, while a step in the right direction, was not designed to handle the scale and diversity of our community. It lacked the structure and features necessary to support a large, active user base seeking help, making it impossible to fully resolve the challenges we faced. We believe that this is not unique to our project, but rather a systemic issue with GitHub Discussions, and that many Open Source maintainers encounter similar difficulties. + +The [Community Experts Program] helped reduce some of the support burden, but it could not fully address the structural limitations of using GitHub Discussions for user support. + +## Discussions now read-only + +With Material for MkDocs in [maintenance mode], __our GitHub Discussion board is now read-only__ – it remains accessible but will no longer accept new discussions or comments. All existing answers stay in place, ensuring that users can still find solutions to previously solved problems. + +!!! warning "Material for MkDocs is now in maintenance mode" + + We want to be transparent about the risks of staying on Material for MkDocs. With [MkDocs unmaintained] and facing fundamental supply chain concerns, we cannot guarantee Material for MkDocs will continue working reliably in the future. We're aware that transitioning takes time, which is why we commit to support it at least for the next 12 months, fixing critical bugs and security vulnerabilities as needed, but the path forward is with Zensical. + + If documentation plays a critical role in your organization, and you're worried how this might affect your business, consider joining [Zensical Spark](https://zensical.org/spark/), or feel free to schedule a call by reaching out at hello@zensical.org. + + [MkDocs unmaintained]: https://github.com/squidfunk/mkdocs-material/discussions/8461 + +### What this means for you + +For issues and questions related to the broader MkDocs ecosystem, we encourage users to ask for assistance on the issue trackers and discussion boards of the respective upstream projects: + +__MkDocs & Python Markdown__ + +- [MkDocs] – [Issues][MkDocs issues], [Discussions][MkDocs discussions] +- [Python Markdown] – [Issues][Python Markdown issues] +- [Pymdown Extensions] – [Issues][Pymdown Extensions issues], [Discussions][Pymdown Extensions discussions] + +__Popular MkDocs plugins__ + +- [Mike] – [Issues][Mike issues], [Discussions][Mike discussions] +- [Macros] – [Issues][Macros issues], [Discussions][Macros discussions] +- [Git Revision Date Localized] – [Issues][Git Revision Date Localized issues] +- [Awesome Nav] – [Issues][Awesome Nav issues] +- [Static i18n] – [Issues][Static i18n issues] +- [MkDocs Literate Nav] – [Issues][MkDocs Literate Nav issues] + +_For all other MkDocs plugins and Markdown extensions, please consult the [MkDocs catalog], and reach out to the maintainers of the respective projects._ + +_Join our [Discord] to become part of Zensical's growing community!_ + +## Looking ahead + +This article concludes our four-part series reflecting on the journey of maintaining Material for MkDocs and how it has paved the way for Zensical – our next chapter. + +[Our new approach] to community management and support is built directly on the lessons we've learned over the years. We are excited to begin this next chapter together with you and look forward to cultivating a vibrant, engaged, and sustainable community together. + +_You can subscribe to [our newsletter] to stay in the loop_. + + [MkDocs]: https://github.com/mkdocs/mkdocs + [MkDocs issues]: https://github.com/mkdocs/mkdocs/issues + [MkDocs discussions]: https://github.com/mkdocs/mkdocs/discussions + [Pymdown Extensions]: https://github.com/facelessuser/pymdown-extensions + [Pymdown Extensions discussions]: https://github.com/facelessuser/pymdown-extensions/discussions + [Pymdown Extensions issues]: https://github.com/facelessuser/pymdown-extensions/issues + [Python Markdown]: https://github.com/Python-Markdown/markdown + [Python Markdown issues]: https://github.com/Python-Markdown/markdown/issues + [Mike]: https://github.com/jimporter/mike + [Mike issues]: https://github.com/jimporter/mike/issues + [Mike discussions]: https://github.com/jimporter/mike/discussions + [Macros]: https://github.com/fralau/mkdocs-macros-plugin + [Macros issues]: https://github.com/fralau/mkdocs-macros-plugin/issues + [Macros discussions]: https://github.com/fralau/mkdocs-macros-plugin/discussions + [Git Revision Date Localized]: https://github.com/timvink/mkdocs-git-revision-date-localized-plugin + [Git Revision Date Localized issues]: https://github.com/timvink/mkdocs-git-revision-date-localized-plugin/issues + [Awesome Nav]: https://github.com/lukasgeiter/mkdocs-awesome-nav + [Awesome Nav issues]: https://github.com/lukasgeiter/mkdocs-awesome-nav/issues + [Static i18n]: https://github.com/ultrabug/mkdocs-static-i18n + [Static i18n issues]: https://github.com/ultrabug/mkdocs-static-i18n/issues + [Static i18n discussions]: https://github.com/ultrabug/mkdocs-static-i18n/discussions + [MkDocs Literate Nav]: https://github.com/oprypin/mkdocs-literate-nav + [MkDocs Literate Nav issues]: https://github.com/oprypin/mkdocs-literate-nav/issues + [MkDocs catalog]: https://github.com/mkdocs/catalog + [Discord]: https://discord.gg/hqXRNq9CjT diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/insiders-now-free-for-everyone.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/insiders-now-free-for-everyone.md new file mode 100644 index 0000000..c586bf9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/insiders-now-free-for-everyone.md @@ -0,0 +1,205 @@ +--- +date: 2025-11-11 +authors: + - squidfunk + - alexvoss + - katharinalisalin + - pawamoy +categories: + - General +icon: material/lock-open +description: > + We just released 9.7.0 – the final version of Material for MkDocs, which includes all features that were previously exclusive to sponsors +title: Insiders – Now free for everyone +slug: insiders-now-free-for-everyone +--- + +# Material for MkDocs Insiders – Now free for everyone + +__[9.7.0], the final version of Material for MkDocs, includes all features that were previously exclusive to sponsors, making Material for MkDocs Insiders available to everyone!__ + +As we're shifting our efforts to [Zensical], Material for MkDocs is entering [maintenance mode]. This means that while we'll continue to fix critical bugs and security issues for 12 month at least, no new features will be added to Material for MkDocs. + +We're also discontinuing our sponsorware model, saying [goodbye to GitHub Sponsors]. If you were a sponsor of our work, you already received an email mentioning that your sponsorship was cancelled. As one of the numerous individuals and organizations sponsoring Material for MkDocs over the past years – thank you! Your continued support has been invaluable. + +Now, we want everyone to benefit from all features we have developed for Material for MkDocs, which is why we're making all Insiders features available to everyone! + +This is the logical next step in our journey as we focus on Zensical – our next-generation static site generator built from the ground up to overcome MkDocs' technical limitations. Zensical is fully [Open Source, licensed under MIT], maintains [compatibility with Material for MkDocs], and can build your existing projects with minimal changes. + +In the coming months, we'll close the [feature parity] gap, bringing the expressiveness of Material for MkDocs to Zensical. + +_You can subscribe to [our newsletter] to stay in the loop_. + + + + [9.7.0]: ../../changelog/index.md#9.7.0 + [Zensical]: https://zensical.org + [maintenance mode]: https://github.com/squidfunk/mkdocs-material/issues/8523 + [goodbye to GitHub Sponsors]: zensical.md#goodbye-github-sponsors + [compatibility with Material for MkDocs]: zensical.md#maximum-compatibility + [Open Source, licensed under MIT]: https://zensical.org/about/license/ + [feature parity]: https://zensical.org/compatibility/features/ + [our newsletter]: https://zensical.org/about/newsletter/ + +--- + +__This is the third article in a four-part series:__ + +1. [Transforming Material for MkDocs] +2. [Zensical – A modern static site generator built by the creators of Material for MkDocs] +3. [Material for MkDocs Insiders – Now free for everyone] +4. [Goodbye, GitHub Discussions] + + [Transforming Material for MkDocs]: transforming-material-for-mkdocs.md + [Zensical – A modern static site generator built by the creators of Material for MkDocs]: zensical.md + [Material for MkDocs Insiders – Now free for everyone]: insiders-now-free-for-everyone.md + [Goodbye, GitHub Discussions]: goodbye-github-discussions.md + +## Available features + +Our sponsors have enjoyed exclusive access to the following premium features +for quite some time. With the release of [9.7.0], all these features are now available to everyone: + +
+ +- [x] [Blog plugin: pinned posts] +- [x] [Instant previews] +- [x] [Footnote tooltips] +- [x] [Tags plugin: advanced settings] +- [x] [Tags plugin: nested tags] +- [x] [Tags plugin: shadow tags] +- [x] [Stay on page when switching languages] +- [x] [Blog plugin: author profiles] +- [x] [Blog plugin: advanced settings] +- [x] [Projects plugin] +- [x] [Instant prefetching] +- [x] [Social plugin: custom layouts] +- [x] [Social plugin: background images] +- [x] [Code range selection] +- [x] [Code annotations: custom selectors] +- [x] [Privacy plugin: advanced settings] +- [x] [Optimize plugin] +- [x] [Navigation path] (Breadcrumbs) +- [x] [Typeset plugin] +- [x] [Privacy plugin: external links] + +
+ + [Optimize plugin]: ../../plugins/optimize.md + [Navigation path]: ../../setup/setting-up-navigation.md#navigation-path + [Blog plugin: advanced settings]: ../../setup/setting-up-a-blog.md#advanced-settings + [Blog plugin: author profiles]: ../../setup/setting-up-a-blog.md#adding-author-profiles + [Blog plugin: pinned posts]: ../../setup/setting-up-a-blog.md#pinning-a-post + [Instant prefetching]: ../../setup/setting-up-navigation.md#instant-prefetching + [Typeset plugin]: ../../plugins/typeset.md + [Footnote tooltips]: ../../reference/footnotes.md#footnote-tooltips + [Privacy plugin: external links]: ../../plugins/privacy.md#external-links + [Privacy plugin: advanced settings]: ../../setup/ensuring-data-privacy.md#advanced-settings + [Instant previews]: ../../setup/setting-up-navigation.md#instant-previews + [Social plugin: custom layouts]: ../../setup/setting-up-social-cards.md#customization + [Social plugin: background images]: ../../plugins/social.md#option.background_image + [Code range selection]: ../../reference/code-blocks.md#code-selection-button + [Code annotations: custom selectors]: ../../reference/code-blocks.md#custom-selectors + [Stay on page when switching languages]: ../../setup/changing-the-language.md#stay-on-page + [Projects plugin]: ../../plugins/projects.md + [Tags plugin: nested tags]: ../../setup/setting-up-tags.md#nested-tags + [Tags plugin: shadow tags]: ../../setup/setting-up-tags.md#shadow-tags + [Tags plugin: advanced settings]: ../../setup/setting-up-tags.md#advanced-settings + +!!! tip "[mkdocstrings Insiders is now free] as well" + + With [Timothée joining the Zensical team], he announced that all features previously reserved to his sponsors as part of [mkdocstrings] Insiders are now free for everyone as well! + + [mkdocstrings Insiders is now free]: https://pawamoy.github.io/posts/sunsetting-the-sponsorware-strategy/ + [Timothée joining the Zensical team]: zensical.md#were-growing-our-team + [mkdocstrings]: https://mkdocstrings.github.io/ + +## How to upgrade + +You can upgrade with the following command: + +``` +pip install --upgrade --force-reinstall mkdocs-material +``` + +## Switching from Insiders + +If you've been a user of Insiders, we recommend to switch to the community edition as soon as possible, as it includes all Insiders features. This will make it much easier to handle third-party contributions, since no personal access tokens are necessary. + +__From now on, bug fixes that we make to Material for MkDocs will only be released to the community edition. Security vulnerabilities will be fixed in both editions.__ + +Thus, please adjust your `requirements.txt` and GitHub Actions workflows: + +```diff +- pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders. git ++ pip install mkdocs-material + +``` + +The Insiders repository itself will remain available for the next 6 months. When you build your project with Insiders, it will now show an informational message pointing to this blog post. + +- __On February 1, 2026, this message will be turned into a warning__. +- __On May 1, 2026, the Insiders repository will be deleted__. + +## Sunsetting preparation + +Entering [maintenance mode], we're preparing Material for MkDocs for sunsetting. + +!!! warning "Material for MkDocs is now in maintenance mode" + + We want to be transparent about the risks of staying on Material for MkDocs. With [MkDocs unmaintained] and facing fundamental supply chain concerns, we cannot guarantee Material for MkDocs will continue working reliably in the future. We're aware that transitioning takes time, which is why we commit to support it at least for the next 12 months, fixing critical bugs and security vulnerabilities as needed, but the path forward is with Zensical. + + If documentation plays a critical role in your organization, and you're worried how this might affect your business, consider joining [Zensical Spark](https://zensical.org/spark/), or feel free to schedule a call by reaching out at hello@zensical.org. + + [MkDocs unmaintained]: https://github.com/squidfunk/mkdocs-material/discussions/8461 + +### Deprecations + +While we release all features to the general public, at the same time, we're deprecating the [Projects plugin] and the [Typeset plugin] due to maintainability issues. This means that these plugins will not receive any further updates, including no more bug fixes. + +The reason for this decision is that both plugins rely on too many workarounds to make them work with MkDocs, and subsequently have been key motivators to create [Zensical]. If you rely on these plugins, and they work for your use case, you can of course continue to use them. + +__With Zensical, we'll be shipping proper [sub-project support], including [internationalization] and [versioning], designing these features together with our professional users in [Zensical Spark].__ + + [Zensical Spark]: https://zensical.org/spark/ + [sub-project support]: https://zensical.org/about/roadmap/#subprojects + [internationalization]: https://zensical.org/about/roadmap/#internationalization + [versioning]: https://zensical.org/about/roadmap/#versioning + +### Version ranges + +Material for MkDocs has used semver version ranges for dependencies to ensure compatibility. With the advent of [9.7.0], we're switching from semver to minimal version ranges. This provides more flexibility in dependency resolution, specifically to allow users to use newer versions of dependencies that include important bug fixes or security patches. + +### Security + +We will not transfer ownership of the Material for MkDocs repository to another individual or organization. The repository and PyPI package will remain under the ownership of @squidfunk, which preserves the trusted supply chain our users depend on. + +Thus, if you wish to take on maintenance of Material for MkDocs, please create a fork. + +## Looking ahead + +### Achieving sustainability + +Where Material for MkDocs relied on sponsorware, Zensical takes a new approach, +to ensure it evolves to meet the needs of organizations building complex, enterprise-scale documentation. + +[Zensical Spark] is a collaborative space where professional users have a direct voice in shaping Zensical's future. Through a [structured design process] and together with our Zensical Spark members, we identify opportunities, validate proposals, and define priorities – turning their real-world documentation challenges into features that benefit the entire community. + +Reach out at hello@zensical.org to schedule a call to learn more about Zensical Spark, discuss your organization's needs, and how it helps us to make Zensical sustainable. + + [Zensical Spark]: https://zensical.org/spark/ + [structured design process]: https://zensical.org/docs/community/how-we-work/ + +### Our commitment to you + +If you're currently using Material for MkDocs, there's no need to rush. We're committed to keeping it secure and functional for the next 12 months while we focus our efforts on [Zensical]. + +The [9.7.0] release marks a significant shift – every Insiders feature is now available to everyone, with no sponsorship required. As we build [Zensical], each of these features will be rearchitected and improved. Zensical is entirely free and Open Source, ensuring the entire community benefits from our work without barriers. + +When you're ready to explore what's next, [Zensical is compatible with Material for MkDocs] and designed to be a natural evolution of the ideas and principles you already know. + +_If you loved Material for MkDocs and are excited about Zensical, we'll be providing new methods to support our work in the coming months, with the possibility of getting exclusive goodies._ + +_Subscribe to [our newsletter] to stay in the loop._ + + [Zensical is compatible with Material for MkDocs]: zensical.md#maximum-compatibility diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller.md new file mode 100644 index 0000000..969d897 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller.md @@ -0,0 +1,629 @@ +--- +date: 2021-09-13 +authors: [squidfunk] +readtime: 15 +description: > + How we rebuilt client-side search, delivering a better user experience while + making it faster and smaller at the same time +categories: + - Search + - Performance +links: + - plugins/search.md +--- + +# Search: better, faster, smaller + +__This is the story of how we managed to completely rebuild client-side search, +delivering a significantly better user experience while making it faster and +smaller at the same time.__ + +The [search] of Material for MkDocs is by far one of its best and most-loved +assets: [multilingual], [offline-capable], and most importantly: _all +client-side_. It provides a solution to empower the users of your documentation +to find what they're searching for instantly without the headache of managing +additional servers. However, even though several iterations have been made, +there's still some room for improvement, which is why we rebuilt the search +plugin and integration from the ground up. This article shines some light on the +internals of the new search, why it's much more powerful than the previous +version, and what's about to come. + + + +_The next section discusses the architecture and issues of the current search +implementation. If you immediately want to learn what's new, skip to the +[section just after that][what's new]._ + + [search]: ../../setup/setting-up-site-search.md + [multilingual]: ../../plugins/search.md#config.lang + [offline-capable]: ../../setup/building-for-offline-usage.md + [what's new]: #whats-new + +## Architecture + +Material for MkDocs uses [lunr] together with [lunr-languages] to implement +its client-side search capabilities. When a documentation page is loaded and +JavaScript is available, the search index as generated by the +[built-in search plugin] during the build process is requested from the +server: + +``` ts +const index$ = document.forms.namedItem("search") + ? __search?.index || requestJSON( + new URL("search/search_index.json", config.base) + ) + : NEVER +``` + + [lunr]: https://lunrjs.com + [lunr-languages]: https://github.com/MihaiValentin/lunr-languages + [built-in search plugin]: ../../plugins/search.md + +### Search index + +The search index includes a stripped-down version of all pages. Let's take a +look at an example to understand precisely what the search index contains from +the original Markdown file: + +??? example "Expand to inspect example" + + === ":octicons-file-code-16: `docs/page.md`" + + ```` markdown + # Example + + ## Text + + It's very easy to make some words **bold** and other words *italic* + with Markdown. You can even add [links](#), or even `code`: + + ``` + if (isAwesome) { + return true + } + ``` + + ## Lists + + Sometimes you want numbered lists: + + 1. One + 2. Two + 3. Three + + Sometimes you want bullet points: + + * Start a line with a star + * Profit! + ```` + + === ":octicons-codescan-16: `search_index.json`" + + ``` json + { + "config": { + "indexing": "full", + "lang": [ + "en" + ], + "min_search_length": 3, + "prebuild_index": false, + "separator": "[\\s\\-]+" + }, + "docs": [ + { + "location": "page/", + "title": "Example", + "text": "Example Text It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true } Lists Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!" + }, + { + "location": "page/#example", + "title": "Example", + "text": "" + }, + { + "location": "page/#text", + "title": "Text", + "text": "It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true }" + }, + { + "location": "page/#lists", + "title": "Lists", + "text": "Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!" + } + ] + } + ``` + +If we inspect the search index, we immediately see several problems: + + 1. __All content is included twice__: the search index contains one entry + with the entire contents of the page, and one entry for each section of + the page, i.e., each block preceded by a headline or subheadline. This + significantly contributes to the size of the search index. + + 2. __All structure is lost__: when the search index is built, all structural + information like HTML tags and attributes are stripped from the content. + While this approach works well for paragraphs and inline formatting, it + might be problematic for lists and code blocks. An excerpt: + + ``` + … links , or even code : if (isAwesome) { … } Lists Sometimes you want … + ``` + + - __Context__: for an untrained eye, the result can look like gibberish, as + it's not immediately apparent what classifies as text and what as code. + Furthermore, it's not clear that `Lists` is a headline as it's merged + with the code block before and the paragraph after it. + + - __Punctuation__: inline elements like links that are immediately followed + by punctuation are separated by whitespace (see `,` and `:` in the + excerpt). This is because all extracted text is joined with a whitespace + character during the construction of the search index. + +It's not difficult to see that it can be quite challenging to implement a good +search experience for theme authors, which is why Material for MkDocs (up to +now) did some [monkey patching] to be able to render slightly more +meaningful search previews. + + [monkey patching]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/document/index.ts#L68-L71 + +### Search worker + +The actual search functionality is implemented as part of a web worker[^1], +which creates and manages the [lunr] search index. When search is initialized, +the following steps are taken: + + [^1]: + Prior to , search was carried out in the main + thread which locked up the browser, rendering it unusable. This problem was + first reported in #904 and, after some back and forth, fixed and released in + . + +1. __Linking sections with pages__: The search index is parsed, and each + section is linked to its parent page. The parent page itself is _not + indexed_, as it would lead to duplicate results, so only the sections + remain. Linking is necessary, as search results are grouped by page. + +2. __Tokenization__: The `title` and `text` values of each section are split + into tokens by using the [`separator`][separator] as configured in + `mkdocs.yml`. Tokenization itself is carried out by + [lunr's default tokenizer][default tokenizer], which doesn't allow for + lookahead or separators spanning multiple characters. + + > Why is this important and a big deal? We will see later how much more we + > can achieve with a tokenizer that is capable of separating strings with + > lookahead. + +3. __Indexing__: As a final step, each section is indexed. When querying the + index, if a search query includes one of the tokens as returned by step 2., + the section is considered to be part of the search result and passed to the + main thread. + +Now, that's basically how the search worker operates. Sure, there's a little +more magic involved, e.g., search results are [post-processed] and [rescored] to +account for some shortcomings of [lunr], but in general, this is how data gets +into and out of the index. + + [separator]: ../../plugins/search.md#config.separator + [default tokenizer]: https://github.com/olivernn/lunr.js/blob/aa5a878f62a6bba1e8e5b95714899e17e8150b38/lunr.js#L413-L456 + [post-processed]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/_/index.ts#L249-L272 + [rescored]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/_/index.ts#L274-L275 + +### Search previews + +Users should be able to quickly scan and evaluate the relevance of a search +result in the given context, which is why a concise summary with highlighted +occurrences of the search terms found is an essential part of a great search +experience. + +This is where the current search preview generation falls short, as some of the +search previews appear not to include any occurrence of any of the search +terms. This was due to the fact that search previews were [truncated after a +maximum of 320 characters][truncated], as can be seen here: + +
+ +![search preview] + +
+ +The first two results look like they're not relevant, as they don't seem to +include the query string the user just searched for. Yet, they are. + +
+
+ +A better solution to this problem has been on the roadmap for a very, very long +time, but in order to solve this once and for all, several factors need to be +carefully considered: + +1. __Word boundaries__: some themes[^2] for static site generators generate + search previews by expanding the text left and right next to an occurrence, + stopping at a whitespace character when enough words have been consumed. A + preview might look like this: + + ``` + … channels, e.g., or which can be configured via mkdocs.yml … + ``` + + While this may work for languages that use whitespace as a separator + between words, it breaks down for languages like Japanese or Chinese[^3], + as they have non-whitespace word boundaries and use dedicated segmenters to + split strings into tokens. + + [^2]: + At the time of writing, [Just the Docs] and [Docusaurus] use this method + for generating search previews. Note that the latter also integrates with + Algolia, which is a fully managed server-based solution. + + [^3]: + China and Japan are both within the top 5 countries of origin of users of + Material for MkDocs. + + [truncated]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/assets/javascripts/templates/search/index.tsx#L90 + [search preview]: search-better-faster-smaller/search-preview.png + [Just the Docs]: https://just-the-docs.com + [Docusaurus]: https://github.com/lelouch77/docusaurus-lunr-search + +1. __Context-awareness__: Although whitespace doesn't work for all languages, + one could argue that it could be a good enough solution. Unfortunately, this + is not necessarily true for code blocks, as the removal of whitespace might + change meaning in some languages. + +3. __Structure__: Preserving structural information is not a must, but + apparently beneficial to build more meaningful search previews which allow + for a quick evaluation of relevance. If a word occurrence is part of a code + block, it should be rendered as a code block. + +## What's new? + +After we built a solid understanding of the problem space and before we dive +into the internals of our new search implementation to see which of the +problems it already solves, a quick overview of what features and improvements +it brings: + +- __Better__: support for [rich search previews], preserving the structural + information of code blocks, inline code, and lists, so they are rendered + as-is, as well as [lookahead tokenization], [more accurate highlighting], and + improved stability of typeahead. Also, a [slightly better UX]. +- __Faster__ and __smaller__: significant decrease in search index size of up + to 48% due to improved extraction and construction techniques, resulting in a + search experience that is up to 95% faster, which is particularly helpful for + large documentation projects. + + [rich search previews]: #rich-search-previews + [lookahead tokenization]: #tokenizer-lookahead + [more accurate highlighting]: #accurate-highlighting + [slightly better UX]: #user-interface + +### Rich search previews + +As we rebuilt the search plugin from scratch, we reworked the construction of +the search index to preserve the structural information of code blocks, inline +code, as well as unordered and ordered lists. Using the example from the +[search index] section, here's how it looks: + +=== "Now" + + ![search preview now] + +=== "Before" + + ![search preview before] + +Now, __code blocks are first-class citizens of search previews__, and even +inline code formatting is preserved. Let's take a look at the new structure of +the search index to understand why: + +??? example "Expand to inspect search index" + + === "Now" + + ``` json + { + ... + "docs": [ + { + "location": "page/", + "title": "Example", + "text": "" + }, + { + "location": "page/#text", + "title": "Text", + "text": "

It's very easy to make some words bold and other words italic with Markdown. You can even add links, or even code:

if (isAwesome){\n  return true\n}\n
" + }, + { + "location": "page/#lists", + "title": "Lists", + "text": "

Sometimes you want numbered lists:

  1. One
  2. Two
  3. Three

Sometimes you want bullet points:

  • Start a line with a star
  • Profit!
" + } + ] + } + ``` + + === "Before" + + ``` json + { + ... + "docs": [ + { + "location": "page/", + "title": "Example", + "text": "Example Text It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true } Lists Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!" + }, + { + "location": "page/#example", + "title": "Example", + "text": "" + }, + { + "location": "page/#text", + "title": "Text", + "text": "It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true }" + }, + { + "location": "page/#lists", + "title": "Lists", + "text": "Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!" + } + ] + } + ``` + +If we inspect the search index again, we can see how the situation improved: + +1. __Content is included only once__: the search index does not include the + content of the page twice, as only the sections of a page are part of the + search index. This leads to a significant reduction in size, fewer bytes to + transfer, and a smaller search index. + +2. __Some structure is preserved__: each section of the search index includes + a small subset of HTML to provide the necessary structure to allow for more + sophisticated search previews. Revisiting our example from before, let's + look at an excerpt: + + === "Now" + + ``` html + … links, or even code:

if (isAwesome){ … }\n
+ ``` + + === "Before" + + ``` + … links , or even code : if (isAwesome) { … } + ``` + + The punctuation issue is gone, as no additional whitespace is inserted, and + the preserved markup yields additional context to make scanning search + results more effective. + +On to the next step in the process: __tokenization__. + + [search index]: #search-index + [search preview now]: search-better-faster-smaller/search-preview-now.png + [search preview before]: search-better-faster-smaller/search-preview-before.png + +### Tokenizer lookahead + +The [default tokenizer] of [lunr] uses a regular expression to split a given +string by matching each character against the [`separator`][separator] as +defined in `mkdocs.yml`. This doesn't allow for more complex separators based +on lookahead or multiple characters. + +Fortunately, __our new search implementation provides an advanced tokenizer__ +that doesn't have these shortcomings and supports more complex regular +expressions. As a result, Material for MkDocs just changed its own separator +configuration to the following value: + +``` +[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t; +``` + +While the first part up to the first `|` contains a list of single control +characters at which the string should be split, the following three sections +explain the remainder of the regular expression.[^4] + + [^4]: + As a fun fact: the [`separator`][separator] [default value] of the search + plugin being `[\s\-]+` always has been kind of irritating, as it suggests + that multiple characters can be considered being a separator. However, the + `+` is completely irrelevant, as regular expression groups involving + multiple characters were never supported by + [lunr's default tokenizer][default tokenizer]. + + [default value]: https://www.mkdocs.org/user-guide/configuration/#separator + +#### Case changes + +Many programming languages use `PascalCase` or `camelCase` naming conventions. +When a user searches for the term `case`, it's quite natural to expect for +`PascalCase` and `camelCase` to show up. By adding the following match group to +the separator, this can now be achieved with ease: + +``` +(?!\b)(?=[A-Z][a-z]) +``` + +This regular expression is a combination of a negative lookahead (`\b`, i.e., +not a word boundary) and a positive lookahead (`[A-Z][a-z]`, i.e., an uppercase +character followed by a lowercase character), and has the following behavior: + +- `PascalCase` :octicons-arrow-right-24: `Pascal`, `Case` +- `camelCase` :octicons-arrow-right-24: `camel`, `Case` +- `UPPERCASE` :octicons-arrow-right-24: `UPPERCASE` + +Searching for [:octicons-search-24: searchHighlight][q=searchHighlight] +now brings up the section discussing the `search.highlight` feature flag, which +also demonstrates that this now even works properly for search queries.[^5] + + [^5]: + Previously, the search query was not correctly tokenized due to the way + [lunr] treats wildcards, as it disables the pipeline for search terms that + contain wildcards. In order to provide a good typeahead experience, + Material for MkDocs adds wildcards to the end of each search term not + explicitly preceded with `+` or `-`, effectively disabling tokenization. + + [q=searchHighlight]: ?q=searchHighlight + +#### Version numbers + +Indexing version numbers is another problem that can be solved with a small +lookahead. Usually, `.` should be considered a separator to split words like +`search.highlight`. However, splitting version numbers at `.` will make them +undiscoverable. Thus, the following expression: + +``` +\.(?!\d) +``` + +This regular expression matches a `.` only if not immediately followed by a +digit `\d`, which leaves version numbers discoverable. Searching for +[:octicons-search-24: 7.2.6][q=7.2.6] brings up the [7.2.6] release notes. + + [q=7.2.6]: ?q=7.2.6 + [7.2.6]: ../../changelog/index.md#7.2.6 + +#### HTML/XML tags + +If your documentation includes HTML/XML code examples, you may want to allow +users to find specific tag names. Unfortunately, the `<` and `>` control +characters are encoded in code blocks as `<` and `>`. Now, adding the +following expression to the separator allows for just that: + +``` +&[lg]t; +``` + +--- + +_We've only just begun to scratch the surface of the new possibilities +tokenizer lookahead brings. If you found other useful expressions, you're +invited to share them in the comment section._ + +### Accurate highlighting + +Highlighting is the last step in the process of search and involves the +highlighting of all search term occurrences in a given search result. For a +long time, highlighting was implemented through dynamically generated +[regular expressions].[^6] + +This approach has some problems with non-whitespace languages like Japanese or +Chinese[^3] since it only works if the highlighted term is at a word boundary. +However, Asian languages are tokenized using a [dedicated segmenter], which +cannot be modeled with regular expressions. + + [^6]: + Using the separator as defined in `mkdocs.yml`, a regular expression was + constructed that was trying to mimic the tokenizer. As an example, the + search query `search highlight` was transformed into the rather cumbersome + regular expression `(^|)(search|highlight)`, which only matches + at word boundaries. + +Now, as a direct result of the [new tokenization approach], __our new search +implementation uses token positions for highlighting__, making it exactly as +powerful as tokenization: + +1. __Word boundaries__: as the new highlighter uses token positions, word + boundaries are equal to token boundaries. This means that more complex cases + of tokenization (e.g., [case changes], [version numbers], [HTML/XML tags]), + are now all highlighted accurately. + +2. __Context-awareness__: as the new search index preserves some of the + structural information of the original document, the content of a section + is now divided into separate content blocks – paragraphs, code blocks, and + lists. + + Now, only the content blocks that actually contain occurrences of one of + the search terms are considered for inclusion into the search preview. If a + term only occurs in a code block, it's the code block that gets rendered, + see, for example, the results of + [:octicons-search-24: twitter][q=twitter]. + + [regular expressions]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/highlighter/index.ts#L61-L91 + [dedicated segmenter]: http://chasen.org/~taku/software/TinySegmenter/ + [new tokenization approach]: #tokenizer-lookahead + [case changes]: #case-changes + [version numbers]: #version-numbers + [HTML/XML tags]: #htmlxml-tags + [q=twitter]: ?q=twitter + +### Benchmarks + +We conducted two benchmarks – one with the documentation of Material for MkDocs +itself, and one with a very massive corpus of Markdown files with more than +800,000 words – a size most documentation projects will likely never +reach: + +
+ +| | Before | Now | Relative | +| ----------------------- | -------: | -------------: | -----------: | +| __Material for MkDocs__ | | | | +| Index size | 573 kB | __335 kB__ | __–42%__ | +| Index size (`gzip`) | 105 kB | __78 kB__ | __–27%__ | +| Indexing time[^7] | 265 ms | __177 ms__ | __–34%__ | +| __KJV Markdown[^8]__ | | | | +| Index size | 8.2 MB | __4.4 MB__ | __–47%__ | +| Index size (`gzip`) | 2.3 MB | __1.2 MB__ | __–48%__ | +| Indexing time | 2,700 ms | __1,390 ms__ | __–48%__ | + +
+

Benchmark results

+
+ +
+ + [^7]: + Smallest value of ten distinct runs. + + [^8]: + We agnostically use [KJV Markdown] as a tool for testing to learn how + Material for MkDocs behaves on large corpora, as it's a very large set of + Markdown files with over 800k words. + +The results show that indexing time, which is the time that it takes to set up +the search when the page is loaded, has dropped by up to 48%, which means __the +new search is up to 95% faster__. This is a significant improvement, +particularly relevant for large documentation projects. + +While 1,3s still may sound like a long time, using the new client-side search +together with [instant loading] only creates the search index on the initial +page load. When navigating, the search index is preserved across pages, so the +cost does only have to be paid once. + + [KJV Markdown]: https://github.com/arleym/kjv-markdown + [instant loading]: ../../setup/setting-up-navigation.md#instant-loading + +### User interface + +Additionally, some small improvements have been made, most prominently the +__more results on this page__ button, which now sticks to the top of the search +result list when open. This enables the user to jump out of the list more +quickly. + +## What's next? + +Our new search implementation is a big improvement to Material for MkDocs. It +solves some long-standing issues which needed to be tackled for years. Yet, +it's only the start of a search experience that is going to get better and +better. Next up: + +- __Context-aware search summarization__: currently, the first two matching + content blocks are rendered as a search preview. With the new tokenization + technique, we laid the groundwork for more sophisticated shortening and + summarization methods, which we're tackling next. + +- __User interface improvements__: as we now gained full control over the + search plugin, we can now add meaningful metadata to provide more context and + a better experience. We'll explore some of those paths in the future. + +If you've made it this far, thank you for your time and interest in Material +for MkDocs! This is the first blog article that I decided to write after a +short [Twitter survey] made me to. You're invited to leave a comment +to share your experiences with the new search implementation. + + [X survey]: https://x.com/squidfunk/status/1434477478823743488 diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview-before.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview-before.png new file mode 100644 index 0000000..7f6fcc8 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview-before.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview-now.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview-now.png new file mode 100644 index 0000000..0935166 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview-now.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview.png new file mode 100644 index 0000000..7ca97e1 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/search-better-faster-smaller/search-preview.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/sunsetting-gitter.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/sunsetting-gitter.md new file mode 100644 index 0000000..4cc9660 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/sunsetting-gitter.md @@ -0,0 +1,96 @@ +--- +date: 2023-10-02 +authors: [squidfunk, alexvoss] +categories: + - General +--- + +# Sunsetting Gitter: Towards Efficient Community Engagement + +__As we're starting to build a team around Material for MkDocs, we've decided to +sunset and archive our [Gitter] channel on October 13, 2023 in favor of +[GitHub Discussions].__ + +As part of our efforts to improve the processes for maintaining Material for +MkDocs and for supporting the community, we have reviewed the use of different +communication channels. At the moment, both [Gitter] and [GitHub Discussions] +allow to ask the community for support and to discuss ideas and issues. In the +past weeks, we have begun to question whether this duplication is in the best +interest of our project. This post explains the rationale behind our decision. + + [Gitter]: https://gitter.im/squidfunk/mkdocs-material + [GitHub discussions]: https://github.com/squidfunk/mkdocs-material/discussions + + + +## The Constraints of Gitter + +In the first years of Material for MkDocs, [Gitter] served as a helpful platform +for quick community interactions and questions. However, there are some inherent +constraints that necessitated a shift. Here's a breakdown of the challenges we +encountered: + +1. __Thread utilization__ – + Even with the introduction of threads, many Gitter users were reticent to + use them, leading to cluttered and disconnected conversations, making it + difficult to follow. + +2. __Search and discovery__ – + Gitter's structure and interface makes it cumbersome to search for and + retrieve past messages, resulting in lost insights and repeated conversations. + +1. __User interface__ – + After the acquisition by [Element], the user interface of Gitter has + experienced a severe decline, becoming more complicated, less intuitive and + user-friendly. + +1. __Access mandate__ – + The necessity for users to grant access to their GitHub accounts to use + Gitter posed an unnecessary access barrier and potential security concerns. + + [Element]: https://element.io/blog/gitter-is-joining-element/ + +## GitHub Discussions + +Thankfully, [GitHub Discussions] emerged and continues to evolve to be a much +better alternative, eliminating many of Gitter's constraints and offering +enhanced functionality: + +1. __Threaded conversations__ – + GitHub Discussions supports structured, threaded conversations, ensuring + discussions are coherent, contextual, and easy to follow for everyone. + +2. __Integration and linking__ – + the platform facilitates seamless linking to other discussions, issues, code, + and much more, enriching conversations and providing comprehensive context. + +3. __A unified platform__ – + GitHub acts as a one-stop shop for support, allowing users to access varied + resources and support channels in one place, greatly improving user + experience. + +4. __Discoverability__ – + GitHub Discussions are easily searchable and allow for categorization, + preventing loss of valuable insights and fostering knowledge sharing. + +## Conclusion + +Sunsetting [Gitter] is a leap towards creating more efficient, user-friendly, +and enriched community interactions. By consolidating communication to +[GitHub Discussions], we seek to mitigate the fragmentation of information, +ease the user journey, and fortify the bonds within our community. + +This concentrated approach enables us to provide consistent, fast and quality +support to our users. In the past, the nature of queries raised on Gitter +typically necessitated supplementary information or reproductions, prompting us +to advise users to initiate a discussion subsequently. The shift to a +centralized discussion forum is designed to simplify and accelerate this +procedure, ensuring swift and efficient resolutions for our community. It is a +testament to our ongoing commitment to support the community that helps Material +for MkDocs flourish. + +We are confident that this streamlined approach will spur more +fruitful discussions, innovative ideas, and collective growth, and we are +excited to continue our journey with the unwavering support and active +participation of our community. + diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future.md new file mode 100644 index 0000000..f3ec964 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future.md @@ -0,0 +1,263 @@ +--- +date: 2021-12-27 +authors: [squidfunk] +description: > + 2021 was a fantastic year for this project as we shipped many new awesome + features and made this project sustainable +categories: + - General +--- + +# The past, present and future + +__2021 was a fantastic year for this project as we shipped many new awesome +features, saw significant user growth and leveraged GitHub Sponsors to make the +project sustainable.__ + +Today, together, [MkDocs] and Material for MkDocs are among the most popular +options when it comes to choosing a static site generator and theme for your +technical documentation project. Material for MkDocs ensures that your +content is always perfectly presented to your audience, regardless of screen +resolution or device capabilities. It has evolved to a framework for technical +writing, offering many features, some of which are yet to be found in other +static site generators. However, we're far from the end, as 2022 is going to +bring some interesting new capabilities. + + + +_This article showcases all features that were added in 2021 and gives an +outlook on what's going to drop in 2022. Additionally, it provides some context +on the history of the project._ + + [MkDocs]: https://www.mkdocs.org + +## A little history + +In 2015, albeit 10 years in the industry, I was still quite new in Open Source. +I wanted to release my latest Open Source project [protobluff], a zero-copy +Protocol Buffers implementation for C, which I've created as part of my former +startup. As the project has a significant degree of complexity, I quickly +realized that I was in need of good user documentation. + +After evaluating static site generators in general and Hugo, Sphinx and MkDocs +in particular, I quickly decided that MkDocs seemed a good choice, as it was +specifically aimed at technical project documentation and easy to use. +Unfortunately, all of the available themes looked dated and given that I'm a +very visual person, I just couldn't convince myself to call it a day. + +I _had_ to build a theme. + +Months later, in February 2016, I released [the first version] of Material for +MkDocs (and with it, [protobluff], the project I wanted to release in the first +place), and it looked like this: + +![Material for MkDocs 0.1.0][Material for MkDocs 0.1.0] + +It was already fully responsive and overall, well, quite okayish, but barely +customizable, as only the logo could be changed. Beyond that, it had no options: +No color or navigation options, no instant loading, etc. The search was very +rudimentary and only supported section titles: + +![Material for MkDocs 0.1.0 Search][Material for MkDocs 0.1.0 Search] + +It's important to know that at this point in time I've built Material for +MkDocs for [protobluff], the project I was really caring about. Almost 6 years +later, nobody knows protobluff, but this little side project has taken off. If +back in those days, you would've told me big organizations like AWS, +Microsoft and CERN, as well as extremely popular Open Source projects like +FastAPI and Kubernetes will be using this project in the future – I would've +declared you insane. + +I still find the success of this project quite surprising, as I thought that +themes exist in abundance and are very much a solved problem. There's no glory +in themes, no stars to earn (remember that I was new in Open Source, so this was +the metric I was optimizing for), as there are thousands and thousands of +options. However, as the years progressed, I learned that _execution matters_: +although Material for MkDocs solves a problem for which thousands of solutions +exist, it excels in a specific niche, and that niche is to be known as +_technical project documentation_. + +Today, this project is not only popular but funded by almost 300 individuals +and organizations, resulting in a yearly budget of more than $50,000. This +allows me to set aside enough time for the development of new features, +bug fixing, stability improvement, issue triage and general support and still +feels like a dream to me, as there are many failed stories of Open Source +funding and people telling you: _don't do Open Source, you'll be working for +free._ + +Making Open Source sustainable is, after all, possible in 2021. + + [the first version]: https://github.com/squidfunk/mkdocs-material/releases/tag/0.1.0 + [Material for MkDocs 0.1.0]: the-past-present-and-future/mkdocs-material-0.1.0.png + [Material for MkDocs 0.1.0 Search]: the-past-present-and-future/mkdocs-material-0.1.0-search.png + [protobluff]: https://github.com/squidfunk/protobluff + +## 2021 in numbers + +2021 was an exciting year, as the project has seen significant growth. + +__166k people__ visited the official documentation in 2021, totalling in __1,6m +page views__ which is an increase of 83% when compared to 2020. The average +visitor spends __1,5min__ on the site. While mobile phones make up 12% of +visits, tablets only account for 0.6%. Visitors come from as many as __213 +countries__, which covers almost the whole world. + +### Features + +It's absolutely mind-blowing that __38 new features__ were added to Material +for MkDocs throughout 2021 – __that's a new feature every 9,6 days__ – +which was only possible because of the constantly improving funding situation. +Following is a list of all features shipped in alphabetical order, some of which +are still exclusively available to sponsors as part of [Insiders]: + +
+ +- [Admonition inline blocks] +- [Advanced search highlighting] +- [Anchor tracking] +- [Back-to-top button] +- [Boosting pages in search] +- [Brand new search plugin] +- [Code annotations] +- Code annotations: anchor links +- [Code annotations: strip comments] +- [Code block titles] +- [Code block line anchors] +- [Color palette toggle] +- [Content tabs: improved support] +- [Content tabs: auto-linking] +- Content tabs: animated indicator +- [Cookie consent] +- [Custom admonition icons] +- [Dark mode support for images] +- [Dismissable announcement bar] +- [Excluding content from search] +- Latest release tag +- [Mermaid.js integration] +- [Navigation icons] +- [Remove generator notice] +- [Rich search previews] +- Stay on page when switching versions +- [Search highlighting] +- [Search sharing] +- [Search suggestions] +- [Section index pages] +- [Site language selection] +- [Social cards] +- [Sticky navigation tabs] +- [Tags with search integration] +- [Tokenizer with lookahead] +- [Versioning] +- [Version warning] +- [Was this page helpful?] + +
+ +Additionally, a lot of bugs were fixed in the __1,000 commits__ that were pushed +to the repository this year. The [changelog] includes a list of all fixes. +Furthermore, a large amount of time was invested into refactoring the code base +to keep it in good shape. While the `mkdocs-material` package was released +__55__ times, `mkdocs-material-insiders` was shipped __72__ times. + + [Insiders]: ../../insiders/index.md + [Admonition inline blocks]: ../../reference/admonitions.md#inline-blocks + [Advanced search highlighting]: search-better-faster-smaller.md#accurate-highlighting + [Anchor tracking]: ../../setup/setting-up-navigation.md#anchor-tracking + [Back-to-top button]: ../../setup/setting-up-navigation.md#back-to-top-button + [Boosting pages in search]: ../../setup/setting-up-site-search.md#search-boosting + [Brand new search plugin]: search-better-faster-smaller.md + [Code annotations]: ../../reference/code-blocks.md#adding-annotations + [Code annotations: strip comments]: ../../reference/code-blocks.md#stripping-comments + [Code block titles]: ../../reference/code-blocks.md#adding-a-title + [Code block line anchors]: ../../setup/extensions/python-markdown-extensions.md#+pymdownx.highlight.anchor_linenums + [Color palette toggle]: ../../setup/changing-the-colors.md#color-palette-toggle + [Content tabs: improved support]: ../../reference/content-tabs.md + [Content tabs: auto-linking]: ../../reference/content-tabs.md#linked-content-tabs + [Cookie consent]: ../../setup/ensuring-data-privacy.md#cookie-consent + [Custom admonition icons]: ../../reference/admonitions.md#admonition-icons + [Dark mode support for images]: ../../reference/images.md#light-and-dark-mode + [Dismissable announcement bar]: ../../setup/setting-up-the-header.md#mark-as-read + [Excluding content from search]: ../../setup/setting-up-site-search.md#search-exclusion + [Mermaid.js integration]: ../../reference/diagrams.md + [Navigation icons]: ../../reference/index.md#setting-the-page-icon + [Remove generator notice]: ../../setup/setting-up-the-footer.md#generator-notice + [Rich search previews]: search-better-faster-smaller.md#rich-search-previews + [Search highlighting]: ../../setup/setting-up-site-search.md#search-highlighting + [Search sharing]: ../../setup/setting-up-site-search.md#search-sharing + [Search suggestions]: ../../setup/setting-up-site-search.md#search-suggestions + [Section index pages]: ../../setup/setting-up-navigation.md#section-index-pages + [Site language selection]: ../../setup/changing-the-language.md#site-language-selector + [Social cards]: ../../setup/setting-up-social-cards.md + [Sticky navigation tabs]: ../../setup/setting-up-navigation.md#sticky-navigation-tabs + [Tags with search integration]: ../../setup/setting-up-tags.md + [Tokenizer with lookahead]: search-better-faster-smaller.md#tokenizer-lookahead + [Versioning]: ../../setup/setting-up-versioning.md#versioning + [Version warning]: ../../setup/setting-up-versioning.md#version-warning + [Was this page helpful?]: ../../setup/setting-up-site-analytics.md#was-this-page-helpful + [changelog]: ../../changelog/index.md + +### Funding + +In 2021, monthly funding increased from $1,050 in the beginning of January to +more than $4,300 (Dec 27, 2021), totaling in a yearly budget of more than +$50,000. Compared to last year, __revenue from funding has increased by 617%__ +– which is absolutely unbelievable: + +![Funding] + + [Funding]: the-past-present-and-future/funding.png + +I'm solely providing these numbers to fulfill the transparency pledge I'm giving +to my awesome sponsors, and to show that it's possible to make existing Open +Source projects sustainable by following a well-designed release strategy. + +You can learn about the strategy in the [Insiders] guide. + +## 2022 + +Standing at the verge of the next year, it's safe to say that the project will +continue to prosper and evolve, yielding many awesome features that will make +technical writing more comfortable and flexible. Here's an excerpt of the +features that will see the light of day in 2022: + +- __Instant previews__: [instant previews] will render a specific page section + inside a tooltip when hovering an internal link, which will allow to implement + things like glossaries. Further support for improving glossary functionality + will also be investigated. + +- __Text annotations__: as a logical progression of [code annotations] which + were added in 2021, authors will be able to add annotations to plain text, + yielding excellent opportunities for side content. Of course, text annotations + will be as easy to use as code annotations. + +- __Navigation pruning__: to optimize large documentation projects, Material + for MkDocs will introduce a new feature flag called `navigation.prune` that + will lead to significantly smaller HTML files for documentation projects with + huge navigation hierarchies. + +- __Navigation status badge__: as an addition to the recently added + [navigation icon][Navigation icons] support, a status will be attributable to + each page, allowing to mark a page in the navigation tree with an icon as + :material-alert-decagram: __new__ or :material-trash-can: __deprecated__. + Custom status types will also be supported. + +- __Card grids__: as a further component in the toolkit of technical writing, + [card grids] will allow arranging content in grids, which is especially + useful for overview pages. They will allow to arrange arbitrary content, + including code blocks, admonitions, etc. + +- __Blog support__: blogging support is still [under investigation] and expected + to be one of the major additions in 2022. Blogging will perfectly integrate + with writing documentation, allowing to use all components available in + Material for MkDocs. + +This list is incomplete. Additionally, many new smaller features will be added +next year, just as in 2021. You can follow [@squidfunk on X] to stay +updated. + +__Happy new year!__ :tada: + + [Instant previews]: https://x.com/squidfunk/status/1466794654213492743 + [card grids]: https://github.com/squidfunk/mkdocs-material/issues/3018 + [under investigation]: https://github.com/squidfunk/mkdocs-material/issues/3353 + [@squidfunk on X]: https://x.com/squidfunk diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/funding.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/funding.png new file mode 100644 index 0000000..d6cf219 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/funding.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/mkdocs-material-0.1.0-search.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/mkdocs-material-0.1.0-search.png new file mode 100644 index 0000000..22ab104 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/mkdocs-material-0.1.0-search.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/mkdocs-material-0.1.0.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/mkdocs-material-0.1.0.png new file mode 100644 index 0000000..d00c685 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/the-past-present-and-future/mkdocs-material-0.1.0.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/transforming-material-for-mkdocs.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/transforming-material-for-mkdocs.md new file mode 100644 index 0000000..d87dd6c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/transforming-material-for-mkdocs.md @@ -0,0 +1,225 @@ +--- +date: 2024-08-19 +authors: + - squidfunk + - alexvoss + - katharinalisalin +categories: + - General +description: > + We are transforming Material for MkDocs to ensure its community continues to thrive and doubling down on our commitment to Open Source. +title: How we're transforming Material for MkDocs +--- + +# Transforming Material for MkDocs + +__We are working on an amazing set of features which has required some behind-the-scenes work we are now ready to share in a series of posts. Here, we give an overview of our goals, features in the making, things that kept us up at night, and our commitment to Open Source.__ + +We know it's been quite a while since our last update, which is why we're eager to share what's happening in and around Material for MkDocs with you. For the largest part of 2024, we've been focused on transforming the core of Material for MkDocs preparing the ground for new, interconnected features that are amongst the most frequently requested. + +This article is part of a series where we'll explore how we aim to support our users through improved information retrieval, provide better support for multi-lingual sites and versioning, as well as improve the overall authoring experience. We outline our vision for the projects' evolution and describe what we have been working on. In this and the coming blog posts, we will share our progress with you, and we're excited to hear your thoughts. + + + +_Please note that this post includes several technical details in the footnotes, specifically on challenges. Feel free to skip them if you're not interested in the specifics._ + +--- + +__This is the first article in a four-part series:__ + +1. [Transforming Material for MkDocs] +2. [Zensical – A modern static site generator built by the creators of Material for MkDocs] +3. [Material for MkDocs Insiders – Now free for everyone] +4. [Goodbye, GitHub Discussions] + + [Transforming Material for MkDocs]: transforming-material-for-mkdocs.md + [Zensical – A modern static site generator built by the creators of Material for MkDocs]: zensical.md + [Material for MkDocs Insiders – Now free for everyone]: insiders-now-free-for-everyone.md + [Goodbye, GitHub Discussions]: goodbye-github-discussions.md + +## A success story + +In 2024, Material for MkDocs has firmly established itself as a leading tool in the documentation framework landscape, with more than 5 million downloads each month as of this writing. What began as @squidfunk's personal project has evolved into a versatile resource for creating comprehensive documentation sites, personal websites, blogs, and notably, for managing knowledge both within and outside of organizations. + +With almost [50,000] public GitHub projects depending on Material for MkDocs, it's clear that the framework has made a substantial impact. Tens of thousands of authors rely on us to deliver documentation to millions of users each month.[^1] Beyond its adoption by [many popular Open Source projects], Material for MkDocs is trusted and financially supported by major corporations such as [AWS], [Microsoft], and [Siemens], among many other companies and individuals. We're very grateful for the continued support we receive, which allows us to devote our time to this project, making writing documentation enjoyable. + + [^1]: + We've collected invaluable feedback from enterprises and other Open Source maintainers, which revealed that the actual numbers are even higher. Many organizations leverage the framework within private infrastructures, such as self-hosted platforms like GitLab, for internal knowledge management. This suggests that the true reach of Material for MkDocs extends far beyond what is publicly visible. + + [50,000]: https://github.com/squidfunk/mkdocs-material/network/dependents + [many popular Open Source projects]: https://github.com/squidfunk/mkdocs-material?tab=readme-ov-file#trusted-by- + [AWS]: https://x.com/squidfunk/status/1740389441284579767 + [Microsoft]: https://x.com/squidfunk/status/1801909506391105840 + [Siemens]: https://x.com/squidfunk/status/1699799988069646761 + +Our users particularly appreciate Material for MkDocs for its ease of use and straightforward setup. It simplifies the process by handling the complexities of web technologies for you, so you can build a production-ready static site in minutes without needing to invest years into mastering frontend development or JavaScript. This makes it accessible to a wide range of users, regardless of their technical background. Additionally, Material for MkDocs is MIT-licensed and free to use, which has contributed to its widespread adoption, and allows everybody to build sophisticated documentation sites at no cost. + +Our vision is to provide you with the tools that allow you to __own your docs__, enable you to develop your own processes for producing amazing documentation and to avoid being locked into costly subscription services even for doing simple things. We believe it is important that these tools should be easy to set up and configure to suit your needs but should also give you the freedom to adapt them further, if needed. This is why we are always striving to ensure our architectures are modular and future-proof.[^2] + + [^2]: + The [built-in plugins] that Material for MkDocs ships perfectly outline this principle, as they are complementary to each other and can be used in combination to build sophisticated pipelines. This modular design allows users to pick and choose the features they need, ensuring that the framework remains lightweight and flexible. + + For instance, the [privacy plugin] can work together with the [optimize plugin] so that external assets can be passed through the same optimization pipeline as the rest of your documentation. This means you can store and edit unoptimized files outside of your repository, and let both plugins automatically build an optimized site for you. + + [built-in plugins]: ../../plugins/index.md + [privacy plugin]: ../../plugins/privacy.md + [optimize plugin]: ../../plugins/optimize.md + +## Challenges + +Now, let's talk about our journey and the particular challenges we're addressing. With "we", we're referring to the incredible team that @squidfunk was fortunate to build around his original work, thanks to the financial support he receives from his [sponsors]. This remarkable team includes @alexvoss and @katharinalisalin, whose invaluable contributions in research, development, and community support have been essential to the project's ongoing success. + +Together, we've started exploring new technologies, incorporating the feedback we received from our users, and rethinking critical components from first principles, serving our growing community one of the best frameworks to create documentation. + + [sponsors]: https://github.com/sponsors/squidfunk + +This section highlights the key areas we've been focusing on. + +### Search and discovery + +From our perspective, search is a cornerstone of any effective documentation site, enabling users to swiftly locate the information they need. From the start, we've relied on [Lunr.js], a popular client-side search library that has streamlined the deployment of documentation sites without needing an external service. Over the years, Lunr.js has served us well by answering millions of queries on sites built with Material for MkDocs. Yet, as our users' needs evolved, we encountered limitations that proved difficult to overcome. + + [Lunr.js]: https://github.com/olivernn/lunr.js + +We learned that the [BM25 ranking algorithm] at the core of Lunr.js (as in many other search implementations) isn't well-suited for effective and stable typeahead. Adding new documents can influence existing rankings, requiring manual adjustments[^3] that are cumbersome and hard to scale. Furthermore, Lunr.js has performance issues that stem from its design not fully leveraging modern JavaScript engines and optimizations, making it slower and memory-intensive.[^4] + + [^3]: + Boosting documents in [BM25][BM25 ranking algorithm] can lead to challenges, particularly with a changing corpus of documents. Relevance is calculated based on term frequency and the importance of terms across the entire corpus. Boosting a document involves adjusting its weight to make it more prominent in search results. + + As new documents are added or existing ones are modified, the overall distribution of term frequencies and their importance can shift. This recalibration can diminish the effectiveness of the boost, making it harder to maintain consistent ranking across a changing dataset. Essentially, the boosted documents may not stay as prominent or relevant as intended, leading to imbalances and scalability issues in search results. + + [^4]: + Lunr.js uses JavaScript objects to index and manage search data, which introduces inefficiencies due to how JavaScript engines handle object operations. JavaScript engines optimize performance using techniques like inline caching and object shape optimization. However, these optimizations rely on predictable and consistent object structures. + + The dynamic nature of Lunr.js' indexing — where documents can have varying structures — prevents the engine from applying these optimizations effectively. This means that while JavaScript engines can optimize for fixed, predictable object structures, they struggle with the polymorphic and fluid nature of Lunr.js's indexing, leading to performance issues as the amount of data grows. + + [BM25 ranking algorithm]: https://en.wikipedia.org/wiki/Okapi_BM25 + +Over the last years, we've invested substantially into [improving the search experience]. For instance, expanding Lunr.js' functionality to add support for [rich search previews] and [tokenizer lookahead] demanded substantial engineering effort. Lunr.js allows to customize tasks such as stemming, stopword filtering, and trimming with [pipeline functions], but it makes it particularly hard to add extensions like term highlighting or alternative ranking methods. Compounded by the fact that Lunr.js has been [unmaintained since 2020], it became clear that we needed to find a more powerful solution. We've looked at alternative JavaScript-based libraries to keep our client-side search, but none met our requirements or lived up to our expectations. + + [improving the search experience]: search-better-faster-smaller.md + [rich search previews]: search-better-faster-smaller.md#rich-search-previews + [tokenizer lookahead]: search-better-faster-smaller.md#tokenizer-lookahead + [pipeline functions]: https://lunrjs.com/guides/customising.html#pipeline-functions + [unmaintained since 2020]: https://github.com/olivernn/lunr.js/tag/ + +To address these challenges, we've embarked on developing a new search system from first principles that not only matches but already exceeds the capabilities of Lunr.js. Built from the ground up, this system is faster, more compact, and most importantly: modular. It is based on a growing core evolving around two core concepts we isolated to be essential – engines and plugins – allowing for flexible configuration and assembly of components like text indexing, vector embeddings, filtering, ranking, highlighting, and more. Every part of it can be replaced or extended, enabling users to tailor the search system to their specific needs. + +Our new search system, which we will release as a separate MIT-licensed Open Source project, is designed to handle a wide range of scenarios — from small blogs to large documentation projects. Of course, it supports offline use and integrates seamlessly with both client and server environments. The advanced ranking system provides fine-tuned control, and integration with third-party services is now more straightforward. + +__:octicons-goal-16: Goal – Empower users to quickly find the information they need while freeing authors from managing external services, by providing a search system that adapts to diverse content types.__ + +You might wonder why it's not yet available. The process of developing this system from scratch and uncovering its potential has led us to re-evaluate core concepts of Material for MkDocs. As a result, we've decided to postpone the release of the new search system to integrate it into the broader update that we've started to work on. If you keep on reading, you'll learn about further reasons why we've decided to follow this approach. + +We're excited to share more details about this update in one of the next posts in this series. + +### Translations and versioning + +Supporting multi-language sites in MkDocs is the [most requested feature on our discussion board] and in conversations with users, yet it presents significant challenges, as MkDocs does not natively support it. The same applies to versioning, which also involves synchronisation of multi-project builds. While the MkDocs ecosystem has developed [various plugins and tools] to address these issues, there is still substantial untapped potential. We began exploring these areas but quickly encountered problems that hindered our progress. + + [most requested feature on our discussion board]: https://github.com/squidfunk/mkdocs-material/discussions/2346 + [various plugins and tools]: https://github.com/mkdocs/catalog?tab=readme-ov-file#-site-building-site-management + +As you may know, our initial effort involved the [projects plugin] that aims to extend MkDocs to add support for multi-project environments as a solid foundation to support multi-language sites and versioning. Unfortunately, we encountered significant challenges due to MkDocs' internal architecture and design constraints, which we're working actively on resolving.[^5] + + [^5]: + When developing the [projects plugin], we initially made [good progress], including adding support for nested projects and allowing for a tree structure where sub-projects can have further sub-projects. However, we quickly encountered difficulties, particularly with cross-project navigation. To illustrate, imagine that each project can link to any other project, which makes handling these interconnections complex, especially when dealing with circular dependencies — such as Project A linking to Project B and vice versa. + + Implementing multi-project support in MkDocs is particularly challenging due to the lack of an official programmatic API, which complicates efforts to extend its functionality. Moreover, resolving navigation issues before building projects is crucial for ensuring proper interconnectivity. These challenges combined made the development of the projects plugin a complex endeavor. + + [projects plugin]: ../../plugins/projects.md + [good progress]: https://github.com/squidfunk/mkdocs-material/discussions/5800 + +__:octicons-goal-16: Goal – Enable scaling documentation to any size or team structure by offering seamless methods for integrating multiple documentation projects, whether they involve different languages, versions, or distinct sections of an overall body of work.__ + +As a result, we are developing a new approach to offer a more comprehensive and robust solution for both multi-language support and versioning. This new approach also intersects with adjacent functionalities like search, as many of our users are interested in [federated search] capabilities that combine results from multiple documentation sites into a unified search interface. Overcoming this challenge is one of the major hurdles we need to address before releasing the new search system. + + [federated search]: https://github.com/squidfunk/mkdocs-material/issues/5230 + +### Editing and collaboration + +We had considered developing a live editor in response to MkDocs' [performance issues with large projects], which in most cases stem from compute-intensive plugins that don't employ caching. A [proof of concept] based on [Pyodide] (= running Python in the browser) [generated significant interest] among users and prompted many organizations and individuals to share their collaborative workflows for feedback. Sadly, implementing this live editor proved to be very challenging, as it would require rebuilding substantial parts of MkDocs.[^6] After discontinuing work on this approach, our progress with multi-project support has renewed our belief that we can finally solve the sluggish editing experience that was reported several times over the last years.[^7] + + [performance issues with large projects]: https://github.com/mkdocs/mkdocs/issues/3695#issuecomment-2093299518 + [proof of concept]: https://x.com/squidfunk/status/1338252230265360391 + [Pyodide]: https://pyodide.org/ + [generated significant interest]: https://github.com/squidfunk/mkdocs-material/issues/2110 + + [^6]: + Our [proof of concept] supported some features of Material for MkDocs but didn't cover them all. For instance, integrating support for icons or linking between documents would have necessitated reimplementing parts of MkDocs to bypass a full rebuild — something we obviously wanted to avoid. Additionally, certain links, such as those to blog posts generated from schemas, are not merely translated but computed dynamically, which means they cannot be inferred by replacing the `.md` extension with `.html`. + + [^7]: + After [we raised this issue] with the maintainers of MkDocs again[^8], and [maintainership changed] mid 2024, work on a [ground-up rewrite] that aims to address slow reloads by [rendering only the page currently being built] has started. It's still unclear how this rewrite will integrate with the requirements of existing plugins. Complex plugins such as [mkdocstrings], or our [built-in blog] and [tags] plugins require a coordinated build of all pages to accurately resolve links between pages and to computed resources, which cannot be determined without building the entire project. + + __Update__{ title="August 21, 2024" }: The new maintainer now publicly stated that he's working towards a new version of MkDocs that [does not require or support plugins], and mentions it will be equally capable through offering customization via templating, themes, and styling, which he also mentioned to us and several other users in [a team call on August 1]. In this call, [we raised objections multiple times] in regards to how this will impact the ecosystem, to no avail. No intention or roadmap for plugin support was provided. This development is orthogonal to our goal empowering users and organizations to adapt the core framework to their requirements by the means of modularity. We're working on resolving this situation, and will provide a way forward for our community. + + [we raised this issue]: https://github.com/mkdocs/mkdocs/issues/3695 + [maintainership changed]: https://github.com/mkdocs/mkdocs/discussions/3677 + [ground-up rewrite]: https://github.com/mkdocs/sketch + [rendering only the page currently being built]: https://github.com/mkdocs/mkdocs/issues/3695#issuecomment-2117939743 + [mkdocstrings]: https://mkdocstrings.github.io/ + [built-in blog]: ../../plugins/blog.md + [tags]: ../../plugins/tags.md + [does not require or support plugins]: https://github.com/mkdocs/mkdocs/discussions/3815#discussioncomment-10398312 + [a team call on August 1]: https://github.com/mkdocs/mkdocs/discussions/3671#discussioncomment-10164237 + [we raised objections multiple times]: https://github.com/mkdocs/mkdocs/discussions/3671#discussioncomment-10215445 + + [^8]: + Previously raised issues include [#2418], [#2384], and [#1900]. + + [#1900]: https://github.com/mkdocs/mkdocs/issues/1900 + [#2384]: https://github.com/mkdocs/mkdocs/issues/2384 + [#2418]: https://github.com/mkdocs/mkdocs/issues/2418 + +This brings us to collaboration, which wasn't initially on our list of priorities. However, throughout 2024, conversations with various organizations and maintainers of popular Open Source projects highlighted a frequent request for enhanced collaboration features. Many users expressed a need for capabilities that would allow non-technical team members to suggest and make changes to the documentation. We're genuinely grateful for this feedback, as it has come at a pivotal time. We recognize the need to streamline tracking and discussing changes, as well as to facilitate drive-by contributions. + +__:octicons-goal-16: Goal – Everyone, regardless of their technical skill level, can easily work on and improve the documentation and contribute to a growing corpus of knowledge.__[^9] + + [^9]: + We are actively aligning our future development efforts to address this, recognizing it as a key area for improvement. While it's not something we can deliver immediately, we are committed to making this vision a reality in our work. + +This focus on collaboration aligns with how knowledge is managed in enterprises. In large organizations, documentation often exists in [information silos] — decentralized yet essential repositories of information. We understand the need to be able to unify these disparate sources into a coherent body of knowledge while preserving decentralized ownership. This also nicely aligns with our previously outlined work on multi-project support, as well as the new search system to implement [federated search] among multiple projects. + + [information silos]: https://en.wikipedia.org/wiki/Information_silo + +### Large Language Models (LLMs) + +Almost a year ago, we introduced an [experimental chatbot] on our documentation site. It quickly became one of the most anticipated features, with users requesting the ability to deploy similar functionality on their own sites, underscoring the growing demand for interactive documentation tools. However, we found that adding to the myriad of existing chat solutions and simply building another thin wrapper on top of ChatGPT is nonsense. + +__:octicons-goal-16: Goal – We're envisioning creating a unified interface that seamlessly integrates advanced search, chat, and summarization features, providing an interactive documentation experience.__ + + [experimental chatbot]: https://github.com/squidfunk/mkdocs-material/discussions/6240 + +As we delved into this ambitious project, we gained valuable insights from user feedback. Users began interacting with the chatbot in their native languages, an outcome we hadn't anticipated given that our documentation is in English. Remarkably (or obviously to those that work on LLMs year round), the chatbot responded in the same language. This ability of LLMs is one of the genuinely exciting features of these machine learning models as it has the potential to improve the accessibility of the documentation. However, while we employed state-of-the-art RAG methodologies, the results were mixed, and occasional hallucinations surfaced. + +These experiences led us to prioritize enhancing our search capabilities before integrating LLM-based features. Building a search engine from scratch was already a substantial effort, and adding more complexity without a solid search foundation would be premature. By rearchitecting our search functionalities, we aim to create a robust platform that will seamlessly support advanced information retrieval and deliver a cohesive interactive documentation experience. + +## Team, transparency, and growth + +While we navigate the challenges and explore the opportunities of this project, we consider it essential to demonstrate how we're building a solid foundation for its continued growth and success. Please consider this an overview rather than a formal roadmap — our detailed plans are in the works. The goals we've highlighted represent the most impactful areas we aim to address. + +Thanks to the generous support from our sponsors, we're fortunate to be assembling a team capable of dedicating significant time and expertise to this endeavor. This newfound capacity allows us to delve deeper into core development while also engaging more comprehensively with our user community. A special mention goes to @kamilkrzyskow, one of our invaluable community experts, who has been essential in supporting users and fostering discussions on our platform. + +With the team's support, @squidfunk can concentrate on the heart of development, while we have begun investing in user research. This effort is helping us understand how organizations and individuals interact with our tools, guiding the project's future direction based on real feedback from numerous conversations with users and companies. + +Looking to expand our team further, we are committed to improving transparency and communication. Our previous work often happened behind the scenes due to time constraints, but we're now focused on making our processes more open and inviting for new contributors. By embracing this collaborative approach, we aim to enhance our tools and ensure they meet the evolving needs of our community. + +## What's ahead of us + +As we look into the future, some of the groundwork we're laying now is crucial for the exciting developments on the horizon. Many of the initiatives we've discussed represent foundational work that will set the stage for much more ambitious and innovative features. Once these core elements are in place, we'll deliver a range of exciting new functionalities that align with our vision and goals. + +In the coming months, we'll be sharing more details about our plans and how they will contribute to our overarching objectives. While growth and innovation are at the forefront of our plans, we want to assure you that our core values remain unchanged. We are committed to maintaining the principles that have guided us thus far, ensuring that our growth is both healthy and consistent: + +- Against recent industry trends with companies moving away from core ideas of Open Source, we are doubling down on our commitment to Open Source because we believe it's at the heart of the value proposition of our work and the [docs as code] approach. + + [docs as code]: https://www.writethedocs.org/guide/docs-as-code/ + +- Our [organic approach to growth] is part of this strategy as it keeps us independent of individual funding sources and pressures to provide a return on investment, which is what causes many other projects to turn away from the principles of Open Source. + + [organic approach to growth]: https://star-history.com/#squidfunk/mkdocs-material + +- Likewise, we are driven by the needs of the community for a rich ecosystem of adaptations of the core framework. Extensibility and modularity are key for this and we are working hard to improve the developer experience by providing clear interfaces. + +Stay tuned for updates as we continue to build on our progress and explore new possibilities. We're excited about the future and look forward to sharing more with you as we advance. + +_Martin, Alex and Kathi_ :octicons-heart-fill-24:{ .mdx-heart .mdx-insiders } diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical.md new file mode 100644 index 0000000..c591a45 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical.md @@ -0,0 +1,236 @@ +--- +date: 2025-11-05 +authors: + - squidfunk + - alexvoss + - katharinalisalin + - pawamoy +categories: + - General +description: > + We are thrilled to announce Zensical, our next-gen static site generator + that addresses and overcomes the technical limitations of MkDocs +social: + cards_layout: default/only/image + cards_layout_options: + background_image: docs/assets/images/zensical-social.png +title: Zensical - A modern static site generator +slug: zensical +--- + +# Zensical – A modern static site generator built by the Material for MkDocs team + +__We are thrilled to announce [Zensical], our next-gen static site generator designed to simplify the process of building documentation sites. Distilled from a decade of experience, Zensical is our effort to overcome the technical limitations of MkDocs, reaching far beyond its capabilities.__ + +Zensical is the result of thousands of hours of work – built from the ground up for a modern and comfortable authoring experience, while making it easy for developers to extend and customize Zensical through its upcoming module system. Our goal is to support docs-as-code workflows with tens of thousands of pages, without compromising performance or usability. + +To make the transition seamless, [compatibility] comes first. We're putting significant effort into ensuring a smooth migration from Material for MkDocs for all users. Zensical can natively read `mkdocs.yml`, allowing you to build your existing project with minimal changes. As of now, a subset of plugins is supported, and we're working on feature parity in the coming months. + +Zensical is fully Open Source, licensed under MIT, and can be used for any purpose, including for commercial use. We're also saying goodbye to our sponsorware model, replacing it with our new offering for professional users: [Zensical Spark]. This allows us to stay independent, maximizing user value, as we shape the future of Zensical together with you. + +_You can subscribe to [our newsletter] to stay in the loop_. + + + + [Zensical]: https://zensical.org/ + [compatibility]: #maximum-compatibility + [Zensical Spark]: #zensical-spark + [our newsletter]: https://zensical.org/about/newsletter/ + +--- + +__This is the second article in a four-part series:__ + +1. [Transforming Material for MkDocs] +2. [Zensical – A modern static site generator built by the creators of Material for MkDocs] +3. [Material for MkDocs Insiders – Now free for everyone] +4. [Goodbye, GitHub Discussions] + + [Transforming Material for MkDocs]: transforming-material-for-mkdocs.md + [Zensical – A modern static site generator built by the creators of Material for MkDocs]: zensical.md + [Material for MkDocs Insiders – Now free for everyone]: insiders-now-free-for-everyone.md + [Goodbye, GitHub Discussions]: goodbye-github-discussions.md + +## Why Zensical? + +Since its initial release in 2016, Material for MkDocs has helped tens of thousands of teams to publish and maintain reliable documentation. However, in recent years, it has become apparent that we were running up against limitations of our core dependency, MkDocs. These limitations proved impossible to overcome as they are deeply rooted in its architecture. + +We also mentioned in our [update on our foundational work] that MkDocs must be considered a supply chain risk, since it's unmaintained since August 2024. It has seen no releases in over a year and is accumulating unresolved issues and pull requests. These developments have forced us to cut our ties to MkDocs as a dependency. + +In order to map out a path forward, we went back to the drawing board, talked to dozens of our professional users and thoroughly analyzed the MkDocs ecosystem. We didn't just want to create a fork or port of MkDocs, but decided to rethink static site generation from first principles. + +With Zensical, we are creating a modern static site generator, which is compatible with your content and customizations, and addresses MkDocs' limitations. While Material for MkDocs is built on top of MkDocs, __Zensical consolidates both projects into one coherent stack__, covering static site generation, theming, and customization. What you can expect today: + +- [5x faster rebuilds](#authoring-experience) +- [Modern design](#modern-design) +- [Blazing-fast search](#blazing-fast-search) + +Although we haven't reached full feature parity yet, you can already use Zensical to build your existing Material for MkDocs projects with minimal changes. + +_You can jump to the [compatibility] section to learn what is already supported._ + + [update on our foundational work]: https://github.com/squidfunk/mkdocs-material/discussions/8461 + +## What you can expect + +### Solid foundation + +Our goal with Zensical is to create a coherent and modern stack, vertically integrating all parts of the authoring experience (AX), developer experience (DX), and user experience (UX). This gives us a significant competitive advantage over solutions that overly rely on third-party frameworks and dependencies, helping us to create much more robust Open Source software. + +[ZRX], our new differential build engine, creates a solid foundation for Zensical, and is an Open Source project of its own. It's a fresh take on making differential data flows easy to build and a joy to work with. Most engineering effort has gone into ZRX, as it forms the backbone of Zensical, and will allow us to ship features faster. + +Following the principle of architectural hoisting, we moved essential, reusable functionality into ZRX, which allows us to keep Zensical's core simple and focused on static site generation. ZRX handles the heavy lifting – differential builds, caching, and data flow orchestration. + +With the upcoming [module system] and [component system], both of which are on our public [roadmap], Zensical will gain more degrees of freedom in the coming months, allowing you to extend and customize Zensical in ways that were previously impossible with MkDocs. + + [ZRX]: https://github.com/zensical/zrx/ + [module system]: https://zensical.org/about/roadmap/#module-system + [component system]: https://zensical.org/about/roadmap/#component-system + +### Modern design + +Zensical brings a fresh, modern design that breaks out of the Materal Design aesthetic, creating a visual foundation that is more easily brandable and adaptable to different use cases. The new design prioritizes clarity, simplicity, and usability, while having a more professional finish: + +
+ +![Zensical](./zensical/screenshot.png#gh-light-mode-only) +![Zensical](./zensical/screenshot-dark.png#gh-dark-mode-only) + + +
Our public [roadmap], built with Zensical
+
+ +Right now, the layout and site structure of Zensical match Material for MkDocs closely, as we're focusing on ensuring maximum compatibility. Once we finish work on our upcoming [component system], we'll provide an alternative that is much more flexible and adaptable, and can be tailored to different use cases and branding requirements more easily. + +_You can also keep the Material for MkDocs look and feel with a single line of configuration._ + + [roadmap]: https://zensical.org/about/roadmap/ + +### Blazing-fast search + +Client-side search isn't a compromise – for the vast majority of static sites, it's the best solution, since it's faster, involves zero maintenance, and doesn't require you to pay for a service. + +As covered in depth in [the first part of this series], the current search implementation in Material for MkDocs has severe limitations, and is based on a now unmaintained library, which is why we decided to build a new search engine from scratch. It's based on the same goals as Zensical itself: performance, flexibility, and extensibility. + +Disco, our modular and blazing-fast client-side search engine, is exclusively available in Zensical. When you build your site with Zensical, your users will immediately benefit from Disco's improved ranking algorithm, as well as its filtering and aggregation capabilities: + + [the first part of this series]: transforming-material-for-mkdocs.md#search-and-discovery + +
+ +![Zensical](./zensical/screenshot-search.png#gh-light-mode-only) +![Zensical](./zensical/screenshot-search-dark.png#gh-dark-mode-only) + +
Disco on [zensical.org]
+
+ +In early 2026, we'll be releasing Disco as a standalone Open Source project. With the feedback of our professional users in [Zensical Spark], we're going to evolve the search experience, turning Disco into a highly configurable and customizable search engine that adapts to your needs. + +_You can subscribe to [our newsletter] to receive news about Disco_. + + [zensical.org]: https://zensical.org/ + +### Authoring experience + +Slow feedback loops can be a major pain point when writing documentation. Almost all of us know the feeling of waiting for the static site generator to finish building the site, just to see a small change reflected in the output. With Zensical, we're finally addressing this issue. + +It's important to understand that we're not yet utilizing the differential capabilities of [ZRX] to the fullest extent, as we're forced to make several compromises to ensure maximum [compatibility] with Material for MkDocs at the moment. Markdown rendering needs to go through Python Markdown, which forces us to pay for extra marshalling costs. + +While the initial build can sometimes be slower than with MkDocs, repeated builds – especially when serving the site – are already 4 to 5x faster, as only changed files need to be rebuilt. + +We're also working on a new Markdown toolchain based on a CommonMark-compliant parser written in Rust, which will make Markdown processing significantly faster. We'll be tackling this as part of the upcoming [component system], which we'll start working on in early 2026. Once our new Markdown toolchain is ready, we'll provide automated tools to translate between Python Markdown and CommonMark, so you don't need to manually migrate your content. + +### Maximum compatibility + +[Compatibility with Material for MkDocs] is our top priority. We understand that switching to a new static site generator can be challenging, especially for large projects with many customizations. Therefore, we've put significant effort into ensuring that Zensical understands `mkdocs.yml` configuration files, so that you can build your projects with minimal changes. + +This means your existing Markdown files, template overrides, CSS and JavaScript extensions don't need to be touched, primarily because we did not change the generated HTML, and rely on Python Markdown for processing your content. + +However, plugins are a different story. In MkDocs, practically all plugins have side effects, making it impossible to parallelize builds. We started from first principles and asked: what should extensibility look like in a modern static site generator? +Our answer is the upcoming [module system], which takes a fundamentally different approach based on four core principles: + +- Modules can inject, extend, and re-define functionality +- Modules are deterministic through topological ordering +- Modules foster reusability, with the possibility to remix them +- Modules can cooperate through well-defined contracts + +We're working on shipping essential functionality as provided by MkDocs plugins as built-in modules. In early 2026, we will open the module system to third-party developers, so they can start building their own modules, as we see Zensical as the heart of a thriving ecosystem. + + [Compatibility with Material for MkDocs]: https://zensical.org/compatibility/ + [feature parity]: https://zensical.org/compatibility/features/ + [search]: ../../plugins/search.md + [offline]: ../../plugins/offline.md + +## Zensical Spark + +Zensical Spark, [our offering for professionals], is the result of countless calls with professional users of Material for MkDocs. From startups to large enterprises, we enable organizations to realize complex projects in diverse environments. For this, we've created Zensical Spark as a collaborative space. If you're a professional user, Zensical Spark is for you, since: + +- You can be confident that Zensical will continue to be developed and maintained in the long term as a set of interconnected and sustainable OSI-compliant Open Source projects. + +- You can receive the support you need to successfully use, configure and customize Zensical in your organization, receiving first-class support from the Zensical team. + +- You can influence the future development of Zensical by participating in [our new approach] to Open Source software development, helping us to build exactly what you need. + +_Let's talk! If you're working in a professional context, reach out to hello@zensical.org to schedule a call and learn how Zensical Spark enables your team to transition to Zensical smoothly and have a voice in its continued development._ + +_You should also consider joining the [waiting list], since seats are limited._ + + [our offering for professionals]: https://zensical.org/spark/ + [our new approach]: https://zensical.org/docs/community/how-we-work/ + [waiting list]: https://zensical.org/spark/join/ + +## We're growing our team + +We're also excited to announce that we're growing [our team]: + +__Timothée Mazzucotelli, also known as @pawamoy, is joining Zensical!__ + +At Zensical, Tim is focusing on providing the same seamless experience for generating API reference documentation from source code (via docstrings) as he has done with [mkdocstrings], the second biggest project in the MkDocs ecosystem. With his expertise, and Zensical's new stack, we'll be pushing the boundaries of what's possible with API reference documentation. + + [mkdocstrings]: https://mkdocstrings.github.io/ + [our team]: https://zensical.org/about/team/ + +## Goodbye, GitHub Sponsors + +Thank you! To all of you who have supported us over the years through GitHub Sponsors – we are incredibly grateful for your support. It has been invaluable in helping us to build, maintain and evolve Material for MkDocs, and we couldn't have done it without you. __Seriously, thank you!__ + +Material for MkDocs gave us something invaluable: experience building for tens of thousands of users, and the opportunity to build a team around Open Source software. It showed us that making a living from Open Source isn't just possible – we grew it into one of the largest sponsorware projects on GitHub and inspired others to pursue similar paths. + +Now we're breaking new ground. Zensical is our next chapter, and we're professionalizing how we approach Open Source development. Our vision is to make Zensical free for everyone to use while building a sustainable business around it through [our new approach]. + +This transition means saying goodbye to GitHub Sponsors. It has served us exceptionally well, but as we professionalize and scale, we're making the leap from personal project to company – building a business and team that can meet the growing demands of professional users while staying true to our values. + +We're doubling down on Open Source, developing software for everyone. + +_If you want to continue supporting our work, please subscribe to [our newsletter]. We'll be providing new methods to support us in the coming months, with the possibility of getting exclusive goodies._ + +## Looking Ahead + +Material for MkDocs grew organically in a pot that eventually became too small. With Zensical, we're building on solid foundations designed to grow with us – and with you. + +!!! warning "Material for MkDocs is now in maintenance mode" + + We want to be transparent about the risks of staying on Material for MkDocs. With MkDocs unmaintained and facing fundamental supply chain concerns, we cannot guarantee Material for MkDocs will continue working reliably in the future. We're aware that transitioning takes time, which is why we commit to support it at least for the next 12 months, fixing critical bugs and security vulnerabilities as needed, but the path forward is with Zensical. + + If documentation plays a critical role in your organization, and you're worried how this might affect your business, consider joining [Zensical Spark](https://zensical.org/spark/), or feel free to schedule a call by reaching out at hello@zensical.org. + +### Where we'll be in 12 months + +Over the next 12 months, following our [phased transition strategy], we'll reach Phase 2 and 3 – introducing our [module system] and [component system], as well as CommonMark support. By replacing Python Markdown with a Rust-based Markdown parser, we'll unlock performance improvements and the modularity needed for flexible templating. This is where Zensical truly starts to unfold its capabilities. + +Zensical is already powering real projects due to extensive [compatibility with Material for MkDocs][Compatibility with Material for MkDocs]. We're actively working on closing the gap to reach full [feature parity]. + +You can [install Zensical now], and build your existing Material for MkDocs projects with it. If you run into a bug, please don't hesitate to [open an issue] – we're here to help. + +### Connect with us + +If you have questions we haven't addressed, please reach out to us at hello@zensical.org. We're currently collecting questions from the community about Zensical, and will address them in an FAQ section as part of our documentation in the coming weeks. + +We're incredibly thankful that you have been part of our journey so far. With Zensical, we're embarking on a new chapter, and we couldn't be more excited to have you with us. + +_You can subscribe to [our newsletter] to stay in the loop_. + + [phased transition strategy]: https://zensical.org/compatibility/#phased-transition-strategy + [install Zensical now]: https://zensical.org/docs/get-started/ + [GitHub repository]: https://github.com/zensical/zensical + [open an issue]: https://zensical.org/docs/community/get-involved/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-dark.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-dark.png new file mode 100644 index 0000000..b1532a3 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-dark.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-search-dark.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-search-dark.png new file mode 100644 index 0000000..3e91d2f Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-search-dark.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-search.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-search.png new file mode 100644 index 0000000..8ed8c68 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot-search.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot.png b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot.png new file mode 100644 index 0000000..9059d36 Binary files /dev/null and b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/blog/posts/zensical/screenshot.png differ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/browser-support.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/browser-support.md new file mode 100644 index 0000000..7cf4f5a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/browser-support.md @@ -0,0 +1,67 @@ +# Browser support + +Material for MkDocs goes at great lengths to support the largest possible range +of browsers while retaining the simplest possibilities for customization via +modern CSS features like [custom properties] and [mask images]. + + [custom properties]: https://caniuse.com/css-variables + [mask images]: https://caniuse.com/mdn-css_properties_mask-image + +## Supported browsers + +The following table lists all browsers for which Material for MkDocs offers full +support, so it can be assumed that all features work without degradation. If you +find that something doesn't look right in a browser which is in the supported +version range, please [open an issue]: + +
+ +| Browser | Version | Release date | | | Usage | +| ------------------------------------ | ------: | -----------: | ------: | -----: | ---------: | +| | | | desktop | mobile | overall | +| :fontawesome-brands-chrome: Chrome | 49+ | 03/2016 | 25.65% | 38.33% | 63.98% | +| :fontawesome-brands-safari: Safari | 10+ | 09/2016 | 4.63% | 14.96% | 19.59% | +| :fontawesome-brands-edge: Edge | 79+ | 01/2020 | 3.95% | n/a | 3.95% | +| :fontawesome-brands-firefox: Firefox | 53+ | 04/2017 | 3.40% | .30% | 3.70% | +| :fontawesome-brands-opera: Opera | 36+ | 03/2016 | 1.44% | .01% | 1.45% | +| | | | | | __92.67%__ | + +
+ +Browser support matrix sourced from [caniuse.com].[^1] + +
+
+ + [^1]: + The data was collected from [caniuse.com] in January 2022, and is primarily + based on browser support for [custom properties], [mask images] and the + [:is pseudo selector] which are not entirely polyfillable. Browsers with a + cumulated market share of less than 1% were not considered, but might still + be fully or partially supported. + +Note that the usage data is based on global browser market share, so it could +in fact be entirely different for your target demographic. It's a good idea to +check the distribution of browser types and versions among your users. + + [open an issue]: https://github.com/squidfunk/mkdocs-material/issues/new/choose + [caniuse.com]: https://caniuse.com/ + [:is pseudo selector]: https://caniuse.com/css-matches-pseudo + [browser support]: #supported-browsers + [built-in privacy plugin]: plugins/privacy.md + +## Other browsers + +Albeit your site might not look as perfect as when viewed with a modern browser, +the following older browser versions might work with some additional effort: + +- :fontawesome-brands-firefox: __Firefox 31-52__ – icons will render as little + boxes due to missing support for [mask images]. While this cannot be + polyfilled, it might be mitigated by hiding the icons altogether. +- :fontawesome-brands-edge: __Edge 16-18__ – the spacing of some elements might + be a little off due to missing support for the [:is pseudo selector], which + can be mitigated with some additional effort. +- :fontawesome-brands-internet-explorer: __Internet Explorer__ - no support, + mainly due to missing support for [custom properties]. The last version of + Material for MkDocs to support Internet Explorer is + . diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/changelog/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/changelog/index.md new file mode 100644 index 0000000..0148070 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/changelog/index.md @@ -0,0 +1,2682 @@ +# Changelog + +## Material for MkDocs + +### 9.7.1 December 18, 2025 { id="9.7.1" } + +- Updated requests to 2.30+ to mitigate CVE in urllib +- Fixed privacy plugin not picking up protocol-relative URLs +- Fixed #8542: false positives and negatives captured in privacy plugin + +### 9.7.0 November 11, 2025 { id="9.7.0" } + +!!! warning "Material for MkDocs is now in maintenance mode" + + This is the last release of Material for MkDocs that will receive new features. + Going forward, the Material for MkDocs team focuses on [Zensical], a next-gen + static site generator built from first principles. We will provide critical + bug fixes and security updates for Material for MkDocs for 12 months at least. + + [Read the full announcement on our blog] + +This release includes all features that were previously exclusive to the +Insiders edition. These features are now freely available to everyone. + +__Note on deprecated plugins__: The [projects] and [typeset] plugins are +included in this release, but must be considered deprecated. Both plugins +proved unsustainable to maintain and represent architectural dead ends. They +are provided as-is without ongoing support. + +__Changes__: + +- Added support for projects plugin (for compat, now deprecated) +- Added support for typeset plugin (for compat, now deprecated) +- Added support for pinned blog posts and author profiles +- Added support for customizing pagination for blog index pages +- Added support for customizing blog category sort order +- Added support for staying on page when switching languages +- Added support for disabling tags in table of contents +- Added support for nested tags and shadow tags +- Added support for footnote tooltips +- Added support for instant previews +- Added support for instant prefetching +- Added support for custom social card layouts +- Added support for custom social card background images +- Added support for selectable rangs in code blocks +- Added support for custom selectors for code annotations +- Added support for configurable log level in privacy plugin +- Added support for processing of external links in privacy plugin +- Added support for automatic image optimization via optimize plugin +- Added support for navigation paths (breadcrumbs) +- Fixed #8519: Vector accents do not render when using KaTeX + + [Zensical]: https://zensical.org + [Read the full announcement on our blog]: ../blog/posts/zensical.md + [projects]: ../plugins/projects.md + [typeset]: ../plugins/typeset.md + +### 9.6.23 November 1, 2025 { id="9.6.23" } + +- Updated Burmese translation + +### 9.6.22 October 15, 2025 { id="9.6.22" } + +- Updated Georgian translation + +### 9.6.21 September 30, 2025 { id="9.6.21" } + +- Updated Serbian translations +- Fixed #8458: Temporary pin of click dependency + +### 9.6.20 September 15, 2025 { id="9.6.20" } + +- Fixed #8446: Deprecation warning as of Python 3.14 in Emoji extension +- Fixed #8440: `&` character not escaped in search highlighting +- Fixed #8439: FontAwesome icons color not set in social cards (regression) + +### 9.6.19 September 7, 2025 { id="9.6.19" } + +- Added support for Python 3.14 +- Updated Bahasa Malaysia translations + +### 9.6.18 August 22, 2025 { id="9.6.18" } + +- Updated Azerbaijani translations +- Fixed last compat issues with [minijinja], now 100% compatible + +### 9.6.17 August 15, 2025 { id="9.6.17" } + +- Fixed #8396: Videos do not autoplay when inside a content tab +- Fixed #8394: Stroke width not effective in Mermaid.js diagrams +- Fixed disappearing version selector when hiding page title + +### 9.6.16 July 26, 2025 { id="9.6.16" } + +- Fixed #8349: Info plugin doesn't correctly detect virtualenv in some cases +- Fixed #8334: Find-in-page detects matches in hidden search result list + +### 9.6.15 July 1, 2025 { id="9.6.15" } + +- Updated Mongolian translations +- Improved semantic markup of "edit this page" button +- Improved info plugin virtual environment resolution +- Fixed #8291: Large font size setting throws of breakpoints in JavaScript + +### 9.6.14 May 13, 2025 { id="9.6.14" } + +- Fixed #8215: Social plugin crashes when CairoSVG is updated to 2.8 + +### 9.6.13 May 10, 2025 { id="9.6.13" } + +- Fixed #8204: Annotations showing list markers in print view +- Fixed #8153: Improve style of cardinality symbols in Mermaid.js ER diagrams + +### 9.6.12 April 17, 2025 { id="9.6.12" } + +- Fixed #8158: Flip footnote back reference icon for right-to-left languages + +### 9.6.11 April 1, 2025 { id="9.6.11" } + +- Updated Docker image to latest Alpine Linux +- Bump required Jinja version to 3.1 +- Fixed #8133: Jinja filter `items` not available (9.6.10 regression) +- Fixed #8128: Search plugin not entirely disabled via enabled setting + +### 9.6.10 March 30, 2025 { id="9.6.10" } + +This version is a pure refactoring release, and does not contain new features +or bug fixes. It strives to improve the compatibility of our templates with +alternative Jinja-like template engines that we're currently exploring, +including [minijinja]. + +Additionally, it replaces several instances of Python function invocations +with idiomatic use of template filters. All instances where variables have +been mutated inside templates have been replaced. Most changes have been made +in partials, and only a few in blocks, and all of them are fully backward +compatible, so no changes to overrides are necessary. + +Note that this release does not replace the Jinja template engine with +minijinja. However, our templates are now 99% compatible with minijinja, +which means we can explore alternative Jinja-compatible implementations. +Additionally, immutability and removal of almost all Python function +invocations means much more idiomatic templating. + + [minijinja]: https://github.com/mitsuhiko/minijinja + +### 9.6.9 March 17, 2025 { id="9.6.9" } + +- Updated Serbo-Croatian translations +- Fixed #8086: Custom SVG icons containing hashes break rendering +- Fixed #8067: Drawer has gap on right side in Firefox on some OSs + +### 9.6.8 March 13, 2025 { id="9.6.8" } + +- Added Welsh translations +- Fixed #8076: Privacy plugin crashes if HTTP download fails + +### 9.6.7 March 3, 2025 { id="9.6.7" } + +- Fixed #8056: Error in backrefs implementation (9.6.6 regression) +- Fixed #8054: Unescaped quotes in ARIA labels of table of contents + +### 9.6.6 March 1, 2025 { id="9.6.6" } + +- Fixed #8040: Privacy plugin not replacing exteral assets (9.6.5 regression) +- Fixed #8031: Replace unmaintained `regex` package in search plugin + +### 9.6.5 February 20, 2025 { id="9.6.5" } + +- Fixed #8016: Tags listing not showing when when file name has spaces +- Fixed #8012: Privacy plugin crashes if HTTP download fails + +### 9.6.4 February 12, 2025 { id="9.6.4" } + +- Fixed #7985: Blog content sometimes not stretching to full width +- Fixed #7978: Navigation rendering bug in Safari 18.3 + +### 9.6.3 February 7, 2025 { id="9.6.3" } + +- Fixed rendering of arrow heads in Mermaid.js class diagrams +- Fixed #7960: Tags plugin crashes on numeric metadata titles + +### 9.6.2 February 3, 2025 { id="9.6.2" } + +- Fixed #7955: Excessively long words don't break on narrow screens +- Fixed #7947: Scope setting interferes with outdated version banner + +### 9.6.1 January 31, 2025 { id="9.6.1" } + +- Fixed #7943: Tags plugin crashing due to merge error + +### 9.6.0 January 31, 2025 { id="9.6.0" } + +- Added meta plugin +- Rewrite of the tags plugin +- Added support for allow lists in tags plugin +- Added support for and custom sorting in tags plugin +- Added support for related links in blog plugin +- Added support for custom index pages in blog plugin +- Added support for navigation subtitles +- Fixed #7924: Anchors might require two clicks when using instant navigation + +### 9.5.50 January 18, 2025 { id="9.5.50" } + +- Fixed #7913: Social plugin renders attribute lists in page title + +### 9.5.49 December 16, 2024 { id="9.5.49" } + +- Adjusted title color in dark mode for all supported Mermaid.js diagrams +- Fixed #7803: Privacy plugin crashes on generated files +- Fixed #7781: Mermaid.js flow chart title not visible in dark mode + +### 9.5.48 December 8, 2024 { id="9.5.48" } + +- Fixed #7774: Disabling social cards doesn't work + +### 9.5.47 December 1, 2024 { id="9.5.47" } + +- Fixed #7750: Numeric tags break search +- Fixed #7748: Blog plugin breaks when using future drafts (9.5.45 regression) + +### 9.5.46 November 25, 2024 { id="9.5.46" } + +- Added support for removing `preload` hints in privacy plugin +- Fixed #7734: Code blocks in h5 headlines are uppercased +- Fixed #7725: Blog plugin crashing on missing timezone (9.5.45 regression) + +### 9.5.45 November 20, 2024 { id="9.5.45" } + +- Reduced size of Docker image through multi-stage build +- Fixed #7708: Blog plugin crashing on YAML dates with timezones + +### 9.5.44 November 5, 2024 { id="9.5.44" } + +- Fixed #7672: Font CSS 404's when using privacy plugin (9.5.43 regression) + +### 9.5.43 October 31, 2024 { id="9.5.43" } + +- Added support for external images in SVGs in privacy plugin +- Fixed #7651: Privacy plugin doesn't handle quoted URLs in CSS + +### 9.5.42 October 20, 2024 { id="9.5.42" } + +- Fixed #7625: Invalid encoding of boolean attributes in privacy plugin +- Fixed #7624: Crash when disabling privacy plugin (9.5.41 regression) + +### 9.5.41 October 15, 2024 { id="9.5.41" } + +- Fixed #7619: Improved tooltip on logo disappears after instant navigation +- Fixed #7616: Race condition in built-in privacy plugin when inlining assets +- Fixed #7615: Comments and "Was this page helpful?" visible when printing + +### 9.5.40 October 10, 2024 { id="9.5.40" } + +- Updated Latvian translations +- Fixed #7597: Social cards not using site name on home page + +### 9.5.39 September 29, 2024 { id="9.5.39" } + +- Fixed #7226: not staying on page when using mike's canonical versioning + +### 9.5.38 September 26, 2024 { id="9.5.38" } + +- Added Albanian translations + +### 9.5.37 September 25, 2024 { id="9.5.37" } + +- Added 4th and 5th level ordered list styles +- Fixed #7548: Tags have no spacing in search + +### 9.5.36 September 21, 2024 { id="9.5.36" } + +- Fixed #7544: Social cards incorrectly rendering HTML entities +- Fixed #7542: Improved support for setting custom list styles + +### 9.5.35 September 18, 2024 { id="9.5.35" } + +- Fixed #7498: Search not showing for Vietnamese language + +### 9.5.34 August 31, 2024 { id="9.5.34" } + +- Updated Mermaid.js to version 11 (latest) + +### 9.5.33 August 23, 2024 { id="9.5.33" } + +- Fixed #7453: Incorrect position of tooltip when sorting table + +### 9.5.32 August 19, 2024 { id="9.5.32" } + +- Fixed RXSS vulnerability via deep link in search results +- Added support for fetching latest release from GitLab + +### 9.5.31 August 2, 2024 { id="9.5.31" } + +- Fixed #7405: DockerHub missing images > 9.5.27 due to change in Alpine/APK + +### 9.5.30 July 23, 2024 { id="9.5.30" } + +- Fixed #7380: Navigation icons disappearing on hover in Safari +- Fixed #7367: Blog readtime computation includes SVG text content + +### 9.5.29 July 14, 2024 { id="9.5.29" } + +- Updated Galician translations +- Fixed #7362: Annotations in figure captions rendering incorrectly + +### 9.5.28 July 2, 2024 { id="9.5.28" } + +- Fixed #7313: Improved tooltips mounted in sidebar when feature is disabled + +### 9.5.27 June 16, 2024 { id="9.5.27" } + +- Updated Estonian translations + +### 9.5.26 June 6, 2024 { id="9.5.26" } + +- Fixed #7232: Tab switches on scroll when linking tabs (9.5.19 regression) +- Fixed #7230: Blog author avatar broken when referring to local file + +### 9.5.25 May 27, 2024 { id="9.5.25" } + +- Fixed #7209: Tags plugin crashing on numeric tags + +### 9.5.24 May 20, 2024 { id="9.5.24" } + +- Fixed #7187: Version selector title rendering issue + +### 9.5.23 May 15, 2024 { id="9.5.23" } + +- Fixed #7183: Edge case in anchor navigation when using instant navigation +- Fixed #6436: Version selector not showing version alias + +### 9.5.22 May 12, 2024 { id="9.5.22" } + +- Fixed #7170: Copy button adds empty lines for line spans (9.5.18 regression) +- Fixed #7160: Version switching doesn't stay on page (9.5.5 regression) +- Fixed #5619: Links in Mermaid.js diagrams not discernible + +### 9.5.21 May 3, 2024 { id="9.5.21" } + +- Fixed #7133: Ensure latest version of Mermaid.js is used +- Fixed #7125: Added warning for dotfiles in info plugin + +### 9.5.20 April 29, 2024 { id="9.5.20" } + +- Fixed deprecation warning in privacy plugin (9.5.19 regression) +- Fixed #7119: Tags plugin emits deprecation warning (9.5.19 regression) +- Fixed #7118: Social plugin crashes if fonts are disabled (9.5.19 regression) +- Fixed #7085: Social plugin crashes on Windows when downloading fonts + +### 9.5.19 April 25, 2024 { id="9.5.19" } + +- Updated MkDocs to 1.6 and limited version to < 2 +- Updated Docker image to latest Alpine Linux +- Removed `setup.py`, now that GitHub fully understands `pyproject.toml` +- Improved interop of social plugin with third-party MkDocs themes +- Fixed #7099: Blog reading time not rendered correctly for Japanese +- Fixed #7097: Improved resilience of tags plugin when no tags are given +- Fixed #7090: Active tab indicator in nested content tabs rendering bug + +### 9.5.18 April 16, 2024 { id="9.5.18" } + +- Refactored tooltips implementation to fix positioning issues +- Fixed #7044: Rendering glitch when hovering contributor avatar in Chrome +- Fixed #7043: Highlighted lines in code blocks cutoff on mobile +- Fixed #6910: Incorrect position of tooltip for page status in sidebar +- Fixed #6760: Incorrect position and overly long tooltip in tables +- Fixed #6488: Incorrect position and cutoff tooltip in content tabs + +### 9.5.17 April 2, 2024 { id="9.5.17" } + +- Updated Serbian translations +- Fixed #7003: Confusing keyboard interaction for palette toggle +- Fixed #7001: Blog posts now show time by default (9.5.16 regression) +- Fixed edge case in backport of social plugin font loading logic + +### 9.5.16 March 31, 2024 { id="9.5.16" } + +- Updated Russian translations +- Improved error handling and reporting in social plugin +- Improved error handling and reporting in privacy plugin +- Fixed blog plugin not allowing to use time in format strings +- Fixed #6983: Social plugin crashes because of Google Fonts API change + +### 9.5.15 March 23, 2024 { id="9.5.15" } + +- Reverted fix for transparent iframes (9.5.14) +- Fixed #6929: Interference of social plugin and auto dark mode +- Fixed #6938: Giscus shows dark background in light mode (9.5.14 regression) + +### 9.5.14 March 18, 2024 { id="9.5.14" } + +- Added support for hiding versions from selector when using mike +- Added init system to improve signal handling in Docker image +- Fixed edge cases in exclusion logic of info plugin +- Fixed inability to reset pipeline in search plugin +- Fixed syntax error in Finnish translations +- Fixed #6917: UTF-8 encoding problems in blog plugin on Windows +- Fixed #6889: Transparent iframes get background color + +### 9.5.13 March 6, 2024 { id="9.5.13" } + +- Updated Slovak translations +- Improved info plugin interop with projects plugin +- Improved info plugin inclusion/exclusion logic +- Fixed info plugin not gathering files recursively +- Fixed #6750: Ensure info plugin packs up all necessary files + +### 9.5.12 February 29, 2024 { id="9.5.12" } + +- Fixed #6846: Some meta tags removed on instant navigation (9.4.2 regression) +- Fixed #6823: KaTex not rendering on instant navigation (9.5.5 regression) +- Fixed #6821: Privacy plugin doesn't handle URLs with encoded characters + +### 9.5.11 February 24, 2024 { id="9.5.11" } + +- Updated Finnish translation + +### 9.5.10 February 19, 2024 { id="9.5.10" } + +- Updated Bahasa Malaysia translations +- Fixed #6783: Hide continue reading link for blog posts without separators +- Fixed #6779: Incorrect positioning of integrated table of contents + +### 9.5.9 February 10, 2024 { id="9.5.9" } + +- Fixed navigation pruning with tabs and sections enabled + +### 9.5.8 February 7, 2024 { id="9.5.8" } + +- Added Tamil translations +- Updated Esperanto translations +- Fixed relative images not being resolved for instant navigation + +### 9.5.7 February 3, 2024 { id="9.5.7" } + +- Fixed #6731: Small images in figures are not centered +- Fixed #6719: Instant navigation breaks table of contents (9.5.5 regression) + +### 9.5.6 January 28, 2024 { id="9.5.6" } + +- Fixed #6700: Missing styles for Mermaid.js labels with Markdown + +### 9.5.5 January 24, 2024 { id="9.5.5" } + +- Updated Tagalog translations +- Updated Pillow to 10.2 to mitigate security vulnerabilities +- Improved resilience of instant navigation +- Fixed #6687: Updated Mermaid.js to version 10.7.0 (latest) +- Fixed #6652: Keyboard events in custom elements captured +- Fixed #6582: Instant navigation doesn't correctly handle alternate URLs +- Fixed #6565: Instant navigation doesn't allow for `onclick` handlers +- Fixed #6345: Instant navigation sometimes breaks browser back button +- Fixed #6334: Instant navigation doesn't correctly position anchors (Safari) +- Fixed #6275: Instant navigation doesn't correctly resolve after 404 +- Fixed #6102: Instant navigation reloads page on same link navigation + +### 9.5.4 January 15, 2024 { id="9.5.4" } + +- Fixed #6645: Local storage with invalid value can break site +- Fixed #6635: Tags icons before default ignored if default is set + +### 9.5.3 December 23, 2023 { id="9.5.3" } + +- Limited version range of MkDocs to < 1.6 +- Updated Macedonian translations +- Fixed #6520: Group plugin crashes when using mike +- Fixed #6494: Hide author's email address if disabled in git-authors plugin + +### 9.5.2 December 11, 2023 { id="9.5.2" } + +- Fixed types for `slugify` settings in blog plugin config +- Fixed #6469: Horizontal scrollbars on MathJax containers + +### 9.5.1 December 8, 2023 { id="9.5.1" } + +- Updated Greek translations +- Fixed #6464: Privacy plugin cannot be enabled +- Fixed #6461: Sorting blog posts ignores time component in date + +### 9.5.0 December 7, 2023 { id="9.5.0" } + +Merged Insiders features of 'Goat's Horn' funding goal + +- Added privacy plugin: automatic downloading of external assets +- Added support for card grids and grid layouts +- Added support for improved tooltips +- Added support for content tabs anchor links (deep linking) +- Added support for automatic dark/light mode +- Added support for document contributors + +### 9.4.14 November 26, 2023 { id="9.4.14" } + +- Added support for linking authors in blog posts + +### 9.4.13 November 26, 2023 { id="9.4.13" } + +- Fixed #6365: Blog plugin pagination links to previous pages broken +- Fixed #5758: Updated Mermaid.js to version 10.6.1 (latest) + +### 9.4.12 November 24, 2023 { id="9.4.12" } + +- Improved blog plugin to generate Unicode-aware slugs by default +- Fixed non-deterministic order of categories in blog plugin + +### 9.4.11 November 23, 2023 { id="9.4.11" } + +- Fixed #6364: Search plugin crashing when enabling theme while serving +- Fixed blog plugin crashing when disabling pagination + +### 9.4.10 November 19, 2023 { id="9.4.10" } + +- Fixed #6356: Version selector can't be disabled via mike's configuration +- Fixed #6281: Navigation not rendering due to Safari bug (9.4.2 regression) +- Fixed #6261: Navigation expansion animates on first load (9.4.2 regression) + +### 9.4.9 November 17, 2023 { id="9.4.9" } + +- Fixed #6344: Long entries cutoff in table of contents +- Fixed #6336: Custom template for glob archive not working with pagination +- Fixed #6328: Blog plugin crashes for locales with dashes, e.g. `pt-BR` +- Fixed #6327: Copy-to-clipboard button doesn't trim trailing line feed +- Fixed #6302: Version strings not matched when using mike, only aliases +- Fixed instant navigation progress indicator for gzipped content in Chrome +- Fixed rendering bug on details marker rotation in Firefox + +### 9.4.8 November 5, 2023 { id="9.4.8" } + +- Fixed invalid local address replacement when using instant loading +- Fixed #6275: Crash after navigation caused 404 when using instant loading + +### 9.4.7 October 27, 2023 { id="9.4.7" } + +- Added Azerbaijani translations + +### 9.4.6 October 14, 2023 { id="9.4.6" } + +- Updated Danish and Norwegian (Nynorsk) translations +- Fixed #6169: Blog post metadata layout overflows on small screens + +### 9.4.5 October 10, 2023 { id="9.4.5" } + +- Fixed sidebar auto-positioning (9.4.2 regression) +- Fixed #6166: Improve group plugin compatibility with Python < 3.10 +- Fixed #6157: Hiding tags does not work (9.4.3 regression) + +### 9.4.4 October 5, 2023 { id="9.4.4" } + +- Added support for overriding text to be copied for code blocks +- Fixed broken layout in some browsers at breakpoints when using zoom +- Fixed #6132: Incomplete search highlighting for code blocks in titles + +### 9.4.3 October 2, 2023 { id="9.4.3" } + +- Added support for instant navigation progress indicator +- Improved spacing and alignment of tags +- Moved back-to-top button into separate partial +- Fixed #6104: Indentation for some code blocks lost in search +- Fixed #6094: Blog post metadata overlaps with footer on small screens +- Fixed #6069: Blog plugin crashes for categories with non-ASCII names + +__Updated templates__ ([diff](https://github.com/squidfunk/mkdocs-material/compare/9.4.2...9.4.3)) + +- `base.html` + +### 9.4.2 September 25, 2023 { id="9.4.2" } + +- Updated Slovenian translations +- Added animation to sidebar navigation expansion and collapse +- Added support for auto-replacement of document head for instant navigation +- Improved compatibility of new emoji extension with Python < 3.10 +- Switched regex dependency to use minimal version +- Refactored alignment and spacing of sidebar navigation +- Fixed expansion button not focusable via keyboard in sidebar navigation +- Fixed viewport offset restoration on first load when using instant navigation +- Fixed accidental highlight of non-clickable elements in blog plugin sidebar +- Fixed #6041: Blog plugin crashes when `nav` is defined and blog not included +- Fixed #5972: Blog plugin ignores section index pages in paginated views +- Fixed #5954: Repeated click on anchor ignored when using instant navigation +- Fixed #5742: Keyboard navigation broken when using instant navigation + +__Updated templates__ ([diff](https://github.com/squidfunk/mkdocs-material/compare/9.4.1...9.4.2)) + +- `partials/nav-item.html` +- `blog-post.html` + +### 9.4.1 September 22, 2023 { id="9.4.1" } + +- Improved colors and contrast in dark mode +- Improved admonition borders to match font weight +- Switched content tabs to neutral color + +### 9.4.0 September 21, 2023 { id="9.4.0" } + +- Added Belarusian translations +- Added version info to entrypoint of package +- Added emoji extension as a replacement for `materialx` +- Improved slate color scheme (dark mode) - now even darker +- Restructured project to improve development experience +- Updated MkDocs to 1.5.3 +- Fixed #3890: Development mode crash on Linux + +### 9.3.2 September 19, 2023 { id="9.3.2" } + +- Updated Slovenian translations +- Updated Python dependencies in requirements to use minimum versions +- Fixed #6017: Code highlighting inconsistent in Community and Insiders edition +- Fixed #6001: Contributor avatars display incorrectly in Firefox +- Fixed #6000: Blog post drafts are included in navigation + +### 9.3.1 September 11, 2023 { id="9.3.1" } + +- Fixed crash of group plugin when used together with hooks + +### 9.3.0 September 11, 2023 { id="9.3.0" } + +- Improved configuration sharing between Community and Insiders edition +- Added experimental built-in group plugin for enabling plugins conditionally +- Added new settings in tags plugin for enabling/disabling +- Dropped support for Python 3.7 (EOL) + +### 9.2.8 September 4, 2023 { id="9.2.8" } + +- Updated Italian and Russian translations +- Fixed #5952: Combining blog and tags plugin leads to wrong links +- Fixed #5951: Blog plugin ignores post title in metadata +- Fixed #5949: Blog plugin ignores post linked in nav + +### 9.2.7 September 2, 2023 { id="9.2.7" } + +- Switched dependencies to compatible release clauses +- Removed `readtime` and `lxml` dependencies for blog plugin +- Reduced size of Docker image to improve CI build performance +- Fixed #5945: Incorrect footer navigation for sibling pages of blog +- Fixed #5939: Page jumps when changing color palette (Firefox 117) +- Fixed #5901: Announcement bar reappears when using instant loading +- Fixed #5824: Allow to customize styles of sequence diagrams + +### 9.2.6 August 31, 2023 { id="9.2.6" } + +- Added Basque translations +- Added template for simple redirects +- Improved blog plugin interop by moving view generation to `on_files` +- Fixed #5924: Social plugin still checks dependencies when disabled +- Fixed #5916: Blog plugin crashes on Python 3.8 (9.2.0 regression) + +### 9.2.5 August 27, 2023 { id="9.2.5" } + +- Fixed error in dirty serve mode when using blog plugin +- Fixed page title not being consistent in blog plugin pagination +- Fixed #5899: Blog plugin pagination breaks when disabling directory URLs + +### 9.2.4 August 26, 2023 { id="9.2.4" } + +- Added version to bug report name in info plugin +- Updated Afrikaans translations + +### 9.2.3 August 22, 2023 { id="9.2.3" } + +- Fixed blog plugin rendering wrongly with `markdown.extensions.toc` +- Fixed blog plugin entrypoint generation + +### 9.2.2 August 22, 2023 { id="9.2.2" } + +- Fixed #5880: Blog plugin failing when building a standalone blog +- Fixed #5881: Blog plugin not compatible with Python < 3.10 + +### 9.2.1 August 21, 2023 { id="9.2.1" } + +- Fixed #5879: Blog plugin failing when building a standalone blog +- Fixed error in blog plugin when using draft tagging on future date +- Fixed error in blog plugin when toc extension is not enabled + +### 9.2.0 August 21, 2023 { id="9.2.0" } + +__Additions and improvements__ + +- Added blogging support via built-in blog plugin +- Added support for Chinese language segmentaiton in search plugin +- Added support for adding custom dates to blog posts +- Added support for paginating archive and category pages +- Added support for annotations (outside of code blocks) +- Added support for navigation icons +- Added support for navigation pruning +- Added support for navigation status +- Added support for customizing site icons +- Added support for customizing (code) annotation icons +- Added focus outline to admonitions and details +- Added prompt for bug report name to info plugin +- Added Luxembourgish translations +- Improved rendering of (code) annotation markers +- Improved print styles for (code) annotations +- Improved customizability of navigation tabs +- Improved interop of plugins with external tools like mike +- Improved interop of blog plugin with awesome pages plugin +- Improved header partial by moving buttons into separate partials +- Improved clarity of `site_url` warning in social plugin +- Improved blog plugin to automatically setup directory structure +- Switched info plugin to `importlib` to mitigate deprecations +- Automatically download ResizeObserver polyfill when necessary +- Automatically add iframe-worker polyfill when necessary in offline plugin +- Automatically focus and bring up keyboard on touch devices +- Updated Serbo-Croatian translations +- Updated MkDocs to 1.5.2 + +__Removals__ + +- Removed Universal Analytics integration +- Removed ancient polyfills to reduce size of bundled JavaScript by 20% +- Removed necessity for `Array.flat` and `Array.flatMap` polyfill +- Removed announcement bar button when JavaScript is not available + +__Fixes__ + +- Fixed rendering of tags when announcement bar is present +- Fixed tags plugin rendering pages excluded by other plugins +- Fixed #5132: Blog plugin requires `nav` entry in `mkdocs.yml` +- Fixed #5599: Insufficient contrast for default link color +- Fixed #5715: Blog plugin missing integrated table of contents in pagination +- Fixed #5806: Version selector not hoverable on some Android devices +- Fixed #5826: Blog post drafts with tags show up in tags index + +### 9.1.21 July 27, 2023 { id="9.1.21" } + +- Fixed MkDocs 1.4 compat issue in social plugin (9.1.20 regression) + +### 9.1.20 July 27, 2023 { id="9.1.20" } + +- Updated Sanskrit translations +- Fixed deprecation warnings for social plugin + +### 9.1.19 July 18, 2023 { id="9.1.19" } + +- Added support for MkDocs 1.5+ +- Fixed #5699: Improve error reporting in social plugin + +### 9.1.18 July 3, 2023 { id="9.1.18" } + +- Updated Danish translations +- Added support for installing user requirements in Docker image +- Fixed #5655: Search separator with lookbehind breaks highlighting + +### 9.1.17 June 23, 2023 { id="9.1.17" } + +- Fixed #5633: Code annotations with nested lists incorrectly mounted +- Fixed #5628: Regression in new social plugin configuration scheme + +### 9.1.16 June 15, 2023 { id="9.1.16" } + +- Updated Indonesian translations +- Ensure scroll bar follows color scheme of operating system + +### 9.1.15 May 29, 2023 { id="9.1.15" } + +- Fixed #5566: Indicate color scheme to operating system +- Fixed #5565: Update `Dockerfile` to latest version of base image +- Fixed #5554: Add additional version tags (`9`, `9.1`) to Docker image +- Fixed #5536: Strip tags of ARIA labels in table of contents + +### 9.1.14 May 20, 2023 { id="9.1.14" } + +- Updated Armenian and Greek translations + +### 9.1.13 May 16, 2023 { id="9.1.13" } + +- Fixed #5517: Social plugin crashes for some fonts (e.g. Open Sans) + +### 9.1.12 May 12, 2023 { id="9.1.12" } + +- Updated Bengali (Bangla) translations +- Fixed #5503: Docker image publish errors on uppercase characters +- Fixed #5407: Auto-pause media when in hidden content tabs + +### 9.1.11 May 8, 2023 { id="9.1.11" } + +- Fixed #5487: Social plugin crashes without options (9.1.10 regression) + +### 9.1.10 May 8, 2023 { id="9.1.10" } + +- Added `cards_layout_options` setting for social cards +- Deprecated `cards_color` and `cards_font` setting for social cards + +### 9.1.9 May 2, 2023 { id="9.1.9" } + +- Added Telugu, Kannada and Sanskrit translations +- Fixed #5428: Fixed margins for light/dark mode images in figures +- Fixed #5420: Social plugin crashing for some specific Google Fonts +- Fixed #5160: Instant loading makes code annotations jump (9.1.1 regression) +- Fixed #4920: Social plugin not loading logo from custom icon set +- Fixed social plugin crashing when only code font is specified + +### 9.1.8 April 24, 2023 { id="9.1.8" } + +- Fixed #5417: Theme breaks when `palette` is not defined (9.1.7 regression) + +### 9.1.7 April 22, 2023 { id="9.1.7" } + +- Updated Persian (Farsi) and Turkish translations +- Fixed #5401: Added missing flag to disable built-in tags plugin +- Fixed #5206: Ensure defaults are set for primary and accent colors +- Fixed unnecessary inclusion of palette CSS when unused + +### 9.1.6 April 7, 2023 { id="9.1.6" } + +- Updated Persian (Farsi) translations +- Fixed #5300: Boxes in Mermaid sequence diagrams not color-abiding + +### 9.1.5 March 31, 2023 { id="9.1.5" } + +- Updated Lithuanian and Japanese translations +- Updated Mermaid.js to version 9.4.3 +- Fixed #5290: Footer previous/next labels cut-off for short page titles + +### 9.1.4 March 24, 2023 { id="9.1.4" } + +- Fixed #5239: Instant loading breaks anchors in details (9.1.1 regression) +- Fixed #5211: Anchor following not working for Chinese (9.1.2 regression) + +### 9.1.3 March 14, 2023 { id="9.1.3" } + +- Added Kurdish (Soranî) translations +- Updated Norwegian (Bokmål), Portuguese and Romanian translations +- Improved compatibility with `mkdocs-jupyter` plugin +- Fixed #5198: Built-in search plugin not filtering `script` and `style` tags +- Fixed #5176: Back-to-top + instant loading not working (9.1.1 regression) + +### 9.1.2 March 9, 2023 { id="9.1.2" } + +- Updated Icelandic, Korean and Swedish translations +- Fixed #5168: Mermaid text boxes overflow (9.0.13 regression) +- Fixed #5155: Table of contents not highlighting percent-encoded URLs + +### 9.1.1 March 5, 2023 { id="9.1.1" } + +- Updated Czech and Thai translations +- Improved instant loading (scroll restoration, slow connections) +- Fixed #5023: Instant loading not allowing to go back to initial page +- Fixed #3797: Instant loading does not work with section anchors in Safari + +### 9.1.0 March 2, 2023 { id="9.1.0" } + +- Docker image now available for `amd64`, `arm64` and `arm/v7` +- Updated Chinese (Taiwanese) translations +- Generalized tag identifier implementation +- Fixed flickering of header shadow on load +- Fixed occasional flickering of announcement bar + +### 9.0.15 February 26, 2023 { id="9.0.15" } + +- Updated Chinese (Traditional) translations +- Updated Hebrew translations + +### 9.0.14 February 23, 2023 { id="9.0.14" } + +- Fixed #5072: Rendering bug on navigation expand button in Firefox + +### 9.0.13 February 18, 2023 { id="9.0.13" } + +- Updated Uzbek translations +- Switched back to pre-9.0.0 headline detection in `content` partial +- Fixed #5062: Version warning not readable when using slate scheme +- Fixed #5061: Improved discernibility of table row hover color +- Fixed #5034: Sequence actors in Mermaid diagrams not color-abiding +- Fixed #4919: Allow to hide version warning in multiple versions + +### 9.0.12 February 9, 2023 { id="9.0.12" } + +- Updated Catalan translations +- Fixed #4975: Mermaid entity relationship rendering diagrams bug +- Fixed #4924: Header title not reset when using instant loading + +### 9.0.11 February 3, 2023 { id="9.0.11" } + +- Added Mastodon verification for social links (`rel=me`) +- Updated Italian translations + +### 9.0.10 February 2, 2023 { id="9.0.10" } + +- Updated Arabic translations +- Updated Korean translations +- Updated Hungarian translations +- Updated Russian translations +- Fixed #4977: Improved accessibility for content tabs +- Fixed #4960: Sometimes anchor following doesn't bring last item into view + +### 9.0.9 January 30, 2023 { id="9.0.9" } + +- Updated Bulgarian translations +- Updated Chinese (Simplified) translations +- Updated Dutch translations +- Updated Hindi translations +- Updated Japanese translations +- Updated Polish translations + +### 9.0.8 January 29, 2023 { id="9.0.8" } + +- Updated Croatian translations +- Updated French translations +- Updated Hungarian translations +- Updated Portuguese (Brasilian) translations +- Updated Spanish translations +- Updated Ukrainian translations +- Updated Urdu translations +- Updated Vietnamese translations + +### 9.0.7 January 28, 2023 { id="9.0.7" } + +- Improved accessibility of sidebar navigation +- Moved all translations into Community edition +- Updated Polish and Portuguese (Brasilian) translations +- Fixed info plugin terminating on subsequent reload when serving +- Fixed #4910: Sidebar navigation labels have invalid ARIA roles +- Fixed #4884: Search query terms can't be separated by colons + +### 9.0.6 January 19, 2023 { id="9.0.6" } + +- Fixed #4883: Automatically disable info plugin when serving +- Fixed #4885: Search plugin crashes in some exotic cases (9.0.3 regression) + +### 9.0.5 January 14, 2023 { id="9.0.5" } + +- Fixed #4842: Improved accessibility of search result list + +### 9.0.4 January 12, 2023 { id="9.0.4" } + +- Fixed #4823: Improved contrast ratio in footer (9.0.2 regression) +- Fixed #4832: Set navigation items back to black (9.0.3 regression) +- Fixed #4843: Emojis broken due to maxcdn.com shutting down +- Upgraded Python Markdown Extensions to 9.9.1 + +### 9.0.3 January 8, 2023 { id="9.0.3" } + +- Improved discernibility of section index pages in navigation +- Improved collapsing of adjacent whitespace in search plugin +- Updated Indonesian translations +- Fixed view source of this page button when edit URL points to blob +- Fixed #4829: Search overlay does not close for active anchor result +- Fixed #4824: Search plugin crashes for `h[1-6]` contained in other elements +- Fixed #4804: Nested navigation items not expandable with keyboard +- Fixed #4689: anchor tracking not working for anchors in tables +- Upgraded to Mermaid 9.3.0 + +### 9.0.2 January 4, 2023 { id="9.0.2" } + +- Fixed #4823: Improved contrast ratio in footer to meet WCAG guidelines +- Fixed #4819: Social plugin crashes when card generation is disabled +- Fixed #4817: Search plugin crashes on numeric page titles in `nav` + +### 9.0.1 January 3, 2023 { id="9.0.1" } + +- Removed `pipdeptree` dependency for built-in info plugin +- Fixed appearance of linked tags when hovered (9.0.0 regression) +- Fixed #4810: Abbreviations run out of screen on touch devices +- Fixed #4813: View source and edit button links are the same + +### 9.0.0 January 2, 2023 { id="9.0.0" } + +__Additions and improvements__ + +- Added support for rich search previews +- Added support for tokenizer lookahead +- Added support for better search highlighting +- Added support for excluding content from search +- Added support for configurable search pipeline +- Added support for offline search via offline plugin +- Added support for multiple instances of built-in tags plugin +- Added support for removing copy-to-clipboard button +- Added support for removing footer navigation +- Added support for button to view the source of a page +- Improved readability of query string for search sharing +- Improved stability of search plugin when using `--dirtyreload` +- Improved search result group button, now sticky and stable +- Updated Norwegian translations +- Updated MkDocs to 1.4.2 + +__Removals__ + +- Removed deprecated alternative admonition qualifiers +- Removed `:is()` selectors (in output) for easier overriding +- Removed `.title` suffix on translations +- Removed legacy method for providing page title in feedback URL +- Removed support for indexing only titles in search +- Removed support for custom search transforms +- Removed support for custom search workers +- Removed temporary snow feature (easter egg) + +__Fixes__ + +- Fixed Norwegian and Korean language code +- Fixed detection of composition events in search interface +- Fixed search plugin not using title set via front matter +- Fixed search highlighting of tags +- Fixed search sharing URL using post transformed string +- Fixed theme-color meta tag getting out-of-sync with palette toggle +- Fixed prev/next page keyboard navigation when footer is not present +- Fixed overflowing navigation tabs not being scrollable +- Fixed inclusion of code block line numbers from search + +--- + +### 8.5.11 November 30, 2022 { id="8.5.11" } + +- Let it snow, see https://x.com/squidfunk/status/1597939243090788352 + +### 8.5.10 November 11, 2022 { id="8.5.10" } + +- Adjusted CSS to better allow for custom primary and accent colors +- Fixed #4620: Primary color is not applied (8.5.9 regression) + +### 8.5.9 November 8, 2022 { id="8.5.9" } + +- Fixed #4600: Illegible link colors for black and white primary colors +- Fixed #4594: Need to set schema to change link color + +### 8.5.8 November 3, 2022 { id="8.5.8" } + +- Added support for always showing settings in cookie consent +- Fixed #4571: Buttons invisible if primary color is `white` or `black` +- Fixed #4517: Illegible note in sequence diagram when using `slate` scheme + +### 8.5.7 October 22, 2022 { id="8.5.7" } + +- Deprecated additional admonition qualifiers to reduce size of CSS +- Fixed #4511: Search boost does not apply to sections + +### 8.5.6 October 2, 2022 { id="8.5.6" } + +- Modernized appearance of admonitions (with fallback, see docs) +- Improved appearance of inline code blocks in admonition titles + +### 8.5.5 October 1, 2022 { id="8.5.5" } + +- Updated MkDocs to 1.4 +- Fixed compatibility issues with MkDocs 1.4 +- Fixed #4430: build error when enabling consent without repository URL + +### 8.5.4 September 30, 2022 { id="8.5.4" } + +- Fixed expand icons shift on sidebar overflow (using `scrollbar-gutter`) +- Fixed #4429: Text in sequence diagrams overflows in Firefox + +### 8.5.3 September 20, 2022 { id="8.5.3" } + +- Fixed build error when enabling cookie consent without analytics +- Fixed #4381: Code blocks render ligatures for some fonts + +### 8.5.2 September 18, 2022 { id="8.5.2" } + +- Updated Mermaid.js to version 9.1.7 +- Fixed overly large headlines in search results (8.5.0 regression) +- Fixed #4358: Navigation sections appear as clickable (8.5.0 regression) +- Fixed #4356: GitHub repository statistics fetched before cookie consent + +### 8.5.1 September 15, 2022 { id="8.5.1" } + +- Fixed #4366: Removed dependencies with native extensions + +### 8.5.0 September 13, 2022 { id="8.5.0" } + +- Added support for social cards +- Added support for code annotation anchor links (deep linking) +- Added support for code annotation comment stripping (syntax modifier) +- Added support for sidebars scrolling automatically to active item +- Added support for anchor following table of contents (= auto scroll) +- Added support for tag icons + +### 8.4.4 September 12, 2022 { id="8.4.4" } + +- Moved comments integration to separate partial (`comments.html`) + +### 8.4.3 September 7, 2022 { id="8.4.3" } + +- Added Simple Icons to bundled icons (+2,300 icons) +- Added support for changing edit icon +- Moved page actions to separate partial (`actions.html`) +- Fixed #4291: Version switching doesn't stay on page when anchors are used +- Fixed #4327: Links in data tables do not receive link styling + +### 8.4.2 August 27, 2022 { id="8.4.2" } + +- Updated Slovenian translations +- Fixed #4277: Feedback widget hidden after navigation with instant loading +- Fixed numeric tags in front matter breaking search functionality + +### 8.4.1 August 21, 2022 { id="8.4.1" } + +- Updated Croatian and Hebrew translations + +### 8.4.0 August 13, 2022 { id="8.4.0" } + +- Added support for cookie consent +- Added support for feedback widget (Was this page helpful?) +- Added support for dismissible announcement bar +- Added Armenian, Lithuanian, Tagalog, and Urdu translations + +### 8.3.9 July 4, 2022 { id="8.3.9" } + +- Updated Taiwanese translations for search +- Allow ids for content tabs with special characters (for mkdocstrings) +- Fixed #4083: home not clickable when using versioning (8.3.5 regression) + +### 8.3.8 June 24, 2022 { id="8.3.8" } + +- Fixed #4053: Limit width of videos to content area +- Fixed empty tags in front matter breaking search + +### 8.3.7 June 22, 2022 { id="8.3.7" } + +- Fixed search being stuck initializing when using tags (8.3.4 regression) + +### 8.3.6 June 16, 2022 { id="8.3.6" } + +- Fixed #4028: Links not clickable when using versioning (8.3.5 regression) + +### 8.3.5 June 14, 2022 { id="8.3.5" } + +- Fixed #4012: Stay on page not working for alias of active version + +### 8.3.4 June 11, 2022 { id="8.3.4" } + +- Fixed #4004: Tags with multiple words not searchable + +### 8.3.3 June 7, 2022 { id="8.3.3" } + +- Fixed #4000: Mermaid diagrams too dark in dark mode (8.3.0 regression) + +### 8.3.2 June 5, 2022 { id="8.3.2" } + +- Fixed #3987: Custom admonition icons don't work when defining color palette + +### 8.3.1 June 4, 2022 { id="8.3.1" } + +- Bump required Jinja version to 3.0.2 +- Removed unnecessary conditions in templates +- Fixed scroll offset when content tabs are brought into view +- Fixed #3977: Content tabs snapping oddly in Firefox +- Fixed #3983: Missing condition in footer partial (8.3.0 regression) + +### 8.3.0 June 2, 2022 { id="8.3.0" } + +- Added support for custom admonition icons +- Added support for linking of content tabs +- Added support for boosting pages in search +- Added support for hiding footer navigation +- Added previous/next indicators to content tabs +- Improved typeset link colors in light and dark modes + +### 8.2.16 May 28, 2022 { id="8.2.16" } + +- Fixed #3957: Only animate code annotations when visible (save CPU cycles) + +### 8.2.15 May 14, 2022 { id="8.2.15" } + +- Added Uzbek translations +- Fixed spacing for code block results in content tabs + +### 8.2.14 May 8, 2022 { id="8.2.14" } + +- Fixed missing top right rounded border on admonition +- Fixed #3886: `4xx` status codes not handled when using instant loading + +### 8.2.13 May 2, 2022 { id="8.2.13" } + +- Fixed #3865: Tags index links to tagged pages 404 on Windows +- Fixed #3866: Bump required Python version from 3.6+ to 3.7+ + +### 8.2.12 April 30, 2022 { id="8.2.12" } + +- Added support for GitHub-style hash fragments for dark/light images +- Improved rendering of nested code blocks in content tabs and annotations +- Fixed #3862: Upgraded to latest Pygments and Python Markdown Extensions + +### 8.2.11 April 25, 2022 { id="8.2.11" } + +- Temporarily pinned Pygments to `<2.12` +- Temporarily pinned Python Markdown Extensions to `<9.4` +- Improved rendering of code annotation markers + +### 8.2.10 April 24, 2022 { id="8.2.10" } + +- Added Macedonian translations +- Updated Mermaid.js to version 9.0.1 +- Switched sidebar title in mobile navigation to bold font +- Fixed color of arrows in class and state diagrams for dark mode +- Fixed #3836: Inline admonitions overlayed by code block titles + +### 8.2.9 April 8, 2022 { id="8.2.9" } + +- Mitigate flicker on color palette switch by disabling all transitions +- Fixed search suggestions not triggered when following deep link +- Fixed incorrectly computed header height when using instant loading +- Fixed #3782: Admonition titles have extra pixels on wide screens in Firefox +- Fixed #3802: Always render table of contents container (except when hidden) + +### 8.2.8 March 27, 2022 { id="8.2.8" } + +- Bumped MkDocs version to 1.3.0 to mitigate breaking changes in Jinja +- Reverted Jinja version range limitation (added in 8.2.7) +- Improved styling of annotations and fixed borders of code blocks in tabs +- Added background color to code blocks in focused/hovered links +- Added check in tags plugin whether tags overview page exists +- Fixed #3744: Content tab indicator on wrong position when using back button + +### 8.2.7 March 24, 2022 { id="8.2.7" } + +- Temporarily limit Jinja version range to < 3.1 due to breaking changes + +### 8.2.6 March 23, 2022 { id="8.2.6" } + +- Fixed #3695: Deprecation warning for unescaped backslashes in templates +- Fixed #3696: Annotations not mounted in some Terraform code blocks +- Fixed #3698: Annotations not mounted in long code blocks (8.2.5 regression) + +### 8.2.5 March 6, 2022 { id="8.2.5" } + +- Fixed #3596: Mermaid not working when headline with name 'Mermaid' present +- Fixed #3643: Reduce time to render pages with thousands of code blocks +- Fixed #3665: Missing styles for Mermaid.js flowcharts cluster labels + +### 8.2.4 March 2, 2022 { id="8.2.4" } + +- Fixed malformed Google Fonts URL when a font setting was omitted +- Fixed #3648: Fixed specificity issue with admonitions in lists +- Fixed #3653: Invalid outdated version banner URL when using instant loading + +### 8.2.3 February 27, 2022 { id="8.2.3" } + +- Fixed #3578: Active element in table of contents off-by-one on large screens + +### 8.2.2 February 26, 2022 { id="8.2.2" } + +- Added automatic removal of query parameter when search is closed +- Fixed #3599: Anchors always overridden when using navigation tracking + +### 8.2.1 February 17, 2022 { id="8.2.1" } + +- Fixed module `material.plugins` not being found (8.2.0 regression) + +### 8.2.0 February 17, 2022 { id="8.2.0" } + +- Added native support for Mermaid.js diagrams +- Added native support for tags (with search integration) +- Added support for staying on page when switching versions + +### 8.1.11 February 10, 2022 { id="8.1.11" } + +- Added Portuguese (Brasilian) translations +- Updated FontAwesome to v6 – [check which icons were renamed here] +- Fixed #3545: Color palette toggle and search overlaying version selector + + [check which icons were renamed here]: https://docs.fontawesome.com/v6/web/setup/upgrade/whats-changed#icons-renamed-in-version-6 + +### 8.1.10 February 6, 2022 { id="8.1.10" } + +- Fixed cutoff of very wide logos in the sidebar on mobile + +### 8.1.9 January 30, 2022 { id="8.1.9" } + +- [Added support for `mkdocs.yml` validation and auto-complete][validation] +- Fixed errors in Latvian translations + + [validation]: ../creating-your-site.md#minimal-configuration + +### 8.1.8 January 23, 2022 { id="8.1.8" } + +- Added Latvian translations +- Updated Giscus example integration with dynamic theme change support +- Fixed #3479: Back-to-top button not hidden when using sticky navigation tabs +- Fixed #3491: Logo in header and drawer doesn't honor aspect ratio + +### 8.1.7 January 16, 2022 { id="8.1.7" } + +- Improved back-to-top button behavior - now not shown on anchor jump + +### 8.1.6 January 11, 2022 { id="8.1.6" } + +- Fixed spacing of blockquotes (8.1.5 regression) +- Fixed edge cases for rounded corners on code blocks (8.1.5 regression) +- Fixed issues with code annotation line heights + +### 8.1.5 January 9, 2022 { id="8.1.5" } + +- Improved browser support: Chrome 49+, Safari 10+, Firefox 53+, Edge 79+ +- Improved rendering of inline code blocks in headlines +- Added Bahasa Malaysian translations +- Fixed #3354: MathJax formulas show vertical scrollbar + +### 8.1.4 January 2, 2022 { id="8.1.4" } + +- Added indicator to navigation expander icon +- Improved support for reduced motion preference +- Fixed jitter of active content tab indicator + +### 8.1.3 December 19, 2021 { id="8.1.3" } + +- Added animation to active content tab indicator +- Fixed #3360: Highlighted lines add blank lines in copied text +- Fixed usage of subsequent index files when using section index pages + +### 8.1.2 December 15, 2021 { id="8.1.2" } + +- Switched CSS sources to logical properties +- Added transformation of logical properties to `ltr`/`rtl` equivalents +- Fixed spacing for admonitions inside lists (8.1.1 regression) + +### 8.1.1 December 13, 2021 { id="8.1.1" } + +- Added support for `#only-light` and `#only-dark` image hash fragments +- Fixed copy-to-clipboard adding blank lines when using line anchors +- Fixed code annotation directionality for right-to-left languages +- Fixed header title positioning for right-to-left languages +- Fixed admonition borders for right-to-left languages (8.0.0 regression) +- Fixed footer navigation link positioning (8.0.0 regression) +- Fixed footer navigation title breaking out of container when too long +- Fixed shrinking arrow in navigation title when too long +- Fixed #3343: Filtered stopwords appear as missing search terms +- Fixed #3346: Site unusable due to usage of `:not()` (Firefox 78 ESR) + +### 8.1.0 December 10, 2021 { id="8.1.0" } + +- Added basic support for code block line anchors +- Switched code annotation markers to `+` signs to improve usability +- Switched main site title to bold font +- Improved admonition icon positioning to align when `font-size` is increased +- Improved and simplified footnotes CSS +- Improved and simplified code annotation positioning +- Fixed syntax error in Russian translations + +### 8.0.5 December 6, 2021 { id="8.0.5" } + +- Fixed #3302: Footer refactoring induced ellipsis in some browsers +- Fixed #3313: Details always rendered closed on load (8.0.4 regression) + +### 8.0.4 December 4, 2021 { id="8.0.4" } + +- Improved support for deeply nested code annotations +- Improved code annotation and copy-to-clipboard interop +- Improved styling for code annotations inside admonitions +- Fixed #3274: Invalid anchor positioning when using instant loading +- Fixed #3294: Lists after code blocks without code annotations disappearing +- Fixed several positioning issues for code annotations +- Fixed JavaScript source map roots + +### 8.0.3 December 2, 2021 { id="8.0.3" } + +- Removed deprecated `google_analytics` setting (was forgotten in 8.0.0) +- Fixed syntax error in Swedish and Polish translations +- Fixed #3283: Invalid back-to-top button position with sticky navigation tabs +- Fixed #3285: Default details marker showing due to Safari bug + +### 8.0.2 November 30, 2021 { id="8.0.2" } + +- Fixed #3275: Code annotations always disappear on click + +### 8.0.1 November 28, 2021 { id="8.0.1" } + +- Improved rendering of code annotation markers +- Fixed #3265: Wrong margin on nested admonitions +- Fixed wrong `box-sizing` for code annotations in details + +### 8.0.0 November 28, 2021 { id="8.0.0" } + +- Added support for code annotations +- Added support for anchor tracking +- Added support for version warning +- Added `copyright` partial for easier override +- Removed deprecated content tabs legacy implementation +- Removed deprecated `seealso` admonition type +- Removed deprecated `site_keywords` setting (unsupported by MkDocs) +- Removed deprecated prebuilt search index support +- Removed deprecated web app manifest – use customization +- Removed `extracopyright` variable – use new `copyright` partial +- Removed Disqus integration – use customization +- Switched to `:is()` selectors for simple selector lists +- Switched autoprefixer from `last 4 years` to `last 2 years` +- Improved CSS overall to match modern standards +- Improved CSS variable semantics for fonts +- Improved extensibility by restructuring partials +- Improved handling of `details` when printing +- Improved keyboard navigation for footnotes +- Fixed #3214: Search highlighting breaks site when empty + +--- + +### 7.3.6 October 30, 2021 { id="7.3.6" } + +- Added support for adding titles to code blocks + +### 7.3.5 October 27, 2021 { id="7.3.5" } + +- Added support for setting table of contents title via `mkdocs.yml` +- Fixed back-to-top button position for right-to-left languages + +### 7.3.4 October 17, 2021 { id="7.3.4" } + +- Bumped MkDocs version to 1.2.3 to mitigate [CVE-2021-40978] +- Fixed spacing issues when using integrate table of contents with tabs +- Fixed some spacings issues for right-to-left languages +- Fixed race condition in search initialization + + [CVE-2021-40978]: https://nvd.nist.gov/vuln/detail/CVE-2021-40978 + +### 7.3.3 October 11, 2021 { id="7.3.3" } + +- Rewrite of entire documentation +- Adjusted height of new content tabs to match single line code blocks +- Fixed new content tabs missing right padding in some browsers on overflow +- Fixed new content tabs bleeding out of flex container on overflow +- Fixed new content tabs overflow scrolling bugs on some browsers +- Fixed new content tabs stealing keyboard access when active +- Fixed some spacings issues for right-to-left languages + +### 7.3.2 October 6, 2021 { id="7.3.2" } + +- Deprecated prebuilding of search index +- Improved graceful handling of broken search for `file://` +- Added minimum Jinja version to list of requirements +- Fixed #3071: Section index pages render empty directories +- Fixed margin issues when using navigation tabs (7.3.1 regression) +- Fixed search placeholder sometimes being shown too early + +### 7.3.1 October 2, 2021 { id="7.3.1" } + +- Added new experimental content tabs implementation +- Fixed #3069: GitHub stats broken for users/orgs (7.1.0 regression) +- Fixed #3070: Sections not linking to index page +- Fixed title not linking to index page when using tabs +- Fixed Disqus integration when using instant loading +- Fixed some spacing issues for right-to-left languages +- Fixed syntax error in Serbian translations + +### 7.3.0 September 23, 2021 { id="7.3.0" } + +- Added support for sticky navigation tabs +- Added support for section index pages +- Added support for removing generator notice + +### 7.2.8 September 20, 2021 { id="7.2.8" } + +- Fixed #3039: Search modal overlays menu on mobile (7.2.7 regression) + +### 7.2.7 September 19, 2021 { id="7.2.7" } + +- Updated Serbian and Serbo-Croatian translations +- Improved appearance of outline on details +- Fixed #2934: Scrollbar when header is hidden on some mobile browsers +- Fixed #3032: Anchor in details doesn't open on load (7.0.0 regression) +- Fixed back-to-top button being focusable when invisible +- Fixed broken admonition icons (removed in upstream) + +### 7.2.6 September 1, 2021 { id="7.2.6" } + +- Fixed rendering of `blockquote` elements (7.0.0 regression) +- Fixed #2973: Custom search worker setting ignored + +### 7.2.5 August 25, 2021 { id="7.2.5" } + +- Updated Portuguese translations +- Fixed execution of RxJS teardown logic (7.2.3 regression) +- Fixed #2970: Search results show escaped characters (7.2.2 regression) + +### 7.2.4 August 11, 2021 { id="7.2.4" } + +- Fixed #2926: Version selector not working (7.2.3 regression) +- Fixed #2929: Missing CSS class for banner (consistency with Insiders) + +### 7.2.3 August 9, 2021 { id="7.2.3" } + +- Slight facelift of data tables, now closer to Material Design +- Fixed instant loading not respecting clicks on search results +- Fixed #2881: Invalid anchor offsets when using instant loading + +### 7.2.2 July 31, 2021 { id="7.2.2" } + +- Updated Korean translations +- Fixed #2879: Search highlighting does not properly escape HTML + +### 7.2.1 July 25, 2021 { id="7.2.1" } + +- Fixed #2862: Back-to-top button overlays active search bar + +### 7.2.0 July 21, 2021 { id="7.2.0" } + +- Added support for search suggestions to save keystrokes +- Added support for search highlighting +- Added support for search sharing (i.e. deep linking) + +### 7.1.11 July 18, 2021 { id="7.1.11" } + +- Updated Spanish and Galician translations + +### 7.1.10 July 10, 2021 { id="7.1.10" } + +- Refactored appearance of back-to-top button +- Fixed graceful handling of search when browsing locally + +### 7.1.9 June 25, 2021 { id="7.1.9" } + +- Improved search language support for Thai and Hindi +- Fixed #2761: License comments lined up at end of file + +### 7.1.8 June 12, 2021 { id="7.1.8" } + +- Refactored analytics integration (because of MkDocs 1.2) +- Added support for Google Analytics 4 (`gtag.js`) +- Fixed missing escape for `aria-label` in footer links + +### 7.1.7 June 6, 2021 { id="7.1.7" } + +- Improved screen reader support + +### 7.1.6 May 30, 2021 { id="7.1.6" } + +- Deprecated `seealso` admonition qualifier +- Added Mongolian and updated Chinese translations +- Fixed #2429: Version selector not touch-friendly on Android devices +- Fixed #2703: Printed 'Initializing search' albeit ready on mobile + +### 7.1.5 May 19, 2021 { id="7.1.5" } + +- Fixed #2655: Details breaking page margins on print + +### 7.1.4 May 6, 2021 { id="7.1.4" } + +- Added support for git-revision-date-localized plugin creation date +- Improved footnote styles on `:target` and `:focus` + +### 7.1.3 April 24, 2021 { id="7.1.3" } + +- Fixed #2586: Empty table of contents shown (7.1.2 regression) + +### 7.1.2 April 18, 2021 { id="7.1.2" } + +- Fixed #2554: List markers sometimes overlap floated elements +- Fixed #2563: Adding a class to a `h1` breaks the table of contents +- Fixed #2566: Back-to-top button clickable when invisible + +### 7.1.1 April 10, 2021 { id="7.1.1" } + +- Fixed #2501: Nested definition lists compound bottom margin +- Fixed #2508: Switch `extracopyright` block to template variable +- Fixed #2533: Search (and other parts) not working in Safari <14 +- Fixed #2538: Visual quirk when opening language selector + +### 7.1.0 March 29, 2021 { id="7.1.0" } + +- Added support for back-to-top button +- Added support for color palette toggle +- Added latest release to repository info (GitHub) +- Slight facelift of repository info (lighter fonts, spacing and icons) + +### 7.0.7 March 28, 2021 { id="7.0.7" } + +- Updated Hungarian translations +- Fixed #2466: Docker image not based on latest Python and Alpine +- Fixed #2488: Inconsistent header shadow behavior +- Fixed #2492: Inline code blocks in admonition titles missing background + +### 7.0.6 March 14, 2021 { id="7.0.6" } + +- Added trailing slash to version selector URL +- Added support for out-of-order anchors in table of contents +- Added `extra.homepage` option to link logo to arbitrary URL +- Improved security of Docker image (always update apk) +- Fixed horizontal spacing for nested inline admonitions +- Fixed text color of nested code blocks inside links +- Fixed version selector to always use version title +- Fixed logo link when using versioning with instant loading + +### 7.0.5 March 7, 2021 { id="7.0.5" } + +- Added `extracopyright` block to allow for custom copyright info +- Fixed evaluation of third-party scripts when using instant loading +- Fixed edge cases when using instant loading without directory URLs +- Fixed handling of version selector when using instant loading +- Fixed regression with header title not being updated correctly +- Fixed expanded sections not opening on first click (7.0.4 regression) + +### 7.0.4 March 4, 2021 { id="7.0.4" } + +- Added Icelandic translations +- Fixed #2386: Section close requires two clicks (navigation expansion) +- Fixed console error when search is disabled (7.0.0 regression) +- Fixed localsearch integration (7.0.0 regression) + +### 7.0.3 February 26, 2021 { id="7.0.3" } + +- Fixed JavaScript errors in older browsers (target ES2020 -> ES2015) + +### 7.0.2 February 25, 2021 { id="7.0.2" } + +- Fixed #2343: Invalid source map URLs for JS and CSS files +- Fixed #2347: Version selector missing when using versioning + +### 7.0.1 February 24, 2021 { id="7.0.1" } + +- Fixed #2334: Google Analytics triggers page view twice (7.0.0 regression) +- Fixed #2336: Details bleed into inline admonitions +- Fixed #2337: Images don't align correctly (7.0.0 regression) + +### 7.0.0 February 22, 2021 { id="7.0.0" } + +- Added support for deploying multiple versions +- Added support for integrating a language selector +- Added support for rendering admonitions as inline blocks +- Rewrite of the underlying reactive architecture +- Removed Webpack in favor of reactive build strategy (-480 dependencies) +- Fixed keyboard navigation for code blocks after content tabs switch + +### 6.2.8 February 4, 2021 { id="6.2.8" } + +- Updated Japanese and Polish translations +- Fixed #2261: Print dialog auto-closing when using instant loading + +### 6.2.7 January 31, 2021 { id="6.2.7" } + +- Fixed #2251: Updated Docker image to latest Alpine Linux + +### 6.2.6 January 26, 2021 { id="6.2.6" } + +- Added Bulgarian translations +- Fixed #2233: Search not shown when using header autohiding + +### 6.2.5 January 17, 2021 { id="6.2.5" } + +- Fixed syntax error in Swedish translations +- Optimized navigation partials to improve build speed for huge docs + +### 6.2.4 January 9, 2021 { id="6.2.4" } + +- Fixed #2156: Missing syntax highlighting for binary numbers +- Fixed #2186: Disqus showing on 404 page + +### 6.2.3 December 27, 2020 { id="6.2.3" } + +- Added back hidden overflow on root container +- Fixed #2142: MathJax formulas sometimes have vertical scrollbars + +### 6.2.2 December 22, 2020 { id="6.2.2" } + +- Removed Markdown version range limit (6.2.0 regression) + +### 6.2.1 December 22, 2020 { id="6.2.1" } + +- Fixed all import and asset paths in templates (6.2.0 regression) +- Downgraded webpack-asset-manifest-plugin - broke all asset paths + +### 6.2.0 December 22, 2020 { id="6.2.0" } + +- Added support for navigation sections +- Added support for navigation expansion +- Added support for integrating table of contents into navigation +- Added support for autohiding header on scroll +- Added support for hiding navigation and table of contents per page +- Added support for arbitrary items in navigation tabs +- Refactored navigation tabs to simplify grouping behavior +- Fixed anchor offset for permalinks in Safari (partial revert) +- Fixed #2098: Active tab sometimes not highlighted correctly +- Improved appearance for horizontal rulers +- Improved Spanish and Swedish translations + +### 6.1.7 December 6, 2020 { id="6.1.7" } + +- Fixed #2081: Fixed stats for private GitHub repositories +- Fixed alignment for admonition icon alignment for right-to-left languages + +### 6.1.6 November 22, 2020 { id="6.1.6" } + +- Fixed #2048: Math formulas show scrollbars (Windows) + +### 6.1.5 November 15, 2020 { id="6.1.5" } + +- Fixed search reset button not showing/hiding correctly + +### 6.1.4 November 7, 2020 { id="6.1.4" } + +- Fixed sidebar jitter when scrolling footer into view + +### 6.1.3 November 5, 2020 { id="6.1.3" } + +- Added support for keywords `meta` tag +- Fixed #2027: Line numbers don't scale with smaller font size +- Fixed link colors for black and white on `slate` color scheme +- Removed focus outline on scrolling code blocks for pointer devices + +### 6.1.2 October 31, 2020 { id="6.1.2" } + +- Fixed sizing of icons in admonitions, task lists, etc. (6.1.1 regression) + +### 6.1.1 October 31, 2020 { id="6.1.1" } + +- Fixed #2019: Page title not correctly updated when using instant loading + +### 6.1.0 October 17, 2020 { id="6.1.0" } + +- Fixed #1973: Added support for printing in dark mode +- Fixed #1974: Added support for printing content tabs +- Fixed #1995: Improved customizability of details extension + +### 6.0.2 October 4, 2020 { id="6.0.2" } + +- Added Georgian translations +- Added escaping for link `title` attributes where necessary +- Fixed #1956: Pages with whitespace in names have invalid links in search +- Removed unnecessary (duplicated) link `title` attributes + +### 6.0.1 September 26, 2020 { id="6.0.1" } + +- Fixed stemmer support for `file://` protocol through `iframe-worker` +- Fixed details marker showing for search result in Firefox +- Fixed tabbing behavior when search query is not empty +- Switched TypeScript compilation target to ES2015 +- Reduced size of JavaScript by 30% (`176kb` → `124kb`) +- Removed `mkdocs` and `readthedocs` themes from Docker image + +### 6.0.0 September 25, 2020 { id="6.0.0" } + +- Improved search result look and feel +- Improved search result stability while typing +- Improved search result grouping (pages + headings) +- Improved search result relevance and scoring +- Added display of missing query terms to search results +- Reduced size of vendor bundle by 25% (`84kb` → `67kb`) +- Reduced size of the Docker image to improve CI build performance +- Removed hero partial in favor of custom implementation +- Removed deprecated front matter features + +--- + +### 5.5.14 September 23, 2020 { id="5.5.14" } + +- Improved spacing around image captions +- Fixed #1939: Long tables cause header overlap in print view + +### 5.5.13 September 19, 2020 { id="5.5.13" } + +- Improved abbreviations on touch devices + +### 5.5.12 August 31, 2020 { id="5.5.12" } + +- Fixed #1638: occasional `404` for images when using instant loading + +### 5.5.11 August 28, 2020 { id="5.5.11" } + +- Fixed Disqus integration, as the minifier killed the config + +### 5.5.10 August 28, 2020 { id="5.5.10" } + +- Improved rendering by moving Disqus integration after page load +- Fixed #1887: Moved navigation icons to CSS to reduce size of HTML + +### 5.5.9 August 26, 2020 { id="5.5.9" } + +- Added Esperanto translations +- Fixed #1884: External links not included in navigation tabs + +### 5.5.8 August 23, 2020 { id="5.5.8" } + +- Removed focus outline on `details` and content tabs for pointer devices +- Improved accessibility of content tabs (now navigable via arrow keys) +- Fixed #1877: `404` on search index when search is disabled +- Fixed some memleaks in observable subscriptions +- Fixed color definitions for `theme-color` meta tag + +### 5.5.7 August 16, 2020 { id="5.5.7" } + +- Improved contrast ratio to 4.5:1 for syntax highlighting +- Improved contrast ratio to 4.5:1 for table of contents + +### 5.5.6 August 12, 2020 { id="5.5.6" } + +- Switched base template for `404.html` to `main.html` +- Fixed #1864: GitHub organisation stats not loading + +### 5.5.5 August 11, 2020 { id="5.5.5" } + +- Fixed missing vendor and worker distribution files + +### 5.5.4 August 11, 2020 { id="5.5.4" } + +- Added support for sortable data tables + +### 5.5.3 August 4, 2020 { id="5.5.3" } + +- Fixed search for languages other than English (5.5.1 regression) + +### 5.5.2 August 3, 2020 { id="5.5.2" } + +- Improved highlight colors and spacing for `ins`, `del` and `mark` +- Changed some keyboard symbols for better equivalents +- Removed focus `outline` for details and code blocks on touch devices +- Fixed margins for admonitions (5.5.1 regression) +- Fixed too small content tab labels (5.5.1 regression) +- Fixed icon repeating for custom admonition icons + +### 5.5.1 August 1, 2020 { id="5.5.1" } + +- Improved typesetting by basing `font-size` and spacings on `em` +- Improved print view by slightly scaling down `font-size` +- Changed custom site title (metadata) to be suffixed with site name +- Fixed top- and bottom spacing of paragraphs inside table cells + +### 5.5.0 July 24, 2020 { id="5.5.0" } + +- Rewrite of entire documentation +- Rewrite of syntax highlighting to be customizable with CSS variables +- Improved syntax highlighting to work with light and dark theme +- Improved `slate` color scheme to be more customizable and easier on the eyes +- Added licenses of icon sets to distribution files +- Fixed stale document titles in Google Analytics when using instant loading +- Fixed width of previous and next footer links for tablet and above +- Fixed issues with top scroll margin for footnotes +- Fixed top margin for tabbed content when using a JavaScript highlighter +- Deprecated metadata-based redirects, source links and heroes + +### 5.4.0 June 29, 2020 { id="5.4.0" } + +- Added support to wrap searches in quotes to switch from `OR` to `AND` +- Fixed highlighting of numbers in search results + +### 5.3.3 June 24, 2020 { id="5.3.3" } + +- Added Bengali translations +- Fixed #1773: Search for numbers does not return any result (regression) + +### 5.3.2 June 21, 2020 { id="5.3.2" } + +- Improved search typeahead experience with non-Latin characters +- Fixed #1753: Japanese search doesn't work anymore + +### 5.3.1 June 20, 2020 { id="5.3.1" } + +- Fixed #1761: Duplication of search worker when subscribing to observable + +### 5.3.0 June 15, 2020 { id="5.3.0" } + +- Added support for color schemes based on user preference +- Fixed #1755: Tokenizer separator setting ignored + +### 5.2.3 June 6, 2020 { id="5.2.3" } + +- Improved search typeahead behavior for some languages (`de`, `fr`, ...) +- Improved styles for scrollbars on Firefox +- Fixed #1741: Removed `preconnect` hint for Google Analytics + +### 5.2.2 May 26, 2020 { id="5.2.2" } + +- Fixed #1728: Legacy Edge doesn't support `deg` values in `hsla` colors + +### 5.2.1 May 22, 2020 { id="5.2.1" } + +- Fixed color of links in table headers, e.g. footnotes +- Fixed color scheme not being applied without primary or accent color +- Fixed hover delay for links inside code blocks + +### 5.2.0 May 18, 2020 { id="5.2.0" } + +- Added color schemes implementation + dark mode +- Fixed #1583: Missing option for separate link colors + +### 5.1.7 May 16, 2020 { id="5.1.7" } + +- Added keyboard focus support for overflowing code blocks +- Fixed #1696: Infinite loop in some cases when using instant loading + +### 5.1.6 May 9, 2020 { id="5.1.6" } + +- Added Burmese translations +- Added general anchor offset solution using `scroll-margin-top` +- Fixed #1653: Instant loading shouldn't intercept links to `*.html` files + +### 5.1.5 May 3, 2020 { id="5.1.5" } + +- Added `name` attribute for social links to set link `title` +- Fixed #1623: Allow arbitrary links in social links +- Fixed #1664: Height of `iframe` is not adjustable +- Fixed #1667: Sidebars are scrolled to bottom on load (bug in Chrome 81+) + +### 5.1.4 April 30, 2020 { id="5.1.4" } + +- Switched to [@mdi/svg] Material Design icon package +- Fixed #1655: Navigation may disappear after switching viewports +- Fixed #1659: Unnecessary scrollbar for search results on Windows +- Fixed occasional distortions for images with explicit dimensions +- Fixed errors in German translations + + [@mdi/svg]: https://github.com/Templarian/MaterialDesign-SVG + +### 5.1.3 April 26, 2020 { id="5.1.3" } + +- Fixed overflowing content area after switch to flexbox + +### 5.1.2 April 26, 2020 { id="5.1.2" } + +- Added status information to search observable +- Added status information to search modal +- Removed announcement bar from print media +- Removed media query packing logic due to race conditions +- Fixed #1520: Gracefully disable search on `file://` if Worker fails +- Fixed re-submission of query after search is initialized +- Fixed jitter of sidebars on all browsers by switching to `sticky` + +### 5.1.1 April 17, 2020 { id="5.1.1" } + +- Added new FontAwesome icons +- Fixed #1609: Instant loading doesn't honor `target=_blank` +- Fixed GitHub stars count rounding errors +- Fixed GitLab stars count retrieval + +### 5.1.0 April 12, 2020 { id="5.1.0" } + +- Added support for icons from Markdown through [mkdocs-material-extensions] + + [mkdocs-material-extensions]: https://github.com/facelessuser/mkdocs-material-extensions + +### 5.0.2 April 10, 2020 { id="5.0.2" } + +- Added CSS source maps to distribution files +- Fixed errors in Chinese (Traditional) translations +- Fixed creation of stale directory on installation from git +- Improved overflow scrolling behavior on iOS (reduced bundle size by `4kb`) + +### 5.0.1 April 7, 2020 { id="5.0.1" } + +- Fixed syntax error in Spanish translation + +### 5.0.0 April 7, 2020 { id="5.0.0" } + +- Reactive architecture – try `app.dialog$.next("Hi!")` in the console +- Instant loading – make Material behave like a Single Page Application +- Improved CSS customization with CSS variables – set your brand's colors +- Improved CSS resilience, e.g. proper sidebar locking for customized headers +- Improved icon integration and configuration – now including over 5k icons +- Added possibility to use any icon for logo, repository and social links +- Search UI does not freeze anymore (moved to web worker) +- Search index built only once when using instant loading +- Improved extensible keyboard handling +- Support for prebuilt search indexes +- Support for displaying stars and forks for GitLab repositories +- Support for scroll snapping of sidebars and search results +- Reduced HTML and CSS footprint due to deprecation of Internet Explorer support +- Slight facelifting of some UI elements (admonitions, tables, ...) + +### 4.6.3 February 14, 2020 { id="4.6.3" } + +- Removed optional third-party plugins from `requirements.txt` +- Updated Docker image to contain all supported third-party plugins + +### 4.6.2 February 8, 2020 { id="4.6.2" } + +- Added Romanian translations +- Fixed #1451: Inconsistent spacing for fenced code blocks + +### 4.6.1 February 8, 2020 { id="4.6.1" } + +- Fixed #1324: Metadata author only rendering first character +- Fixed #1393: Set `tabindex` to `0` for skip to content link +- Fixed code blocks after Markdown 3.2 release +- Fixed errors in Japanese translations +- Improved Google Lighthouse score + +### 4.6.0 December 11, 2019 { id="4.6.0" } + +- Added support for [git-revision-date-localized-plugin] +- Fixed invalid character in Google Fonts URL + + [git-revision-date-localized-plugin]: https://github.com/timvink/mkdocs-git-revision-date-localized-plugin + +### 4.5.1 December 2, 2019 { id="4.5.1" } + +- Added Thai translations +- Fixed missing assets in GitHub release `.zip` and `.tar.gz` + +### 4.5.0 November 16, 2019 { id="4.5.0" } + +- Fixed #1330: Upgraded EmojiOne to Tweomji due to licensing issues +- Fixed #1339: Temporarily pinned PyMdown and Markdown due to +- Fixed errors in Greek translations +- Improved GitHub statistics retrieval + +### 4.4.3 October 3, 2019 { id="4.4.3" } + +- Added Estonian translations +- Fixed removal of copyright banners in minified JavaScript +- Removed unnecessary title attributes from links in table of contents + +### 4.4.2 August 27, 2019 { id="4.4.2" } + +- Added Afrikaans translations +- Fixed broken page title when `h1` contained HTML tags +- Improved accessibility for IE users +- Removed unnecessary `title` attributes from links in navigation + +### 4.4.1 August 22, 2019 { id="4.4.1" } + +- Added support for `black` as a primary color +- Fixed broken footer bar when `h1` contained HTML tags + +### 4.4.0 June 15, 2019 { id="4.4.0" } + +- Added Slovenian translations +- Reverted template minification in favor of `mkdocs-minify-plugin` +- Fixed #1114: Tabs don't reappear when default `font-size` is smaller than `16` + +### 4.3.1 May 23, 2019 { id="4.3.1" } + +- Fixed spelling error in Danish translations + +### 4.3.0 May 17, 2019 { id="4.3.0" } + +- Added support for changing header through metadata title property +- Added `font-display: swap` to Google Font loading logic +- Removed whitespace from templates, saving `4kb` (`.7kb` gzipped) per request +- Fixed alignment of repository icons on tablet and desktop + +### 4.2.0 April 28, 2019 { id="4.2.0" } + +- Added Norwegian (Nynorsk) translations +- Fixed loss of focus in non-form input elements due to search hotkeys +- Fixed #1067: Search hotkeys not working for mobile/tablet screensize +- Fixed #1068: Search not correctly aligned for tablet screensize + +### 4.1.2 April 16, 2019 { id="4.1.2" } + +- Fixed #1072: HTML tags appearing in navigation link titles + +### 4.1.1 March 28, 2019 { id="4.1.1" } + +- Fixed minor CSS errors detected during validation + +### 4.1.0 March 22, 2019 { id="4.1.0" } + +- Fixed #1023: Search for Asian languages broken after Lunr.js update +- Fixed #1026: contenteditable elements loose focus on hotkeys + +### 4.0.2 March 1, 2019 { id="4.0.2" } + +- Fixed #1012: HTML character entities appear in search result titles + +### 4.0.1 February 13, 2019 { id="4.0.1" } + +- Fixed #762, #816: Glitch in sidebar when collapsing items +- Fixed #869: Automatically expand details before printing + +### 4.0.0 February 13, 2019 { id="4.0.0" } + +- Added background on hover for table rows +- Removed Google Tag Manager and reverted to Google Analytics +- Removed blocks in partials - Jinja doesn't support them +- Fixed #911: Chrome breaks layout if system language is Chinese (**BREAKING**) +- Fixed #976: Removed FastClick + +--- + +### 3.3.0 January 29, 2019 { id="3.3.0" } + +- Moved Google Analytics integration into `head` using Google Tag Manager +- Fixed #972: Unicode slugifier breaks table of contents blur on scroll +- Fixed #974: Additional links in table of contents break blur on scroll + +### 3.2.0 December 28, 2018 { id="3.2.0" } + +- Added support for redirects using metadata refresh +- Fixed #921: Load Google Analytics snippet asynchronously + +### 3.1.0 November 17, 2018 { id="3.1.0" } + +- Added support for Progressive Web App Manifest +- Fixed #915: Search bug in Safari (upgraded Lunr.js) + +### 3.0.6 October 26, 2018 { id="3.0.6" } + +- Added Taiwanese translations +- Fixed #906: JavaScript code blocks evaluated in search results + +### 3.0.5 October 23, 2018 { id="3.0.5" } + +- Added Croatian and Indonesian translations +- Fixed #899: Skip-to-content link invalid from 2nd level on +- Fixed #902: Missing URL filter in footer for FontAwesome link + +### 3.0.4 September 3, 2018 { id="3.0.4" } + +- Updated Dutch translations +- Fixed #856: Removed preconnect meta tag if Google Fonts are disabled + +### 3.0.3 August 7, 2018 { id="3.0.3" } + +- Fixed #841: Additional path levels for extra CSS and JS + +### 3.0.2 August 6, 2018 { id="3.0.2" } + +- Fixed #839: Lunr.js stemmer imports incorrect + +### 3.0.1 August 5, 2018 { id="3.0.1" } + +- Fixed #838: Search result links incorrect + +### 3.0.0 August 5, 2018 { id="3.0.0" } + +- Upgraded MkDocs to 1.0 (**BREAKING**) +- Upgraded Python in official Docker image to 3.6 +- Added Serbian and Serbo-Croatian translations + +--- + +### 2.9.4 July 29, 2018 { id="2.9.4" } + +- Fixed build error after MkDocs upgrade + +### 2.9.3 July 29, 2018 { id="2.9.3" } + +- Added link to home for logo in drawer +- Fixed dependency problems between MkDocs and Tornado + +### 2.9.2 June 29, 2018 { id="2.9.2" } + +- Added Hindi and Czech translations + +### 2.9.1 June 18, 2018 { id="2.9.1" } + +- Added support for different spellings for theme color +- Fixed #799: Added support for webfont minification in production +- Fixed #800: Added `.highlighttable` as an alias for `.codehilitetable` + +### 2.9.0 June 13, 2018 { id="2.9.0" } + +- Added support for theme color on Android +- Fixed #796: Rendering of nested tabbed code blocks + +### 2.8.0 June 10, 2018 { id="2.8.0" } + +- Added support for grouping code blocks with tabs +- Added Material and FontAwesome icon fonts to distribution files (GDPR) +- Added note on compliance with GDPR +- Added Slovak translations +- Fixed #790: Prefixed `id` attributes with `__` to avoid name clashes + +### 2.7.3 April 26, 2018 { id="2.7.3" } + +- Added Finnish translations + +### 2.7.2 April 9, 2018 { id="2.7.2" } + +- Fixed rendering issue for `details` on Edge + +### 2.7.1 March 21, 2018 { id="2.7.1" } + +- Added Galician translations +- Fixed #730: Scroll chasing error on home page if Disqus is enabled +- Fixed #736: Reset drawer and search upon back button invocation + +### 2.7.0 March 6, 2018 { id="2.7.0" } + +- Added ability to set absolute URL for logo +- Added Hebrew translations + +### 2.6.6 February 22, 2018 { id="2.6.6" } + +- Added preconnect for Google Fonts for faster loading +- Fixed #710: With tabs sidebar disappears if JavaScript is not available + +### 2.6.5 February 22, 2018 { id="2.6.5" } + +- Reverted `--dev-addr` flag removal from `Dockerfile` + +### 2.6.4 February 21, 2018 { id="2.6.4" } + +- Added Catalan translations +- Fixed incorrect margins for buttons in Firefox and Safari +- Replaced package manager `yarn` with `npm 5.6` +- Reverted GitHub stars rounding method +- Removed `--dev-addr` flag from `Dockerfile` for Windows compatibility + +### 2.6.3 February 18, 2018 { id="2.6.3" } + +- Added Vietnamese translations + +### 2.6.2 February 12, 2018 { id="2.6.2" } + +- Added Arabic translations +- Fixed incorrect rounding of amount of GitHub stars +- Fixed double-layered borders for tables + +### 2.6.1 February 11, 2018 { id="2.6.1" } + +- Added ability to override Disqus integration using metadata +- Fixed #690: Duplicate slashes in source file URLs +- Fixed #696: Active page highlight not working with default palette +- Adjusted German translations + +### 2.6.0 February 2, 2018 { id="2.6.0" } + +- Moved default search configuration to default translation (English) +- Added support to automatically set text direction from translation +- Added support to disable search stop word filter in translation +- Added support to disable search trimmer in translation +- Added Persian translations +- Fixed support for Polish search +- Fixed disappearing GitHub, GitLab and Bitbucket repository icons + +### 2.5.5 January 31, 2018 { id="2.5.5" } + +- Added Hungarian translations + +### 2.5.4 January 29, 2018 { id="2.5.4" } + +- Fixed #683: `gh-deploy` fails inside Docker + +### 2.5.3 January 25, 2018 { id="2.5.3" } + +- Added Ukrainian translations + +### 2.5.2 January 22, 2018 { id="2.5.2" } + +- Added default search language mappings for all localizations +- Fixed #673: Error loading non-existent search language +- Fixed #675: Uncaught reference error when search plugin disabled + +### 2.5.1 January 20, 2018 { id="2.5.1" } + +- Fixed permalink for main headline +- Improved missing translation handling with English as a fallback +- Improved accessibility with skip-to-content link + +### 2.5.0 January 13, 2018 { id="2.5.0" } + +- Added support for right-to-left languages + +### 2.4.0 January 11, 2018 { id="2.4.0" } + +- Added focus state for clipboard buttons +- Fixed #400: Search bar steals tab focus +- Fixed search not closing on ++enter++ when result is selected +- Fixed search not closing when losing focus due to ++tab++ +- Fixed collapsed navigation links getting focus +- Fixed `outline` being cut off on ++tab++ focus of navigation links +- Fixed bug with first search result navigation being ignored +- Removed search result navigation via ++tab++ (use ++up++ and ++down++) +- Removed `outline` resets for links +- Improved general tabbing behavior on desktop + +### 2.3.0 January 9, 2018 { id="2.3.0" } + +- Added `example` (synonym: `snippet`) style for admonitions +- Added synonym `abstract` for `summary` style for admonitions + +### 2.2.6 December 27, 2017 { id="2.2.6" } + +- Added Turkish translations +- Fixed unclickable area below header in case JavaScript is not available + +### 2.2.5 December 18, 2017 { id="2.2.5" } + +- Fixed #639: Broken default favicon + +### 2.2.4 December 18, 2017 { id="2.2.4" } + +- Fixed #638: Build breaks with Jinja < 2.9 + +### 2.2.3 December 13, 2017 { id="2.2.3" } + +- Fixed #630: Admonition sets padding on any last child +- Adjusted Chinese (Traditional) translations + +### 2.2.2 December 8, 2017 { id="2.2.2" } + +- Added Dutch translations +- Adjusted targeted link and footnote offsets +- Simplified admonition styles and fixed padding bug + +### 2.2.1 December 2, 2017 { id="2.2.1" } + +- Fixed #616: Minor styling error with title-only admonitions +- Removed border for table of contents and improved spacing + +### 2.2.0 November 22, 2017 { id="2.2.0" } + +- Added support for hero teaser +- Added Portuguese translations +- Fixed #586: Footnote backref target offset regression +- Fixed #605: Search stemmers not correctly loaded + +### 2.1.1 November 21, 2017 { id="2.1.1" } + +- Replaced deprecated `babel-preset-es2015` with `babel-preset-env` +- Refactored Gulp build pipeline with Webpack +- Removed right border on sidebars +- Fixed broken color transition on header + +### 2.1.0 November 19, 2017 { id="2.1.0" } + +- Added support for `white` as a primary color +- Added support for sliding site name and title +- Fixed redundant clipboard button when using line numbers on code blocks +- Improved header appearance by making it taller +- Improved tabs appearance +- Improved CSS customizability by leveraging inheritance +- Removed scroll shadows via `background-attachment` + +### 2.0.4 November 5, 2017 { id="2.0.4" } + +- Fixed `details` not opening with footnote reference + +### 2.0.3 November 5, 2017 { id="2.0.3" } + +- Added Japanese translations +- Fixed #540: Jumping to anchor inside `details` doesn't open it +- Fixed active link colors in footer + +### 2.0.2 November 1, 2017 { id="2.0.2" } + +- Added Russian translations +- Fixed #542: Horizontal scrollbar between `1220px` and `1234px` +- Fixed #553: Metadata values only rendering first character +- Fixed #558: Flash of unstyled content +- Fixed favicon regression caused by deprecation upstream + +### 2.0.1 October 31, 2017 { id="2.0.1" } + +- Fixed error when initializing search +- Fixed styles for link to edit the current page +- Fixed styles on nested admonition in details + +### 2.0.0 October 31, 2017 { id="2.0.0" } + +- Upgraded MkDocs to 0.17.1 (__BREAKING__) +- Added support for easier configuration of search tokenizer +- Added support to disable search +- Added Korean translations + +--- + +### 1.12.2 October 26, 2017 { id="1.12.2" } + +- Added Italian, Norwegian, French and Chinese translations + +### 1.12.1 October 22, 2017 { id="1.12.1" } + +- Added Polish, Swedish and Spanish translations +- Improved downward compatibility with custom partials +- Temporarily pinned MkDocs version within Docker image to 0.16.3 +- Fixed #519: Missing theme configuration file + +### 1.12.0 October 20, 2017 { id="1.12.0" } + +- Added support for setting language(s) via `mkdocs.yml` +- Added support for default localization +- Added German and Danish translations +- Fixed #374: Search bar misalignment on big screens + +### 1.11.0 October 19, 2017 { id="1.11.0" } + +- Added localization to clipboard +- Refactored localization logic + +### 1.10.4 October 18, 2017 { id="1.10.4" } + +- Improved print styles of code blocks +- Improved search UX (don't close on enter if no selection) +- Fixed #495: Vertical scrollbar on short pages + +### 1.10.3 October 11, 2017 { id="1.10.3" } + +- Fixed #484: Vertical scrollbar on some MathJax formulas +- Fixed #483: Footnote backref target offset regression + +### 1.10.2 October 6, 2017 { id="1.10.2" } + +- Fixed #468: Sidebar shows scrollbar if content is shorter (in Safari) + +### 1.10.1 September 14, 2017 { id="1.10.1" } + +- Fixed #455: Bold code blocks rendered with normal font weight + +### 1.10.0 September 1, 2017 { id="1.10.0" } + +- Added support to make logo default icon configurable +- Fixed uninitialized overflow scrolling on main pane for iOS +- Fixed error in mobile navigation in case JavaScript is not available +- Fixed incorrect color transition for nested panes in mobile navigation +- Improved checkbox styles for Tasklist from PyMdown Extension package + +### 1.9.0 August 29, 2017 { id="1.9.0" } + +- Added `info` (synonym: `todo`) style for admonitions +- Added `question` (synonym: `help`, `faq`) style for admonitions +- Added support for Details from PyMdown Extensions package +- Improved admonition styles to match details +- Improved styles for social links in footer +- Replaced ligatures with Unicode code points to avoid broken layout +- Upgraded PyMdown Extensions package dependency to >= 3.4 + +### 1.8.1 August 7, 2017 { id="1.8.1" } + +- Fixed #421: Missing pagination for GitHub API + +### 1.8.0 August 2, 2017 { id="1.8.0" } + +- Added support for lazy-loading of search results for better performance +- Added support for customization of search tokenizer/separator +- Fixed #424: Search doesn't handle capital letters anymore +- Fixed #419: Search doesn't work on whole words + +### 1.7.5 July 25, 2017 { id="1.7.5" } + +- Fixed #398: Forms broken due to search shortcuts +- Improved search overall user experience +- Improved search matching and highlighting +- Improved search accessibility + +### 1.7.4 June 21, 2017 { id="1.7.4" } + +- Fixed functional link colors in table of contents for active palette +- Fixed #368: Compatibility issues with IE11 + +### 1.7.3 June 7, 2017 { id="1.7.3" } + +- Fixed error when setting language to Japanese for site search + +### 1.7.2 June 6, 2017 { id="1.7.2" } + +- Fixed offset of search box when `repo_url` is not set +- Fixed non-disappearing tooltip + +### 1.7.1 June 1, 2017 { id="1.7.1" } + +- Fixed wrong `z-index` order of header, overlay and drawer +- Fixed wrong offset of targeted footnote back references + +### 1.7.0 June 1, 2017 { id="1.7.0" } + +- Added "copy to clipboard" buttons to code blocks +- Added support for multilingual site search +- Fixed search term highlighting for non-latin languages + +### 1.6.4 May 24, 2017 { id="1.6.4" } + +- Fixed #337: JavaScript error for GitHub organization URLs + +### 1.6.3 May 16, 2017 { id="1.6.3" } + +- Fixed #329: Broken source stats for private or unknown GitHub repos + +### 1.6.2 May 15, 2017 { id="1.6.2" } + +- Fixed #316: Fatal error for git clone on Windows +- Fixed #320: Chrome 58 creates double underline for `abbr` tags +- Fixed #323: Ligatures rendered inside code blocks +- Fixed miscalculated sidebar height due to missing margin collapse +- Changed deprecated MathJax CDN to Cloudflare + +### 1.6.1 April 23, 2017 { id="1.6.1" } + +- Fixed following of active/focused element if search input is focused +- Fixed layer order of search component elements + +### 1.6.0 April 22, 2017 { id="1.6.0" } + +- Added build test for Docker image on Travis +- Added search overlay for better user experience (focus) +- Added language from localizations to `html` tag +- Fixed #270: source links broken for absolute URLs +- Fixed missing top spacing for first targeted element in content +- Fixed too small footnote divider when using larger font sizes + +### 1.5.5 April 20, 2017 { id="1.5.5" } + +- Fixed #282: Browser search (Meta+F) is hijacked + +### 1.5.4 April 8, 2017 { id="1.5.4" } + +- Fixed broken highlighting for two or more search terms +- Fixed missing search results when only a `h1` is present +- Fixed unresponsive overlay on Android + +### 1.5.3 April 7, 2017 { id="1.5.3" } + +- Fixed deprecated calls for template variables +- Fixed wrong palette color for focused search result +- Fixed JavaScript errors on 404 page +- Fixed missing top spacing on 404 page +- Fixed missing right spacing on overflow of source container + +### 1.5.2 April 5, 2017 { id="1.5.2" } + +- Added requirements as explicit dependencies in `setup.py` +- Fixed non-synchronized transitions in search form + +### 1.5.1 March 30, 2017 { id="1.5.1" } + +- Fixed rendering and offset of targeted footnotes +- Fixed #238: Link on logo is not set to `site_url` + +### 1.5.0 March 24, 2017 { id="1.5.0" } + +- Added support for localization of search placeholder +- Added keyboard events for quick access of search +- Added keyboard events for search control +- Added opacity on hover for search buttons +- Added git hook to skip CI build on non-src changes +- Fixed non-resetting search placeholder when input is cleared +- Fixed error for unescaped parentheses in search term +- Fixed #229: Button to clear search missing +- Fixed #231: Escape key doesn't exit search +- Removed old-style figures from font feature settings + +### 1.4.1 March 16, 2017 { id="1.4.1" } + +- Fixed invalid destructuring attempt on NodeList (in Safari, Edge, IE) + +### 1.4.0 March 16, 2017 { id="1.4.0" } + +- Added support for grouping searched sections by documents +- Added support for highlighting of search terms +- Added support for localization of search results +- Fixed #216: table of contents icon doesn't show if `h1` is not present +- Reworked style and layout of search results for better usability + +### 1.3.0 March 11, 2017 { id="1.3.0" } + +- Added support for page-specific title and description using metadata +- Added support for linking source files to documentation +- Fixed jitter and offset of sidebar when zooming browser +- Fixed incorrectly initialized tablet sidebar height +- Fixed regression for #1: GitHub stars break if `repo_url` ends with a `/` +- Fixed undesired white line below copyright footer due to base font scaling +- Fixed issue with whitespace in path for scripts +- Fixed #205: support non-fixed (static) header +- Refactored footnote references for better visibility +- Reduced repaints to a minimum for non-tabs configuration +- Reduced contrast of edit button (slightly) + +### 1.2.0 March 3, 2017 { id="1.2.0" } + +- Added `quote` (synonym: `cite`) style for admonitions +- Added help message to build pipeline +- Fixed wrong navigation link colors when applying palette +- Fixed #197: Link missing in tabs navigation on deeply nested items +- Removed unnecessary dev dependencies + +### 1.1.1 February 26, 2017 { id="1.1.1" } + +- Fixed incorrectly displayed nested lists when using tabs + +### 1.1.0 February 26, 2017 { id="1.1.0" } + +- Added tabs navigation feature (optional) +- Added Disqus integration (optional) +- Added a high resolution Favicon with the new logo +- Added static type checking using Facebook's Flow +- Fixed #173: Dictionary elements have no bottom spacing +- Fixed #175: Tables cannot be set to 100% width +- Fixed race conditions in build related to asset revisioning +- Fixed accidentally re-introduced Permalink on top-level headline +- Fixed alignment of logo in drawer on IE11 +- Refactored styles related to tables +- Refactored and automated Docker build and PyPI release +- Refactored build scripts + +### 1.0.5 February 18, 2017 { id="1.0.5" } + +- Fixed #153: Sidebar flows out of constrained area in Chrome 56 +- Fixed #159: Footer jitter due to JavaScript if content is short + +### 1.0.4 February 16, 2017 { id="1.0.4" } + +- Fixed #142: Documentation build errors if `h1` is defined as raw HTML +- Fixed #164: PyPI release does not build and install +- Fixed offsets of targeted headlines +- Increased sidebar font size by `0.12rem` + +### 1.0.3 January 22, 2017 { id="1.0.3" } + +- Fixed #117: Table of contents items don't blur on fast scrolling +- Refactored sidebar positioning logic +- Further reduction of repaints + +### 1.0.2 January 15, 2017 { id="1.0.2" } + +- Fixed #108: Horizontal scrollbar in content area + +### 1.0.1 January 14, 2017 { id="1.0.1" } + +- Fixed massive repaints happening when scrolling +- Fixed footer back reference positions in case of overflow +- Fixed header logo from showing when the menu icon is rendered +- Changed scrollbar behavior to only show when content overflows + +### 1.0.0 January 13, 2017 { id="1.0.0" } + +- Introduced Webpack for more sophisticated JavaScript bundling +- Introduced ESLint and Stylelint for code style checks +- Introduced more accurate Material Design colors and shadows +- Introduced modular scales for harmonic font sizing +- Introduced git-hooks for better development workflow +- Rewrite of CSS using the BEM methodology and SassDoc guidelines +- Rewrite of JavaScript using ES6 and Babel as a transpiler +- Rewrite of Admonition, Permalinks and CodeHilite integration +- Rewrite of the complete typographical system +- Rewrite of Gulp asset pipeline in ES6 and separation of tasks +- Removed Bower as a dependency in favor of NPM +- Removed custom icon build in favor of the Material Design icon set +- Removed `_blank` targets on links due to vulnerability: http://bit.ly/1Mk2Rtw +- Removed unversioned assets from build directory +- Restructured templates into base templates and partials +- Added build and watch scripts in `package.json` +- Added support for Metadata and Footnotes Markdown extensions +- Added support for PyMdown Extensions package +- Added support for collapsible sections in navigation +- Added support for separate table of contents +- Added support for better accessibility through REM-based layout +- Added icons for GitHub, GitLab and BitBucket integrations +- Added more detailed documentation on specimen, extensions etc. +- Added a `404.html` error page for deployment on GitHub Pages +- Fixed live reload chain in watch mode when saving a template +- Fixed variable references to work with MkDocs 0.16 + +--- + +### 0.2.4 June 26, 2016 { id="0.2.4" } + +- Fixed improperly set default favicon +- Fixed #33: Protocol relative URL for webfonts doesn't work with `file://` +- Fixed #34: IE11 on Windows 7 doesn't honor `max-width` on `main` tag +- Fixed #35: Add styling for blockquotes + +### 0.2.3 May 16, 2016 { id="0.2.3" } + +- Fixed #25: Highlight inline fenced blocks +- Fixed #26: Better highlighting for keystrokes +- Fixed #30: Suboptimal syntax highlighting for PHP + +### 0.2.2 March 20, 2016 { id="0.2.2" } + +- Fixed #15: Document Pygments dependency for CodeHilite +- Fixed #16: Favicon could not be set through `mkdocs.yml` +- Fixed #17: Put version into own container for styling +- Fixed #20: Fix rounded borders for tables + +### 0.2.1 March 12, 2016 { id="0.2.1" } + +- Fixed #10: Invisible header after closing search bar with ESC key +- Fixed #13: Table cells don't wrap +- Fixed empty list in table of contents when no headline is defined +- Corrected wrong path for static asset monitoring in Gulpfile.js +- Set up tracking of site search for Google Analytics + +### 0.2.0 February 24, 2016 { id="0.2.0" } + +- Fixed #6: Include multiple color palettes via `mkdocs.yml` +- Fixed #7: Better colors for links inside admonition notes and warnings +- Fixed #9: Text for prev/next footer navigation should be customizable +- Refactored templates (replaced `if`/`else` with modifiers where possible) + +### 0.1.3 February 21, 2016 { id="0.1.3" } + +- Fixed #3: Ordered lists within an unordered list have `::before` content +- Fixed #4: Click on Logo/Title without Github-Repository: `"None"` +- Fixed #5: Page without headlines renders empty list in table of contents +- Moved Modernizr to top to ensure basic usability in IE8 + +### 0.1.2 February 16, 2016 { id="0.1.2" } + +- Fixed styles for deep navigational hierarchies +- Fixed webfont delivery problem when hosted in subdirectories +- Fixed print styles in mobile/tablet configuration +- Added option to configure fonts in `mkdocs.yml` with fallbacks +- Changed styles for admonition notes and warnings +- Set download link to latest version if available +- Set up tracking of outgoing links and actions for Google Analytics + +### 0.1.1 February 11, 2016 { id="0.1.1" } + +- Fixed #1: GitHub stars don't work if the repo_url ends with a `/` +- Updated NPM and Bower dependencies to most recent versions +- Changed footer/copyright link to Material theme to GitHub pages +- Made MkDocs building/serving in build process optional +- Set up continuous integration with Travis + +### 0.1.0 February 9, 2016 { id="0.1.0" } + +- Initial release diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/adding-translations.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/adding-translations.md new file mode 100644 index 0000000..46696a7 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/adding-translations.md @@ -0,0 +1,125 @@ +# Translations + +It's unbelievable – with the help of international community contributions, +Material for MkDocs has been translated into 60+ languages. As you can imagine, +it's impossible for us maintainers to keep all languages up-to-date, and new +features sometimes require new translations. + +If you would like to help us to make Material for MkDocs even more globally +accessible and have noticed a missing translation in your language, or would +like to add a new language, you can help us by following the steps of the guide +below. + +## Before creating an issue + +Translations change frequently, which is why we want to make sure that you don't +invest your time in duplicating work. Before adding translations, please check +the following things: + +### Check language availability + +With more than 60 languages, the chances are good that your language is already +supported by Material for MkDocs. You can check if your language is available, +or needs improvements or additional translations by inspecting the list of +[supported languages]: + +- __Your language is already supported__ – in this case, you can check if there + are translations missing, and click the link underneath your language to add them, which takes 5 minutes. + +- __Your language is missing__ – in that case, you can help us add support + for your language to Material for MkDocs! Read on, to learn how to do this. + + [supported languages]: ../setup/changing-the-language.md#site-language + +### Search our issue tracker + +Another user might have already created an issue supplying the missing +translations for your language that still needs to be integrated by us +maintainers. To avoid investing your time in duplicated work, please search the +[issue tracker] beforehand. + + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues + +--- + +At this point, when you have made sure that Material for MkDocs doesn't already +support your language, you can add new translations for it by following the +issue template. + +## Issue template + +We have created an issue template that makes contributing translations as simple +as possible. It is the result of our experience with 60+ language contributions +and updates over the last couple of years, and consists of the following parts: + +- [Title] +- [Translations] +- [Country flag] optional +- [Checklist] + + [Title]: #title + [Translations]: #translations + [Country flag]: #country-flag + [Checklist]: #checklist + +### Title + +When you update an already existing language, you can just leave the title as it +is. Adding support for a new language, replace the `...` in the pre-filled title +with the name of your language. + +| | Example | +| -------- | -------- | +| :material-check:{ style="color: #4DB6AC" } __Clear__ | Add translations for German +| :material-close:{ style="color: #EF5350" } __Unclear__ | Add translations ... +| :material-close:{ style="color: #EF5350" } __Useless__ | Help + +### Translations + +If a translation contains an :arrow_left: icon on the right side, it is missing. +You can translate this line and remove the :arrow_left: icon. If you don't know +how to translate specific lines, simply leave them for other contributors to +complete. To ensure the accuracy of your translation, consider double-checking the +context of the words by looking at our [English translations]. + +[English translations]: https://github.com/squidfunk/mkdocs-material/tree/master/src/templates/partials/languages/en.html + +### Country flag optional { #country-flag } + +For a better overview, our list of [supported languages] includes country flags +next to the language names. You can help us select a flag for your language by +adding the shortcode for the country flag to this field. Go to our +[emoji search] and enter `flag` to find all available shortcodes. + +!!! question "What if my flag is not available?" + + [Twemoji] provides flag emojis for 260 countries – subdivisions of countries, + such as states, provinces, or regions, are not supported. If you're adding + translations for a subdivision, please choose the most appropriate available + flag. + + [Twemoji]: https://github.com/jdecked/twemoji + [emoji search]: ../reference/icons-emojis.md#search + +> __Why this might be helpful__: adding a country flag next to the country name +> can be helpful for you and for others to find the language in the list of +> supported languages faster and easier. If your country's flag is not supported +> by [Twemoji], you can help us choose an alternative. + +### Checklist + +Thanks for following the guide and helping us to add new translations to Material +for MkDocs – you are almost done. The checklist ensures that you have read this +guide and have worked to your best knowledge to provide us with everything we need +to integrate your contribution. + +__We'll take it from here.__ + +--- + +## Attribution + +If you submit a translation using the template above, you will be __credited as +a co-author__ in the commit, so you don't need to open a pull request. You have +done a significant contribution to the project, making Material for MkDocs +accessible to more people around the world. Thank you! diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/index.md new file mode 100644 index 0000000..fe84fd5 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/index.md @@ -0,0 +1,269 @@ +# Contributing + +Material for MkDocs is an actively maintained and constantly evolving project +serving a diverse user base with versatile backgrounds and needs. In order to +efficiently address the requirements of all our users, evaluate change requests, +and fix bugs, we put in a lot of work. + +Our ever-growing community includes many active users, who open new +issues and discussions several times a day, evolving our [issue tracker] and +[discussion board] into a knowledge base – an important addition to +our [documentation] – yielding value to both new and experienced users. + + [discussion board]: https://github.com/squidfunk/mkdocs-material/discussions + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues + [documentation]: https://squidfunk.github.io/mkdocs-material/ + +## How you can contribute + +We understand that reporting bugs, raising change requests, as well as engaging +in discussions can be time-consuming, which is why we've carefully optimized our +issue templates and defined guidelines to improve the overall interaction +within the project. We've invested a lot of time and effort into making our +[issue tracker] and [discussion board] as efficient as possible. + +Our goal is to ensure that our documentation, as well as issue tracker and +discussion board, are __well-structured__, __easy to navigate__, and +__searchable__, so you can find what you need quickly and efficiently. Thus, +when you follow our guidelines, we can help you much faster. + +In this section, we guide your through our processes. + +### Creating an issue + +
+ +- :material-bug-outline:   + __Something is not working?__ + + --- + + Report a bug in Material for MkDocs by creating an issue with a + reproduction + + --- + + [:octicons-arrow-right-24: Report a bug][report a bug] + +- :material-file-document-remove-outline:   + __Missing information in our docs?__ + + --- + + Report missing information or potential inconsistencies in our + documentation + + --- + + [:octicons-arrow-right-24: Report a docs issue][report a docs issue] + +- :material-lightbulb-on-20:   + __Want to submit an idea?__ + + --- + + Propose a change, feature request, or suggest an improvement + + --- + + [:octicons-arrow-right-24: Request a change][request a change] + +- :material-account-question-outline:   + __Have a question or need help?__ + + --- + + Ask a question on our [discussion board] and get in touch with our + community + + --- + + [:octicons-arrow-right-24: Ask a question][discussion board] + +
+ +### Contributing + +
+ +- :material-translate:   + __Missing support for your language?__ + + --- + + Add or improve translations for a new or already supported language + + --- + + [:octicons-arrow-right-24: Add translations][add translations] + +- :material-source-pull:   + __Want to create a pull request?__ + + --- + + Learn how to create a comprehensive and useful pull request (PR) + + --- + + [:octicons-arrow-right-24: Create a pull request][create a pull request] + +
+ + [report a bug]: reporting-a-bug.md + [report a docs issue]: reporting-a-docs-issue.md + [request a change]: requesting-a-change.md + [add translations]: adding-translations.md + [create a pull request]: making-a-pull-request.md + +## Checklist + +Before interacting within the project, please take a moment to consider the +following questions. By doing so, you can ensure that you are using the correct +issue template and that you provide all necessary information when interacting +with our community. + +!!! warning "Issues, discussions, and comments are forever" + + Please note that everything you write is permanent and will remain + for everyone to read – forever. Therefore, please always be nice and + constructive, follow our contribution guidelines, and comply with our + [Code of Conduct]. + +### Before creating an issue + +- Are you using the appropriate issue template, or is there another issue + template that better fits the context of your request? + +- Have you checked if a similar bug report or change request has already been + created, or have you stumbled upon something that might be related? + +- Did your fill out every field as requested and did you provide all additional + information we maintainers need to comprehend your request? + +### Before asking a question + +- Is the topic a question for our [discussion board], or is it a bug report or + change request that should better be raised on our [issue tracker]? + +- Is there an open discussion on the topic of your request? If the answer is yes, + does your question match the direction of the discussion, or should you open a + new discussion? + +- Did your provide our community with all the necessary information to + understand your question and help you quickly, or can you make it easier to + help you? + +### Before commenting + +- Is your comment relevant to the topic of the current page, post, issue, or + discussion, or is it a better idea to create a new issue or discussion? + +- Does your comment add value to the conversation? Is it constructive and + respectful to our community and us maintainers? Could you just use a + [:octicons-smiley-16: reaction][reaction] instead? + + [Code of Conduct]: https://github.com/squidfunk/mkdocs-material/blob/master/CODE_OF_CONDUCT.md + [reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/ + +## Rights and responsibilities + +As maintainers, we are entrusted with the __responsibility__ to moderate +communication within our community, including the authority to close, remove, +reject, or edit issues, discussions, comments, commits, and to block users who +__do not align__ with our contribution guidelines and our [Code of Conduct]. +This role requires us to be actively involved in maintaining the integrity and +positive atmosphere of our community. Upholding these standards decisively +ensures a respectful and inclusive environment for all members. + + +### Code of Conduct + +Our [Code of Conduct] outlines the expectation for all community members to +treat one another with respect, employing inclusive and welcoming language. Our +commitment is to foster a positive and supportive environment, free of +inappropriate, offensive, or harmful behavior. + +We take any violations seriously and will take appropriate action in response to +uphold these values.[^1] + + [^1]: + __Warning and blocking policy:__ + Given the increasing popularity of our project and our commitment to a + healthy community, we've defined clear guidelines on how we proceed with + violations: + + 1.1. __First warning:__ Users displaying repeated inappropriate, offensive, + or harmful behavior will receive a first warning. This warning serves as a + formal notice that their behavior is not in alignment with our community + standards and Code of Conduct. The first warning is permanent. + + 1.2. __Second warning and opportunity for resolution:__ If the behavior + persists, a second warning will be issued. Upon receiving the second + warning, the user will be given a 5-day period for reflection, during which + they are encouraged to publicly explain or apologize for their actions. + This period is designed to offer an opportunity for openly clearing out any + misunderstanding. + + 1.3. __Blocking:__ Should there be no response or improvement in behavior + following the second warning, we reserve the right to block the user from + the community and repository. Blocking is considered a last resort, used + only when absolutely necessary to protect the community's integrity and + positive atmosphere. + + Blocking has been an exceptionally rare necessity in our overwhelmingly + positive community, highlighting our preference for constructive dialogue + and mutual respect. It aims to protect our community members and team. + +### Incomplete issues and duplicates + +We have invested significant time and effort in the setup of our contribution +process, ensuring that we assess the essential requirements for reviewing and +responding to issues effectively. Each field in our issue templates is +thoughtfully designed to help us fully understand your concerns and the nature +of your matter. We encourage all members to utilize the search function before +submitting new issues or starting discussions to help avoid duplicates. Your +cooperation is crucial in keeping our community's discussions constructive and +organized. + + - __Mandatory completion of issue templates:__ We need all of the information + required in our issue templates because it ensures that every user and + maintainer, regardless of their experience, can understand the content and + severity of your bug report or change request. + + - __Closing incomplete issues:__ + We _reserve the right to close issues lacking essential information_, such as + but not limited to [minimal reproductions] or those not adhering to the + quality standards and requirements specified in our issue templates. Such + issues can be reopened once the missing information has been provided. + + - __Handling duplicates:__ To maintain organized and efficient + communication within our [issue tracker] and [discussion board], we + _reserve the right to close any duplicated issues or lock duplicated + discussions_. Opening multiple channels to ask the same question or report the + same issue across different forums hinders our ability to manage and address + community concerns effectively. This approach is vital for efficient time + management, as duplicated questions can consume the time of multiple team + members simultaneously. Ensuring that each issue or discussion is unique and + progresses with new information helps us to maintain focus and support our + community. + + We further _reserve the right to immediately close discussions or issues that + are reopened without providing new information_ or simply because users have + not yet received a response to their issue/question, as the issue is marked as + incomplete. + + - __Limitations of automated tools:__ While we believe in the value and + efficiency that automated tools bring to identifying potential issues (such + as those identified by Lighthouse, Accessibility tools, and others), simply + submitting an issue generated by these tools does not constitute a complete + bug report. These tools sometimes produce verbose outputs and may include + false positives, which necessitate a critical evaluation. You are of course + welcome to attach generated reports to your issue. However, this does not + substitute the requirement for a minimal reproduction or a thorough discussion + of the findings. _We reserve the right to mark these issues as incomplete and + close them._ This practice ensures that we are addressing genuine concerns + with precision and clarity, rather than navigating through extensive automated + outputs. + + [minimal reproductions]: ../guides/creating-a-reproduction.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/making-a-pull-request.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/making-a-pull-request.md new file mode 100644 index 0000000..6f1f0e1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/making-a-pull-request.md @@ -0,0 +1,402 @@ +# Pull Requests + +You can contribute to Material for MkDocs by making a [pull request] that +will be reviewed by maintainers and integrated into the main repository when +the changes made are approved. You can contribute bug fixes, changes to the +documentation, or new functionality you have developed. + +[pull request]: https://docs.github.com/en/pull-requests + +!!! note "Considering a pull request" + + Before deciding to spend effort on making changes and creating a pull + request, please discuss what you intend to do. If you are responding to + what you think might be a bug, please issue a [bug report] first. If you + intend to work on documentation, create a [documentation issue]. If you + want to work on a new feature, please create a [change request]. + + Keep in mind the guidance given and let people advise you. It might be that + there are easier solutions to the problem you perceive and want to address. + It might be that what you want to achieve can already be done by + configuration or [customization]. + +[bug report]: reporting-a-bug.md +[documentation issue]: reporting-a-docs-issue.md +[change request]: requesting-a-change.md +[customization]: ../customization.md + +## Learning about pull requests + +Pull requests are a concept layered on top of Git by services that provide Git +hosting. Before you consider making a pull request, you should familiarize +yourself with the documentation on GitHub, the service we are using. The +following articles are of particular importance: + +1. [Forking a repository] +2. [Creating a pull request from a fork] +3. [Creating a pull request] + +Note that they provide tailored documentation for different operating systems +and different ways of interacting with GitHub. We do our best in the +documentation here to describe the process as it applies to Material for MkDocs +but cannot cover all possible combinations of tools and ways of doing things. +It is also important that you understand the concept of a pull-request in +general before continuing. + +[Forking a repository]: https://docs.github.com/en/get-started/quickstart/fork-a-repo +[Creating a pull request from a fork]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork +[Creating a pull request]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request + +## Pull request process + +In the following, we describe the general process for making pull requests. The +aim here is to provide the 30k ft overview before describing details later on. + +### Preparing changes and draft PR + +The diagram below describes what typically happens to repositories in the +process or preparing a pull request. We will be discussing the review-revise +process below. It is important that you understand the overall process first +before you worry about specific commands. This is why we cover this first before +providing instructions below. + +``` mermaid +sequenceDiagram + autonumber + + participant mkdocs-material + participant PR + participant fork + participant local + + mkdocs-material ->> fork: fork on GitHub + fork ->> local: clone to local + local ->> local: branch + loop prepare + loop push + loop edit + local ->> local: commit + end + local ->> fork: push + end + mkdocs-material ->> fork: merge in any changes + fork ->>+ PR: create draft PR + PR ->> PR: review your changes + end +``` + +1. The first step is that you create a fork of the Material for MkDocs + repository. This provides you with a repository that you can push changes to. + Note that it is not possible to have more than one fork of a given repository + at any point in time. So, the fork you create will be *the* fork you have. + +1. Once it is made, clone it to your local machine so you can start working on + your changes. + +2. All contributions should be made through a 'topic branch' with a name that + describes the work being done. This allows you to have more than one piece + of work in progress and, if you are working with the public version, also + shows others clearly that the code contained is work in progress. The topic + branch will be relatively short-lived and will disappear at the end, when + your changes have been incorporated into the codebase. + +3. If you intend to make any code changes, as opposed to working on + documentation only, you will need to [set up a development + environment](#setting-up-a-development-environment). + +4. Next comes the iterative process of making edits, committing them to your + clone. Please commit in sensible chunks that constitute a piece of work + instead of committing everything in one go. + + Remember that fine-grained, incremental commits are much easier to + review in than large changes all over the place and with many files involved. + Try to keep your changes as small and localized as possible and keep the + reviewer in mind when committing. In particular, make sure to write + meaningful commit messages. + +5. Push your work up to your fork regularly. + +6. You should also keep an eye on changes in the Material for MkDocs repository + you cloned. This is especially important if you work takes a while. Please + try and merge any concurrent changes into your fork and into your branch + regularly. You *must* do this at least once before creating a pull request, + so make your life easier and do it more often so as to minimize the risk of + conflicting changes. + +7. Once you are happy that your changes are in a state that you can describe + them in a *draft* pull request, you should create this. Make sure to + reference any previous discussions or issues that gave rise to your work. + Creating a draft is a good way to get *early* feedback on your work from the + maintainer or others. You can explicitly request reviews at points where you + think this would be important. + +8. Review your work as if you were the reviewer and fix any issues with your + work so far. Look critically at the diffs of the files that you have changed. + In particular, pay attention to whether the changes are as small as possible + and whether you have follow the general coding style used in the project. + If you received feedback, iterate over the process so far as necessary. + + You should choose a number of projects to test your changes with. You should + definitely make sure that the changes do not break the building of the + documentation for Material for MkDocs, which you can find in the `docs` + folder. You may also want to make sure that relevant examples from the + [examples repository] still build fine. + +[examples repository]: https://github.com/mkdocs-material/examples + +### Finalizing + +Once you are happy with your changes, you can move to the next step, finalizing +your pull request and asking for a more formal and detailed review. The diagram +below shows the process: + +``` mermaid +sequenceDiagram + autonumber + participant mkdocs-material + participant PR + participant fork + participant local + + activate PR + PR ->> PR : finalize PR + loop review + loop discuss + PR ->> PR: request review + PR ->> PR: discussion + local ->> fork: push further changes + end + PR ->> mkdocs-material: merge (and squash) + deactivate PR + fork ->> fork: delete branch + mkdocs-material ->> fork: pull + local ->> local: delete branch + fork ->> local: pull + end +``` + +1. When you are happy that the changes you made amount to a contribution that + the maintainer(s) could integrate into the codebase, finalize the pull + request. This signals to everyone that consider the work 'done' and that it + can be reviewed with a view to accepting and integrating it. + +2. Request a review from the maintainer, `@squidfunk`. + +3. The maintainer may make comments on your code, which you should discuss with + them. Bear in mind when doing this that the maintainer may have a different + point of view compared to yours. They will often take a more long-term + perspective of maintaining the project in the years to come while you may be + more focused on the specific issue or feature that you worked on. Please keep + the discussion respectful at all times. + + It is important to note that not all pull requests get incorporated into the + codebase. The reasons can vary. The work may bring to light other issues that + block integration of the pull request. Sometimes it helps uncover better ways of + doing things or shows that a more general approach is needed. All of this is + fine and helps the project progress, even if specific changes are not, + ultimately, accepted. + +4. Make any requested changes by committing them to your local clone and + pushing them up to your fork. This will automatically update the pull request. + It may well take a few iterations to get your contributions to an acceptable + state. You can help the process along by carefully reading comments made and + making changes with care. + +5. Once the reviewer is fully satisfied with the changes, they can merge them + into the main branch (or 'master'). In the process, they may 'squash' your + commits together into a smaller number of commits and may edit the messages + that describe them. Congratulations, you have now contributed to this project + and should see the changes in the main branch under your name. + +6. You can now delete the fork and your local repository and start afresh again + next time around. Alternatively, you can keep the repository and local clone + around but it is important that you keep them in sync with the upstream + repository for any subsequent work. We recommend that you start by deleting + the branch you used on your fork. + +7. To make sure you have the changes you produced, pull them from the main + repository into the main branch of your fork. + +8. Similarly, delete the topic branch from your local clone and... + +9. pull the changes to its master branch. + +## Steps + +Now that the overall process is outlined, here are specific instructions and +tips. There are many choices to be made when describing a process for +contributing to a project via a pull request. In the following, we assume that +you are working with the Git command-line tools. For most alternatives (such as +using IDEs or using functionality provided through the GitHub web interface), +the translation from the command-line instructions should be simple enough. We +will add notes only where really necessary to keep the complexity of this to a +reasonable level. + +### Forking the repository + +To make changes to Material for MkDocs, you would first fork one of its +repositories on GitHub. This is so that you have a repository on GitHub that +you can push changes to (only maintainers and collaborators have write access +to the original repositories). + +Fork the [repository] if you want to make changes to code or to the documentation. +It is a good idea to change the name of the repository by appending `-fork` so +that people who come across it know that they have found a temporary fork rather +than the original or a permanent fork of the project. You may also want to add +a description that clarifies what the repository is for. + +[repository]: https://github.com/squidfunk/mkdocs-material + +### Setting up a development environment + +From this point onwards, please follow the [instructions for setting up the +development environment]. They will take you through the process of setting up +an environment in which you can make changes and review/test them. + +[instructions for setting up the development environment]: ../customization.md#environment-setup + +### Making changes + +When you make changes to the code or the documentation please follow the +established style used in the project. Doing so increases readability and +also helps with making diffs easier to read for those who will review the pull +request. Avoid making any large-scale style changes such as asking your IDE +to re-format all code. + +Study the code that you are modifying well to ensure that you fully understand +how it works before you try to change it. This will not only help you solve the +problem you are trying to address but also minimize the risks of creating +unintended side effects. + +### Committing to a branch + +Development for pull requests is best done in a topic branch separate from the +`master` branch. Create a new local branch with `git switch -c ` and +commit your changes to this branch. + +When you want to push commits to your fork, you can do so with +`git push -u origin `. The `-u` argument is the short version of +`--set-upstream`, which makes the newly created branch 'track' the branch with +the same `` in your fork. This means that then `pull` and `push` commands +will work against that branch in your fork by default. + +### Merging concurrent changes + +If the work you do takes some time then the chances increase that changes will +be made to the main repository while you work. It is probably a good idea to set +up the original Material for MkDocs repository as an `upstream` repository for +your local clone. + +This is what it might look like: + +```bash hl_lines="4" +$ git remote -v +origin git@github.com:/mkdocs-material-fork.git (fetch) +origin git@github.com:/mkdocs-material-fork.git (push) +$ git remote add upstream https://github.com/squidfunk/mkdocs-material.git +$ git remote -v +origin git@github.com:alexvoss/mkdocs-material-fork.git (fetch) +origin git@github.com:alexvoss/mkdocs-material-fork.git (push) +upstream https://github.com/squidfunk/mkdocs-material.git (fetch) +upstream https://github.com/squidfunk/mkdocs-material.git (push) +``` + +After you have done this, you can pull any concurrent changes from the upstream +repository directly into your clone and do any necessary merges there, then push +them up to your fork. You will need to be explicit about which remote repository +you want to use when you are doing a `pull`: + +```bash +# making and committing some local changes +push pull upstream master +``` + +This fetches changes from the `master` branch into your topic branch and merges +them. + +### Testing and reviewing changes + +Before you commit any changes, you should make sure that they work as expected +and do not create any unintended side effects. You should test them on at least +these three [smoke tests]: + +- The documentation of Material for MkDocs itself. If you set up and run the +development environment as outlined in the [instructions for setting up the +development environment], `mkdocs serve` should be running and continuously +building the documentation. Check that there are no error messages and, ideally, +no (new) warnings. + +- Test on a project that represents the problem or a test for a newly developed +feature. You may already have this if you have filed a bug report and created +a [minimal reproduction]. If you are working on a new feature then you may need +to build a project to serve as a test suite. It can double as documentation that +shows how your new feature is meant to work. + +- Test with relevant examples from the [Material for MkDocs Examples] + repository. + +[smoke tests]: https://en.wikipedia.org/wiki/Smoke_testing_(software) +[minimal reproduction]: https://squidfunk.github.io/mkdocs-material/guides/creating-a-reproduction/ +[Material for MkDocs Examples]: https://github.com/mkdocs-material/examples + +- Ideally, also test the examples in the [examples repository]. + +[examples repository]: https://github.com/mkdocs-material/examples +[projects plugin]: https://squidfunk.github.io/mkdocs-material/plugins/projects/ + +### Creating the pull request + +Initially, create the pull request **as a draft**. You do this [through the +various interfaces that GitHub provides]. Which one you use is entirely up to +you. We do not provide specific instructions for using the interfaces as GitHub +provide all the information that should be necessary. + +[through the various interfaces that GitHub provides]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request + +### Commits, messages, mistakes and 'squash' + +### Deleting branches + +Once the pull request has been merged into the master branch of the Material +for MkDocs repository, you should remove the branch both from the fork on +GitHub and from the local clone on your computer. This avoids possible +confusion about the state of development. + +First, switch back to the `master` branch with `git switch master` and then +delete the branch used for the PR using `git branch -d `. + +### Subsequent Pull Requests + +It is important that subsequent pull requests are started from an up-to-date +history of the `master` branch. One way to achieve this is to delete the fork +and start with an entirely new one next time round. + +If you contribute to Material for MkDocs more often or just happen to be +doing two or more pull requests in succession, you can also just make sure +to sync your fork (using the GitHub UI) and pull from it into your local +repository. So, just delete the topic branch you created (both locally and in +your fork) and pull from the main repository's `master` branch into your +`master` branch before starting work on a new pull request. + +## Dos and Don'ts + +1. **Don't** just create a pull request with changes that are not explained. + +2. **Do** discuss what you intend to do with people in the discussions so that the + rationale for any changes is clear before you write or modify code. + +3. **Do** link to the discussion or any issues to provide the context for a pull + request. + +4. **Do** ask questions if you are uncertain about anything. + +5. **Do** ask yourself if what you are doing benefits the wider community and + makes Material for MkDocs a better product. + +6. **Do** ask yourself if the cost of making the changes stands in a good + relation to the benefits they will bring. Some otherwise sensible changes can + add complexity for comparatively little gain, might break existing behaviour + or might be brittle when other changes need to be made. + +7. **Do** merge in concurrent changes frequently to minimize the chance of + conflicting changes that may be difficult to resolve. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/reporting-a-bug.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/reporting-a-bug.md new file mode 100644 index 0000000..8c84f8a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/reporting-a-bug.md @@ -0,0 +1,313 @@ +# Bug reports + +Material for MkDocs is an actively maintained project that we constantly strive +to improve. With a project of this size and complexity, bugs may occur. If you +think you have discovered a bug, you can help us by submitting an issue in our +public [issue tracker], following this guide. + + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues + +## Before creating an issue + +With more than 20,000 users, issues are created every other day. The maintainers +of this project are trying very hard to keep the number of open issues down by +fixing bugs as fast as possible. By following this guide, you will know exactly +what information we need to help you quickly. + +__But first, please do the following things before creating an issue.__ + +### Upgrade to latest version + +Chances are that the bug you discovered was already fixed in a subsequent +version. Thus, before reporting an issue, ensure that you're running the +[latest version] of Material for MkDocs. Please consult our [upgrade guide] to +learn how to upgrade to the latest version. + +!!! warning "Bug fixes are not backported" + + Please understand that only bugs that occur in the latest version of + Material for MkDocs will be addressed. Also, to reduce duplicate efforts, + fixes cannot be backported to earlier versions. + +### Remove customizations + +If you're using [customizations] like [additional CSS], [JavaScript], or +[theme extension], please remove them from `mkdocs.yml` before reporting a bug. +We can't offer official support for bugs that might hide in your overrides, so +make sure to omit the following settings from `mkdocs.yml`: + + - [`theme.custom_dir`][theme.custom_dir] + - [`hooks`][hooks] + - [`extra_css`][extra_css] + - [`extra_javascript`][extra_javascript] + +If, after removing those settings, the bug is gone, the bug is likely caused by +your customizations. A good idea is to add them back gradually to narrow down +the root cause of the problem. If you did a major version upgrade, make sure you +adjusted all partials you have overridden. + +!!! warning "Customizations mentioned in our documentation" + + A handful of the features Material for MkDocs offers can only be implemented + with customizations. If you find a bug in any of the customizations [that + our documentation explicitly mentions], you are, of course, encouraged to + report it. + +__Don't be shy to ask on our [discussion board] for help if you run into +problems.__ + + [latest version]: ../changelog/index.md + [upgrade guide]: ../upgrade.md + [Customizations]: ../customization.md + [additional CSS]: ../customization.md#additional-css + [JavaScript]: ../customization.md#additional-javascript + [theme extension]: ../customization.md#extending-the-theme + [theme.custom_dir]: https://www.mkdocs.org/user-guide/configuration/#custom_dir + [hooks]: https://www.mkdocs.org/user-guide/configuration/#hooks + [extra_css]: https://www.mkdocs.org/user-guide/configuration/#extra_css + [extra_javascript]: https://www.mkdocs.org/user-guide/configuration/#extra_javascript + [discussion board]: https://github.com/squidfunk/mkdocs-material/discussions + [StackOverflow]: https://stackoverflow.com + [that our documentation explicitly mentions]: ?q="extends+base" + +### Search for solutions + +At this stage, we know that the problem persists in the latest version and is +not caused by any of your customizations. However, the problem might result from +a small typo or a syntactical error in a configuration file, e.g., `mkdocs.yml`. + +Now, before you go through the trouble of creating a bug report that is answered +and closed right away with a link to the relevant documentation section or +another already reported or closed issue or discussion, you can save time for +us and yourself by doing some research: + +1. [Search our documentation] and look for the relevant sections that could + be related to your problem. If found, make sure that you configured + everything correctly.[^1] + + [^1]: + When adding lines to `mkdocs.yml`, make sure you are preserving the + indentation as mentioned in the documentation since YAML is a + whitespace-sensitive language. Many reported issues turn out to be + configuration errors. + +1. [Search our issue tracker][issue tracker], as another user might already + have reported the same problem, and there might even be a known workaround + or fix for it. Thus, no need to create a new issue. + +2. [Search our discussion board][discussion board] to learn if other users + are struggling with similar problems and work together with our great + community towards a solution. Many problems are solved here. + +__Keep track of all search terms and relevant links, you'll need +them in the bug report.__[^2] + + [^2]: + We might be using terminology in our documentation different from yours, + but we mean the same. When you include the search terms and related links + in your bug report, you help us to adjust and improve the documentation. + +--- + +At this point, when you still haven't found a solution to your problem, we +encourage you to create an issue because it's now very likely that you +stumbled over something we don't know yet. Read the following section to learn +how to create a complete and helpful bug report. + + [Search our documentation]: ?q= + +## Issue template + +We have created a new issue template to make the bug reporting process as simple +as possible and more efficient for our community and us. It is the result of +our experience answering and fixing more than 1,600 issues (and counting) and +consists of the following parts: + +- [Title] +- [Context] optional +- [Bug description] +- [Related links] +- [Reproduction] +- [Steps to reproduce] +- [Browser] optional +- [Checklist] + + [Title]: #title + [Context]: #context + [Bug description]: #bug-description + [Related links]: #related-links + [Reproduction]: #reproduction + [Steps to reproduce]: #steps-to-reproduce + [Browser]: #browser + [Checklist]: #checklist + +### Title + +A good title is short and descriptive. It should be a one-sentence executive +summary of the issue, so the impact and severity of the bug you want to report +can be inferred from the title. + +| | Example | +| -------- | -------- | +| :material-check:{ style="color: #4DB6AC" } __Clear__ | Built-in `typeset` plugin changes precedence of nav title over `h1` +| :material-close:{ style="color: #EF5350" } __Wordy__ | The built-in `typeset` plugin changes the precedence of the nav title over the document headline +| :material-close:{ style="color: #EF5350" } __Unclear__ | Title does not work +| :material-close:{ style="color: #EF5350" } __Useless__ | Help + +### Context optional { #context } + +Before describing the bug, you can provide additional context for us to +understand what you were trying to achieve. Explain the circumstances +in which you're using Material for MkDocs, and what you _think_ might be +relevant. Don't write about the bug here. + +> __Why this might be helpful__: some errors only manifest in specific settings, +> environments or edge cases, for example, when your documentation contains +> thousands of documents. + +### Bug description + +Now, to the bug you want to report. Provide a clear, focused, specific, and +concise summary of the bug you encountered. Explain why you think this is a bug +that should be reported to Material for MkDocs, and not to one of its +dependencies.[^3] Adhere to the following principles: + + [^3]: + Sometimes, users report bugs on our [issue tracker] that are caused by one + of our upstream dependencies, including [MkDocs], [Python Markdown], + [Python Markdown Extensions] or third-party plugins. A good rule of thumb is + to change the [`theme.name`][theme.name] to `mkdocs` or `readthedocs` and + check if the problem persists. If it does, the problem is likely not + related to Material for MkDocs and should be reported upstream. When in + doubt, use our [discussion board] to ask for help. + +- __Explain the what, not the how__ – don't explain + [how to reproduce the bug][Steps to reproduce] here, we're getting there. + Focus on articulating the problem and its impact as clearly as possible. + +- __Keep it short and concise__ – if the bug can be precisely explained in one + or two sentences, perfect. Don't inflate it – maintainers and future users + will be grateful for having to read less. + +- __One bug at a time__ – if you encounter several unrelated bugs, please + create separate issues for them. Don't report them in the same issue, as + this makes attribution difficult. + +--- + +:material-run-fast: __Stretch goal__ – if you found a workaround or a way to fix +the bug, you can help other users temporarily mitigate the problem before +we maintainers can fix the bug in our code base. + +> __Why we need this__: in order for us to understand the problem, we +> need a clear description of it and quantify its impact, which is essential +> for triage and prioritization. + + [MkDocs]: https://www.mkdocs.org + [Python Markdown]: https://python-markdown.github.io/extensions/ + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/ + [theme.name]: https://www.mkdocs.org/user-guide/configuration/#theme + +### Related links + +Of course, prior to reporting a bug, you have read our documentation and +[could not find a working solution][search for solutions]. Please share links +to all sections of our documentation that might be relevant to the bug, as it +helps us gradually improve it. + +Additionally, since you have searched our [issue tracker] and [discussion board] +before reporting an issue, and have possibly found several issues or +discussions, include those as well. Every link to an issue or discussion creates +a backlink, guiding us maintainers and other users in the future. + +--- + +:material-run-fast: __Stretch goal__ – if you also include the search terms you +used when [searching for a solution][search for solutions] to your problem, you +make it easier for us maintainers to improve the documentation. + +> __Why we need this__: related links help us better understand what you were +> trying to achieve and whether sections of our documentation need to be +> adjusted, extended, or overhauled. + + [search for solutions]: #search-for-solutions + +### Reproduction + +A minimal reproduction is at the heart of every well-written bug report, as +it allows us maintainers to instantly recreate the necessary conditions to +inspect the bug to quickly find its root cause. It's a proven fact that issues +with concise and small reproductions can be fixed much faster. + +[:material-bug: Create reproduction][Create reproduction]{ .md-button .md-button--primary } + +--- + +After you have created the reproduction, you should have a `.zip` file, ideally +not larger than 1 MB. Just drag and drop the `.zip` file into this field, which +will automatically upload it to GitHub. + +> __Why we need this__: if an issue contains no minimal reproduction or just +> a link to a repository with thousands of files, the maintainers would need to +> invest a lot of time into trying to recreate the right conditions to even +> inspect the bug, let alone fix it. + +!!! warning "Don't share links to repositories" + + While we know that it is a good practice among developers to include a link + to a repository with the bug report, we currently don't support those in our + process. The reason is that the reproduction, which is automatically + produced by the [built-in info plugin] contains all of the necessary + environment information that is often forgotten to be included. + + Additionally, there are many non-technical users of Material for MkDocs that + have trouble creating repositories. + + [Create reproduction]: ../guides/creating-a-reproduction.md + [built-in info plugin]: ../plugins/info.md + +### Steps to reproduce + +At this point, you provided us with enough information to understand the bug +and provided us with a reproduction that we could run and inspect. However, when +we run your reproduction, it might not be immediately apparent how we can see +the bug in action. + +Thus, please list the specific steps we should follow when running your +reproduction to observe the bug. Keep the steps short and concise, and make sure +not to leave anything out. Use simple language as you would explain it to a +five-year-old, and focus on continuity. + +> __Why we need this__: we must know how to navigate your reproduction in order +> to observe the bug, as some bugs only occur at certain viewports or in +> specific conditions. + +### Browser optional { #browser } + +If you're reporting a bug that only occurs in one or more _specific_ browsers, +we need to know which browsers are affected. This field is optional, as it is +only relevant when the bug you are reporting does not involve a crash when +[previewing] or [building] your site. + +--- + +:material-incognito: __Incognito mode__ – Please verify that a the bug is +not caused by a browser extension. Switch to incognito mode and try to reproduce +the bug. If it's gone, it's caused by an extension. + +> __Why we need this__: some bugs only occur in specific browsers or versions. +> Since now, almost all browsers are evergreen, we usually don't need to know the +> version in which it occurs, but we might ask for it later. When in doubt, add +> the browser version as the first step in the field above. + + [previewing]: http://localhost:8000/mkdocs-material/creating-your-site/#previewing-as-you-write + [building]: http://localhost:8000/mkdocs-material/creating-your-site/#building-your-site + +### Checklist + +Thanks for following the guide and creating a high-quality and complete bug +report – you are almost done. The checklist ensures that you have read this guide +and have worked to your best knowledge to provide us with everything we need to +know to help you. + +__We'll take it from here.__ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/reporting-a-docs-issue.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/reporting-a-docs-issue.md new file mode 100644 index 0000000..460aadf --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/reporting-a-docs-issue.md @@ -0,0 +1,91 @@ +# Documentation issues + +Our documentation is composed of more than 80 pages and includes extensive +information on features, configurations, customizations, and much more. If you +have found an inconsistency or see room for improvement, please follow this +guide to submit an issue on our [issue tracker]. + + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues + +## Issue template + +Reporting a documentation issue is usually less involved than reporting a bug, +as we don't need a [reproduction]. Please thoroughly read this guide before +creating a new documentation issue, and provide the following information as +part of the issue: + +- [Title] +- [Description] +- [Related links] +- [Proposed change] optional +- [Checklist] + + [reproduction]: ../guides/creating-a-reproduction.md + [Title]: #title + [Description]: #description + [Related links]: #related-links + [Proposed change]: #proposed-change + [Checklist]: #checklist + +### Title + +A good title should be a short, one-sentence description of the issue, contain +all relevant information and, in particular, keywords to simplify the search in +our issue tracker. + +| | Example | +| -------- | -------- | +| :material-check:{ style="color: #4DB6AC" } __Clear__ | Clarify social cards setup on Windows +| :material-close:{ style="color: #EF5350" } __Unclear__ | Missing information in the docs +| :material-close:{ style="color: #EF5350" } __Useless__ | Help + +### Description + +Provide a clear and concise summary of the inconsistency or issue you +encountered in the documentation or the documentation section that needs +improvement. Explain why you think the documentation should be adjusted and +describe the severity of the issue: + +- __Keep it short and concise__ – if the inconsistency or issue can be + precisely explained in one or two sentences, perfect. Maintainers and future + users will be grateful for having to read less. + +- __One issue at a time__ – if you encounter several unrelated inconsistencies, + please create separate issues for them. Don't report them in the same issue + – it makes attribution difficult. + +> __Why we need this__: describing the problem clearly and concisely is a +> prerequisite for improving our documentation – we need to understand what's +> wrong, so we can fix it. + +### Related links + +After you described the documentation section that needs to be adjusted above, +we now ask you to share the link to this specific documentation section and +other possibly related sections. Make sure to use anchor links (permanent links) +where possible, as it simplifies discovery. + +> __Why we need this__: providing the links to the documentation help us +> understand which sections of our documentation need to be adjusted, extended, +> or overhauled. + + +### Proposed change optional { #proposed-change } + +Now that you have provided us with the description and links to the +documentation sections, you can help us, maintainers, and the community by +proposing an improvement. You can sketch out rough ideas or write a concrete +proposal. This field is optional but very helpful. + +> __Why we need this__: an improvement proposal can be beneficial for other +> users who encounter the same issue, as they offer solutions before we +> maintainers can update the documentation. + +### Checklist + +Thanks for following the guide and providing valuable feedback for our +documentation – you are almost done. The checklist ensures that you have read +this guide and have worked to your best knowledge to provide us with every piece +of information we need to improve it. + +__We'll take it from here.__ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/requesting-a-change.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/requesting-a-change.md new file mode 100644 index 0000000..3c58cb3 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/contributing/requesting-a-change.md @@ -0,0 +1,282 @@ +# Change requests + +Material for MkDocs is a powerful tool for creating beautiful and functional +documentation. With more than 20,000 users, we understand that our project +serves a wide range of use cases, which is why we have created the following +guide. + +--- + +Put yourself in our shoes – with a project of this size, it can be challenging +to maintain existing functionality while constantly adding new features at the +same time. We highly value every idea or contribution from our community, and +we kindly ask you to take the time to read the following guidelines before +submitting your change request in our public [issue tracker]. This will help us +better understand the proposed change and how it will benefit our community. + +This guide is our best effort to explain the criteria and reasoning behind our +decisions when evaluating change requests and considering them for +implementation. + + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues + +!!! warning "[How we manage change requests]" + + Before submitting a new idea, please take a moment to read how we manage + change requests + + + [How we manage change requests]: #how-we-manage-change-requests + +## Before creating an issue + +Before you invest your time to fill out and submit a change request, we kindly +ask you to do some preliminary work by answering some questions to determine if +your idea is a good fit for Material for MkDocs and matches the project's +[philosophy] and tone. + +__Please do the following things before creating an issue.__ + + [philosophy]: ../philosophy.md + +### It's not a bug, it's a feature + +Change requests are intended to suggest minor adjustments, ideas for new +features, or to kindly influence the project's direction and vision. It is +important to note that change requests are not intended for reporting bugs, as +they're missing essential information for debugging. + +If you want to report a bug, please refer to our [bug reporting guide] instead. + + [bug reporting guide]: reporting-a-bug.md + +### Look for sources of inspiration + +If you have seen your idea implemented in another static site generator or +theme, make sure to collect enough information on its implementation before +submitting, as this allows us to evaluate potential fit more quickly. Explain +what you like and dislike about the implementation. + +### Connect with our community + +Our [discussion board] is the best place to connect with our community. When +evaluating new ideas, it's essential to seek input from other users and consider +alternative viewpoints. This approach helps to implement new features in a way +that benefits a large number of users. + +__Keep track of all search terms and relevant links, you'll need +them in the change request.__[^1] + + [^1]: + We might be using terminology in our documentation different from yours, + but we mean the same. When you include the search terms and related links + in your change request, you help us to adjust and improve the documentation. + +[:octicons-comment-discussion-16:  Start a discussion][discussion board]{ .md-button .md-button--primary } + + [discussion board]: https://github.com/squidfunk/mkdocs-material/discussions + +## Issue template + +Now that you have taken the time to do the necessary preliminary work and ensure +that your idea meets our requirements, you are invited to create a change +request. The following guide will walk you through all the necessary steps to +help you submit a comprehensive and useful issue: + +- [Title] +- [Context] optional +- [Description] +- [Related links] +- [Use cases] +- [Visuals] optional +- [Checklist] + + [Title]: #title + [Context]: #context + [Description]: #description + [Related links]: #related-links + [Use cases]: #use-cases + [Visuals]: #visuals + [Checklist]: #checklist + +### Title + +A good title is short and descriptive. It should be a one-sentence executive +summary of the idea, so the potential impact and benefit for our community can +be inferred from the title. + +| | Example | +| -------- | -------- | +| :material-check:{ style="color: #4DB6AC" } __Clear__ | Index custom front matter in search +| :material-close:{ style="color: #EF5350" } __Wordy__ | Add a feature where authors can define custom front matter to be indexed in search +| :material-close:{ style="color: #EF5350" } __Unclear__ | Improve search +| :material-close:{ style="color: #EF5350" } __Useless__ | Help + +### Context optional { #context } + +Before describing your idea, you can provide additional context for us to +understand what you are trying to achieve. Explain the circumstances +in which you're using Material for MkDocs, and what you _think_ might be +relevant. Don't write about the change request here. + +> __Why this might be helpful__: some ideas might only benefit specific +> settings, environments, or edge cases, for example, when your documentation +> contains thousands of documents. With a little context, change requests +> can be prioritized more accurately. + +### Description + +Next, provide a detailed and clear description of your idea. Explain why your +idea is relevant to Material for MkDocs and must be implemented here and not +in one of its dependencies:[^2] + + [^2]: + Sometimes, users suggest ideas on our [issue tracker] that concern one of + our upstream dependencies, including [MkDocs][mkdocs], [Python Markdown], + [Python Markdown Extensions] or third-party plugins. It's a good idea to + think about whether your idea is beneficial to other themes, upstreaming + change requests for a bigger impact. + +- __Explain the what, not the why__ – don't explain + [the benefits of your idea][Use cases] here, we're getting there. + Focus on describing the proposed change request as precisely as possible. + +- __Keep it short and concise__ – be brief and to the point when describing + your idea, there is no need to over-describe it. Maintainers and future + users will be grateful for having to read less. + +- __One idea at a time__ – if you have multiple ideas that don't belong + together, please open separate change requests for each of those ideas. + +--- + +:material-run-fast: __Stretch goal__ – if you have a customization or another +way to add the proposed change, you can help other users by sharing it here +before we maintainers can add it to our code base. + +> __Why we need this__: To understand and evaluate your proposed change, we +> need to have a clear understanding of your idea. By providing a detailed and +> precise description, you can help save you and us time spent discussing +> further clarification of your idea in the comments. + + [Python Markdown]: https://python-markdown.github.io/extensions/ + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/ + +### Related links + +Please provide any relevant links to issues, discussions, or documentation +sections related to your change request. If you (or someone else) already +discussed this idea with our community on our discussion board, please include +the link to the discussion as well. + +> __Why we need this__: Related links help us gain a comprehensive +> understanding of your change request by providing additional context. +> Additionally, linking to previous issues and discussions allows us +> to quickly evaluate the feedback and input already provided by our community. + +### Use cases + +Explain how your change request would work from an author's and user's +perspective – what's the expected impact, and why does it not only benefit you, +but other users? How many of them? Furthermore, would it potentially break +existing functionality? + +> __Why we need this__: Understanding the use cases and benefits of an idea is +> crucial in evaluating its potential impact and usefulness for the project and +> its users. This information helps us to understand the expected value of the +> idea and how it aligns with the goals of the project. + +### Visuals optional { #visuals } + +We now have a clear and detailed description of your idea, including information +on its potential use cases and relevant links for context. If you have any +visuals, such as sketches, screenshots, mockups, or external assets, you may +present them in this section. + +__You can drag and drop the files here or include links to external assets.__ + +Additionally, if you have seen this change, feature, or improvement used in +other static site generators or themes, please provide an example by showcasing +it and describing how it was implemented and incorporated. + +> __Why this might be helpful__: Illustrations and visuals can help us +> maintainers better understand and envision your idea. Screenshots, sketches, +> or mockups can create an additional level of detail and clarity that text +> alone may not be able to convey. Also, seeing how your idea has been +> implemented in other projects can help us understand its potential impact and +> feasibility in Material for MkDocs, which helps us maintainers evaluate and +> triage change requests. + +### Checklist + +Thanks for following the guide and creating a high-quality change request – you +are almost done. The checklist ensures that you have read this guide and have +worked to your best knowledge to provide us with every piece of information to +review your idea for Material for MkDocs. + +__We'll take it from here.__ + +--- + +## How we manage change requests + +Change requests are submitted as issues on our public [issue tracker]. Since +they often propose new features or enhancements, we review and manage them +differently than bug reports. + +To maintain clarity and ensure that our roadmap remains focused and achievable, +we've introduced a structured process and use a dedicated [backlog] to +track and organize change requests, and how they fit into our roadmap. + + [backlog]: https://github.com/users/squidfunk/projects/4/views/1 + +Here’s how we handle new change requests: + +1. We read and review the request to understand the idea. +2. We may leave comments to clarify intent or suggest alternatives. +3. If the idea is out of scope, we will close the request and explain why. +4. If the idea aligns with the project's vision, we'll categorize it as a change +request, and add it to our [backlog]. +5. In either case, we close the request to keep the issue tracker clean and +focused on open bugs. + +> Note: While the issue may be closed, that doesn't mean it's forgotten – +> change requests added to the project board remain part of our long-term +> planning. + +__Benefits of this approach:__ +- Users get a clearer and quicker overview of known issues and bugs, as change +requests are managed separately, giving a better idea how actively this project +is maintained. +- Related ideas are grouped in the backlog, allowing us to track progress more +effectively, and to more easily see which change requests are related. + +## Rejected requests + +__Your change request got rejected? We're sorry for that.__ We understand it can +be frustrating when your ideas don't get accepted, but as the maintainers of a +very popular project, we always need to consider the needs of our entire +community, sometimes forcing us to make tough decisions. + +We always have to consider and balance many factors when evaluating change +requests, and we explain the reasoning behind our decisions whenever we can. +If you're unsure why your change request was rejected, please don't hesitate +to ask for clarification. + +The following principles (in no particular order) form the basis for our +decisions: + +- [ ] Alignment with vision and tone of the project +- [ ] Compatibility with existing features and plugins +- [ ] Compatibility with all screen sizes and browsers +- [ ] Effort of implementation and maintenance +- [ ] Usefulness to the majority of users +- [ ] Simplicity and ease of use +- [ ] Accessibility + +But that's not the end of your idea – you can always implement it on your own +via [customization]. If you're unsure about how to do that or want to know if +someone has already done it, feel free to get in touch with our community on +the [discussion board]. + + [customization]: ../customization.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/conventions.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/conventions.md new file mode 100644 index 0000000..54b5619 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/conventions.md @@ -0,0 +1,79 @@ +# Conventions + +This section explains several conventions used in this documentation. + +## Symbols + +This documentation use some symbols for illustration purposes. Before you read +on, please make sure you've made yourself familiar with the following list of +conventions: + +### – Version { data-toc-label="Version" } + +The tag symbol in conjunction with a version number denotes when a specific +feature or behavior was added. Make sure you're at least on this version +if you want to use it. + +### – Default value { #default data-toc-label="Default value" } + +Some properties in `mkdocs.yml` have default values for when the author does not +explicitly define them. The default value of the property is always included. + +#### – Default value is computed { #default data-toc-label="is computed" } + +Some default values are not set to static values but computed from other values, +like the site language, repository provider, or other settings. + +#### – Default value is empty { #default data-toc-label="is empty" } + +Some properties do not contain default values. This means that the functionality +that is associated with them is not available unless explicitly enabled. + +### – Metadata property { #metadata data-toc-label="Metadata property" } + +This symbol denotes that the thing described is a metadata property, which can +be used in Markdown documents as part of the front matter definition. + +### – Multiple instances { #multiple-instances data-toc-label="Multiple instances" } + +This symbol denotes that the plugin supports multiple instances, i.e, that it +can be used multiple times in the `plugins` setting in `mkdocs.yml`. + +### – Optional feature { #feature data-toc-label="Optional feature" } + +Most of the features are hidden behind feature flags, which means they must +be explicitly enabled via `mkdocs.yml`. This allows for the existence of +potentially orthogonal features. + +### – Experimental { data-toc-label="Experimental" } + +Some newer features are still considered experimental, which means they might +(although rarely) change at any time, including their complete removal (which +hasn't happened yet). + +### – Plugin { data-toc-label="Plugin" } + +Several features are implemented through MkDocs excellent plugin architecture, +some of which are built-in and distributed with Material for MkDocs, so no +installation is required. + +### – Markdown extension { data-toc-label="Markdown extension" #extension } + +This symbol denotes that the thing described is a Markdown extension, which can +be enabled in `mkdocs.yml` and adds additional functionality to the Markdown +parser. + +### – Required value { #required data-toc-label="Required value" } + +Some (very few in fact) properties or settings are required, which means the +authors must explicitly define them. + +### – Customization { #customization data-toc-label="Customization" } + +This symbol denotes that the thing described is a customization that must be +added by the author. + +### – Utility { data-toc-label="Utility" } + +Besides plugins, there are some utilities that build on top of MkDocs in order +to provide extended functionality, like for example support for versioning. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/creating-your-site.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/creating-your-site.md new file mode 100644 index 0000000..cd0378e --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/creating-your-site.md @@ -0,0 +1,269 @@ +# Creating your site + +After you've [installed] Material for MkDocs, you can bootstrap your project +documentation using the `mkdocs` executable. Go to the directory where you want +your project to be located and enter: + +``` +mkdocs new . +``` + +Alternatively, if you're running Material for MkDocs from within Docker, use: + +=== "Unix, Powershell" + + ``` + docker run --rm -it -v ${PWD}:/docs squidfunk/mkdocs-material new . + ``` + +=== "Windows (cmd)" + + ``` + docker run --rm -it -v "%cd%":/docs squidfunk/mkdocs-material new . + ``` + +This will create the following structure: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ index.md +└─ mkdocs.yml +``` + + [installed]: getting-started.md + +## Configuration + +### Minimal configuration + +Simply set the `site_name` and add the following lines to `mkdocs.yml` to enable the theme: + +``` yaml hl_lines="2-5" +site_name: My site +site_url: https://mydomain.org/mysite +theme: + name: material +``` + +The `site_url` setting is important for a number of reasons. +By default, MkDocs will assume that your site is hosted at the root of +your domain. This is not the case, for example, when [publishing to GitHub +pages] - unless you use a custom domain. Another reason is that some of the +plugins require the `site_url` to be set, so you should always do this. + + [publishing to GitHub pages]: publishing-your-site.md#github-pages + [installation methods]: getting-started.md#installation + +???+ tip "Recommended: [configuration validation and auto-complete]" + + In order to minimize friction and maximize productivity, Material for MkDocs + provides its own [schema.json][^1] for `mkdocs.yml`. If your editor supports + YAML schema validation, it's definitely recommended to set it up: + + === "Visual Studio Code" + + 1. Install [`vscode-yaml`][vscode-yaml] for YAML language support. + 2. Add the schema under the `yaml.schemas` key in your user or + workspace [`settings.json`][settings.json]: + + ``` json + { + "yaml.schemas": { + "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml" + }, + "yaml.customTags": [ // (1)! + "!ENV scalar", + "!ENV sequence", + "!relative scalar", + "tag:yaml.org,2002:python/name:material.extensions.emoji.to_svg", + "tag:yaml.org,2002:python/name:material.extensions.emoji.twemoji", + "tag:yaml.org,2002:python/name:pymdownx.superfences.fence_code_format", + "tag:yaml.org,2002:python/object/apply:pymdownx.slugs.slugify mapping" + ] + } + ``` + + 1. This setting is necessary if you plan to use [icons and emojis], + or Visual Studio Code will show errors on certain lines. + + === "Other" + + 1. Ensure your editor of choice has support for YAML schema validation. + 2. Add the following lines at the top of `mkdocs.yml`: + + ``` yaml + # yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json + ``` + + [^1]: + If you're a MkDocs plugin or Markdown extension author and your project + works with Material for MkDocs, you're very much invited to contribute a + schema for your [extension] or [plugin] as part of a pull request on GitHub. + If you already have a schema defined, or wish to self-host your schema to + reduce duplication, you can add it via [$ref]. + + [configuration validation and auto-complete]: https://x.com/squidfunk/status/1487746003692400642 + [schema.json]: schema.json + [vscode-yaml]: https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml + [settings.json]: https://code.visualstudio.com/docs/getstarted/settings + [extension]: https://github.com/squidfunk/mkdocs-material/tree/master/docs/schema/extensions + [plugin]: https://github.com/squidfunk/mkdocs-material/tree/master/docs/schema/plugins + [$ref]: https://json-schema.org/understanding-json-schema/structuring.html#ref + [icons and emojis]: reference/icons-emojis.md + +### Advanced configuration + +Material for MkDocs comes with many configuration options. The setup section +explains in great detail how to configure and customize colors, fonts, icons +and much more: + +
+ +- [Changing the colors] +- [Changing the fonts] +- [Changing the language] +- [Changing the logo and icons] +- [Ensuring data privacy] +- [Setting up navigation] +- [Setting up site search] +- [Setting up site analytics] +- [Setting up social cards] +- [Setting up a blog] +- [Setting up tags] +- [Setting up versioning] +- [Setting up the header] +- [Setting up the footer] +- [Adding a git repository] +- [Adding a comment system] +- [Building an optimized site] +- [Building for offline usage] + +
+ +Furthermore, see the list of supported [Markdown extensions] that are natively +integrated with Material for MkDocs, delivering an unprecedented low-effort +technical writing experience. + + [Changing the colors]: setup/changing-the-colors.md + [Changing the fonts]: setup/changing-the-fonts.md + [Changing the language]: setup/changing-the-language.md + [Changing the logo and icons]: setup/changing-the-logo-and-icons.md + [Ensuring data privacy]: setup/ensuring-data-privacy.md + [Setting up navigation]: setup/setting-up-navigation.md + [Setting up site search]: setup/setting-up-site-search.md + [Setting up site analytics]: setup/setting-up-site-analytics.md + [Setting up social cards]: setup/setting-up-social-cards.md + [Setting up a blog]: setup/setting-up-a-blog.md + [Setting up tags]: setup/setting-up-tags.md + [Setting up versioning]: setup/setting-up-versioning.md + [Setting up the header]: setup/setting-up-the-header.md + [Setting up the footer]: setup/setting-up-the-footer.md + [Adding a git repository]: setup/adding-a-git-repository.md + [Adding a comment system]: setup/adding-a-comment-system.md + [Building for offline usage]: setup/building-for-offline-usage.md + [Building an optimized site]: setup/building-an-optimized-site.md + [Markdown extensions]: setup/extensions/index.md + +## Templates + +If you want to jump start a new project, you can use one of our growing +collection of templates: + +
+ +- :octicons-repo-template-24:   __[Blog][blog-template]__ + + --- + + Create a blog + +- :octicons-repo-template-24:   __[Social cards][social-cards-template]__ + + --- + + Create documentation with social cards + +
+ +[blog-template]: https://github.com/mkdocs-material/create-blog +[social-cards-template]: https://github.com/mkdocs-material/create-social-cards + +## Previewing as you write + +MkDocs includes a live preview server, so you can preview your changes as you +write your documentation. The server will automatically rebuild the site upon +saving. Start it with: + +``` sh +mkdocs serve # (1)! +``` + +1. If you have a large documentation project, it might take minutes until + MkDocs has rebuilt all pages for you to preview. If you're only interested + in the current page, the [`--dirtyreload`][--dirtyreload] flag will make + rebuilds much faster: + + ``` + mkdocs serve --dirtyreload + ``` + +If you're running Material for MkDocs from within Docker, use: + +=== "Unix, Powershell" + + ``` + docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material + ``` + +=== "Windows" + + ``` + docker run --rm -it -p 8000:8000 -v "%cd%":/docs squidfunk/mkdocs-material + ``` + +Point your browser to [localhost:8000][live preview] and you should see: + +[![Creating your site]][Creating your site] + + [--dirtyreload]: https://www.mkdocs.org/about/release-notes/#support-for-dirty-builds-990 + [live preview]: http://localhost:8000 + [Creating your site]: assets/screenshots/creating-your-site.png + +## Building your site + +When you're finished editing, you can build a static site from your Markdown +files with: + +``` +mkdocs build +``` + +If you're running Material for MkDocs from within Docker, use: + +=== "Unix, Powershell" + + ``` + docker run --rm -it -v ${PWD}:/docs squidfunk/mkdocs-material build + ``` + +=== "Windows" + + ``` + docker run --rm -it -v "%cd%":/docs squidfunk/mkdocs-material build + ``` + +The contents of this directory make up your project documentation. There's no +need for operating a database or server, as it is completely self-contained. +The site can be hosted on [GitHub Pages], [GitLab Pages], a CDN of your choice +or your private web space. + + [GitHub Pages]: publishing-your-site.md#github-pages + [GitLab pages]: publishing-your-site.md#gitlab-pages + +If you intend to distribute your documentation as a set of files to be +read from a local filesystem rather than a web server (such as in a +`.zip` file), please read the notes about [building for offline +usage]. + + [building for offline usage]: setup/building-for-offline-usage.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/customization.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/customization.md new file mode 100644 index 0000000..8d5f8d7 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/customization.md @@ -0,0 +1,367 @@ +# Customization + +Project documentation is as diverse as the projects themselves and Material for +MkDocs is a great starting point for making it look beautiful. However, as you +write your documentation, you may reach a point where small adjustments are +necessary to preserve your brand's style. + +## Adding assets + +[MkDocs] provides several ways to customize a theme. In order to make a few +small tweaks to Material for MkDocs, you can just add CSS and JavaScript files to +the `docs` directory. + + [MkDocs]: https://www.mkdocs.org + +### Additional CSS + +If you want to tweak some colors or change the spacing of certain elements, +you can do this in a separate style sheet. The easiest way is by creating a +new style sheet file in the `docs` directory: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ stylesheets/ +│ └─ extra.css +└─ mkdocs.yml +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +extra_css: + - stylesheets/extra.css +``` + +### Additional JavaScript + +If you want to integrate another syntax highlighter or add some custom logic to +your theme, create a new JavaScript file in the `docs` directory: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ javascripts/ +│ └─ extra.js +└─ mkdocs.yml +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +extra_javascript: + - javascripts/extra.js +``` + +??? tip "How to integrate with third-party JavaScript libraries" + + It is likely that you will want to run your JavaScript code only + once the page has been fully loaded by the browser. This means + installing a callback function subscribing to events on the + `document$` observable exported by Material for MkDocs. + Using the `document$` observable is particularly important if you + are using [instant loading] since it will not result in a page + refresh in the browser - but subscribers on the observable will be + notified. + + ``` javascript + document$.subscribe(function() { + console.log("Initialize third-party libraries here") + }) + ``` + + `document$` is an [RxJS Observable] and you can call the `subscribe()` + method any number of times to attach different functionality. + + [instant loading]: setup/setting-up-navigation.md/#instant-loading + [RxJS Observable]: https://rxjs.dev/api/index/class/Observable + +## Extending the theme + +If you want to alter the HTML source (e.g. add or remove some parts), you can +extend the theme. MkDocs supports [theme extension], an easy way to override +parts of Material for MkDocs without forking from git. This ensures that you +can update to the latest version more easily. + + [theme extension]: https://www.mkdocs.org/user-guide/customizing-your-theme/#using-the-theme-custom_dir + +### Setup and theme structure + +Enable Material for MkDocs as usual in `mkdocs.yml`, and create a new folder +for `overrides` which you then reference using the [`custom_dir`][custom_dir] +setting: + +``` yaml +theme: + name: material + custom_dir: overrides +``` + +!!! warning "Theme extension prerequisites" + + As the [`custom_dir`][custom_dir] setting is used for the theme extension + process, Material for MkDocs needs to be installed via `pip` and referenced + with the [`name`][name] setting in `mkdocs.yml`. It will not work when + cloning from `git`. + +The structure in the `overrides` directory must mirror the directory structure +of the original theme, as any file in the `overrides` directory will replace the +file with the same name which is part of the original theme. Besides, further +assets may also be put in the `overrides` directory: + +``` { .sh .no-copy } +. +├─ .icons/ # Bundled icon sets +├─ assets/ +│ ├─ images/ # Images and icons +│ ├─ javascripts/ # JavaScript files +│ └─ stylesheets/ # Style sheets +├─ partials/ +│ ├─ integrations/ # Third-party integrations +│ │ ├─ analytics/ # Analytics integrations +│ │ └─ analytics.html # Analytics setup +│ ├─ languages/ # Translation languages +│ ├─ actions.html # Actions +│ ├─ alternate.html # Site language selector +│ ├─ comments.html # Comment system (empty by default) +│ ├─ consent.html # Consent +│ ├─ content.html # Page content +│ ├─ copyright.html # Copyright and theme information +│ ├─ feedback.html # Was this page helpful? +│ ├─ footer.html # Footer bar +│ ├─ header.html # Header bar +│ ├─ icons.html # Custom icons +│ ├─ language.html # Translation setup +│ ├─ logo.html # Logo in header and sidebar +│ ├─ nav.html # Main navigation +│ ├─ nav-item.html # Main navigation item +│ ├─ pagination.html # Pagination (used for blog) +│ ├─ palette.html # Color palette toggle +│ ├─ post.html # Blog post excerpt +│ ├─ progress.html # Progress indicator +│ ├─ search.html # Search interface +│ ├─ social.html # Social links +│ ├─ source.html # Repository information +│ ├─ source-file.html # Source file information +│ ├─ tabs.html # Tabs navigation +│ ├─ tabs-item.html # Tabs navigation item +│ ├─ tags.html # Tags +│ ├─ toc.html # Table of contents +│ ├─ toc-item.html # Table of contents item +│ └─ top.html # Back-to-top button +├─ 404.html # 404 error page +├─ base.html # Base template +├─ blog.html # Blog index page +├─ blog-archive.html # Blog archive index page +├─ blog-category.html # Blog category index page +├─ blog-post.html # Blog post page +└─ main.html # Default page +``` + + [custom_dir]: https://www.mkdocs.org/user-guide/configuration/#custom_dir + [name]: https://www.mkdocs.org/user-guide/configuration/#name + +### Overriding partials + +In order to override a partial, we can replace it with a file of the same name +and location in the `overrides` directory. For example, to replace the original +`footer.html` partial, create a new `footer.html` partial in the `overrides` +directory: + +``` { .sh .no-copy } +. +├─ overrides/ +│ └─ partials/ +│ └─ footer.html +└─ mkdocs.yml +``` + +MkDocs will now use the new partial when rendering the theme. This can be done +with any file. + +### Overriding blocks recommended { #overriding-blocks data-toc-label="Overriding blocks" } + +Besides overriding partials, it's also possible to override (and extend) +template blocks, which are defined inside the templates and wrap specific +features. In order to set up block overrides, create a `main.html` file inside +the `overrides` directory: + +``` { .sh .no-copy } +. +├─ overrides/ +│ └─ main.html +└─ mkdocs.yml +``` + +Then, e.g. to override the site title, add the following lines to `main.html`: + +``` html +{% extends "base.html" %} + +{% block htmltitle %} + Lorem ipsum dolor sit amet +{% endblock %} +``` + +If you intend to __add__ something to a block rather than to replace it +altogether with new content, use `{{ super() }}` inside the block to include the +original block content. This is particularly useful when adding third-party +scripts to your docs, e.g. + +``` html +{% extends "base.html" %} + +{% block scripts %} + + {{ super() }} + +{% endblock %} +``` + +The following template blocks are provided by the theme: + +| Block name | Purpose | +| :---------------- | :---------------------------------------------- | +| `analytics` | Wraps the Google Analytics integration | +| `announce` | Wraps the announcement bar | +| `config` | Wraps the JavaScript application config | +| `container` | Wraps the main content container | +| `content` | Wraps the main content | +| `extrahead` | Empty block to add custom meta tags | +| `fonts` | Wraps the font definitions | +| `footer` | Wraps the footer with navigation and copyright | +| `header` | Wraps the fixed header bar | +| `hero` | Wraps the hero teaser (if available) | +| `htmltitle` | Wraps the `` tag | +| `libs` | Wraps the JavaScript libraries (header) | +| `outdated` | Wraps the version warning | +| `scripts` | Wraps the JavaScript application (footer) | +| `site_meta` | Wraps the meta tags in the document head | +| `site_nav` | Wraps the site navigation and table of contents | +| `styles` | Wraps the style sheets (also extra sources) | +| `tabs` | Wraps the tabs navigation (if available) | + +## Theme development + +Material for MkDocs is built on top of [TypeScript], [RxJS] and [SASS], and +uses a lean, custom build process to put everything together.[^1] If you want +to make more fundamental changes, it may be necessary to make the adjustments +directly in the source of the theme and recompile it. + + [^1]: + Prior to <!-- md:version 7.0.0 --> the build was based on Webpack, resulting + in occasional broken builds due to incompatibilities with loaders and + plugins. Therefore, we decided to swap Webpack for a leaner solution which + is now based on [RxJS] as the application itself. This allowed for the + pruning of more than 500 dependencies (~30% less). + + [TypeScript]: https://www.typescriptlang.org/ + [RxJS]: https://github.com/ReactiveX/rxjs + [SASS]: https://sass-lang.com + +### Environment setup + +First, clone the repository: + +``` +git clone https://github.com/squidfunk/mkdocs-material +cd mkdocs-material +``` + +Next, create a new [Python virtual environment][venv] and +[activate][venv-activate] it: + +``` +python -m venv venv +source venv/bin/activate +``` + +!!! note "Ensure pip always runs in a virtual environment" + + If you set the environment variable `PIP_REQUIRE_VIRTUALENV` to + `true`, `pip` will refuse to install anything outside a virtual + environment. Forgetting to activate a `venv` can be very annoying + as it will install all sorts of things outside virtual + environments over time, possibly leading to further errors. So, + you may want to add this to your `.bashrc` or `.zshrc` and + re-start your shell: + + ``` + export PIP_REQUIRE_VIRTUALENV=true + ``` + + [venv]: https://docs.python.org/3/library/venv.html + [venv-activate]: https://docs.python.org/3/library/venv.html#how-venvs-work + +Then, install all Python dependencies: + +``` +pip install -e ".[git, recommended, imaging]" +pip install nodeenv +``` + +In addition, you will need to install the `cairo` and `pngquant` libraries in your +system, as described in the [image processing] requirements guide. + +[image processing]: plugins/requirements/image-processing.md + +Finally, install the [Node.js] LTS version into the Python virtual environment +and install all Node.js dependencies: + +``` +nodeenv -p -n lts +npm install +``` + + [Node.js]: https://nodejs.org + +### Development mode + +Start the watcher with: + +``` +npm start +``` + +Then, in a second terminal window, start the MkDocs live preview server with: + +``` +mkdocs serve --watch-theme +``` + +Point your browser to [localhost:8000][live preview] and you should see this +very documentation in front of you. + +!!! warning "Automatically generated files" + + Never make any changes in the `material` directory, as the contents of this + directory are automatically generated from the `src` directory and will be + overwritten when the theme is built. + + [live preview]: http://localhost:8000 + +### Building the theme + +When you're finished making your changes, you can build the theme by invoking: + +``` sh +npm run build # (1)! +``` + +1. While this command will build all theme files, it will skip the overrides + used in Material for MkDocs' own documentation which are not distributed + with the theme. If you forked the theme and want to build the overrides + as well, e.g. before submitting a PR with changes, use: + + ``` + npm run build:all + ``` + + This will take longer, as now the icon search index, schema files, as + well as additional style sheet and JavaScript files are built. + +This triggers the production-level compilation and minification of all style +sheets and JavaScript files. After the command exits, the compiled files are +located in the `material` directory. When running `mkdocs build`, you should +now see your changes to the original theme. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/getting-started.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/getting-started.md new file mode 100644 index 0000000..b58a757 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/getting-started.md @@ -0,0 +1,169 @@ +# Getting started + +Material for MkDocs is a powerful documentation framework on top of [MkDocs], +a static site generator for project documentation.[^1] If you're familiar with +Python, you can install Material for MkDocs with [`pip`][pip], the Python +package manager. If not, we recommend using [`docker`][docker]. + + [^1]: + In 2016, Material for MkDocs started out as a simple theme for MkDocs, but + over the course of several years, it's now much more than that – with the + many built-in plugins, settings, and countless customization abilities, + Material for MkDocs is now one of the simplest and most powerful frameworks + for creating documentation for your project. + + [MkDocs]: https://www.mkdocs.org + [pip]: #with-pip + [docker]: #with-docker + +## Installation + +### with pip <small>recommended</small> { #with-pip data-toc-label="with pip" } + +Material for MkDocs is published as a [Python package] and can be installed with +`pip`, ideally by using a [virtual environment]. Open up a terminal and install +Material for MkDocs with: + +=== "Latest" + + ``` sh + pip install mkdocs-material + ``` + +=== "9.x" + + ``` sh + pip install mkdocs-material=="9.*" # (1)! + ``` + + 1. Material for MkDocs uses [semantic versioning][^2], which is why it's a + good idea to limit upgrades to the current major version. + + This will make sure that you don't accidentally [upgrade to the next + major version], which may include breaking changes that silently corrupt + your site. Additionally, you can use `pip freeze` to create a lockfile, + so builds are reproducible at all times: + + ``` + pip freeze > requirements.txt + ``` + + Now, the lockfile can be used for installation: + + ``` + pip install -r requirements.txt + ``` + + [^2]: + Note that improvements of existing features are sometimes released as + patch releases, like for example improved rendering of content tabs, as + they're not considered to be new features. + +This will automatically install compatible versions of all dependencies: +[MkDocs], [Markdown], [Pygments] and [Python Markdown Extensions]. Material for +MkDocs always strives to support the latest versions, so there's no need to +install those packages separately. + +--- + +:fontawesome-brands-youtube:{ style="color: #EE0F0F" } +__[How to set up Material for MkDocs]__ by @james-willett – :octicons-clock-24: +27m – Learn how to create and host a documentation site using Material for +MkDocs on GitHub Pages in a step-by-step guide. + + [How to set up Material for MkDocs]: https://www.youtube.com/watch?v=xlABhbnNrfI + +--- + +!!! tip + + If you don't have prior experience with Python, we recommend reading + [Using Python's pip to Manage Your Projects' Dependencies], which is a + really good introduction on the mechanics of Python package management and + helps you troubleshoot if you run into errors. + + [Python package]: https://pypi.org/project/mkdocs-material/ + [virtual environment]: https://realpython.com/what-is-pip/#using-pip-in-a-python-virtual-environment + [semantic versioning]: https://semver.org/ + [upgrade to the next major version]: upgrade.md + [Markdown]: https://python-markdown.github.io/ + [Pygments]: https://pygments.org/ + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/ + [Using Python's pip to Manage Your Projects' Dependencies]: https://realpython.com/what-is-pip/ + +### with docker + +The official [Docker image] is a great way to get up and running in a few +minutes, as it comes with all dependencies pre-installed. Open up a terminal +and pull the image with: + +=== "Latest" + + ``` + docker pull squidfunk/mkdocs-material + ``` + +=== "9.x" + + ``` + docker pull squidfunk/mkdocs-material:9 + ``` + +The `mkdocs` executable is provided as an entry point and `serve` is the +default command. If you're not familiar with Docker don't worry, we have you +covered in the following sections. + +The following plugins are bundled with the Docker image: + +- [mkdocs-minify-plugin] +- [mkdocs-redirects] + + [Docker image]: https://hub.docker.com/r/squidfunk/mkdocs-material/ + [mkdocs-minify-plugin]: https://github.com/byrnereese/mkdocs-minify-plugin + [mkdocs-redirects]: https://github.com/datarobot/mkdocs-redirects + +???+ warning + + The Docker container is intended for local previewing purposes only and + is not suitable for deployment. This is because the web server used by + MkDocs for live previews is not designed for production use and may have + security vulnerabilities. + +??? question "How to add plugins to the Docker image?" + + Material for MkDocs only bundles selected plugins in order to keep the size + of the official image small. If the plugin you want to use is not included, + you can add them easily. Create a `Dockerfile` and extend the official image: + + ``` Dockerfile title="Dockerfile" + FROM squidfunk/mkdocs-material + RUN pip install mkdocs-macros-plugin + RUN pip install mkdocs-glightbox + ``` + + Next, build the image with the following command: + + ``` + docker build -t squidfunk/mkdocs-material . + ``` + + The new image will have additional packages installed and can be used + exactly like the official image. + +### with git + +Material for MkDocs can be directly used from [GitHub] by cloning the +repository into a subfolder of your project root which might be useful if you +want to use the very latest version: + +``` +git clone https://github.com/squidfunk/mkdocs-material.git +``` + +Next, install the theme and its dependencies with: + +``` +pip install -e mkdocs-material +``` + + [GitHub]: https://github.com/squidfunk/mkdocs-material diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/guides/creating-a-reproduction.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/guides/creating-a-reproduction.md new file mode 100644 index 0000000..d7a4faa --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/guides/creating-a-reproduction.md @@ -0,0 +1,124 @@ +# Creating a reproduction + +A reproduction is a simplified version of a bug that demonstrates the specific +scenario in which the bug occurred. It includes all necessary minimal settings +and instructions and should be as simple as possible while still demonstrating +the issue. + +## Guide + +### Environment <small>optional</small> { #environment } + +We recommend using a [virtual environment], which is an isolated Python runtime. +If you are in a virtual environment, any packages that you install or upgrade +will be local to the environment. If you run into problems, you can +just delete and recreate the environment. It's trivial to set up: + +- Create a new virtual environment with: + + ``` + python3 -m venv venv + ``` + +- Activate the environment with: + + === ":material-apple: macOS" + + ``` sh + . venv/bin/activate + ``` + + === ":fontawesome-brands-windows: Windows" + + ``` sh + . venv/Scripts/activate + ``` + + === ":material-linux: Linux" + + ``` sh + . venv/bin/activate + ``` + + + Your terminal should now print `(venv)` before the prompt, which is how you + know that you are inside the virtual environment that you just created. + +- Exit the environment with: + + ``` + deactivate + ``` + + [virtual environment]: https://realpython.com/what-is-pip/#using-pip-in-a-python-virtual-environment + +### Minimal reproduction + +Following the instructions below, you will set up a skeleton project to create +a reproduction. As mentioned above, we recommend using a [virtual environment], +so create a new folder in your working directory and a new virtual environment +inside it. Next: + +1. As mentioned in our [bug reporting guide], ensure that you're running the + latest version of Material for MkDocs, which might already include a fix for + the bug: + + ``` + pip install --upgrade --force-reinstall mkdocs-material + ``` + +2. Bootstrap a new documentation project using the `mkdocs` executable, + which you use as a basis for the reproduction. It's essential to create a + new, empty project for this: + + ``` + mkdocs new . + ``` + + Start by adding the [minimal configuration] in `mkdocs.yml`: + + ``` yaml + theme: + name: material + ``` + +3. Now, only add the necessary settings to `mkdocs.yml` to keep the + reproduction minimal. If you are creating a reproduction for a rendering + bug, create only the necessary amount of Markdown documents. __Repeat this + step until the bug you want to report can be observed.__ + +4. As a last step, before packing everything into a `.zip` file, double-check + all settings and documents if they are essential to the reproduction, which + means that the bug does not occur when they are omitted. Remove all + non-essential lines and files. + + [bug reporting guide]: ../contributing/reporting-a-bug.md#upgrade-to-latest-version + [minimal configuration]: ../creating-your-site.md#minimal-configuration + +### Creating a `.zip` file + +Material for MkDocs 9.0.0 includes a new plugin solely intended to create +reproductions for bug reports. When the built-in info plugin is enabled, MkDocs +will add all relevant files to a `.zip`, print a summary to the terminal and +exit. Add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - info +``` + +Now, when running `mkdocs build`, a file called `example.zip` is automatically +created, containing the minimal reproduction you can directly attach to your bug +report. + +``` +INFO - Started archive creation for bug report +INFO - Archive successfully created: + + example/.dependencies.json 859.0 B + example/.versions.log 83.0 B + example/docs/index.md 282.0 B + example/mkdocs.yml 56.0 B + + example.zip 1.8 kB +``` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/index.md new file mode 100644 index 0000000..3aea9df --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/index.md @@ -0,0 +1,9 @@ +--- +template: home.html +title: Material for MkDocs +social: + cards_layout_options: + title: Documentation that simply works +--- + +Welcome to Material for MkDocs. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/changelog/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/changelog/index.md new file mode 100644 index 0000000..4d7ba8b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/changelog/index.md @@ -0,0 +1,1127 @@ +# Changelog + +## Material for MkDocs Insiders + +### 4.53.17 <small>August 22, 2025</small> { id="4.53.17" } + +- Fixed #8408: Code annotations bug with custom selectors + +### 4.53.16 <small>March 13, 2025</small> { id="4.53.16" } + +- Fixed #8019: Tooltips have precedence over instant previews + +### 4.53.15 <small>January 15, 2025</small> { id="4.53.15" } + +- Fixed #7896: Scoped tags listings not rendering in subsections + +### 4.53.14 <small>September 29, 2024</small> { id="4.53.14" } + +- Fixed #7567: Empty headlines when using typeset plugin with anchorlinks + +### 4.53.13 <small>September 14, 2024</small> { id="4.53.13" } + +- Fixed #7520: Social plugin errors for generated files (MkDocs 1.6+) + +### 4.53.12 <small>August 2, 2024</small> { id="4.53.12" } + +- Fixed #7410: Instant previews jump on content tabs with anchor links +- Fixed #7408: Instant previews jump on content tabs + +### 4.53.11 <small>May 27, 2024</small> { id="4.53.11" } + +- Fixed projects plugin crashing when serving before building subprojects + +### 4.53.10 <small>May 20, 2024</small> { id="4.53.10" } + +- Fixed projects plugin crashing in serve mode when disabled +- Fixed projects plugin crashing when building nested projects + +### 4.53.9 <small>May 20, 2024</small> { id="4.53.9" } + +- Fixed #7191: Tags listings not rendering when `toc_depth` is changed + +### 4.53.8 <small>April 26, 2024</small> { id="4.53.8" } + +- Fixed #7052: Preview extension automatically including all pages +- Fixed #7051: Instant previews mounting on footnote references +- Fixed #5165: Improved tooltips not mounting in sidebar for typeset plugin + +### 4.53.7 <small>April 25, 2024</small> { id="4.53.7" } + +- Fixed #7060: Incorrect resolution of translation when using static-i18n + +### 4.53.6 <small>April 5, 2024</small> { id="4.53.6" } + +- Ensure working directory is set for projects when using projects plugin +- Fixed #6970: Incorrect relative paths in git submodules with projects plugin + +### 4.53.5 <small>April 2, 2024</small> { id="4.53.5" } + +- Fixed social plugin crashing when no colors are specified in palettes + +### 4.53.4 <small>March 31, 2024</small> { id="4.53.4" } + +- Fixed #6973: Escaping issue in tags extra files deprecation helper + +### 4.53.3 <small>March 23, 2024</small> { id="4.53.3" } + +- Added support for font variants in social plugin +- Improved resilience of font resolution in social plugin +- Fixed tag listing sometimes not being auto-populated +- Fixed tag listing scope not being correctly resolved +- Fixed #6941: Meta plugin adding duplicate entries +- Fixed #6928: Social plugin crashes for some fonts + +### 4.53.2 <small>March 18, 2024</small> { id="4.53.2" } + +- Fixed abort on first non-matching configuration in preview extension +- Fixed #6914: Meta files take precedence over front matter + +### 4.53.1 <small>March 6, 2024</small> { id="4.53.1" } + +- Fixed #6877: Projects plugin computes incorrect path to assets +- Fixed #6869: Blog plugin should emit warning on invalid related link + +### 4.53.0 <small>February 24, 2024</small> { id="4.53.0" } + +- Added support for automatic instant previews +- Added support for pinned blog posts + +### 4.52.3 <small>February 21, 2024</small> { id="4.52.3" } + +- Fixed resolution of URLs in instant previews +- Fixed instant previews not mounting for same-page links + +### 4.52.2 <small>February 7, 2024</small> { id="4.52.2" } + +- Fixed #6735: Instant previews misplaced when below tabs + +### 4.52.1 <small>January 30, 2024</small> { id="4.52.1" } + +- Fixed #6705: Navigation path not being hidden when specified +- Fixed #6703: New tags plugin crashes on Windows (2nd attempt) + +### 4.52.0 <small>January 28, 2024</small> { id="4.52.0" } + +- Added support for instant previews +- Fixed footnote tooltips positioning edge cases +- Fixed #6703: New tags plugin crashes on Windows + +### 4.51.0 <small>January 24, 2024</small> { id="4.51.0" } + +- Added support for footnote tooltips + +### 4.50.0 <small>January 19, 2024</small> { id="4.50.0" } + +- Added configurable logging capabilities to privacy plugin + +### 4.49.2 <small>January 9, 2024</small> { id="4.49.2" } + +- Fixed missing attribute lists extension for tags plugin +- Fixed #6627: New tags plugin crashes on Python 3.8 + +### 4.49.1 <small>January 7, 2024</small> { id="4.49.1" } + +- Improved interop of new tags plugin with other plugins +- Fixed #6594: Tags plugin doesn't work with mkdocs-macros plugin +- Fixed #6569: Social plugin crashes if in different file system location + +### 4.49.0 <small>December 29, 2023</small> { id="4.49.0" } + +- Added support for exporting tags and mappings +- Added support for disabling tags and/or listings or both +- Fixed tag links from pages to listings on homepage + +### 4.48.0 <small>December 23, 2023</small> { id="4.48.0" } + +- Rewrite of tags plugin, now much more powerful +- Added support for nested tags (tag hierarchies, e.g. foo/bar) +- Added support for shadow tags (by list, prefix or suffix) +- Added support for custom tag layouts and templates +- Added support for hiding tags in table of contents +- Added support for configurable inline tag listings +- Added support for automatically linking to closest tag listing +- Added support for scoped listings (limit to subsection of site) +- Added support for multiple instances of tags plugin +- Added support for changing front matter property and template variable +- Added support for tag slugification format strings +- Fixed #6510: Projects plugin out of memory on Linux (4.47.1 regression) +- Fixed projects plugin not notifying plugins about serve mode +- Fixed projects plugin skipping projects on prefix match +- Deprecated tags_file and tags_extra_files settings +- Modernized tags plugin code base + +### 4.47.1 <small>December 11, 2023</small> { id="4.47.1" } + +- Improved editing experience for projects plugin +- Improved resilience of optimize and social plugin +- Fixed race condition when writing manifest in optimize and social plugin +- Fixed #6475: Logo not taking precedence over icon in social card +- Fixed #6399: Projects plugin doesn't pick up added/removed projects +- Fixed #6306: Projects plugin cache not correctly updated + +### 4.47.0 <small>December 8, 2023</small> { id="4.47.0" } + +- Added support for staying on page when switching languages +- Added configurable logging capabilities to projects plugin +- Removed temporary warning on blog plugin authors file format change +- Fixed projects plugin logging messages twice on Linux systems +- Fixed projects plugin trying to hoist theme assets of divergent themes +- Fixed compatibility of optimize plugin and projects plugin +- Fixed compatibility of social plugin and projects plugin +- Fixed #6448: Code line selection broken for code blocks with custom ids +- Fixed #6437: Projects plugin crashing for certain site URL configurations +- Fixed #6414: Projects plugin doesn't prefix messages coming from projects + +### 4.46.0 <small>November 26, 2023</small> { id="4.46.0" } + +- Added support for author profiles in blog plugin +- Fixed custom index pages yielding two navigation items (4.45.0 regression) + +### 4.45.0 <small>November 24, 2023</small> { id="4.45.0" } + +- Added support for sorting blog categories by post count or custom function +- Improved tags plugin to generate Unicode-aware slugs by default +- Fixed non-deterministic order of multiple authors in blog plugin + +### 4.44.0 <small>November 23, 2023</small> { id="4.44.0" } + +- Added pagination settings for archive pages in blog plugin +- Added pagination settings for category pages in blog plugin + +### 4.43.1 <small>November 19, 2023</small> { id="4.43.1" } + +- Added third-party theme support in projects plugin, improving editing +- Fixed #6360: Projects plugin crashes when theme is not Material for MkDocs +- Fixed #6306: Projects plugin not reloading nested project configuration + +### 4.43.0 <small>November 5, 2023</small> { id="4.43.0" } + +- Added support for GitLab committers (document contributors) +- Fixed #6264: Fixed compatibility with Python < 3.10 +- Fixed #6254: Meta plugin not applying meta files to blog posts + +### 4.42.3 <small>October 27, 2023</small> { id="4.42.3" } + +- Fixed #6251: Cards in grids cut off on very small screens +- Fixed #6241: Using social plugin + static-i18n plugin errors + +### 4.42.2 <small>October 14, 2023</small> { id="4.42.2" } + +- Fixed #6186: Privacy plugin ignores hash fragments on images +- Fixed #6180: Projects plugin crashing when adding or removing files + +### 4.42.1 <small>October 5, 2023</small> { id="4.42.1" } + +- Fixed spacing of related links in blog posts on small screens + +### 4.42.0 <small>September 19, 2023</small> { id="4.42.0" } + +- Added support for using git submodules in projects plugin +- Added support for transforming project configurations +- Improved resilience of optimize and blog plugin +- Fixed optimize plugin crashing on `.jpeg` extension +- Fixed project URLs not using site URLs in projects plugin + +### 4.41.0 <small>September 11, 2023</small> { id="4.41.0" } + +- Improved multi-instance support for optimize plugin +- Added inclusion and exclusion patterns for optimize plugin +- Added transparent keyword for color handling in social plugin +- Changed default quality of PNGs to 3 in optimize plugin +- Fixed #5979: meta file not detected in root of docs directory + +### 4.40.4 <small>September 4, 2023</small> { id="4.40.4" } + +- Fixed privacy plugin choking on boolean HTML5 attributes +- Fixed wrapping of inline code blocks in typeset table of contents +- Fixed blog plugin error when running under dirty reload + +### 4.40.3 <small>September 2, 2023</small> { id="4.40.3" } + +- Fixed #5946: Docker image missing pngquant for optimize plugin + +### 4.40.2 <small>August 31, 2023</small> { id="4.40.2" } + +- Added configurable error handling capabilities for social plugin +- Fixed #5922: Blog plugin shows no posts when building a standalone blog +- Fixed #5914: Tags plugin tags_extra_files errors (4.39.3 regression) +- Fixed #5904: Blog plugin sometimes excludes files (4.40.1 regression) + +### 4.40.1 <small>August 27, 2023</small> { id="4.40.1" } + +- Fixed #5902: ResizeObserver polyfill not detected by privacy plugin +- Fixed empty category pages in blog plugin (4.40.0 regression) + +### 4.40.0 <small>August 26, 2023</small> { id="4.40.0" } + +- Added logo, title and description options to social plugin default layouts +- Fixed privacy plugin compatibility issue with Python < 3.10 +- Fixed #5896: Blog plugin errors when using custom index pages + +### 4.39.3 <small>August 24, 2023</small> { id="4.39.3" } + +- Fixed lxml dependency missing in Docker container (4.39.2 regression) + +### 4.39.2 <small>August 23, 2023</small> { id="4.39.2" } + +- Fixed color palette toggle being reversed (9.2.0 regression) + +### 4.39.1 <small>August 21, 2023</small> { id="4.39.1" } + +- Fixed git diff in tags plugin after merging back 9.2.0 changes + +### 4.39.0 <small>August 3, 2023</small> { id="4.39.0" } + +- Added support for hoisting theme media files when building projects +- Added support for sorting pages on tags index for tags plugin +- Added support for adding date of last update to blog posts +- Fixed #5797: Parse error in typeset plugin (4.38.1 regression) + +### 4.38.1 <small>August 1, 2023</small> { id="4.38.1" } + +- Improved nested serve mode for projects plugin +- Improved compat in privacy plugin with third-party plugins +- Fixed #5790: Typeset plugin ignores data-toc-label attribute +- Fixed #5778: Interplay of privacy plugin with git-revision-date-localized +- Fixed #5773: Info plugin erroring when community edition is in beta + +### 4.38.0 <small>July 29, 2023</small> { id="4.38.0" } + +- Added projects plugin for building nested projects +- Updated privacy plugin to new MkDocs API + +### 4.37.1 <small>July 28, 2023</small> { id="4.37.1" } + +- Updated MkDocs to 1.5.1 +- Fixed deprecation warning in social plugin due to MkDocs upgrade +- Fixed #5772: Privacy plugin fails due to API change in MkDocs + +### 4.37.0 <small>July 7, 2023</small> { id="4.37.0" } + +- Added support for overriding social cards settings per page +- Added new social card `default/only/image` layout +- Improved resilience of optimize and social plugin +- Fixed rendering bugs for pruned navigation items +- Fixed jumping of content tabs anchor links when instant loading is enabled +- Fixed #5676: Optimize plugin doesn't check for `pngquant` + +### 4.36.1 <small>June 23, 2023</small> { id="4.36.1" } + +- Fixed #5618: Date comparison breaking for drafts in blog plugin + +### 4.36.0 <small>June 15, 2023</small> { id="4.36.0" } + +- Added support for instant prefetching to speed up slow connections +- Improved stability of anchor link removal in built-in typeset plugin +- Improved performance of regular expressions in typeset plugin +- Removed unnecessary import test for `cairosvg` in optimize plugin +- Fixed #5590: Regular expression for anchor link removal too greedy + +### 4.35.3 <small>June 1, 2023</small> { id="4.35.3" } + +- Fixed #5579: Abbreviations in headlines filtered by typeset plugin + +### 4.35.2 <small>May 29, 2023</small> { id="4.35.2" } + +- Fixed #5555: Blog plugin crashes when computing readtime for emojis + +### 4.35.1 <small>May 20, 2023</small> { id="4.35.1" } + +- Fixed internal handling of errors in social plugin + +### 4.35.0 <small>May 20, 2023</small> { id="4.35.0" } + +- Improve editing experience and stability of social plugin +- Added support for custom layout syntax validation in social plugin +- Added support for layer origin for easier placement in social plugin +- Added support for in- and exclusion patterns in social plugin +- Catch and print syntax errors in custom layouts + +### 4.34.1 <small>May 16, 2023</small> { id="4.34.1" } + +- Disable social plugin debug mode by default on mkdocs build +- Added warning in social plugin debug mode when font style couldn't be found +- Set default concurrency of built-in multi-threaded plugins to CPUs - 1 +- Fixed #5521: Social plugin triggers race condition when downloading fonts +- Fixed #5515: Social plugin crashes when concurrency is set to 1 + +### 4.34.0 <small>May 14, 2023</small> { id="4.34.0" } + +- Added support for new overflow mode to auto-fit text in social plugin +- Reduced subtle rendering bugs in (code) annotations due to subpixel rounding +- Improved print styles for (code) annotation lists +- Improved performance of social plugin, now 3x as fast +- Improved interop of typeset plugin with MkDocstrings +- Fixed logo location for variants of default template in social plugin +- Fixed #5446: Built-in typeset plugin picks up headings in code blocks + +### 4.33.2 <small>May 12, 2023</small> { id="4.33.2" } + +- Fixed #5508: Social plugin crashes trying to copy cards on Docker/Windows +- Fixed #5507: Social plugin crashes on serve when layouts folder doesn't exist +- Fixed #5505: Social plugin trying to resolve logo in wrong location +- Fixed #5496: Annotations with nested lists incorrectly mounted +- Fixed #5493: Social plugin crashes on Python 3.8 + +### 4.33.1 <small>May 9, 2023</small> { id="4.33.1" } + +- Added support for SVG background images in social plugin + +### 4.33.0 <small>May 8, 2023</small> { id="4.33.0" } + +- Added support for custom layouts for social plugin +- Added support for background images for social cards + +### 4.32.6 <small>April 22, 2023</small> { id="4.32.6" } + +- Fixed #5336: Interplay of blog plugin with git-revision-date-localized + +### 4.32.5 <small>April 7, 2023</small> { id="4.32.5" } + +- Fixed #5322: Navigation tabs hoist nested page icons + +### 4.32.4 <small>March 24, 2023</small> { id="4.32.4" } + +- Fixed #5241: Built-in typeset plugin jams navigation for anchors in headings + +### 4.32.3 <small>March 9, 2023</small> { id="4.32.3" } + +- Fixed Docker image release workflow (9.1.0 regression) +- Fixed #5159: Missing underline for abbreviations (9.1.0 regression) + +### 4.32.2 <small>February 23, 2023</small> { id="4.32.2" } + +- Fixed #5127: Privacy plugin not handling large number of occurrences +- Fixed #5126: Privacy plugin breaks when replacing specific emojis + +### 4.32.1 <small>February 23, 2023</small> { id="4.32.1" } + +- Fixed code block spans interfering with copying +- Fixed #5077: Privacy plugin breaks image `alt` text encoding +- Fixed #5079: Privacy plugin removing `rel=me` on external links + +### 4.32.0 <small>February 19, 2023</small> { id="4.32.0" } + +- Added support for custom selectors for code annotations +- Added support for code line range selection for better sharing + +### 4.31.0 <small>February 18, 2023</small> { id="4.31.0" } + +- Added support for table of contents on blog index and archive pages +- Fixed #4512: Allow custom search field boosts (experimental) + +### 4.30.2 <small>February 13, 2023</small> { id="4.30.2" } + +- Fixed privacy plugin excludes not working (4.30.0 regression) + +### 4.30.1 <small>February 12, 2023</small> { id="4.30.1" } + +- Fixed privacy plugin not handling static templates (e.g. `404.html`) + +### 4.30.0 <small>February 6, 2023</small> { id="4.30.0" } + +- Rewrite of privacy plugin for concurrency, now twice as fast +- Added support for explicit inclusion for privacy plugin +- Added optimization support for privacy plugin (+ optimize plugin) + +### 4.29.0 <small>January 21, 2023</small> { id="4.29.0" } + +- Added built-in optimize plugin for automatically compressing images +- Switched reporting in built-in privacy plugin to `info` level + +### 4.28.1 <small>January 17, 2023</small> { id="4.28.1" } + +- Fixed built-in info plugin erroring for Insiders on version check +- Fixed #4865: Navigation paths render bug when there's no top-level section +- Fixed #4875: Added support for hiding navigation paths +- Improved navigation path to not render for a single item + +### 4.28.0 <small>January 14, 2023</small> { id="4.28.0" } + +- Added support for navigation path (breadcrumbs) + +### 4.27.1 <small>December 20, 2022</small> { id="4.27.1" } + +- Fixed rendering of succeeding navigation items in typeset plugin +- Fixed #4795: Built-in typeset plugin changes MkDocs' title precedence +- Fixed #4724: Blog plugin not rendering integrate table of contents + +### 4.27.0 <small>December 20, 2022</small> { id="4.27.0" } + +- Added built-in typeset plugin to preserve formatting in sidebars +- Added URL and table of contents support for blog categories + +### 4.26.6 <small>November 28, 2022</small> { id="4.26.6" } + +- Fixed #4683: Tags plugin crashes when a tag is empty + +### 4.26.5 <small>November 27, 2022</small> { id="4.26.5" } + +- Fixed #4632: Post excerpt title link doesn't point to top of the page + +### 4.26.4 <small>November 27, 2022</small> { id="4.26.4" } + +- Fixed redundant file extension when using privacy plugin + +### 4.26.3 <small>November 15, 2022</small> { id="4.26.3" } + +- Fixed #4637: Attachments w/o titles in related links error in blog plugin +- Fixed #4631: Remote favicons not downloaded and inlined by privacy plugin + +### 4.26.2 <small>November 3, 2022</small> { id="4.26.2" } + +- Updated MkDocs to 1.4.2 +- Added support for tag compare functions when sorting on index pages +- Fixed footnotes being rendered in post excerpts without separators +- Fixed error in blog plugin when `toc` extension is not enabled +- Fixed issues with invalid asset paths and linked post titles +- Fixed #4572: Privacy plugin fails when symlinks cannot be created +- Fixed #4545: Blog plugin doesn't automatically link headline to post +- Fixed #4542: Blog plugin doesn't allow for multiple instances +- Fixed #4532: Blog plugin doesn't allow for mixed use of date and datetime + +### 4.26.1 <small>October 22, 2022</small> { id="4.26.1" } + +- Improved reporting of configuration errors in tags plugin +- Fixed #4515: Privacy plugin fails when site URL is not defined +- Fixed #4514: Privacy plugin doesn't fetch Google fonts (4.26.0 regression) + +### 4.26.0 <small>October 18, 2022</small> { id="4.26.0" } + +- Refactored privacy plugin to prepare for new features +- Added support for `rel=noopener` links in privacy plugin +- Resolve encoding issues with blog and privacy plugin + +### 4.25.5 <small>October 16, 2022</small> { id="4.25.5" } + +- Updated MkDocs to 1.4.1 +- Added namespace prefix to built-in plugins +- Updated `content` and `header` partial + +### 4.25.4 <small>October 9, 2022</small> { id="4.25.4" } + +- Fixed other path issues for standalone blogs (4.24.2 regression) + +### 4.25.3 <small>October 9, 2022</small> { id="4.25.3" } + +- Fixed #4457: Posts not collected for standalone blog (4.24.2 regression) + +### 4.25.2 <small>October 4, 2022</small> { id="4.25.2" } + +- Fixed #4452: Blog and tags plugin crash when specifying slugify function + +### 4.25.1 <small>October 3, 2022</small> { id="4.25.1" } + +- Updated `mkdocs-rss-plugin` in `Dockerfile` to fix MkDocs compat errors + +### 4.25.0 <small>October 2, 2022</small> { id="4.25.0" } + +- Added support for navigation subtitles +- Added support for defining an allow list for built-in tags plugin +- Added support for custom slugify functions for built-in tags plugin +- Improved stability of search plugin when using `--dirtyreload` + +### 4.24.2 <small>October 1, 2022</small> { id="4.24.2" } + +- Updated MkDocs to 1.4 +- Fixed compatibility issues with MkDocs 1.4 +- Fixed incorrectly generated paths in privacy plugin +- Fixed blog index page not showing navigation when using meta plugin + +### 4.24.1 <small>September 30, 2022</small> { id="4.24.1" } + +- Fixed #4430: build error when enabling consent without repository URL + +### 4.24.0 <small>September 27, 2022</small> { id="4.24.0" } + +- Added support for custom content on index pages (blog) +- Added support for keeping content on paginated index pages (blog) +- Added support for limiting categories in post excerpts (blog) +- Added support for simple override of templates via front matter (blog) +- Added icon in navigation for pages with encrypted content +- Fixed #4396: Front matter of index pages not inherited by pagination (blog) +- Improved performance by building post excerpts once (blog) + +### 4.23.6 <small>September 22, 2022</small> { id="4.23.6" } + +- Fixed #4389: Blog posts in first week of year in wrong archive +- Fixed (= switched) footer previous and next links for blog posts + +### 4.23.5 <small>September 18, 2022</small> { id="4.23.5" } + +- Fixed #4367: Improved blog plugin date handling for MultiMarkdown syntax +- Fixed #4374: Fixed invalid URLs of related links to other blog posts + +### 4.23.4 <small>September 14, 2022</small> { id="4.23.4" } + +- Fixed #4365: Recursion error in blog plugin due to `deepcopy` +- Fixed path errors for blog plugin on Windows +- Fixed publishing workflow in forked repositories + +### 4.23.3 <small>September 13, 2022</small> { id="4.23.3" } + +- Fixed previous and next page links for drafts of blog posts + +### 4.23.2 <small>September 13, 2022</small> { id="4.23.2" } + +- Fixed #4348: Blog plugin crashes on custom `nav` title +- Fixed blog plugin crashing when category contained only drafts +- Fixed rendering of content from blog index file + +### 4.23.1 <small>September 12, 2022</small> { id="4.23.1" } + +- Fixed #4345: Blog plugin errors with default settings + +### 4.23.0 <small>September 12, 2022</small> { id="4.23.0" } + +- Added blogging support via built-in blog plugin + +### 4.22.1 <small>September 7, 2022</small> { id="4.22.1" } + +- Fixed #4217: Tooltips in data tables render in wrong position + +### 4.22.0 <small>August 21, 2022</small> { id="4.22.0" } + +- Added support for navigation status + +### 4.21.1 <small>August 13, 2022</small> { id="4.21.1" } + +- Fixed #4176: Broken image when avatar is served by Gravatar +- Fixed #4212: Deferred search initialization for file:// locations + +### 4.21.0 <small>July 17, 2022</small> { id="4.21.0" } + +- Added meta plugin: set front matter for all pages in a folder +- Fixed #4114: Tags plugin fails if only `tags_extra_files` is set + +### 4.20.1 <small>July 11, 2022</small> { id="4.20.1" } + +- Fixed #4105: Tags plugin fails if `tags_file` is not set (4.20.0 regression) + +### 4.20.0 <small>July 7, 2022</small> { id="4.20.0" } + +- Added support for additional tags indexes +- Fixed #4100: Tag icons not shown in tags index + +### 4.19.2 <small>July 4, 2022</small> { id="4.19.2" } + +- Fixed #4051: Privacy plugin fails if symlinking isn't allowed on Windows + +### 4.19.1 <small>June 25, 2022</small> { id="4.19.1" } + +- Added `mkdocs-git-committers-plugin` to Dockerfile +- Added `mkdocs-git-revision-date-localized-plugin` to Dockerfile + +### 4.19.0 <small>June 24, 2022</small> { id="4.19.0" } + +- Added support for document contributors +- Updated French translations for cookie consent + +### 4.18.2 <small>June 16, 2022</small> { id="4.18.2" } + +- Fixed #4026: Fixed tooltips not mounted for nested navigation links + +### 4.18.1 <small>June 14, 2022</small> { id="4.18.1" } + +- Fixed #3990: Chinese search highlighting not working on non-boundaries + +### 4.18.0 <small>June 11, 2022</small> { id="4.18.0" } + +- Added support for automatic dark/light mode +- Fixed #4009: Privacy plugin uses invalid paths for file cache on Windows + +### 4.17.2 <small>June 5, 2022</small> { id="4.17.2" } + +- Added support for custom jieba dictionaries (Chinese search) + +### 4.17.1 <small>June 5, 2022</small> { id="4.17.1" } + +- Added support for cookie consent reject button +- Added support for cookie consent custom button ordering +- Fixed #3988: Content tab not focused after alternating anchor links + +### 4.17.0 <small>June 4, 2022</small> { id="4.17.0" } + +- Added support for content tabs anchor links (deep linking) +- Fixed #3975: Detect composition events in search interface (Chinese) +- Fixed #3980: Search plugin doesn't use title set via front matter + +### 4.16.2 <small>May 29, 2022</small> { id="4.16.2" } + +- Fixed #3961: Nested sections triggered build error for navigation tabs + +### 4.16.1 <small>May 28, 2022</small> { id="4.16.1" } + +- Switched feedback widget rating titles to tooltips +- Improved contrast of link colors for light/dark color schemes +- Fixed #3950: Sticky navigation tabs rendering broken (4.15.2 regression) +- Fixed #3958: Links invisible when using `white` primary color + +### 4.16.0 <small>May 25, 2022</small> { id="4.16.0" } + +- Added support for navigation pruning +- Fixed search results for non-segmented characters (4.15.2 regression) + +### 4.15.2 <small>May 22, 2022</small> { id="4.15.2" } + +- Removed workaround for `abbr` on touch devices (superseded by tooltips) +- Fixed #3915: Improved Chinese search query segmentation +- Fixed #3938: Fixed tooltips position for navigation titles with ellipsis + +### 4.15.1 <small>May 14, 2022</small> { id="4.15.1" } + +- Improved performance of element focus observables +- Fixed #3531: Added prev/next buttons to content tabs +- Fixed tooltip positioning when host element is hidden + +### 4.15.0 <small>May 8, 2022</small> { id="4.15.0" } + +- Added support for improved tooltips +- Fixed #3785: Show tooltip on hover for overflowing navigation link + +### 4.14.0 <small>May 5, 2022</small> { id="4.14.0" } + +- Added Chinese language support to built-in search plugin +- Fixed all-numeric page titles raising error in social plugin + +### 4.13.2 <small>April 30, 2022</small> { id="4.13.2" } + +- Improved caching of downloaded resources in privacy plugin +- Fixed #3851: External images not downloaded by privacy plugin + +### 4.13.1 <small>April 25, 2022</small> { id="4.13.1" } + +- Fixed #3839: Tags plugin breaks without icons (4.13.0 regression) + +### 4.13.0 <small>April 24, 2022</small> { id="4.13.0" } + +- Added support for tag icons + +### 4.12.0 <small>March 27, 2022</small> { id="4.12.0" } + +- Added support for card grids and grid layouts +- Fixed #3685: Annotations sometimes broken when using instant loading +- Fixed #3742: Automatically add Mermaid.js when building for offline usage + +### 4.11.0 <small>March 6, 2022</small> { id="4.11.0" } + +- Added support for excluding external assets from privacy plugin + +### 4.10.1 <small>March 2, 2022</small> { id="4.10.1" } + +- Added missing build dependencies to Dockerfile +- Fixed encoding issues in privacy plugin, now forcing UTF-8 encoding +- Fixed #3624: Scroll to active navigation item unreliable in Firefox +- Fixed #3642: Privacy plugin errors when font setting was omitted + +### 4.10.0 <small>February 27, 2022</small> { id="4.10.0" } + +- Added support for offline plugin (supersedes offline search support) +- Improved built-in privacy plugin to download nested JavaScript assets +- Refactored configuration of built-in privacy plugin + +### 4.9.1 <small>February 21, 2022</small> { id="4.9.1" } + +- Fixed #3610: missing `lxml` dependency for privacy plugin +- Fixed error when charset is missing in `content-type` header + +### 4.9.0 <small>February 20, 2022</small> { id="4.9.0" } + +- Added privacy plugin: automatic downloading of external assets + +### 4.8.3 <small>February 13, 2022</small> { id="4.8.3" } + +- Fixed #3560: Mermaid diagrams don't render for `file://` locations + +### 4.8.2 <small>February 10, 2022</small> { id="4.8.2" } + +- Fixed #3559: Mermaid diagrams don't render inside closed `details` + +### 4.8.1 <small>February 6, 2022</small> { id="4.8.1" } + +- Fixed jump back to top on mobile when using anchor following + +### 4.8.0 <small>February 6, 2022</small> { id="4.8.0" } + +- Added support for anchor following table of contents (= auto scroll) + +### 4.7.2 <small>February 2, 2022</small> { id="4.7.2" } + +- Fixed #3526: Transparent sidebar title due to Safari bug +- Fixed #3528: Firefox sometimes clips text in flow chart diagrams + +### 4.7.1 <small>January 30, 2022</small> { id="4.7.1" } + +- Fixed #3506: Tags index not respecting title set via front matter + +### 4.7.0 <small>January 25, 2022</small> { id="4.7.0" } + +- Added native support for offline search + +### 4.6.1 <small>January 16, 2022</small> { id="4.6.1" } + +- Fixed #3459: Section index pages picking up wrong title + +### 4.6.0 <small>January 11, 2022</small> { id="4.6.0" } + +- Added support for annotations (outside of code blocks) + +### 4.5.2 <small>January 8, 2022</small> { id="4.5.2" } + +- Fixed #3440: Content tab indicator not moving when using linking +- Fixed #3445: Content tab switch flickers/jitters when using linking + +### 4.5.1 <small>January 2, 2022</small> { id="4.5.1" } + +- Added support for setting initial state of cookie consent +- Fixed #3396: Disappearing link in navigation due to Safari bug + +### 4.5.0 <small>December 16, 2021</small> { id="4.5.0" } + +- Added support for navigation icons + +### 4.4.0 <small>December 10, 2021</small> { id="4.4.0" } + +- Added support for code annotation anchor links (deep linking) +- Added new code annotation syntax modifier to strip comment +- Updated German translations for cookie consent + +### 4.3.0 <small>December 5, 2021</small> { id="4.3.0" } + +- Added support for custom fonts in social cards +- Fixed #3300: Announcement bar reappearing when using instant loading + +### 4.2.0 <small>December 2, 2021</small> { id="4.2.0" } + +- Added support for dismissible announcement bar +- Added support for named placeholders in feedback widget + +### 4.1.0 <small>November 30, 2021</small> { id="4.1.0" } + +- Added support for passing page title to feedback forms + +### 4.0.0 <small>November 28, 2021</small> { id="4.0.0" } + +- Removed deprecated content tabs legacy implementation +- Removed deprecated `seealso` admonition type +- Removed deprecated `site_keywords` setting (unsupported by MkDocs) +- Removed deprecated prebuilt search index support +- Removed deprecated web app manifest – use customization +- Removed `extracopyright` variable – use new `copyright` partial +- Removed Disqus integration – use customization +- Switched to `:is()` selectors for simple selector lists +- Switched autoprefixer from `last 4 years` to `last 2 years` +- Improved CSS overall to match modern standards +- Improved CSS variable semantics for fonts +- Improved extensibility by restructuring partials +- Improved handling of `details` when printing +- Improved keyboard navigation for footnotes +- Fixed #3214: Search highlighting breaks site when empty + +### 3.2.3 <small>November 20, 2021</small> { id="3.2.3" } + +- Updated Swedish and French translations +- Removed support for `.mermaid-experimental` class (now `.mermaid`) +- Fixed #3202: Cookie consent not dismissable on `file://` locations +- Fixed #3216: Cookie consent not dismissed when invoked via anchor +- Fixed #3232: Mermaid.js sometimes runs twice (race condition) + +### 3.2.2 <small>November 6, 2021</small> { id="3.2.2" } + +- Fixed always last feedback rating being sent +- Fixed #3145: Code annotations eat whole comment lines +- Fixed #3170: Feedback widget doesn't send data to GA4 + +### 3.2.1 <small>November 4, 2021</small> { id="3.2.1" } + +- Added support for custom Mermaid.js version via additional JavaScript +- Fixed some configuration edge cases for tags plugin (3.1.5 regression) +- Fixed feedback widget title not being centered in Firefox +- Fixed #3179: Safari doesn't send request for feedback widget + +### 3.2.0 <small>October 31, 2021</small> { id="3.2.0" } + +- Added support for feedback widget (Was this page helpful?) + +### 3.1.5 <small>October 28, 2021</small> { id="3.1.5" } + +- Fixed #3144: Rogue link when using tags with auto-populated navigation +- Fixed #3147: Code block line numbers appear in search results +- Fixed #3158: Social cards do not strip HTML tags from title + +### 3.1.4 <small>October 17, 2021</small> { id="3.1.4" } + +- Fixed #2974: Text cropped with other fonts than `Roboto` in social plugin +- Fixed #3099: Encoding problems with non-latin character in social plugin +- Fixed #3112: Japanese segmenter not executed as part of new tokenizer +- Fixed tags (front matter) appearing in search with disabled tags plugin + +### 3.1.3 <small>October 12, 2021</small> { id="3.1.3" } + +- Added warnings to search plugin for unsupported options and syntax +- Fixed #3503: Search sometimes returns entire page +- Fixed #3089: Single-line code annotations disappear when printing + +### 3.1.2 <small>October 6, 2021</small> { id="3.1.2" } + +- Fixed incorrect path separators for social cards on Windows + +### 3.1.1 <small>September 26, 2021</small> { id="3.1.1" } + +- Fixed ordering bug in search exclusion logic + +### 3.1.0 <small>September 26, 2021</small> { id="3.1.0" } + +- Added support for excluding pages, sections, and elements from search +- Fixed #2803: Code block annotations not visible when printing + +### 3.0.1 <small>September 19, 2021</small> { id="3.0.1" } + +- Added support for using literal `h1-6` tags for search plugin +- Fixed search plugin breaking on void elements without slashes +- Fixed search plugin filtering link contents from headlines +- Fixed search plugin handling of multiple `h1` headlines +- Fixed search plugin handling of missing `h1` headlines + +### 3.0.0 <small>September 13, 2021</small> { id="3.0.0" } + +- Rewrite of MkDocs' search plugin +- Added support for rich search previews +- Added support for tokenizer with lookahead +- Improved search indexing performance (twice as fast) +- Improved search highlighting + +### 2.13.3 <small>September 1, 2021</small> { id="2.13.3" } + +- Added support for disabling social card generation + +### 2.13.2 <small>August 25, 2021</small> { id="2.13.2" } + +- Fixed #2965: Social plugin error when primary color is not defined + +### 2.13.1 <small>August 21, 2021</small> { id="2.13.1" } + +- Fixed #2948: Social cards are not cached +- Fixed #2953: Mermaid.js diagrams can't be centered anymore + +### 2.13.0 <small>August 7, 2021</small> { id="2.13.0" } + +- Added support for custom colors in social cards + +### 2.12.2 <small>August 4, 2021</small> { id="2.12.2" } + +- Fixed #2891: Division by zero error in social plugin + +### 2.12.1 <small>July 26, 2021</small> { id="2.12.1" } + +- Fixed error in social plugin when `site_description` was not set +- Fixed error in social plugin for non-ASCII characters + +### 2.12.0 <small>July 25, 2021</small> { id="2.12.0" } + +- Added support for social cards + +### 2.11.1 <small>July 20, 2021</small> { id="2.11.1" } + +- Fixed order of tags index, now sorted alphabetically + +### 2.11.0 <small>July 18, 2021</small> { id="2.11.0" } + +- Improved Mermaid.js integration, now stable +- Added support for sequence diagrams +- Added support for entity relationship diagrams +- Added support for cookie consent configuration +- Added feature flag to always enable annotations + +### 2.10.0 <small>July 10, 2021</small> { id="2.10.0" } + +- Added support for cookie consent +- Fixed #2807: Back-to-top button not hidden when using sticky tabs + +### 2.9.2 <small>May 30, 2021</small> { id="2.9.2" } + +- Moved tags to partial for easier customization +- Added support for hiding tags on any page + +### 2.9.1 <small>May 24, 2021</small> { id="2.9.1" } + +- Added missing guard for linking of content tabs + +### 2.9.0 <small>May 23, 2021</small> { id="2.9.0" } + +- Added support for linking of content tabs + +### 2.8.0 <small>May 12, 2021</small> { id="2.8.0" } + +- Added support for boosting pages in search + +### 2.7.2 <small>May 8, 2021</small> { id="2.7.2" } + +- Fixed #2638: Warnings shown when using `tags` plugin without directory URLs + +### 2.7.1 <small>May 3, 2021</small> { id="2.7.1" } + +- Fixed `git-revision-date-localized` plugin integration (2.7.0 regression) + +### 2.7.0 <small>May 1, 2021</small> { id="2.7.0" } + +- Added support for tags (with search integration) + +### 2.6.0 <small>April 11, 2021</small> { id="2.6.0" } + +- Stay on page when switching versions + +### 2.5.0 <small>March 28, 2021</small> { id="2.5.0" } + +- Added support for version warning + +### 2.4.0 <small>March 20, 2021</small> { id="2.4.0" } + +- Added support for custom admonition icons +- Fixed #2444: Code block annotations with extra comments have wrong index + +### 2.3.1 <small>March 14, 2021</small> { id="2.3.1" } + +- Fixed anchor offset for permalinks when using sticky navigation tabs + +### 2.3.0 <small>March 13, 2021</small> { id="2.3.0" } + +- Added support for back-to-top button + +### 2.2.1 <small>March 4, 2021</small> { id="2.2.1" } + +- Fixed #2382: Repository stats failing when no release tag is present + +### 2.2.0 <small>February 28, 2021</small> { id="2.2.0" } + +- Added support for code block annotations + +### 2.1.0 <small>February 26, 2021</small> { id="2.1.0" } + +- Added support for anchor tracking + +### 2.0.0 <small>February 24, 2021</small> { id="2.0.0" } + +- Migrated Insiders to the new architecture +- Swapped color palette toggle configuration + +### 1.17.0 <small>January 31, 2021</small> { id="1.17.0" } + +- Added support for section index pages + +### 1.16.1 <small>January 26, 2021</small> { id="1.16.1" } + +- Fixed #2249: Instant loading + sticky tabs result in invalid links +- Fixed #2248: Search highlighting URL parameter always added +- Fixed #2235: Version selector doesn't select current version for aliases + +### 1.16.0 <small>January 7, 2021</small> { id="1.16.0" } + +- Added latest release to repository info (GitHub) +- Slight facelift of repository info (lighter fonts, spacing and icons) + +### 1.15.0 <small>January 2, 2021</small> { id="1.15.0" } + +- Added support for native Mermaid.js integration + +### 1.14.0 <small>December 30, 2020</small> { id="1.14.0" } + +- Added support for sharing searches + +### 1.13.2 <small>December 22, 2020</small> { id="1.13.2" } + +- Fixed version selector + sticky tabs navigation rendering issues +- Fixed version selector wrapping + +### 1.13.1 <small>December 20, 2020</small> { id="1.13.1" } + +- Removed horizontal scrollbars on language and version selector +- Fixed type conversion in JavaScript config + +### 1.13.0 <small>December 13, 2020</small> { id="1.13.0" } + +- Refactored navigation tabs to simplify grouping behavior +- Added support for sticky navigation tabs +- Added support for arbitrary links in navigation tabs +- Fixed #2098: Subsequent active subsection not highlighted correctly + +### 1.12.1 <small>December 8, 2020</small> { id="1.12.1" } + +- Fixed empty language selector being shown + +### 1.12.0 <small>December 6, 2020</small> { id="1.12.0" } + +- Added support for adding a language selector + +### 1.11.2 <small>November 29, 2020</small> { id="1.11.2" } + +- Fixed #2068: Search highlight interprets code blocks as JavaScript + +### 1.11.1 <small>November 29, 2020</small> { id="1.11.1" } + +- Refactored styling to be more stable and easier to adjust +- Fixed some styling regressions from latest features + +### 1.11.0 <small>November 22, 2020</small> { id="1.11.0" } + +- Added support for rendering admonitions as inline blocks + +### 1.10.0 <small>November 15, 2020</small> { id="1.10.0" } + +- Added support for integrating table of contents into navigation + +### 1.9.0 <small>November 7, 2020</small> { id="1.9.0" } + +- Added support for hiding navigation and table of contents on any page +- Removed autohiding table of contents when empty + +### 1.8.0 <small>November 1, 2020</small> { id="1.8.0" } + +- Added support for navigation sections +- Fixed appearance of inactive search suggestions + +### 1.7.0 <small>October 25, 2020</small> { id="1.7.0" } + +- Added support for deploying multiple versions +- Fixed alignment of sidebar when content area is too small + +### 1.6.0 <small>October 11, 2020</small> { id="1.6.0" } + +- Added support for search suggestions to save keystrokes +- Added support for removing __Made with Material for MkDocs__ from footer +- Fixed #1915: search should go to first result by pressing ++enter++ + +### 1.5.1 <small>September 21, 2020</small> { id="1.5.1" } + +- Fixed content area stretching to whole width for long code blocks + +### 1.5.0 <small>September 19, 2020</small> { id="1.5.0" } + +- Added support for autohiding table of contents when empty + +### 1.4.1 <small>September 6, 2020</small> { id="1.4.1" } + +- Improved typeahead and search result relevance and scoring + +### 1.4.0 <small>August 30, 2020</small> { id="1.4.0" } + +- Added support for autohiding header on scroll + +### 1.3.0 <small>August 26, 2020</small> { id="1.3.0" } + +- Added support for user-selectable color palettes + +### 1.2.0 <small>August 11, 2020</small> { id="1.2.0" } + +- Added feature to expand navigation by default + +### 1.1.0 <small>August 3, 2020</small> { id="1.1.0" } + +- Added highlighting of search results + +### 1.0.0 <small>July 14, 2020</small> { id="1.0.0" } + +- Added grouping of search results +- Added missing query terms to search result +- Improved search result relevance and scoring diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/getting-started.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/getting-started.md new file mode 100644 index 0000000..97dfaa2 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/getting-started.md @@ -0,0 +1,176 @@ +--- +title: Getting started with Insiders +--- + +# Getting started with Insiders + +Material for MkDocs Insiders is a compatible drop-in replacement for Material +for MkDocs, and can be installed similarly using [`pip`][pip], +[`docker`][docker] or [`git`][git]. + + [pip]: #with-pip + [docker]: #with-docker + [git]: #with-git + +## Requirements + +After you've been added to the list of collaborators and accepted the +repository invitation, the next step is to create a [personal access token] for +your GitHub account in order to access the Insiders repository programmatically +(from the command line or GitHub Actions workflows): + +1. Go to https://github.com/settings/tokens +2. Click on [Generate a new token] +3. Enter a name and select the [`repo`][scopes] scope +4. Generate the token and store it in a safe place + + [personal access token]: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token + [Generate a new token]: https://github.com/settings/tokens/new + [scopes]: https://docs.github.com/en/developers/apps/scopes-for-oauth-apps#available-scopes + +Some of the instructions below require that the `GH_TOKEN` environment +variable is set to the value of the personal access token you +generated in the previous step. Note that the personal access token +must be kept secret at all times, as it allows the owner to access +your private repositories. + +## Installation + +### with pip + +Material for MkDocs Insiders can be installed with `pip`. You will +normally want to install the latest release but can also install a +specific older release or even the latest development version. +Make sure you have the `GH_TOKEN` variable set as instructed above. + +=== "Specific release" + + Pick the corresponding tag from the [list of tags] for the Insiders + repository. In the `pip` command below, replace the tag at the + end of the URL with the one you want. + + ``` sh + pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git@9.4.2-insiders-4.42.0 + ``` + +=== "Latest" + + ``` sh + pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git + ``` + +[list of tags]: https://github.com/squidfunk/mkdocs-material-insiders/tags + +### with docker + +In case you want to use Material for MkDocs Insiders from within Docker, some +additional steps are necessary. While we cannot provide a hosted Docker image +for Insiders[^2], [GitHub Container Registry] allows for simple and +comfortable self-hosting: + +1. [Fork the Insiders repository] +2. Enable [GitHub Actions] on your fork[^3] +3. Create a new personal access token[^4] + 1. Go to https://github.com/settings/tokens + 2. Click on [Generate a new token] + 3. Enter a name and select the [`write:packages`][scopes] scope + 4. Generate the token and store it in a safe place +4. Add a [GitHub Actions secret] on your fork + 1. Set the name to `GHCR_TOKEN` + 2. Set the value to the personal access token created in the previous step +5. [Create a new release] to build and publish the Docker image +6. Install [Pull App] on your fork to stay in-sync with upstream + +The [`build`][build] workflow is automatically run when a new tag +(release) is created. When a new Insiders version is released on the upstream +repository, the [Pull App] will create a pull request with the changes and +pull in the new tag, which is picked up by the [`build`][build] workflow +that builds and publishes the Docker image automatically to your private +registry. + +Now, you should be able to pull the Docker image from your private registry: + +``` +docker login -u ${GH_USERNAME} -p ${GHCR_TOKEN} ghcr.io +docker pull ghcr.io/${GH_USERNAME}/mkdocs-material-insiders +``` + +Should you wish to add additional plugins to the insiders container image, follow the steps +outlined in the [Getting Started guide](../getting-started.md#with-docker). + + [^2]: + Earlier, Insiders provided a dedicated Docker image which was available to + all sponsors. On March 21, 2021, the image was deprecated for the reasons + outlined and discussed in #2442. It was removed on June 1, 2021. + + [^3]: + When forking a repository, GitHub will disable all workflows. While this + is a reasonable default setting, you need to enable GitHub Actions to be + able to automatically build and publish a Docker image on + [GitHub Container Registry]. + + [^4]: + While you could just add the `write:packages` scope to the personal access + token created to access the Insiders repository, it's safer to create a + dedicated token which you'll only use for publishing the Docker image. + +### with git + +Of course, you can use Material for MkDocs Insiders directly from `git`: + +``` +git clone git@github.com:squidfunk/mkdocs-material-insiders.git mkdocs-material +``` + +The theme will reside in the folder `mkdocs-material/material`. When cloning +from `git`, the theme must be installed, so MkDocs can find the built-in +plugins: + +``` +pip install -e mkdocs-material +``` + + [GitHub Container Registry]: https://docs.github.com/en/packages/guides/about-github-container-registry + [Fork the Insiders repository]: https://github.com/squidfunk/mkdocs-material-insiders/fork + [GitHub Actions]: https://docs.github.com/en/github/administering-a-repository/disabling-or-limiting-github-actions-for-a-repository + [packages scope]: https://docs.github.com/en/developers/apps/scopes-for-oauth-apps#available-scopes + [GitHub Actions secret]: https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository + [Create a new release]: https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository#creating-a-release + [Pull App]: https://github.com/apps/pull + [build]: https://github.com/squidfunk/mkdocs-material-insiders/blob/master/.github/workflows/build.yml + +## Built-in plugins + +When you're using built-in plugins that are solely available via Insiders, +outside contributors won't be able to build your documentation project on their +local machine. This is the reason why we developed the [built-in group plugin] +that allows to conditionally load plugins: + +``` yaml +plugins: + - search + - social + + # CI=true mkdocs build + - group: + enabled: !ENV CI + plugins: + - git-revision-date-localized + - git-committers + + # INSIDERS=true mkdocs build + - group: + enabled: !ENV INSIDERS + plugins: + - optimize + - privacy +``` + +Of course, you can also enable both groups with: + +``` shell +CI=true INSIDERS=true mkdocs build +``` + + [built-in group plugin]: ../plugins/group.md + [configuration inheritance]: https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/index.md new file mode 100644 index 0000000..c7b5708 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/index.md @@ -0,0 +1,4 @@ +--- +template: redirect.html +location: getting-started/ +--- diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/upgrade.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/upgrade.md new file mode 100644 index 0000000..ec86ad9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/insiders/upgrade.md @@ -0,0 +1,79 @@ +# How to upgrade + +When upgrading Insiders, you should always check the version of Material for +MkDocs which makes up the first part of the version qualifier, e.g., Insiders +`4.x.x` is currently based on `9.x.x`: + +``` +9.x.x-insiders-4.x.x +``` + +If the major version increased, it's a good idea to consult the [upgrade +guide] and go through the steps to ensure your configuration is up to date and +all necessary changes have been made. + + [upgrade guide]: ../upgrade.md + [list of tags]: https://github.com/squidfunk/mkdocs-material-insiders/tags + +Depending on how you installed and what you want to upgrade to you +need to run different commands: + +=== "pip upgrade to release" + + If you installed Insiders via `pip` and you want to upgrade to a + specific release, pick the tag from the [list of tags] and replace + the tag at the end of the URL of the command given below: + + ``` + pip install --upgrade git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git@9.4.2-insiders-4.42.0 + ``` + +=== "pip upgrade to latest development" + + If you installed Insiders via `pip` and want to upgrade to the + latest development version, run: + + ``` + pip install --upgrade --force-reinstall git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git + ``` + + The `--force-reinstall` option serves to make sure `pip` does, in fact, + install the latest development version, instead of deciding that nothing + is to be done based on the version numbers. + ``` + +=== "git upgrade" + + If you installed Insiders via `git`, you will first need to check + out the version you want to install into your workspace. After + this is done, you can run `pip` to install that version. + + First, make sure that your local clone is up-to-date with the + upstream repository by running `git pull`. + + You can look up the tags using `git tag --sort -refname` or you + can consult the [list of tags]. Then, checkout the tag you want to + use by replacing the one given in the command below (twice)and running + it from your workspace[^detached]: + + [^detached]: + The `--detach` argument serves to tell `git` that you are ok to + have your workspace in the [detached head] state, which is + perfectly fine to have here. + + [detached head]: https://www.git-tower.com/learn/git/faq/detached-head-when-checkout-commit/ + + ``` + cd mkdocs-material + git checkout --detach tags/9.4.2-insiders-4.42.0 + ``` + + Now, change back to the parent directory in which your Git + repository lives and run `pip`: + + ``` + cd .. + pip install -e mkdocs-material + ``` + + diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/license.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/license.md new file mode 100644 index 0000000..5783e40 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/license.md @@ -0,0 +1,23 @@ +# License + +**MIT License** + +Copyright (c) 2016-2025 Martin Donath + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/philosophy.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/philosophy.md new file mode 100644 index 0000000..35efcb1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/philosophy.md @@ -0,0 +1,24 @@ +# Philosophy + +Before settling for Material for MkDocs, it's a good idea to understand the +philosophy behind the project, in order to make sure it aligns with your goals. +This page explains the design principles anchored in Material for MkDocs, and +discusses the [conventions] used in this documentation. + + [conventions]: conventions.md + +## Design principles + +- **It's just Markdown**: Focus on the content of your documentation and create a professional static site in minutes. No need to know HTML, CSS or JavaScript – let Material for MkDocs do the heavy lifting for you. + +- **Works on all devices**: Serve your documentation with confidence – Material for MkDocs automatically adapts to perfectly fit the available screen estate, no matter the type or size of the viewing device. Desktop. Tablet. Mobile. All great. + +- **Made to measure**: Make it yours – change the colors, fonts, language, icons, logo, and more with a few lines of configuration. Material for MkDocs can be easily extended and provides many options to alter appearance and behavior. + +- **Fast and lightweight**: Don't let your users wait – get incredible value with a small footprint by using one of the fastest themes available with excellent performance, yielding optimal search engine rankings and happy users that return. + +- **Maintain ownership**: Make accessibility a priority – users can navigate your + documentation with touch devices, keyboard, and screen readers. Semantic + markup ensures that your documentation works for everyone. + +- **Open Source**: You're in good company – choose a mature and actively maintained solution built with state-of-the-art Open Source technologies, trusted by more than 50.000 individuals and organizations. Licensed under MIT. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/blog.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/blog.md new file mode 100644 index 0000000..3ea555a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/blog.md @@ -0,0 +1,1723 @@ +--- +title: Built-in blog plugin +icon: material/newspaper-variant-outline +--- + +# Built-in blog plugin + +The blog plugin makes it very easy to build a blog, either as a sidecar to +your documentation or as the main thing. Focus on your content while the plugin +does all the heavy lifting, generating a view of all latest posts, [archive] and +[category] pages, configurable [pagination] and much more. + + [archive]: #archive + [category]: #categories + [pagination]: #pagination + +## Objective + +### How it works + +The plugin scans the configured [`posts` directory][config.post_dir] for +`.md` files from which paginated views[^1] are automatically generated. If not +configured otherwise, the plugin expects that your project has the following +directory layout, and will create any missing directories or files for you: + + [^1]: + Views are pages that are automatically generated, i.e., the entry point to + your blog listing all latest posts, as well as [archive] and [category] + pages that list all posts associated with them through [metadata] in + chronological order. + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ blog/ +│ ├─ posts/ +│ └─ index.md +└─ mkdocs.yml +``` + +The `index.md` file in the [`blog` directory][config.blog_dir] is the entry +point to your blog – a paginated view listing all posts in reverse chronological +order. Besides that, the plugin supports automatically creating [archive] and +[category] pages that list a subset of posts for a time interval or category. + +[Post URLs][config.post_url_format] are completely configurable, no matter if +you want your URLs to include the post's date or not. Rendered dates always +display in the locale of the [site language] of your project. Like in other +static blog frameworks, posts can be annotated with a variety of [metadata], +allowing for easy integration with other [built-in plugins], e.g., the +[social] and [tags] plugin. + +Posts can be organized in nested folders with a directory layout that suits your +specific needs, and can make use of all components and syntax that Material for +MkDocs offers, including [admonitions], [annotations], [code blocks], +[content tabs], [diagrams], [icons], [math], and more. + + [metadata]: #metadata + [built-in plugins]: index.md + [social]: social.md + [tags]: tags.md + [admonitions]: ../reference/admonitions.md + [annotations]: ../reference/annotations.md + [code blocks]: ../reference/code-blocks.md + [content tabs]: ../reference/content-tabs.md + [diagrams]: ../reference/diagrams.md + [icons]: ../reference/icons-emojis.md + [math]: ../reference/math.md + +### When to use it + +If you want to add a blog to your project, or migrate from another blog +framework to Material for MkDocs because of its excellent technical writing +capabilities, this plugin is a great choice, as it integrates perfectly with +many other built-in plugins: + +<div class="grid cards" markdown> + +- :material-file-tree:   __[Built-in meta plugin][meta]__ + + --- + + The meta plugin makes it easy to apply [metadata] to a subset of posts, + including authors, tags, categories, draft status, as well as social card + layouts. + + --- + + __Simpler organization, categorization and management of post metadata__ + +- :material-share-circle:   __[Built-in social plugin][social]__ + + --- + + The social plugin automatically generates beautiful and customizable + social cards for each post and page, showing as previews on social media. + + --- + + __Links to your blog render beautiful social cards when shared on social + media__ + +- :material-rabbit:   __[Built-in optimize plugin][optimize]__ + + --- + + The optimize plugin automatically identifies and optimizes all media files + that you reference in your project by using compression and conversion + techniques. + + --- + + __Your blog loads faster as smaller images are served to your users__ + +- :material-tag-text:   __[Built-in tags plugin][tags]__ + + --- + + The tags plugin allows to categorize posts alongside with pages in your + project, to improve their discoverability and connect posts to your + documentation. + + --- + + __Your documentation's tag system integrates with your blog__ + +</div> + + [meta]: meta.md + [social]: social.md + [optimize]: optimize.md + [tags]: tags.md + +## Configuration + +<!-- md:version 9.2.0 --> +<!-- md:plugin [blog] – built-in --> +<!-- md:flag multiple --> +<!-- md:flag experimental --> + +As with all [built-in plugins], getting started with the blog plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and you can +start writing your first post: + +``` yaml +plugins: + - blog +``` + +The blog plugin is built into Material for MkDocs and doesn't need to be +installed. + + [blog]: blog.md + [built-in plugins]: index.md + +### Navigation + +If you do not have site navigation configured in your `mkdocs.yml` then there is +nothing more to do. The blog [archive] and [category] pages will automatically +appear underneath the automatically generated navigation. + +If you do have a navigation structure defined then you will need to specify +where the blog should appear in this. Create a [navigation section with an index +page] for the blog: + +```yaml +theme: + name: material + features: + - navigation.indexes +nav: + - ... + - Blog: + - blog/index.md +``` + +The [archive] and [category] pages will appear within that section as +subsections beneath pages in the blog section. In this case, they would appear +after `index.md`. The path to the `index.md` file must match +[blog_dir][config.blog_dir]. This means that you can name the blog navigation +entry anything you like: 'Blog' or 'News' or perhaps 'Tips'. + +[navigation section with an index page]: ../setup/setting-up-navigation.md#section-index-pages + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +It's normally not necessary to specify this setting, but if you want to disable +the plugin, use: + +``` yaml +plugins: + - blog: + enabled: false +``` + + [building your project]: ../creating-your-site.md#building-your-site + +--- + +#### <!-- md:setting config.blog_dir --> + +<!-- md:version 9.2.0 --> +<!-- md:default `blog` --> + +Use this setting to change the path where your blog is located in the +[`docs` directory][mkdocs.docs_dir]. The path is included in the generated +URLs as a prefix for all posts and views. You can change it with: + +=== "Documentation + Blog" + + ``` yaml + plugins: + - blog: + blog_dir: blog + ``` + +=== "Blog only" + + ``` yaml + plugins: + - blog: + blog_dir: . + ``` + +The provided path is resolved from the [`docs` directory][mkdocs.docs_dir]. + +--- + +#### <!-- md:setting config.blog_toc --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +Use this setting to leverage the table of contents to display post titles in +views. This might be useful, if your post excerpts are rather long. If you want +to enable it, use: + +``` yaml +plugins: + - blog: + blog_toc: true +``` + +### Posts + +The following settings are available for posts: + +--- + +#### <!-- md:setting config.post_dir --> + +<!-- md:version 9.2.0 --> +<!-- md:default `{blog}/posts` --> + +Use this setting to change the folder where your posts are located. It's +normally not necessary to change this setting, but if you want to rename the +folder or change its file system location, use: + +``` yaml +plugins: + - blog: + post_dir: "{blog}/articles" +``` + +Note that the [`posts` directory][config.post_dir] is solely used for post +organization – it is not included in post URLs, since they are automatically +and comfortably generated by this plugin. + +The following placeholders are available: + +- `blog` – [`blog` directory][config.blog_dir] + +The provided path is resolved from the [`docs` directory][mkdocs.docs_dir]. + +--- + +#### <!-- md:setting config.post_date_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `long` --> + +Use this setting to change the date format of posts. This plugin uses [babel] +to render dates in the configured [site language]. You can use [babel]'s +[pattern syntax] or the following shortcodes: + +=== "Monday, January 31, 2024" + + ``` yaml + plugins: + - blog: + post_date_format: full + ``` + +=== "January 31, 2024" + + ``` yaml + plugins: + - blog: + post_date_format: long + ``` + +=== "Jan 31, 2024" + + ``` yaml + plugins: + - blog: + post_date_format: medium + ``` + +=== "1/31/24" + + ``` yaml + plugins: + - blog: + post_date_format: short + ``` + +Note that depending on the [site language], results might look different for +other languages. + + [babel]: https://pypi.org/project/Babel/ + [site language]: ../setup/changing-the-language.md#site-language + [pattern syntax]: https://babel.pocoo.org/en/latest/dates.html#pattern-syntax + +--- + +#### <!-- md:setting config.post_url_date_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `yyyy/MM/dd` --> + +Use this setting to change the date format used in post URLs. The format string +must adhere to [babel]'s [pattern syntax] and should not contain whitespace. +Some popular choices: + +=== ":material-link: blog/2024/01/31/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + post_url_date_format: yyyy/MM/dd + ``` + +=== ":material-link: blog/2024/01/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + post_url_date_format: yyyy/MM + ``` + +=== ":material-link: blog/2024/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + post_url_date_format: yyyy + ``` + +If you want to remove the date from post URLs, e.g., when your blog features +mostly evergreen content, you can remove the `date` placeholder from the +[`post_url_format`][config.post_url_format] format string. + +--- + +#### <!-- md:setting config.post_url_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `{date}/{slug}` --> + +Use this setting to change the format string that is used when generating post +URLs. You can freely combine placeholders, and join them with slashes or other +characters: + +=== ":material-link: blog/2024/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + post_url_format: "{date}/{slug}" + ``` + +=== ":material-link: blog/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + post_url_format: "{slug}" + ``` + +The following placeholders are available: + +- `categories` – Post categories, slugified with [`categories_slugify`][config.categories_slugify] +- `date` – Post date, formatted with [`post_url_date_format`][config.post_url_date_format] +- `slug` – Post title, slugified with [`post_slugify`][config.post_slugify], or explicitly set via [`slug`][meta.slug] metadata property +- `file` – Post filename without `.md` file extension + +If you remove the `date` placeholder, make sure that post URLs don't collide +with URLs of other pages hosted under the [`blog` directory][config.blog_dir], +as this leads to undefined behavior. + +--- + +#### <!-- md:setting config.post_url_max_categories --> + +<!-- md:version 9.2.0 --> +<!-- md:default `1` --> + +Use this setting to set an upper bound for the number of categories included in +post URLs if the `categories` placeholder is part of [`post_url_format`] +[config.post_url_format] and the post defines categories: + +``` yaml +plugins: + - blog: + post_url_format: "{categories}/{slug}" + post_url_max_categories: 2 +``` + +If more than one category is given, they are joined with `/` after slugifying. + +--- + +#### <!-- md:setting config.post_slugify --> + +<!-- md:version 9.2.0 --> +<!-- md:default [`pymdownx.slugs.slugify`][pymdownx.slugs.slugify] --> + +Use this setting to change the function for generating URL-compatible slugs +from post titles. By default, the [`slugify`][pymdownx.slugs.slugify] function +from [Python Markdown Extensions] is used as follows: + +``` yaml +plugins: + - blog: + post_slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower +``` + +The default configuration is Unicode-aware and should produce good slugs for all +languages. Of course, you can also provide a custom slugification function for +more granular control. + + [pymdownx.slugs.slugify]: https://github.com/facelessuser/pymdown-extensions/blob/01c91ce79c91304c22b4e3d7a9261accc931d707/pymdownx/slugs.py#L59-L65 + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/extras/slugs/ + +--- + +#### <!-- md:setting config.post_slugify_separator --> + +<!-- md:version 9.2.0 --> +<!-- md:default `-` --> + +Use this setting to change the separator that is passed to the slugification +function set as part of [`post_slugify`][config.post_slugify]. While the default +is a hyphen, it can be set to any string, e.g., `_`: + +``` yaml +plugins: + - blog: + post_slugify_separator: _ +``` + +--- + +#### <!-- md:setting config.post_excerpt --> + +<!-- md:version 9.2.0 --> +<!-- md:default `optional` --> + +By default, the plugin makes [post excerpts](../setup/setting-up-a-blog.md#adding-an-excerpt) +optional. When a post doesn't define an excerpt, views include the entire post. +This setting can be used to make post excerpts required: + +=== "Optional" + + ``` yaml + plugins: + - blog: + post_excerpt: optional + ``` + +=== "Required" + + ``` yaml + plugins: + - blog: + post_excerpt: required + ``` + +When post excerpts are required, posts without excerpt separators raise an +error. Thus, this setting is useful when you want to make sure that all posts +have excerpts defined. + +--- + +#### <!-- md:setting config.post_excerpt_max_authors --> + +<!-- md:version 9.2.0 --> +<!-- md:default `1` --> + +Use this setting to set an upper bound for the number of authors rendered in +post excerpts. While each post may be written by multiple authors, this setting +allows to limit the display to just a few or even a single author, or disable +authors in post excerpts: + +=== "Render up to 2 authors" + + ``` yaml + plugins: + - blog: + post_excerpt_max_authors: 2 + ``` + +=== "Disable authors" + + ``` yaml + plugins: + - blog: + post_excerpt_max_authors: 0 + ``` + +This only applies to post excerpts in views. Posts always render all authors. + +--- + +#### <!-- md:setting config.post_excerpt_max_categories --> + +<!-- md:version 9.2.0 --> +<!-- md:default `5` --> + +Use this setting to set an upper bound for the number of categories rendered in +post excerpts. While each post may be assigned to multiple categories, this +setting allows to limit the display to just a few or even a single category, or +disable categories in post excerpts: + +=== "Render up to 2 categories" + + ``` yaml + plugins: + - blog: + post_excerpt_max_categories: 2 + ``` + +=== "Disable categories" + + ``` yaml + plugins: + - blog: + post_excerpt_max_categories: 0 + ``` + +This only applies to post excerpts in views. Posts always render all categories. + +--- + +#### <!-- md:setting config.post_excerpt_separator --> + +<!-- md:version 9.2.0 --> +<!-- md:default <code><!-- more --></code> --> + +Use this setting to set the separator the plugin will look for in a post's +content when generating post excerpts. All content __before__ the separator is +considered to be part of the excerpt: + +``` yaml +plugins: + - blog: + post_excerpt_separator: <!-- more --> +``` + +It is common practice to use an HTML comment as a separator. + +--- + +#### <!-- md:setting config.post_readtime --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should automatically compute the +reading time of a post, which is then rendered in post excerpts, as well as in +posts themselves: + +``` yaml +plugins: + - blog: + post_readtime: false +``` + +!!! warning "Chinese, Japanese and Korean characters" + + Reading time computation currently does not take segmentation of Chinese, + Japanese and Korean characters into account. This means that the reading + time for posts in these languages may be inaccurate. We're planning on + adding support in the future. In the meantime, please use the `readtime` + front matter property to set the reading time. + +--- + +#### <!-- md:setting config.post_readtime_words_per_minute --> + +<!-- md:version 9.2.0 --> +<!-- md:default `265` --> + +Use this setting to change the number of words that a reader is expected to read +per minute when computing the reading time of a post. If you want to fine-tune +it, use: + +``` yaml +plugins: + - blog: + post_readtime_words_per_minute: 300 +``` + +A reading time of 265 words per minute is considered to be the +[average reading time of an adult]. + + [average reading time of an adult]: https://help.medium.com/hc/en-us/articles/214991667-Read-time + +### Archive + +The following settings are available for archive pages: + +--- + +#### <!-- md:setting config.archive --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable archive pages. An archive page shows all +posts for a specific interval (e.g. year, month, etc.) in reverse order. If you +want to disable archive pages, use: + +``` yaml +plugins: + - blog: + archive: false +``` + +--- + +#### <!-- md:setting config.archive_name --> + +<!-- md:version 9.2.0 --> +<!-- md:default computed --> + +Use this setting to change the title of the archive section the plugin adds to +the navigation. If this setting is omitted, it's sourced from the translations. +If you want to change it, use: + +``` yaml +plugins: + - blog: + archive_name: Archive +``` + +--- + +#### <!-- md:setting config.archive_date_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `yyyy` --> + +Use this setting to change the date format used for archive page titles. The +format string must adhere to [babel]'s [pattern syntax]. Some popular choices: + +=== "2024" + + ``` yaml + plugins: + - blog: + archive_date_format: yyyy + ``` + +=== "January 2024" + + ``` yaml + plugins: + - blog: + archive_date_format: MMMM yyyy + ``` + +Note that depending on the [site language], results might look different for +other languages. + +--- + +#### <!-- md:setting config.archive_url_date_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `yyyy` --> + +Use this setting to change the date format used for archive page URLs. The +format string must adhere to [babel]'s [pattern syntax] and should not contain +whitespace. Some popular choices: + +=== ":material-link: blog/archive/2024/" + + ``` yaml + plugins: + - blog: + archive_url_date_format: yyyy + ``` + +=== ":material-link: blog/archive/2024/01/" + + ``` yaml + plugins: + - blog: + archive_url_date_format: yyyy/MM + ``` + +--- + +#### <!-- md:setting config.archive_url_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `archive/{date}` --> + +Use this setting to change the format string that is used when generating +archive page URLs. You can freely combine placeholders, and join them with +slashes or other characters: + +=== ":material-link: blog/archive/2024/" + + ``` yaml + plugins: + - blog: + archive_url_format: "archive/{date}" + ``` + +=== ":material-link: blog/2024/" + + ``` yaml + plugins: + - blog: + archive_url_format: "{date}" + ``` + +The following placeholders are available: + +- `date` – Archive date, formatted with [`archive_url_date_format`][config.archive_url_date_format] + +--- + +#### <!-- md:setting config.archive_pagination --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable pagination for archive pages. The value +of this setting is inherited from [`pagination`][config.pagination], unless it's +explicitly set. To disable pagination, use: + +``` yaml +plugins: + - blog: + archive_pagination: false +``` + +--- + +#### <!-- md:setting config.archive_pagination_per_page --> + +<!-- md:version 9.7.0 --> +<!-- md:default `10` --> + +Use this setting to change the number of posts rendered per archive page. The +value of this setting is inherited from [`pagination_per_page`] +[config.pagination_per_page], unless it's explicitly set. To change it, use: + +``` yaml +plugins: + - blog: + archive_pagination_per_page: 5 +``` + +--- + +#### <!-- md:setting config.archive_toc --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +Use this setting to leverage the table of contents to display post titles on all +archive pages. The value of this setting is inherited from [`blog_toc`] +[config.blog_toc], unless it's explicitly set. To change it, use + +``` yaml +plugins: + - blog: + archive_toc: true +``` + +### Categories + +The following settings are available for category pages: + +--- + +#### <!-- md:setting config.categories --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable category pages. A category page shows all +posts for a specific category in reverse chronological order. If you want to +disable category pages, use: + +``` yaml +plugins: + - blog: + categories: false +``` + +--- + +#### <!-- md:setting config.categories_name --> + +<!-- md:version 9.2.0 --> +<!-- md:default computed --> + +Use this setting to change the title of the category section the plugin adds to +the navigation. If this setting is omitted, it's sourced from the translations. +If you want to change it, use: + +``` yaml +plugins: + - blog: + categories_name: Categories +``` + +--- + +#### <!-- md:setting config.categories_url_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `category/{slug}` --> + +Use this setting to change the format string that is used when generating +category page URLs. You can freely combine placeholders, and join them with +slashes or other characters: + +=== ":material-link: blog/category/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + categories_url_format: "category/{slug}" + ``` + +=== ":material-link: blog/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + categories_url_format: "{slug}" + ``` + +The following placeholders are available: + +- `slug` – Category, slugified with [`categories_slugify`][config.categories_slugify] + +--- + +#### <!-- md:setting config.categories_slugify --> + +<!-- md:version 9.2.0 --> +<!-- md:default [`pymdownx.slugs.slugify`][pymdownx.slugs.slugify] --> + +Use this setting to change the function for generating URL-compatible slugs +from categories. By default, the [`slugify`][pymdownx.slugs.slugify] function +from [Python Markdown Extensions] is used as follows: + +``` yaml +plugins: + - blog: + categories_slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower +``` + +The default configuration is Unicode-aware and should produce good slugs for all +languages. Of course, you can also provide a custom slugification function for +more granular control. + +--- + +#### <!-- md:setting config.categories_slugify_separator --> + +<!-- md:version 9.2.0 --> +<!-- md:default `-` --> + +Use this setting to change the separator that is passed to the slugification +function set as part of [`categories_slugify`][config.categories_slugify]. While +the default is a hyphen, it can be set to any string, e.g., `_`: + +``` yaml +plugins: + - blog: + categories_slugify_separator: _ +``` + +--- + +#### <!-- md:setting config.categories_sort_by --> + +<!-- md:version 9.7.0 --> +<!-- md:default `material.plugins.blog.view_name` --> + +Use this setting to specify a custom function for sorting categories. For +example, if you want to sort categories by the number of posts they contain, +use the following configuration: + +``` yaml +plugins: + - blog: + categories_sort_by: !!python/name:material.plugins.blog.view_post_count +``` + +Don't forget to enable [`categories_sort_reverse`][config.categories_sort_reverse]. +You can define your own comparison function, which must return something +that can be compared while sorting, i.e., a string or number. + +--- + +#### <!-- md:setting config.categories_sort_reverse --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +Use this setting to reverse the order in which categories are sorted. By +default, categories are sorted in ascending order, but you can reverse ordering +as follows: + +``` yaml +plugins: + - blog: + categories_sort_reverse: true +``` + +--- + +#### <!-- md:setting config.categories_allowed --> + +<!-- md:version 9.2.0 --> +<!-- md:default none --> + +The plugin allows to check categories against a predefined list, in order to +catch typos or make sure that categories are not arbitrarily added. Specify the +categories you want to allow with: + +``` yaml +plugins: + - blog: + categories_allowed: + - Search + - Performance +``` + +The plugin stops the build if a post references a category that is not part of +this list. Posts can be assigned to categories by using the [`categories`] +[meta.categories] metadata property. + +--- + +#### <!-- md:setting config.categories_pagination --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable pagination for category pages. The value +of this setting is inherited from [`pagination`][config.pagination], unless it's +explicitly set. To disable pagination, use: + +``` yaml +plugins: + - blog: + categories_pagination: false +``` + +--- + +#### <!-- md:setting config.categories_pagination_per_page --> + +<!-- md:version 9.7.0 --> +<!-- md:default `10` --> + +Use this setting to change the number of posts rendered per category page. The +value of this setting is inherited from [`pagination_per_page`] +[config.pagination_per_page], unless it's explicitly set. To change it, use: + +``` yaml +plugins: + - blog: + categories_pagination_per_page: 5 +``` + +--- + +#### <!-- md:setting config.categories_toc --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +Use this setting to leverage the table of contents to display post titles on all +category pages. The value of this setting is inherited from [`blog_toc`] +[config.blog_toc], unless it's explicitly set. To change it, use: + +``` yaml +plugins: + - blog: + categories_toc: true +``` + +### Authors + +The following settings are available for authors: + +--- + +#### <!-- md:setting config.authors --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable post authors. If this setting is enabled, +the plugin will look for a file named [`.authors.yml`][config.authors_file] and +render authors in posts and views. Disable this behavior with: + +``` yaml +plugins: + - blog: + authors: false +``` + +--- + +#### <!-- md:setting config.authors_file --> + +<!-- md:version 9.2.0 --> +<!-- md:default `{blog}/.authors.yml` --> + +Use this setting to change the path of the file where the author information for +your posts resides. It's normally not necessary to change this setting, but if +you need to, use: + +``` yaml +plugins: + - blog: + authors_file: "{blog}/.authors.yml" +``` + +The following placeholders are available: + +- `blog` – [`blog` directory][config.blog_dir] + +The provided path is resolved from the [`docs` directory][mkdocs.docs_dir]. + +!!! info "Format of author information" + + The `.authors.yml` file must adhere to the following format: + + ``` yaml title=".authors.yml" + authors: + <author>: + name: string # Author name + description: string # Author description + avatar: url # Author avatar + slug: url # Author profile slug + url: url # Author website URL + ``` + + Note that `<author>` must be set to an identifier for associating authors + with posts, e.g., a GitHub username like `squidfunk`. This identifier can + then be used in the [`authors`][meta.authors] metadata property of + a post. Multiple authors are supported. As an example, see + [the `.authors.yml` file][.authors.yml] we're using for our blog. + + [.authors.yml]: https://github.com/squidfunk/mkdocs-material/blob/master/docs/blog/.authors.yml + +--- + +#### <!-- md:setting config.authors_profiles --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +Use this setting to enable or disable automatically generated author profiles. +An author profile shows all posts by an author in reverse chronological order. +You can enable author profiles with: + +``` yaml +plugins: + - blog: + authors_profiles: true +``` + +--- + +#### <!-- md:setting config.authors_profiles_name --> + +<!-- md:version 9.7.0 --> +<!-- md:default computed --> + +Use this setting to change the title of the authors section the plugin adds to +the navigation. If this setting is omitted, it's sourced from the translations. +If you want to change it, use: + +``` yaml +plugins: + - blog: + authors_profiles_name: Authors +``` + +--- + +#### <!-- md:setting config.authors_profiles_url_format --> + +<!-- md:version 9.7.0 --> +<!-- md:default `author/{slug}` --> + +Use this setting to change the format string that is used when generating +author profile URLs. You can freely combine placeholders, and join them with +slashes or other characters: + +=== ":material-link: blog/author/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + authors_profiles_url_format: "author/{slug}" + ``` + +=== ":material-link: blog/:material-dots-horizontal:/" + + ``` yaml + plugins: + - blog: + authors_profiles_url_format: "{slug}" + ``` + +The following placeholders are available: + +- `slug` – Author slug or identifier from [`authors_file`][config.authors_file] +- `name` – Author name from [`authors_file`][config.authors_file] + +--- + +#### <!-- md:setting config.authors_profiles_pagination --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable pagination for author profiles. The value +of this setting is inherited from [`pagination`][config.pagination], unless it's +explicitly set. To disable pagination, use: + +``` yaml +plugins: + - blog: + authors_profiles_pagination: false +``` + +--- + +#### <!-- md:setting config.authors_profiles_pagination_per_page --> + +<!-- md:version 9.7.0 --> +<!-- md:default `10` --> + +Use this setting to change the number of posts rendered per archive page. The +value of this setting is inherited from [`pagination_per_page`] +[config.pagination_per_page], unless it's explicitly set. To change it, use: + +``` yaml +plugins: + - blog: + authors_profiles_pagination_per_page: 5 +``` + +--- + +#### <!-- md:setting config.authors_profiles_toc --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +Use this setting to leverage the table of contents to display post titles on all +author profiles. The value of this setting is inherited from [`blog_toc`] +[config.blog_toc], unless it's explicitly set. To change it, use: + +``` yaml +plugins: + - blog: + authors_profiles_toc: true +``` + +### Pagination + +The following settings are available for pagination: + +--- + +#### <!-- md:setting config.pagination --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable pagination in views – generated pages +that show posts or subsets of posts in reverse chronological order. If you want +to disable pagination, use: + +``` yaml +plugins: + - blog: + pagination: false +``` + +--- + +#### <!-- md:setting config.pagination_per_page --> + +<!-- md:version 9.2.0 --> +<!-- md:default `10` --> + +Use this setting to change the number of posts rendered per page. If you have +rather long post excerpts, it can be a good idea to reduce the number of posts +per page: + +``` yaml +plugins: + - blog: + pagination_per_page: 5 +``` + +--- + +#### <!-- md:setting config.pagination_url_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `page/{page}` --> + +Use this setting to change the format string that is used when generating +paginated view URLs. You can freely combine placeholders, and join them with +slashes or other characters: + +=== ":material-link: blog/page/n/" + + ``` yaml + plugins: + - blog: + pagination_url_format: "page/{page}" + ``` + +=== ":material-link: blog/n/" + + ``` yaml + plugins: + - blog: + pagination_url_format: "{page}" + ``` + +The following placeholders are available: + +- `page` – Page number + +--- + +#### <!-- md:setting config.pagination_format --> + +<!-- md:version 9.2.0 --> +<!-- md:default `~2~` --> + +The plugin uses the [paginate] module to generate the pagination markup using a +special syntax. Use this setting to customize how pagination is constructed. +Some popular choices: + +=== "1 2 3 .. n" + + ``` yaml + plugins: + - blog: + pagination_format: "~2~" + ``` + +=== "1 2 3 .. n :material-chevron-right: :material-chevron-double-right:" + + ``` yaml + plugins: + - blog: + pagination_format: "$link_first $link_previous ~2~ $link_next $link_last" + ``` + +=== "1 :material-chevron-right:" + + ``` yaml + plugins: + - blog: + pagination_format: "$link_previous $page $link_next" + ``` + +The following placeholders are supported by [paginate]: + +- `#!css $first_page` – Number of first reachable page +- `#!css $last_page` – Number of last reachable page +- `#!css $page` – Number of currently selected page +- `#!css $page_count` – Number of reachable pages +- `#!css $items_per_page` – Maximal number of items per page +- `#!css $first_item` – Index of first item on the current page +- `#!css $last_item` – Index of last item on the current page +- `#!css $item_count` – Total number of items +- `#!css $link_first` – Link to first page (unless on first page) +- `#!css $link_last` – Link to last page (unless on last page) +- `#!css $link_previous` – Link to previous page (unless on first page) +- `#!css $link_next` – Link to next page (unless on last page) + + [paginate]: https://pypi.org/project/paginate/ + +--- + +#### <!-- md:setting config.pagination_if_single_page --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +Use this setting to control whether pagination should be automatically disabled +when the view only consists of a single page. If you want to always render +pagination, use: + +``` yaml +plugins: + - blog: + pagination_if_single_page: true +``` + +--- + +#### <!-- md:setting config.pagination_keep_content --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +Use this setting to enable or disable persistence of content, i.e., if paginated +views should also display the content of their containing view. If you want to +enable this behavior, use: + +``` yaml +plugins: + - blog: + pagination_keep_content: true +``` + +### Drafts + +The following settings are available for drafts: + +--- + +#### <!-- md:setting config.draft --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +Rendering [draft posts][meta.draft] can be useful in deploy previews. Use this +setting to specify whether the plugin should include posts marked as drafts when +[building your project]: + +=== "Render drafts" + + ``` yaml + plugins: + - blog: + draft: true + ``` + +=== "Don't render drafts" + + ``` yaml + plugins: + - blog: + draft: false + ``` + +--- + +#### <!-- md:setting config.draft_on_serve --> + +<!-- md:version 9.2.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should include posts marked as +drafts when [previewing your site]. If you don't wish to include draft posts +when previewing, use: + +``` yaml +plugins: + - blog: + draft_on_serve: false +``` + + [previewing your site]: ../creating-your-site.md#previewing-as-you-write + +--- + +#### <!-- md:setting config.draft_if_future_date --> + +<!-- md:version 9.2.0 --> +<!-- md:default `false` --> + +The plugin can automatically mark posts with future dates as drafts. When the +date is past today, the post is automatically included when +[building your project], unless explicitly marked as draft: + +``` yaml +plugins: + - blog: + draft_if_future_date: true +``` + +## Usage + +### Metadata + +Posts can define a handful of metadata properties that specify how the plugin +renders them, in which views they are integrated, and how they are linked to +each other. The metadata of each post is validated against a schema to allow for +a quicker discovery of syntax errors. + +The following properties are available: + +--- + +#### <!-- md:setting meta.authors --> + +<!-- md:version 9.2.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to associate a post with [authors] by providing a list of +identifiers as defined in the [`authors_file`][config.authors_file]. If an +author can't be resolved, the plugin will terminate with an error: + +``` yaml +--- +authors: + - squidfunk # (1)! +--- + +# Post title +... +``` + +1. Authors are linked by using their identifiers. As an example, see + [the `.authors.yml` file][.authors.yml] we're using for our blog. + + [authors]: #authors + +--- + +#### <!-- md:setting meta.categories --> + +<!-- md:version 9.2.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to associate a post with one or more [categories][category], +making the post a part of the generated category page. Categories are defined +as a list of strings (whitespaces are allowed): + +``` yaml +--- +categories: + - Search + - Performance +--- + +# Post title +... +``` + +If you want to prevent accidental typos assigning categories to posts, you +can set a predefined list of allowed categories in `mkdocs.yml` by using +the [`categories_allowed`][config.categories_allowed] setting. + +--- + +#### <!-- md:setting meta.date --> + +<!-- md:version 9.2.0 --> +<!-- md:flag metadata --> +<!-- md:flag required --> + +Use this property to specify a post's date. Note that this property is required, +which means the build fails when it's not set. Additional dates can be set by +using a slightly different syntax: + +=== "Date" + + ``` yaml + --- + date: 2024-01-31 + --- + + # Post title + ... + ``` + +=== "Update date" + + ``` yaml + --- + date: + created: 2024-01-31 # (1)! + updated: 2024-02-01 + --- + + # Post title + ... + ``` + + 1. Each post must have a creation date set. + +=== "Custom date" + + ``` yaml + --- + date: + created: 2024-01-31 + my_custom_date: 2024-02-01 # (1)! + --- + + # Post title + ... + ``` + + 1. The blog plugin validates all dates and allows to format them with + [babel]'s [pattern syntax] in templates. When using theme extension, + authors can add custom dates to templates. + + This was first requested in #5733. + +The following date formats are supported: + +- `2024-01-31` +- `2024-01-31T12:00:00` + +--- + +#### <!-- md:setting meta.draft --> + +<!-- md:version 9.2.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to mark a post as draft. The plugin allows to include or +exclude posts marked as drafts when [building your project] using the +[`draft`][config.draft] setting. Mark a post as draft with: + +``` yaml +--- +draft: true +--- + +# Post title +... +``` + +--- + +#### <!-- md:setting meta.pin --> + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:default `false` --> +<!-- md:flag experimental --> + +Use this property to pin a post to the top of a view. In case multiple posts are +pinned, the pinned posts are sorted by descending order and appear before all +other posts. Pin a post with: + +``` yaml +--- +pin: true +--- + +# Post title +... +``` + +--- + +#### <!-- md:setting meta.links --> + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> +<!-- md:flag experimental --> + +Use this property to define a list of links that are rendered in the sidebar of +a post. The property follows the same syntax as [`nav`][mkdocs.nav] in +`mkdocs.yml`, supporting sections and even anchors: + +=== "Links" + + ``` yaml + --- + links: + - setup/setting-up-site-search.md + - insiders/index.md + --- + + # Post title + ... + ``` + +=== "Links with sections" + + ``` yaml + --- + links: + - setup/setting-up-site-search.md + - Insiders: + - insiders/index.md + - insiders/getting-started.md + --- + + # Post title + ... + ``` + +=== "Links with anchors" + + ``` yaml + --- + links: + - plugins/search.md # (1)! + - Insiders: + - insiders/how-to-sponsor.md + - insiders/getting-started.md#requirements + --- + + # Post title + ... + ``` + + 1. If a link defines an anchor, the plugin resolves the anchor from the + linked page and sets the anchor title as a [subtitle]. + +All relative links are resolved from the [`docs` directory][mkdocs.docs_dir]. + + [subtitle]: ../reference/index.md#setting-the-page-subtitle + +--- + +#### <!-- md:setting meta.readtime --> + +<!-- md:version 9.2.0 --> +<!-- md:flag metadata --> +<!-- md:default computed --> + +Use this property to explicitly set the reading time of a post in minutes. When +[`post_readtime`][config.post_readtime] is enabled, the plugin computes the +reading time of a post, which can be overridden with: + +``` yaml +--- +readtime: 15 +--- + +# Post title +... +``` + +--- + +#### <!-- md:setting meta.slug --> + +<!-- md:version 9.2.0 --> +<!-- md:flag metadata --> +<!-- md:default computed --> + +Use this property to explicitly set the slug of a post. By default, the slug of +a post is automatically computed by the [`post_slugify`][config.post_slugify] +function from the post's title, which can be overridden with: + +``` yaml +--- +slug: help-im-trapped-in-a-universe-factory +--- + +# Post title +... +``` + +Slugs are passed to [`post_url_format`][config.post_url_format]. + +--- + +!!! question "Missing something?" + + When setting up your blog or migrating from another blog framework, you + might discover that you're missing specific functionality – we're happy to + consider adding it to the plugin! You can [open a discussion] to + ask a question, or create a [change request] on our [issue tracker], so we + can find out if it might be a good fit for the plugin. + + [open a discussion]: https://github.com/squidfunk/mkdocs-material/discussions + [change request]: ../contributing/requesting-a-change.md + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/group.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/group.md new file mode 100644 index 0000000..6e17c4c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/group.md @@ -0,0 +1,121 @@ +--- +title: Built-in group plugin +icon: material/format-list-group +--- + +# Built-in group plugin + +The group plugin allows to group plugins into logical units to conditionally +enable or disable them for specific environments with the use of +[environment variables][mkdocs.env], e.g., to only enable a subset of +plugins when [building your project] during continuous integration (CI). + + [building your project]: ../creating-your-site.md#building-your-site + +## Objective + +### How it works + +The plugin conditionally and lazily loads all plugins that are part of a group +if and only if the group is enabled, which means that the plugin doesn't add any +overhead when the group is disabled. It also means that the grouped plugins +only need to be installed when the group is enabled. + +The plugins that are part of the group are executed in the same order as if +they were defined at the top-level in the list of [`plugins`][mkdocs.plugins]. +Thus, order is preserved and deterministic. + +### When to use it + +Whenever you're using multiple plugins that are only required in specific +environments, e.g., when building your project during continuous integration +(CI), the plugin is the perfect utility for making configuration simpler, as it +removes the need for splitting configuration into multiple files. + +It can be used with any built-in or third-party plugin. + +## Configuration + +<!-- md:version 9.3.0 --> +<!-- md:plugin [group] – built-in --> +<!-- md:flag multiple --> +<!-- md:flag experimental --> + +As with all [built-in plugins], getting started with the group plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and start +splitting plugins into logical units: + +``` yaml +plugins: + - group +``` + +The group plugin is built into Material for MkDocs and doesn't need to be +installed. + + [group]: group.md + [built-in plugins]: index.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.3.0 --> +<!-- md:default `false` --> + +Use this setting to enable or disable the plugin when [building your project]. +The plugin behaves differently than all other built-in plugins – __it is +disabled by default__. To enable a group, use: + +``` yaml +plugins: + - group: + enabled: !ENV CI # (1)! +``` + +1. If you only want to use the group plugin for better organization and + always want to enable the plugins that are part of it, use: + + ``` yaml + plugins: + - group: + enabled: true + ``` + +The decision to disable the plugin by default was made to simplify the usage +of environment variables, as it removes the need to provide a default value for +an environment variable. + +Now, when [building your project], you can enable a group by setting the +[environment variable][mkdocs.env]: + +``` sh +CI=true mkdocs build +``` + + [building your project]: ../creating-your-site.md#building-your-site + +--- + +#### <!-- md:setting config.plugins --> + +<!-- md:version 9.3.0 --> +<!-- md:default none --> + +Use this setting to list the plugins that are part of the group. The syntax is +exactly the same as for the [`plugins`][mkdocs.plugins] setting, so you can +simply copy the list of plugins that you want to group, e.g: + +``` yaml +plugins: + - group: + plugins: + - optimize + - minify +``` + +The plugins mentioned here are just used for illustration purposes. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/index.md new file mode 100644 index 0000000..8bf6a8a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/index.md @@ -0,0 +1,246 @@ +# Built-in plugins + +Material for MkDocs started out as a theme for [MkDocs][mkdocs], but has since +evolved into a full-fledged framework for building and maintaining documentation. +The theme is still the core of the project, but it's now accompanied by a +growing number of complementary built-in plugins. + +We strive to make those plugins as modular and generic as possible, so that they +can be used in a wide variety of projects and use cases. By providing useful +default settings, we also try to make them as easy to use as possible, so that +you can get started quickly, tweaking their settings later on. When +developing built-in plugins, we always adhere to the following design principles: + +- **Modularity:** Built-in plugins are designed to be modular, so that they can + be easily combined to implement sophisticated pipelines. For example, the + [offline], [optimize] and [privacy] plugins can be used together to build + truly [offline-capable documentation]. + +- **Interoperability:** Built-in plugins are designed to be as compatible as + possible, so they can be used in combination with other plugins, including + third-party plugins. We strive to make it simple to integrate with the vast + ecosystem that has evolved around [MkDocs][mkdocs]. + +- **Performance:** Built-in plugins are designed to be as fast and + memory-efficient as possible, so that they don't unnecessarily slow down + builds. This is particularly important for large documentation projects with + thousands of pages. + + [mkdocs]: https://www.mkdocs.org/ + [design principles]: ../design-principles.md + [offline-capable documentation]: ../setup/building-for-offline-usage.md + +## Categories + +### Management + +The following plugins greatly improve the authoring experience when working on +documentation projects by providing better management capabilities, from the +management of plugins, multiple projects, and metadata, to the creation of +minimal reproductions for bug reports: + +<div class="grid cards" markdown> + +- :material-format-list-group:   __[Built-in group plugin][group]__ + + --- + + The group plugin allows to group plugins into logical units to conditionally + enable or disable them for specific environments with the use of + [environment variables][mkdocs.env]. + + --- + + __Optimal management of plugins when building in different environments__ + +- :material-file-tree:   __[Built-in meta plugin][meta]__ + + --- + + The meta plugin makes it easy to manage metadata (front matter) for all + pages in a folder, so a certain subset of pages uses specific tags or a + custom template. + + --- + + __Simpler organization, categorization and management of metadata__ + +- :material-folder-open:   __[Built-in projects plugin][projects]__ + + --- + + The projects plugin allows to split your main project into multiple distinct + projects, build them concurrently and preview them together as one. + + --- + + __Connect multiple projects together, and build them separately or as one__ + +- :material-information:   __[Built-in info plugin][info]__ + + --- + + The info plugin is a small and useful utility that helps to create + self-contained minimal reproductions, so we maintainers can fix reported + bugs more quickly. + + --- + + __Your bug reports are of the highest quality, so we can fix them as fast as + possible__ + + +</div> + + [group]: group.md + [info]: info.md + [meta]: meta.md + [projects]: projects.md + +### Optimization + +The following plugins are designed to help you build optimized documentation, +making it more accessible to your users through faster loading times, better +search engine rankings, beautiful preview images on social media, and GDPR +compliance with a few lines of configuration: + +<div class="grid cards" markdown> + +- :material-share-circle:   __[Built-in social plugin][social]__ + + --- + + The social plugin automatically generates beautiful and customizable + social cards for each page of your documentation, showing as previews on + social media. + + --- + + __Links to your site render beautiful social cards when shared on social + media__ + +- :material-rabbit:   __[Built-in optimize plugin][optimize]__ + + --- + + The optimize plugin automatically identifies and optimizes all media files + that you reference in your project by using compression and conversion + techniques. + + --- + + __Your site loads faster as smaller images are served to your users__ + +- :material-shield-account:   __[Built-in privacy plugin][privacy]__ + + --- + + The privacy plugin downloads external assets automatically for easy + self-hosting, allowing for GDPR compliance with a single line of + configuration. + + --- + + __Your documentation can be made GDPR compliant with minimal effort__ + +- :material-connection:   __[Built-in offline plugin][offline]__ + + --- + + The offline plugin adds support for building [offline-capable documentation], + so you can distribute the [`site` directory][mkdocs.site_dir] as a `.zip` + file that can be downloaded. + + --- + + __Your documentation can work without connectivity to the internet__ + +</div> + + [offline]: offline.md + [optimize]: optimize.md + [privacy]: privacy.md + [social]: social.md + +### Content + +The following plugins are designed to help you set up a blog, provide search +functionality to your users, add tags to pages and posts, and use the same +typesetting capabilities in specific parts of the documentation exactly as in +the main content: + +<div class="grid cards" markdown> + +- :material-newspaper-variant-outline:   __[Built-in blog plugin][blog]__ + + --- + + The blog plugin adds first-class support for blogging to Material for + MkDocs, either as a sidecar to your documentation or as a standalone + installation. + + --- + + __Your blog is built with the same powerful engine as your documentation__ + +- :material-magnify:   __[Built-in search plugin][search]__ + + --- + + The search plugin adds a search bar to the header, allowing users to search + the entire documentation, so it's easier for them to find what they're + looking for. + + --- + + __Your documentation is searchable without any external services, even + offline__ + +- :material-tag-text:   __[Built-in tags plugin][tags]__ + + --- + + The tags plugin adds first-class support for categorizing pages with tags, + adding the ability to group related pages to improve the discovery of + related content. + + --- + + __Your pages are categorized with tags, yielding additional context__ + +- :material-format-title:   __[Built-in typeset plugin][typeset]__ + + --- + + The typeset plugin allows to preserve the enriched presentation of titles + and headlines within the navigation and table of contents. + + --- + + __Sidebars preserve the same formatting as section titles in pages__ + +</div> + + [blog]: blog.md + [search]: search.md + [tags]: tags.md + [typeset]: typeset.md + +## Architecture + +### Multiple instances + +Several built-in plugins have support for multiple instances, which means that +they can be used multiple times in the same configuration file, allowing to +fine-tune behavior for separate sections of your project. Currently, the +following plugins have support for multiple instances: + +<div class="mdx-columns" markdown> + +- [Built-in blog plugin][blog] +- [Built-in group plugin][group] +- [Built-in optimize plugin][optimize] +- [Built-in privacy plugin][privacy] +- [Built-in social plugin][social] + +</div> diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/info.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/info.md new file mode 100644 index 0000000..b422daa --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/info.md @@ -0,0 +1,155 @@ +--- +title: Built-in info plugin +icon: material/information +--- + +# Built-in info plugin + +The info plugin is a utility that is solely intended to create self-contained +[minimal reproductions] as `.zip` files when [reporting bugs] or proposing +[change requests], making communication between us maintainers and you much +easier, as we have a common ground to work on. + + [minimal reproductions]: ../guides/creating-a-reproduction.md + [reporting bugs]: ../contributing/reporting-a-bug.md + [change requests]: ../contributing/requesting-a-change.md + +## Objective + +### How it works + +The plugin helps you to prepare a minimal reproduction by collecting the +necessary information about the environment and configuration of your project. +This makes it easier for us to fix bugs, as it requires that you +[upgrade to the latest version] and [remove your customizations]. + +When following these principles, you can be confident that you don't report a +bug that has already been fixed in a subsequent release, or which is caused by +one of your customizations. Even more importantly, you actively help +us to fix the bug as quickly as possible. + +The output of the plugin is a `.zip` file that you can share with us maintainers. + + [Upgrade to the latest version]: ../contributing/reporting-a-bug.md#upgrade-to-latest-version + [Remove your customizations]: ../contributing/reporting-a-bug.md#remove-customizations + + +### When to use it + +Whenever you're [reporting a bug][reporting bugs] or have something to discuss, +like a question or [change request][change requests], you should attach +a small, self-contained minimal reproduction. Runnable examples help to make +communication much more efficient, giving us maintainers more time to benefit +more users by pushing the project forward. Minimal reproductions are mandatory +for bug reports. + +## Configuration + +<!-- md:version 9.0.0 --> +<!-- md:plugin [info] – built-in --> + +In order to get started with the built-in info plugin, just add the following +lines to `mkdocs.yml`, and quickly [create a minimal reproduction] to share +with us maintainers: + +``` yaml +plugins: + - info +``` + +The info plugin is built into Material for MkDocs and doesn't need to be +installed. + + [info]: info.md + [create a minimal reproduction]: ../guides/creating-a-reproduction.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.0.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +It's normally not necessary to specify this setting, but if you want to disable +the plugin, use: + +``` yaml +plugins: + - info: + enabled: false +``` + + [building your project]: ../creating-your-site.md#building-your-site + +--- + +#### <!-- md:setting config.enabled_on_serve --> + +<!-- md:version 9.0.6 --> +<!-- md:default `false` --> + +Use this setting to control whether the plugin should be enabled when +[previewing your site]. It's normally not necessary to specify this setting, +but if you want to change this behavior, use: + +``` yaml +plugins: + - info: + enabled_on_serve: true +``` + +This setting streamlines the process of creating and inspecting minimal +reproductions, as it allows to quickly iterate on the reproduction without +having to disable the plugin first. + + [previewing your site]: ../creating-your-site.md#previewing-as-you-write + +### Archive + +--- + +#### <!-- md:setting config.archive --> + +<!-- md:version 9.0.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should create a `.zip` file +from the project or exit after the version check. This setting is solely +intended for debugging the plugin itself: + +``` yaml +plugins: + - info: + archive: false +``` + +--- + +#### <!-- md:setting config.archive_stop_on_violation --> + +<!-- md:version 9.0.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should stop creating the `.zip` +file when one of the [requirements] is not satisfied. This setting must only be +used when [reporting a bug][reporting bugs] that is related to a customization +[explicitly mentioned in our documentation]. You can change it with: + +``` yaml +plugins: + - info: + archive_stop_on_violation: false +``` + +If you're using this setting when [reporting a bug][reporting bugs], please +explain why you think it is necessary to include customizations. If you're +unsure, please ask us first by [creating a discussion]. + + [requirements]: #how-it-works + [explicitly mentioned in our documentation]: ?q=%22extends+base%22 + [creating a discussion]: https://github.com/squidfunk/mkdocs-material/discussions diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/meta.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/meta.md new file mode 100644 index 0000000..4ef92ff --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/meta.md @@ -0,0 +1,192 @@ +--- +title: Built-in meta plugin +icon: material/file-tree +--- + +# Built-in meta plugin + +The meta plugin solves the problem of setting metadata (front matter) for all +pages in a folder, i.e., a subsection of your project, which is particularly +useful to ensure that a certain subset of pages features specific tags, uses a +custom template, or is attributed to an author. + +## Objective + +### How it works + +The plugin scans the [`docs` directory][mkdocs.docs_dir] for `.meta.yml` files, +and recursively merges the contents of those files with the metadata (front +matter) of all pages that are contained in the same folder and all subfolders. +For example, if you want to add the tag <span class="md-tag">Example</span> to +multiple pages, use: + +``` yaml title=".meta.yml" +tags: + - Example +``` + +Now, given the following directory layout, if you store the file in the folder +named `example`, all pages in that folder receive the tag, while all pages +outside of the folder remain unaffected: + +``` { .sh .no-copy hl_lines="4-8" } +. +├─ docs/ +│ ├─ ... +│ ├─ example/ +│ │ ├─ .meta.yml +│ │ ├─ a.md +│ │ ├─ ... +│ │ └─ z.md +│ └─ ... +└─ mkdocs.yml +``` + +When combining metadata, lists and dictionaries are recursively merged, which +means you can append values to a list and add or set specific properties in a +dictionary on arbitrary levels. + +### When to use it + +While the plugin itself doesn't offer much functionality beyond adding and +merging metadata, it is a perfect companion for many of the other built-in +plugins that Material for MkDocs offers. Some of the most powerful combinations +of the meta plugin and other built-in plugins are: + +<div class="grid cards" markdown> + +- :material-share-circle:   __[Built-in social plugin][social]__ + + --- + + The meta plugin can be used to [change the layout] for social cards or + [change specific layout options] like [background] or [color] + for a subset of pages. + + ``` yaml title=".meta.yml" + social: + cards_layout: default/variant + ``` + +- :material-newspaper-variant-outline:   __[Built-in blog plugin][blog]__ + + --- + + The meta plugin allows to automatically associate blog posts with specific + [authors] and [categories], ensuring that blog posts are always correctly + annotated. + + ``` yaml title=".meta.yml" + authors: + - squidfunk + ``` + +- :material-tag-text:   __[Built-in tags plugin][tags]__ + + --- + + The meta plugin makes it possible to ensure that subsections of your + project are annotated with [specific tags], so they can't be forgotten when + adding pages. + + ``` yaml title=".meta.yml" + tags: + - Example + ``` + +- :material-magnify:   __[Built-in search plugin][search]__ + + --- + + The meta plugin makes it easy to [boost] specific sections in search results + or to [exclude] them entirely from being indexed, giving more granular + control over search. + + ``` yaml title=".meta.yml" + search: + exclude: true + ``` + +</div> + + [social]: social.md + [change the layout]: social.md#meta.social.cards_layout + [change specific layout options]: social.md#meta.social.cards_layout_options + [background]: social.md#option.background_color + [color]: social.md#option.color + [blog]: blog.md + [authors]: blog.md#meta.authors + [categories]: blog.md#meta.categories + [tags]: tags.md + [specific tags]: tags.md#meta.tags + [search]: search.md + [exclude]: search.md#meta.search.exclude + [boost]: search.md#meta.search.boost + +## Configuration + +<!-- md:version 9.6.0 --> +<!-- md:plugin [meta] – built-in --> +<!-- md:flag experimental --> + +As with all [built-in plugins], getting started with the meta plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and start +applying metadata for multiple pages at once: + +``` yaml +plugins: + - meta +``` + +The meta plugin is included with Material for MkDocs and doesn't need to be +installed. + + [meta]: meta.md + [built-in plugins]: index.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.6.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +It's normally not necessary to specify this setting, but if you want to disable +the plugin, use: + +``` yaml +plugins: + - meta: + enabled: false +``` + + [building your project]: ../creating-your-site.md#building-your-site + +### Meta file + +The following settings are available for meta files: + +--- + +#### <!-- md:setting config.meta_file --> + +<!-- md:version 9.6.0 --> +<!-- md:default `.meta.yml` --> + +Use this setting to change the meta file name the plugin will look for when +scanning the [`docs` directory][mkdocs.docs_dir]. It's normally not necessary to +change this setting, but if you want to change it, use: + +``` yaml +plugins: + - meta: + meta_file: .meta.yml +``` + +The provided path is resolved from the [`docs` directory][mkdocs.docs_dir] +recursively. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/offline.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/offline.md new file mode 100644 index 0000000..243954d --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/offline.md @@ -0,0 +1,154 @@ +--- +title: Built-in offline plugin +icon: material/connection +--- + + +# Built-in offline plugin + +[MkDocs][mkdocs] is one of the few frameworks that supports building +offline-capable documentation that can be directly viewed by the user – no +server needed. With the offline plugin, you can distribute the +[`site` directory][mkdocs.site_dir] as a downloadable `.zip` file while +retaining most interactive functionality. + +## Objective + +### How it works + +After [building your project], switch to the [`site` directory][mkdocs.site_dir] +and open `index.html` in your browser – you're now viewing your documentation +from your local file system! Most browsers will denote this by showing `file://` +in the address bar. However, you'll realize that the site search is gone. + +Material for MkDocs offers many interactive features, some of which will not +work from the local file system due to the restrictions of modern browsers. More +specifically and technically, all calls to the [Fetch API] will error with a +message like: + +``` +Cross origin requests are only supported for protocol schemes: http, [...] +``` + +While browsers impose those restriction for security reasons, it reduces the +interactivity of your project. The offline plugin makes sure that site search +keeps working by moving the search index to a JavaScript file, and leveraging +@squidfunk's [iframe-worker] shim. + +Additionally, the plugin automatically disables the [`use_directory_urls`] +[mkdocs.use_directory_urls] setting, ensuring that users can open your +documentation directly from the local file system. + +There are some [limitations]. + + [building your project]: ../creating-your-site.md#building-your-site + [Fetch API]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API + [iframe-worker]: https://github.com/squidfunk/iframe-worker + [limitations]: #limitations + +### When to use it + +As the name already indicates, the plugin should only be used when you're +[building your project] for offline distribution. It's also good to know, that +the offline plugin plays nicely with the following other plugins, helping to +create even better offline-capable documentation: + +<div class="grid cards" markdown> + +- :material-shield-account:   __[Built-in privacy plugin][privacy]__ + + --- + + The privacy plugin makes it easy to use external assets when building for + offline usage, as it automatically downloads them for distribution with + your documentation. + + --- + + __Your documentation can work without connectivity to the internet[^1]__ + +- :material-rabbit:   __[Built-in optimize plugin][optimize]__ + + --- + + The optimize plugin automatically identifies and optimizes all media files + that you reference in your project by using compression and conversion + techniques. + + --- + + __Your documentation can be distributed as a smaller `.zip` download__ + +</div> + + [^1]: + You might wonder why the [privacy plugin][privacy] is necessary to build + truly offline-capable documentation with the offline plugin. While it's + certainly possible to also add support for downloading external assets to + the offline plugin, this functionality is already fully implemented in the + privacy plugin and is its very raison d'être. + + Material for MkDocs follows a modular approach for its plugin system – many + of the plugins work perfectly together and enhance each others + functionalities, allowing to solve complex problems with a few lines + of configuration. + + [privacy]: privacy.md + [optimize]: optimize.md + +## Configuration + +<!-- md:version 9.0.0 --> +<!-- md:plugin [offline] – built-in --> + +As with all [built-in plugins], getting started with the offline plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and start +building offline-capable documentation: + +``` yaml +plugins: + - offline +``` + +The offline plugin is built into Material for MkDocs and doesn't need to be +installed. + + [offline]: offline.md + [built-in plugins]: index.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.0.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +If you want to build online- as well as offline-capable documentation, it's a +good idea to use an [environment variable][mkdocs.env]: + +``` yaml +plugins: + - offline: + enabled: !ENV [OFFLINE, false] +``` + +## Limitations + +When enabling the offline plugin, make sure to disable the following settings, +as they make use of the [Fetch API] which will error when invoked from the local +file system: + +- [Instant loading] +- [Site analytics] +- [Versioning] +- [Comment systems] + + [Instant loading]: ../setup/setting-up-navigation.md#instant-loading + [Site analytics]: ../setup/setting-up-site-analytics.md + [Versioning]: ../setup/setting-up-versioning.md + [Comment systems]: ../setup/adding-a-comment-system.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/optimize.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/optimize.md new file mode 100644 index 0000000..6b30e1a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/optimize.md @@ -0,0 +1,427 @@ +--- +title: Built-in optimize plugin +icon: material/rabbit +--- + +# Built-in optimize plugin + +The optimize plugin automatically identifies and optimizes all media files when +[building your project] by using common compression and conversion techniques. +As a result, your site loads significantly faster and yields better rankings in +search engines. + + [building your project]: ../creating-your-site.md#building-your-site + +## Objective + +### How it works + +The plugin scans the [`docs` directory][mkdocs.docs_dir] for media files and +assets, optimizing them automatically in order to reduce the final size of the +[`site` directory][mkdocs.site_dir]. This leads to faster loading times as you +ship less bytes to your users, as well as a smaller download for +[offline-capable documentation]. + +Optimized images are [intelligently cached][intelligent caching], which is why +the plugin will only optimize media files that changed since the last build. +This makes it possible to swap out or update images, without having to worry +about optimizing them, or even worse, forgetting to do so. + +In order to optimize media files, a few [dependencies] need to be available on +your system. + + [offline-capable documentation]: ../setup/building-for-offline-usage.md + [dependencies]: #configuration + +### When to use it + +It's generally recommended to use the plugin, as media files are optimized +automatically without the need for intervention, ensuring that your site loads +as fast as possible. Optimized media files are one of the key components for a +high and consistent ranking in search engines. + +Additionally, the plugin can be combined with other built-in plugins +that Material for MkDocs offers, in order to create sophisticated +build pipelines tailored to your project: + +<div class="grid cards" markdown> + +- :material-shield-account:   __[Built-in privacy plugin][privacy]__ + + --- + + The privacy plugin makes it easy to use unoptimized external assets, passing + them to the optimize plugin before copying them to the [`site` directory] + [mkdocs.site_dir]. + + --- + + __External media files can be automatically downloaded and optimized__ + +- :material-connection:   __[Built-in offline plugin][offline]__ + + --- + + The offline plugin adds support for building offline-capable documentation, + so you can distribute the [`site` directory][mkdocs.site_dir] as a `.zip` + file that can be downloaded. + + --- + + __Your documentation can be distributed as a smaller `.zip` download__ + +</div> + + [privacy]: privacy.md + [offline]: offline.md + +## Configuration + +<!-- md:version 9.7.0 --> +<!-- md:plugin [optimize] – built-in --> +<!-- md:flag multiple --> +<!-- md:flag experimental --> + +As with all [built-in plugins], getting started with the optimize plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and observe how +media files are optimized automatically: + +``` yaml +plugins: + - optimize +``` + +The optimize plugin is built into Material for MkDocs and doesn't need to be +installed. + +However, in order to optimize all media files, it's necessary to install the +dependencies for [image processing], if they're not already available on your +system. The linked guide includes instructions for several operating systems +and mentions some alternative environments. + + [optimize]: optimize.md + [built-in plugins]: index.md + [image processing]: requirements/image-processing.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +If you want to disable the plugin, e.g., for local builds, you can use an +[environment variable][mkdocs.env] in `mkdocs.yml`: + +``` yaml +plugins: + - optimize: + enabled: !ENV [CI, false] +``` + +This configuration enables the plugin only during continuous integration (CI). + +--- + +#### <!-- md:setting config.concurrency --> + +<!-- md:version 9.7.0 --> +<!-- md:default available CPUs - 1 --> + +With more CPUs available, the plugin can do more work in parallel, and thus +complete media file optimization faster. If you want to disable concurrent +processing completely, use: + +``` yaml +plugins: + - optimize: + concurrency: 1 +``` + +By default, the plugin uses all available CPUs - 1 with a minimum of 1. + +### Caching + +The plugin implements an [intelligent caching] mechanism, ensuring that a media +file or asset is only passed through the optimization pipeline when its contents +change. If you swap out or update an image, the plugin detects it and updates +the optimized version of the media file. + +The following settings are available for caching: + + [intelligent caching]: requirements/caching.md + +--- + +#### <!-- md:setting config.cache --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to instruct the plugin to bypass the cache, in order to +re-optimize all media files, even though the cache may not be stale. It's +normally not necessary to specify this setting, except for when debugging +the plugin itself. Caching can be disabled with: + +``` yaml +plugins: + - optimize: + cache: false +``` + +--- + +#### <!-- md:setting config.cache_dir --> + +<!-- md:version 9.7.0 --> +<!-- md:default `.cache/plugin/optimize` --> + +It is normally not necessary to specify this setting, except for when you want +to change the path within your root directory where media files are cached. +If you want to change it, use: + +``` yaml +plugins: + - optimize: + cache_dir: my/custom/dir +``` + +If you're using [multiple instances] of the plugin, it can be a good idea to +set different cache directories for both instances, so that they don't interfere +with each other. + + [multiple instances]: index.md#multiple-instances + +### Optimization + +Documentation often makes use of screenshots or diagrams for better +visualization of things, both of which are prime candidates for optimization. +The plugin automatically optimizes images using [pngquant] for `.png` files, +and [Pillow] for `.jpg` files. + +The following settings are available for optimization: + + [pngquant]: https://pngquant.org/ + [Pillow]: https://pillow.readthedocs.io/ + +--- + +#### <!-- md:setting config.optimize --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable media file optimization. Currently, +the plugin's sole purpose is to optimize media files, so it's equivalent to the +[`enabled`][config.enabled] setting, but in the near future, other features +might be added. If you want to disable optimization, use: + +``` yaml +plugins: + - optimize: + optimize: false +``` + +--- + +#### <!-- md:setting config.optimize_png --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the optimization of `.png` files. It's +normally not necessary to specify this setting, but if you want to disable +the optimization of `.png` files, use: + +``` yaml +plugins: + - optimize: + optimize_png: false +``` + +--- + +#### <!-- md:setting config.optimize_png_speed --> + +<!-- md:version 9.7.0 --> +<!-- md:default `3` of `1-10` --> + +Use this setting to specify the speed/quality tradeoff that [pngquant] applies +when optimizing `.png` files. The lower the number, the more aggressively +[pngquant] will try to optimize: + +=== "Slower <small>smaller</small>" + + ``` yaml + plugins: + - optimize: + optimize_png_speed: 1 + ``` + +=== "Faster <small>larger</small>" + + ``` yaml + plugins: + - optimize: + optimize_png_speed: 10 + ``` + +A factor of `10` has 5% lower quality, but is 8x faster than the default `3`. + +--- + +#### <!-- md:setting config.optimize_png_strip --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to specify whether [pngquant] should strip optional metadata +from `.png` files that are not required to display the image, e.g., [EXIF]. +If you want to preserve metadata, use: + +``` yaml +plugins: + - optimize: + optimize_png_strip: false +``` + + [EXIF]: https://en.wikipedia.org/wiki/Exif + +--- + +#### <!-- md:setting config.optimize_jpg --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the optimization of `.jpg` files. It's +normally not necessary to specify this setting, but if you want to disable +the optimization of `.jpg` files, use: + +``` yaml +plugins: + - optimize: + optimize_jpg: false +``` + +--- + +#### <!-- md:setting config.optimize_jpg_quality --> + +<!-- md:version 9.7.0 --> +<!-- md:default `60` of `0-100` --> + +Use this setting to specify the image quality that [Pillow] applies when +optimizing `.jpg` files. If the images look blurry, it's a good idea to +fine-tune and change this setting: + +``` yaml +plugins: + - optimize: + optimize_jpg_quality: 75 +``` + +--- + +#### <!-- md:setting config.optimize_jpg_progressive --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to specify whether [Pillow] should use progressive encoding +when optimizing `.jpg` files, rendering faster on slow connections. If you want +to disable progressive encoding, use: + +``` yaml +plugins: + - optimize: + optimize_jpg_progressive: false +``` + + [progressive encoding]: https://medium.com/hd-pro/jpeg-formats-progressive-vs-baseline-73b3938c2339 + +--- + +#### <!-- md:setting config.optimize_include --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to enable media file optimization for specific directories +of your project, e.g., when using [multiple instances] of the plugin to optimize +media files differently: + +``` yaml +plugins: + - optimize: + optimize_include: + - screenshots/* +``` + +This configuration enables optimization for all media files that are contained +in the `screenshots` folder and its subfolders inside the [`docs` directory] +[mkdocs.docs_dir]. + +--- + +#### <!-- md:setting config.optimize_exclude --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to disable media file optimization for specific directories +of your project, e.g., when using [multiple instances] of the plugin to optimize +media files differently: + +``` yaml +plugins: + - social: + optimize_exclude: + - vendor/* +``` + +This configuration disables optimization for all media files that are contained +in the `vendor` folder and its subfolders inside the [`docs` directory] +[mkdocs.docs_dir]. + +### Reporting + +The following settings are available for reporting: + +--- + +#### <!-- md:setting config.print_gain --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should print the number of bytes +gained after optimizing each file. If you want to disable this behavior, use: + +``` yaml +plugins: + - optimize: + print_gain: false +``` + +--- + +#### <!-- md:setting config.print_gain_summary --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should print the total number of +bytes gained after optimizing all files. If you want to disable this behavior, +use: + +``` yaml +plugins: + - optimize: + print_gain_summary: false +``` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/privacy.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/privacy.md new file mode 100644 index 0000000..d68f3b9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/privacy.md @@ -0,0 +1,497 @@ +--- +title: Built-in privacy plugin +icon: material/shield-account +--- + + +# Built-in privacy plugin + +The privacy plugin offers a streamlined solution for automatically self-hosting +external assets. With just a single line of configuration, the plugin can +automatically identify and download external assets, making GDPR compliance +as effortless as it can possibly be. + +## Objective + +### How it works + +The plugin scans the generated HTML for external assets, i.e., scripts, style +sheets, images, and web fonts, downloads them, stores them in the +[`site` directory][mkdocs.site_dir] and replaces all references with links to +the downloaded copies for effortless self-hosting. For example: + +``` html +<script src="https://example.com/script.js"></script> +``` + +This external script is downloaded, and the link is replaced with: + +``` html +<script src="assets/external/example.com/script.js"></script> +``` + +Of course, scripts and style sheets can reference further external assets, +which is why this process is repeated recursively until no further external +assets are detected: + +- Scripts are scanned for further scripts, style sheets and JSON files +- Style sheets are scanned for images and web fonts + +Additionally, hints like [`preconnect`][preconnect], used to reduce latency when +requesting external assets, are removed from the output, as they're not +necessary when self-hosting. After the plugin has done its work, your project +will be free of requests to external services. + +There are some [limitations]. + + [preconnect]: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preconnect + [limitations]: #limitations + +### When to use it + +The plugin was developed to make compliance with the 2018 European +__General Data Protection Regulation__ (GDPR) as simple as possible, while +retaining the flexibility and power that Material for MkDocs offers, like for +example its tight integration with [Google Fonts]. + +But, that's only the start. For example, if your project includes a lot of +images, enabling the plugin allows to move them outside of your repository, as +the plugin will automatically download and store them in the [`site` directory] +[mkdocs.site_dir] when [building your project]. + +Even more interestingly, the plugin can be combined with other built-in plugins +that Material for MkDocs offers, in order to create sophisticated build +pipelines tailored to your project: + +<div class="grid cards" markdown> + +- :material-rabbit:   __[Built-in optimize plugin][optimize]__ + + --- + + The optimize plugin allows to optimize all downloaded external assets + detected by the privacy plugin by using compression and conversion + techniques. + + --- + + __External media files are automatically downloaded and optimized__ + +- :material-connection:   __[Built-in offline plugin][offline]__ + + --- + + The offline plugin adds support for building [offline-capable documentation], + so you can distribute the [`site` directory][mkdocs.site_dir] as a `.zip` + file that can be downloaded. + + --- + + __Your documentation can work without connectivity to the internet__ + +</div> + + [Google Fonts]: ../setup/changing-the-fonts.md + [building your project]: ../creating-your-site.md#building-your-site + [optimize]: optimize.md + [offline]: offline.md + [offline-capable documentation]: ../setup/building-for-offline-usage.md + +## Configuration + +<!-- md:version 9.5.0 --> +<!-- md:plugin [privacy] – built-in --> +<!-- md:flag multiple --> +<!-- md:flag experimental --> + +As with all [built-in plugins], getting started with the privacy plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and start +effortlessly self-hosting external assets: + +``` yaml +plugins: + - privacy +``` + +The privacy plugin is built into Material for MkDocs and doesn't need to be +installed. + + [privacy]: privacy.md + [built-in plugins]: index.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.5.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +If you want to disable the plugin, e.g., for local builds, you can use an +[environment variable][mkdocs.env] in `mkdocs.yml`: + +``` yaml +plugins: + - privacy: + enabled: !ENV [CI, false] +``` + +This configuration enables the plugin only during continuous integration (CI). + +--- + +#### <!-- md:setting config.concurrency --> + +<!-- md:version 9.5.0 --> +<!-- md:default available CPUs - 1 --> + +With more CPUs available, the plugin can do more work in parallel, and thus +complete handling of external assets faster. If you want to disable concurrent +processing completely, use: + +``` yaml +plugins: + - privacy: + concurrency: 1 +``` + +By default, the plugin uses all available CPUs - 1 with a minimum of 1. + +### Caching + +The plugin implements an [intelligent caching] mechanism, ensuring that external +assets are only downloaded when they're not already contained in the cache. +While the initial build might take some time, it's a good idea to use caching, +as it will speed up consecutive builds. + +The following settings are available for caching: + + [intelligent caching]: requirements/caching.md + +--- + +#### <!-- md:setting config.cache --> + +<!-- md:version 9.5.0 --> +<!-- md:default `true` --> + +Use this setting to instruct the plugin to bypass the cache, in order to +re-schedule downloads for all external assets, even though the cache may not be +stale. It's normally not necessary to specify this setting, except for when +debugging the plugin itself. Caching can be disabled with: + +``` yaml +plugins: + - privacy: + cache: false +``` + +--- + +#### <!-- md:setting config.cache_dir --> + +<!-- md:version 9.5.0 --> +<!-- md:default `.cache/plugin/privacy` --> + +It is normally not necessary to specify this setting, except for when you want +to change the path within your root directory where downloaded copies are +cached. If you want to change it, use: + +``` yaml +plugins: + - privacy: + cache_dir: my/custom/dir +``` + +If you're using [multiple instances] of the plugin, it can be a good idea to +set different cache directories for both instances, so that they don't interfere +with each other. + + [multiple instances]: index.md#multiple-instances + +### Logging + +The following settings are available for logging: + +--- + +#### <!-- md:setting config.log --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should display log messages when +building your site. While not being recommended, you can disable logging with: + +``` yaml +plugins: + - privacy: + log: false +``` + +--- + +#### <!-- md:setting config.log_level --> + +<!-- md:version 9.7.0 --> +<!-- md:default `info` --> + +Use this setting to control the log level that the plugin should employ when +encountering errors, which requires that the [`log`][config.log] setting is +enabled. The following log levels are available: + +=== "`error`" + + ``` yaml + plugins: + - privacy: + log_level: error + ``` + + Only errors are reported. + +=== "`warn`" + + ``` yaml + plugins: + - privacy: + log_level: warn + ``` + + Errors and warnings are reported, terminating the build in + [`strict`][mkdocs.strict] mode. This includes warnings when symlinks cannot + be created due to a lack of permissions on Windows systems (#6550). + +=== "`info`" + + ``` yaml + plugins: + - privacy: + log_level: info + ``` + + Errors, warnings and informational messages are reported, including which + assets were successfully downloaded by the plugin. + +=== "`debug`" + + ``` yaml + plugins: + - privacy: + log_level: debug + ``` + + All messages are reported, including debug messages, if and only if MkDocs + was started with the `--verbose` flag. Note that this will print a lot of + messages and is only useful for debugging. + +### External assets + +The following settings are available for external assets: + +--- + +#### <!-- md:setting config.assets --> + +<!-- md:version 9.5.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should download external +assets. If you only want the plugin to process [external links], you can disable +handling of external assets with: + +``` yaml +plugins: + - privacy: + assets: false +``` + + [external links]: #external-links + +--- + +#### <!-- md:setting config.assets_fetch --> + +<!-- md:version 9.5.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should downloads or only report +external assets when they're encountered. If you already self-host all external +assets, this setting can be used as a safety net to detect links to external +assets placed by the author in pages: + +``` yaml +plugins: + - privacy: + assets_fetch: true +``` + +--- + +#### <!-- md:setting config.assets_fetch_dir --> + +<!-- md:version 9.5.0 --> +<!-- md:default `assets/external` --> + +It is normally not necessary to specify this setting, except for when you want +to change the path within the [`site` directory][mkdocs.site_dir] where +external assets are stored. If you want to change it, use: + +``` yaml +plugins: + - privacy: + assets_fetch_dir: my/custom/dir +``` + +This configuration stores the downloaded copies at `my/custom/dir` in the +[`site` directory][mkdocs.site_dir]. + +--- + +#### <!-- md:setting config.assets_include --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to enable downloading of external assets for specific origins, +e.g., when using [multiple instances] of the plugin to fine-tune processing of +external assets for different origins: + +``` yaml +plugins: + - privacy: + assets_include: + - unsplash.com/* +``` + +--- + +#### <!-- md:setting config.assets_exclude --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to disable downloading of external assets for specific origins, +e.g., when using [multiple instances] of the plugin to fine-tune processing of +external assets for different origins: + +``` yaml +plugins: + - privacy: + assets_exclude: # (1)! + - unpkg.com/mathjax@3/* + - giscus.app/* +``` + +1. [MathJax] loads web fonts for typesetting of mathematical content + through relative URLs, and thus cannot be automatically bundled by the + privacy plugin. [MathJax can be self-hosted]. + + [Giscus], which we recommend to use as a [comment system], uses a technique + called code-splitting to load only the code that is necessary, which + is implemented via relative URLs. [Giscus can be self-hosted] as well. + + [MathJax]: ../reference/math.md + [MathJax can be self-hosted]: https://docs.mathjax.org/en/latest/web/hosting.html + [Giscus]: https://giscus.app/ + [comment system]: ../setup/adding-a-comment-system.md + [Giscus can be self-hosted]: https://github.com/giscus/giscus/blob/main/SELF-HOSTING.md + +--- + +### External links + +The following settings are available for external links: + +--- + +#### <!-- md:setting config.links --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to instruct the plugin to parse and process external links to +annotate them for [improved security], or to automatically add additional +attributes to external links. If you want to disable processing of external +links, use: + +``` yaml +plugins: + - privacy: + links: false +``` + + [improved security]: https://developer.chrome.com/en/docs/lighthouse/best-practices/external-anchors-use-rel-noopener/ + +--- + +#### <!-- md:setting config.links_attr_map --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to specify additional attributes that should be added to +external links, for example, to add `target="_blank"` to all external links +so they open in a new tab: + +``` yaml +plugins: + - privacy: + links_attr_map: + target: _blank +``` + +--- + +#### <!-- md:setting config.links_noopener --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +It is normally not recommended to change this setting, as it will automatically +annotate external links that open in a new window with `rel="noopener"` for +[improved security]: + +``` yaml +plugins: + - privacy: + links_noopener: true +``` + +## Limitations + +### Dynamic URLs + +Dynamically created URLs as part of scripts are not detected, and thus cannot be +downloaded automatically, as the plugin does not execute scripts – it only detects fully qualified URLs for downloading and replacement. In short, don't do this: + +``` js +const host = "https://example.com" +const path = `${host}/script.js` +``` + +Instead, always use fully qualified URLs: + +``` js +const url ="https://example.com/script.js" +``` + +### Embedded HTML + +By default, embedded HTML files (e.g. in iframes) are not scanned for external +assets. This is a limitation of MkDocs, as it considers `.html` files to be +templates, which must be explicitly listed under +[`extra_templates`][mkdocs.extra_templates]. Thus, to self-host external assets +of an embedded HTML file: + +``` yaml +extra_templates: + - iframe.html +``` + +Note that the path to `iframe.html` is relative to the +[`docs_dir`][mkdocs.docs_dir] directory. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/projects.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/projects.md new file mode 100644 index 0000000..5a36247 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/projects.md @@ -0,0 +1,444 @@ +--- +title: Built-in projects plugin +icon: material/folder-open +status: deprecated +--- + +# Built-in projects plugin + +The projects plugin adds the ability to split your main project into multiple +distinct projects, build them concurrently and preview them together as one. +This is particularly useful when creating a multi-language project, but can also +be used to split very large projects into smaller parts. + +!!! bug "The built-in projects plugin is deprecated" + + [Material for MkDocs is in maintenance mode]. The projects plugin, which was + formely part of the [Insiders] edition, was released in <!-- md:version 9.7.0 -->, the last release that includes all features from the Insiders edition. + Unfortunately, the projects plugin turned out impossible to maintain, and + was one of the key motivators to create [Zensical]. + + --- + + __If you're considering the projects plugin, please be aware that known issues will <u>not</u> be fixed.__ + + [Material for MkDocs is in maintenance mode]: https://github.com/squidfunk/mkdocs-material/issues/8523 + [Zensical]: ../blog/posts/zensical.md + [Insiders]: ../insiders/index.md + +## Objective + +### How it works + +The plugin scans the configured [`projects` directory][config.projects_dir] for +`mkdocs.yml` files, identifies all nested projects and builds them concurrently. +If not configured otherwise, the plugin expects that your project has +the following directory layout, e.g. for a multi-language project: + +``` { .sh .no-copy } +. +├─ docs/ +├─ projects/ +│ ├─ en/ +│ │ ├─ docs/ +│ │ └─ mkdocs.yml +│ └─ de/ +│ ├─ docs/ +│ └─ mkdocs.yml +└─ mkdocs.yml +``` + +One of the most useful and interesting features of the plugin is that it allows +[previewing your site] from the main project, while still being able to preview +and build each project individually. This is especially useful for +multi-language projects. + +If, when [previewing your site], you change a file in one of the projects, the +plugin only rebuilds this project and makes sure that MkDocs will also reload +the associated files. This also creates the opportunity for splitting your +main project into several projects for a better editing experience. + +There are some [limitations], but we're working hard to remove them. + + [previewing your site]: ../creating-your-site.md#previewing-as-you-write + [limitations]: #limitations + +### When to use it + +The plugin came into existence because we needed a convenient and scalable +method to build our [examples] repository, which features many self-contained +and runnable projects that users can download and use as a basis when +bootstrapping a new project or [creating a reproduction]. + +When you want to create a multi-language project, or have a very large existing +project, you might consider using the plugin, as it makes managing, editing +and building more comfortable. + + [examples]: https://github.com/mkdocs-material/examples + [creating a reproduction]: ../guides/creating-a-reproduction.md + +## Configuration + +<!-- md:version 9.7.0 --> +<!-- md:plugin [projects] – built-in --> +<!-- md:flag experimental --> + +In order to get started with the projects plugin, just add the following lines +to `mkdocs.yml`, and split your main project into several distinct projects that +can be built concurrently: + +``` yaml +plugins: + - projects +``` + +The projects plugin is built into Material for MkDocs and doesn't need to be +installed. + + [projects]: projects.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +If you want to disable the plugin, e.g., for local builds, you can use an +[environment variable][mkdocs.env] in `mkdocs.yml`: + +``` yaml +plugins: + - projects: + enabled: !ENV [CI, false] +``` + +This configuration enables the plugin only during continuous integration (CI). + + [building your project]: ../creating-your-site.md#building-your-site + +--- + +#### <!-- md:setting config.concurrency --> + +<!-- md:version 9.7.0 --> +<!-- md:default available CPUs - 1 --> + +With more CPUs available, the plugin can do more work in parallel, and thus +build projects faster. If you want to disable concurrent processing completely, +use: + +``` yaml +plugins: + - projects: + concurrency: 1 +``` + +By default, the plugin uses all available CPUs - 1 with a minimum of 1. + +### Caching + +The plugin implements an [intelligent caching] mechanism, ensuring that a +project is only rebuilt when its contents change. While the initial build might +take some time, it's a good idea to use caching, as it will speed up consecutive +builds. + +The following settings are available for caching: + + [intelligent caching]: requirements/caching.md + +--- + +#### <!-- md:setting config.cache --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to instruct the plugin to bypass the cache, in order to +rebuild all projects, even though the cache may not be stale. It's normally not +necessary to specify this setting, except for when debugging the plugin itself. +Caching can be disabled with: + +``` yaml +plugins: + - projects: + cache: false +``` + +--- + +#### <!-- md:setting config.cache_dir --> + +<!-- md:version 9.7.0 --> +<!-- md:default `.cache/plugin/projects` --> + +It is normally not necessary to specify this setting, except for when you want +to change the path within your root directory where the metadata is cached. +If you want to change it, use: + +``` yaml +plugins: + - projects: + cache_dir: my/custom/dir +``` + +### Logging + +The following settings are available for logging: + +--- + +#### <!-- md:setting config.log --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should display log messages from +projects when building your site. While not being recommended, you can disable +logging with: + +``` yaml +plugins: + - projects: + log: false +``` + +--- + +#### <!-- md:setting config.log_level --> + +<!-- md:version 9.7.0 --> +<!-- md:default `info` --> + +Use this setting to control the log level that the plugin should employ when +encountering errors, which requires that the [`log`][config.log] setting is +enabled. The following log levels are available: + +=== "`error`" + + ``` yaml + plugins: + - projects: + log_level: error + ``` + + Only errors are reported. + +=== "`warn`" + + ``` yaml + plugins: + - projects: + log_level: warn + ``` + + Errors and warnings are reported, terminating the build in + [`strict`][mkdocs.strict] mode. + +=== "`info`" + + ``` yaml + plugins: + - projects: + log_level: info + ``` + + Errors, warnings and informational messages are reported. + +=== "`debug`" + + ``` yaml + plugins: + - projects: + log_level: debug + ``` + + All messages are reported, including debug messages. + +### Projects + +The following settings are available for projects: + +--- + +#### <!-- md:setting config.projects --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable building of projects. Currently, the +plugin's sole purpose is to build projects, so it's equivalent to the +[`enabled`][config.enabled] setting, but in the future, other features might be +added. If you want to disable building of projects, use: + +``` yaml +plugins: + - projects: + projects: false +``` + +--- + +#### <!-- md:setting config.projects_dir --> + +<!-- md:version 9.7.0 --> +<!-- md:default `projects` --> + +Use this setting to change the folder where your projects are located. It's +normally not necessary to change this setting, but if you want to rename the +folder or change its file system location, use: + +``` yaml +plugins: + - projects: + projects_dir: projects +``` + +Note that the [`projects` directory][config.projects_dir] is solely used for +project organization – it is not included in project URLs, since projects are +automatically hoisted by the plugin. + +The provided path is resolved from the root directory. + +--- + +#### <!-- md:setting config.projects_config_files --> + +<!-- md:version 9.7.0 --> +<!-- md:default `*/mkdocs.yml` --> + +Use this setting to change the location or name of configuration files the +plugin will look for when scanning the [`projects` directory] +[config.projects_dir]. Adjusting this setting can be necessary when the +configuration files are located in subdirectories of projects, e.g. +`docs/mkdocs.yml`: + +``` yaml +plugins: + - projects: + projects_config_files: "**/mkdocs.yml" # (1)! +``` + +1. If all projects share the same location for their configuration files, e.g., + `docs/mkdocs.yml`, it's advisable to fully qualify the path, as it's faster + to resolve than a `**` glob pattern. + + ``` yaml + plugins: + - projects: + projects_config_files: "*/docs/mkdocs.yml" + ``` + + This configuration fits the following directory structure, which is quite + common for projects using git submodules: + + ``` { .sh .no-copy } + . + ├─ docs/ + ├─ projects/ + │ ├─ git-submodule-a/ + │ │ └─ docs/ + │ │ └─ mkdocs.yml + │ └─ git-submodule-b/ + │ └─ docs/ + │ └─ mkdocs.yml + └─ mkdocs.yml + ``` + +The provided path is resolved from the [`projects` directory] +[config.projects_dir]. + +--- + +#### <!-- md:setting config.projects_config_transform --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to transform the configuration of each project as read from +`mkdocs.yml` before it is built, which allows for adjusting the configuration +of each project when building them together, but leave them untouched when +building them individually: + +``` yaml +plugins: + - projects: + projects_config_transform: !!python/name:projects.transform +``` + +The provided module and function name are looked up in Python's [module search +path]. You need to add your root directory to the search path when building +your site, so Python can resolve it. The easiest way is to add the working +directory to the [`PYTHONPATH`][PYTHONPATH] environment variable: + +``` .sh +export PYTHONPATH=. +``` + +!!! tip "How to define a configuration transformation function" + + The [`python/name`][python-name] tag is provided by [PyYAML] and must point + to a valid module and function name within Python's [module search path]. + The plugin passes the `project` and top-level `config` objects to the + function. + + As an example, we can inherit the [`use_directory_urls`] + [mkdocs.use_directory_urls] setting for all projects from the top-level + configuration: + + ``` py title="projects/__init__.py" + from mkdocs.config.defaults import MkDocsConfig + + # Transform project configuration + def transform(project: MkDocsConfig, config: MkDocsConfig): + project.use_directory_urls = config.use_directory_urls + ``` + + [module search path]: https://docs.python.org/3/library/sys_path_init.html + [PYTHONPATH]: https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH + [python-name]: https://pyyaml.org/wiki/PyYAMLDocumentation#yaml-tags-and-python-types + [PyYAML]: https://pyyaml.org/ + +### Hoisting + +The following settings are available for hoisting: + +--- + +#### <!-- md:setting config.hoisting --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable hoisting of themes files to the main +project. If you disable this setting, each project receives a copy of the +theme's files, which can be considered redundant: + +``` yaml +plugins: + - projects: + hoisting: false +``` + +It's generally advisable to enable hoisting, as it yields faster deployments +and faster loading of your project's sites, because the files are the same for +all projects and can be deduplicated. + +### Limitations + +The plugin is one of the latest additions to Material for MkDocs, which means it +is rather young and has some limitations. We're working hard to remove them, and +we're happy to receive feedback and learn about your requirements in ?5800. +Current limitations are: + +- __Basic multi-language support only__: we'll be investigating how to provide + better support for multi-language projects, allowing to easier interlink + projects and switch between them. + +- __Separate search indexes and sitemaps__: currently, the projects are entirely + separate, which means they will have separate search indexes and sitemaps. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/requirements/caching.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/requirements/caching.md new file mode 100644 index 0000000..63b3f4a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/requirements/caching.md @@ -0,0 +1,35 @@ +--- +icon: material/database-outline +--- + +# Caching + +Some of the [built-in plugins] implement intelligent caching mechanisms, which +massively speed up consecutive builds by reducing the amount of work that needs +to be done. This guide explains how to configure caching in different +environments. + +## Prerequisites + +Caching is entirely optional but enabled by default. It can be disabled per +plugin. If not configured otherwise, plugins will cache their data in the +`.cache` folder in the root of your project. For this reason it's recommended +to create a `.gitignore` file in the root of your project: + +``` title=".gitignore" +.cache +``` + +This ensures that cached files are not added to your git repository – something +that is generally not recommended to do unless absolutely necessary. In some +cases, you might need to check in cached files, e.g. when you need to +pre-generate [social cards] locally, e.g., when you're not be able to install +the image processing dependencies in your continuous integration (CI) +environment. + +In this case, we recommend changing the `cache_dir` setting – something that all +plugins that implement caching share – to a folder which you add to your git +repository. + + [built-in plugins]: ../index.md + [social cards]: ../../setup/setting-up-social-cards.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/requirements/image-processing.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/requirements/image-processing.md new file mode 100644 index 0000000..c309315 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/requirements/image-processing.md @@ -0,0 +1,272 @@ +--- +icon: material/image-sync-outline +--- + +# Image processing + +Some of the [built-in plugins] depend on external libraries for efficient image +processing, most notably the [social] plugin to generate [social cards], and the +[optimize] plugin for applying [image optimization]. This guide explains how to +install those libraries in different environments. + + [built-in plugins]: ../index.md + [social]: ../social.md + [social cards]: ../../setup/setting-up-social-cards.md + [optimize]: ../optimize.md + [image optimization]: ../../setup/building-an-optimized-site.md + +## Dependencies + +The libraries for image processing are entirely optional, and only need to be +installed if you want to use the [social] plugin or the [optimize] plugin. The +libraries are listed under the `imaging` extra: + +``` +pip install "mkdocs-material[imaging]" +``` + +This will install compatible versions of the following packages: + +- [Pillow] +- [CairoSVG] + + [Pillow]: https://pillow.readthedocs.io/ + [CairoSVG]: https://cairosvg.org/ + +### Cairo Graphics + +[Cairo Graphics] is a graphics library and dependency of [Pillow], which +Material for MkDocs makes use of for generating [social cards] and performing +[image optimization]. See the following section which explains how to install +[Cairo Graphics] and its dependencies on your system: + +=== ":material-apple: macOS" + + Make sure [Homebrew] is installed, which is a modern package manager for + macOS. Next, use the following command to install all necessary + dependencies: + + ``` + brew install cairo freetype libffi libjpeg libpng zlib + ``` + +=== ":fontawesome-brands-windows: Windows" + + The easiest way to get up and running with the [Cairo Graphics] library is + by installing it via [MSYS2], which is a software distribution and building + platform for Windows. Run the following command inside of a MSYS2 shell: + + ``` + pacman -S mingw-w64-ucrt-x86_64-cairo + ``` + + MSYS2 provides the Cairo Graphics library in several different environments. + The above command uses the [UCRT64] environment, as recommended by the MSYS2 + developers. + +=== ":material-linux: Linux" + + There are several package managers for Linux with varying availability per + distribution. The [installation guide] explains how to install the [Cairo + Graphics] library for your distribution: + + === ":material-ubuntu: Ubuntu" + + ``` + apt-get install libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev + ``` + + === ":material-fedora: Fedora" + + ``` + yum install cairo-devel freetype-devel libffi-devel libjpeg-devel libpng-devel zlib-devel + ``` + + === ":fontawesome-brands-suse: openSUSE" + + ``` + zypper install cairo-devel freetype-devel libffi-devel libjpeg-devel libpng-devel zlib-devel + ``` + +The following environments come with a preinstalled version of [Cairo Graphics]: + +- [x] No installation needed in [Docker image] +- [x] No installation needed in [GitHub Actions] (Ubuntu) + + [Cairo Graphics]: https://www.cairographics.org/ + [Homebrew]: https://brew.sh/ + [installation guide]: https://www.cairographics.org/download/ + [MSYS2]: https://www.msys2.org/ + [UCRT64]: https://www.msys2.org/docs/environments/ + [Docker image]: https://hub.docker.com/r/squidfunk/mkdocs-material/ + [GitHub Actions]: ../../publishing-your-site.md#with-github-actions + +### pngquant + +[pngquant] is an excellent library for lossy PNG compression, and a direct +dependency of the [built-in optimize plugin]. See the following section which +explains how to install [pngquant] system: + +=== ":material-apple: macOS" + + Make sure [Homebrew] is installed, which is a modern package manager for + macOS. Next, use the following command to install all necessary + dependencies: + + ``` + brew install pngquant + ``` + +=== ":fontawesome-brands-windows: Windows" + + The easiest way to get [pngquant] is by installing it via [MSYS2], which is + a software distribution and building platform for Windows. Run the following + command inside of a MSYS2 shell: + + ``` + pacman -S mingw-w64-ucrt-x86_64-pngquant + ``` + +=== ":material-linux: Linux" + + All popular Linux distributions, regardless of package manager, should + allow to install [pngquant] with the bundled package manager. For example, + on Ubuntu, [pngquant] can be installed with: + + ``` + apt-get install pngquant + ``` + + The same is true for `yum` and `zypper`. + +The following environments come with a preinstalled version of [pngquant]: + +- [x] No installation needed in [Docker image] + + [pngquant]: https://pngquant.org/ + [built-in optimize plugin]: ../../plugins/optimize.md + [pngquant-winbuild]: https://github.com/jibsen/pngquant-winbuild + +## Troubleshooting + +### Cairo library was not found + +After following the installation guide above it may happen that you still get +the following error: + +```bash +no library called "cairo-2" was found +no library called "cairo" was found +no library called "libcairo-2" was found +cannot load library 'libcairo.so.2': error 0x7e. Additionally, ctypes.util.find_library() did not manage to locate a library called 'libcairo.so.2' +cannot load library 'libcairo.2.dylib': error 0x7e. Additionally, ctypes.util.find_library() did not manage to locate a library called 'libcairo.2.dylib' +cannot load library 'libcairo-2.dll': error 0x7e. Additionally, ctypes.util.find_library() did not manage to locate a library called 'libcairo-2.dll' +``` + +This means that the [`cairosvg`][PyPi CairoSVG] package was installed, but the +underlying [`cairocffi`][PyPi CairoCFFI] dependency couldn't [find][cffi-dopen] +the installed library. Depending on the operating system the library lookup +process is different: + +!!! tip + Before proceeding remember to fully restart any open Terminal windows, and + their parent hosts like IDEs to reload any environmental variables, which + were altered during the installation process. This might be the quick fix. + +=== ":material-apple: macOS" + + On macOS the library lookup checks inside paths defined in [dyld][osx-dyld]. + Additionally each library `name` is checked in [three variants][find-library-macOS] + with the `libname.dylib`, `name.dylib` and `name.framework/name` format. + + [Homebrew] should set every needed variable to point at the installed + library directory, but if that didn't happen, you can use the debug script + below to see what paths are looked up. + + A [known workaround][cffi-issue] is to add the Homebrew lib path directly + before running MkDocs: + + ```bash + export DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/lib + ``` + + View source code of [cairo-lookup-macos.py] + + ```bash title="Python Debug macOS Script" + curl "https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/includes/debug/cairo-lookup-macos.py" | python - + ``` + +=== ":fontawesome-brands-windows: Windows" + + On Windows the library lookup checks inside the paths defined in the + environmental `PATH` variable. Additionally each library `name` is checked + in [two variants][find-library-Windows] with the `name` and `name.dll` format. + + The default binary and shared library path for the [UCRT64] environment of + [MSYS2], in which the packages were installed using the above commands, is: + + ```powershell + C:\msys64\ucrt64\bin + ``` + + Use the debug script below to check if the path is included. If it isn't then: + + 1. Press ++windows+r++. + 2. Run the `SystemPropertiesAdvanced` applet. + 3. Select "Environmental Variables" at the bottom. + 4. Add the whole path to the above directory to your `Path` variable. + 5. Click OK on all open windows to apply changes. + 6. Fully restart any open Terminal windows and their parent hosts like IDEs. + + ```powershell title="You can also list paths using PowerShell" + $env:Path -split ';' + ``` + + View source code of [cairo-lookup-windows.py] + + ```powershell title="PowerShell - Python Debug Windows Script" + (Invoke-WebRequest "https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/includes/debug/cairo-lookup-windows.py").Content | python - + ``` + +=== ":material-linux: Linux" + + On Linux the library lookup can [differ greatly][find-library-Linux] and is + dependent from the installed distribution. For tested Ubuntu and Manjaro + systems Python runs shell commands to check which libraries are available in + [`ldconfig`][ubuntu-ldconfig], in the [`gcc`][ubuntu-gcc]/`cc` compiler, and + in [`ld`][ubuntu-ld]. + + You can extend the `LD_LIBRARY_PATH` environmental variable with an absolute + path to a library directory containing `libcairo.so` etc. Run this directly + before MkDocs: + + ```bash + export LD_LIBRARY_PATH=/absolute/path/to/lib:$LD_LIBRARY_PATH + ``` + + You can also modify the `/etc/ld.so.conf` file. + + The Python script below shows, which function is being run to find installed + libraries. You can check the source to find out what specific commands are + executed on your system during library lookup. + + View source code of [cairo-lookup-linux.py] + + ```bash title="Python Debug Linux Script" + curl "https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/includes/debug/cairo-lookup-linux.py" | python - + ``` + + [PyPi CairoSVG]: https://pypi.org/project/CairoSVG + [PyPi CairoCFFI]: https://pypi.org/project/CairoCFFI + [osx-dyld]: https://www.unix.com/man-page/osx/1/dyld/ + [ubuntu-ldconfig]: https://manpages.ubuntu.com/manpages/focal/en/man8/ldconfig.8.html + [ubuntu-ld]: https://manpages.ubuntu.com/manpages/xenial/man1/ld.1.html + [ubuntu-gcc]: https://manpages.ubuntu.com/manpages/trusty/man1/gcc.1.html + [cffi-issue]: https://github.com/squidfunk/mkdocs-material/issues/5121 + [cffi-dopen]: https://github.com/Kozea/cairocffi/blob/f1984d644bbc462ef0ec33b97782cf05733d7b53/cairocffi/__init__.py#L24-L49 + [find-library-macOS]: https://github.com/python/cpython/blob/4d58a1d8fb27048c11bcbda3da1bebf78f979335/Lib/ctypes/util.py#L70-L81 + [find-library-Windows]: https://github.com/python/cpython/blob/4d58a1d8fb27048c11bcbda3da1bebf78f979335/Lib/ctypes/util.py#L59-L67 + [find-library-Linux]: https://github.com/python/cpython/blob/4d58a1d8fb27048c11bcbda3da1bebf78f979335/Lib/ctypes/util.py#L92 + [cairo-lookup-macos.py]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/includes/debug/cairo-lookup-macos.py + [cairo-lookup-windows.py]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/includes/debug/cairo-lookup-windows.py + [cairo-lookup-linux.py]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/includes/debug/cairo-lookup-linux.py diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/search.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/search.md new file mode 100644 index 0000000..603501c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/search.md @@ -0,0 +1,427 @@ +--- +title: Built-in search plugin +icon: material/magnify +--- + +# Built-in search plugin + +The search plugin adds a search bar to the header, allowing users to search your +documentation. It's powered by [lunr.js], a lightweight full-text search engine +for the browser, elimininating the need for external services, and even works +when building [offline-capable documentation]. + + [lunr.js]: https://lunrjs.com/ + [offline-capable documentation]: ../setup/building-for-offline-usage.md + +## Objective + +### How it works + +The plugin scans the generated HTML and builds a search index from all pages and +sections by extracting the section titles and contents. It preserves some inline +formatting like code blocks and lists, but removes all other formatting, so the +search index is as small as possible. + +When a user visits your site, the search index is shipped to the browser, +indexed with [lunr.js] and made available for fast and simple querying – no +server needed. This ensures that the search index is always up to date with +your documentation, yielding accurate results. + +### When to use it + +It's generally recommended to use the plugin, as interactive search functionality +is a vital part of every good documentation. Additionally, the plugin integrates +perfectly with several of the other [built-in plugins] that Material for MkDocs +offers: + +<div class="grid cards" markdown> + +- :material-connection:   __[Built-in offline plugin][offline]__ + + --- + + The offline plugin adds support for building offline-capable documentation, + so you can distribute the [`site` directory][mkdocs.site_dir] as a `.zip` + file that can be downloaded. + + --- + + __Your documentation can work without connectivity to the internet__ + +- :material-file-tree:   __[Built-in meta plugin][meta]__ + + --- + + The meta plugin makes it easy to [boost][meta.search.boost] specific + sections in search results or to [exclude][meta.search.exclude] them + entirely from being indexed, giving more granular control over search. + + --- + + __Simpler organization and management of search in different subsections__ + +</div> + + [offline]: offline.md + [meta]: meta.md + [built-in plugins]: index.md + +## Configuration + +<!-- md:version 9.0.0 --> +<!-- md:plugin [search] – built-in --> + +As with all [built-in plugins], getting started with the search plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and your users +will be able to search your documentation: + +``` yaml +plugins: + - search +``` + +The search plugin is built into Material for MkDocs and doesn't need to be +installed. + + [search]: search.md + [built-in plugins]: index.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.3.2 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +It's normally not necessary to specify this setting, but if you want to disable +the plugin, use: + +``` yaml +plugins: + - search: + enabled: false +``` + + [building your project]: ../creating-your-site.md#building-your-site + +### Search + +The following settings are available for search: + +--- + +#### <!-- md:setting config.lang --> + +<!-- md:version 9.0.0 --> +<!-- md:default computed --> + +Use this setting to specify the language of the search index, enabling [stemming] +support for other languages than English. The default value is automatically +computed from the [site language], but can be explicitly set to another language +or even multiple languages with: + +=== "Set language" + + ``` yaml + plugins: + - search: + lang: en + ``` + +=== "Add further languages" + + ``` yaml + plugins: + - search: + lang: # (1)! + - en + - de + ``` + + 1. Be aware that including support for further languages increases the + base JavaScript payload by around 20kb and by another 15-30kb per + language, all before `gzip`. + + [stemming]: https://en.wikipedia.org/wiki/Stemming + [site language]: ../setup/changing-the-language.md#site-language + [lunr languages]: https://github.com/MihaiValentin/lunr-languages + +Language support is provided by [lunr languages], a collection of +language-specific stemmers and stop words for [lunr.js] maintained by the +Open Source community. + +--- + +The following languages are currently supported by [lunr languages]: + +<div class="mdx-columns" markdown> + +- `ar` – Arabic +- `da` – Danish +- `de` – German +- `du` – Dutch +- `en` – English +- `es` – Spanish +- `fi` – Finnish +- `fr` – French +- `hi` – Hindi +- `hu` – Hungarian +- `hy` – Armenian +- `it` – Italian +- `ja` – Japanese +- `kn` - Kannada +- `ko` – Korean +- `no` – Norwegian +- `pt` – Portuguese +- `ro` – Romanian +- `ru` – Russian +- `sa` – Sanskrit +- `sv` – Swedish +- `ta` – Tamil +- `te` – Telugu +- `th` – Thai +- `tr` – Turkish +- `vi` – Vietnamese +- `zh` – Chinese + +</div> + +If [lunr languages] doesn't provide support for the selected [site language], +the plugin falls back to another language that yields the best stemming results. +If you discover that the search results are not satisfactory, you can contribute +to [lunr languages] by adding support for your language. + +--- + +#### <!-- md:setting config.separator --> + +<!-- md:version 9.0.0 --> +<!-- md:default computed --> + +Use this setting to specify the separator used to split words when building the +search index on the client side. The default value is automatically computed +from the [site language], but can also be explicitly set to another value with: + +``` yaml +plugins: + - search: + separator: '[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t;' +``` + +Separators support [positive and negative lookahead assertions], which allows +for rather complex expressions that yield precise control over how words are +split when building the search index. + +Broken into its parts, this separator induces the following behavior: + +=== "Special characters" + + ``` + [\s\-,:!=\[\]()"/]+ + ``` + + The first part of the expression inserts token boundaries for each + document before and after whitespace, hyphens, commas, brackets and + other special characters. If several of those special characters are + adjacent, they are treated as one. + +=== "Case changes" + + ``` + (?!\b)(?=[A-Z][a-z]) + ``` + + Many programming languages have naming conventions like `PascalCase` or + `camelCase`. By adding this subexpression to the separator, + [words are split at case changes], tokenizing the word `PascalCase` + into `Pascal` and `Case`. + +=== "Version strings" + + ``` + \.(?!\d) + ``` + + When adding `.` to the separator, version strings like `1.2.3` are split + into `1`, `2` and `3`, which makes them undiscoverable via search. When + using this subexpression, a small lookahead is introduced which will + [preserve version strings] and keep them discoverable. + +=== "HTML/XML tags" + + ``` + &[lg]t; + ``` + + If your documentation includes HTML/XML code examples, you may want to allow + users to find [specific tag names]. Unfortunately, the `<` and `>` control + characters are encoded in code blocks as `<` and `>`. Adding this + subexpression to the separator allows for just that. + + [positive and negative lookahead assertions]: https://www.regular-expressions.info/lookaround.html + [words are split at case changes]: ?q=searchHighlight + [preserve version strings]: ?q=9.0.0 + [specific tag names]: ?q=script + +--- + +#### <!-- md:setting config.pipeline --> + +<!-- md:version 9.0.0 --> +<!-- md:default computed --> +<!-- md:flag experimental --> + +Use this setting to specify the [pipeline functions] that are used to filter and +expand tokens after tokenizing them with the [`separator`][config.separator] and +before adding them to the search index. The default value is automatically +computed from the [site language], but can also be explicitly set with: + +``` yaml +plugins: + - search: + pipeline: + - stemmer + - stopWordFilter + - trimmer +``` + +The following pipeline functions can be used: + +- `stemmer` – Stem tokens to their root form, e.g. `running` to `run` +- `stopWordFilter` – Filter common words according, e.g. `a`, `the`, etc. +- `trimmer` – Trim whitespace from tokens + + [pipeline functions]: https://lunrjs.com/guides/customising.html#pipeline-functions + +### Segmentation + +The plugin supports text segmentation of Chinese via [jieba], a popular +Chinese text segmentation library. Other languages like Japanese and Korean are +currently segmented on the client side, but we're considering to move this +functionality into the plugin in the future. + +The following settings are available for segmentation: + + [jieba]: https://pypi.org/project/jieba/ + +--- + +#### <!-- md:setting config.jieba_dict --> + +<!-- md:version 9.2.0 --> +<!-- md:default none --> +<!-- md:flag experimental --> + +Use this setting to specify a [custom dictionary] to be used by [jieba] for +segmenting text, replacing the default dictionary. [jieba] comes with +several dictionaries, which can be used with: + +``` yaml +plugins: + - search: + jieba_dict: dict.txt +``` + +The following dictionaries are provided by [jieba]: + +- [dict.txt.small] – 占用内存较小的词典文件 +- [dict.txt.big] – 支持繁体分词更好的词典文件 + +The provided path is resolved from the root directory. + + [custom dictionary]: https://github.com/fxsjy/jieba#%E5%85%B6%E4%BB%96%E8%AF%8D%E5%85%B8 + [dict.txt.small]: https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small + [dict.txt.big]: https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big + +--- + +#### <!-- md:setting config.jieba_dict_user --> + +<!-- md:version 9.2.0 --> +<!-- md:default none --> +<!-- md:flag experimental --> + +Use this setting to specify an additional [user dictionary] to be used by +[jieba] for segmenting text, augmenting the default dictionary. User +dictionaries are ideal for tuning the segmenter: + +``` yaml +plugins: + - search: + jieba_dict_user: user_dict.txt +``` + +The provided path is resolved from the root directory. + + [user dictionary]: https://github.com/fxsjy/jieba#%E8%BD%BD%E5%85%A5%E8%AF%8D%E5%85%B8 + +## Usage + +### Metadata + +The following properties are available: + +--- + +#### <!-- md:setting meta.search.boost --> + +<!-- md:version 8.3.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to increase or decrease the relevance of a page in the search +results, giving more weight to them. Use values above `1` to rank up and values +below `1` to rank down: + +=== ":material-arrow-up-circle: Rank up" + + ``` yaml + --- + search: + boost: 2 # (1)! + --- + + # Page title + ... + ``` + + 1. When boosting pages, always start with low values. + +=== ":material-arrow-down-circle: Rank down" + + ``` yaml + --- + search: + boost: 0.5 + --- + + # Page title + ... + ``` + +--- + +#### <!-- md:setting meta.search.exclude --> + +<!-- md:version 9.0.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to exclude a page from the search results. Note that this will +not only remove the page, but also all subsections of the page from the search +results: + +``` yaml +--- +search: + exclude: true +--- + +# Page title +... +``` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/social.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/social.md new file mode 100644 index 0000000..d7aa8eb --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/social.md @@ -0,0 +1,1063 @@ +--- +title: Built-in social plugin +icon: material/share-circle +--- + +# Built-in social plugin + +The social plugin automatically and intelligently generates beautiful and highly +customizable social cards in different [layouts][default layouts] for each page +of your project, rendering as preview images whenever you or somebody else share +a link to your project on social media. + +## Objective + +### How it works + +The plugin automatically generates a customizable social card for each page +of your project, which appears as a preview image when sharing a link to your +project on social media, without the use of external services and just +[a single line of configuration][configuration]. + +With the use of an efficient [image processing] library, the plugin allows to +define [custom layouts] for social cards, which can be adapted to match your +project's style and branding. While it would technically be much simpler to +generate social cards by using a web browser and an automation framework like +[Puppeteer][^1], it would add further liabilities to your toolchain, with the +potential to make build pipelines more complex, much more resource intense, +and significantly slower. + + [^1]: + [GitHub wrote in their blog] that they use [Puppeteer] to generate social + card images for repositories, issues, commits, discussions, and basically + everything else that appear as preview images when shared on social media. + +The generated social cards are [cached] and stored in the +[`site` directory][mkdocs.site_dir], and thus self-hosted, ensuring that your +project doesn't depend on external services. In order to generate social cards +images, a few [dependencies] need to be available on your system. + + [configuration]: #configuration + [image processing]: requirements/image-processing.md + [custom layouts]: ../setup/setting-up-social-cards.md#customization + [Puppeteer]: https://github.com/puppeteer/puppeteer + [GitHub wrote in their blog]: https://github.blog/2021-06-22-framework-building-open-graph-images/ + [cached]: #caching + [dependencies]: #configuration + +### When to use it + +There's one particular case when we don't recommend to use the plugin: when you +build [offline-capable documentation] to offer it as a download. Otherwise, it +always makes sense to enable the plugin, as links to your documentation shared +on social media will appear much more appealing. + +Even more interestingly, the plugin can be combined with other built-in plugins +that Material for MkDocs offers, in order to create sophisticated build +pipelines tailored to your project: + +<div class="grid cards" markdown> + +- :material-newspaper-variant-outline:   __[Built-in blog plugin][blog]__ + + --- + + The social plugin automatically generates beautiful and customizable + social cards for each post and page, showing as previews on social media. + + --- + + __Links to your blog render beautiful social cards when shared on social media__ + +- :material-file-tree:   __[Built-in meta plugin][meta]__ + + --- + + The meta plugin can be used to [change the layout][meta.social.cards_layout] + for social cards or [change specific layout options] + [meta.social.cards_layout_options] like [background][option.background_color] + or [color][option.color] for a subset of pages. + + --- + + __Your documentation can use completely different social cards per section__ + +</div> + + [offline-capable documentation]: ../setup/building-for-offline-usage.md + [blog]: blog.md + [meta]: meta.md + +## Configuration + +<!-- md:version 8.5.0 --> +<!-- md:plugin [social] – built-in --> +<!-- md:flag multiple --> +<!-- md:flag experimental --> + +In order to get started with the social plugin, just add the following lines to +`mkdocs.yml`, and observe how Material for MkDocs generates beautiful social +cards for you: + +``` yaml +plugins: + - social +``` + +The social plugin is built into Material for MkDocs and doesn't need to be +installed. + +However, in order to generate social card images, it's necessary to install the +dependencies for [image processing], if they're not already available on your +system. The linked guide includes instructions for several operating systems +and mentions some alternative environments. + + [social]: social.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 8.5.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +If you want to disable the plugin, e.g., for local builds, you can use an +[environment variable][mkdocs.env] in `mkdocs.yml`: + +``` yaml +plugins: + - social: + enabled: !ENV [CI, false] +``` + +This configuration enables the plugin only during continuous integration (CI). + + [building your project]: ../creating-your-site.md#building-your-site + +--- + +#### <!-- md:setting config.concurrency --> + +<!-- md:version 9.7.0 --> +<!-- md:default available CPUs - 1 --> + +With more CPUs available, the plugin can do more work in parallel, and thus +complete social card generation faster. If you want to disable concurrent +processing completely, use: + +``` yaml +plugins: + - social: + concurrency: 1 +``` + +By default, the plugin uses all available CPUs - 1 with a minimum of 1. + +### Caching + +The plugin implements an [intelligent caching] mechanism, ensuring that social +cards are only regenerated when their contents change or they're not already +contained in the cache. If any of the variables used in a layout changes, the +plugin detects it and regenerates the social card. + +The following settings are available for caching: + + [intelligent caching]: requirements/caching.md + +--- + +#### <!-- md:setting config.cache --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to instruct the plugin to bypass the cache, in order to +re-generate social cards for all pages, even though the cache may not be stale. +It's normally not necessary to specify this setting, except for when debugging +the plugin itself. Caching can be disabled with: + +``` yaml +plugins: + - social: + cache: false +``` + +--- + +#### <!-- md:setting config.cache_dir --> + +<!-- md:version 8.5.0 --> +<!-- md:default `.cache/plugin/social` --> + +It is normally not necessary to specify this setting, except for when you want +to change the path within your root directory where social card images are +cached. If you want to change it, use: + +``` yaml +plugins: + - social: + cache_dir: my/custom/dir +``` + +If you're using [multiple instances] of the plugin, it can be a good idea to +set different cache directories for both instances, so that they don't interfere +with each other. + + [multiple instances]: index.md#multiple-instances + +### Logging + +The following settings are available for logging: + +--- + +#### <!-- md:setting config.log --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should only log errors when +generating social cards without terminating the build, e.g., invalid references +to icons. To terminate the build, use: + +``` yaml +plugins: + - social: + log: false +``` + +--- + +#### <!-- md:setting config.log_level --> + +<!-- md:version 9.7.0 --> +<!-- md:default `warn` --> + +Use this setting to control the log level that the plugin should employ when +encountering errors, which requires that the [`log`][config.log] setting is +enabled. The following log levels are available: + +=== "`warn`" + + ``` yaml + plugins: + - social: + log_level: warn + ``` + + Errors are reported as warnings, terminating the build in + [`strict`][mkdocs.strict] mode. + +=== "`info`" + + ``` yaml + plugins: + - social: + log_level: info + ``` + + Errors are only reported as informational messages. + +=== "`ignore`" + + ``` yaml + plugins: + - social: + log_level: ignore + ``` + + Errors are only reported when using the `--verbose` flag. + +### Social cards + +The following settings are available for social card generation: + +--- + +#### <!-- md:setting config.cards --> + +<!-- md:version 8.5.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable social card generation. Currently, the +plugin's sole purpose is to generate social cards, so it's equivalent to the +[`enabled`][config.enabled] setting, but in the future, other features might be +added. If you want to disable social card generation, use: + +``` yaml +plugins: + - social: + cards: false +``` + +--- + +#### <!-- md:setting config.cards_dir --> + +<!-- md:version 8.5.0 --> +<!-- md:default `assets/images/social` --> + +It is normally not necessary to specify this setting, except for when you want +to change the path within the [`site` directory][mkdocs.site_dir] where +social cards are stored. If you want to change it, use: + +``` yaml +plugins: + - social: + cards_dir: my/custom/dir +``` + +This configuration stores the generated images at `my/custom/dir` in the +[`site` directory][mkdocs.site_dir]. + +--- + +#### <!-- md:setting config.cards_layout_dir --> + +<!-- md:version 9.7.0 --> +<!-- md:default `layouts` --> + +If you want to build a [custom social card layout][custom layouts], use this +setting to change the folder where you store your custom layouts, the default +being a folder called `layouts` in your root directory: + +``` yaml +plugins: + - social: + cards_layout_dir: layouts +``` + +The provided path is resolved from the root directory. + +!!! tip "Where to store custom layouts" + + Our recommendation is to locate the folder outside of the + [`docs` directory][mkdocs.docs_dir], to make sure that your [custom layouts] + are not copied to the [`site` directory][mkdocs.site_dir] when + [building your project], e.g., by adhering to the following directory + layout: + + ``` { .sh .no-copy } + . + ├─ docs/ + │ └─ *.md + ├─ layouts/ + │ └─ *.yml + └─ mkdocs.yml + ``` + +--- + +#### <!-- md:setting config.cards_layout --> + +<!-- md:version 9.7.0 --> +<!-- md:default `default` --> + +The plugin ships a growing list of [`default` layouts][default layouts] for +social cards. If you've created a [custom social card layout][custom layouts], +you can instruct the plugin to use it exactly as one of the included layouts: + +``` yaml +plugins: + - social: + cards_layout: my-custom-layout +``` + +The provided path is resolved from the[ +`layouts` directory][config.cards_layout_dir]. + +!!! tip "How custom layouts are resolved" + + By default, the plugin will load your [custom layouts] from a folder named + `layouts` in your root directory. If your layout is called + `my-custom-layout`, the directory layout must adhere to: + + ``` { .sh .no-copy } + . + ├─ docs/ + │ └─ *.md + ├─ layouts/ + │ └─ my-custom-layout.yml + └─ mkdocs.yml + ``` + +--- + +#### <!-- md:setting config.cards_layout_options --> + +<!-- md:version 9.1.10 --> +<!-- md:default none --> + +Use this setting to set options for the layout specified via [`cards_layout`] +[config.cards_layout] (if the layout supports it), which allows for making +layouts easily and entirely configurable: + +``` yaml +plugins: + - social: + cards_layout_options: + <option>: <value> +``` + +When creating a [custom layout][custom layouts], you are completely free in +defining which parts of your layout can be parametrized. The [`default` layouts] +[default layouts] included with the plugin support the following options: + +<div class="mdx-columns" markdown> + +- [`background_color`][option.background_color] +- [`background_image`][option.background_image] +- [`color`][option.color] +- [`font_family`][option.font_family] +- [`font_variant`][option.font_variant] +- [`logo`][option.logo] +- [`title`][option.title] +- [`description`][option.description] + +</div> + + + [default layouts]: #layouts + +--- + +#### <!-- md:setting config.cards_include --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to enable social card generation for subsections of your +project, e.g., when using [multiple instances] of the plugin to generate +different social cards for different subsections: + +``` yaml +plugins: + - social: + cards_include: + - blog/* +``` + +This configuration enables social card generation for all pages that are +contained in the `blog` folder and its subfolders inside the [`docs` directory] +[mkdocs.docs_dir]. + +--- + +#### <!-- md:setting config.cards_exclude --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to disable social card generation for subsections of your +project, e.g., when using [multiple instances] of the plugin to generate +different social cards for different subsections: + +``` yaml +plugins: + - social: + cards_exclude: + - changelog/* +``` + +This configuration disables social card generation for all pages that are +contained in the `changelog` folder and its subfolders inside the +[`docs` directory][mkdocs.docs_dir]. + +### Debugging + +The plugin includes a special mode for debugging layouts, which is very useful +when creating [custom layouts], as it allows for quicker iteration and better +understanding of composition. + +The following settings are available for debugging: + +--- + +#### <!-- md:setting config.debug --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +Use this setting to enable a special mode for debugging your layout, which +renders each layer with a colored outline and its `x` and `y` offsets, and +overlays a dot grid for alignment, so it's easier to understand how the +distinct layers of your layout are composed together: + +``` yaml +plugins: + - social: + debug: true +``` + +--- + +#### <!-- md:setting config.debug_on_build --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +By default, the plugin automatically disables [`debug`][config.debug] mode when +[building your project], so you can be sure that debug overlays are never +deployed to production. If you want to change that, use: + +``` yaml +plugins: + - social: + debug_on_build: true +``` + +It's normally not necessary to change this setting, as it's just intended to +be a safety net. + +--- + +#### <!-- md:setting config.debug_grid --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +When [`debug`][config.debug] mode is enabled, this setting specifies whether a +dot grid is rendered on top of all layers, to allow for better alignment. If you +want to switch the grid off, use: + +``` yaml +plugins: + - social: + debug_grid: false +``` + +--- + +#### <!-- md:setting config.debug_grid_step --> + +<!-- md:version 9.7.0 --> +<!-- md:default `32` --> + +Use this setting to specify the step size of the dot grid in pixels, if enabled, +which can be useful to create perfectly aligned layers for ideal composition. +It you want to change it, use: + +``` yaml +plugins: + - social: + debug_grid_step: 64 +``` + +--- + +#### <!-- md:setting config.debug_color --> + +<!-- md:version 9.7.0 --> +<!-- md:default `grey` --> + +Use this setting to specify the color of the outlines that are added to each +layer and the dot grid that is rendered on top of all layers. If you need to +change it, use: + +``` yaml +plugins: + - social: + debug_color: yellow +``` + +In rare cases, it might be necessary to change this setting if the dot grid or +the outlines are hard to distinguish, as the plugin will automatically adjust +the color if not explicitly set. + +## Usage + +### Metadata + +The plugin allows to override a subset of settings through metadata (front +matter) in order to customize social card generation, e.g., to set [options for +the included `default` layouts][default layouts] for a single page, or even +[for an entire subsection] of your project by leveraging the [meta] plugin. + +The following properties are available: + + [for an entire subsection]: meta.md#how-it-works + [meta]: meta.md + +--- + +#### <!-- md:setting meta.social.cards --> + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to override the [`cards`][config.cards] setting for the given +page: + +``` yaml +--- +social: + cards: false +--- + +# Page title +... +``` + +--- + +#### <!-- md:setting meta.social.cards_layout --> + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> +<!-- md:flag experimental --> + +Use this property to override the [`cards_layout`][config.cards_layout] setting +for the given page: + +``` yaml +--- +social: + cards_layout: my-custom-layout +--- + +# Page title +... +``` + +--- + +#### <!-- md:setting meta.social.cards_layout_options --> + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to override the [`cards_layout_options`] +[config.cards_layout_options] setting for the given page: + +``` yaml +--- +social: + cards_layout_options: + background_color: blue # Change background color + background_image: null # Remove background image +--- + +# Page title +... +``` + +Setting an option to `#!yaml null` resets the option. + +### Layouts + +<!-- md:version 9.7.0 --> + +While it is possible and simple to build [custom layouts], the plugin ships +several predefined layouts, all of which are prefixed with `default`. The +following layouts are included: + +=== "`default`" + + ``` yaml + plugins: + - social: + cards_layout: default + ``` + + <div class="result" markdown> + + ![Layout default] + + This layout sets the following defaults: + + - [`background_color`][option.background_color] + – <!-- md:default [`theme.palette.primary`][primary color] --> + + - [`font_family`][option.font_family] + – <!-- md:default [`theme.font.text`][font] --> + + </div> + +=== "`default/variant`" + + ``` yaml + plugins: + - social: + cards_layout: default/variant + ``` + + <div class="result" markdown> + + ![Layout default variant] + + This layout includes the [page icon] and sets the following defaults: + + - [`background_color`][option.background_color] + – <!-- md:default [`theme.palette.primary`][primary color] --> + + - [`font_family`][option.font_family] + – <!-- md:default [`theme.font.text`][font] --> + + </div> + +=== "`default/accent`" + + ``` yaml + plugins: + - social: + cards_layout: default/accent + ``` + + <div class="result" markdown> + + ![Layout default accent] + + This layout sets the following defaults: + + - [`background_color`][option.background_color] + – <!-- md:default [`theme.palette.accent`][accent color] --> + + - [`font_family`][option.font_family] + – <!-- md:default [`theme.font.text`][font] --> + + </div> + +=== "`default/invert`" + + ``` yaml + plugins: + - social: + cards_layout: default/invert + ``` + + <div class="result" markdown> + + ![Layout default invert] + + This layout sets the following defaults: + + - [`color`][option.background_color] + – <!-- md:default [`theme.palette.primary`][primary color] --> + + - [`font_family`][option.font_family] + – <!-- md:default [`theme.font.text`][font] --> + + </div> + +=== "`default/only/image`" + + ``` yaml + plugins: + - social: + cards_layout: default/only/image + cards_layout_options: + background_image: layouts/background.png + + ``` + + <div class="result" markdown> + + This layout only shows the given background image and scales it to cover. + + </div> + +The [`default` layouts][default layouts] are very flexible and comfortable to +use, as they replicate the original behavior of the plugin, sourcing default +values for all options from other `theme` settings. + +The following options are available: + + [Layout default]: ../assets/screenshots/social-cards.png + [Layout default variant]: ../assets/screenshots/social-cards-variant.png + [Layout default accent]: ../assets/screenshots/social-cards-accent.png + [Layout default invert]: ../assets/screenshots/social-cards-invert.png + + [primary color]: ../setup/changing-the-colors.md#primary-color + [page icon]: ../reference/index.md#setting-the-page-icon + [accent color]: ../setup/changing-the-colors.md#accent-color + [font]: ../setup/changing-the-fonts.md#regular-font + +--- + +#### <!-- md:setting option.background_color --> + +<!-- md:version 9.1.10 --> +<!-- md:default computed --> + +Use this option to change the background color of the generated social card. +The value can be set to a valid color value [supported by pillow], the imaging +library used for card generation: + +=== "Hexadecimal" + + ``` yaml + plugins: + - social: + cards_layout_options: + background_color: "#ff1493" # (1)! + ``` + + 1. The following notations are supported, whereas each character after the + `#` must be a valid hexadecimal in the range `#!css 0-F`: + + - `#!css #rgb` – Color (short) + - `#!css #rgba` – Color + alpha (short) + - `#!css #rrggbb` – Color + - `#!css #rrggbbaa` – Color + alpha + +=== "Color function" + + ``` yaml + plugins: + - social: + cards_layout_options: + background_color: rgb(255, 20, 147) # (1)! + ``` + + 1. The following functions are supported, listing the allowed maximum + values with the minimum values all being `#!css 0` or `#!css 0%`: + + - `#!css rgb(255, 255, 255)` – Red, green and blue + - `#!css hsl(360, 100%, 100%)` – Hue, saturation and lightness + - `#!css hsv(360, 100%, 100%)` – Hue, saturation and value + +=== "Color name" + + ``` yaml + plugins: + - social: + cards_layout_options: + background_color: deeppink # (1)! + ``` + + 1. See the [`<named-color>`][named-color] CSS data type for a list of + supported color names. Note that some might not be available. + +If this options is used together with [`background_image`] +[option.background_image], the color is rendered on top of the image which +allows for tinting images. If you want to remove the background color, use: + +``` yaml +plugins: + - social: + cards_layout_options: + background_color: transparent +``` + + [supported by pillow]: https://pillow.readthedocs.io/en/stable/reference/ImageColor.html#color-names + [named-color]: https://developer.mozilla.org/en-US/docs/Web/CSS/named-color + +--- + +#### <!-- md:setting option.background_image --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this option to define a background image for the generated social card. Note +that the image is tinted with the [`background_color`][option.background_color], +which can also be set to `transparent`: + +=== "Image" + + ``` yaml + plugins: + - social: + cards_layout_options: + background_image: layouts/background.png + background_color: transparent + ``` + +=== "Image with tint" + + ``` yaml + plugins: + - social: + cards_layout_options: + background_image: layouts/background.png + background_color: "#ff149366" + ``` + +The provided path is resolved from the root directory. + +--- + +#### <!-- md:setting option.color --> + +<!-- md:version 9.1.10 --> +<!-- md:default computed --> + +Use this option to change the foreground color of the generated social card. +The value can be set to a valid color value [supported by pillow], the imaging +library used for card generation: + +=== "Hexadecimal" + + ``` yaml + plugins: + - social: + cards_layout_options: + color: "#ffffff" # (1)! + ``` + + 1. The following notations are supported, whereas each character after the + `#` must be a valid hexadecimal in the range `#!css 0-F`: + + - `#!css #rgb` – Color (short) + - `#!css #rgba` – Color + alpha (short) + - `#!css #rrggbb` – Color + - `#!css #rrggbbaa` – Color + alpha + +=== "Color function" + + ``` yaml + plugins: + - social: + cards_layout_options: + color: rgb(255, 255, 255) # (1)! + ``` + + 1. The following functions are supported, listing the allowed maximum + values with the minimum values all being `#!css 0` or `#!css 0%`: + + - `#!css rgb(255, 255, 255)` – Red, green and blue + - `#!css hsl(360, 100%, 100%)` – Hue, saturation and lightness + - `#!css hsv(360, 100%, 100%)` – Hue, saturation and value + +=== "Color name" + + ``` yaml + plugins: + - social: + cards_layout_options: + color: white # (1)! + ``` + + 1. See the [`<named-color>`][named-color] CSS data type for a list of + supported color names. Note that some might not be available. + +--- + +#### <!-- md:setting option.font_family --> + +<!-- md:version 9.1.10 --> +<!-- md:default computed --> + +Use this option to change the font family of the generated social card. The +plugin automatically downloads the font from [Google Fonts], so the font must +point to an existing Google Font: + +``` yaml +plugins: + - social: + cards_layout_options: + font_family: Ubuntu +``` + +When you've found a font that you like on [Google Fonts], you can just copy the +name from the font's specimen page and use it as the value for this option – +no further configuration needed. + + [Google Fonts]: https://fonts.google.com/ + +--- + +#### <!-- md:setting option.font_variant --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this option to change the font variant used to generate the social card. +If the downloaded font has variants like `Condensed` or `Expanded`, you can set +them with: + +``` yaml +plugins: + - social: + cards_layout_options: + font_variant: Condensed +``` + +The variant is combined with the style as used in the custom layout, so the +plugin is instructed to use combinations like `Condensed Regular` or +`Expanded Bold`. + +--- + +#### <!-- md:setting option.logo --> + +<!-- md:version 9.7.0 --> +<!-- md:default computed --> + +Use this option to change the logo that is used in the generated social card. +By default, the plugin uses the [`theme.logo`][theme.logo] or [`theme.icon.logo`] +[theme.icon.logo] setting from `mkdocs.yml`. You can change it with: + +``` yaml +plugins: + - social: + cards_layout_options: + logo: layouts/logo.png +``` + +The provided path is resolved from the root directory. + + [theme.logo]: ../setup/changing-the-logo-and-icons.md#logo-image + [theme.icon.logo]: ../setup/changing-the-logo-and-icons.md#logo-icon-bundled + +--- + +#### <!-- md:setting option.title --> + +<!-- md:version 9.7.0 --> +<!-- md:default computed --> + +Use this option to change the title of the generated social card. This overrides +the computed page title as assigned by MkDocs, as well as the [`title`] +[meta.title] metadata property: + +``` yaml +plugins: + - social: + cards_layout_options: + title: My custom title +``` + + [meta.title]: ../reference/index.md#setting-the-page-title + +--- + +#### <!-- md:setting option.description --> + +<!-- md:version 9.7.0 --> +<!-- md:default computed --> + +Use this option to change the description of the generated social card. This +overrides the set [`site_description`][mkdocs.site_description], if defined, as +well as the [`description`][meta.description] metadata property: + +``` yaml +plugins: + - social: + cards_layout_options: + description: My custom description +``` + + [meta.description]: ../reference/index.md#setting-the-page-description + +--- + +!!! question "Missing something?" + + When setting up social cards, you might discover that you're missing + specific functionality – we're happy to consider adding it to the plugin! + You can [open a discussion] to ask a question, or create a [change request] + on our [issue tracker], so we can find out if it might be a good fit for + the plugin. + + [open a discussion]: https://github.com/squidfunk/mkdocs-material/discussions + [change request]: ../contributing/requesting-a-change.md + [issue tracker]: https://github.com/squidfunk/mkdocs-material/issues diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/tags.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/tags.md new file mode 100644 index 0000000..b1ac540 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/tags.md @@ -0,0 +1,928 @@ +--- +title: Built-in tags plugin +icon: material/tag-text +--- + +# Built-in tags plugin + +The tags plugin adds first-class support for categorizing pages with the use +of tags, adding the possibility to group related pages and make them +discoverable via search and dedicated tags indexes. If your documentation is +large, tags can help to discover relevant information faster. + +## Objective + +### How it works + +The plugin scans all pages for the [`tags`][meta.tags] metadata property and +generates a tags index, which is an inverted list of tags and the pages they +appear on. The tags index can be located anywhere in the [`nav`][mkdocs.nav], +allowing for maximum flexibility when adding tags to your project. + +### When to use it + +If you want to add one or multiple tags indexes to your project, the tags +plugin is a perfect choice as it makes this process ridiculously simple. +Additionally, it integrates perfectly with several of the other +[built-in plugins] that Material for MkDocs offers: + +<div class="grid cards" markdown> + +- :material-file-tree:   __[Built-in meta plugin][meta]__ + + --- + + The meta plugin makes it possible to ensure that subsections of your + project are annotated with [specific tags][meta.tags], so they can't be + forgotten when adding pages. + + --- + + __Simpler organization and management of tags in different subsections__ + +- :material-newspaper-variant-outline:   __[Built-in blog plugin][blog]__ + + --- + + The tags plugin allows to categorize posts alongside with pages in your + project, to improve their discoverability and connect posts to your + documentation. + + --- + + __Your documentation's tag system integrates with your blog__ + +</div> + + [meta]: meta.md + [blog]: blog.md + [built-in plugins]: index.md + +## Configuration + +<!-- md:version 8.2.0 --> +<!-- md:plugin [tags] – built-in --> +<!-- md:flag multiple --> + +As with all [built-in plugins], getting started with the tags plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and start using +[tags][meta.tags] to categorize your pages: + +``` yaml +plugins: + - tags +``` + +The tags plugin is built into Material for MkDocs and doesn't need to be +installed. + + [tags]: tags.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.1.7 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +It's normally not necessary to specify this setting, but if you want to disable +the plugin, use: + +``` yaml +plugins: + - tags: + enabled: false +``` + + [building your project]: ../creating-your-site.md#building-your-site + +### Tags + +The following settings are available for tags: + +--- + +#### <!-- md:setting config.tags --> + +<!-- md:version 9.3.2 --> +<!-- md:default `true` --> + +Use this setting to enable or disable rendering of tags. The plugin still +extracts tags from all pages, e.g., for [exporting tags] without rendering them. +Rendering can be disabled with: + +``` yaml +plugins: + - tags: + tags: false +``` + +This setting is automatically disabled if [`export_only`][config.export_only] +is enabled. + + [exporting tags]: #export + +--- + +#### <!-- md:setting config.tags_file --> + +<!-- md:version 8.2.0 --> +<!-- md:default none --> + +!!! warning "This setting is deprecated" + + As of version <!-- md:version 9.6.0 -->, this setting is deprecated, as this + version ships a __ground up rewrite of the tags plugin__ which is much more + powerful than the previous version. Tags [listings] can be used on any page + now. + +<div style="opacity: 0.5" markdown> + +Use this setting to specify the location of the tags index, which is the page +used to render a list of all tags and their associated pages. If this setting is +specified, tags become clickable, pointing to the corresponding section in the +tags index: + +``` yaml +plugins: + - tags: + tags_file: tags.md +``` + +The page holding the tags index can be linked anywhere in the [`nav`][mkdocs.nav] +section of `mkdocs.yml`. This setting is not required – you should only use it +if you want to have a tags index. + +The provided path is resolved from the [`docs` directory][mkdocs.docs_dir]. + +</div> + + [listings]: ../setup/setting-up-tags.md#adding-a-tags-index + +--- + +#### <!-- md:setting config.tags_slugify --> + +<!-- md:version 9.6.0 --> +<!-- md:default [`pymdownx.slugs.slugify`][pymdownx.slugs.slugify] --> + +Use this setting to change the function for generating URL-compatible slugs +from post titles. By default, the [`slugify`][pymdownx.slugs.slugify] function +from [Python Markdown Extensions] is used as follows: + +``` yaml +plugins: + - tags: + tags_slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower +``` + +The default configuration is Unicode-aware and should produce good slugs for all +languages. Of course, you can also provide a custom slugification function for +more granular control. + + [pymdownx.slugs.slugify]: https://github.com/facelessuser/pymdown-extensions/blob/01c91ce79c91304c22b4e3d7a9261accc931d707/pymdownx/slugs.py#L59-L65 + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/extras/slugs/ + +--- + +#### <!-- md:setting config.tags_slugify_separator --> + +<!-- md:version 9.6.0 --> +<!-- md:default `-` --> + +Use this setting to change the separator that is passed to the slugification +function set as part of [`tags_slugify`][config.tags_slugify]. While the default +is a hyphen, it can be set to any string, e.g., `_`: + +``` yaml +plugins: + - tags: + tags_slugify_separator: _ +``` + +--- + +#### <!-- md:setting config.tags_slugify_format --> + +<!-- md:version 9.6.0 --> +<!-- md:default `tag:{slug}` --> + +Use this setting to change the format string that is used when generating tag +slugs. It is a good idea to prefix tag slugs with a string that makes them +unique, the default being: + +``` yaml +plugins: + - tags: + tags_slugify_format: "tag:{slug}" +``` + +The following placeholders are available: + +- `slug` – Tag slug, slugified with [`tags_slugify`][config.tags_slugify] + +--- + +#### <!-- md:setting config.tags_hierarchy --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> +<!-- md:flag experimental --> + +Use this setting to enable support for tag hierarchies (nested tags, e.g., +`foo/bar`). If you intend to create hierarchical listings of tags, you can +enable this setting in `mkdocs.yml` with: + +``` yaml +plugins: + - tags: + tags_hierarchy: true +``` + +--- + +#### <!-- md:setting config.tags_hierarchy_separator --> + +<!-- md:version 9.7.0 --> +<!-- md:default `/` --> +<!-- md:flag experimental --> + +Use this setting to change the separator that is used when creating tag +hierarchies. By default, tags are separated by a forward slash `/`, but you +can change this to any string, e.g., `.`: + +``` yaml +plugins: + - tags: + tags_hierarchy_separator: . +``` + +--- + +#### <!-- md:setting config.tags_sort_by --> + +<!-- md:version 9.6.0 --> +<!-- md:default `material.plugins.tags.tag_name` --> + +Use this setting to specify a custom function for comparing tags. By default, +tag comparison is case-sensitive, but you can use `tag_name_casefold` for +case-insensitive comparison: + +``` yaml +plugins: + - tags: + tags_sort_by: !!python/name:material.plugins.tags.tag_name_casefold +``` + +You can also define your own comparison function, which must return a string +or number representing the tag, that is used for sorting, and reference it in +[`tags_sort_by`][config.tags_sort_by]. + +--- + +#### <!-- md:setting config.tags_sort_reverse --> + +<!-- md:version 9.6.0 --> +<!-- md:default `false` --> + +Use this setting to reverse the order in which tags are sorted when comparing +them. By default, tags are sorted in ascending order, but you can reverse +ordering as follows: + +``` yaml +plugins: + - tags: + tags_sort_reverse: true +``` + +--- + +#### <!-- md:setting config.tags_name_property --> + +<!-- md:version 9.6.0 --> +<!-- md:default [`tags`][meta.tags] --> + +Use this setting to change the name of the front matter property that is used by +the plugin. It is normally not necessary to change this setting, but if you want +to change it, you can use: + +``` yaml +plugins: + - tags: + tags_name_property: tags +``` + +--- + +#### <!-- md:setting config.tags_name_variable --> + +<!-- md:version 9.6.0 --> +<!-- md:default `tags` --> + +Use this setting to change the name of the template variable that is used by +the plugin. It is normally not necessary to change this setting, but if you want +to change it, you can use: + +``` yaml +plugins: + - tags: + tags_name_variable: tags +``` + +--- + +#### <!-- md:setting config.tags_allowed --> + +<!-- md:version 9.6.0 --> +<!-- md:default none --> + +The plugin allows to check tags against a predefined list, in order to catch +typos or make sure that tags are not arbitrarily added. Specify the tags you +want to allow with: + +``` yaml +plugins: + - tags: + tags_allowed: + - HTML5 + - JavaScript + - CSS +``` + +The plugin stops the build if a page references a tag that is not part of +this list. Pages can be assigned to tags by using the [`tags`][meta.tags] +metadata property. + +### Listings + +The following settings are available for listings: + +--- + +#### <!-- md:setting config.listings --> + +<!-- md:version 9.6.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable listings. It is normally not necessary to +change this setting, as listings are created entirely by inline comments, but +you can disable them if necessary with: + +``` yaml +plugins: + - tags: + listings: false +``` + +This setting is automatically disabled if [`export_only`][config.export_only] +is enabled. + + [exporting tags]: #export + +--- + +#### <!-- md:setting config.listings_map --> + +<!-- md:version 9.6.0 --> +<!-- md:default none --> + +Use this define listing configurations that you can then reference in listings +with a custom identifier. Sharing configurations is a good idea, especially +when you have many tag listings: + +``` yaml +plugins: + - tags: + listings_map: + custom-id: + scope: true + exclude: Internal +``` + +Then, just reference the listing identifier: + +``` html +<!-- material/tags custom-id --> +``` + +See the [listings section] for a list of all available settings. + + [listings section]: #listing-configuration + +--- + +#### <!-- md:setting config.listings_sort_by --> + +<!-- md:version 9.6.0 --> +<!-- md:default `material.plugins.tags.item_title` --> + +Use this setting to specify a custom function for comparing listing items. By +default, items are ordered by their titles, but you can change the sorting +criterion with the following configuration: + +=== "Sort by item title" + + ``` yaml + plugins: + - tags: + listings_sort_by: !!python/name:material.plugins.tags.item_title + ``` + +=== "Sort by item URL" + + ``` yaml + plugins: + - tags: + listings_sort_by: !!python/name:material.plugins.tags.item_url + ``` + +You can also define your own comparison function, which must return a string +or number representing the item, that is used for sorting, and reference it in +[`listings_sort_by`][config.listings_sort_by]. + +--- + +#### <!-- md:setting config.listings_sort_reverse --> + +<!-- md:version 9.6.0 --> +<!-- md:default `false` --> + +Use this setting to reverse the order in which items are sorted when comparing +them. By default, items are sorted in ascending order, but you can reverse +ordering as follows: + +``` yaml +plugins: + - tags: + listings_sort_reverse: true +``` + +--- + +#### <!-- md:setting config.listings_tags_sort_by --> + +<!-- md:version 9.6.0 --> +<!-- md:default `material.plugins.tags.tag_name` --> + +Use this setting to specify a custom function for comparing tags in listings. By +default, tag comparison is case-sensitive, but you can use `tag_name_casefold` +for case-insensitivity: + +``` yaml +plugins: + - tags: + tags_sort_by: !!python/name:material.plugins.tags.tag_name_casefold +``` + +You can also define your own comparison function, which must return a string +or number representing the tag, that is used for sorting, and reference it in +[`tags_sort_by`][config.tags_sort_by]. + +--- + +#### <!-- md:setting config.listings_tags_sort_reverse --> + +<!-- md:version 9.6.0 --> +<!-- md:default `false` --> + +Use this setting to reverse the order in which tags are sorted when comparing +them. By default, tags are sorted in ascending order, but you can reverse +ordering as follows: + +``` yaml +plugins: + - tags: + tags_sort_reverse: true +``` + +--- + +#### <!-- md:setting config.listings_directive --> + +<!-- md:version 9.6.0 --> +<!-- md:default `material/tags` --> + +Use this setting to change the name of the directive the plugin will look for +when processing pages. If you want to use a shorter directive than +`material/tags`, you could use: + +``` yaml +plugins: + - tags: + listings_directive: $tags +``` + +Using this setting, listings must now be referenced as such: + +``` html +<!-- $tags { include: [foo, bar] } --> +``` + +--- + +#### <!-- md:setting config.listings_toc --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable tags showing up in the table of contents. +If you don't want tags to show up in the table of contents, you can disable this +behavior with: + +``` yaml +plugins: + - tags: + listings_toc: false +``` + +### Shadow tags + +The following settings are available for shadow tags: + +--- + +#### <!-- md:setting config.shadow --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +Use this setting to specify whether the plugin should include shadow tags on +pages and in listings when [building your project], which might be useful for +deploy previews: + +=== "Show shadow tags" + + ``` yaml + plugins: + - tags: + shadow: true + ``` + +=== "Hide shadow tags" + + ``` yaml + plugins: + - tags: + shadow: false + ``` + +--- + +#### <!-- md:setting config.shadow_on_serve --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin should include shadow tags on +pages and in listings when [previewing your site]. If you don't wish to include +them when previewing, use: + +``` yaml +plugins: + - tags: + shadow_on_serve: false +``` + + [previewing your site]: ../creating-your-site.md#previewing-as-you-write + +--- + +#### <!-- md:setting config.shadow_tags --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +The plugin allows to specify a predefined list of shadow tags which can be +included and excluded from builds by using the [`shadow`][config.shadow] +setting. Shadow tags must be specified as a list: + +``` yaml +plugins: + - tags: + shadow_tags: + - Draft + - Internal +``` + +--- + +#### <!-- md:setting config.shadow_tags_prefix --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to specify a string that is checked as a prefix for each tag. +If the tag starts with this string, the tag is marked as a shadow tag. A common +practice is to use `_` as a prefix: + +``` yaml +plugins: + - tags: + shadow_tags_prefix: _ +``` + +--- + +#### <!-- md:setting config.shadow_tags_suffix --> + +<!-- md:version 9.7.0 --> +<!-- md:default none --> + +Use this setting to specify a string that is checked as a suffix for each tag. +If the tag ends with this string, the tag is marked as a shadow tag. One option +can be to use `Internal` as a suffix: + + +``` yaml +plugins: + - tags: + shadow_tags_suffix: Internal +``` + +### Export + +The following settings are available for exporting: + +--- + +#### <!-- md:setting config.export --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to control whether the plugin creates a `tags.json` file +inside your [`site` directory][mkdocs.site_dir], which can then be consumed by +other plugins and projects: + +``` yaml +plugins: + - tags: + export: true +``` + +--- + +#### <!-- md:setting config.export_file --> + +<!-- md:version 9.7.0 --> +<!-- md:default `tags.json` --> + +Use this setting to change the path of the file where the exported tags are +stored. It's normally not necessary to change this setting, but if you need to, +use: + +``` yaml +plugins: + - tags: + export_file: tags.json +``` + +The provided path is resolved from the [`site` directory][mkdocs.site_dir]. + +--- + +#### <!-- md:setting config.export_only --> + +<!-- md:version 9.7.0 --> +<!-- md:default `false` --> + +This setting is solely provided for convenience to disable the rendering of tags +and listings with a single setting (e.g. by using an environment variable), +while keeping the export functionality: + +``` yaml +plugins: + - tags: + export_only: true +``` + +This will automatically disable the [`tags`][config.tags] and +[`listings`][config.listings] settings. + +## Usage + +### Metadata + +The following properties are available: + +--- + +#### <!-- md:setting meta.tags --> + +<!-- md:version 8.2.0 --> +<!-- md:flag metadata --> +<!-- md:default none --> + +Use this property to associate a page with one or more tags, making the page +appear in the generated tags index. Tags are defined as a list of strings +(whitespaces are allowed): + +``` yaml +--- +tags: + - HTML5 + - JavaScript + - CSS +--- + +# Page title +... +``` + +If you want to prevent accidental typos when assigning tags to pages, you can +set a predefined list of allowed tags in `mkdocs.yml` by using the +[`tags_allowed`][config.tags_allowed] setting. + +### Listing configuration + +The listings configuration controls which tags are included in or excluded from +a listing and whether a listing only includes pages in the current scope. +Furthermore, listings can override some values from the global configuration. + +The following settings are available: + +--- + +#### <!-- md:setting listing.scope --> + +<!-- md:version 9.6.0 --> +<!-- md:default `false` --> + +This setting specifies whether the listing should only consider pages that are +within the current subsection of the documentation of the page the listing is +embedded in: + +=== "Inline usage" + + ``` html + <!-- material/tags { scope: true } --> + ``` + +=== "Usage in `mkdocs.yml`" + + ``` yaml + plugins: + - tags: + listings_map: + custom-id: + scope: false + ``` + + Then, just reference the listing identifier: + + ``` html + <!-- material/tags custom-id --> + ``` + +--- + +#### <!-- md:setting listing.shadow --> + +<!-- md:version 9.7.0 --> +<!-- md:default computed --> + +This setting specifies whether the listing should include shadow tags, which +allows to override the global [`shadow`][config.shadow] setting on a per-listing +basis: + +=== "Inline usage" + + ``` html + <!-- material/tags { shadow: true } --> + ``` + +=== "Usage in `mkdocs.yml`" + + ``` yaml + plugins: + - tags: + listings_map: + custom-id: + shadow: true + ``` + + Then, just reference the listing identifier: + + ``` html + <!-- material/tags custom-id --> + ``` + +--- + +#### <!-- md:setting listing.toc --> + +<!-- md:version 9.7.0 --> +<!-- md:default [`listings_toc`][config.listings_toc] --> + +This setting specifies whether the listing should render tags inside the table +of contents, allowing to override the global [`listings_toc`][config.listings_toc] +setting on a per-listing basis: + +=== "Inline usage" + + ``` html + <!-- material/tags { toc: true } --> + ``` + +=== "Usage in `mkdocs.yml`" + + ``` yaml + plugins: + - tags: + listings_map: + custom-id: + toc: true + ``` + + Then, just reference the listing identifier: + + ``` html + <!-- material/tags custom-id --> + ``` + +--- + +#### <!-- md:setting listing.include --> + +<!-- md:version 9.6.0 --> +<!-- md:default none --> + +Use this setting to specify which tags should be included in the listing. Each +page that features a tag that is part of this setting, is listed under the +respective tag: + +=== "Inline usage" + + ``` html + <!-- material/tags { include: [foo, bar] } --> + ``` + +=== "Usage in `mkdocs.yml`" + + ``` yaml + plugins: + - tags: + listings_map: + custom-id: + include: + - foo + - bar + ``` + + Then, just reference the listing identifier: + + ``` html + <!-- material/tags custom-id --> + ``` + +If this setting is left empty, all tags and pages are included. + +--- + +#### <!-- md:setting listing.exclude --> + +<!-- md:version 9.6.0 --> +<!-- md:default none --> + +Use this setting to specify which tags should be excluded from the listing. Each +page that features a tag that is part of this setting, is excluded from the +listing entirely: + +=== "Inline usage" + + ``` html + <!-- material/tags { exclude: [foo, bar] } --> + ``` + +=== "Usage in `mkdocs.yml`" + + ``` yaml + plugins: + - tags: + listings_map: + custom-id: + exclude: + - foo + - bar + ``` + + Then, just reference the listing identifier: + + ``` html + <!-- material/tags custom-id --> + ``` + +If this setting is left empty, no tags or pages are excluded. + +## Limitations + +The implementation of the tags plugin is tricky due to MkDocs architecture. +Notably, tag listing markers cannot appear within code blocks. For technical +details, refer to #8114. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/typeset.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/typeset.md new file mode 100644 index 0000000..dcde297 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/plugins/typeset.md @@ -0,0 +1,96 @@ +--- +title: Built-in typeset plugin +icon: material/format-title +status: deprecated +--- + +# Built-in typeset plugin + +The typeset plugin allows to preserve the enriched presentation of titles and +headlines within the navigation and table of contents. This means that code +blocks, icons, emojis and any other inline formatting can be rendered exactly +as defined in the page's content. + +!!! bug "The built-in typeset plugin is deprecated" + + [Material for MkDocs is in maintenance mode]. The typeset plugin, which was + formely part of the [Insiders] edition, was released in <!-- md:version 9.7.0 -->, the last release that includes all features from the Insiders edition. + Unfortunately, the typeset plugin turned out impossible to maintain, and + was one of the key motivators to create [Zensical]. + + --- + + __If you're considering the typeset plugin, please be aware that known issues will <u>not</u> be fixed.__ + + [Material for MkDocs is in maintenance mode]: https://github.com/squidfunk/mkdocs-material/issues/8523 + [Zensical]: ../blog/posts/zensical.md + [Insiders]: ../insiders/index.md + +## Objective + +### How it works + +When [building your project], MkDocs extracts the plain text from headlines and +drops the original formatting. This is generally useful and a good idea, since +this information is made available to other plugins that might have problems +when being passed HTML instead of plain text. + +However, it also means that the entire formatting is lost. + +The plugin hooks into the rendering process, extracts the original headlines, +and makes them available to be used in templates and plugins. The templates of +Material for MkDocs use this information to render an enriched version of the +navigation and table of contents. + + [building your project]: ../creating-your-site.md#building-your-site + +### When to use it + +It's generally recommended to use the plugin, because it is a drop-in solution +that doesn't require any configuration and is designed to work out of the box. +Since it doesn't overwrite but only adds information, it's not expected to +interfere with other plugins. + +## Configuration + +<!-- md:version 9.7.0 --> +<!-- md:plugin [typeset] – built-in --> +<!-- md:flag experimental --> + +As with all [built-in plugins], getting started with the typeset plugin is +straightforward. Just add the following lines to `mkdocs.yml`, and observe the +enriched navigation and table of contents: + +``` yaml +plugins: + - typeset +``` + +The typeset plugin is built into Material for MkDocs and doesn't need to be +installed. + + [typeset]: typeset.md + [built-in plugins]: index.md + +### General + +The following settings are available: + +--- + +#### <!-- md:setting config.enabled --> + +<!-- md:version 9.7.0 --> +<!-- md:default `true` --> + +Use this setting to enable or disable the plugin when [building your project]. +It's normally not necessary to specify this setting, but if you want to disable +the plugin, use: + +``` yaml +plugins: + - typeset: + enabled: false +``` + + [building your project]: ../creating-your-site.md#building-your-site diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/publishing-your-site.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/publishing-your-site.md new file mode 100644 index 0000000..86651b9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/publishing-your-site.md @@ -0,0 +1,193 @@ +# Publishing your site + +The great thing about hosting project documentation in a `git` repository is +the ability to deploy it automatically when new changes are pushed. MkDocs +makes this ridiculously simple. + +## GitHub Pages + +If you're already hosting your code on GitHub, [GitHub Pages] is certainly +the most convenient way to publish your project documentation. It's free of +charge and pretty easy to set up. + + [GitHub Pages]: https://pages.github.com/ + +### with GitHub Actions + +Using [GitHub Actions] you can automate the deployment of your project +documentation. At the root of your repository, create a new GitHub Actions +workflow, e.g. `.github/workflows/ci.yml`, and copy and paste the following +contents: + +``` yaml +name: ci # (1)! +on: + push: + branches: + - master # (2)! + - main +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Git Credentials + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + - uses: actions/setup-python@v5 + with: + python-version: 3.x + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV # (3)! + - uses: actions/cache@v4 + with: + key: mkdocs-material-${{ env.cache_id }} + path: ~/.cache # (4)! + restore-keys: | + mkdocs-material- + - run: pip install mkdocs-material # (5)! + - run: mkdocs gh-deploy --force +``` + +1. You can change the name to your liking. + +2. At some point, GitHub renamed `master` to `main`. If your default branch + is named `master`, you can safely remove `main`, vice versa. + +3. Store the `cache_id` environmental variable to access it later during cache + `key` creation. The name is case-sensitive, so be sure to align it with `${{ env.cache_id }}`. + + - The `--utc` option makes sure that each workflow runner uses the same time zone. + - The `%V` format assures a cache update once a week. + - You can change the format to `%F` to have daily cache updates. + + You can read the [manual page] to learn more about the formatting options of the `date` command. + +4. Some Material for MkDocs plugins use [caching] to speed up repeated + builds, and store the results in the `~/.cache` directory. + +5. This is the place to install further [MkDocs plugins] or Markdown + extensions with `pip` to be used during the build: + + ``` sh + pip install \ + mkdocs-material \ + mkdocs-awesome-pages-plugin \ + ... + ``` + +Now, when a new commit is pushed to either the `master` or `main` branches, +the static site is automatically built and deployed. Push your changes to see +the workflow in action. + +If the GitHub Page doesn't show up after a few minutes, go to the settings of +your repository and ensure that the [publishing source branch] for your GitHub +Page is set to `gh-pages`. + +Your documentation should shortly appear at `<username>.github.io/<repository>`. + +To publish your site on a custom domain, please refer to the [MkDocs documentation]. + + [GitHub Actions]: https://github.com/features/actions + [MkDocs plugins]: https://github.com/mkdocs/mkdocs/wiki/MkDocs-Plugins + [personal access token]: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token + [built-in optimize plugin]: plugins/optimize.md + [GitHub secrets]: https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets + [publishing source branch]: https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site + [manual page]: https://man7.org/linux/man-pages/man1/date.1.html + [caching]: plugins/requirements/caching.md + [MkDocs documentation]: https://www.mkdocs.org/user-guide/deploying-your-docs/#custom-domains + +### with MkDocs + +If you prefer to deploy your project documentation manually, you can just invoke +the following command from the directory containing the `mkdocs.yml` file: + +``` +mkdocs gh-deploy --force +``` + +This will build your documentation and deploy it to a branch +`gh-pages` in your repository. See [this overview in the MkDocs +documentation] for more information. For a description of the +arguments, see [the documentation for the command]. + + [this overview in the MkDocs documentation]: https://www.mkdocs.org/user-guide/deploying-your-docs/#project-pages + [the documentation for the command]: https://www.mkdocs.org/user-guide/cli/#mkdocs-gh-deploy + +## GitLab Pages + +If you're hosting your code on GitLab, deploying to [GitLab Pages] can be done +by using the [GitLab CI] task runner. At the root of your repository, create a +task definition named `.gitlab-ci.yml` and copy and paste the following +contents: + +``` yaml +pages: + stage: deploy + image: python:latest + script: + - pip install mkdocs-material + - mkdocs build --site-dir public + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - ~/.cache/ # (1)! + artifacts: + paths: + - public + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' +``` + +1. Some Material for MkDocs plugins use [caching] to speed up repeated + builds, and store the results in the `~/.cache` directory. + +Now, when a new commit is pushed to the [default branch] (typically `master` or +`main`), the static site is automatically built and deployed. Commit and push +the file to your repository to see the workflow in action. + +Your documentation is not published under `<username>.gitlab.io/<repository>` +by default since **GitLab 17.4** [^1]. However, if you prefer a cleaner URL +structure, such as `<username>.gitlab.io/<repository>`, you need to adjust +your configuration. + +To switch from a unique domain to the traditional URL structure, follow +these steps: + +1. Locate Your Repository +2. Go to **Settings › Pages** in the repository menu. +3. In the **Unique domain settings** section, **uncheck** the box labeled +4. **Use unique domain**. +5. Click **Save changes** to apply the update. + +Now you can reach your documentation under `<username>.gitlab.io/<repository>`. + +[^1]: [Release notes for Gitlab 17.4](https://about.gitlab.com/releases/2024/09/19/gitlab-17-4-released/) + +## Other + +Since we can't cover all possible platforms, we rely on community contributed +guides that explain how to deploy websites built with Material for MkDocs to +other providers: + +<div class="mdx-columns" markdown> + +- [:simple-cloudflarepages: Cloudflare Pages][Cloudflare Pages] +- [:material-airballoon-outline: Fly.io][Flyio] +- [:simple-netlify: Netlify][Netlify] +- [:simple-scaleway: Scaleway][Scaleway] + +</div> + + [GitLab Pages]: https://gitlab.com/pages + [GitLab CI]: https://docs.gitlab.com/ee/ci/ + [masked custom variables]: https://docs.gitlab.com/ee/ci/variables/#mask-a-cicd-variable + [default branch]: https://docs.gitlab.com/ee/user/project/repository/branches/default.html + [Cloudflare Pages]: https://deborahwrites.com/guides/deploy-host-mkdocs/deploy-mkdocs-material-cloudflare/ + [Flyio]: https://documentation.breadnet.co.uk/cloud/fly/mkdocs-on-fly/ + [Netlify]: https://deborahwrites.com/guides/deploy-host-mkdocs/deploy-mkdocs-material-netlify/ + [Scaleway]: https://www.scaleway.com/en/docs/tutorials/using-bucket-website-with-mkdocs/ + diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/admonitions.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/admonitions.md new file mode 100644 index 0000000..d8b6568 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/admonitions.md @@ -0,0 +1,539 @@ +--- +icon: material/alert-outline +--- + +# Admonitions + +Admonitions, also known as _call-outs_, are an excellent choice for including +side content without significantly interrupting the document flow. Material for +MkDocs provides several different types of admonitions and allows for the +inclusion and nesting of arbitrary content. + +## Configuration + +This configuration enables admonitions, allows to make them collapsible and to +nest arbitrary content inside admonitions. Add the following lines to +`mkdocs.yml`: + +``` yaml +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences +``` + +See additional configuration options: + +- [Admonition] +- [Details] +- [SuperFences] + + [Admonition]: ../setup/extensions/python-markdown.md#admonition + [Details]: ../setup/extensions/python-markdown-extensions.md#details + [SuperFences]: ../setup/extensions/python-markdown-extensions.md#superfences + +### Admonition icons + +<!-- md:version 8.3.0 --> + +Each of the supported admonition types has a distinct icon, which can be changed +to any icon bundled with the theme, or even a [custom icon]. Add the following +lines to `mkdocs.yml`: + +``` yaml +theme: + icon: + admonition: + <type>: <icon> # (1)! +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="alert" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +??? example "Expand to show alternate icon sets" + + === ":octicons-mark-github-16: Octicons" + + ``` yaml + theme: + icon: + admonition: + note: octicons/tag-16 + abstract: octicons/checklist-16 + info: octicons/info-16 + tip: octicons/squirrel-16 + success: octicons/check-16 + question: octicons/question-16 + warning: octicons/alert-16 + failure: octicons/x-circle-16 + danger: octicons/zap-16 + bug: octicons/bug-16 + example: octicons/beaker-16 + quote: octicons/quote-16 + ``` + + + === ":fontawesome-brands-font-awesome: FontAwesome" + + ``` yaml + theme: + icon: + admonition: + note: fontawesome/solid/note-sticky + abstract: fontawesome/solid/book + info: fontawesome/solid/circle-info + tip: fontawesome/solid/bullhorn + success: fontawesome/solid/check + question: fontawesome/solid/circle-question + warning: fontawesome/solid/triangle-exclamation + failure: fontawesome/solid/bomb + danger: fontawesome/solid/skull + bug: fontawesome/solid/robot + example: fontawesome/solid/flask + quote: fontawesome/solid/quote-left + ``` + + [custom icon]: ../setup/changing-the-logo-and-icons.md#additional-icons + [supported types]: #supported-types + [icon search]: icons-emojis.md#search + +## Usage + +Admonitions follow a simple syntax: a block starts with `!!!`, followed by a +single keyword used as a [type qualifier]. The content of the block follows on +the next line, indented by four spaces: + +``` markdown title="Admonition" +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +</div> + + [type qualifier]: #supported-types + +### Changing the title + +By default, the title will equal the type qualifier in titlecase. However, it +can be changed by adding a quoted string containing valid Markdown (including +links, formatting, ...) after the type qualifier: + +``` markdown title="Admonition with custom title" +!!! note "Phasellus posuere in sem ut cursus" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +!!! note "Phasellus posuere in sem ut cursus" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +</div> + +### Nested admonitions + +You can also include nested admonitions in your documentation. To do this, you +can use your existing admonitions and indent the desired ones: + +``` markdown title="Nested Admonition" +!!! note "Outer Note" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + + !!! note "Inner Note" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +!!! note "Outer Note" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + + !!! note "Inner Note" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +</div> + +### Removing the title + +Similar to [changing the title], the icon and title can be omitted entirely by +adding an empty string directly after the type qualifier. Note that this will +not work for [collapsible blocks]: + +``` markdown title="Admonition without title" +!!! note "" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +!!! note "" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +</div> + + [changing the title]: #changing-the-title + [collapsible blocks]: #collapsible-blocks + +### Collapsible blocks + +When [Details] is enabled and an admonition block is started with `???` instead +of `!!!`, the admonition is rendered as an expandable block with a small toggle +on the right side: + +``` markdown title="Admonition, collapsible" +??? note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +??? note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +</div> + +Adding a `+` after the `???` token renders the block expanded: + +``` markdown title="Admonition, collapsible and initially expanded" +???+ note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +???+ note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +</div> + +### Inline blocks + +Admonitions can also be rendered as inline blocks (e.g., for sidebars), placing +them to the right using the `inline` + `end` modifiers, or to the left using +only the `inline` modifier: + +=== ":octicons-arrow-right-16: inline end" + + !!! info inline end "Lorem ipsum" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + + ``` markdown + !!! info inline end "Lorem ipsum" + + Lorem ipsum dolor sit amet, consectetur + adipiscing elit. Nulla et euismod nulla. + Curabitur feugiat, tortor non consequat + finibus, justo purus auctor massa, nec + semper lorem quam in massa. + ``` + + Use `inline end` to align to the right (left for rtl languages). + +=== ":octicons-arrow-left-16: inline" + + !!! info inline "Lorem ipsum" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + + ``` markdown + !!! info inline "Lorem ipsum" + + Lorem ipsum dolor sit amet, consectetur + adipiscing elit. Nulla et euismod nulla. + Curabitur feugiat, tortor non consequat + finibus, justo purus auctor massa, nec + semper lorem quam in massa. + ``` + + Use `inline` to align to the left (right for rtl languages). + +__Important__: admonitions that use the `inline` modifiers _must_ be declared +prior to the content block you want to place them beside. If there's +insufficient space to render the admonition next to the block, the admonition +will stretch to the full width of the viewport, e.g., on mobile viewports. + +### Supported types + +Following is a list of type qualifiers provided by Material for MkDocs, whereas +the default type, and thus fallback for unknown type qualifiers, is `note`[^1]: + + [^1]: + Previously, some of the supported types defined more than one qualifier. + For example, authors could use `summary` or `tldr` as alternative qualifiers + to render an [`abstract`](#+type:abstract) admonition. As this increased the + size of the CSS that is shipped with Material for MkDocs, the additional + type qualifiers are now all deprecated and will be removed in the next major + version. This will also be mentioned in the upgrade guide. + +<!-- md:option type:note --> + +: !!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:abstract --> + +: !!! abstract + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:info --> + +: !!! info + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:tip --> + +: !!! tip + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:success --> + +: !!! success + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:question --> + +: !!! question + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:warning --> + +: !!! warning + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:failure --> + +: !!! failure + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:danger --> + +: !!! danger + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:bug --> + +: !!! bug + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:example --> + +: !!! example + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +<!-- md:option type:quote --> + +: !!! quote + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +## Customization + +### Classic admonitions + +Prior to version <!-- md:version 8.5.6 -->, admonitions had a slightly +different appearance: + +!!! classic "Note" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +If you want to restore this appearance, add the following CSS to an +[additional style sheet]: + +<style> + .md-typeset .admonition.classic { + border-width: 0; + border-left-width: 4px; + } +</style> + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + .md-typeset .admonition, + .md-typeset details { + border-width: 0; + border-left-width: 4px; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +### Custom admonitions + +If you want to add a custom admonition type, all you need is a color and an +`*.svg` icon. Copy the icon's code from the [`.icons`][custom icons] folder +and add the following CSS to an [additional style sheet]: + +<style> + :root { + --md-admonition-icon--pied-piper: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M244 246c-3.2-2-6.3-2.9-10.1-2.9-6.6 0-12.6 3.2-19.3 3.7l1.7 4.9zm135.9 197.9c-19 0-64.1 9.5-79.9 19.8l6.9 45.1c35.7 6.1 70.1 3.6 106-9.8-4.8-10-23.5-55.1-33-55.1zM340.8 177c6.6 2.8 11.5 9.2 22.7 22.1 2-1.4 7.5-5.2 7.5-8.6 0-4.9-11.8-13.2-13.2-23 11.2-5.7 25.2-6 37.6-8.9 68.1-16.4 116.3-52.9 146.8-116.7C548.3 29.3 554 16.1 554.6 2l-2 2.6c-28.4 50-33 63.2-81.3 100-31.9 24.4-69.2 40.2-106.6 54.6l-6.3-.3v-21.8c-19.6 1.6-19.7-14.6-31.6-23-18.7 20.6-31.6 40.8-58.9 51.1-12.7 4.8-19.6 10-25.9 21.8 34.9-16.4 91.2-13.5 98.8-10zM555.5 0l-.6 1.1-.3.9.6-.6zm-59.2 382.1c-33.9-56.9-75.3-118.4-150-115.5l-.3-6c-1.1-13.5 32.8 3.2 35.1-31l-14.4 7.2c-19.8-45.7-8.6-54.3-65.5-54.3-14.7 0-26.7 1.7-41.4 4.6 2.9 18.6 2.2 36.7-10.9 50.3l19.5 5.5c-1.7 3.2-2.9 6.3-2.9 9.8 0 21 42.8 2.9 42.8 33.6 0 18.4-36.8 60.1-54.9 60.1-8 0-53.7-50-53.4-60.1l.3-4.6 52.3-11.5c13-2.6 12.3-22.7-2.9-22.7-3.7 0-43.1 9.2-49.4 10.6-2-5.2-7.5-14.1-13.8-14.1-3.2 0-6.3 3.2-9.5 4-9.2 2.6-31 2.9-21.5 20.1L15.9 298.5c-5.5 1.1-8.9 6.3-8.9 11.8 0 6 5.5 10.9 11.5 10.9 8 0 131.3-28.4 147.4-32.2 2.6 3.2 4.6 6.3 7.8 8.6 20.1 14.4 59.8 85.9 76.4 85.9 24.1 0 58-22.4 71.3-41.9 3.2-4.3 6.9-7.5 12.4-6.9.6 13.8-31.6 34.2-33 43.7-1.4 10.2-1 35.2-.3 41.1 26.7 8.1 52-3.6 77.9-2.9 4.3-21 10.6-41.9 9.8-63.5l-.3-9.5c-1.4-34.2-10.9-38.5-34.8-58.6-1.1-1.1-2.6-2.6-3.7-4 2.2-1.4 1.1-1 4.6-1.7 88.5 0 56.3 183.6 111.5 229.9 33.1-15 72.5-27.9 103.5-47.2-29-25.6-52.6-45.7-72.7-79.9zm-196.2 46.1v27.2l11.8-3.4-2.9-23.8zm-68.7-150.4l24.1 61.2 21-13.8-31.3-50.9zm84.4 154.9l2 12.4c9-1.5 58.4-6.6 58.4-14.1 0-1.4-.6-3.2-.9-4.6-26.8 0-36.9 3.8-59.5 6.3z"/></svg>') + } + .md-typeset .admonition.pied-piper, + .md-typeset details.pied-piper { + border-color: rgb(43, 155, 70); + } + .md-typeset .pied-piper > .admonition-title, + .md-typeset .pied-piper > summary { + background-color: rgba(43, 155, 70, 0.1); + } + .md-typeset .pied-piper > .admonition-title::before, + .md-typeset .pied-piper > summary::before { + background-color: rgb(43, 155, 70); + -webkit-mask-image: var(--md-admonition-icon--pied-piper); + mask-image: var(--md-admonition-icon--pied-piper); + } +</style> + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + :root { + --md-admonition-icon--pied-piper: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M244 246c-3.2-2-6.3-2.9-10.1-2.9-6.6 0-12.6 3.2-19.3 3.7l1.7 4.9zm135.9 197.9c-19 0-64.1 9.5-79.9 19.8l6.9 45.1c35.7 6.1 70.1 3.6 106-9.8-4.8-10-23.5-55.1-33-55.1zM340.8 177c6.6 2.8 11.5 9.2 22.7 22.1 2-1.4 7.5-5.2 7.5-8.6 0-4.9-11.8-13.2-13.2-23 11.2-5.7 25.2-6 37.6-8.9 68.1-16.4 116.3-52.9 146.8-116.7C548.3 29.3 554 16.1 554.6 2l-2 2.6c-28.4 50-33 63.2-81.3 100-31.9 24.4-69.2 40.2-106.6 54.6l-6.3-.3v-21.8c-19.6 1.6-19.7-14.6-31.6-23-18.7 20.6-31.6 40.8-58.9 51.1-12.7 4.8-19.6 10-25.9 21.8 34.9-16.4 91.2-13.5 98.8-10zM555.5 0l-.6 1.1-.3.9.6-.6zm-59.2 382.1c-33.9-56.9-75.3-118.4-150-115.5l-.3-6c-1.1-13.5 32.8 3.2 35.1-31l-14.4 7.2c-19.8-45.7-8.6-54.3-65.5-54.3-14.7 0-26.7 1.7-41.4 4.6 2.9 18.6 2.2 36.7-10.9 50.3l19.5 5.5c-1.7 3.2-2.9 6.3-2.9 9.8 0 21 42.8 2.9 42.8 33.6 0 18.4-36.8 60.1-54.9 60.1-8 0-53.7-50-53.4-60.1l.3-4.6 52.3-11.5c13-2.6 12.3-22.7-2.9-22.7-3.7 0-43.1 9.2-49.4 10.6-2-5.2-7.5-14.1-13.8-14.1-3.2 0-6.3 3.2-9.5 4-9.2 2.6-31 2.9-21.5 20.1L15.9 298.5c-5.5 1.1-8.9 6.3-8.9 11.8 0 6 5.5 10.9 11.5 10.9 8 0 131.3-28.4 147.4-32.2 2.6 3.2 4.6 6.3 7.8 8.6 20.1 14.4 59.8 85.9 76.4 85.9 24.1 0 58-22.4 71.3-41.9 3.2-4.3 6.9-7.5 12.4-6.9.6 13.8-31.6 34.2-33 43.7-1.4 10.2-1 35.2-.3 41.1 26.7 8.1 52-3.6 77.9-2.9 4.3-21 10.6-41.9 9.8-63.5l-.3-9.5c-1.4-34.2-10.9-38.5-34.8-58.6-1.1-1.1-2.6-2.6-3.7-4 2.2-1.4 1.1-1 4.6-1.7 88.5 0 56.3 183.6 111.5 229.9 33.1-15 72.5-27.9 103.5-47.2-29-25.6-52.6-45.7-72.7-79.9zm-196.2 46.1v27.2l11.8-3.4-2.9-23.8zm-68.7-150.4l24.1 61.2 21-13.8-31.3-50.9zm84.4 154.9l2 12.4c9-1.5 58.4-6.6 58.4-14.1 0-1.4-.6-3.2-.9-4.6-26.8 0-36.9 3.8-59.5 6.3z"/></svg>') + } + .md-typeset .admonition.pied-piper, + .md-typeset details.pied-piper { + border-color: rgb(43, 155, 70); + } + .md-typeset .pied-piper > .admonition-title, + .md-typeset .pied-piper > summary { + background-color: rgba(43, 155, 70, 0.1); + } + .md-typeset .pied-piper > .admonition-title::before, + .md-typeset .pied-piper > summary::before { + background-color: rgb(43, 155, 70); + -webkit-mask-image: var(--md-admonition-icon--pied-piper); + mask-image: var(--md-admonition-icon--pied-piper); + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +After applying the customization, you can use the custom admonition type: + +``` markdown title="Admonition with custom type" +!!! pied-piper "Pied Piper" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +!!! pied-piper "Pied Piper" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +</div> + + [custom icons]: https://github.com/squidfunk/mkdocs-material/tree/master/material/templates/.icons + [additional style sheet]: ../customization.md#additional-css diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/annotations.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/annotations.md new file mode 100644 index 0000000..2ee13c1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/annotations.md @@ -0,0 +1,246 @@ +--- +icon: material/plus-circle +--- + +# Annotations + +One of the flagship features of Material for MkDocs is the ability to inject +annotations – little markers that can be added almost anywhere in a document +and expand a tooltip containing arbitrary Markdown on click or keyboard focus. + +## Configuration + +This configuration allows to add annotations to all inline- and block-level +elements, as well as code blocks, and nest annotations inside each other. Add +the following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - attr_list + - md_in_html + - pymdownx.superfences +``` + +See additional configuration options: + +- [Attribute Lists] +- [Markdown in HTML] +- [SuperFences] + + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + [Markdown in HTML]: ../setup/extensions/python-markdown.md#markdown-in-html + [SuperFences]: ../setup/extensions/python-markdown-extensions.md#superfences + +### Annotation icons + +<!-- md:version 9.2.0 --> + +The annotation icon can be changed to any icon bundled with the theme, or even +a [custom icon], e.g. to material/arrow-right-circle:. Simply add the following +lines to `mkdocs.yml`: + +``` yaml +theme: + icon: + annotation: material/arrow-right-circle # (1)! +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="material circle" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +Some popular choices: + +- :material-plus-circle: - `material/plus-circle` +- :material-circle-medium: - `material/circle-medium` +- :material-record-circle: - `material/record-circle` +- :material-arrow-right-circle: - `material/arrow-right-circle` +- :material-arrow-right-circle-outline: - `material/arrow-right-circle-outline` +- :material-chevron-right-circle: - `material/chevron-right-circle` +- :material-star-four-points-circle: - `material/star-four-points-circle` +- :material-plus-circle-outline: - `material/plus-circle-outline` + + [custom icon]: ../setup/changing-the-logo-and-icons.md#additional-icons + [icon search]: icons-emojis.md#search + +## Usage + +### Using annotations + +<!-- md:version 9.2.0 --> +<!-- md:flag experimental --> + +Annotations consist of two parts: a marker, which can be placed anywhere in +a block marked with the `annotate` class, and content located in a list below +the block containing the marker: + +``` markdown title="Text with annotations" +Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. +{ .annotate } + +1. :man_raising_hand: I'm an annotation! I can contain `code`, __formatted + text__, images, ... basically anything that can be expressed in Markdown. +``` + +<div class="result" markdown> + +Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. +{ .annotate } + +1. :man_raising_hand: I'm an annotation! I can contain `code`, __formatted + text__, images, ... basically anything that can be written in Markdown. + +</div> + +Note that the `annotate` class must only be added to the outermost block. All +nested elements can use the same list to define annotations, except when +annotations are nested themselves. + +#### in annotations + +When [SuperFences] is enabled, annotations can be nested inside annotations by +adding the `annotate` class to the list item hosting the annotation content, +repeating the process: + +``` markdown title="Text with nested annotations" +Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. +{ .annotate } + +1. :man_raising_hand: I'm an annotation! (1) + { .annotate } + + 1. :woman_raising_hand: I'm an annotation as well! +``` + +<div class="result" markdown> + +Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. +{ .annotate } + +1. :man_raising_hand: I'm an annotation! (1) + { .annotate style="margin-bottom: 0" } + + 1. :woman_raising_hand: I'm an annotation as well! + +</div> + +#### in admonitions + +The titles and bodies of [admonitions] can also host annotations by adding the +`annotate` modifier after the type qualifier, which is similar to how +[inline blocks] work: + +``` markdown title="Admonition with annotations" +!!! note annotate "Phasellus posuere in sem ut cursus (1)" + + Lorem ipsum dolor sit amet, (2) consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +1. :man_raising_hand: I'm an annotation! +2. :woman_raising_hand: I'm an annotation as well! +``` + +<div class="result" markdown> + +!!! note annotate "Phasellus posuere in sem ut cursus (1)" + + Lorem ipsum dolor sit amet, (2) consectetur adipiscing elit. Nulla et + euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo + purus auctor massa, nec semper lorem quam in massa. + +1. :man_raising_hand: I'm an annotation! +2. :woman_raising_hand: I'm an annotation as well! + +</div> + + [admonitions]: admonitions.md + [inline blocks]: admonitions.md#inline-blocks + +#### in content tabs + +Content tabs can host annotations by adding the `annotate` class to the block +of a dedicated content tab (and not to the container, which is not supported): + +``` markdown title="Content tabs with annotations" +=== "Tab 1" + + Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. + { .annotate } + + 1. :man_raising_hand: I'm an annotation! + +=== "Tab 2" + + Phasellus posuere in sem ut cursus (1) + { .annotate } + + 1. :woman_raising_hand: I'm an annotation as well! +``` + +<div class="result" markdown> + +=== "Tab 1" + + Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. + { .annotate } + + 1. :man_raising_hand: I'm an annotation! + +=== "Tab 2" + + Phasellus posuere in sem ut cursus (1) + { .annotate } + + 1. :woman_raising_hand: I'm an annotation as well! + +</div> + +#### in everything else + +The [Attribute Lists] extension is the key ingredient for adding annotations to +most elements, but it has some [limitations]. However, it's always possible to +leverage the [Markdown in HTML] extension to wrap arbitrary elements with a +`div` with the `annotate` class: + +```` html title="HTML with annotations" +<div class="annotate" markdown> + +> Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. + +</div> + +1. :man_raising_hand: I'm an annotation! +```` + +<div class="result" markdown> + <div class="annotate" markdown> + +> Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit. + + </div> + +1. :man_raising_hand: I'm an annotation! + +</div> + +With this trick, annotations can also be added to blockquotes, lists, and many +other elements that are not supported by the [Attribute Lists] extension. +Furthermore, note that [code blocks follow different semantics]. + +!!! warning "Known limitations" + + Please note that annotations currently don't work in [data tables] as + reported in #3453, as data tables are scrollable elements and positioning + is very tricky to get right. This might be fixed in the future. + + [limitations]: https://python-markdown.github.io/extensions/attr_list/#limitations + [code blocks follow different semantics]: code-blocks.md#adding-annotations + [data tables]: data-tables.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/buttons.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/buttons.md new file mode 100644 index 0000000..03dcb6d --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/buttons.md @@ -0,0 +1,84 @@ +--- +icon: material/button-cursor +--- + +# Buttons + +Material for MkDocs provides dedicated styles for primary and secondary buttons +that can be added to any link, `label` or `button` element. This is especially +useful for documents or landing pages with dedicated _call-to-actions_. + +## Configuration + +This configuration allows to add attributes to all inline- and block-level +elements with a simple syntax, turning any link into a button. Add the +following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - attr_list +``` + +See additional configuration options: + +- [Attribute Lists] + + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + +## Usage + +### Adding buttons + +In order to render a link as a button, suffix it with curly braces and add the +`.md-button` class selector to it. The button will receive the selected +[primary color] and [accent color] if active. + +``` markdown title="Button" +[Subscribe to our newsletter](#){ .md-button } +``` + +<div class="result" markdown> + +[Subscribe to our newsletter][Demo]{ .md-button } + +</div> + + [primary color]: ../setup/changing-the-colors.md#primary-color + [accent color]: ../setup/changing-the-colors.md#accent-color + [Demo]: javascript:alert$.next("Demo") + +### Adding primary buttons + +If you want to display a filled, primary button (like on the [landing page] +of Material for MkDocs), add both, the `.md-button` and `.md-button--primary` +CSS class selectors. + +``` markdown title="Button, primary" +[Subscribe to our newsletter](#){ .md-button .md-button--primary } +``` + +<div class="result" markdown> + +[Subscribe to our newsletter][Demo]{ .md-button .md-button--primary } + +</div> + + [landing page]: ../index.md + +### Adding icon buttons + +Of course, icons can be added to all types of buttons by using the [icon syntax] +together with any valid icon shortcode, which can be easily found with a few keystrokes through our [icon search]. + +``` markdown title="Button with icon" +[Send :fontawesome-solid-paper-plane:](#){ .md-button } +``` + +<div class="result" markdown> + +[Send :fontawesome-solid-paper-plane:][Demo]{ .md-button } + +</div> + + [icon syntax]: icons-emojis.md#using-icons + [icon search]: icons-emojis.md#search diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/code-blocks.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/code-blocks.md new file mode 100644 index 0000000..7342733 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/code-blocks.md @@ -0,0 +1,546 @@ +--- +icon: material/code-json +--- + +# Code blocks + +Code blocks and examples are an essential part of technical project +documentation. Material for MkDocs provides different ways to set up syntax +highlighting for code blocks, either during build time using [Pygments] or +during runtime using a JavaScript syntax highlighter. + + [Pygments]: https://pygments.org + +## Configuration + +This configuration enables syntax highlighting on code blocks and inline code +blocks, and allows to include source code directly from other files. Add the +following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences +``` + +The following sections discuss how to use different syntax highlighting features +with [Pygments], the recommended highlighter, so they don't apply when using a +JavaScript syntax highlighter. + +See additional configuration options: + +- [Highlight] +- [InlineHilite] +- [SuperFences] +- [Snippets] + + [Highlight]: ../setup/extensions/python-markdown-extensions.md#highlight + [InlineHilite]: ../setup/extensions/python-markdown-extensions.md#inlinehilite + [SuperFences]: ../setup/extensions/python-markdown-extensions.md#superfences + [Snippets]: ../setup/extensions/python-markdown-extensions.md#snippets + +### Code copy button + +<!-- md:version 9.0.0 --> +<!-- md:feature --> + +Code blocks can automatically render a button on the right side to allow the +user to copy a code block's contents to the clipboard. Add the following to +`mkdocs.yml` to enable them globally: + +``` yaml +theme: + features: + - content.code.copy +``` + +??? info "Enabling or disabling code copy buttons for a specific code block" + + If you don't want to enable code copy buttons globally, you can enable them + for a specific code block by using a slightly different syntax based on the + [Attribute Lists] extension: + + ```` yaml + ``` { .yaml .copy } + # Code block content + ``` + ```` + + Note that there must be a language shortcode, which has to come first and + must also be prefixed by a `.`. Similarly, the copy button can also be + disabled for a specific code block: + + ```` { .yaml .no-copy } + ``` { .yaml .no-copy } + # Code block content + ``` + ```` + + To enable or disable the copy button without syntax highlighting, you can + use the `.text` language shortcode, which doesn't highlight anything. + +### Code selection button + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +Code blocks can include a button to allow for the selection of line ranges by +the user, which is perfect for linking to a specific subsection of a code block. This allows the user to apply [line highlighting] dynamically. Add the following +to `mkdocs.yml` to enable it globally: + +``` yaml +theme: + features: + - content.code.select +``` + +??? info "Enabling or disabling code selection buttons for a specific code block" + + If you don't want to enable code selection buttons globally, you can enable + them for a specific code block by using a slightly different syntax based on + the [Attribute Lists] extension: + + ```` yaml + ``` { .yaml .select } + # Code block content + ``` + ```` + + Note that the language shortcode which has to come first must now also be + prefixed by a `.`. Similarly, the selection button can also be disabled for + a specific code block: + + ```` { .yaml .no-select } + ``` { .yaml .no-select } + # Code block content + ``` + ```` + + [line highlighting]: #highlighting-specific-lines + +### Code annotations + +<!-- md:version 8.0.0 --> +<!-- md:feature --> + +Code annotations offer a comfortable and friendly way to attach arbitrary +content to specific sections of code blocks by adding numeric markers in block +and inline comments in the language of the code block. Add the following to +`mkdocs.yml` to enable them globally: + +``` yaml +theme: + features: + - content.code.annotate # (1)! +``` + +1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted + text__, images, ... basically anything that can be written in Markdown. + +??? info "Enabling code annotations for a specific code block" + + If you don't want to enable code annotations globally, because you don't + like the automatic inlining behavior, you can enable them for a specific + code block by using a slightly different syntax based on the + [Attribute Lists] extension: + + ```` yaml + ``` { .yaml .annotate } + # Code block content + ``` + ```` + + Note that the language shortcode which has to come first must now also be + prefixed by a `.`. + + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + +#### Custom selectors + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +Normally, code annotations can only be [placed in comments], as comments can be +considered safe for placement. However, sometimes it might be necessary to place +annotations in parts of the code block where comments are not allowed, e.g. in +strings. + +Additional selectors can be set per-language: + +``` yaml +extra: + annotate: + json: [.s2] # (1)! +``` + +1. [`.s2`][s2] is the name of the lexeme that [Pygments] generates for double-quoted + strings. If you want to use a code annotation in another lexeme than a + comment, inspect the code block and determine which lexeme needs to be added + to the list of additional selectors. + + __Important__: Code annotations cannot be split between lexemes. + +Now, code annotations can be used from within strings in JSON: + +``` json +{ + "key": "value (1)" +} +``` + +1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted + text__, images, ... basically anything that can be written in Markdown. + + [placed in comments]: #adding-annotations + [s2]: https://github.com/squidfunk/mkdocs-material/blob/87d5ca487b9d9ab95c41ee72813149d214048693/src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss#L45 + +## Usage + +Code blocks must be enclosed with two separate lines containing three backticks. +To add syntax highlighting to those blocks, add the language shortcode directly +after the opening block. See the [list of available lexers] to find the +shortcode for a given language: + +```` markdown title="Code block" +``` py +import tensorflow as tf +``` +```` + +<div class="result" markdown> + +``` py +import tensorflow as tf +``` + +</div> + + [list of available lexers]: https://pygments.org/docs/lexers/ + +### Adding a title + +In order to provide additional context, a custom title can be added to a code +block by using the `title="<custom title>"` option directly after the shortcode, +e.g. to display the name of a file: + +```` markdown title="Code block with title" +``` py title="bubble_sort.py" +def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] +``` +```` + +<div class="result" markdown> + +``` py title="bubble_sort.py" +def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] +``` + +</div> + +### Adding annotations + +Code annotations can be placed anywhere in a code block where a comment for the +language of the block can be placed, e.g. for JavaScript in `#!js // ...` and +`#!js /* ... */`, for YAML in `#!yaml # ...`, etc.[^1]: + + [^1]: + Code annotations require syntax highlighting with [Pygments] – they're + currently not compatible with JavaScript syntax highlighters, or languages + that do not have comments in their grammar. However, we're actively working + on supporting alternate ways of defining code annotations, allowing to + always place code annotations at the end of lines. + +```` markdown title="Code block with annotation" +``` yaml +theme: + features: + - content.code.annotate # (1) +``` + +1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted + text__, images, ... basically anything that can be written in Markdown. +```` + +<div class="result" markdown> + +``` yaml +theme: + features: + - content.code.annotate # (1) +``` + +1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted + text__, images, ... basically anything that can be written in Markdown. + +</div> + +#### Stripping comments + +<!-- md:version 8.5.0 --> +<!-- md:flag experimental --> + +If you wish to strip the comment characters surrounding a code annotation, +simply add an `!` after the closing parenthesis of the code annotation: + +```` markdown title="Code block with annotation, stripped" +``` yaml +# (1)! +``` + +1. Look ma, less line noise! +```` + +<div class="result" markdown> + +``` yaml +# (1)! +``` + +1. Look ma, less line noise! + +</div> + +Note that this only allows for a single code annotation to be rendered per +comment. If you want to add multiple code annotations, comments cannot be +stripped for technical reasons. + +### Adding line numbers + +Line numbers can be added to a code block by using the `linenums="<start>"` +option directly after the shortcode, whereas `<start>` represents the starting +line number. A code block can start from a line number other than `1`, which +allows to split large code blocks for readability: + +```` markdown title="Code block with line numbers" +``` py linenums="1" +def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] +``` +```` + +<div class="result" markdown> + +``` py linenums="1" +def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] +``` + +</div> + +### Highlighting specific lines + +Specific lines can be highlighted by passing the line numbers to the `hl_lines` +argument placed right after the language shortcode. Note that line counts start +at `1`, regardless of the starting line number specified as part of +[`linenums`][Adding line numbers]: + +=== "Lines" + + ```` markdown title="Code block with highlighted lines" + ``` py hl_lines="2 3" + def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] + ``` + ```` + + <div class="result" markdown> + + ``` py linenums="1" hl_lines="2 3" + def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] + ``` + + </div> + +=== "Line ranges" + + ```` markdown title="Code block with highlighted line range" + ``` py hl_lines="3-5" + def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] + ``` + ```` + + <div class="result" markdown> + + ``` py linenums="1" hl_lines="3-5" + def bubble_sort(items): + for i in range(len(items)): + for j in range(len(items) - 1 - i): + if items[j] > items[j + 1]: + items[j], items[j + 1] = items[j + 1], items[j] + ``` + + </div> + + [Adding line numbers]: #adding-line-numbers + +### Highlighting inline code blocks + +When [InlineHilite] is enabled, syntax highlighting can be applied to inline +code blocks by prefixing them with a shebang, i.e. `#!`, directly followed by +the corresponding [language shortcode][list of available lexers]. + +``` markdown title="Inline code block" +The `#!python range()` function is used to generate a sequence of numbers. +``` + +<div class="result" markdown> + +The `#!python range()` function is used to generate a sequence of numbers. + +</div> + +### Embedding external files + +When [Snippets] is enabled, content from other files (including source files) +can be embedded by using the [`--8<--` notation][Snippets notation] directly +from within a code block: + +```` markdown title="Code block with external content" +``` title=".browserslistrc" +;--8<-- ".browserslistrc" +``` +```` + +<div class="result" markdown> + +``` title=".browserslistrc" +last 4 years +``` + +</div> + + [Snippets notation]: https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#snippets-notation + +## Customization + +### Custom syntax theme + +If [Pygments] is used, Material for MkDocs provides the [styles for code blocks] +[colors], which are built with a custom and well-balanced palette that works +equally well for both [color schemes]: + +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-number-color) " } `--md-code-hl-number-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-special-color) " } `--md-code-hl-special-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-function-color) " } `--md-code-hl-function-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-constant-color) " } `--md-code-hl-constant-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-keyword-color) " } `--md-code-hl-keyword-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-string-color) " } `--md-code-hl-string-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-name-color) " } `--md-code-hl-name-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-operator-color) " } `--md-code-hl-operator-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-punctuation-color) " } `--md-code-hl-punctuation-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-comment-color) " } `--md-code-hl-comment-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-generic-color) " } `--md-code-hl-generic-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-variable-color) " } `--md-code-hl-variable-color` + +Code block foreground, background and line highlight colors are defined via: + +- :material-checkbox-blank-circle:{ style="color: var(--md-code-fg-color) " } `--md-code-fg-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-bg-color) " } `--md-code-bg-color` +- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-color) " } `--md-code-hl-color` + +Let's say you want to change the color of `#!js "strings"`. While there are +several [types of string tokens], they use the same color. You can assign +a new color by using an [additional style sheet]: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + :root > * { + --md-code-hl-string-color: #0FF1CE; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +If you want to tweak a specific type of string, e.g. ``#!js `backticks` ``, you +can lookup the specific CSS class name in the [syntax theme definition], and +override it as part of your [additional style sheet]: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + .highlight .sb { + color: #0FF1CE; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + + [colors]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/assets/stylesheets/main/_colors.scss + [color schemes]: ../setup/changing-the-colors.md#color-scheme + [types of string tokens]: https://pygments.org/docs/tokens/#literals + [additional style sheet]: ../customization.md#additional-css + [syntax theme definition]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/assets/stylesheets/main/extensions/pymdownx/_highlight.scss + +### Annotation tooltip width + +If you have a lot of content hosted inside your code annotations, it can be a +good idea to increase the width of the tooltip by adding the following as part +of an [additional style sheet]: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + :root { + --md-tooltip-width: 600px; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +This will render annotations with a larger width: + +<div style="--md-tooltip-width: 600px;" markdown> + +``` yaml +# (1)! +``` + +1. Muuuuuuuuuuuuuuuch more space for content + +</div> diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/content-tabs.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/content-tabs.md new file mode 100644 index 0000000..264743a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/content-tabs.md @@ -0,0 +1,245 @@ +--- +icon: material/tab +--- + +# Content tabs + +Sometimes, it's desirable to group alternative content under different tabs, +e.g. when describing how to access an API from different languages or +environments. Material for MkDocs allows for beautiful and functional tabs, +grouping code blocks and other content. + +## Configuration + +This configuration enables content tabs, and allows to nest arbitrary content +inside content tabs, including code blocks and ... more content tabs! Add the +following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true +``` + +See additional configuration options: + +- [SuperFences] +- [Tabbed] + + [SuperFences]: ../setup/extensions/python-markdown-extensions.md#superfences + [Tabbed]: ../setup/extensions/python-markdown-extensions.md#tabbed + +### Anchor links + +<!-- md:version 9.5.0 --> +<!-- md:flag experimental --> + +In order to link to content tabs and share them more easily, an anchor link is +automatically added to each content tab, which you can copy via right click or +open in a new tab: + +=== "Open me in a new tab ..." + +=== "... or me ..." + +=== "... or even me" + +You can copy the link of the tab and create a link on the same or any other +page. For example, you can [jump to the third tab above this paragraph][tab_1]. + +!!! tip "Readable anchor links" + + [Python Markdown Extensions] 9.6 adds support for [slugification] of + content tabs, which produces nicer looking and more readable anchor links. + Enable the slugify function with the following lines: + + ``` yaml + markdown_extensions: + - pymdownx.tabbed: + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + ``` + + Fore more information, please [see the extension guide][slugification]. + + [tab_1]: #anchor-links--or-even-me + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/ + [slugification]: ../setup/extensions/python-markdown-extensions.md#+pymdownx.tabbed.slugify + +### Linked content tabs + +<!-- md:version 8.3.0 --> +<!-- md:feature --> + +When enabled, all content tabs across the whole documentation site will be +linked and switch to the same label when the user clicks on a tab. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - content.tabs.link +``` + +Content tabs are linked based on their label, not offset. This means that all +tabs with the same label will be activated when a user clicks a content tab +regardless of order inside a container. Furthermore, this feature is fully +integrated with [instant loading] and persisted across page loads. + +=== "Feature enabled" + + [![Linked content tabs enabled]][Linked content tabs enabled] + +=== "Feature disabled" + + [![Linked content tabs disabled]][Linked content tabs disabled] + + [instant loading]: ../setup/setting-up-navigation.md#instant-loading + [Linked content tabs enabled]: ../assets/screenshots/content-tabs-link.png + [Linked content tabs disabled]: ../assets/screenshots/content-tabs.png + +## Usage + +### Grouping code blocks + +Code blocks are one of the primary targets to be grouped, and can be considered +a special case of content tabs, as tabs with a single code block are always +rendered without horizontal spacing: + +``` title="Content tabs with code blocks" +=== "C" + + ``` c + #include <stdio.h> + + int main(void) { + printf("Hello world!\n"); + return 0; + } + ``` + +=== "C++" + + ``` c++ + #include <iostream> + + int main(void) { + std::cout << "Hello world!" << std::endl; + return 0; + } + ``` +``` + +<div class="result" markdown> + +=== "C" + + ``` c + #include <stdio.h> + + int main(void) { + printf("Hello world!\n"); + return 0; + } + ``` + +=== "C++" + + ``` c++ + #include <iostream> + + int main(void) { + std::cout << "Hello world!" << std::endl; + return 0; + } + ``` + +</div> + +### Grouping other content + +When a content tab contains more than one code block, it is rendered with +horizontal spacing. Vertical spacing is never added, but can be achieved +by nesting tabs in other blocks: + +``` title="Content tabs" +=== "Unordered list" + + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + +=== "Ordered list" + + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci +``` + +<div class="result" markdown> + +=== "Unordered list" + + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + +=== "Ordered list" + + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci + +</div> + +### Embedded content + +When [SuperFences] is enabled, content tabs can contain arbitrary nested +content, including further content tabs, and can be nested in other blocks like +[admonitions] or blockquotes: + +``` title="Content tabs in admonition" +!!! example + + === "Unordered List" + + ``` markdown + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + ``` + + === "Ordered List" + + ``` markdown + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci + ``` +``` + +<div class="result" markdown> + +!!! example + + === "Unordered List" + + ``` markdown + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + ``` + + === "Ordered List" + + ``` markdown + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci + ``` + +</div> + + [admonitions]: admonitions.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/data-tables.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/data-tables.md new file mode 100644 index 0000000..fd2db1b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/data-tables.md @@ -0,0 +1,191 @@ +--- +icon: material/table-edit +--- + +# Data tables + +Material for MkDocs defines default styles for data tables – an excellent way +of rendering tabular data in project documentation. Furthermore, customizations +like [sortable tables] can be achieved with a third-party library and some +[additional JavaScript]. + + [sortable tables]: #sortable-tables + [additional JavaScript]: ../customization.md#additional-javascript + +## Configuration + +This configuration enables Markdown table support, which should normally be +enabled by default, but to be sure, add the following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - tables +``` + +See additional configuration options: + +- [Tables] + + [Tables]: ../setup/extensions/python-markdown.md#tables + +## Usage + +Data tables can be used at any position in your project documentation and can +contain arbitrary Markdown, including inline code blocks, as well as [icons and +emojis]: + +``` markdown title="Data table" +| Method | Description | +| ----------- | ------------------------------------ | +| `GET` | :material-check: Fetch resource | +| `PUT` | :material-check-all: Update resource | +| `DELETE` | :material-close: Delete resource | +``` + +<div class="result" markdown> + +| Method | Description | +| ----------- | ------------------------------------ | +| `GET` | :material-check: Fetch resource | +| `PUT` | :material-check-all: Update resource | +| `DELETE` | :material-close: Delete resource | + +</div> + + [icons and emojis]: icons-emojis.md + +### Column alignment + +If you want to align a specific column to the `left`, `center` or `right`, you +can use the [regular Markdown syntax] placing `:` characters at the beginning +and/or end of the divider. + +=== "Left" + + ``` markdown hl_lines="2" title="Data table, columns aligned to left" + | Method | Description | + | :---------- | :----------------------------------- | + | `GET` | :material-check: Fetch resource | + | `PUT` | :material-check-all: Update resource | + | `DELETE` | :material-close: Delete resource | + ``` + + <div class="result" markdown> + + | Method | Description | + | :---------- | :----------------------------------- | + | `GET` | :material-check: Fetch resource | + | `PUT` | :material-check-all: Update resource | + | `DELETE` | :material-close: Delete resource | + + </div> + +=== "Center" + + ``` markdown hl_lines="2" title="Data table, columns centered" + | Method | Description | + | :---------: | :----------------------------------: | + | `GET` | :material-check: Fetch resource | + | `PUT` | :material-check-all: Update resource | + | `DELETE` | :material-close: Delete resource | + ``` + + <div class="result" markdown> + + | Method | Description | + | :---------: | :----------------------------------: | + | `GET` | :material-check: Fetch resource | + | `PUT` | :material-check-all: Update resource | + | `DELETE` | :material-close: Delete resource | + + </div> + +=== "Right" + + ``` markdown hl_lines="2" title="Data table, columns aligned to right" + | Method | Description | + | ----------: | -----------------------------------: | + | `GET` | :material-check: Fetch resource | + | `PUT` | :material-check-all: Update resource | + | `DELETE` | :material-close: Delete resource | + ``` + + <div class="result" markdown> + + | Method | Description | + | ----------: | -----------------------------------: | + | `GET` | :material-check: Fetch resource | + | `PUT` | :material-check-all: Update resource | + | `DELETE` | :material-close: Delete resource | + + </div> + + [regular Markdown syntax]: https://www.markdownguide.org/extended-syntax/#tables + +## Customization + +### Sortable tables + +If you want to make data tables sortable, you can add [tablesort], which is +natively integrated with Material for MkDocs and will also work with [instant +loading] via [additional JavaScript]: + +=== ":octicons-file-code-16: `docs/javascripts/tablesort.js`" + + ``` js + document$.subscribe(function() { + var tables = document.querySelectorAll("article table:not([class])") + tables.forEach(function(table) { + new Tablesort(table) + }) + }) + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js + - javascripts/tablesort.js + ``` + +After applying the customization, data tables can be sorted by clicking on a +column: + +``` markdown title="Data table, columns sortable" +| Method | Description | +| ----------- | ------------------------------------ | +| `GET` | :material-check: Fetch resource | +| `PUT` | :material-check-all: Update resource | +| `DELETE` | :material-close: Delete resource | +``` + +<div class="result" markdown> + +| Method | Description | +| ----------- | ------------------------------------ | +| `GET` | :material-check: Fetch resource | +| `PUT` | :material-check-all: Update resource | +| `DELETE` | :material-close: Delete resource | + +</div> + +Note that [tablesort] provides alternative comparison implementations like +numbers, filesizes, dates and month names. See the [tablesort documentation] +[tablesort] for more information. + +<script src="https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js"></script> +<script> + var tables = document.querySelectorAll("article table") + new Tablesort(tables.item(tables.length - 1)); +</script> + + [tablesort]: http://tristen.ca/tablesort/demo/ + [instant loading]: ../setup/setting-up-navigation.md#instant-loading + +### Import table from file + +The plugin [mkdocs-table-reader-plugin][table-reader-docs] allows you to +import data from a CSV or Excel file. + + [table-reader-docs]: https://timvink.github.io/mkdocs-table-reader-plugin/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/diagrams.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/diagrams.md new file mode 100644 index 0000000..da8b364 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/diagrams.md @@ -0,0 +1,316 @@ +--- +icon: material/graph-outline +--- + +# Diagrams + +Diagrams help to communicate complex relationships and interconnections between +different technical components, and are a great addition to project +documentation. Material for MkDocs integrates with [Mermaid.js], a very +popular and flexible solution for drawing diagrams. + + [Mermaid.js]: https://mermaid.js.org/ + +## Configuration + +<!-- md:version 8.2.0 --> + +This configuration enables native support for [Mermaid.js] diagrams. Material +for MkDocs will automatically initialize the JavaScript runtime when a page +includes a `mermaid` code block: + +``` yaml +markdown_extensions: + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format +``` + +No further configuration is necessary. Advantages over a custom integration: + +- [x] Works with [instant loading] without any additional effort +- [x] Diagrams automatically use fonts and colors defined in `mkdocs.yml`[^1] +- [x] Fonts and colors can be customized with [additional style sheets] +- [x] Support for both, light and dark color schemes – _try it on this page!_ + + [^1]: + While all [Mermaid.js] features should work out-of-the-box, Material for + MkDocs will currently only adjust the fonts and colors for flowcharts, + sequence diagrams, class diagrams, state diagrams and entity relationship + diagrams. See the section on [other diagrams] for more information why this + is currently not implemented for all diagrams. + + [instant loading]: ../setup/setting-up-navigation.md#instant-loading + [additional style sheets]: ../customization.md#additional-css + [other diagrams]: #other-diagram-types + +## Usage + +### Using flowcharts + +[Flowcharts] are diagrams that represent workflows or processes. The steps +are rendered as nodes of various kinds and are connected by edges, describing +the necessary order of steps: + +```` markdown title="Flow chart" +``` mermaid +graph LR + A[Start] --> B{Error?}; + B -->|Yes| C[Hmm...]; + C --> D[Debug]; + D --> B; + B ---->|No| E[Yay!]; +``` +```` + +<div class="result" markdown> + +``` mermaid +graph LR + A[Start] --> B{Error?}; + B -->|Yes| C[Hmm...]; + C --> D[Debug]; + D --> B; + B ---->|No| E[Yay!]; +``` + +</div> + + [Flowcharts]: https://mermaid.js.org/syntax/flowchart.html + +### Using sequence diagrams + +[Sequence diagrams] describe a specific scenario as sequential interactions +between multiple objects or actors, including the messages that are exchanged +between those actors: + +```` markdown title="Sequence diagram" +``` mermaid +sequenceDiagram + autonumber + Alice->>John: Hello John, how are you? + loop Healthcheck + John->>John: Fight against hypochondria + end + Note right of John: Rational thoughts! + John-->>Alice: Great! + John->>Bob: How about you? + Bob-->>John: Jolly good! +``` +```` + +<div class="result" markdown> + +``` mermaid +sequenceDiagram + autonumber + Alice->>John: Hello John, how are you? + loop Healthcheck + John->>John: Fight against hypochondria + end + Note right of John: Rational thoughts! + John-->>Alice: Great! + John->>Bob: How about you? + Bob-->>John: Jolly good! +``` + +</div> + + [Sequence diagrams]: https://mermaid.js.org/syntax/sequenceDiagram.html + +### Using state diagrams + +[State diagrams] are a great tool to describe the behavior of a system, +decomposing it into a finite number of states, and transitions between those +states: + +```` markdown title="State diagram" +``` mermaid +stateDiagram-v2 + state fork_state <<fork>> + [*] --> fork_state + fork_state --> State2 + fork_state --> State3 + + state join_state <<join>> + State2 --> join_state + State3 --> join_state + join_state --> State4 + State4 --> [*] +``` +```` + +<div class="result" markdown> + +``` mermaid +stateDiagram-v2 + state fork_state <<fork>> + [*] --> fork_state + fork_state --> State2 + fork_state --> State3 + + state join_state <<join>> + State2 --> join_state + State3 --> join_state + join_state --> State4 + State4 --> [*] +``` + +</div> + + [State diagrams]: https://mermaid.js.org/syntax/stateDiagram.html + +### Using class diagrams + +[Class diagrams] are central to object oriented programming, describing the +structure of a system by modelling entities as classes and relationships between +them: + +```` markdown title="Class diagram" +``` mermaid +classDiagram + Person <|-- Student + Person <|-- Professor + Person : +String name + Person : +String phoneNumber + Person : +String emailAddress + Person: +purchaseParkingPass() + Address "1" <-- "0..1" Person:lives at + class Student{ + +int studentNumber + +int averageMark + +isEligibleToEnrol() + +getSeminarsTaken() + } + class Professor{ + +int salary + } + class Address{ + +String street + +String city + +String state + +int postalCode + +String country + -validate() + +outputAsLabel() + } +``` +```` + +<div class="result" markdown> + +``` mermaid +classDiagram + Person <|-- Student + Person <|-- Professor + Person : +String name + Person : +String phoneNumber + Person : +String emailAddress + Person: +purchaseParkingPass() + Address "1" <-- "0..1" Person:lives at + class Student{ + +int studentNumber + +int averageMark + +isEligibleToEnrol() + +getSeminarsTaken() + } + class Professor{ + +int salary + } + class Address{ + +String street + +String city + +String state + +int postalCode + +String country + -validate() + +outputAsLabel() + } +``` + +</div> + + [Class diagrams]: https://mermaid.js.org/syntax/classDiagram.html + +### Using entity-relationship diagrams + +An [entity-relationship diagram] is composed of entity types and specifies +relationships that exist between entities. It describes inter-related things in +a specific domain of knowledge: + +```` markdown title="Entity-relationship diagram" +``` mermaid +erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ LINE-ITEM : contains + LINE-ITEM { + string name + int pricePerUnit + } + CUSTOMER }|..|{ DELIVERY-ADDRESS : uses +``` +```` + +<div class="result" markdown> + +``` mermaid +erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ LINE-ITEM : contains + LINE-ITEM { + string name + int pricePerUnit + } + CUSTOMER }|..|{ DELIVERY-ADDRESS : uses +``` + +</div> + + [entity-relationship diagram]: https://mermaid.js.org/syntax/entityRelationshipDiagram.html + +### Other diagram types + +Besides the diagram types listed above, [Mermaid.js] provides support for +[pie charts], [gantt charts], [user journeys], [git graphs] and +[requirement diagrams], all of which are not officially supported by Material +for MkDocs. Those diagrams should still work as advertised by [Mermaid.js], but +we don't consider them a good choice, mostly as they don't work well on mobile. + + [pie charts]: https://mermaid.js.org/syntax/pie.html + [gantt charts]: https://mermaid.js.org/syntax/gantt.html + [user journeys]: https://mermaid.js.org/syntax/userJourney.html + [git graphs]: https://mermaid.js.org/syntax/gitgraph.html + [requirement diagrams]: https://mermaid.js.org/syntax/requirementDiagram.html + +## Customization + +If you want to customize Mermaid.js, e.g. to bring in support for [ELK layouts], +you can do so by adding a custom JavaScript file to your `mkdocs.yml`: + +=== ":octicons-file-code-16: `docs/javascripts/mermaid.mjs`" + + ``` js + import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs'; + import elkLayouts from 'https://cdn.jsdelivr.net/npm/@mermaid-js/layout-elk@0/dist/mermaid-layout-elk.esm.min.mjs'; + + mermaid.registerLayoutLoaders(elkLayouts); + mermaid.initialize({ + startOnLoad: false, + securityLevel: "loose", + layout: "elk", + }); + + // Important: necessary to make it visible to Material for MkDocs + window.mermaid = mermaid; + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - javascripts/mermaid.mjs + ``` + + [ELK layouts]: https://www.npmjs.com/package/@mermaid-js/layout-elk diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/footnotes.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/footnotes.md new file mode 100644 index 0000000..7f45d0a --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/footnotes.md @@ -0,0 +1,109 @@ +--- +icon: material/format-align-bottom +--- + +# Footnotes + +Footnotes are a great way to add supplemental or additional information to a +specific word, phrase or sentence without interrupting the flow of a document. +Material for MkDocs provides the ability to define, reference and render +footnotes. + +## Configuration + +This configuration adds the ability to define inline footnotes, which are then +rendered below all Markdown content of a document. Add the following lines to +`mkdocs.yml`: + +``` yaml +markdown_extensions: + - footnotes +``` + +See additional configuration options: + +- [Footnotes] + + [Footnotes]: ../setup/extensions/python-markdown.md#footnotes + +### Footnote tooltips + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +Footnotes can be rendered as inline tooltips, so the user can read the footnote +without leaving the context of the document. Footnote tooltips can be enabled +in `mkdocs.yml` with: + +``` yaml +theme: + features: + - content.footnote.tooltips +``` + +__Footnote tooltips are enabled on our documentation__, so to try it out, you +can just hover or focus any footnote on this page or any other page of our +documentation. + +## Usage + +### Adding footnote references + +A footnote reference must be enclosed in square brackets and must start with a +caret `^`, directly followed by an arbitrary identifier, which is similar to +the standard Markdown link syntax. + +``` title="Text with footnote references" +Lorem ipsum[^1] dolor sit amet, consectetur adipiscing elit.[^2] +``` + +<div class="result" markdown> + +Lorem ipsum[^1] dolor sit amet, consectetur adipiscing elit.[^2] + +</div> + +### Adding footnote content + +The footnote content must be declared with the same identifier as the reference. +It can be inserted at an arbitrary position in the document and is always +rendered at the bottom of the page. Furthermore, a backlink to the footnote +reference is automatically added. + +#### on a single line + +Short footnotes can be written on the same line: + +``` title="Footnote" +[^1]: Lorem ipsum dolor sit amet, consectetur adipiscing elit. +``` + +<div class="result" markdown> + +[:octicons-arrow-down-24: Jump to footnote](#fn:1) + +</div> + + [^1]: Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +#### on multiple lines + +Paragraphs can be written on the next line and must be indented by four spaces: + +``` title="Footnote" +[^2]: + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. +``` + +<div class="result" markdown> + +[:octicons-arrow-down-24: Jump to footnote](#fn:2) + +</div> + +[^2]: + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus + auctor massa, nec semper lorem quam in massa. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/formatting.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/formatting.md new file mode 100644 index 0000000..e8148ce --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/formatting.md @@ -0,0 +1,140 @@ +--- +icon: material/format-font +--- + +# Formatting + +Material for MkDocs provides support for several HTML elements that can be used +to highlight sections of a document or apply specific formatting. Additionally, +[Critic Markup] is supported, adding the ability to display suggested changes +for a document. + + [Critic Markup]: https://github.com/CriticMarkup/CriticMarkup-toolkit + +## Configuration + +This configuration enables support for keyboard keys, tracking changes in +documents, defining sub- and superscript and highlighting text. Add the +following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.critic + - pymdownx.caret + - pymdownx.keys + - pymdownx.mark + - pymdownx.tilde +``` + +See additional configuration options: + +- [Critic] +- [Caret, Mark & Tilde] +- [Keys] + + [Critic]: ../setup/extensions/python-markdown-extensions.md#critic + [Caret, Mark & Tilde]: ../setup/extensions/python-markdown-extensions.md#caret-mark-tilde + [Keys]: ../setup/extensions/python-markdown-extensions.md#keys + +## Usage + +### Highlighting changes + +When [Critic] is enabled, [Critic Markup] can be used, which adds the ability to +highlight suggested changes, as well as add inline comments to a document: + +``` title="Text with suggested changes" +Text can be {--deleted--} and replacement text {++added++}. This can also be +combined into {~~one~>a single~~} operation. {==Highlighting==} is also +possible {>>and comments can be added inline<<}. + +{== + +Formatting can also be applied to blocks by putting the opening and closing +tags on separate lines and adding new lines between the tags and the content. + +==} +``` + +<div class="result" markdown> + +Text can be <del class="critic">deleted</del> and replacement text +<ins class="critic">added</ins>. This can also be combined into +<del class="critic">one</del><ins class="critic">a single</ins> operation. +<mark class="critic">Highlighting</mark> is also possible +<span class="critic comment">and comments can be added inline</span>. + +<div> + <mark class="critic block"> + <p> + Formatting can also be applied to blocks by putting the opening and + closing tags on separate lines and adding new lines between the tags and + the content. + </p> + </mark> +</div> + +</div> + +### Highlighting text + +When [Caret, Mark & Tilde] are enabled, text can be highlighted with a simple +syntax, which is more convenient that directly using the corresponding +[`mark`][mark], [`ins`][ins] and [`del`][del] HTML tags: + +``` title="Text with highlighting" +- ==This was marked (highlight)== +- ^^This was inserted (underline)^^ +- ~~This was deleted (strikethrough)~~ +``` + +<div class="result" markdown> + +- ==This was marked (highlight)== +- ^^This was inserted (underline)^^ +- ~~This was deleted (strikethrough)~~ + +</div> + + [mark]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark + [ins]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins + [del]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del + +### Sub- and superscripts + +When [Caret & Tilde][Caret, Mark & Tilde] are enabled, text can be sub- and +superscripted with a simple syntax, which is more convenient than directly +using the corresponding [`sub`][sub] and [`sup`][sup] HTML tags: + +``` markdown title="Text with sub- and superscripts" +- H~2~O +- A^T^A +``` + +<div class="result" markdown> + +- H~2~O +- A^T^A + +</div> + + [sub]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub + [sup]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup + +### Adding keyboard keys + +When [Keys] is enabled, keyboard keys can be rendered with a simple syntax. +Consult the [Python Markdown Extensions] documentation to learn about all +available shortcodes: + +``` markdown title="Keyboard keys" +++ctrl+alt+del++ +``` + +<div class="result" markdown> + +++ctrl+alt+del++ + +</div> + + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/extensions/keys/#extendingmodifying-key-map-index diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/grids.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/grids.md new file mode 100644 index 0000000..10af8d5 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/grids.md @@ -0,0 +1,301 @@ +--- +icon: material/view-grid-plus +--- + +# Grids + +Material for MkDocs makes it easy to arrange sections into grids, grouping +blocks that convey similar meaning or are of equal importance. Grids are just +perfect for building index pages that show a brief overview of a large section +of your documentation. + +## Configuration + +This configuration enables the use of grids, allowing to bring blocks of +identical or different types into a rectangular shape. Add the following lines +to `mkdocs.yml`: + +``` yaml +markdown_extensions: # (1)! + - attr_list + - md_in_html +``` + +1. Note that some of the examples listed below use [icons and emojis], which + have to be [configured separately]. + +See additional configuration options: + +- [Attribute Lists] +- [Markdown in HTML] + + [icons and emojis]: icons-emojis.md + [configured separately]: icons-emojis.md#configuration + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + [Markdown in HTML]: ../setup/extensions/python-markdown.md#markdown-in-html + +## Usage + +Grids come in two flavors: [card grids], which wrap each element in a card that +levitates on hover, and [generic grids], which allow to arrange arbitrary block +elements in a rectangular shape. + + [card grids]: #using-card-grids + [generic grids]: #using-generic-grids + +### Using card grids + +<!-- md:version 9.5.0 --> +<!-- md:flag experimental --> + +Card grids wrap each grid item with a beautiful hover card that levitates on +hover. They come in two slightly different syntaxes: [list] and [block syntax], +adding support for distinct use cases. + + [list]: #list-syntax + [block syntax]: #block-syntax + +#### List syntax + +The list syntax is essentially a shortcut for [card grids], and consists of an +unordered (or ordered) list wrapped by a `div` with both, the `grid` and `cards` +classes: + +``` html title="Card grid" +<div class="grid cards" markdown> + +- :fontawesome-brands-html5: __HTML__ for content and structure +- :fontawesome-brands-js: __JavaScript__ for interactivity +- :fontawesome-brands-css3: __CSS__ for text running out of boxes +- :fontawesome-brands-internet-explorer: __Internet Explorer__ ... huh? + +</div> +``` + +<div class="result" markdown> + <div class="grid cards" markdown> + +- :fontawesome-brands-html5: __HTML__ for content and structure +- :fontawesome-brands-js: __JavaScript__ for interactivity +- :fontawesome-brands-css3: __CSS__ for text running out of boxes +- :fontawesome-brands-internet-explorer: __Internet Explorer__ ... huh? + + </div> +</div> + +List elements can contain arbitrary Markdown, as long as the surrounding `div` +defines the `markdown` attribute. Following is a more complex example, which +includes icons and links: + +``` html title="Card grid, complex example" +<div class="grid cards" markdown> + +- :material-clock-fast:{ .lg .middle } __Set up in 5 minutes__ + + --- + + Install [`mkdocs-material`](#) with [`pip`](#) and get up + and running in minutes + + [:octicons-arrow-right-24: Getting started](#) + +- :fontawesome-brands-markdown:{ .lg .middle } __It's just Markdown__ + + --- + + Focus on your content and generate a responsive and searchable static site + + [:octicons-arrow-right-24: Reference](#) + +- :material-format-font:{ .lg .middle } __Made to measure__ + + --- + + Change the colors, fonts, language, icons, logo and more with a few lines + + [:octicons-arrow-right-24: Customization](#) + +- :material-scale-balance:{ .lg .middle } __Open Source, MIT__ + + --- + + Material for MkDocs is licensed under MIT and available on [GitHub] + + [:octicons-arrow-right-24: License](#) + +</div> +``` + +<div class="result" markdown> + <div class="grid cards" markdown> + +- :material-clock-fast:{ .lg .middle } __Set up in 5 minutes__ + + --- + + Install [`mkdocs-material`][mkdocs-material] with [`pip`][pip] and get up + and running in minutes + + [:octicons-arrow-right-24: Getting started][getting started] + +- :fontawesome-brands-markdown:{ .lg .middle } __It's just Markdown__ + + --- + + Focus on your content and generate a responsive and searchable static site + + [:octicons-arrow-right-24: Reference][reference] + +- :material-format-font:{ .lg .middle } __Made to measure__ + + --- + + Change the colors, fonts, language, icons, logo and more with a few lines + + [:octicons-arrow-right-24: Customization][customization] + +- :material-scale-balance:{ .lg .middle } __Open Source, MIT__ + + --- + + Material for MkDocs is licensed under MIT and available on [GitHub] + + [:octicons-arrow-right-24: License][license] + + </div> +</div> + +If there's insufficient space to render grid items next to each other, the items +will stretch to the full width of the viewport, e.g. on mobile viewports. If +there's more space available, grids will render in items of 3 and more, e.g. +when [hiding both sidebars]. + + [mkdocs-material]: https://pypistats.org/packages/mkdocs-material + [pip]: ../getting-started.md#with-pip + [getting started]: ../getting-started.md + [reference]: ../reference/index.md + [customization]: ../customization.md + [license]: ../license.md + [GitHub]: https://github.com/squidfunk/mkdocs-material + [hiding both sidebars]: ../setup/setting-up-navigation.md#hiding-the-sidebars + +#### Block syntax + +The block syntax allows for arranging cards in grids __together with other +elements__, as explained in the section on [generic grids]. Just add the `card` +class to any block element inside a `grid`: + +``` html title="Card grid, blocks" +<div class="grid" markdown> + +:fontawesome-brands-html5: __HTML__ for content and structure +{ .card } + +:fontawesome-brands-js: __JavaScript__ for interactivity +{ .card } + +:fontawesome-brands-css3: __CSS__ for text running out of boxes +{ .card } + +> :fontawesome-brands-internet-explorer: __Internet Explorer__ ... huh? + +</div> +``` + +<div class="result" markdown> + <div class="grid" markdown> + +:fontawesome-brands-html5: __HTML__ for content and structure +{ .card } + +:fontawesome-brands-js: __JavaScript__ for interactivity +{ .card } + +:fontawesome-brands-css3: __CSS__ for text running out of boxes +{ .card } + +> :fontawesome-brands-internet-explorer: __Internet Explorer__ ... huh? + + </div> +</div> + +While this syntax may seem unnecessarily verbose at first, the previous example +shows how card grids can now be mixed with other elements that will also stretch +to the grid. + +### Using generic grids + +<!-- md:version 9.5.0 --> +<!-- md:flag experimental --> + +Generic grids allow for arranging arbitrary block elements in a grid, including +[admonitions], [code blocks], [content tabs] and more. Just wrap a set of blocks +by using a `div` with the `grid` class: + +```` html title="Generic grid" +<div class="grid" markdown> + +=== "Unordered list" + + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + +=== "Ordered list" + + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci + +``` title="Content tabs" +=== "Unordered list" + + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + +=== "Ordered list" + + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci +``` + +</div> +```` + +<div class="result" markdown> + <div class="grid" markdown> + +=== "Unordered list" + + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + +=== "Ordered list" + + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci + +``` title="Content tabs" +=== "Unordered list" + + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + +=== "Ordered list" + + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci +``` + + </div> +</div> + + [admonitions]: admonitions.md + [code blocks]: code-blocks.md + [content tabs]: content-tabs.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/icons-emojis.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/icons-emojis.md new file mode 100644 index 0000000..5ac5325 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/icons-emojis.md @@ -0,0 +1,239 @@ +--- +icon: material/emoticon-happy-outline +--- + +# Icons, Emojis + +One of the best features of Material for MkDocs is the possibility to use [more +than 10,000 icons][icon search] and thousands of emojis in your project +documentation with practically zero additional effort. Moreover, [custom icons +can be added] and used in `mkdocs.yml`, documents and templates. + + [icon search]: #search + [custom icons can be added]: ../setup/changing-the-logo-and-icons.md#additional-icons + +## Search + +<div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input + class="md-input md-input--stretch mdx-iconsearch__input" + placeholder="Search the icon and emoji database" + data-mdx-component="iconsearch-query" + /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result"> + <select + class="mdx-iconsearch-result__select" + data-mdx-component="iconsearch-select" + > + <option value="all" selected>All</option> + <option value="icons">Icons</option> + <option value="emojis">Emojis</option> + </select> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> +</div> +<small> + :octicons-light-bulb-16: + **Tip:** Enter some keywords to find icons and emojis and click on the + shortcode to copy it to your clipboard. +</small> + +## Configuration + +This configuration enables the use of icons and emojis by using simple +shortcodes which can be discovered through the [icon search]. Add the following +lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - attr_list + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg +``` + +The following icon sets are bundled with Material for MkDocs: + +- :material-material-design: – [Material Design] +- :fontawesome-brands-font-awesome: – [FontAwesome] +- :octicons-mark-github-16: – [Octicons] +- :simple-simpleicons: – [Simple Icons] + +See additional configuration options: + +- [Attribute Lists] +- [Emoji] +- [Emoji with custom icons] + + [Material Design]: https://pictogrammers.com/library/mdi/ + [FontAwesome]: https://fontawesome.com/search?m=free + [Octicons]: https://octicons.github.com/ + [Simple Icons]: https://simpleicons.org/ + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + [Emoji]: ../setup/extensions/python-markdown-extensions.md#emoji + [Emoji with custom icons]: ../setup/extensions/python-markdown-extensions.md#+pymdownx.emoji.options.custom_icons + +## Usage + +### Using emojis + +Emojis can be integrated in Markdown by putting the shortcode of the emoji +between two colons. If you're using [Twemoji] (recommended), you can look up +the shortcodes at [Emojipedia]: + +``` title="Emoji" +:smile: +``` + +<div class="result" markdown> + +:smile: + +</div> + [Twemoji]: https://github.com/jdecked/twemoji + [Emojipedia]: https://emojipedia.org/twitter/ + +### Using icons + +When [Emoji] is enabled, icons can be used similar to emojis, by referencing +a valid path to any icon bundled with the theme, which are located in the +[`.icons`][custom icons] directory, and replacing `/` with `-`: + +``` title="Icon" +:fontawesome-regular-face-laugh-wink: +``` + +<div class="result" markdown> + +:fontawesome-regular-face-laugh-wink: + +</div> + + [custom icons]: https://github.com/squidfunk/mkdocs-material/tree/master/material/templates/.icons + +#### with colors + +When [Attribute Lists] is enabled, custom CSS classes can be added to icons by +suffixing the icon with a special syntax. While HTML allows to use [inline +styles], it's always recommended to add an [additional style sheet] and move +declarations into dedicated CSS classes: + +<style> + .youtube { + color: #EE0F0F; + } +</style> + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + .youtube { + color: #EE0F0F; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +After applying the customization, add the CSS class to the icon shortcode: + +``` markdown title="Icon with color" +:fontawesome-brands-youtube:{ .youtube } +``` + +<div class="result" markdown> + +:fontawesome-brands-youtube:{ .youtube } + +</div> + + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + [inline styles]: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/style + [additional style sheet]: ../customization.md#additional-css + +#### with animations + +Similar to adding [colors], it's just as easy to add [animations] to icons by +using an [additional style sheet], defining a `@keyframes` rule and adding a +dedicated CSS class to the icon: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + @keyframes heart { + 0%, 40%, 80%, 100% { + transform: scale(1); + } + 20%, 60% { + transform: scale(1.15); + } + } + .heart { + animation: heart 1000ms infinite; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +After applying the customization, add the CSS class to the icon shortcode: + +``` markdown title="Icon with animation" +:octicons-heart-fill-24:{ .heart } +``` + +<div class="result" markdown> + +:octicons-heart-fill-24:{ .mdx-heart } + +</div> + + [colors]: #with-colors + [animations]: https://developer.mozilla.org/en-US/docs/Web/CSS/animation + +### Icons, emojis in sidebars :smile: + +With the help of the [built-in typeset plugin], you can use icons and emojis +in headings, which will then be rendered in the sidebars. The plugin preserves +Markdown and HTML formatting. + + [built-in typeset plugin]: ../plugins/typeset.md + +## Customization + +### Using icons in templates + +When you're [extending the theme] with partials or blocks, you can simply +reference any icon that's [bundled with the theme][icon search] with Jinja's +[`include`][include] function and wrap it with the `.twemoji` CSS class: + +``` html +<span class="twemoji"> + {% include ".icons/fontawesome/brands/youtube.svg" %} <!-- (1)! --> +</span> +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="brands youtube" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +This is exactly what Material for MkDocs does in its templates. + + [extending the theme]: ../customization.md#extending-the-theme + [include]: https://jinja.palletsprojects.com/en/2.11.x/templates/#include diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/images.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/images.md new file mode 100644 index 0000000..336bd4c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/images.md @@ -0,0 +1,219 @@ +--- +icon: material/image-frame +--- + +# Images + +While images are first-class citizens of Markdown and part of the core syntax, +it can be difficult to work with them. Material for MkDocs makes working with +images more comfortable, providing styles for image alignment and image +captions. + +## Configuration + +This configuration adds the ability to align images, add captions to images +(rendering them as figures), and mark large images for lazy-loading. Add the +following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - attr_list + - md_in_html + - pymdownx.blocks.caption +``` + +See additional configuration options: + +- [Attribute Lists] +- [Markdown in HTML] +- [Caption] + + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + [Markdown in HTML]: ../setup/extensions/python-markdown.md#markdown-in-html + [Caption]: ../setup/extensions/python-markdown-extensions.md#caption + +### Lightbox + +<!-- md:version 0.1.0 --> +<!-- md:plugin [glightbox] --> + +If you want to add image zoom functionality to your documentation, the +[glightbox] plugin is an excellent choice, as it integrates perfectly +with Material for MkDocs. Install it with `pip`: + +``` +pip install mkdocs-glightbox +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - glightbox +``` + +We recommend checking out the available +[configuration options][glightbox options]. + + [glightbox]: https://github.com/blueswen/mkdocs-glightbox + [glightbox options]: https://github.com/blueswen/mkdocs-glightbox#usage + +## Usage + +### Image alignment + +When [Attribute Lists] is enabled, images can be aligned by adding the +respective alignment directions via the `align` attribute, i.e. `align=left` or +`align=right`: + +=== "Left" + + ``` markdown title="Image, aligned to left" + ![Image title](https://dummyimage.com/600x400/eee/aaa){ align=left } + ``` + + <div class="result" markdown> + + ![Image title](https://dummyimage.com/600x400/f5f5f5/aaaaaa?text=–%20Image%20–){ align=left width=300 } + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + + </div> + +=== "Right" + + ``` markdown title="Image, aligned to right" + ![Image title](https://dummyimage.com/600x400/eee/aaa){ align=right } + ``` + + <div class="result" markdown> + + ![Image title](https://dummyimage.com/600x400/f5f5f5/aaaaaa?text=–%20Image%20–){ align=right width=300 } + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + + </div> + +If there's insufficient space to render the text next to the image, the image +will stretch to the full width of the viewport, e.g. on mobile viewports. + +??? question "Why is there no centered alignment?" + + The [`align`][align] attribute doesn't allow for centered alignment, which + is why this option is not supported by Material for MkDocs.[^1] Instead, + the [image captions] syntax can be used, as captions are optional. + + [^1]: + You might also realize that the [`align`][align] attribute has been + deprecated as of HTML5, so why use it anyways? The main reason is + portability – it's still supported by all browsers and clients, and is very + unlikely to be completely removed, as many older websites still use it. This + ensures a consistent appearance when a Markdown file with these attributes + is viewed outside of a website generated by Material for MkDocs. + + [align]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#deprecated_attributes + [image captions]: #image-captions + +### Image captions + +Sadly, the Markdown syntax doesn't provide native support for image captions, +but it's always possible to use the [Markdown in HTML] extension with literal +`figure` and `figcaption` tags: + +``` html title="Image with caption" +<figure markdown="span"> + ![Image title](https://dummyimage.com/600x400/){ width="300" } + <figcaption>Image caption</figcaption> +</figure> +``` + +<div class="result"> + <figure> + <img src="https://dummyimage.com/600x400/f5f5f5/aaaaaa?text=–%20Image%20–" width="300" /> + <figcaption>Image caption</figcaption> + </figure> +</div> + +However, [Caption] provides an alternative syntax to add captions +to any Markdown block element, including images: + +``` markdown title="Image with caption" +![Image title](https://dummyimage.com/600x400/){ width="300" } +/// caption +Image caption +/// +``` + +### Image lazy-loading + +Modern browsers provide [native support for lazy-loading images][lazy-loading] +through the `loading=lazy` directive, which degrades to eager-loading in +browsers without support: + +``` markdown title="Image, lazy-loaded" +![Image title](https://dummyimage.com/600x400/){ loading=lazy } +``` + +<div class="result" markdown> + <img src="https://dummyimage.com/600x400/f5f5f5/aaaaaa?text=–%20Image%20–" width="300" /> +</div> + + [lazy-loading]: https://caniuse.com/#feat=loading-lazy-attr + +### Light and dark mode + +<!-- md:version 8.1.1 --> + +If you added a [color palette toggle] and want to show different images for +light and dark color schemes, you can append a `#only-light` or `#only-dark` +hash fragment to the image URL: + +``` markdown title="Image, different for light and dark mode" +![Image title](https://dummyimage.com/600x400/f5f5f5/aaaaaa#only-light) +![Image title](https://dummyimage.com/600x400/21222c/d5d7e2#only-dark) +``` + +<div class="result" markdown> + +![Zelda light world]{ width="300" } +![Zelda dark world]{ width="300" } + +</div> + +!!! warning "Requirements when using [custom color schemes]" + + The built-in [color schemes] define the aforementioned hash fragments, but + if you're using [custom color schemes], you'll also have to add the + following selectors to your scheme, depending on whether it's a light or + dark scheme: + + === "Custom light scheme" + + ``` css + [data-md-color-scheme="custom-light"] img[src$="#only-dark"], + [data-md-color-scheme="custom-light"] img[src$="#gh-dark-mode-only"] { + display: none; /* Hide dark images in light mode */ + } + ``` + + === "Custom dark scheme" + + ``` css + [data-md-color-scheme="custom-dark"] img[src$="#only-light"], + [data-md-color-scheme="custom-dark"] img[src$="#gh-light-mode-only"] { + display: none; /* Hide light images in dark mode */ + } + ``` + + Remember to change `#!css "custom-light"` and `#!css "custom-dark"` to the + name of your scheme. + + [color palette toggle]: ../setup/changing-the-colors.md#color-palette-toggle + [Zelda light world]: ../assets/images/zelda-light-world.png#only-light + [Zelda dark world]: ../assets/images/zelda-dark-world.png#only-dark + [color schemes]: ../setup/changing-the-colors.md#color-scheme + [custom color schemes]: ../setup/changing-the-colors.md#custom-color-schemes diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/index.md new file mode 100644 index 0000000..a278dab --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/index.md @@ -0,0 +1,233 @@ +# Reference + +Material for MkDocs is packed with many great features that make technical +writing a joyful activity. This section of the documentation explains how to set up +a page, and showcases all available specimen that can be used directly from +within Markdown files. + +## Configuration + +## Usage + +### Setting the page `title` + +Each page has a designated title, which is used in the navigation sidebar, for +[social cards] and in other places. While MkDocs attempts to automatically +determine the title of a page in a [four step process], the title can also be +explicitly set with the front matter `title` property: + +``` yaml +--- +title: Lorem ipsum dolor sit amet # (1)! +--- + +# Page title +... +``` + +1. This line sets the [`title`][title] inside the HTML document's + [`head`][head] for the generated page to the given value. Note that the + site title, which is set via [`site_name`][site_name], is appended with a + dash. + + [social cards]: ../setup/setting-up-social-cards.md + [four step process]: https://www.mkdocs.org/user-guide/writing-your-docs/#meta-data + [title]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title + [head]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head + [site_name]: https://www.mkdocs.org/user-guide/configuration/#site_name + +### Setting the page `description` + +A Markdown file can include a description that is added to the `meta` tags of +a page, and is also used for [social cards]. It's a good idea to set a +[`site_description`][site_description] in `mkdocs.yml` as a fallback value if +the author does not explicitly define a description for a Markdown file: + +``` yaml +--- +description: Nullam urna elit, malesuada eget finibus ut, ac tortor. # (1)! +--- + +# Page title +... +``` + +1. This line sets the `meta` tag containing the description inside the + document `head` for the current page to the provided value. + + [site_description]: https://www.mkdocs.org/user-guide/configuration/#site_description + +### Setting the page `icon` + +<!-- md:version 9.2.0 --> +<!-- md:flag experimental --> + +An icon can be assigned to each page, which is then rendered as part of the +navigation sidebar, as well as [navigation tabs], if enabled. Use the front +matter `icon` property to reference an icon, adding the following lines at the +top of a Markdown file: + +``` yaml +--- +icon: material/emoticon-happy # (1)! +--- + +# Page title +... +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="emoticon happy" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + + [icon search]: icons-emojis.md#search + [navigation tabs]: ../setup/setting-up-navigation.md#navigation-tabs + +### Setting the page `status` + +<!-- md:version 9.2.0 --> +<!-- md:flag experimental --> +<!-- md:example page-status --> + +A status can be assigned to each page, which is then displayed as part of the +navigation sidebar. First, associate a status identifier with a description by +adding the following to `mkdocs.yml`: + +``` yaml +extra: + status: + <identifier>: <description> # (1)! +``` + +1. The identifier can only include alphanumeric characters, as well as dashes + and underscores. For example, if you have a status `Recently added`, you can + set `new` as an identifier: + + ``` yaml + extra: + status: + new: Recently added + ``` + +The page status can now be set with the front matter `status` property. For +example, you can mark a page as `new` with the following lines at the top of a +Markdown file: + +``` yaml +--- +status: new +--- + +# Page title +... +``` + +The following status identifiers are already defined: + +- :material-alert-decagram: – `new` +- :material-trash-can: – `deprecated` + +You can define a custom page status this way but if you want it to +have an icon other than the default one you need to also configure +that in your `extra.css`. We have an [example for a custom +page status] to get you started. + +[example for a custom page status]: https://mkdocs-material.github.io/examples/page-status/ + +### Setting the page `subtitle` + +<!-- md:version 9.6.0 --> +<!-- md:flag experimental --> + +Each page can define a subtitle, which is then rendered below the title as part +of the navigation sidebar by using the front matter `subtitle` property, and +adding the following lines: + +``` yaml +--- +subtitle: Nullam urna elit, malesuada eget finibus ut, ac tortor +--- + +# Page title +... +``` + +### Setting the page `template` + +If you're using [theme extension] and created a new page template in the +`overrides` directory, you can enable it for a specific page. Add the following +lines at the top of a Markdown file: + +``` yaml +--- +template: custom.html +--- + +# Page title +... +``` + +??? question "How to set a page template for an entire folder?" + + With the help of the [built-in meta plugin], you can set a custom template + for an entire section and all nested pages, by creating a `.meta.yml` file + in the corresponding folder with the following content: + + ``` yaml + template: custom.html + ``` + + [theme extension]: ../customization.md#extending-the-theme + [built-in meta plugin]: ../plugins/meta.md + +## Customization + +### Using metadata in templates + +#### :material-check-all: on all pages + +In order to add custom `meta` tags to your document, you can [extend the theme +][theme extension] and [override the `extrahead` block][overriding blocks], +e.g. to add indexing policies for search engines via the `robots` property: + +``` html +{% extends "base.html" %} + +{% block extrahead %} + <meta name="robots" content="noindex, nofollow" /> +{% endblock %} +``` + + [overriding blocks]: ../customization.md#overriding-blocks + +#### :material-check: on a single page + +If you want to set a `meta` tag on a single page, or want to set different +values for different pages, you can use the `page.meta` object inside your +template override, e.g.: + +``` html +{% extends "base.html" %} + +{% block extrahead %} + {% if page and page.meta and page.meta.robots %} + <meta name="robots" content="{{ page.meta.robots }}" /> + {% else %} + <meta name="robots" content="index, follow" /> + {% endif %} +{% endblock %} +``` + +You can now use `robots` exactly like [`title`][title] and +[`description`][description] to set values. Note that in this case, the +template defines an `else` branch, which would set a default if none was given. + + [title]: #setting-the-page-title + [description]: #setting-the-page-description diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/lists.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/lists.md new file mode 100644 index 0000000..1de7e7b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/lists.md @@ -0,0 +1,168 @@ +--- +icon: material/format-list-bulleted +--- + +# Lists + +Material for MkDocs supports several flavors of lists that cater to different +use cases, including _unordered lists_ and _ordered lists_, which are supported +through standard Markdown, as well as _definition lists_ and _task lists_, which +are supported through extensions. + +## Configuration + +This configuration enables the use of definition lists and tasks lists, which +are both not part of the standard Markdown syntax. Add the following lines to +`mkdocs.yml`: + +``` yaml +markdown_extensions: + - def_list + - pymdownx.tasklist: + custom_checkbox: true +``` + +See additional configuration options: + +- [Definition Lists] +- [Tasklist] + + [Definition Lists]: ../setup/extensions/python-markdown.md#definition-lists + [Tasklist]: ../setup/extensions/python-markdown-extensions.md#tasklist + +## Usage + +### Using unordered lists + +Unordered lists can be written by prefixing a line with a `-`, `*` or `+` list +marker, all of which can be used interchangeably. Furthermore, all flavors +of lists can be nested inside each other: + +``` markdown title="List, unordered" +- Nulla et rhoncus turpis. Mauris ultricies elementum leo. Duis efficitur + accumsan nibh eu mattis. Vivamus tempus velit eros, porttitor placerat nibh + lacinia sed. Aenean in finibus diam. + + * Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis. + * Nam vulputate tincidunt fringilla. + * Nullam dignissim ultrices urna non auctor. +``` + +<div class="result" markdown> + +- Nulla et rhoncus turpis. Mauris ultricies elementum leo. Duis efficitur + accumsan nibh eu mattis. Vivamus tempus velit eros, porttitor placerat nibh + lacinia sed. Aenean in finibus diam. + + * Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis. + * Nam vulputate tincidunt fringilla. + * Nullam dignissim ultrices urna non auctor. + +</div> + +### Using ordered lists + +Ordered lists must start with a number immediately followed by a dot. The +numbers do not need to be consecutive and can be all set to `1.`, as they will +be re-numbered when rendered: + +``` markdown title="List, ordered" +1. Vivamus id mi enim. Integer id turpis sapien. Ut condimentum lobortis + sagittis. Aliquam purus tellus, faucibus eget urna at, iaculis venenatis + nulla. Vivamus a pharetra leo. + + 1. Vivamus venenatis porttitor tortor sit amet rutrum. Pellentesque aliquet + quam enim, eu volutpat urna rutrum a. Nam vehicula nunc mauris, a + ultricies libero efficitur sed. + + 2. Morbi eget dapibus felis. Vivamus venenatis porttitor tortor sit amet + rutrum. Pellentesque aliquet quam enim, eu volutpat urna rutrum a. + + 1. Mauris dictum mi lacus + 2. Ut sit amet placerat ante + 3. Suspendisse ac eros arcu +``` + +<div class="result" markdown> + +1. Vivamus id mi enim. Integer id turpis sapien. Ut condimentum lobortis + sagittis. Aliquam purus tellus, faucibus eget urna at, iaculis venenatis + nulla. Vivamus a pharetra leo. + + 1. Vivamus venenatis porttitor tortor sit amet rutrum. Pellentesque aliquet + quam enim, eu volutpat urna rutrum a. Nam vehicula nunc mauris, a + ultricies libero efficitur sed. + + 2. Morbi eget dapibus felis. Vivamus venenatis porttitor tortor sit amet + rutrum. Pellentesque aliquet quam enim, eu volutpat urna rutrum a. + + 1. Mauris dictum mi lacus + 2. Ut sit amet placerat ante + 3. Suspendisse ac eros arcu + +</div> + +### Using definition lists + +When [Definition Lists] is enabled, lists of arbitrary key-value pairs, e.g. the +parameters of functions or modules, can be enumerated with a simple syntax: + +``` markdown title="Definition list" +`Lorem ipsum dolor sit amet` + +: Sed sagittis eleifend rutrum. Donec vitae suscipit est. Nullam tempus + tellus non sem sollicitudin, quis rutrum leo facilisis. + +`Cras arcu libero` + +: Aliquam metus eros, pretium sed nulla venenatis, faucibus auctor ex. Proin + ut eros sed sapien ullamcorper consequat. Nunc ligula ante. + + Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis. + Nam vulputate tincidunt fringilla. + Nullam dignissim ultrices urna non auctor. +``` + +<div class="result" markdown> + +`Lorem ipsum dolor sit amet` + +: Sed sagittis eleifend rutrum. Donec vitae suscipit est. Nullam tempus + tellus non sem sollicitudin, quis rutrum leo facilisis. + +`Cras arcu libero` + +: Aliquam metus eros, pretium sed nulla venenatis, faucibus auctor ex. Proin + ut eros sed sapien ullamcorper consequat. Nunc ligula ante. + + Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis. + Nam vulputate tincidunt fringilla. + Nullam dignissim ultrices urna non auctor. + +</div> + +### Using task lists + +When [Tasklist] is enabled, unordered list items can be prefixed with `[ ]` to +render an unchecked checkbox or `[x]` to render a checked checkbox, allowing +for the definition of task lists: + +``` markdown title="Task list" +- [x] Lorem ipsum dolor sit amet, consectetur adipiscing elit +- [ ] Vestibulum convallis sit amet nisi a tincidunt + * [x] In hac habitasse platea dictumst + * [x] In scelerisque nibh non dolor mollis congue sed et metus + * [ ] Praesent sed risus massa +- [ ] Aenean pretium efficitur erat, donec pharetra, ligula non scelerisque +``` + +<div class="result" markdown> + +- [x] Lorem ipsum dolor sit amet, consectetur adipiscing elit +- [ ] Vestibulum convallis sit amet nisi a tincidunt + * [x] In hac habitasse platea dictumst + * [x] In scelerisque nibh non dolor mollis congue sed et metus + * [ ] Praesent sed risus massa +- [ ] Aenean pretium efficitur erat, donec pharetra, ligula non scelerisque + +</div> diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/math.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/math.md new file mode 100644 index 0000000..83cc8df --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/math.md @@ -0,0 +1,198 @@ +--- +icon: material/alphabet-greek +--- + +# Math + +[MathJax] and [KaTeX] are two popular libraries for displaying +mathematical content in browsers. Although both libraries offer similar +functionality, they use different syntaxes and have different configuration +options. This documentation site provides information on how to integrate them +with Material for MkDocs easily. + + [MathJax]: https://www.mathjax.org/ + [LaTeX]: https://en.wikibooks.org/wiki/LaTeX/Mathematics + [MathML]: https://en.wikipedia.org/wiki/MathML + [AsciiMath]: http://asciimath.org/ + [KaTeX]: https://katex.org/ + + +## Configuration + +The following configuration enables support for rendering block and +inline block equations using [MathJax] and [KaTeX]. + +### MathJax + +[MathJax] is a powerful and flexible library that supports multiple input formats, +such as [LaTeX], [MathML], [AsciiMath], as well as various output formats like +HTML, SVG, MathML. To use MathJax within your project, add the following lines +to your `mkdocs.yml`. + +=== ":octicons-file-code-16: `docs/javascripts/mathjax.js`" + + ``` js + window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } + }; + + document$.subscribe(() => { // (1)! + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() + }) + ``` + + 1. This integrates MathJax with [instant loading]. + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + markdown_extensions: + - pymdownx.arithmatex: + generic: true + + extra_javascript: + - javascripts/mathjax.js + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + ``` + +See additional configuration options: + +- [Arithmatex] + + [Arithmatex]: ../setup/extensions/python-markdown-extensions.md#arithmatex + [instant loading]: ../setup/setting-up-navigation.md#instant-loading + +<script id="MathJax-script" async src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script> +<script> + window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } + }; +</script> + +### KaTeX + +[KaTeX] is a lightweight library that focuses on speed and simplicity. It +supports a subset of LaTeX syntax and can render math to HTML and SVG. To use +[KaTeX] within your project, add the following lines to your `mkdocs.yml`. + +=== ":octicons-file-code-16: `docs/javascripts/katex.js`" + + ``` js + document$.subscribe(({ body }) => { // (1)! + renderMathInElement(body, { + delimiters: [ + { left: "$$", right: "$$", display: true }, + { left: "$", right: "$", display: false }, + { left: "\\(", right: "\\)", display: false }, + { left: "\\[", right: "\\]", display: true } + ], + }) + }) + ``` + + 1. This integrates KaTeX with [instant loading]. + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + markdown_extensions: + - pymdownx.arithmatex: + generic: true + + extra_javascript: + - javascripts/katex.js + - https://unpkg.com/katex@0/dist/katex.min.js + - https://unpkg.com/katex@0/dist/contrib/auto-render.min.js + + extra_css: + - https://unpkg.com/katex@0/dist/katex.min.css + ``` + +## Usage + +### Using block syntax + +Blocks must be enclosed in `#!latex $$...$$` or `#!latex \[...\]` on separate +lines: + +``` latex title="block syntax" +$$ +\cos x=\sum_{k=0}^{\infty}\frac{(-1)^k}{(2k)!}x^{2k} +$$ +``` + +<div class="result" markdown> + +$$ +\cos x=\sum_{k=0}^{\infty}\frac{(-1)^k}{(2k)!}x^{2k} +$$ + +</div> + +### Using inline block syntax + +Inline blocks must be enclosed in `#!latex $...$` or `#!latex \(...\)`: + +``` latex title="inline syntax" +The homomorphism $f$ is injective if and only if its kernel is only the +singleton set $e_G$, because otherwise $\exists a,b\in G$ with $a\neq b$ such +that $f(a)=f(b)$. +``` + +<div class="result" markdown> + +The homomorphism $f$ is injective if and only if its kernel is only the +singleton set $e_G$, because otherwise $\exists a,b\in G$ with $a\neq b$ such +that $f(a)=f(b)$. + +</div> + +## Comparing MathJax and KaTeX + +When deciding between MathJax and KaTeX, there are several key factors to +consider: + +- __Speed__: KaTeX is generally faster than MathJax. If your site requires + rendering large quantities of complex equations quickly, KaTeX may be the + better choice. + +- __Syntax Support__: MathJax supports a wider array of LaTeX commands and can + process a variety of mathematical markup languages (like AsciiMath and MathML). + If you need advanced LaTeX features, MathJax may be more suitable. + +- __Output Format__: Both libraries support HTML and SVG outputs. However, + MathJax also offers MathML output, which can be essential for accessibility, + as it is readable by screen readers. + +- __Configurability__: MathJax provides a range of configuration options, + allowing for more precise control over its behavior. If you have specific + rendering requirements, MathJax might be a more flexible choice. + +- __Browser Support__: While both libraries work well in modern browsers, + MathJax has broader compatibility with older browsers. If your audience uses a + variety of browsers, including older ones, MathJax might be a safer option. + +In summary, KaTeX shines with its speed and simplicity, whereas MathJax offers +more features and better compatibility at the expense of speed. The choice +between the two will largely depend on your specific needs and constraints. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/tooltips.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/tooltips.md new file mode 100644 index 0000000..55e8538 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/reference/tooltips.md @@ -0,0 +1,167 @@ +--- +icon: material/tooltip-plus +--- + +# Tooltips + +Technical documentation often incurs the usage of many acronyms, which may +need additional explanation, especially for new user of your project. For these +matters, Material for MkDocs uses a combination of Markdown extensions to +enable site-wide glossaries. + +## Configuration + +This configuration enables abbreviations and allows to build a simple +project-wide glossary, sourcing definitions from a central location. Add the +following line to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - abbr + - attr_list + - pymdownx.snippets +``` + +See additional configuration options: + +- [Abbreviations] +- [Attribute Lists] +- [Snippets] + + [Abbreviations]: ../setup/extensions/python-markdown.md#abbreviations + [Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists + [Snippets]: ../setup/extensions/python-markdown-extensions.md#snippets + +### Improved tooltips + +<!-- md:version 9.5.0 --> +<!-- md:flag experimental --> + +When improved tooltips are enabled, Material for MkDocs replaces the browser's +rendering logic for `title` attribute with beautiful little tooltips. +Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - content.tooltips +``` + +Now, tooltips will be rendered for the following elements: + +- __Content__ – elements with a `title`, permalinks and code copy button +- __Header__ – home button, header title, color palette switch and repository link +- __Navigation__ – links that are shortened with ellipsis, i.e. `...` + +## Usage + +### Adding tooltips + +The [Markdown syntax] allows to specify a `title` for each link, which will +render as a beautiful tooltip when [improved tooltips] are enabled. Add a +tooltip to a link with the following lines: + +``` markdown title="Link with tooltip, inline syntax" +[Hover me](https://example.com "I'm a tooltip!") +``` + +<div class="result" markdown> + +[Hover me](https://example.com "I'm a tooltip!") + +</div> + +Tooltips can also be added to link references: + +``` markdown title="Link with tooltip, reference syntax" +[Hover me][example] + + [example]: https://example.com "I'm a tooltip!" +``` + +<div class="result" markdown> + +[Hover me](https://example.com "I'm a tooltip!") + +</div> + +For all other elements, a `title` can be added by using the [Attribute Lists] +extension: + +``` markdown title="Icon with tooltip" +:material-information-outline:{ title="Important information" } +``` + +<div class="result" markdown> + +:material-information-outline:{ title="Important information" } + +</div> + + [Markdown syntax]: https://daringfireball.net/projects/markdown/syntax#link + [improved tooltips]: #improved-tooltips + +### Adding abbreviations + +Abbreviations can be defined by using a special syntax similar to URLs and +[footnotes], starting with a `*` and immediately followed by the term or +acronym to be associated in square brackets: + +``` markdown title="Text with abbreviations" +The HTML specification is maintained by the W3C. + +*[HTML]: Hyper Text Markup Language +*[W3C]: World Wide Web Consortium +``` + +<div class="result" markdown> + +The HTML specification is maintained by the W3C. + +*[HTML]: Hyper Text Markup Language +*[W3C]: World Wide Web Consortium + +</div> + + [footnotes]: footnotes.md + +### Adding a glossary + +The [Snippets] extension can be used to implement a simple glossary by moving +all abbreviations in a dedicated file[^1], and [auto-append] this file to all +pages with the following configuration: + + [^1]: + It's highly recommended to put the Markdown file containing the + abbreviations outside of the `docs` folder (here, a folder with the name + `includes` is used), as MkDocs might otherwise complain about an + unreferenced file. + +=== ":octicons-file-code-16: `includes/abbreviations.md`" + + ```` markdown + *[HTML]: Hyper Text Markup Language + *[W3C]: World Wide Web Consortium + ```` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ```` yaml + markdown_extensions: + - pymdownx.snippets: + auto_append: + - includes/abbreviations.md + ```` + + [auto-append]: https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#auto-append-snippets + +!!! tip + + When using a dedicated file outside of the `docs` folder, add the parent directory to the list + of `watch` folders so that when the glossary file is updated, the project is automatically + reloaded when running `mkdocs serve`. + + ```` yaml + watch: + - includes + ```` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema.json new file mode 100644 index 0000000..24bef89 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema.json @@ -0,0 +1,188 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Material for MkDocs", + "markdownDescription": "Configuration", + "type": "object", + "properties": { + "INHERIT": { + "title": "Inherit from configuration", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance", + "pattern": "\\.yml$" + }, + "site_name": { + "title": "Site name, used in header, title and drawer", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_name", + "type": "string" + }, + "site_url": { + "title": "Site URL", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_url", + "type": "string" + }, + "site_author": { + "title": "Site author, used in document head", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_author", + "type": "string" + }, + "site_description": { + "title": "Site description, used in document head and in social cards", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_description", + "type": "string" + }, + "repo_name": { + "title": "Repository name, used in header", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository-name", + "type": "string" + }, + "repo_url": { + "title": "Repository URL", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository", + "type": "string" + }, + "edit_uri": { + "title": "Path from repository root to directory containing Markdown", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#edit_uri", + "type": "string" + }, + "edit_uri_template": { + "title": "More flexible variant of edit_uri", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#edit_uri_template", + "type": "string" + }, + "copyright": { + "title": "Copyright, used in footer", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#copyright-notice", + "type": "string" + }, + "docs_dir": { + "title": "Directory containing the Markdown sources", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#docs_dir", + "type": "string", + "default": "docs" + }, + "site_dir": { + "title": "Directory containing the HTML output", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_dir", + "type": "string", + "default": "site" + }, + "use_directory_urls": { + "title": "Pages are located in their own directories", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#use_directory_urls", + "type": "boolean", + "default": false + }, + "extra_templates": { + "title": "Additional HTML files to include", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_css": { + "title": "Additional CSS files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "pattern": "\\.css($|\\?)" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_javascript": { + "title": "Additional JavaScript files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript", + "type": "array", + "items": { + "title": "Path to JavaScript file (may be local or absolute URL to external JS)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript" + }, + "uniqueItems": true, + "minItems": 1 + }, + "hooks": { + "title": "Hooks", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#hooks", + "type": "array", + "items": { + "title": "Path to Python file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#hooks", + "pattern": "\\.py$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "strict": { + "title": "Strict mode", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#strict", + "type": "boolean", + "default": false + }, + "dev_addr": { + "title": "Development IP Address", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#dev_addr", + "type": "string", + "default": "127.0.0.1:8000" + }, + "remote_branch": { + "title": "Remote branch to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_branch", + "type": "string", + "default": "gh-pages" + }, + "remote_name": { + "title": "Remote origin to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_name", + "type": "string", + "default": "origin" + }, + "theme": { + "$ref": "schema/theme.json" + }, + "plugins": { + "$ref": "schema/plugins.json" + }, + "markdown_extensions": { + "$ref": "schema/extensions.json" + }, + "extra": { + "$ref": "schema/extra.json" + }, + "nav": { + "$ref": "schema/nav.json" + }, + "validation": { + "$ref": "schema/validation.json" + }, + "exclude_docs": { + "title": "Pattern to declare files to exclude from build", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#exclude_docs", + "type": "string" + }, + "draft_docs": { + "title": "Pattern to declare draft documents", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#draft_docs", + "type": "string" + }, + "not_in_nav": { + "title": "Pattern to declare pages that do not appear in the navigation", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#not_in_nav", + "type": "string" + }, + "watch": { + "items": { + "title": "Path to watch for changes", + "type": "string" + }, + "type": "array" + } + }, + "additionalProperties": false +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/assets/fonts.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/assets/fonts.json new file mode 100644 index 0000000..b08ca37 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/assets/fonts.json @@ -0,0 +1,7913 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Google Fonts", + "markdownDescription": "https://fonts.google.com/", + "type": "string", + "oneOf": [ + { + "title": "ABeeZee", + "markdownDescription": "https://fonts.google.com/specimen/ABeeZee", + "const": "ABeeZee" + }, + { + "title": "ADLaM Display", + "markdownDescription": "https://fonts.google.com/specimen/ADLaM+Display", + "const": "ADLaM Display" + }, + { + "title": "AR One Sans", + "markdownDescription": "https://fonts.google.com/specimen/AR+One+Sans", + "const": "AR One Sans" + }, + { + "title": "Abel", + "markdownDescription": "https://fonts.google.com/specimen/Abel", + "const": "Abel" + }, + { + "title": "Abhaya Libre", + "markdownDescription": "https://fonts.google.com/specimen/Abhaya+Libre", + "const": "Abhaya Libre" + }, + { + "title": "Aboreto", + "markdownDescription": "https://fonts.google.com/specimen/Aboreto", + "const": "Aboreto" + }, + { + "title": "Abril Fatface", + "markdownDescription": "https://fonts.google.com/specimen/Abril+Fatface", + "const": "Abril Fatface" + }, + { + "title": "Abyssinica SIL", + "markdownDescription": "https://fonts.google.com/specimen/Abyssinica+SIL", + "const": "Abyssinica SIL" + }, + { + "title": "Aclonica", + "markdownDescription": "https://fonts.google.com/specimen/Aclonica", + "const": "Aclonica" + }, + { + "title": "Acme", + "markdownDescription": "https://fonts.google.com/specimen/Acme", + "const": "Acme" + }, + { + "title": "Actor", + "markdownDescription": "https://fonts.google.com/specimen/Actor", + "const": "Actor" + }, + { + "title": "Adamina", + "markdownDescription": "https://fonts.google.com/specimen/Adamina", + "const": "Adamina" + }, + { + "title": "Advent Pro", + "markdownDescription": "https://fonts.google.com/specimen/Advent+Pro", + "const": "Advent Pro" + }, + { + "title": "Agdasima", + "markdownDescription": "https://fonts.google.com/specimen/Agdasima", + "const": "Agdasima" + }, + { + "title": "Aguafina Script", + "markdownDescription": "https://fonts.google.com/specimen/Aguafina+Script", + "const": "Aguafina Script" + }, + { + "title": "Akatab", + "markdownDescription": "https://fonts.google.com/specimen/Akatab", + "const": "Akatab" + }, + { + "title": "Akaya Kanadaka", + "markdownDescription": "https://fonts.google.com/specimen/Akaya+Kanadaka", + "const": "Akaya Kanadaka" + }, + { + "title": "Akaya Telivigala", + "markdownDescription": "https://fonts.google.com/specimen/Akaya+Telivigala", + "const": "Akaya Telivigala" + }, + { + "title": "Akronim", + "markdownDescription": "https://fonts.google.com/specimen/Akronim", + "const": "Akronim" + }, + { + "title": "Akshar", + "markdownDescription": "https://fonts.google.com/specimen/Akshar", + "const": "Akshar" + }, + { + "title": "Aladin", + "markdownDescription": "https://fonts.google.com/specimen/Aladin", + "const": "Aladin" + }, + { + "title": "Alata", + "markdownDescription": "https://fonts.google.com/specimen/Alata", + "const": "Alata" + }, + { + "title": "Alatsi", + "markdownDescription": "https://fonts.google.com/specimen/Alatsi", + "const": "Alatsi" + }, + { + "title": "Albert Sans", + "markdownDescription": "https://fonts.google.com/specimen/Albert+Sans", + "const": "Albert Sans" + }, + { + "title": "Aldrich", + "markdownDescription": "https://fonts.google.com/specimen/Aldrich", + "const": "Aldrich" + }, + { + "title": "Alef", + "markdownDescription": "https://fonts.google.com/specimen/Alef", + "const": "Alef" + }, + { + "title": "Alegreya", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya", + "const": "Alegreya" + }, + { + "title": "Alegreya SC", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+SC", + "const": "Alegreya SC" + }, + { + "title": "Alegreya Sans", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+Sans", + "const": "Alegreya Sans" + }, + { + "title": "Alegreya Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+Sans+SC", + "const": "Alegreya Sans SC" + }, + { + "title": "Aleo", + "markdownDescription": "https://fonts.google.com/specimen/Aleo", + "const": "Aleo" + }, + { + "title": "Alex Brush", + "markdownDescription": "https://fonts.google.com/specimen/Alex+Brush", + "const": "Alex Brush" + }, + { + "title": "Alexandria", + "markdownDescription": "https://fonts.google.com/specimen/Alexandria", + "const": "Alexandria" + }, + { + "title": "Alfa Slab One", + "markdownDescription": "https://fonts.google.com/specimen/Alfa+Slab+One", + "const": "Alfa Slab One" + }, + { + "title": "Alice", + "markdownDescription": "https://fonts.google.com/specimen/Alice", + "const": "Alice" + }, + { + "title": "Alike", + "markdownDescription": "https://fonts.google.com/specimen/Alike", + "const": "Alike" + }, + { + "title": "Alike Angular", + "markdownDescription": "https://fonts.google.com/specimen/Alike+Angular", + "const": "Alike Angular" + }, + { + "title": "Alkalami", + "markdownDescription": "https://fonts.google.com/specimen/Alkalami", + "const": "Alkalami" + }, + { + "title": "Alkatra", + "markdownDescription": "https://fonts.google.com/specimen/Alkatra", + "const": "Alkatra" + }, + { + "title": "Allan", + "markdownDescription": "https://fonts.google.com/specimen/Allan", + "const": "Allan" + }, + { + "title": "Allerta", + "markdownDescription": "https://fonts.google.com/specimen/Allerta", + "const": "Allerta" + }, + { + "title": "Allerta Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Allerta+Stencil", + "const": "Allerta Stencil" + }, + { + "title": "Allison", + "markdownDescription": "https://fonts.google.com/specimen/Allison", + "const": "Allison" + }, + { + "title": "Allura", + "markdownDescription": "https://fonts.google.com/specimen/Allura", + "const": "Allura" + }, + { + "title": "Almarai", + "markdownDescription": "https://fonts.google.com/specimen/Almarai", + "const": "Almarai" + }, + { + "title": "Almendra", + "markdownDescription": "https://fonts.google.com/specimen/Almendra", + "const": "Almendra" + }, + { + "title": "Almendra Display", + "markdownDescription": "https://fonts.google.com/specimen/Almendra+Display", + "const": "Almendra Display" + }, + { + "title": "Almendra SC", + "markdownDescription": "https://fonts.google.com/specimen/Almendra+SC", + "const": "Almendra SC" + }, + { + "title": "Alumni Sans", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans", + "const": "Alumni Sans" + }, + { + "title": "Alumni Sans Collegiate One", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans+Collegiate+One", + "const": "Alumni Sans Collegiate One" + }, + { + "title": "Alumni Sans Inline One", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans+Inline+One", + "const": "Alumni Sans Inline One" + }, + { + "title": "Alumni Sans Pinstripe", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans+Pinstripe", + "const": "Alumni Sans Pinstripe" + }, + { + "title": "Amarante", + "markdownDescription": "https://fonts.google.com/specimen/Amarante", + "const": "Amarante" + }, + { + "title": "Amaranth", + "markdownDescription": "https://fonts.google.com/specimen/Amaranth", + "const": "Amaranth" + }, + { + "title": "Amatic SC", + "markdownDescription": "https://fonts.google.com/specimen/Amatic+SC", + "const": "Amatic SC" + }, + { + "title": "Amethysta", + "markdownDescription": "https://fonts.google.com/specimen/Amethysta", + "const": "Amethysta" + }, + { + "title": "Amiko", + "markdownDescription": "https://fonts.google.com/specimen/Amiko", + "const": "Amiko" + }, + { + "title": "Amiri", + "markdownDescription": "https://fonts.google.com/specimen/Amiri", + "const": "Amiri" + }, + { + "title": "Amiri Quran", + "markdownDescription": "https://fonts.google.com/specimen/Amiri+Quran", + "const": "Amiri Quran" + }, + { + "title": "Amita", + "markdownDescription": "https://fonts.google.com/specimen/Amita", + "const": "Amita" + }, + { + "title": "Anaheim", + "markdownDescription": "https://fonts.google.com/specimen/Anaheim", + "const": "Anaheim" + }, + { + "title": "Andada Pro", + "markdownDescription": "https://fonts.google.com/specimen/Andada+Pro", + "const": "Andada Pro" + }, + { + "title": "Andika", + "markdownDescription": "https://fonts.google.com/specimen/Andika", + "const": "Andika" + }, + { + "title": "Anek Bangla", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Bangla", + "const": "Anek Bangla" + }, + { + "title": "Anek Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Devanagari", + "const": "Anek Devanagari" + }, + { + "title": "Anek Gujarati", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Gujarati", + "const": "Anek Gujarati" + }, + { + "title": "Anek Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Gurmukhi", + "const": "Anek Gurmukhi" + }, + { + "title": "Anek Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Kannada", + "const": "Anek Kannada" + }, + { + "title": "Anek Latin", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Latin", + "const": "Anek Latin" + }, + { + "title": "Anek Malayalam", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Malayalam", + "const": "Anek Malayalam" + }, + { + "title": "Anek Odia", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Odia", + "const": "Anek Odia" + }, + { + "title": "Anek Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Tamil", + "const": "Anek Tamil" + }, + { + "title": "Anek Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Telugu", + "const": "Anek Telugu" + }, + { + "title": "Angkor", + "markdownDescription": "https://fonts.google.com/specimen/Angkor", + "const": "Angkor" + }, + { + "title": "Annie Use Your Telescope", + "markdownDescription": "https://fonts.google.com/specimen/Annie+Use+Your+Telescope", + "const": "Annie Use Your Telescope" + }, + { + "title": "Anonymous Pro", + "markdownDescription": "https://fonts.google.com/specimen/Anonymous+Pro", + "const": "Anonymous Pro" + }, + { + "title": "Antic", + "markdownDescription": "https://fonts.google.com/specimen/Antic", + "const": "Antic" + }, + { + "title": "Antic Didone", + "markdownDescription": "https://fonts.google.com/specimen/Antic+Didone", + "const": "Antic Didone" + }, + { + "title": "Antic Slab", + "markdownDescription": "https://fonts.google.com/specimen/Antic+Slab", + "const": "Antic Slab" + }, + { + "title": "Anton", + "markdownDescription": "https://fonts.google.com/specimen/Anton", + "const": "Anton" + }, + { + "title": "Antonio", + "markdownDescription": "https://fonts.google.com/specimen/Antonio", + "const": "Antonio" + }, + { + "title": "Anuphan", + "markdownDescription": "https://fonts.google.com/specimen/Anuphan", + "const": "Anuphan" + }, + { + "title": "Anybody", + "markdownDescription": "https://fonts.google.com/specimen/Anybody", + "const": "Anybody" + }, + { + "title": "Aoboshi One", + "markdownDescription": "https://fonts.google.com/specimen/Aoboshi+One", + "const": "Aoboshi One" + }, + { + "title": "Arapey", + "markdownDescription": "https://fonts.google.com/specimen/Arapey", + "const": "Arapey" + }, + { + "title": "Arbutus", + "markdownDescription": "https://fonts.google.com/specimen/Arbutus", + "const": "Arbutus" + }, + { + "title": "Arbutus Slab", + "markdownDescription": "https://fonts.google.com/specimen/Arbutus+Slab", + "const": "Arbutus Slab" + }, + { + "title": "Architects Daughter", + "markdownDescription": "https://fonts.google.com/specimen/Architects+Daughter", + "const": "Architects Daughter" + }, + { + "title": "Archivo", + "markdownDescription": "https://fonts.google.com/specimen/Archivo", + "const": "Archivo" + }, + { + "title": "Archivo Black", + "markdownDescription": "https://fonts.google.com/specimen/Archivo+Black", + "const": "Archivo Black" + }, + { + "title": "Archivo Narrow", + "markdownDescription": "https://fonts.google.com/specimen/Archivo+Narrow", + "const": "Archivo Narrow" + }, + { + "title": "Are You Serious", + "markdownDescription": "https://fonts.google.com/specimen/Are+You+Serious", + "const": "Are You Serious" + }, + { + "title": "Aref Ruqaa", + "markdownDescription": "https://fonts.google.com/specimen/Aref+Ruqaa", + "const": "Aref Ruqaa" + }, + { + "title": "Aref Ruqaa Ink", + "markdownDescription": "https://fonts.google.com/specimen/Aref+Ruqaa+Ink", + "const": "Aref Ruqaa Ink" + }, + { + "title": "Arima", + "markdownDescription": "https://fonts.google.com/specimen/Arima", + "const": "Arima" + }, + { + "title": "Arima Madurai", + "markdownDescription": "https://fonts.google.com/specimen/Arima+Madurai", + "const": "Arima Madurai" + }, + { + "title": "Arimo", + "markdownDescription": "https://fonts.google.com/specimen/Arimo", + "const": "Arimo" + }, + { + "title": "Arizonia", + "markdownDescription": "https://fonts.google.com/specimen/Arizonia", + "const": "Arizonia" + }, + { + "title": "Armata", + "markdownDescription": "https://fonts.google.com/specimen/Armata", + "const": "Armata" + }, + { + "title": "Arsenal", + "markdownDescription": "https://fonts.google.com/specimen/Arsenal", + "const": "Arsenal" + }, + { + "title": "Artifika", + "markdownDescription": "https://fonts.google.com/specimen/Artifika", + "const": "Artifika" + }, + { + "title": "Arvo", + "markdownDescription": "https://fonts.google.com/specimen/Arvo", + "const": "Arvo" + }, + { + "title": "Arya", + "markdownDescription": "https://fonts.google.com/specimen/Arya", + "const": "Arya" + }, + { + "title": "Asap", + "markdownDescription": "https://fonts.google.com/specimen/Asap", + "const": "Asap" + }, + { + "title": "Asap Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Asap+Condensed", + "const": "Asap Condensed" + }, + { + "title": "Asar", + "markdownDescription": "https://fonts.google.com/specimen/Asar", + "const": "Asar" + }, + { + "title": "Asset", + "markdownDescription": "https://fonts.google.com/specimen/Asset", + "const": "Asset" + }, + { + "title": "Assistant", + "markdownDescription": "https://fonts.google.com/specimen/Assistant", + "const": "Assistant" + }, + { + "title": "Astloch", + "markdownDescription": "https://fonts.google.com/specimen/Astloch", + "const": "Astloch" + }, + { + "title": "Asul", + "markdownDescription": "https://fonts.google.com/specimen/Asul", + "const": "Asul" + }, + { + "title": "Athiti", + "markdownDescription": "https://fonts.google.com/specimen/Athiti", + "const": "Athiti" + }, + { + "title": "Atkinson Hyperlegible", + "markdownDescription": "https://fonts.google.com/specimen/Atkinson+Hyperlegible", + "const": "Atkinson Hyperlegible" + }, + { + "title": "Atma", + "markdownDescription": "https://fonts.google.com/specimen/Atma", + "const": "Atma" + }, + { + "title": "Atomic Age", + "markdownDescription": "https://fonts.google.com/specimen/Atomic+Age", + "const": "Atomic Age" + }, + { + "title": "Aubrey", + "markdownDescription": "https://fonts.google.com/specimen/Aubrey", + "const": "Aubrey" + }, + { + "title": "Audiowide", + "markdownDescription": "https://fonts.google.com/specimen/Audiowide", + "const": "Audiowide" + }, + { + "title": "Autour One", + "markdownDescription": "https://fonts.google.com/specimen/Autour+One", + "const": "Autour One" + }, + { + "title": "Average", + "markdownDescription": "https://fonts.google.com/specimen/Average", + "const": "Average" + }, + { + "title": "Average Sans", + "markdownDescription": "https://fonts.google.com/specimen/Average+Sans", + "const": "Average Sans" + }, + { + "title": "Averia Gruesa Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Gruesa+Libre", + "const": "Averia Gruesa Libre" + }, + { + "title": "Averia Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Libre", + "const": "Averia Libre" + }, + { + "title": "Averia Sans Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Sans+Libre", + "const": "Averia Sans Libre" + }, + { + "title": "Averia Serif Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Serif+Libre", + "const": "Averia Serif Libre" + }, + { + "title": "Azeret Mono", + "markdownDescription": "https://fonts.google.com/specimen/Azeret+Mono", + "const": "Azeret Mono" + }, + { + "title": "B612", + "markdownDescription": "https://fonts.google.com/specimen/B612", + "const": "B612" + }, + { + "title": "B612 Mono", + "markdownDescription": "https://fonts.google.com/specimen/B612+Mono", + "const": "B612 Mono" + }, + { + "title": "BIZ UDGothic", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDGothic", + "const": "BIZ UDGothic" + }, + { + "title": "BIZ UDMincho", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDMincho", + "const": "BIZ UDMincho" + }, + { + "title": "BIZ UDPGothic", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDPGothic", + "const": "BIZ UDPGothic" + }, + { + "title": "BIZ UDPMincho", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDPMincho", + "const": "BIZ UDPMincho" + }, + { + "title": "Babylonica", + "markdownDescription": "https://fonts.google.com/specimen/Babylonica", + "const": "Babylonica" + }, + { + "title": "Bacasime Antique", + "markdownDescription": "https://fonts.google.com/specimen/Bacasime+Antique", + "const": "Bacasime Antique" + }, + { + "title": "Bad Script", + "markdownDescription": "https://fonts.google.com/specimen/Bad+Script", + "const": "Bad Script" + }, + { + "title": "Bagel Fat One", + "markdownDescription": "https://fonts.google.com/specimen/Bagel+Fat+One", + "const": "Bagel Fat One" + }, + { + "title": "Bahiana", + "markdownDescription": "https://fonts.google.com/specimen/Bahiana", + "const": "Bahiana" + }, + { + "title": "Bahianita", + "markdownDescription": "https://fonts.google.com/specimen/Bahianita", + "const": "Bahianita" + }, + { + "title": "Bai Jamjuree", + "markdownDescription": "https://fonts.google.com/specimen/Bai+Jamjuree", + "const": "Bai Jamjuree" + }, + { + "title": "Bakbak One", + "markdownDescription": "https://fonts.google.com/specimen/Bakbak+One", + "const": "Bakbak One" + }, + { + "title": "Ballet", + "markdownDescription": "https://fonts.google.com/specimen/Ballet", + "const": "Ballet" + }, + { + "title": "Baloo 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+2", + "const": "Baloo 2" + }, + { + "title": "Baloo Bhai 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhai+2", + "const": "Baloo Bhai 2" + }, + { + "title": "Baloo Bhaijaan 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhaijaan+2", + "const": "Baloo Bhaijaan 2" + }, + { + "title": "Baloo Bhaina 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhaina+2", + "const": "Baloo Bhaina 2" + }, + { + "title": "Baloo Chettan 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Chettan+2", + "const": "Baloo Chettan 2" + }, + { + "title": "Baloo Da 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Da+2", + "const": "Baloo Da 2" + }, + { + "title": "Baloo Paaji 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Paaji+2", + "const": "Baloo Paaji 2" + }, + { + "title": "Baloo Tamma 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Tamma+2", + "const": "Baloo Tamma 2" + }, + { + "title": "Baloo Tammudu 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Tammudu+2", + "const": "Baloo Tammudu 2" + }, + { + "title": "Baloo Thambi 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Thambi+2", + "const": "Baloo Thambi 2" + }, + { + "title": "Balsamiq Sans", + "markdownDescription": "https://fonts.google.com/specimen/Balsamiq+Sans", + "const": "Balsamiq Sans" + }, + { + "title": "Balthazar", + "markdownDescription": "https://fonts.google.com/specimen/Balthazar", + "const": "Balthazar" + }, + { + "title": "Bangers", + "markdownDescription": "https://fonts.google.com/specimen/Bangers", + "const": "Bangers" + }, + { + "title": "Barlow", + "markdownDescription": "https://fonts.google.com/specimen/Barlow", + "const": "Barlow" + }, + { + "title": "Barlow Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Barlow+Condensed", + "const": "Barlow Condensed" + }, + { + "title": "Barlow Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Barlow+Semi+Condensed", + "const": "Barlow Semi Condensed" + }, + { + "title": "Barriecito", + "markdownDescription": "https://fonts.google.com/specimen/Barriecito", + "const": "Barriecito" + }, + { + "title": "Barrio", + "markdownDescription": "https://fonts.google.com/specimen/Barrio", + "const": "Barrio" + }, + { + "title": "Basic", + "markdownDescription": "https://fonts.google.com/specimen/Basic", + "const": "Basic" + }, + { + "title": "Baskervville", + "markdownDescription": "https://fonts.google.com/specimen/Baskervville", + "const": "Baskervville" + }, + { + "title": "Battambang", + "markdownDescription": "https://fonts.google.com/specimen/Battambang", + "const": "Battambang" + }, + { + "title": "Baumans", + "markdownDescription": "https://fonts.google.com/specimen/Baumans", + "const": "Baumans" + }, + { + "title": "Bayon", + "markdownDescription": "https://fonts.google.com/specimen/Bayon", + "const": "Bayon" + }, + { + "title": "Be Vietnam Pro", + "markdownDescription": "https://fonts.google.com/specimen/Be+Vietnam+Pro", + "const": "Be Vietnam Pro" + }, + { + "title": "Beau Rivage", + "markdownDescription": "https://fonts.google.com/specimen/Beau+Rivage", + "const": "Beau Rivage" + }, + { + "title": "Bebas Neue", + "markdownDescription": "https://fonts.google.com/specimen/Bebas+Neue", + "const": "Bebas Neue" + }, + { + "title": "Belanosima", + "markdownDescription": "https://fonts.google.com/specimen/Belanosima", + "const": "Belanosima" + }, + { + "title": "Belgrano", + "markdownDescription": "https://fonts.google.com/specimen/Belgrano", + "const": "Belgrano" + }, + { + "title": "Bellefair", + "markdownDescription": "https://fonts.google.com/specimen/Bellefair", + "const": "Bellefair" + }, + { + "title": "Belleza", + "markdownDescription": "https://fonts.google.com/specimen/Belleza", + "const": "Belleza" + }, + { + "title": "Bellota", + "markdownDescription": "https://fonts.google.com/specimen/Bellota", + "const": "Bellota" + }, + { + "title": "Bellota Text", + "markdownDescription": "https://fonts.google.com/specimen/Bellota+Text", + "const": "Bellota Text" + }, + { + "title": "BenchNine", + "markdownDescription": "https://fonts.google.com/specimen/BenchNine", + "const": "BenchNine" + }, + { + "title": "Benne", + "markdownDescription": "https://fonts.google.com/specimen/Benne", + "const": "Benne" + }, + { + "title": "Bentham", + "markdownDescription": "https://fonts.google.com/specimen/Bentham", + "const": "Bentham" + }, + { + "title": "Berkshire Swash", + "markdownDescription": "https://fonts.google.com/specimen/Berkshire+Swash", + "const": "Berkshire Swash" + }, + { + "title": "Besley", + "markdownDescription": "https://fonts.google.com/specimen/Besley", + "const": "Besley" + }, + { + "title": "Beth Ellen", + "markdownDescription": "https://fonts.google.com/specimen/Beth+Ellen", + "const": "Beth Ellen" + }, + { + "title": "Bevan", + "markdownDescription": "https://fonts.google.com/specimen/Bevan", + "const": "Bevan" + }, + { + "title": "BhuTuka Expanded One", + "markdownDescription": "https://fonts.google.com/specimen/BhuTuka+Expanded+One", + "const": "BhuTuka Expanded One" + }, + { + "title": "Big Shoulders Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Display", + "const": "Big Shoulders Display" + }, + { + "title": "Big Shoulders Inline Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Inline+Display", + "const": "Big Shoulders Inline Display" + }, + { + "title": "Big Shoulders Inline Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Inline+Text", + "const": "Big Shoulders Inline Text" + }, + { + "title": "Big Shoulders Stencil Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Stencil+Display", + "const": "Big Shoulders Stencil Display" + }, + { + "title": "Big Shoulders Stencil Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Stencil+Text", + "const": "Big Shoulders Stencil Text" + }, + { + "title": "Big Shoulders Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Text", + "const": "Big Shoulders Text" + }, + { + "title": "Bigelow Rules", + "markdownDescription": "https://fonts.google.com/specimen/Bigelow+Rules", + "const": "Bigelow Rules" + }, + { + "title": "Bigshot One", + "markdownDescription": "https://fonts.google.com/specimen/Bigshot+One", + "const": "Bigshot One" + }, + { + "title": "Bilbo", + "markdownDescription": "https://fonts.google.com/specimen/Bilbo", + "const": "Bilbo" + }, + { + "title": "Bilbo Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Bilbo+Swash+Caps", + "const": "Bilbo Swash Caps" + }, + { + "title": "BioRhyme", + "markdownDescription": "https://fonts.google.com/specimen/BioRhyme", + "const": "BioRhyme" + }, + { + "title": "BioRhyme Expanded", + "markdownDescription": "https://fonts.google.com/specimen/BioRhyme+Expanded", + "const": "BioRhyme Expanded" + }, + { + "title": "Birthstone", + "markdownDescription": "https://fonts.google.com/specimen/Birthstone", + "const": "Birthstone" + }, + { + "title": "Birthstone Bounce", + "markdownDescription": "https://fonts.google.com/specimen/Birthstone+Bounce", + "const": "Birthstone Bounce" + }, + { + "title": "Biryani", + "markdownDescription": "https://fonts.google.com/specimen/Biryani", + "const": "Biryani" + }, + { + "title": "Bitter", + "markdownDescription": "https://fonts.google.com/specimen/Bitter", + "const": "Bitter" + }, + { + "title": "Black And White Picture", + "markdownDescription": "https://fonts.google.com/specimen/Black+And+White+Picture", + "const": "Black And White Picture" + }, + { + "title": "Black Han Sans", + "markdownDescription": "https://fonts.google.com/specimen/Black+Han+Sans", + "const": "Black Han Sans" + }, + { + "title": "Black Ops One", + "markdownDescription": "https://fonts.google.com/specimen/Black+Ops+One", + "const": "Black Ops One" + }, + { + "title": "Blaka", + "markdownDescription": "https://fonts.google.com/specimen/Blaka", + "const": "Blaka" + }, + { + "title": "Blaka Hollow", + "markdownDescription": "https://fonts.google.com/specimen/Blaka+Hollow", + "const": "Blaka Hollow" + }, + { + "title": "Blaka Ink", + "markdownDescription": "https://fonts.google.com/specimen/Blaka+Ink", + "const": "Blaka Ink" + }, + { + "title": "Blinker", + "markdownDescription": "https://fonts.google.com/specimen/Blinker", + "const": "Blinker" + }, + { + "title": "Bodoni Moda", + "markdownDescription": "https://fonts.google.com/specimen/Bodoni+Moda", + "const": "Bodoni Moda" + }, + { + "title": "Bokor", + "markdownDescription": "https://fonts.google.com/specimen/Bokor", + "const": "Bokor" + }, + { + "title": "Bona Nova", + "markdownDescription": "https://fonts.google.com/specimen/Bona+Nova", + "const": "Bona Nova" + }, + { + "title": "Bonbon", + "markdownDescription": "https://fonts.google.com/specimen/Bonbon", + "const": "Bonbon" + }, + { + "title": "Bonheur Royale", + "markdownDescription": "https://fonts.google.com/specimen/Bonheur+Royale", + "const": "Bonheur Royale" + }, + { + "title": "Boogaloo", + "markdownDescription": "https://fonts.google.com/specimen/Boogaloo", + "const": "Boogaloo" + }, + { + "title": "Borel", + "markdownDescription": "https://fonts.google.com/specimen/Borel", + "const": "Borel" + }, + { + "title": "Bowlby One", + "markdownDescription": "https://fonts.google.com/specimen/Bowlby+One", + "const": "Bowlby One" + }, + { + "title": "Bowlby One SC", + "markdownDescription": "https://fonts.google.com/specimen/Bowlby+One+SC", + "const": "Bowlby One SC" + }, + { + "title": "Braah One", + "markdownDescription": "https://fonts.google.com/specimen/Braah+One", + "const": "Braah One" + }, + { + "title": "Brawler", + "markdownDescription": "https://fonts.google.com/specimen/Brawler", + "const": "Brawler" + }, + { + "title": "Bree Serif", + "markdownDescription": "https://fonts.google.com/specimen/Bree+Serif", + "const": "Bree Serif" + }, + { + "title": "Bricolage Grotesque", + "markdownDescription": "https://fonts.google.com/specimen/Bricolage+Grotesque", + "const": "Bricolage Grotesque" + }, + { + "title": "Bruno Ace", + "markdownDescription": "https://fonts.google.com/specimen/Bruno+Ace", + "const": "Bruno Ace" + }, + { + "title": "Bruno Ace SC", + "markdownDescription": "https://fonts.google.com/specimen/Bruno+Ace+SC", + "const": "Bruno Ace SC" + }, + { + "title": "Brygada 1918", + "markdownDescription": "https://fonts.google.com/specimen/Brygada+1918", + "const": "Brygada 1918" + }, + { + "title": "Bubblegum Sans", + "markdownDescription": "https://fonts.google.com/specimen/Bubblegum+Sans", + "const": "Bubblegum Sans" + }, + { + "title": "Bubbler One", + "markdownDescription": "https://fonts.google.com/specimen/Bubbler+One", + "const": "Bubbler One" + }, + { + "title": "Buda", + "markdownDescription": "https://fonts.google.com/specimen/Buda", + "const": "Buda" + }, + { + "title": "Buenard", + "markdownDescription": "https://fonts.google.com/specimen/Buenard", + "const": "Buenard" + }, + { + "title": "Bungee", + "markdownDescription": "https://fonts.google.com/specimen/Bungee", + "const": "Bungee" + }, + { + "title": "Bungee Hairline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Hairline", + "const": "Bungee Hairline" + }, + { + "title": "Bungee Inline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Inline", + "const": "Bungee Inline" + }, + { + "title": "Bungee Outline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Outline", + "const": "Bungee Outline" + }, + { + "title": "Bungee Shade", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Shade", + "const": "Bungee Shade" + }, + { + "title": "Bungee Spice", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Spice", + "const": "Bungee Spice" + }, + { + "title": "Butcherman", + "markdownDescription": "https://fonts.google.com/specimen/Butcherman", + "const": "Butcherman" + }, + { + "title": "Butterfly Kids", + "markdownDescription": "https://fonts.google.com/specimen/Butterfly+Kids", + "const": "Butterfly Kids" + }, + { + "title": "Cabin", + "markdownDescription": "https://fonts.google.com/specimen/Cabin", + "const": "Cabin" + }, + { + "title": "Cabin Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Cabin+Condensed", + "const": "Cabin Condensed" + }, + { + "title": "Cabin Sketch", + "markdownDescription": "https://fonts.google.com/specimen/Cabin+Sketch", + "const": "Cabin Sketch" + }, + { + "title": "Caesar Dressing", + "markdownDescription": "https://fonts.google.com/specimen/Caesar+Dressing", + "const": "Caesar Dressing" + }, + { + "title": "Cagliostro", + "markdownDescription": "https://fonts.google.com/specimen/Cagliostro", + "const": "Cagliostro" + }, + { + "title": "Cairo", + "markdownDescription": "https://fonts.google.com/specimen/Cairo", + "const": "Cairo" + }, + { + "title": "Cairo Play", + "markdownDescription": "https://fonts.google.com/specimen/Cairo+Play", + "const": "Cairo Play" + }, + { + "title": "Caladea", + "markdownDescription": "https://fonts.google.com/specimen/Caladea", + "const": "Caladea" + }, + { + "title": "Calistoga", + "markdownDescription": "https://fonts.google.com/specimen/Calistoga", + "const": "Calistoga" + }, + { + "title": "Calligraffitti", + "markdownDescription": "https://fonts.google.com/specimen/Calligraffitti", + "const": "Calligraffitti" + }, + { + "title": "Cambay", + "markdownDescription": "https://fonts.google.com/specimen/Cambay", + "const": "Cambay" + }, + { + "title": "Cambo", + "markdownDescription": "https://fonts.google.com/specimen/Cambo", + "const": "Cambo" + }, + { + "title": "Candal", + "markdownDescription": "https://fonts.google.com/specimen/Candal", + "const": "Candal" + }, + { + "title": "Cantarell", + "markdownDescription": "https://fonts.google.com/specimen/Cantarell", + "const": "Cantarell" + }, + { + "title": "Cantata One", + "markdownDescription": "https://fonts.google.com/specimen/Cantata+One", + "const": "Cantata One" + }, + { + "title": "Cantora One", + "markdownDescription": "https://fonts.google.com/specimen/Cantora+One", + "const": "Cantora One" + }, + { + "title": "Caprasimo", + "markdownDescription": "https://fonts.google.com/specimen/Caprasimo", + "const": "Caprasimo" + }, + { + "title": "Capriola", + "markdownDescription": "https://fonts.google.com/specimen/Capriola", + "const": "Capriola" + }, + { + "title": "Caramel", + "markdownDescription": "https://fonts.google.com/specimen/Caramel", + "const": "Caramel" + }, + { + "title": "Carattere", + "markdownDescription": "https://fonts.google.com/specimen/Carattere", + "const": "Carattere" + }, + { + "title": "Cardo", + "markdownDescription": "https://fonts.google.com/specimen/Cardo", + "const": "Cardo" + }, + { + "title": "Carlito", + "markdownDescription": "https://fonts.google.com/specimen/Carlito", + "const": "Carlito" + }, + { + "title": "Carme", + "markdownDescription": "https://fonts.google.com/specimen/Carme", + "const": "Carme" + }, + { + "title": "Carrois Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Carrois+Gothic", + "const": "Carrois Gothic" + }, + { + "title": "Carrois Gothic SC", + "markdownDescription": "https://fonts.google.com/specimen/Carrois+Gothic+SC", + "const": "Carrois Gothic SC" + }, + { + "title": "Carter One", + "markdownDescription": "https://fonts.google.com/specimen/Carter+One", + "const": "Carter One" + }, + { + "title": "Castoro", + "markdownDescription": "https://fonts.google.com/specimen/Castoro", + "const": "Castoro" + }, + { + "title": "Castoro Titling", + "markdownDescription": "https://fonts.google.com/specimen/Castoro+Titling", + "const": "Castoro Titling" + }, + { + "title": "Catamaran", + "markdownDescription": "https://fonts.google.com/specimen/Catamaran", + "const": "Catamaran" + }, + { + "title": "Caudex", + "markdownDescription": "https://fonts.google.com/specimen/Caudex", + "const": "Caudex" + }, + { + "title": "Caveat", + "markdownDescription": "https://fonts.google.com/specimen/Caveat", + "const": "Caveat" + }, + { + "title": "Caveat Brush", + "markdownDescription": "https://fonts.google.com/specimen/Caveat+Brush", + "const": "Caveat Brush" + }, + { + "title": "Cedarville Cursive", + "markdownDescription": "https://fonts.google.com/specimen/Cedarville+Cursive", + "const": "Cedarville Cursive" + }, + { + "title": "Ceviche One", + "markdownDescription": "https://fonts.google.com/specimen/Ceviche+One", + "const": "Ceviche One" + }, + { + "title": "Chakra Petch", + "markdownDescription": "https://fonts.google.com/specimen/Chakra+Petch", + "const": "Chakra Petch" + }, + { + "title": "Changa", + "markdownDescription": "https://fonts.google.com/specimen/Changa", + "const": "Changa" + }, + { + "title": "Changa One", + "markdownDescription": "https://fonts.google.com/specimen/Changa+One", + "const": "Changa One" + }, + { + "title": "Chango", + "markdownDescription": "https://fonts.google.com/specimen/Chango", + "const": "Chango" + }, + { + "title": "Charis SIL", + "markdownDescription": "https://fonts.google.com/specimen/Charis+SIL", + "const": "Charis SIL" + }, + { + "title": "Charm", + "markdownDescription": "https://fonts.google.com/specimen/Charm", + "const": "Charm" + }, + { + "title": "Charmonman", + "markdownDescription": "https://fonts.google.com/specimen/Charmonman", + "const": "Charmonman" + }, + { + "title": "Chathura", + "markdownDescription": "https://fonts.google.com/specimen/Chathura", + "const": "Chathura" + }, + { + "title": "Chau Philomene One", + "markdownDescription": "https://fonts.google.com/specimen/Chau+Philomene+One", + "const": "Chau Philomene One" + }, + { + "title": "Chela One", + "markdownDescription": "https://fonts.google.com/specimen/Chela+One", + "const": "Chela One" + }, + { + "title": "Chelsea Market", + "markdownDescription": "https://fonts.google.com/specimen/Chelsea+Market", + "const": "Chelsea Market" + }, + { + "title": "Chenla", + "markdownDescription": "https://fonts.google.com/specimen/Chenla", + "const": "Chenla" + }, + { + "title": "Cherish", + "markdownDescription": "https://fonts.google.com/specimen/Cherish", + "const": "Cherish" + }, + { + "title": "Cherry Bomb One", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Bomb+One", + "const": "Cherry Bomb One" + }, + { + "title": "Cherry Cream Soda", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Cream+Soda", + "const": "Cherry Cream Soda" + }, + { + "title": "Cherry Swash", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Swash", + "const": "Cherry Swash" + }, + { + "title": "Chewy", + "markdownDescription": "https://fonts.google.com/specimen/Chewy", + "const": "Chewy" + }, + { + "title": "Chicle", + "markdownDescription": "https://fonts.google.com/specimen/Chicle", + "const": "Chicle" + }, + { + "title": "Chilanka", + "markdownDescription": "https://fonts.google.com/specimen/Chilanka", + "const": "Chilanka" + }, + { + "title": "Chivo", + "markdownDescription": "https://fonts.google.com/specimen/Chivo", + "const": "Chivo" + }, + { + "title": "Chivo Mono", + "markdownDescription": "https://fonts.google.com/specimen/Chivo+Mono", + "const": "Chivo Mono" + }, + { + "title": "Chokokutai", + "markdownDescription": "https://fonts.google.com/specimen/Chokokutai", + "const": "Chokokutai" + }, + { + "title": "Chonburi", + "markdownDescription": "https://fonts.google.com/specimen/Chonburi", + "const": "Chonburi" + }, + { + "title": "Cinzel", + "markdownDescription": "https://fonts.google.com/specimen/Cinzel", + "const": "Cinzel" + }, + { + "title": "Cinzel Decorative", + "markdownDescription": "https://fonts.google.com/specimen/Cinzel+Decorative", + "const": "Cinzel Decorative" + }, + { + "title": "Clicker Script", + "markdownDescription": "https://fonts.google.com/specimen/Clicker+Script", + "const": "Clicker Script" + }, + { + "title": "Climate Crisis", + "markdownDescription": "https://fonts.google.com/specimen/Climate+Crisis", + "const": "Climate Crisis" + }, + { + "title": "Coda", + "markdownDescription": "https://fonts.google.com/specimen/Coda", + "const": "Coda" + }, + { + "title": "Coda Caption", + "markdownDescription": "https://fonts.google.com/specimen/Coda+Caption", + "const": "Coda Caption" + }, + { + "title": "Codystar", + "markdownDescription": "https://fonts.google.com/specimen/Codystar", + "const": "Codystar" + }, + { + "title": "Coiny", + "markdownDescription": "https://fonts.google.com/specimen/Coiny", + "const": "Coiny" + }, + { + "title": "Combo", + "markdownDescription": "https://fonts.google.com/specimen/Combo", + "const": "Combo" + }, + { + "title": "Comfortaa", + "markdownDescription": "https://fonts.google.com/specimen/Comfortaa", + "const": "Comfortaa" + }, + { + "title": "Comforter", + "markdownDescription": "https://fonts.google.com/specimen/Comforter", + "const": "Comforter" + }, + { + "title": "Comforter Brush", + "markdownDescription": "https://fonts.google.com/specimen/Comforter+Brush", + "const": "Comforter Brush" + }, + { + "title": "Comic Neue", + "markdownDescription": "https://fonts.google.com/specimen/Comic+Neue", + "const": "Comic Neue" + }, + { + "title": "Coming Soon", + "markdownDescription": "https://fonts.google.com/specimen/Coming+Soon", + "const": "Coming Soon" + }, + { + "title": "Comme", + "markdownDescription": "https://fonts.google.com/specimen/Comme", + "const": "Comme" + }, + { + "title": "Commissioner", + "markdownDescription": "https://fonts.google.com/specimen/Commissioner", + "const": "Commissioner" + }, + { + "title": "Concert One", + "markdownDescription": "https://fonts.google.com/specimen/Concert+One", + "const": "Concert One" + }, + { + "title": "Condiment", + "markdownDescription": "https://fonts.google.com/specimen/Condiment", + "const": "Condiment" + }, + { + "title": "Content", + "markdownDescription": "https://fonts.google.com/specimen/Content", + "const": "Content" + }, + { + "title": "Contrail One", + "markdownDescription": "https://fonts.google.com/specimen/Contrail+One", + "const": "Contrail One" + }, + { + "title": "Convergence", + "markdownDescription": "https://fonts.google.com/specimen/Convergence", + "const": "Convergence" + }, + { + "title": "Cookie", + "markdownDescription": "https://fonts.google.com/specimen/Cookie", + "const": "Cookie" + }, + { + "title": "Copse", + "markdownDescription": "https://fonts.google.com/specimen/Copse", + "const": "Copse" + }, + { + "title": "Corben", + "markdownDescription": "https://fonts.google.com/specimen/Corben", + "const": "Corben" + }, + { + "title": "Corinthia", + "markdownDescription": "https://fonts.google.com/specimen/Corinthia", + "const": "Corinthia" + }, + { + "title": "Cormorant", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant", + "const": "Cormorant" + }, + { + "title": "Cormorant Garamond", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Garamond", + "const": "Cormorant Garamond" + }, + { + "title": "Cormorant Infant", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Infant", + "const": "Cormorant Infant" + }, + { + "title": "Cormorant SC", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+SC", + "const": "Cormorant SC" + }, + { + "title": "Cormorant Unicase", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Unicase", + "const": "Cormorant Unicase" + }, + { + "title": "Cormorant Upright", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Upright", + "const": "Cormorant Upright" + }, + { + "title": "Courgette", + "markdownDescription": "https://fonts.google.com/specimen/Courgette", + "const": "Courgette" + }, + { + "title": "Courier Prime", + "markdownDescription": "https://fonts.google.com/specimen/Courier+Prime", + "const": "Courier Prime" + }, + { + "title": "Cousine", + "markdownDescription": "https://fonts.google.com/specimen/Cousine", + "const": "Cousine" + }, + { + "title": "Coustard", + "markdownDescription": "https://fonts.google.com/specimen/Coustard", + "const": "Coustard" + }, + { + "title": "Covered By Your Grace", + "markdownDescription": "https://fonts.google.com/specimen/Covered+By+Your+Grace", + "const": "Covered By Your Grace" + }, + { + "title": "Crafty Girls", + "markdownDescription": "https://fonts.google.com/specimen/Crafty+Girls", + "const": "Crafty Girls" + }, + { + "title": "Creepster", + "markdownDescription": "https://fonts.google.com/specimen/Creepster", + "const": "Creepster" + }, + { + "title": "Crete Round", + "markdownDescription": "https://fonts.google.com/specimen/Crete+Round", + "const": "Crete Round" + }, + { + "title": "Crimson Pro", + "markdownDescription": "https://fonts.google.com/specimen/Crimson+Pro", + "const": "Crimson Pro" + }, + { + "title": "Crimson Text", + "markdownDescription": "https://fonts.google.com/specimen/Crimson+Text", + "const": "Crimson Text" + }, + { + "title": "Croissant One", + "markdownDescription": "https://fonts.google.com/specimen/Croissant+One", + "const": "Croissant One" + }, + { + "title": "Crushed", + "markdownDescription": "https://fonts.google.com/specimen/Crushed", + "const": "Crushed" + }, + { + "title": "Cuprum", + "markdownDescription": "https://fonts.google.com/specimen/Cuprum", + "const": "Cuprum" + }, + { + "title": "Cute Font", + "markdownDescription": "https://fonts.google.com/specimen/Cute+Font", + "const": "Cute Font" + }, + { + "title": "Cutive", + "markdownDescription": "https://fonts.google.com/specimen/Cutive", + "const": "Cutive" + }, + { + "title": "Cutive Mono", + "markdownDescription": "https://fonts.google.com/specimen/Cutive+Mono", + "const": "Cutive Mono" + }, + { + "title": "DM Mono", + "markdownDescription": "https://fonts.google.com/specimen/DM+Mono", + "const": "DM Mono" + }, + { + "title": "DM Sans", + "markdownDescription": "https://fonts.google.com/specimen/DM+Sans", + "const": "DM Sans" + }, + { + "title": "DM Serif Display", + "markdownDescription": "https://fonts.google.com/specimen/DM+Serif+Display", + "const": "DM Serif Display" + }, + { + "title": "DM Serif Text", + "markdownDescription": "https://fonts.google.com/specimen/DM+Serif+Text", + "const": "DM Serif Text" + }, + { + "title": "Dai Banna SIL", + "markdownDescription": "https://fonts.google.com/specimen/Dai+Banna+SIL", + "const": "Dai Banna SIL" + }, + { + "title": "Damion", + "markdownDescription": "https://fonts.google.com/specimen/Damion", + "const": "Damion" + }, + { + "title": "Dancing Script", + "markdownDescription": "https://fonts.google.com/specimen/Dancing+Script", + "const": "Dancing Script" + }, + { + "title": "Dangrek", + "markdownDescription": "https://fonts.google.com/specimen/Dangrek", + "const": "Dangrek" + }, + { + "title": "Darker Grotesque", + "markdownDescription": "https://fonts.google.com/specimen/Darker+Grotesque", + "const": "Darker Grotesque" + }, + { + "title": "Darumadrop One", + "markdownDescription": "https://fonts.google.com/specimen/Darumadrop+One", + "const": "Darumadrop One" + }, + { + "title": "David Libre", + "markdownDescription": "https://fonts.google.com/specimen/David+Libre", + "const": "David Libre" + }, + { + "title": "Dawning of a New Day", + "markdownDescription": "https://fonts.google.com/specimen/Dawning+of+a+New+Day", + "const": "Dawning of a New Day" + }, + { + "title": "Days One", + "markdownDescription": "https://fonts.google.com/specimen/Days+One", + "const": "Days One" + }, + { + "title": "Dekko", + "markdownDescription": "https://fonts.google.com/specimen/Dekko", + "const": "Dekko" + }, + { + "title": "Dela Gothic One", + "markdownDescription": "https://fonts.google.com/specimen/Dela+Gothic+One", + "const": "Dela Gothic One" + }, + { + "title": "Delicious Handrawn", + "markdownDescription": "https://fonts.google.com/specimen/Delicious+Handrawn", + "const": "Delicious Handrawn" + }, + { + "title": "Delius", + "markdownDescription": "https://fonts.google.com/specimen/Delius", + "const": "Delius" + }, + { + "title": "Delius Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Delius+Swash+Caps", + "const": "Delius Swash Caps" + }, + { + "title": "Delius Unicase", + "markdownDescription": "https://fonts.google.com/specimen/Delius+Unicase", + "const": "Delius Unicase" + }, + { + "title": "Della Respira", + "markdownDescription": "https://fonts.google.com/specimen/Della+Respira", + "const": "Della Respira" + }, + { + "title": "Denk One", + "markdownDescription": "https://fonts.google.com/specimen/Denk+One", + "const": "Denk One" + }, + { + "title": "Devonshire", + "markdownDescription": "https://fonts.google.com/specimen/Devonshire", + "const": "Devonshire" + }, + { + "title": "Dhurjati", + "markdownDescription": "https://fonts.google.com/specimen/Dhurjati", + "const": "Dhurjati" + }, + { + "title": "Didact Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Didact+Gothic", + "const": "Didact Gothic" + }, + { + "title": "Diphylleia", + "markdownDescription": "https://fonts.google.com/specimen/Diphylleia", + "const": "Diphylleia" + }, + { + "title": "Diplomata", + "markdownDescription": "https://fonts.google.com/specimen/Diplomata", + "const": "Diplomata" + }, + { + "title": "Diplomata SC", + "markdownDescription": "https://fonts.google.com/specimen/Diplomata+SC", + "const": "Diplomata SC" + }, + { + "title": "Do Hyeon", + "markdownDescription": "https://fonts.google.com/specimen/Do+Hyeon", + "const": "Do Hyeon" + }, + { + "title": "Dokdo", + "markdownDescription": "https://fonts.google.com/specimen/Dokdo", + "const": "Dokdo" + }, + { + "title": "Domine", + "markdownDescription": "https://fonts.google.com/specimen/Domine", + "const": "Domine" + }, + { + "title": "Donegal One", + "markdownDescription": "https://fonts.google.com/specimen/Donegal+One", + "const": "Donegal One" + }, + { + "title": "Dongle", + "markdownDescription": "https://fonts.google.com/specimen/Dongle", + "const": "Dongle" + }, + { + "title": "Doppio One", + "markdownDescription": "https://fonts.google.com/specimen/Doppio+One", + "const": "Doppio One" + }, + { + "title": "Dorsa", + "markdownDescription": "https://fonts.google.com/specimen/Dorsa", + "const": "Dorsa" + }, + { + "title": "Dosis", + "markdownDescription": "https://fonts.google.com/specimen/Dosis", + "const": "Dosis" + }, + { + "title": "DotGothic16", + "markdownDescription": "https://fonts.google.com/specimen/DotGothic16", + "const": "DotGothic16" + }, + { + "title": "Dr Sugiyama", + "markdownDescription": "https://fonts.google.com/specimen/Dr+Sugiyama", + "const": "Dr Sugiyama" + }, + { + "title": "Duru Sans", + "markdownDescription": "https://fonts.google.com/specimen/Duru+Sans", + "const": "Duru Sans" + }, + { + "title": "DynaPuff", + "markdownDescription": "https://fonts.google.com/specimen/DynaPuff", + "const": "DynaPuff" + }, + { + "title": "Dynalight", + "markdownDescription": "https://fonts.google.com/specimen/Dynalight", + "const": "Dynalight" + }, + { + "title": "EB Garamond", + "markdownDescription": "https://fonts.google.com/specimen/EB+Garamond", + "const": "EB Garamond" + }, + { + "title": "Eagle Lake", + "markdownDescription": "https://fonts.google.com/specimen/Eagle+Lake", + "const": "Eagle Lake" + }, + { + "title": "East Sea Dokdo", + "markdownDescription": "https://fonts.google.com/specimen/East+Sea+Dokdo", + "const": "East Sea Dokdo" + }, + { + "title": "Eater", + "markdownDescription": "https://fonts.google.com/specimen/Eater", + "const": "Eater" + }, + { + "title": "Economica", + "markdownDescription": "https://fonts.google.com/specimen/Economica", + "const": "Economica" + }, + { + "title": "Eczar", + "markdownDescription": "https://fonts.google.com/specimen/Eczar", + "const": "Eczar" + }, + { + "title": "Edu NSW ACT Foundation", + "markdownDescription": "https://fonts.google.com/specimen/Edu+NSW+ACT+Foundation", + "const": "Edu NSW ACT Foundation" + }, + { + "title": "Edu QLD Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+QLD+Beginner", + "const": "Edu QLD Beginner" + }, + { + "title": "Edu SA Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+SA+Beginner", + "const": "Edu SA Beginner" + }, + { + "title": "Edu TAS Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+TAS+Beginner", + "const": "Edu TAS Beginner" + }, + { + "title": "Edu VIC WA NT Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+VIC+WA+NT+Beginner", + "const": "Edu VIC WA NT Beginner" + }, + { + "title": "El Messiri", + "markdownDescription": "https://fonts.google.com/specimen/El+Messiri", + "const": "El Messiri" + }, + { + "title": "Electrolize", + "markdownDescription": "https://fonts.google.com/specimen/Electrolize", + "const": "Electrolize" + }, + { + "title": "Elsie", + "markdownDescription": "https://fonts.google.com/specimen/Elsie", + "const": "Elsie" + }, + { + "title": "Elsie Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Elsie+Swash+Caps", + "const": "Elsie Swash Caps" + }, + { + "title": "Emblema One", + "markdownDescription": "https://fonts.google.com/specimen/Emblema+One", + "const": "Emblema One" + }, + { + "title": "Emilys Candy", + "markdownDescription": "https://fonts.google.com/specimen/Emilys+Candy", + "const": "Emilys Candy" + }, + { + "title": "Encode Sans", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans", + "const": "Encode Sans" + }, + { + "title": "Encode Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Condensed", + "const": "Encode Sans Condensed" + }, + { + "title": "Encode Sans Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Expanded", + "const": "Encode Sans Expanded" + }, + { + "title": "Encode Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+SC", + "const": "Encode Sans SC" + }, + { + "title": "Encode Sans Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Semi+Condensed", + "const": "Encode Sans Semi Condensed" + }, + { + "title": "Encode Sans Semi Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Semi+Expanded", + "const": "Encode Sans Semi Expanded" + }, + { + "title": "Engagement", + "markdownDescription": "https://fonts.google.com/specimen/Engagement", + "const": "Engagement" + }, + { + "title": "Englebert", + "markdownDescription": "https://fonts.google.com/specimen/Englebert", + "const": "Englebert" + }, + { + "title": "Enriqueta", + "markdownDescription": "https://fonts.google.com/specimen/Enriqueta", + "const": "Enriqueta" + }, + { + "title": "Ephesis", + "markdownDescription": "https://fonts.google.com/specimen/Ephesis", + "const": "Ephesis" + }, + { + "title": "Epilogue", + "markdownDescription": "https://fonts.google.com/specimen/Epilogue", + "const": "Epilogue" + }, + { + "title": "Erica One", + "markdownDescription": "https://fonts.google.com/specimen/Erica+One", + "const": "Erica One" + }, + { + "title": "Esteban", + "markdownDescription": "https://fonts.google.com/specimen/Esteban", + "const": "Esteban" + }, + { + "title": "Estonia", + "markdownDescription": "https://fonts.google.com/specimen/Estonia", + "const": "Estonia" + }, + { + "title": "Euphoria Script", + "markdownDescription": "https://fonts.google.com/specimen/Euphoria+Script", + "const": "Euphoria Script" + }, + { + "title": "Ewert", + "markdownDescription": "https://fonts.google.com/specimen/Ewert", + "const": "Ewert" + }, + { + "title": "Exo", + "markdownDescription": "https://fonts.google.com/specimen/Exo", + "const": "Exo" + }, + { + "title": "Exo 2", + "markdownDescription": "https://fonts.google.com/specimen/Exo+2", + "const": "Exo 2" + }, + { + "title": "Expletus Sans", + "markdownDescription": "https://fonts.google.com/specimen/Expletus+Sans", + "const": "Expletus Sans" + }, + { + "title": "Explora", + "markdownDescription": "https://fonts.google.com/specimen/Explora", + "const": "Explora" + }, + { + "title": "Fahkwang", + "markdownDescription": "https://fonts.google.com/specimen/Fahkwang", + "const": "Fahkwang" + }, + { + "title": "Familjen Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Familjen+Grotesk", + "const": "Familjen Grotesk" + }, + { + "title": "Fanwood Text", + "markdownDescription": "https://fonts.google.com/specimen/Fanwood+Text", + "const": "Fanwood Text" + }, + { + "title": "Farro", + "markdownDescription": "https://fonts.google.com/specimen/Farro", + "const": "Farro" + }, + { + "title": "Farsan", + "markdownDescription": "https://fonts.google.com/specimen/Farsan", + "const": "Farsan" + }, + { + "title": "Fascinate", + "markdownDescription": "https://fonts.google.com/specimen/Fascinate", + "const": "Fascinate" + }, + { + "title": "Fascinate Inline", + "markdownDescription": "https://fonts.google.com/specimen/Fascinate+Inline", + "const": "Fascinate Inline" + }, + { + "title": "Faster One", + "markdownDescription": "https://fonts.google.com/specimen/Faster+One", + "const": "Faster One" + }, + { + "title": "Fasthand", + "markdownDescription": "https://fonts.google.com/specimen/Fasthand", + "const": "Fasthand" + }, + { + "title": "Fauna One", + "markdownDescription": "https://fonts.google.com/specimen/Fauna+One", + "const": "Fauna One" + }, + { + "title": "Faustina", + "markdownDescription": "https://fonts.google.com/specimen/Faustina", + "const": "Faustina" + }, + { + "title": "Federant", + "markdownDescription": "https://fonts.google.com/specimen/Federant", + "const": "Federant" + }, + { + "title": "Federo", + "markdownDescription": "https://fonts.google.com/specimen/Federo", + "const": "Federo" + }, + { + "title": "Felipa", + "markdownDescription": "https://fonts.google.com/specimen/Felipa", + "const": "Felipa" + }, + { + "title": "Fenix", + "markdownDescription": "https://fonts.google.com/specimen/Fenix", + "const": "Fenix" + }, + { + "title": "Festive", + "markdownDescription": "https://fonts.google.com/specimen/Festive", + "const": "Festive" + }, + { + "title": "Figtree", + "markdownDescription": "https://fonts.google.com/specimen/Figtree", + "const": "Figtree" + }, + { + "title": "Finger Paint", + "markdownDescription": "https://fonts.google.com/specimen/Finger+Paint", + "const": "Finger Paint" + }, + { + "title": "Finlandica", + "markdownDescription": "https://fonts.google.com/specimen/Finlandica", + "const": "Finlandica" + }, + { + "title": "Fira Code", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Code", + "const": "Fira Code" + }, + { + "title": "Fira Mono", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Mono", + "const": "Fira Mono" + }, + { + "title": "Fira Sans", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans", + "const": "Fira Sans" + }, + { + "title": "Fira Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans+Condensed", + "const": "Fira Sans Condensed" + }, + { + "title": "Fira Sans Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans+Extra+Condensed", + "const": "Fira Sans Extra Condensed" + }, + { + "title": "Fjalla One", + "markdownDescription": "https://fonts.google.com/specimen/Fjalla+One", + "const": "Fjalla One" + }, + { + "title": "Fjord One", + "markdownDescription": "https://fonts.google.com/specimen/Fjord+One", + "const": "Fjord One" + }, + { + "title": "Flamenco", + "markdownDescription": "https://fonts.google.com/specimen/Flamenco", + "const": "Flamenco" + }, + { + "title": "Flavors", + "markdownDescription": "https://fonts.google.com/specimen/Flavors", + "const": "Flavors" + }, + { + "title": "Fleur De Leah", + "markdownDescription": "https://fonts.google.com/specimen/Fleur+De+Leah", + "const": "Fleur De Leah" + }, + { + "title": "Flow Block", + "markdownDescription": "https://fonts.google.com/specimen/Flow+Block", + "const": "Flow Block" + }, + { + "title": "Flow Circular", + "markdownDescription": "https://fonts.google.com/specimen/Flow+Circular", + "const": "Flow Circular" + }, + { + "title": "Flow Rounded", + "markdownDescription": "https://fonts.google.com/specimen/Flow+Rounded", + "const": "Flow Rounded" + }, + { + "title": "Foldit", + "markdownDescription": "https://fonts.google.com/specimen/Foldit", + "const": "Foldit" + }, + { + "title": "Fondamento", + "markdownDescription": "https://fonts.google.com/specimen/Fondamento", + "const": "Fondamento" + }, + { + "title": "Fontdiner Swanky", + "markdownDescription": "https://fonts.google.com/specimen/Fontdiner+Swanky", + "const": "Fontdiner Swanky" + }, + { + "title": "Forum", + "markdownDescription": "https://fonts.google.com/specimen/Forum", + "const": "Forum" + }, + { + "title": "Fragment Mono", + "markdownDescription": "https://fonts.google.com/specimen/Fragment+Mono", + "const": "Fragment Mono" + }, + { + "title": "Francois One", + "markdownDescription": "https://fonts.google.com/specimen/Francois+One", + "const": "Francois One" + }, + { + "title": "Frank Ruhl Libre", + "markdownDescription": "https://fonts.google.com/specimen/Frank+Ruhl+Libre", + "const": "Frank Ruhl Libre" + }, + { + "title": "Fraunces", + "markdownDescription": "https://fonts.google.com/specimen/Fraunces", + "const": "Fraunces" + }, + { + "title": "Freckle Face", + "markdownDescription": "https://fonts.google.com/specimen/Freckle+Face", + "const": "Freckle Face" + }, + { + "title": "Fredericka the Great", + "markdownDescription": "https://fonts.google.com/specimen/Fredericka+the+Great", + "const": "Fredericka the Great" + }, + { + "title": "Fredoka", + "markdownDescription": "https://fonts.google.com/specimen/Fredoka", + "const": "Fredoka" + }, + { + "title": "Freehand", + "markdownDescription": "https://fonts.google.com/specimen/Freehand", + "const": "Freehand" + }, + { + "title": "Fresca", + "markdownDescription": "https://fonts.google.com/specimen/Fresca", + "const": "Fresca" + }, + { + "title": "Frijole", + "markdownDescription": "https://fonts.google.com/specimen/Frijole", + "const": "Frijole" + }, + { + "title": "Fruktur", + "markdownDescription": "https://fonts.google.com/specimen/Fruktur", + "const": "Fruktur" + }, + { + "title": "Fugaz One", + "markdownDescription": "https://fonts.google.com/specimen/Fugaz+One", + "const": "Fugaz One" + }, + { + "title": "Fuggles", + "markdownDescription": "https://fonts.google.com/specimen/Fuggles", + "const": "Fuggles" + }, + { + "title": "Fuzzy Bubbles", + "markdownDescription": "https://fonts.google.com/specimen/Fuzzy+Bubbles", + "const": "Fuzzy Bubbles" + }, + { + "title": "GFS Didot", + "markdownDescription": "https://fonts.google.com/specimen/GFS+Didot", + "const": "GFS Didot" + }, + { + "title": "GFS Neohellenic", + "markdownDescription": "https://fonts.google.com/specimen/GFS+Neohellenic", + "const": "GFS Neohellenic" + }, + { + "title": "Gabarito", + "markdownDescription": "https://fonts.google.com/specimen/Gabarito", + "const": "Gabarito" + }, + { + "title": "Gabriela", + "markdownDescription": "https://fonts.google.com/specimen/Gabriela", + "const": "Gabriela" + }, + { + "title": "Gaegu", + "markdownDescription": "https://fonts.google.com/specimen/Gaegu", + "const": "Gaegu" + }, + { + "title": "Gafata", + "markdownDescription": "https://fonts.google.com/specimen/Gafata", + "const": "Gafata" + }, + { + "title": "Gajraj One", + "markdownDescription": "https://fonts.google.com/specimen/Gajraj+One", + "const": "Gajraj One" + }, + { + "title": "Galada", + "markdownDescription": "https://fonts.google.com/specimen/Galada", + "const": "Galada" + }, + { + "title": "Galdeano", + "markdownDescription": "https://fonts.google.com/specimen/Galdeano", + "const": "Galdeano" + }, + { + "title": "Galindo", + "markdownDescription": "https://fonts.google.com/specimen/Galindo", + "const": "Galindo" + }, + { + "title": "Gamja Flower", + "markdownDescription": "https://fonts.google.com/specimen/Gamja+Flower", + "const": "Gamja Flower" + }, + { + "title": "Gantari", + "markdownDescription": "https://fonts.google.com/specimen/Gantari", + "const": "Gantari" + }, + { + "title": "Gasoek One", + "markdownDescription": "https://fonts.google.com/specimen/Gasoek+One", + "const": "Gasoek One" + }, + { + "title": "Gayathri", + "markdownDescription": "https://fonts.google.com/specimen/Gayathri", + "const": "Gayathri" + }, + { + "title": "Gelasio", + "markdownDescription": "https://fonts.google.com/specimen/Gelasio", + "const": "Gelasio" + }, + { + "title": "Gemunu Libre", + "markdownDescription": "https://fonts.google.com/specimen/Gemunu+Libre", + "const": "Gemunu Libre" + }, + { + "title": "Genos", + "markdownDescription": "https://fonts.google.com/specimen/Genos", + "const": "Genos" + }, + { + "title": "Gentium Book Plus", + "markdownDescription": "https://fonts.google.com/specimen/Gentium+Book+Plus", + "const": "Gentium Book Plus" + }, + { + "title": "Gentium Plus", + "markdownDescription": "https://fonts.google.com/specimen/Gentium+Plus", + "const": "Gentium Plus" + }, + { + "title": "Geo", + "markdownDescription": "https://fonts.google.com/specimen/Geo", + "const": "Geo" + }, + { + "title": "Geologica", + "markdownDescription": "https://fonts.google.com/specimen/Geologica", + "const": "Geologica" + }, + { + "title": "Georama", + "markdownDescription": "https://fonts.google.com/specimen/Georama", + "const": "Georama" + }, + { + "title": "Geostar", + "markdownDescription": "https://fonts.google.com/specimen/Geostar", + "const": "Geostar" + }, + { + "title": "Geostar Fill", + "markdownDescription": "https://fonts.google.com/specimen/Geostar+Fill", + "const": "Geostar Fill" + }, + { + "title": "Germania One", + "markdownDescription": "https://fonts.google.com/specimen/Germania+One", + "const": "Germania One" + }, + { + "title": "Gideon Roman", + "markdownDescription": "https://fonts.google.com/specimen/Gideon+Roman", + "const": "Gideon Roman" + }, + { + "title": "Gidugu", + "markdownDescription": "https://fonts.google.com/specimen/Gidugu", + "const": "Gidugu" + }, + { + "title": "Gilda Display", + "markdownDescription": "https://fonts.google.com/specimen/Gilda+Display", + "const": "Gilda Display" + }, + { + "title": "Girassol", + "markdownDescription": "https://fonts.google.com/specimen/Girassol", + "const": "Girassol" + }, + { + "title": "Give You Glory", + "markdownDescription": "https://fonts.google.com/specimen/Give+You+Glory", + "const": "Give You Glory" + }, + { + "title": "Glass Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Glass+Antiqua", + "const": "Glass Antiqua" + }, + { + "title": "Glegoo", + "markdownDescription": "https://fonts.google.com/specimen/Glegoo", + "const": "Glegoo" + }, + { + "title": "Gloock", + "markdownDescription": "https://fonts.google.com/specimen/Gloock", + "const": "Gloock" + }, + { + "title": "Gloria Hallelujah", + "markdownDescription": "https://fonts.google.com/specimen/Gloria+Hallelujah", + "const": "Gloria Hallelujah" + }, + { + "title": "Glory", + "markdownDescription": "https://fonts.google.com/specimen/Glory", + "const": "Glory" + }, + { + "title": "Gluten", + "markdownDescription": "https://fonts.google.com/specimen/Gluten", + "const": "Gluten" + }, + { + "title": "Goblin One", + "markdownDescription": "https://fonts.google.com/specimen/Goblin+One", + "const": "Goblin One" + }, + { + "title": "Gochi Hand", + "markdownDescription": "https://fonts.google.com/specimen/Gochi+Hand", + "const": "Gochi Hand" + }, + { + "title": "Goldman", + "markdownDescription": "https://fonts.google.com/specimen/Goldman", + "const": "Goldman" + }, + { + "title": "Golos Text", + "markdownDescription": "https://fonts.google.com/specimen/Golos+Text", + "const": "Golos Text" + }, + { + "title": "Gorditas", + "markdownDescription": "https://fonts.google.com/specimen/Gorditas", + "const": "Gorditas" + }, + { + "title": "Gothic A1", + "markdownDescription": "https://fonts.google.com/specimen/Gothic+A1", + "const": "Gothic A1" + }, + { + "title": "Gotu", + "markdownDescription": "https://fonts.google.com/specimen/Gotu", + "const": "Gotu" + }, + { + "title": "Goudy Bookletter 1911", + "markdownDescription": "https://fonts.google.com/specimen/Goudy+Bookletter+1911", + "const": "Goudy Bookletter 1911" + }, + { + "title": "Gowun Batang", + "markdownDescription": "https://fonts.google.com/specimen/Gowun+Batang", + "const": "Gowun Batang" + }, + { + "title": "Gowun Dodum", + "markdownDescription": "https://fonts.google.com/specimen/Gowun+Dodum", + "const": "Gowun Dodum" + }, + { + "title": "Graduate", + "markdownDescription": "https://fonts.google.com/specimen/Graduate", + "const": "Graduate" + }, + { + "title": "Grand Hotel", + "markdownDescription": "https://fonts.google.com/specimen/Grand+Hotel", + "const": "Grand Hotel" + }, + { + "title": "Grandiflora One", + "markdownDescription": "https://fonts.google.com/specimen/Grandiflora+One", + "const": "Grandiflora One" + }, + { + "title": "Grandstander", + "markdownDescription": "https://fonts.google.com/specimen/Grandstander", + "const": "Grandstander" + }, + { + "title": "Grape Nuts", + "markdownDescription": "https://fonts.google.com/specimen/Grape+Nuts", + "const": "Grape Nuts" + }, + { + "title": "Gravitas One", + "markdownDescription": "https://fonts.google.com/specimen/Gravitas+One", + "const": "Gravitas One" + }, + { + "title": "Great Vibes", + "markdownDescription": "https://fonts.google.com/specimen/Great+Vibes", + "const": "Great Vibes" + }, + { + "title": "Grechen Fuemen", + "markdownDescription": "https://fonts.google.com/specimen/Grechen+Fuemen", + "const": "Grechen Fuemen" + }, + { + "title": "Grenze", + "markdownDescription": "https://fonts.google.com/specimen/Grenze", + "const": "Grenze" + }, + { + "title": "Grenze Gotisch", + "markdownDescription": "https://fonts.google.com/specimen/Grenze+Gotisch", + "const": "Grenze Gotisch" + }, + { + "title": "Grey Qo", + "markdownDescription": "https://fonts.google.com/specimen/Grey+Qo", + "const": "Grey Qo" + }, + { + "title": "Griffy", + "markdownDescription": "https://fonts.google.com/specimen/Griffy", + "const": "Griffy" + }, + { + "title": "Gruppo", + "markdownDescription": "https://fonts.google.com/specimen/Gruppo", + "const": "Gruppo" + }, + { + "title": "Gudea", + "markdownDescription": "https://fonts.google.com/specimen/Gudea", + "const": "Gudea" + }, + { + "title": "Gugi", + "markdownDescription": "https://fonts.google.com/specimen/Gugi", + "const": "Gugi" + }, + { + "title": "Gulzar", + "markdownDescription": "https://fonts.google.com/specimen/Gulzar", + "const": "Gulzar" + }, + { + "title": "Gupter", + "markdownDescription": "https://fonts.google.com/specimen/Gupter", + "const": "Gupter" + }, + { + "title": "Gurajada", + "markdownDescription": "https://fonts.google.com/specimen/Gurajada", + "const": "Gurajada" + }, + { + "title": "Gwendolyn", + "markdownDescription": "https://fonts.google.com/specimen/Gwendolyn", + "const": "Gwendolyn" + }, + { + "title": "Habibi", + "markdownDescription": "https://fonts.google.com/specimen/Habibi", + "const": "Habibi" + }, + { + "title": "Hachi Maru Pop", + "markdownDescription": "https://fonts.google.com/specimen/Hachi+Maru+Pop", + "const": "Hachi Maru Pop" + }, + { + "title": "Hahmlet", + "markdownDescription": "https://fonts.google.com/specimen/Hahmlet", + "const": "Hahmlet" + }, + { + "title": "Halant", + "markdownDescription": "https://fonts.google.com/specimen/Halant", + "const": "Halant" + }, + { + "title": "Hammersmith One", + "markdownDescription": "https://fonts.google.com/specimen/Hammersmith+One", + "const": "Hammersmith One" + }, + { + "title": "Hanalei", + "markdownDescription": "https://fonts.google.com/specimen/Hanalei", + "const": "Hanalei" + }, + { + "title": "Hanalei Fill", + "markdownDescription": "https://fonts.google.com/specimen/Hanalei+Fill", + "const": "Hanalei Fill" + }, + { + "title": "Handjet", + "markdownDescription": "https://fonts.google.com/specimen/Handjet", + "const": "Handjet" + }, + { + "title": "Handlee", + "markdownDescription": "https://fonts.google.com/specimen/Handlee", + "const": "Handlee" + }, + { + "title": "Hanken Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Hanken+Grotesk", + "const": "Hanken Grotesk" + }, + { + "title": "Hanuman", + "markdownDescription": "https://fonts.google.com/specimen/Hanuman", + "const": "Hanuman" + }, + { + "title": "Happy Monkey", + "markdownDescription": "https://fonts.google.com/specimen/Happy+Monkey", + "const": "Happy Monkey" + }, + { + "title": "Harmattan", + "markdownDescription": "https://fonts.google.com/specimen/Harmattan", + "const": "Harmattan" + }, + { + "title": "Headland One", + "markdownDescription": "https://fonts.google.com/specimen/Headland+One", + "const": "Headland One" + }, + { + "title": "Heebo", + "markdownDescription": "https://fonts.google.com/specimen/Heebo", + "const": "Heebo" + }, + { + "title": "Henny Penny", + "markdownDescription": "https://fonts.google.com/specimen/Henny+Penny", + "const": "Henny Penny" + }, + { + "title": "Hepta Slab", + "markdownDescription": "https://fonts.google.com/specimen/Hepta+Slab", + "const": "Hepta Slab" + }, + { + "title": "Herr Von Muellerhoff", + "markdownDescription": "https://fonts.google.com/specimen/Herr+Von+Muellerhoff", + "const": "Herr Von Muellerhoff" + }, + { + "title": "Hi Melody", + "markdownDescription": "https://fonts.google.com/specimen/Hi+Melody", + "const": "Hi Melody" + }, + { + "title": "Hina Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Hina+Mincho", + "const": "Hina Mincho" + }, + { + "title": "Hind", + "markdownDescription": "https://fonts.google.com/specimen/Hind", + "const": "Hind" + }, + { + "title": "Hind Guntur", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Guntur", + "const": "Hind Guntur" + }, + { + "title": "Hind Madurai", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Madurai", + "const": "Hind Madurai" + }, + { + "title": "Hind Siliguri", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Siliguri", + "const": "Hind Siliguri" + }, + { + "title": "Hind Vadodara", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Vadodara", + "const": "Hind Vadodara" + }, + { + "title": "Holtwood One SC", + "markdownDescription": "https://fonts.google.com/specimen/Holtwood+One+SC", + "const": "Holtwood One SC" + }, + { + "title": "Homemade Apple", + "markdownDescription": "https://fonts.google.com/specimen/Homemade+Apple", + "const": "Homemade Apple" + }, + { + "title": "Homenaje", + "markdownDescription": "https://fonts.google.com/specimen/Homenaje", + "const": "Homenaje" + }, + { + "title": "Hubballi", + "markdownDescription": "https://fonts.google.com/specimen/Hubballi", + "const": "Hubballi" + }, + { + "title": "Hurricane", + "markdownDescription": "https://fonts.google.com/specimen/Hurricane", + "const": "Hurricane" + }, + { + "title": "IBM Plex Mono", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Mono", + "const": "IBM Plex Mono" + }, + { + "title": "IBM Plex Sans", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans", + "const": "IBM Plex Sans" + }, + { + "title": "IBM Plex Sans Arabic", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Arabic", + "const": "IBM Plex Sans Arabic" + }, + { + "title": "IBM Plex Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Condensed", + "const": "IBM Plex Sans Condensed" + }, + { + "title": "IBM Plex Sans Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Devanagari", + "const": "IBM Plex Sans Devanagari" + }, + { + "title": "IBM Plex Sans Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Hebrew", + "const": "IBM Plex Sans Hebrew" + }, + { + "title": "IBM Plex Sans JP", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+JP", + "const": "IBM Plex Sans JP" + }, + { + "title": "IBM Plex Sans KR", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+KR", + "const": "IBM Plex Sans KR" + }, + { + "title": "IBM Plex Sans Thai", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Thai", + "const": "IBM Plex Sans Thai" + }, + { + "title": "IBM Plex Sans Thai Looped", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Thai+Looped", + "const": "IBM Plex Sans Thai Looped" + }, + { + "title": "IBM Plex Serif", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Serif", + "const": "IBM Plex Serif" + }, + { + "title": "IM Fell DW Pica", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+DW+Pica", + "const": "IM Fell DW Pica" + }, + { + "title": "IM Fell DW Pica SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+DW+Pica+SC", + "const": "IM Fell DW Pica SC" + }, + { + "title": "IM Fell Double Pica", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Double+Pica", + "const": "IM Fell Double Pica" + }, + { + "title": "IM Fell Double Pica SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Double+Pica+SC", + "const": "IM Fell Double Pica SC" + }, + { + "title": "IM Fell English", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+English", + "const": "IM Fell English" + }, + { + "title": "IM Fell English SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+English+SC", + "const": "IM Fell English SC" + }, + { + "title": "IM Fell French Canon", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+French+Canon", + "const": "IM Fell French Canon" + }, + { + "title": "IM Fell French Canon SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+French+Canon+SC", + "const": "IM Fell French Canon SC" + }, + { + "title": "IM Fell Great Primer", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Great+Primer", + "const": "IM Fell Great Primer" + }, + { + "title": "IM Fell Great Primer SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Great+Primer+SC", + "const": "IM Fell Great Primer SC" + }, + { + "title": "Ibarra Real Nova", + "markdownDescription": "https://fonts.google.com/specimen/Ibarra+Real+Nova", + "const": "Ibarra Real Nova" + }, + { + "title": "Iceberg", + "markdownDescription": "https://fonts.google.com/specimen/Iceberg", + "const": "Iceberg" + }, + { + "title": "Iceland", + "markdownDescription": "https://fonts.google.com/specimen/Iceland", + "const": "Iceland" + }, + { + "title": "Imbue", + "markdownDescription": "https://fonts.google.com/specimen/Imbue", + "const": "Imbue" + }, + { + "title": "Imperial Script", + "markdownDescription": "https://fonts.google.com/specimen/Imperial+Script", + "const": "Imperial Script" + }, + { + "title": "Imprima", + "markdownDescription": "https://fonts.google.com/specimen/Imprima", + "const": "Imprima" + }, + { + "title": "Inclusive Sans", + "markdownDescription": "https://fonts.google.com/specimen/Inclusive+Sans", + "const": "Inclusive Sans" + }, + { + "title": "Inconsolata", + "markdownDescription": "https://fonts.google.com/specimen/Inconsolata", + "const": "Inconsolata" + }, + { + "title": "Inder", + "markdownDescription": "https://fonts.google.com/specimen/Inder", + "const": "Inder" + }, + { + "title": "Indie Flower", + "markdownDescription": "https://fonts.google.com/specimen/Indie+Flower", + "const": "Indie Flower" + }, + { + "title": "Ingrid Darling", + "markdownDescription": "https://fonts.google.com/specimen/Ingrid+Darling", + "const": "Ingrid Darling" + }, + { + "title": "Inika", + "markdownDescription": "https://fonts.google.com/specimen/Inika", + "const": "Inika" + }, + { + "title": "Inknut Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Inknut+Antiqua", + "const": "Inknut Antiqua" + }, + { + "title": "Inria Sans", + "markdownDescription": "https://fonts.google.com/specimen/Inria+Sans", + "const": "Inria Sans" + }, + { + "title": "Inria Serif", + "markdownDescription": "https://fonts.google.com/specimen/Inria+Serif", + "const": "Inria Serif" + }, + { + "title": "Inspiration", + "markdownDescription": "https://fonts.google.com/specimen/Inspiration", + "const": "Inspiration" + }, + { + "title": "Instrument Sans", + "markdownDescription": "https://fonts.google.com/specimen/Instrument+Sans", + "const": "Instrument Sans" + }, + { + "title": "Instrument Serif", + "markdownDescription": "https://fonts.google.com/specimen/Instrument+Serif", + "const": "Instrument Serif" + }, + { + "title": "Inter", + "markdownDescription": "https://fonts.google.com/specimen/Inter", + "const": "Inter" + }, + { + "title": "Inter Tight", + "markdownDescription": "https://fonts.google.com/specimen/Inter+Tight", + "const": "Inter Tight" + }, + { + "title": "Irish Grover", + "markdownDescription": "https://fonts.google.com/specimen/Irish+Grover", + "const": "Irish Grover" + }, + { + "title": "Island Moments", + "markdownDescription": "https://fonts.google.com/specimen/Island+Moments", + "const": "Island Moments" + }, + { + "title": "Istok Web", + "markdownDescription": "https://fonts.google.com/specimen/Istok+Web", + "const": "Istok Web" + }, + { + "title": "Italiana", + "markdownDescription": "https://fonts.google.com/specimen/Italiana", + "const": "Italiana" + }, + { + "title": "Italianno", + "markdownDescription": "https://fonts.google.com/specimen/Italianno", + "const": "Italianno" + }, + { + "title": "Itim", + "markdownDescription": "https://fonts.google.com/specimen/Itim", + "const": "Itim" + }, + { + "title": "Jacques Francois", + "markdownDescription": "https://fonts.google.com/specimen/Jacques+Francois", + "const": "Jacques Francois" + }, + { + "title": "Jacques Francois Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Jacques+Francois+Shadow", + "const": "Jacques Francois Shadow" + }, + { + "title": "Jaldi", + "markdownDescription": "https://fonts.google.com/specimen/Jaldi", + "const": "Jaldi" + }, + { + "title": "JetBrains Mono", + "markdownDescription": "https://fonts.google.com/specimen/JetBrains+Mono", + "const": "JetBrains Mono" + }, + { + "title": "Jim Nightshade", + "markdownDescription": "https://fonts.google.com/specimen/Jim+Nightshade", + "const": "Jim Nightshade" + }, + { + "title": "Joan", + "markdownDescription": "https://fonts.google.com/specimen/Joan", + "const": "Joan" + }, + { + "title": "Jockey One", + "markdownDescription": "https://fonts.google.com/specimen/Jockey+One", + "const": "Jockey One" + }, + { + "title": "Jolly Lodger", + "markdownDescription": "https://fonts.google.com/specimen/Jolly+Lodger", + "const": "Jolly Lodger" + }, + { + "title": "Jomhuria", + "markdownDescription": "https://fonts.google.com/specimen/Jomhuria", + "const": "Jomhuria" + }, + { + "title": "Jomolhari", + "markdownDescription": "https://fonts.google.com/specimen/Jomolhari", + "const": "Jomolhari" + }, + { + "title": "Josefin Sans", + "markdownDescription": "https://fonts.google.com/specimen/Josefin+Sans", + "const": "Josefin Sans" + }, + { + "title": "Josefin Slab", + "markdownDescription": "https://fonts.google.com/specimen/Josefin+Slab", + "const": "Josefin Slab" + }, + { + "title": "Jost", + "markdownDescription": "https://fonts.google.com/specimen/Jost", + "const": "Jost" + }, + { + "title": "Joti One", + "markdownDescription": "https://fonts.google.com/specimen/Joti+One", + "const": "Joti One" + }, + { + "title": "Jua", + "markdownDescription": "https://fonts.google.com/specimen/Jua", + "const": "Jua" + }, + { + "title": "Judson", + "markdownDescription": "https://fonts.google.com/specimen/Judson", + "const": "Judson" + }, + { + "title": "Julee", + "markdownDescription": "https://fonts.google.com/specimen/Julee", + "const": "Julee" + }, + { + "title": "Julius Sans One", + "markdownDescription": "https://fonts.google.com/specimen/Julius+Sans+One", + "const": "Julius Sans One" + }, + { + "title": "Junge", + "markdownDescription": "https://fonts.google.com/specimen/Junge", + "const": "Junge" + }, + { + "title": "Jura", + "markdownDescription": "https://fonts.google.com/specimen/Jura", + "const": "Jura" + }, + { + "title": "Just Another Hand", + "markdownDescription": "https://fonts.google.com/specimen/Just+Another+Hand", + "const": "Just Another Hand" + }, + { + "title": "Just Me Again Down Here", + "markdownDescription": "https://fonts.google.com/specimen/Just+Me+Again+Down+Here", + "const": "Just Me Again Down Here" + }, + { + "title": "K2D", + "markdownDescription": "https://fonts.google.com/specimen/K2D", + "const": "K2D" + }, + { + "title": "Kablammo", + "markdownDescription": "https://fonts.google.com/specimen/Kablammo", + "const": "Kablammo" + }, + { + "title": "Kadwa", + "markdownDescription": "https://fonts.google.com/specimen/Kadwa", + "const": "Kadwa" + }, + { + "title": "Kaisei Decol", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+Decol", + "const": "Kaisei Decol" + }, + { + "title": "Kaisei HarunoUmi", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+HarunoUmi", + "const": "Kaisei HarunoUmi" + }, + { + "title": "Kaisei Opti", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+Opti", + "const": "Kaisei Opti" + }, + { + "title": "Kaisei Tokumin", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+Tokumin", + "const": "Kaisei Tokumin" + }, + { + "title": "Kalam", + "markdownDescription": "https://fonts.google.com/specimen/Kalam", + "const": "Kalam" + }, + { + "title": "Kameron", + "markdownDescription": "https://fonts.google.com/specimen/Kameron", + "const": "Kameron" + }, + { + "title": "Kanit", + "markdownDescription": "https://fonts.google.com/specimen/Kanit", + "const": "Kanit" + }, + { + "title": "Kantumruy Pro", + "markdownDescription": "https://fonts.google.com/specimen/Kantumruy+Pro", + "const": "Kantumruy Pro" + }, + { + "title": "Karantina", + "markdownDescription": "https://fonts.google.com/specimen/Karantina", + "const": "Karantina" + }, + { + "title": "Karla", + "markdownDescription": "https://fonts.google.com/specimen/Karla", + "const": "Karla" + }, + { + "title": "Karma", + "markdownDescription": "https://fonts.google.com/specimen/Karma", + "const": "Karma" + }, + { + "title": "Katibeh", + "markdownDescription": "https://fonts.google.com/specimen/Katibeh", + "const": "Katibeh" + }, + { + "title": "Kaushan Script", + "markdownDescription": "https://fonts.google.com/specimen/Kaushan+Script", + "const": "Kaushan Script" + }, + { + "title": "Kavivanar", + "markdownDescription": "https://fonts.google.com/specimen/Kavivanar", + "const": "Kavivanar" + }, + { + "title": "Kavoon", + "markdownDescription": "https://fonts.google.com/specimen/Kavoon", + "const": "Kavoon" + }, + { + "title": "Kdam Thmor Pro", + "markdownDescription": "https://fonts.google.com/specimen/Kdam+Thmor+Pro", + "const": "Kdam Thmor Pro" + }, + { + "title": "Keania One", + "markdownDescription": "https://fonts.google.com/specimen/Keania+One", + "const": "Keania One" + }, + { + "title": "Kelly Slab", + "markdownDescription": "https://fonts.google.com/specimen/Kelly+Slab", + "const": "Kelly Slab" + }, + { + "title": "Kenia", + "markdownDescription": "https://fonts.google.com/specimen/Kenia", + "const": "Kenia" + }, + { + "title": "Khand", + "markdownDescription": "https://fonts.google.com/specimen/Khand", + "const": "Khand" + }, + { + "title": "Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Khmer", + "const": "Khmer" + }, + { + "title": "Khula", + "markdownDescription": "https://fonts.google.com/specimen/Khula", + "const": "Khula" + }, + { + "title": "Kings", + "markdownDescription": "https://fonts.google.com/specimen/Kings", + "const": "Kings" + }, + { + "title": "Kirang Haerang", + "markdownDescription": "https://fonts.google.com/specimen/Kirang+Haerang", + "const": "Kirang Haerang" + }, + { + "title": "Kite One", + "markdownDescription": "https://fonts.google.com/specimen/Kite+One", + "const": "Kite One" + }, + { + "title": "Kiwi Maru", + "markdownDescription": "https://fonts.google.com/specimen/Kiwi+Maru", + "const": "Kiwi Maru" + }, + { + "title": "Klee One", + "markdownDescription": "https://fonts.google.com/specimen/Klee+One", + "const": "Klee One" + }, + { + "title": "Knewave", + "markdownDescription": "https://fonts.google.com/specimen/Knewave", + "const": "Knewave" + }, + { + "title": "KoHo", + "markdownDescription": "https://fonts.google.com/specimen/KoHo", + "const": "KoHo" + }, + { + "title": "Kodchasan", + "markdownDescription": "https://fonts.google.com/specimen/Kodchasan", + "const": "Kodchasan" + }, + { + "title": "Koh Santepheap", + "markdownDescription": "https://fonts.google.com/specimen/Koh+Santepheap", + "const": "Koh Santepheap" + }, + { + "title": "Kolker Brush", + "markdownDescription": "https://fonts.google.com/specimen/Kolker+Brush", + "const": "Kolker Brush" + }, + { + "title": "Konkhmer Sleokchher", + "markdownDescription": "https://fonts.google.com/specimen/Konkhmer+Sleokchher", + "const": "Konkhmer Sleokchher" + }, + { + "title": "Kosugi", + "markdownDescription": "https://fonts.google.com/specimen/Kosugi", + "const": "Kosugi" + }, + { + "title": "Kosugi Maru", + "markdownDescription": "https://fonts.google.com/specimen/Kosugi+Maru", + "const": "Kosugi Maru" + }, + { + "title": "Kotta One", + "markdownDescription": "https://fonts.google.com/specimen/Kotta+One", + "const": "Kotta One" + }, + { + "title": "Koulen", + "markdownDescription": "https://fonts.google.com/specimen/Koulen", + "const": "Koulen" + }, + { + "title": "Kranky", + "markdownDescription": "https://fonts.google.com/specimen/Kranky", + "const": "Kranky" + }, + { + "title": "Kreon", + "markdownDescription": "https://fonts.google.com/specimen/Kreon", + "const": "Kreon" + }, + { + "title": "Kristi", + "markdownDescription": "https://fonts.google.com/specimen/Kristi", + "const": "Kristi" + }, + { + "title": "Krona One", + "markdownDescription": "https://fonts.google.com/specimen/Krona+One", + "const": "Krona One" + }, + { + "title": "Krub", + "markdownDescription": "https://fonts.google.com/specimen/Krub", + "const": "Krub" + }, + { + "title": "Kufam", + "markdownDescription": "https://fonts.google.com/specimen/Kufam", + "const": "Kufam" + }, + { + "title": "Kulim Park", + "markdownDescription": "https://fonts.google.com/specimen/Kulim+Park", + "const": "Kulim Park" + }, + { + "title": "Kumar One", + "markdownDescription": "https://fonts.google.com/specimen/Kumar+One", + "const": "Kumar One" + }, + { + "title": "Kumar One Outline", + "markdownDescription": "https://fonts.google.com/specimen/Kumar+One+Outline", + "const": "Kumar One Outline" + }, + { + "title": "Kumbh Sans", + "markdownDescription": "https://fonts.google.com/specimen/Kumbh+Sans", + "const": "Kumbh Sans" + }, + { + "title": "Kurale", + "markdownDescription": "https://fonts.google.com/specimen/Kurale", + "const": "Kurale" + }, + { + "title": "La Belle Aurore", + "markdownDescription": "https://fonts.google.com/specimen/La+Belle+Aurore", + "const": "La Belle Aurore" + }, + { + "title": "Labrada", + "markdownDescription": "https://fonts.google.com/specimen/Labrada", + "const": "Labrada" + }, + { + "title": "Lacquer", + "markdownDescription": "https://fonts.google.com/specimen/Lacquer", + "const": "Lacquer" + }, + { + "title": "Laila", + "markdownDescription": "https://fonts.google.com/specimen/Laila", + "const": "Laila" + }, + { + "title": "Lakki Reddy", + "markdownDescription": "https://fonts.google.com/specimen/Lakki+Reddy", + "const": "Lakki Reddy" + }, + { + "title": "Lalezar", + "markdownDescription": "https://fonts.google.com/specimen/Lalezar", + "const": "Lalezar" + }, + { + "title": "Lancelot", + "markdownDescription": "https://fonts.google.com/specimen/Lancelot", + "const": "Lancelot" + }, + { + "title": "Langar", + "markdownDescription": "https://fonts.google.com/specimen/Langar", + "const": "Langar" + }, + { + "title": "Lateef", + "markdownDescription": "https://fonts.google.com/specimen/Lateef", + "const": "Lateef" + }, + { + "title": "Lato", + "markdownDescription": "https://fonts.google.com/specimen/Lato", + "const": "Lato" + }, + { + "title": "Lavishly Yours", + "markdownDescription": "https://fonts.google.com/specimen/Lavishly+Yours", + "const": "Lavishly Yours" + }, + { + "title": "League Gothic", + "markdownDescription": "https://fonts.google.com/specimen/League+Gothic", + "const": "League Gothic" + }, + { + "title": "League Script", + "markdownDescription": "https://fonts.google.com/specimen/League+Script", + "const": "League Script" + }, + { + "title": "League Spartan", + "markdownDescription": "https://fonts.google.com/specimen/League+Spartan", + "const": "League Spartan" + }, + { + "title": "Leckerli One", + "markdownDescription": "https://fonts.google.com/specimen/Leckerli+One", + "const": "Leckerli One" + }, + { + "title": "Ledger", + "markdownDescription": "https://fonts.google.com/specimen/Ledger", + "const": "Ledger" + }, + { + "title": "Lekton", + "markdownDescription": "https://fonts.google.com/specimen/Lekton", + "const": "Lekton" + }, + { + "title": "Lemon", + "markdownDescription": "https://fonts.google.com/specimen/Lemon", + "const": "Lemon" + }, + { + "title": "Lemonada", + "markdownDescription": "https://fonts.google.com/specimen/Lemonada", + "const": "Lemonada" + }, + { + "title": "Lexend", + "markdownDescription": "https://fonts.google.com/specimen/Lexend", + "const": "Lexend" + }, + { + "title": "Lexend Deca", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Deca", + "const": "Lexend Deca" + }, + { + "title": "Lexend Exa", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Exa", + "const": "Lexend Exa" + }, + { + "title": "Lexend Giga", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Giga", + "const": "Lexend Giga" + }, + { + "title": "Lexend Mega", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Mega", + "const": "Lexend Mega" + }, + { + "title": "Lexend Peta", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Peta", + "const": "Lexend Peta" + }, + { + "title": "Lexend Tera", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Tera", + "const": "Lexend Tera" + }, + { + "title": "Lexend Zetta", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Zetta", + "const": "Lexend Zetta" + }, + { + "title": "Libre Barcode 128", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+128", + "const": "Libre Barcode 128" + }, + { + "title": "Libre Barcode 128 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+128+Text", + "const": "Libre Barcode 128 Text" + }, + { + "title": "Libre Barcode 39", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39", + "const": "Libre Barcode 39" + }, + { + "title": "Libre Barcode 39 Extended", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Extended", + "const": "Libre Barcode 39 Extended" + }, + { + "title": "Libre Barcode 39 Extended Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Extended+Text", + "const": "Libre Barcode 39 Extended Text" + }, + { + "title": "Libre Barcode 39 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Text", + "const": "Libre Barcode 39 Text" + }, + { + "title": "Libre Barcode EAN13 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+EAN13+Text", + "const": "Libre Barcode EAN13 Text" + }, + { + "title": "Libre Baskerville", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Baskerville", + "const": "Libre Baskerville" + }, + { + "title": "Libre Bodoni", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Bodoni", + "const": "Libre Bodoni" + }, + { + "title": "Libre Caslon Display", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Caslon+Display", + "const": "Libre Caslon Display" + }, + { + "title": "Libre Caslon Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Caslon+Text", + "const": "Libre Caslon Text" + }, + { + "title": "Libre Franklin", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Franklin", + "const": "Libre Franklin" + }, + { + "title": "Licorice", + "markdownDescription": "https://fonts.google.com/specimen/Licorice", + "const": "Licorice" + }, + { + "title": "Life Savers", + "markdownDescription": "https://fonts.google.com/specimen/Life+Savers", + "const": "Life Savers" + }, + { + "title": "Lilita One", + "markdownDescription": "https://fonts.google.com/specimen/Lilita+One", + "const": "Lilita One" + }, + { + "title": "Lily Script One", + "markdownDescription": "https://fonts.google.com/specimen/Lily+Script+One", + "const": "Lily Script One" + }, + { + "title": "Limelight", + "markdownDescription": "https://fonts.google.com/specimen/Limelight", + "const": "Limelight" + }, + { + "title": "Linden Hill", + "markdownDescription": "https://fonts.google.com/specimen/Linden+Hill", + "const": "Linden Hill" + }, + { + "title": "Lisu Bosa", + "markdownDescription": "https://fonts.google.com/specimen/Lisu+Bosa", + "const": "Lisu Bosa" + }, + { + "title": "Literata", + "markdownDescription": "https://fonts.google.com/specimen/Literata", + "const": "Literata" + }, + { + "title": "Liu Jian Mao Cao", + "markdownDescription": "https://fonts.google.com/specimen/Liu+Jian+Mao+Cao", + "const": "Liu Jian Mao Cao" + }, + { + "title": "Livvic", + "markdownDescription": "https://fonts.google.com/specimen/Livvic", + "const": "Livvic" + }, + { + "title": "Lobster", + "markdownDescription": "https://fonts.google.com/specimen/Lobster", + "const": "Lobster" + }, + { + "title": "Lobster Two", + "markdownDescription": "https://fonts.google.com/specimen/Lobster+Two", + "const": "Lobster Two" + }, + { + "title": "Londrina Outline", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Outline", + "const": "Londrina Outline" + }, + { + "title": "Londrina Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Shadow", + "const": "Londrina Shadow" + }, + { + "title": "Londrina Sketch", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Sketch", + "const": "Londrina Sketch" + }, + { + "title": "Londrina Solid", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Solid", + "const": "Londrina Solid" + }, + { + "title": "Long Cang", + "markdownDescription": "https://fonts.google.com/specimen/Long+Cang", + "const": "Long Cang" + }, + { + "title": "Lora", + "markdownDescription": "https://fonts.google.com/specimen/Lora", + "const": "Lora" + }, + { + "title": "Love Light", + "markdownDescription": "https://fonts.google.com/specimen/Love+Light", + "const": "Love Light" + }, + { + "title": "Love Ya Like A Sister", + "markdownDescription": "https://fonts.google.com/specimen/Love+Ya+Like+A+Sister", + "const": "Love Ya Like A Sister" + }, + { + "title": "Loved by the King", + "markdownDescription": "https://fonts.google.com/specimen/Loved+by+the+King", + "const": "Loved by the King" + }, + { + "title": "Lovers Quarrel", + "markdownDescription": "https://fonts.google.com/specimen/Lovers+Quarrel", + "const": "Lovers Quarrel" + }, + { + "title": "Luckiest Guy", + "markdownDescription": "https://fonts.google.com/specimen/Luckiest+Guy", + "const": "Luckiest Guy" + }, + { + "title": "Lugrasimo", + "markdownDescription": "https://fonts.google.com/specimen/Lugrasimo", + "const": "Lugrasimo" + }, + { + "title": "Lumanosimo", + "markdownDescription": "https://fonts.google.com/specimen/Lumanosimo", + "const": "Lumanosimo" + }, + { + "title": "Lunasima", + "markdownDescription": "https://fonts.google.com/specimen/Lunasima", + "const": "Lunasima" + }, + { + "title": "Lusitana", + "markdownDescription": "https://fonts.google.com/specimen/Lusitana", + "const": "Lusitana" + }, + { + "title": "Lustria", + "markdownDescription": "https://fonts.google.com/specimen/Lustria", + "const": "Lustria" + }, + { + "title": "Luxurious Roman", + "markdownDescription": "https://fonts.google.com/specimen/Luxurious+Roman", + "const": "Luxurious Roman" + }, + { + "title": "Luxurious Script", + "markdownDescription": "https://fonts.google.com/specimen/Luxurious+Script", + "const": "Luxurious Script" + }, + { + "title": "M PLUS 1", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1", + "const": "M PLUS 1" + }, + { + "title": "M PLUS 1 Code", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1+Code", + "const": "M PLUS 1 Code" + }, + { + "title": "M PLUS 1p", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1p", + "const": "M PLUS 1p" + }, + { + "title": "M PLUS 2", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+2", + "const": "M PLUS 2" + }, + { + "title": "M PLUS Code Latin", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+Code+Latin", + "const": "M PLUS Code Latin" + }, + { + "title": "M PLUS Rounded 1c", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+Rounded+1c", + "const": "M PLUS Rounded 1c" + }, + { + "title": "Ma Shan Zheng", + "markdownDescription": "https://fonts.google.com/specimen/Ma+Shan+Zheng", + "const": "Ma Shan Zheng" + }, + { + "title": "Macondo", + "markdownDescription": "https://fonts.google.com/specimen/Macondo", + "const": "Macondo" + }, + { + "title": "Macondo Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Macondo+Swash+Caps", + "const": "Macondo Swash Caps" + }, + { + "title": "Mada", + "markdownDescription": "https://fonts.google.com/specimen/Mada", + "const": "Mada" + }, + { + "title": "Magra", + "markdownDescription": "https://fonts.google.com/specimen/Magra", + "const": "Magra" + }, + { + "title": "Maiden Orange", + "markdownDescription": "https://fonts.google.com/specimen/Maiden+Orange", + "const": "Maiden Orange" + }, + { + "title": "Maitree", + "markdownDescription": "https://fonts.google.com/specimen/Maitree", + "const": "Maitree" + }, + { + "title": "Major Mono Display", + "markdownDescription": "https://fonts.google.com/specimen/Major+Mono+Display", + "const": "Major Mono Display" + }, + { + "title": "Mako", + "markdownDescription": "https://fonts.google.com/specimen/Mako", + "const": "Mako" + }, + { + "title": "Mali", + "markdownDescription": "https://fonts.google.com/specimen/Mali", + "const": "Mali" + }, + { + "title": "Mallanna", + "markdownDescription": "https://fonts.google.com/specimen/Mallanna", + "const": "Mallanna" + }, + { + "title": "Mandali", + "markdownDescription": "https://fonts.google.com/specimen/Mandali", + "const": "Mandali" + }, + { + "title": "Manjari", + "markdownDescription": "https://fonts.google.com/specimen/Manjari", + "const": "Manjari" + }, + { + "title": "Manrope", + "markdownDescription": "https://fonts.google.com/specimen/Manrope", + "const": "Manrope" + }, + { + "title": "Mansalva", + "markdownDescription": "https://fonts.google.com/specimen/Mansalva", + "const": "Mansalva" + }, + { + "title": "Manuale", + "markdownDescription": "https://fonts.google.com/specimen/Manuale", + "const": "Manuale" + }, + { + "title": "Marcellus", + "markdownDescription": "https://fonts.google.com/specimen/Marcellus", + "const": "Marcellus" + }, + { + "title": "Marcellus SC", + "markdownDescription": "https://fonts.google.com/specimen/Marcellus+SC", + "const": "Marcellus SC" + }, + { + "title": "Marck Script", + "markdownDescription": "https://fonts.google.com/specimen/Marck+Script", + "const": "Marck Script" + }, + { + "title": "Margarine", + "markdownDescription": "https://fonts.google.com/specimen/Margarine", + "const": "Margarine" + }, + { + "title": "Marhey", + "markdownDescription": "https://fonts.google.com/specimen/Marhey", + "const": "Marhey" + }, + { + "title": "Markazi Text", + "markdownDescription": "https://fonts.google.com/specimen/Markazi+Text", + "const": "Markazi Text" + }, + { + "title": "Marko One", + "markdownDescription": "https://fonts.google.com/specimen/Marko+One", + "const": "Marko One" + }, + { + "title": "Marmelad", + "markdownDescription": "https://fonts.google.com/specimen/Marmelad", + "const": "Marmelad" + }, + { + "title": "Martel", + "markdownDescription": "https://fonts.google.com/specimen/Martel", + "const": "Martel" + }, + { + "title": "Martel Sans", + "markdownDescription": "https://fonts.google.com/specimen/Martel+Sans", + "const": "Martel Sans" + }, + { + "title": "Martian Mono", + "markdownDescription": "https://fonts.google.com/specimen/Martian+Mono", + "const": "Martian Mono" + }, + { + "title": "Marvel", + "markdownDescription": "https://fonts.google.com/specimen/Marvel", + "const": "Marvel" + }, + { + "title": "Mate", + "markdownDescription": "https://fonts.google.com/specimen/Mate", + "const": "Mate" + }, + { + "title": "Mate SC", + "markdownDescription": "https://fonts.google.com/specimen/Mate+SC", + "const": "Mate SC" + }, + { + "title": "Material Icons", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons", + "const": "Material Icons" + }, + { + "title": "Material Icons Outlined", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Outlined", + "const": "Material Icons Outlined" + }, + { + "title": "Material Icons Round", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Round", + "const": "Material Icons Round" + }, + { + "title": "Material Icons Sharp", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Sharp", + "const": "Material Icons Sharp" + }, + { + "title": "Material Icons Two Tone", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Two+Tone", + "const": "Material Icons Two Tone" + }, + { + "title": "Material Symbols Outlined", + "markdownDescription": "https://fonts.google.com/specimen/Material+Symbols+Outlined", + "const": "Material Symbols Outlined" + }, + { + "title": "Material Symbols Rounded", + "markdownDescription": "https://fonts.google.com/specimen/Material+Symbols+Rounded", + "const": "Material Symbols Rounded" + }, + { + "title": "Material Symbols Sharp", + "markdownDescription": "https://fonts.google.com/specimen/Material+Symbols+Sharp", + "const": "Material Symbols Sharp" + }, + { + "title": "Maven Pro", + "markdownDescription": "https://fonts.google.com/specimen/Maven+Pro", + "const": "Maven Pro" + }, + { + "title": "McLaren", + "markdownDescription": "https://fonts.google.com/specimen/McLaren", + "const": "McLaren" + }, + { + "title": "Mea Culpa", + "markdownDescription": "https://fonts.google.com/specimen/Mea+Culpa", + "const": "Mea Culpa" + }, + { + "title": "Meddon", + "markdownDescription": "https://fonts.google.com/specimen/Meddon", + "const": "Meddon" + }, + { + "title": "MedievalSharp", + "markdownDescription": "https://fonts.google.com/specimen/MedievalSharp", + "const": "MedievalSharp" + }, + { + "title": "Medula One", + "markdownDescription": "https://fonts.google.com/specimen/Medula+One", + "const": "Medula One" + }, + { + "title": "Meera Inimai", + "markdownDescription": "https://fonts.google.com/specimen/Meera+Inimai", + "const": "Meera Inimai" + }, + { + "title": "Megrim", + "markdownDescription": "https://fonts.google.com/specimen/Megrim", + "const": "Megrim" + }, + { + "title": "Meie Script", + "markdownDescription": "https://fonts.google.com/specimen/Meie+Script", + "const": "Meie Script" + }, + { + "title": "Meow Script", + "markdownDescription": "https://fonts.google.com/specimen/Meow+Script", + "const": "Meow Script" + }, + { + "title": "Merienda", + "markdownDescription": "https://fonts.google.com/specimen/Merienda", + "const": "Merienda" + }, + { + "title": "Merriweather", + "markdownDescription": "https://fonts.google.com/specimen/Merriweather", + "const": "Merriweather" + }, + { + "title": "Merriweather Sans", + "markdownDescription": "https://fonts.google.com/specimen/Merriweather+Sans", + "const": "Merriweather Sans" + }, + { + "title": "Metal", + "markdownDescription": "https://fonts.google.com/specimen/Metal", + "const": "Metal" + }, + { + "title": "Metal Mania", + "markdownDescription": "https://fonts.google.com/specimen/Metal+Mania", + "const": "Metal Mania" + }, + { + "title": "Metamorphous", + "markdownDescription": "https://fonts.google.com/specimen/Metamorphous", + "const": "Metamorphous" + }, + { + "title": "Metrophobic", + "markdownDescription": "https://fonts.google.com/specimen/Metrophobic", + "const": "Metrophobic" + }, + { + "title": "Michroma", + "markdownDescription": "https://fonts.google.com/specimen/Michroma", + "const": "Michroma" + }, + { + "title": "Milonga", + "markdownDescription": "https://fonts.google.com/specimen/Milonga", + "const": "Milonga" + }, + { + "title": "Miltonian", + "markdownDescription": "https://fonts.google.com/specimen/Miltonian", + "const": "Miltonian" + }, + { + "title": "Miltonian Tattoo", + "markdownDescription": "https://fonts.google.com/specimen/Miltonian+Tattoo", + "const": "Miltonian Tattoo" + }, + { + "title": "Mina", + "markdownDescription": "https://fonts.google.com/specimen/Mina", + "const": "Mina" + }, + { + "title": "Mingzat", + "markdownDescription": "https://fonts.google.com/specimen/Mingzat", + "const": "Mingzat" + }, + { + "title": "Miniver", + "markdownDescription": "https://fonts.google.com/specimen/Miniver", + "const": "Miniver" + }, + { + "title": "Miriam Libre", + "markdownDescription": "https://fonts.google.com/specimen/Miriam+Libre", + "const": "Miriam Libre" + }, + { + "title": "Mirza", + "markdownDescription": "https://fonts.google.com/specimen/Mirza", + "const": "Mirza" + }, + { + "title": "Miss Fajardose", + "markdownDescription": "https://fonts.google.com/specimen/Miss+Fajardose", + "const": "Miss Fajardose" + }, + { + "title": "Mitr", + "markdownDescription": "https://fonts.google.com/specimen/Mitr", + "const": "Mitr" + }, + { + "title": "Mochiy Pop One", + "markdownDescription": "https://fonts.google.com/specimen/Mochiy+Pop+One", + "const": "Mochiy Pop One" + }, + { + "title": "Mochiy Pop P One", + "markdownDescription": "https://fonts.google.com/specimen/Mochiy+Pop+P+One", + "const": "Mochiy Pop P One" + }, + { + "title": "Modak", + "markdownDescription": "https://fonts.google.com/specimen/Modak", + "const": "Modak" + }, + { + "title": "Modern Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Modern+Antiqua", + "const": "Modern Antiqua" + }, + { + "title": "Mogra", + "markdownDescription": "https://fonts.google.com/specimen/Mogra", + "const": "Mogra" + }, + { + "title": "Mohave", + "markdownDescription": "https://fonts.google.com/specimen/Mohave", + "const": "Mohave" + }, + { + "title": "Moirai One", + "markdownDescription": "https://fonts.google.com/specimen/Moirai+One", + "const": "Moirai One" + }, + { + "title": "Molengo", + "markdownDescription": "https://fonts.google.com/specimen/Molengo", + "const": "Molengo" + }, + { + "title": "Molle", + "markdownDescription": "https://fonts.google.com/specimen/Molle", + "const": "Molle" + }, + { + "title": "Monda", + "markdownDescription": "https://fonts.google.com/specimen/Monda", + "const": "Monda" + }, + { + "title": "Monofett", + "markdownDescription": "https://fonts.google.com/specimen/Monofett", + "const": "Monofett" + }, + { + "title": "Monomaniac One", + "markdownDescription": "https://fonts.google.com/specimen/Monomaniac+One", + "const": "Monomaniac One" + }, + { + "title": "Monoton", + "markdownDescription": "https://fonts.google.com/specimen/Monoton", + "const": "Monoton" + }, + { + "title": "Monsieur La Doulaise", + "markdownDescription": "https://fonts.google.com/specimen/Monsieur+La+Doulaise", + "const": "Monsieur La Doulaise" + }, + { + "title": "Montaga", + "markdownDescription": "https://fonts.google.com/specimen/Montaga", + "const": "Montaga" + }, + { + "title": "Montagu Slab", + "markdownDescription": "https://fonts.google.com/specimen/Montagu+Slab", + "const": "Montagu Slab" + }, + { + "title": "MonteCarlo", + "markdownDescription": "https://fonts.google.com/specimen/MonteCarlo", + "const": "MonteCarlo" + }, + { + "title": "Montez", + "markdownDescription": "https://fonts.google.com/specimen/Montez", + "const": "Montez" + }, + { + "title": "Montserrat", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat", + "const": "Montserrat" + }, + { + "title": "Montserrat Alternates", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat+Alternates", + "const": "Montserrat Alternates" + }, + { + "title": "Montserrat Subrayada", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat+Subrayada", + "const": "Montserrat Subrayada" + }, + { + "title": "Moo Lah Lah", + "markdownDescription": "https://fonts.google.com/specimen/Moo+Lah+Lah", + "const": "Moo Lah Lah" + }, + { + "title": "Mooli", + "markdownDescription": "https://fonts.google.com/specimen/Mooli", + "const": "Mooli" + }, + { + "title": "Moon Dance", + "markdownDescription": "https://fonts.google.com/specimen/Moon+Dance", + "const": "Moon Dance" + }, + { + "title": "Moul", + "markdownDescription": "https://fonts.google.com/specimen/Moul", + "const": "Moul" + }, + { + "title": "Moulpali", + "markdownDescription": "https://fonts.google.com/specimen/Moulpali", + "const": "Moulpali" + }, + { + "title": "Mountains of Christmas", + "markdownDescription": "https://fonts.google.com/specimen/Mountains+of+Christmas", + "const": "Mountains of Christmas" + }, + { + "title": "Mouse Memoirs", + "markdownDescription": "https://fonts.google.com/specimen/Mouse+Memoirs", + "const": "Mouse Memoirs" + }, + { + "title": "Mr Bedfort", + "markdownDescription": "https://fonts.google.com/specimen/Mr+Bedfort", + "const": "Mr Bedfort" + }, + { + "title": "Mr Dafoe", + "markdownDescription": "https://fonts.google.com/specimen/Mr+Dafoe", + "const": "Mr Dafoe" + }, + { + "title": "Mr De Haviland", + "markdownDescription": "https://fonts.google.com/specimen/Mr+De+Haviland", + "const": "Mr De Haviland" + }, + { + "title": "Mrs Saint Delafield", + "markdownDescription": "https://fonts.google.com/specimen/Mrs+Saint+Delafield", + "const": "Mrs Saint Delafield" + }, + { + "title": "Mrs Sheppards", + "markdownDescription": "https://fonts.google.com/specimen/Mrs+Sheppards", + "const": "Mrs Sheppards" + }, + { + "title": "Ms Madi", + "markdownDescription": "https://fonts.google.com/specimen/Ms+Madi", + "const": "Ms Madi" + }, + { + "title": "Mukta", + "markdownDescription": "https://fonts.google.com/specimen/Mukta", + "const": "Mukta" + }, + { + "title": "Mukta Mahee", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Mahee", + "const": "Mukta Mahee" + }, + { + "title": "Mukta Malar", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Malar", + "const": "Mukta Malar" + }, + { + "title": "Mukta Vaani", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Vaani", + "const": "Mukta Vaani" + }, + { + "title": "Mulish", + "markdownDescription": "https://fonts.google.com/specimen/Mulish", + "const": "Mulish" + }, + { + "title": "Murecho", + "markdownDescription": "https://fonts.google.com/specimen/Murecho", + "const": "Murecho" + }, + { + "title": "MuseoModerno", + "markdownDescription": "https://fonts.google.com/specimen/MuseoModerno", + "const": "MuseoModerno" + }, + { + "title": "My Soul", + "markdownDescription": "https://fonts.google.com/specimen/My+Soul", + "const": "My Soul" + }, + { + "title": "Mynerve", + "markdownDescription": "https://fonts.google.com/specimen/Mynerve", + "const": "Mynerve" + }, + { + "title": "Mystery Quest", + "markdownDescription": "https://fonts.google.com/specimen/Mystery+Quest", + "const": "Mystery Quest" + }, + { + "title": "NTR", + "markdownDescription": "https://fonts.google.com/specimen/NTR", + "const": "NTR" + }, + { + "title": "Nabla", + "markdownDescription": "https://fonts.google.com/specimen/Nabla", + "const": "Nabla" + }, + { + "title": "Nanum Brush Script", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Brush+Script", + "const": "Nanum Brush Script" + }, + { + "title": "Nanum Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Gothic", + "const": "Nanum Gothic" + }, + { + "title": "Nanum Gothic Coding", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Gothic+Coding", + "const": "Nanum Gothic Coding" + }, + { + "title": "Nanum Myeongjo", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Myeongjo", + "const": "Nanum Myeongjo" + }, + { + "title": "Nanum Pen Script", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Pen+Script", + "const": "Nanum Pen Script" + }, + { + "title": "Narnoor", + "markdownDescription": "https://fonts.google.com/specimen/Narnoor", + "const": "Narnoor" + }, + { + "title": "Neonderthaw", + "markdownDescription": "https://fonts.google.com/specimen/Neonderthaw", + "const": "Neonderthaw" + }, + { + "title": "Nerko One", + "markdownDescription": "https://fonts.google.com/specimen/Nerko+One", + "const": "Nerko One" + }, + { + "title": "Neucha", + "markdownDescription": "https://fonts.google.com/specimen/Neucha", + "const": "Neucha" + }, + { + "title": "Neuton", + "markdownDescription": "https://fonts.google.com/specimen/Neuton", + "const": "Neuton" + }, + { + "title": "New Rocker", + "markdownDescription": "https://fonts.google.com/specimen/New+Rocker", + "const": "New Rocker" + }, + { + "title": "New Tegomin", + "markdownDescription": "https://fonts.google.com/specimen/New+Tegomin", + "const": "New Tegomin" + }, + { + "title": "News Cycle", + "markdownDescription": "https://fonts.google.com/specimen/News+Cycle", + "const": "News Cycle" + }, + { + "title": "Newsreader", + "markdownDescription": "https://fonts.google.com/specimen/Newsreader", + "const": "Newsreader" + }, + { + "title": "Niconne", + "markdownDescription": "https://fonts.google.com/specimen/Niconne", + "const": "Niconne" + }, + { + "title": "Niramit", + "markdownDescription": "https://fonts.google.com/specimen/Niramit", + "const": "Niramit" + }, + { + "title": "Nixie One", + "markdownDescription": "https://fonts.google.com/specimen/Nixie+One", + "const": "Nixie One" + }, + { + "title": "Nobile", + "markdownDescription": "https://fonts.google.com/specimen/Nobile", + "const": "Nobile" + }, + { + "title": "Nokora", + "markdownDescription": "https://fonts.google.com/specimen/Nokora", + "const": "Nokora" + }, + { + "title": "Norican", + "markdownDescription": "https://fonts.google.com/specimen/Norican", + "const": "Norican" + }, + { + "title": "Nosifer", + "markdownDescription": "https://fonts.google.com/specimen/Nosifer", + "const": "Nosifer" + }, + { + "title": "Notable", + "markdownDescription": "https://fonts.google.com/specimen/Notable", + "const": "Notable" + }, + { + "title": "Nothing You Could Do", + "markdownDescription": "https://fonts.google.com/specimen/Nothing+You+Could+Do", + "const": "Nothing You Could Do" + }, + { + "title": "Noticia Text", + "markdownDescription": "https://fonts.google.com/specimen/Noticia+Text", + "const": "Noticia Text" + }, + { + "title": "Noto Color Emoji", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Color+Emoji", + "const": "Noto Color Emoji" + }, + { + "title": "Noto Emoji", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Emoji", + "const": "Noto Emoji" + }, + { + "title": "Noto Kufi Arabic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Kufi+Arabic", + "const": "Noto Kufi Arabic" + }, + { + "title": "Noto Music", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Music", + "const": "Noto Music" + }, + { + "title": "Noto Naskh Arabic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Naskh+Arabic", + "const": "Noto Naskh Arabic" + }, + { + "title": "Noto Nastaliq Urdu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Nastaliq+Urdu", + "const": "Noto Nastaliq Urdu" + }, + { + "title": "Noto Rashi Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Rashi+Hebrew", + "const": "Noto Rashi Hebrew" + }, + { + "title": "Noto Sans", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans", + "const": "Noto Sans" + }, + { + "title": "Noto Sans Adlam", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Adlam", + "const": "Noto Sans Adlam" + }, + { + "title": "Noto Sans Adlam Unjoined", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Adlam+Unjoined", + "const": "Noto Sans Adlam Unjoined" + }, + { + "title": "Noto Sans Anatolian Hieroglyphs", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Anatolian+Hieroglyphs", + "const": "Noto Sans Anatolian Hieroglyphs" + }, + { + "title": "Noto Sans Arabic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Arabic", + "const": "Noto Sans Arabic" + }, + { + "title": "Noto Sans Armenian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Armenian", + "const": "Noto Sans Armenian" + }, + { + "title": "Noto Sans Avestan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Avestan", + "const": "Noto Sans Avestan" + }, + { + "title": "Noto Sans Balinese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Balinese", + "const": "Noto Sans Balinese" + }, + { + "title": "Noto Sans Bamum", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bamum", + "const": "Noto Sans Bamum" + }, + { + "title": "Noto Sans Bassa Vah", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bassa+Vah", + "const": "Noto Sans Bassa Vah" + }, + { + "title": "Noto Sans Batak", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Batak", + "const": "Noto Sans Batak" + }, + { + "title": "Noto Sans Bengali", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bengali", + "const": "Noto Sans Bengali" + }, + { + "title": "Noto Sans Bhaiksuki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bhaiksuki", + "const": "Noto Sans Bhaiksuki" + }, + { + "title": "Noto Sans Brahmi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Brahmi", + "const": "Noto Sans Brahmi" + }, + { + "title": "Noto Sans Buginese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Buginese", + "const": "Noto Sans Buginese" + }, + { + "title": "Noto Sans Buhid", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Buhid", + "const": "Noto Sans Buhid" + }, + { + "title": "Noto Sans Canadian Aboriginal", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Canadian+Aboriginal", + "const": "Noto Sans Canadian Aboriginal" + }, + { + "title": "Noto Sans Carian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Carian", + "const": "Noto Sans Carian" + }, + { + "title": "Noto Sans Caucasian Albanian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Caucasian+Albanian", + "const": "Noto Sans Caucasian Albanian" + }, + { + "title": "Noto Sans Chakma", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Chakma", + "const": "Noto Sans Chakma" + }, + { + "title": "Noto Sans Cham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cham", + "const": "Noto Sans Cham" + }, + { + "title": "Noto Sans Cherokee", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cherokee", + "const": "Noto Sans Cherokee" + }, + { + "title": "Noto Sans Chorasmian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Chorasmian", + "const": "Noto Sans Chorasmian" + }, + { + "title": "Noto Sans Coptic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Coptic", + "const": "Noto Sans Coptic" + }, + { + "title": "Noto Sans Cuneiform", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cuneiform", + "const": "Noto Sans Cuneiform" + }, + { + "title": "Noto Sans Cypriot", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cypriot", + "const": "Noto Sans Cypriot" + }, + { + "title": "Noto Sans Cypro Minoan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cypro+Minoan", + "const": "Noto Sans Cypro Minoan" + }, + { + "title": "Noto Sans Deseret", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Deseret", + "const": "Noto Sans Deseret" + }, + { + "title": "Noto Sans Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Devanagari", + "const": "Noto Sans Devanagari" + }, + { + "title": "Noto Sans Display", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Display", + "const": "Noto Sans Display" + }, + { + "title": "Noto Sans Duployan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Duployan", + "const": "Noto Sans Duployan" + }, + { + "title": "Noto Sans Egyptian Hieroglyphs", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Egyptian+Hieroglyphs", + "const": "Noto Sans Egyptian Hieroglyphs" + }, + { + "title": "Noto Sans Elbasan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Elbasan", + "const": "Noto Sans Elbasan" + }, + { + "title": "Noto Sans Elymaic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Elymaic", + "const": "Noto Sans Elymaic" + }, + { + "title": "Noto Sans Ethiopic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ethiopic", + "const": "Noto Sans Ethiopic" + }, + { + "title": "Noto Sans Georgian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Georgian", + "const": "Noto Sans Georgian" + }, + { + "title": "Noto Sans Glagolitic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Glagolitic", + "const": "Noto Sans Glagolitic" + }, + { + "title": "Noto Sans Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gothic", + "const": "Noto Sans Gothic" + }, + { + "title": "Noto Sans Grantha", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Grantha", + "const": "Noto Sans Grantha" + }, + { + "title": "Noto Sans Gujarati", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gujarati", + "const": "Noto Sans Gujarati" + }, + { + "title": "Noto Sans Gunjala Gondi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gunjala+Gondi", + "const": "Noto Sans Gunjala Gondi" + }, + { + "title": "Noto Sans Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gurmukhi", + "const": "Noto Sans Gurmukhi" + }, + { + "title": "Noto Sans HK", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+HK", + "const": "Noto Sans HK" + }, + { + "title": "Noto Sans Hanifi Rohingya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hanifi+Rohingya", + "const": "Noto Sans Hanifi Rohingya" + }, + { + "title": "Noto Sans Hanunoo", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hanunoo", + "const": "Noto Sans Hanunoo" + }, + { + "title": "Noto Sans Hatran", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hatran", + "const": "Noto Sans Hatran" + }, + { + "title": "Noto Sans Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hebrew", + "const": "Noto Sans Hebrew" + }, + { + "title": "Noto Sans Imperial Aramaic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Imperial+Aramaic", + "const": "Noto Sans Imperial Aramaic" + }, + { + "title": "Noto Sans Indic Siyaq Numbers", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Indic+Siyaq+Numbers", + "const": "Noto Sans Indic Siyaq Numbers" + }, + { + "title": "Noto Sans Inscriptional Pahlavi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Inscriptional+Pahlavi", + "const": "Noto Sans Inscriptional Pahlavi" + }, + { + "title": "Noto Sans Inscriptional Parthian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Inscriptional+Parthian", + "const": "Noto Sans Inscriptional Parthian" + }, + { + "title": "Noto Sans JP", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+JP", + "const": "Noto Sans JP" + }, + { + "title": "Noto Sans Javanese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Javanese", + "const": "Noto Sans Javanese" + }, + { + "title": "Noto Sans KR", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+KR", + "const": "Noto Sans KR" + }, + { + "title": "Noto Sans Kaithi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kaithi", + "const": "Noto Sans Kaithi" + }, + { + "title": "Noto Sans Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kannada", + "const": "Noto Sans Kannada" + }, + { + "title": "Noto Sans Kayah Li", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kayah+Li", + "const": "Noto Sans Kayah Li" + }, + { + "title": "Noto Sans Kharoshthi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kharoshthi", + "const": "Noto Sans Kharoshthi" + }, + { + "title": "Noto Sans Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Khmer", + "const": "Noto Sans Khmer" + }, + { + "title": "Noto Sans Khojki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Khojki", + "const": "Noto Sans Khojki" + }, + { + "title": "Noto Sans Khudawadi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Khudawadi", + "const": "Noto Sans Khudawadi" + }, + { + "title": "Noto Sans Lao", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lao", + "const": "Noto Sans Lao" + }, + { + "title": "Noto Sans Lao Looped", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lao+Looped", + "const": "Noto Sans Lao Looped" + }, + { + "title": "Noto Sans Lepcha", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lepcha", + "const": "Noto Sans Lepcha" + }, + { + "title": "Noto Sans Limbu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Limbu", + "const": "Noto Sans Limbu" + }, + { + "title": "Noto Sans Linear A", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Linear+A", + "const": "Noto Sans Linear A" + }, + { + "title": "Noto Sans Linear B", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Linear+B", + "const": "Noto Sans Linear B" + }, + { + "title": "Noto Sans Lisu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lisu", + "const": "Noto Sans Lisu" + }, + { + "title": "Noto Sans Lycian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lycian", + "const": "Noto Sans Lycian" + }, + { + "title": "Noto Sans Lydian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lydian", + "const": "Noto Sans Lydian" + }, + { + "title": "Noto Sans Mahajani", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mahajani", + "const": "Noto Sans Mahajani" + }, + { + "title": "Noto Sans Malayalam", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Malayalam", + "const": "Noto Sans Malayalam" + }, + { + "title": "Noto Sans Mandaic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mandaic", + "const": "Noto Sans Mandaic" + }, + { + "title": "Noto Sans Manichaean", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Manichaean", + "const": "Noto Sans Manichaean" + }, + { + "title": "Noto Sans Marchen", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Marchen", + "const": "Noto Sans Marchen" + }, + { + "title": "Noto Sans Masaram Gondi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Masaram+Gondi", + "const": "Noto Sans Masaram Gondi" + }, + { + "title": "Noto Sans Math", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Math", + "const": "Noto Sans Math" + }, + { + "title": "Noto Sans Mayan Numerals", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mayan+Numerals", + "const": "Noto Sans Mayan Numerals" + }, + { + "title": "Noto Sans Medefaidrin", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Medefaidrin", + "const": "Noto Sans Medefaidrin" + }, + { + "title": "Noto Sans Meetei Mayek", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Meetei+Mayek", + "const": "Noto Sans Meetei Mayek" + }, + { + "title": "Noto Sans Mende Kikakui", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mende+Kikakui", + "const": "Noto Sans Mende Kikakui" + }, + { + "title": "Noto Sans Meroitic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Meroitic", + "const": "Noto Sans Meroitic" + }, + { + "title": "Noto Sans Miao", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Miao", + "const": "Noto Sans Miao" + }, + { + "title": "Noto Sans Modi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Modi", + "const": "Noto Sans Modi" + }, + { + "title": "Noto Sans Mongolian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mongolian", + "const": "Noto Sans Mongolian" + }, + { + "title": "Noto Sans Mono", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mono", + "const": "Noto Sans Mono" + }, + { + "title": "Noto Sans Mro", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mro", + "const": "Noto Sans Mro" + }, + { + "title": "Noto Sans Multani", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Multani", + "const": "Noto Sans Multani" + }, + { + "title": "Noto Sans Myanmar", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Myanmar", + "const": "Noto Sans Myanmar" + }, + { + "title": "Noto Sans NKo", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+NKo", + "const": "Noto Sans NKo" + }, + { + "title": "Noto Sans NKo Unjoined", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+NKo+Unjoined", + "const": "Noto Sans NKo Unjoined" + }, + { + "title": "Noto Sans Nabataean", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nabataean", + "const": "Noto Sans Nabataean" + }, + { + "title": "Noto Sans Nag Mundari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nag+Mundari", + "const": "Noto Sans Nag Mundari" + }, + { + "title": "Noto Sans Nandinagari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nandinagari", + "const": "Noto Sans Nandinagari" + }, + { + "title": "Noto Sans New Tai Lue", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+New+Tai+Lue", + "const": "Noto Sans New Tai Lue" + }, + { + "title": "Noto Sans Newa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Newa", + "const": "Noto Sans Newa" + }, + { + "title": "Noto Sans Nushu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nushu", + "const": "Noto Sans Nushu" + }, + { + "title": "Noto Sans Ogham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ogham", + "const": "Noto Sans Ogham" + }, + { + "title": "Noto Sans Ol Chiki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ol+Chiki", + "const": "Noto Sans Ol Chiki" + }, + { + "title": "Noto Sans Old Hungarian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Hungarian", + "const": "Noto Sans Old Hungarian" + }, + { + "title": "Noto Sans Old Italic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Italic", + "const": "Noto Sans Old Italic" + }, + { + "title": "Noto Sans Old North Arabian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+North+Arabian", + "const": "Noto Sans Old North Arabian" + }, + { + "title": "Noto Sans Old Permic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Permic", + "const": "Noto Sans Old Permic" + }, + { + "title": "Noto Sans Old Persian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Persian", + "const": "Noto Sans Old Persian" + }, + { + "title": "Noto Sans Old Sogdian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Sogdian", + "const": "Noto Sans Old Sogdian" + }, + { + "title": "Noto Sans Old South Arabian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+South+Arabian", + "const": "Noto Sans Old South Arabian" + }, + { + "title": "Noto Sans Old Turkic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Turkic", + "const": "Noto Sans Old Turkic" + }, + { + "title": "Noto Sans Oriya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Oriya", + "const": "Noto Sans Oriya" + }, + { + "title": "Noto Sans Osage", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Osage", + "const": "Noto Sans Osage" + }, + { + "title": "Noto Sans Osmanya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Osmanya", + "const": "Noto Sans Osmanya" + }, + { + "title": "Noto Sans Pahawh Hmong", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Pahawh+Hmong", + "const": "Noto Sans Pahawh Hmong" + }, + { + "title": "Noto Sans Palmyrene", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Palmyrene", + "const": "Noto Sans Palmyrene" + }, + { + "title": "Noto Sans Pau Cin Hau", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Pau+Cin+Hau", + "const": "Noto Sans Pau Cin Hau" + }, + { + "title": "Noto Sans Phags Pa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Phags+Pa", + "const": "Noto Sans Phags Pa" + }, + { + "title": "Noto Sans Phoenician", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Phoenician", + "const": "Noto Sans Phoenician" + }, + { + "title": "Noto Sans Psalter Pahlavi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Psalter+Pahlavi", + "const": "Noto Sans Psalter Pahlavi" + }, + { + "title": "Noto Sans Rejang", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Rejang", + "const": "Noto Sans Rejang" + }, + { + "title": "Noto Sans Runic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Runic", + "const": "Noto Sans Runic" + }, + { + "title": "Noto Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+SC", + "const": "Noto Sans SC" + }, + { + "title": "Noto Sans Samaritan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Samaritan", + "const": "Noto Sans Samaritan" + }, + { + "title": "Noto Sans Saurashtra", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Saurashtra", + "const": "Noto Sans Saurashtra" + }, + { + "title": "Noto Sans Sharada", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sharada", + "const": "Noto Sans Sharada" + }, + { + "title": "Noto Sans Shavian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Shavian", + "const": "Noto Sans Shavian" + }, + { + "title": "Noto Sans Siddham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Siddham", + "const": "Noto Sans Siddham" + }, + { + "title": "Noto Sans SignWriting", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+SignWriting", + "const": "Noto Sans SignWriting" + }, + { + "title": "Noto Sans Sinhala", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sinhala", + "const": "Noto Sans Sinhala" + }, + { + "title": "Noto Sans Sogdian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sogdian", + "const": "Noto Sans Sogdian" + }, + { + "title": "Noto Sans Sora Sompeng", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sora+Sompeng", + "const": "Noto Sans Sora Sompeng" + }, + { + "title": "Noto Sans Soyombo", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Soyombo", + "const": "Noto Sans Soyombo" + }, + { + "title": "Noto Sans Sundanese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sundanese", + "const": "Noto Sans Sundanese" + }, + { + "title": "Noto Sans Syloti Nagri", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Syloti+Nagri", + "const": "Noto Sans Syloti Nagri" + }, + { + "title": "Noto Sans Symbols", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Symbols", + "const": "Noto Sans Symbols" + }, + { + "title": "Noto Sans Symbols 2", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Symbols+2", + "const": "Noto Sans Symbols 2" + }, + { + "title": "Noto Sans Syriac", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Syriac", + "const": "Noto Sans Syriac" + }, + { + "title": "Noto Sans Syriac Eastern", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Syriac+Eastern", + "const": "Noto Sans Syriac Eastern" + }, + { + "title": "Noto Sans TC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+TC", + "const": "Noto Sans TC" + }, + { + "title": "Noto Sans Tagalog", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tagalog", + "const": "Noto Sans Tagalog" + }, + { + "title": "Noto Sans Tagbanwa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tagbanwa", + "const": "Noto Sans Tagbanwa" + }, + { + "title": "Noto Sans Tai Le", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tai+Le", + "const": "Noto Sans Tai Le" + }, + { + "title": "Noto Sans Tai Tham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tai+Tham", + "const": "Noto Sans Tai Tham" + }, + { + "title": "Noto Sans Tai Viet", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tai+Viet", + "const": "Noto Sans Tai Viet" + }, + { + "title": "Noto Sans Takri", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Takri", + "const": "Noto Sans Takri" + }, + { + "title": "Noto Sans Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tamil", + "const": "Noto Sans Tamil" + }, + { + "title": "Noto Sans Tamil Supplement", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tamil+Supplement", + "const": "Noto Sans Tamil Supplement" + }, + { + "title": "Noto Sans Tangsa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tangsa", + "const": "Noto Sans Tangsa" + }, + { + "title": "Noto Sans Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Telugu", + "const": "Noto Sans Telugu" + }, + { + "title": "Noto Sans Thaana", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Thaana", + "const": "Noto Sans Thaana" + }, + { + "title": "Noto Sans Thai", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Thai", + "const": "Noto Sans Thai" + }, + { + "title": "Noto Sans Thai Looped", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Thai+Looped", + "const": "Noto Sans Thai Looped" + }, + { + "title": "Noto Sans Tifinagh", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tifinagh", + "const": "Noto Sans Tifinagh" + }, + { + "title": "Noto Sans Tirhuta", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tirhuta", + "const": "Noto Sans Tirhuta" + }, + { + "title": "Noto Sans Ugaritic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ugaritic", + "const": "Noto Sans Ugaritic" + }, + { + "title": "Noto Sans Vai", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Vai", + "const": "Noto Sans Vai" + }, + { + "title": "Noto Sans Vithkuqi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Vithkuqi", + "const": "Noto Sans Vithkuqi" + }, + { + "title": "Noto Sans Wancho", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Wancho", + "const": "Noto Sans Wancho" + }, + { + "title": "Noto Sans Warang Citi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Warang+Citi", + "const": "Noto Sans Warang Citi" + }, + { + "title": "Noto Sans Yi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Yi", + "const": "Noto Sans Yi" + }, + { + "title": "Noto Sans Zanabazar Square", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Zanabazar+Square", + "const": "Noto Sans Zanabazar Square" + }, + { + "title": "Noto Serif", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif", + "const": "Noto Serif" + }, + { + "title": "Noto Serif Ahom", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Ahom", + "const": "Noto Serif Ahom" + }, + { + "title": "Noto Serif Armenian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Armenian", + "const": "Noto Serif Armenian" + }, + { + "title": "Noto Serif Balinese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Balinese", + "const": "Noto Serif Balinese" + }, + { + "title": "Noto Serif Bengali", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Bengali", + "const": "Noto Serif Bengali" + }, + { + "title": "Noto Serif Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Devanagari", + "const": "Noto Serif Devanagari" + }, + { + "title": "Noto Serif Display", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Display", + "const": "Noto Serif Display" + }, + { + "title": "Noto Serif Dogra", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Dogra", + "const": "Noto Serif Dogra" + }, + { + "title": "Noto Serif Ethiopic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Ethiopic", + "const": "Noto Serif Ethiopic" + }, + { + "title": "Noto Serif Georgian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Georgian", + "const": "Noto Serif Georgian" + }, + { + "title": "Noto Serif Grantha", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Grantha", + "const": "Noto Serif Grantha" + }, + { + "title": "Noto Serif Gujarati", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Gujarati", + "const": "Noto Serif Gujarati" + }, + { + "title": "Noto Serif Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Gurmukhi", + "const": "Noto Serif Gurmukhi" + }, + { + "title": "Noto Serif HK", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+HK", + "const": "Noto Serif HK" + }, + { + "title": "Noto Serif Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Hebrew", + "const": "Noto Serif Hebrew" + }, + { + "title": "Noto Serif JP", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+JP", + "const": "Noto Serif JP" + }, + { + "title": "Noto Serif KR", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+KR", + "const": "Noto Serif KR" + }, + { + "title": "Noto Serif Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Kannada", + "const": "Noto Serif Kannada" + }, + { + "title": "Noto Serif Khitan Small Script", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Khitan+Small+Script", + "const": "Noto Serif Khitan Small Script" + }, + { + "title": "Noto Serif Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Khmer", + "const": "Noto Serif Khmer" + }, + { + "title": "Noto Serif Khojki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Khojki", + "const": "Noto Serif Khojki" + }, + { + "title": "Noto Serif Lao", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Lao", + "const": "Noto Serif Lao" + }, + { + "title": "Noto Serif Makasar", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Makasar", + "const": "Noto Serif Makasar" + }, + { + "title": "Noto Serif Malayalam", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Malayalam", + "const": "Noto Serif Malayalam" + }, + { + "title": "Noto Serif Myanmar", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Myanmar", + "const": "Noto Serif Myanmar" + }, + { + "title": "Noto Serif NP Hmong", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+NP+Hmong", + "const": "Noto Serif NP Hmong" + }, + { + "title": "Noto Serif Oriya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Oriya", + "const": "Noto Serif Oriya" + }, + { + "title": "Noto Serif Ottoman Siyaq", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Ottoman+Siyaq", + "const": "Noto Serif Ottoman Siyaq" + }, + { + "title": "Noto Serif SC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+SC", + "const": "Noto Serif SC" + }, + { + "title": "Noto Serif Sinhala", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Sinhala", + "const": "Noto Serif Sinhala" + }, + { + "title": "Noto Serif TC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+TC", + "const": "Noto Serif TC" + }, + { + "title": "Noto Serif Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Tamil", + "const": "Noto Serif Tamil" + }, + { + "title": "Noto Serif Tangut", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Tangut", + "const": "Noto Serif Tangut" + }, + { + "title": "Noto Serif Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Telugu", + "const": "Noto Serif Telugu" + }, + { + "title": "Noto Serif Thai", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Thai", + "const": "Noto Serif Thai" + }, + { + "title": "Noto Serif Tibetan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Tibetan", + "const": "Noto Serif Tibetan" + }, + { + "title": "Noto Serif Toto", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Toto", + "const": "Noto Serif Toto" + }, + { + "title": "Noto Serif Vithkuqi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Vithkuqi", + "const": "Noto Serif Vithkuqi" + }, + { + "title": "Noto Serif Yezidi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Yezidi", + "const": "Noto Serif Yezidi" + }, + { + "title": "Noto Traditional Nushu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Traditional+Nushu", + "const": "Noto Traditional Nushu" + }, + { + "title": "Nova Cut", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Cut", + "const": "Nova Cut" + }, + { + "title": "Nova Flat", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Flat", + "const": "Nova Flat" + }, + { + "title": "Nova Mono", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Mono", + "const": "Nova Mono" + }, + { + "title": "Nova Oval", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Oval", + "const": "Nova Oval" + }, + { + "title": "Nova Round", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Round", + "const": "Nova Round" + }, + { + "title": "Nova Script", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Script", + "const": "Nova Script" + }, + { + "title": "Nova Slim", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Slim", + "const": "Nova Slim" + }, + { + "title": "Nova Square", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Square", + "const": "Nova Square" + }, + { + "title": "Numans", + "markdownDescription": "https://fonts.google.com/specimen/Numans", + "const": "Numans" + }, + { + "title": "Nunito", + "markdownDescription": "https://fonts.google.com/specimen/Nunito", + "const": "Nunito" + }, + { + "title": "Nunito Sans", + "markdownDescription": "https://fonts.google.com/specimen/Nunito+Sans", + "const": "Nunito Sans" + }, + { + "title": "Nuosu SIL", + "markdownDescription": "https://fonts.google.com/specimen/Nuosu+SIL", + "const": "Nuosu SIL" + }, + { + "title": "Odibee Sans", + "markdownDescription": "https://fonts.google.com/specimen/Odibee+Sans", + "const": "Odibee Sans" + }, + { + "title": "Odor Mean Chey", + "markdownDescription": "https://fonts.google.com/specimen/Odor+Mean+Chey", + "const": "Odor Mean Chey" + }, + { + "title": "Offside", + "markdownDescription": "https://fonts.google.com/specimen/Offside", + "const": "Offside" + }, + { + "title": "Oi", + "markdownDescription": "https://fonts.google.com/specimen/Oi", + "const": "Oi" + }, + { + "title": "Old Standard TT", + "markdownDescription": "https://fonts.google.com/specimen/Old+Standard+TT", + "const": "Old Standard TT" + }, + { + "title": "Oldenburg", + "markdownDescription": "https://fonts.google.com/specimen/Oldenburg", + "const": "Oldenburg" + }, + { + "title": "Ole", + "markdownDescription": "https://fonts.google.com/specimen/Ole", + "const": "Ole" + }, + { + "title": "Oleo Script", + "markdownDescription": "https://fonts.google.com/specimen/Oleo+Script", + "const": "Oleo Script" + }, + { + "title": "Oleo Script Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Oleo+Script+Swash+Caps", + "const": "Oleo Script Swash Caps" + }, + { + "title": "Onest", + "markdownDescription": "https://fonts.google.com/specimen/Onest", + "const": "Onest" + }, + { + "title": "Oooh Baby", + "markdownDescription": "https://fonts.google.com/specimen/Oooh+Baby", + "const": "Oooh Baby" + }, + { + "title": "Open Sans", + "markdownDescription": "https://fonts.google.com/specimen/Open+Sans", + "const": "Open Sans" + }, + { + "title": "Oranienbaum", + "markdownDescription": "https://fonts.google.com/specimen/Oranienbaum", + "const": "Oranienbaum" + }, + { + "title": "Orbit", + "markdownDescription": "https://fonts.google.com/specimen/Orbit", + "const": "Orbit" + }, + { + "title": "Orbitron", + "markdownDescription": "https://fonts.google.com/specimen/Orbitron", + "const": "Orbitron" + }, + { + "title": "Oregano", + "markdownDescription": "https://fonts.google.com/specimen/Oregano", + "const": "Oregano" + }, + { + "title": "Orelega One", + "markdownDescription": "https://fonts.google.com/specimen/Orelega+One", + "const": "Orelega One" + }, + { + "title": "Orienta", + "markdownDescription": "https://fonts.google.com/specimen/Orienta", + "const": "Orienta" + }, + { + "title": "Original Surfer", + "markdownDescription": "https://fonts.google.com/specimen/Original+Surfer", + "const": "Original Surfer" + }, + { + "title": "Oswald", + "markdownDescription": "https://fonts.google.com/specimen/Oswald", + "const": "Oswald" + }, + { + "title": "Outfit", + "markdownDescription": "https://fonts.google.com/specimen/Outfit", + "const": "Outfit" + }, + { + "title": "Over the Rainbow", + "markdownDescription": "https://fonts.google.com/specimen/Over+the+Rainbow", + "const": "Over the Rainbow" + }, + { + "title": "Overlock", + "markdownDescription": "https://fonts.google.com/specimen/Overlock", + "const": "Overlock" + }, + { + "title": "Overlock SC", + "markdownDescription": "https://fonts.google.com/specimen/Overlock+SC", + "const": "Overlock SC" + }, + { + "title": "Overpass", + "markdownDescription": "https://fonts.google.com/specimen/Overpass", + "const": "Overpass" + }, + { + "title": "Overpass Mono", + "markdownDescription": "https://fonts.google.com/specimen/Overpass+Mono", + "const": "Overpass Mono" + }, + { + "title": "Ovo", + "markdownDescription": "https://fonts.google.com/specimen/Ovo", + "const": "Ovo" + }, + { + "title": "Oxanium", + "markdownDescription": "https://fonts.google.com/specimen/Oxanium", + "const": "Oxanium" + }, + { + "title": "Oxygen", + "markdownDescription": "https://fonts.google.com/specimen/Oxygen", + "const": "Oxygen" + }, + { + "title": "Oxygen Mono", + "markdownDescription": "https://fonts.google.com/specimen/Oxygen+Mono", + "const": "Oxygen Mono" + }, + { + "title": "PT Mono", + "markdownDescription": "https://fonts.google.com/specimen/PT+Mono", + "const": "PT Mono" + }, + { + "title": "PT Sans", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans", + "const": "PT Sans" + }, + { + "title": "PT Sans Caption", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans+Caption", + "const": "PT Sans Caption" + }, + { + "title": "PT Sans Narrow", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans+Narrow", + "const": "PT Sans Narrow" + }, + { + "title": "PT Serif", + "markdownDescription": "https://fonts.google.com/specimen/PT+Serif", + "const": "PT Serif" + }, + { + "title": "PT Serif Caption", + "markdownDescription": "https://fonts.google.com/specimen/PT+Serif+Caption", + "const": "PT Serif Caption" + }, + { + "title": "Pacifico", + "markdownDescription": "https://fonts.google.com/specimen/Pacifico", + "const": "Pacifico" + }, + { + "title": "Padauk", + "markdownDescription": "https://fonts.google.com/specimen/Padauk", + "const": "Padauk" + }, + { + "title": "Padyakke Expanded One", + "markdownDescription": "https://fonts.google.com/specimen/Padyakke+Expanded+One", + "const": "Padyakke Expanded One" + }, + { + "title": "Palanquin", + "markdownDescription": "https://fonts.google.com/specimen/Palanquin", + "const": "Palanquin" + }, + { + "title": "Palanquin Dark", + "markdownDescription": "https://fonts.google.com/specimen/Palanquin+Dark", + "const": "Palanquin Dark" + }, + { + "title": "Palette Mosaic", + "markdownDescription": "https://fonts.google.com/specimen/Palette+Mosaic", + "const": "Palette Mosaic" + }, + { + "title": "Pangolin", + "markdownDescription": "https://fonts.google.com/specimen/Pangolin", + "const": "Pangolin" + }, + { + "title": "Paprika", + "markdownDescription": "https://fonts.google.com/specimen/Paprika", + "const": "Paprika" + }, + { + "title": "Parisienne", + "markdownDescription": "https://fonts.google.com/specimen/Parisienne", + "const": "Parisienne" + }, + { + "title": "Passero One", + "markdownDescription": "https://fonts.google.com/specimen/Passero+One", + "const": "Passero One" + }, + { + "title": "Passion One", + "markdownDescription": "https://fonts.google.com/specimen/Passion+One", + "const": "Passion One" + }, + { + "title": "Passions Conflict", + "markdownDescription": "https://fonts.google.com/specimen/Passions+Conflict", + "const": "Passions Conflict" + }, + { + "title": "Pathway Extreme", + "markdownDescription": "https://fonts.google.com/specimen/Pathway+Extreme", + "const": "Pathway Extreme" + }, + { + "title": "Pathway Gothic One", + "markdownDescription": "https://fonts.google.com/specimen/Pathway+Gothic+One", + "const": "Pathway Gothic One" + }, + { + "title": "Patrick Hand", + "markdownDescription": "https://fonts.google.com/specimen/Patrick+Hand", + "const": "Patrick Hand" + }, + { + "title": "Patrick Hand SC", + "markdownDescription": "https://fonts.google.com/specimen/Patrick+Hand+SC", + "const": "Patrick Hand SC" + }, + { + "title": "Pattaya", + "markdownDescription": "https://fonts.google.com/specimen/Pattaya", + "const": "Pattaya" + }, + { + "title": "Patua One", + "markdownDescription": "https://fonts.google.com/specimen/Patua+One", + "const": "Patua One" + }, + { + "title": "Pavanam", + "markdownDescription": "https://fonts.google.com/specimen/Pavanam", + "const": "Pavanam" + }, + { + "title": "Paytone One", + "markdownDescription": "https://fonts.google.com/specimen/Paytone+One", + "const": "Paytone One" + }, + { + "title": "Peddana", + "markdownDescription": "https://fonts.google.com/specimen/Peddana", + "const": "Peddana" + }, + { + "title": "Peralta", + "markdownDescription": "https://fonts.google.com/specimen/Peralta", + "const": "Peralta" + }, + { + "title": "Permanent Marker", + "markdownDescription": "https://fonts.google.com/specimen/Permanent+Marker", + "const": "Permanent Marker" + }, + { + "title": "Petemoss", + "markdownDescription": "https://fonts.google.com/specimen/Petemoss", + "const": "Petemoss" + }, + { + "title": "Petit Formal Script", + "markdownDescription": "https://fonts.google.com/specimen/Petit+Formal+Script", + "const": "Petit Formal Script" + }, + { + "title": "Petrona", + "markdownDescription": "https://fonts.google.com/specimen/Petrona", + "const": "Petrona" + }, + { + "title": "Philosopher", + "markdownDescription": "https://fonts.google.com/specimen/Philosopher", + "const": "Philosopher" + }, + { + "title": "Phudu", + "markdownDescription": "https://fonts.google.com/specimen/Phudu", + "const": "Phudu" + }, + { + "title": "Piazzolla", + "markdownDescription": "https://fonts.google.com/specimen/Piazzolla", + "const": "Piazzolla" + }, + { + "title": "Piedra", + "markdownDescription": "https://fonts.google.com/specimen/Piedra", + "const": "Piedra" + }, + { + "title": "Pinyon Script", + "markdownDescription": "https://fonts.google.com/specimen/Pinyon+Script", + "const": "Pinyon Script" + }, + { + "title": "Pirata One", + "markdownDescription": "https://fonts.google.com/specimen/Pirata+One", + "const": "Pirata One" + }, + { + "title": "Pixelify Sans", + "markdownDescription": "https://fonts.google.com/specimen/Pixelify+Sans", + "const": "Pixelify Sans" + }, + { + "title": "Plaster", + "markdownDescription": "https://fonts.google.com/specimen/Plaster", + "const": "Plaster" + }, + { + "title": "Play", + "markdownDescription": "https://fonts.google.com/specimen/Play", + "const": "Play" + }, + { + "title": "Playball", + "markdownDescription": "https://fonts.google.com/specimen/Playball", + "const": "Playball" + }, + { + "title": "Playfair", + "markdownDescription": "https://fonts.google.com/specimen/Playfair", + "const": "Playfair" + }, + { + "title": "Playfair Display", + "markdownDescription": "https://fonts.google.com/specimen/Playfair+Display", + "const": "Playfair Display" + }, + { + "title": "Playfair Display SC", + "markdownDescription": "https://fonts.google.com/specimen/Playfair+Display+SC", + "const": "Playfair Display SC" + }, + { + "title": "Playpen Sans", + "markdownDescription": "https://fonts.google.com/specimen/Playpen+Sans", + "const": "Playpen Sans" + }, + { + "title": "Plus Jakarta Sans", + "markdownDescription": "https://fonts.google.com/specimen/Plus+Jakarta+Sans", + "const": "Plus Jakarta Sans" + }, + { + "title": "Podkova", + "markdownDescription": "https://fonts.google.com/specimen/Podkova", + "const": "Podkova" + }, + { + "title": "Poiret One", + "markdownDescription": "https://fonts.google.com/specimen/Poiret+One", + "const": "Poiret One" + }, + { + "title": "Poller One", + "markdownDescription": "https://fonts.google.com/specimen/Poller+One", + "const": "Poller One" + }, + { + "title": "Poltawski Nowy", + "markdownDescription": "https://fonts.google.com/specimen/Poltawski+Nowy", + "const": "Poltawski Nowy" + }, + { + "title": "Poly", + "markdownDescription": "https://fonts.google.com/specimen/Poly", + "const": "Poly" + }, + { + "title": "Pompiere", + "markdownDescription": "https://fonts.google.com/specimen/Pompiere", + "const": "Pompiere" + }, + { + "title": "Pontano Sans", + "markdownDescription": "https://fonts.google.com/specimen/Pontano+Sans", + "const": "Pontano Sans" + }, + { + "title": "Poor Story", + "markdownDescription": "https://fonts.google.com/specimen/Poor+Story", + "const": "Poor Story" + }, + { + "title": "Poppins", + "markdownDescription": "https://fonts.google.com/specimen/Poppins", + "const": "Poppins" + }, + { + "title": "Port Lligat Sans", + "markdownDescription": "https://fonts.google.com/specimen/Port+Lligat+Sans", + "const": "Port Lligat Sans" + }, + { + "title": "Port Lligat Slab", + "markdownDescription": "https://fonts.google.com/specimen/Port+Lligat+Slab", + "const": "Port Lligat Slab" + }, + { + "title": "Potta One", + "markdownDescription": "https://fonts.google.com/specimen/Potta+One", + "const": "Potta One" + }, + { + "title": "Pragati Narrow", + "markdownDescription": "https://fonts.google.com/specimen/Pragati+Narrow", + "const": "Pragati Narrow" + }, + { + "title": "Praise", + "markdownDescription": "https://fonts.google.com/specimen/Praise", + "const": "Praise" + }, + { + "title": "Prata", + "markdownDescription": "https://fonts.google.com/specimen/Prata", + "const": "Prata" + }, + { + "title": "Preahvihear", + "markdownDescription": "https://fonts.google.com/specimen/Preahvihear", + "const": "Preahvihear" + }, + { + "title": "Press Start 2P", + "markdownDescription": "https://fonts.google.com/specimen/Press+Start+2P", + "const": "Press Start 2P" + }, + { + "title": "Pridi", + "markdownDescription": "https://fonts.google.com/specimen/Pridi", + "const": "Pridi" + }, + { + "title": "Princess Sofia", + "markdownDescription": "https://fonts.google.com/specimen/Princess+Sofia", + "const": "Princess Sofia" + }, + { + "title": "Prociono", + "markdownDescription": "https://fonts.google.com/specimen/Prociono", + "const": "Prociono" + }, + { + "title": "Prompt", + "markdownDescription": "https://fonts.google.com/specimen/Prompt", + "const": "Prompt" + }, + { + "title": "Prosto One", + "markdownDescription": "https://fonts.google.com/specimen/Prosto+One", + "const": "Prosto One" + }, + { + "title": "Proza Libre", + "markdownDescription": "https://fonts.google.com/specimen/Proza+Libre", + "const": "Proza Libre" + }, + { + "title": "Public Sans", + "markdownDescription": "https://fonts.google.com/specimen/Public+Sans", + "const": "Public Sans" + }, + { + "title": "Puppies Play", + "markdownDescription": "https://fonts.google.com/specimen/Puppies+Play", + "const": "Puppies Play" + }, + { + "title": "Puritan", + "markdownDescription": "https://fonts.google.com/specimen/Puritan", + "const": "Puritan" + }, + { + "title": "Purple Purse", + "markdownDescription": "https://fonts.google.com/specimen/Purple+Purse", + "const": "Purple Purse" + }, + { + "title": "Qahiri", + "markdownDescription": "https://fonts.google.com/specimen/Qahiri", + "const": "Qahiri" + }, + { + "title": "Quando", + "markdownDescription": "https://fonts.google.com/specimen/Quando", + "const": "Quando" + }, + { + "title": "Quantico", + "markdownDescription": "https://fonts.google.com/specimen/Quantico", + "const": "Quantico" + }, + { + "title": "Quattrocento", + "markdownDescription": "https://fonts.google.com/specimen/Quattrocento", + "const": "Quattrocento" + }, + { + "title": "Quattrocento Sans", + "markdownDescription": "https://fonts.google.com/specimen/Quattrocento+Sans", + "const": "Quattrocento Sans" + }, + { + "title": "Questrial", + "markdownDescription": "https://fonts.google.com/specimen/Questrial", + "const": "Questrial" + }, + { + "title": "Quicksand", + "markdownDescription": "https://fonts.google.com/specimen/Quicksand", + "const": "Quicksand" + }, + { + "title": "Quintessential", + "markdownDescription": "https://fonts.google.com/specimen/Quintessential", + "const": "Quintessential" + }, + { + "title": "Qwigley", + "markdownDescription": "https://fonts.google.com/specimen/Qwigley", + "const": "Qwigley" + }, + { + "title": "Qwitcher Grypen", + "markdownDescription": "https://fonts.google.com/specimen/Qwitcher+Grypen", + "const": "Qwitcher Grypen" + }, + { + "title": "REM", + "markdownDescription": "https://fonts.google.com/specimen/REM", + "const": "REM" + }, + { + "title": "Racing Sans One", + "markdownDescription": "https://fonts.google.com/specimen/Racing+Sans+One", + "const": "Racing Sans One" + }, + { + "title": "Radio Canada", + "markdownDescription": "https://fonts.google.com/specimen/Radio+Canada", + "const": "Radio Canada" + }, + { + "title": "Radley", + "markdownDescription": "https://fonts.google.com/specimen/Radley", + "const": "Radley" + }, + { + "title": "Rajdhani", + "markdownDescription": "https://fonts.google.com/specimen/Rajdhani", + "const": "Rajdhani" + }, + { + "title": "Rakkas", + "markdownDescription": "https://fonts.google.com/specimen/Rakkas", + "const": "Rakkas" + }, + { + "title": "Raleway", + "markdownDescription": "https://fonts.google.com/specimen/Raleway", + "const": "Raleway" + }, + { + "title": "Raleway Dots", + "markdownDescription": "https://fonts.google.com/specimen/Raleway+Dots", + "const": "Raleway Dots" + }, + { + "title": "Ramabhadra", + "markdownDescription": "https://fonts.google.com/specimen/Ramabhadra", + "const": "Ramabhadra" + }, + { + "title": "Ramaraja", + "markdownDescription": "https://fonts.google.com/specimen/Ramaraja", + "const": "Ramaraja" + }, + { + "title": "Rambla", + "markdownDescription": "https://fonts.google.com/specimen/Rambla", + "const": "Rambla" + }, + { + "title": "Rammetto One", + "markdownDescription": "https://fonts.google.com/specimen/Rammetto+One", + "const": "Rammetto One" + }, + { + "title": "Rampart One", + "markdownDescription": "https://fonts.google.com/specimen/Rampart+One", + "const": "Rampart One" + }, + { + "title": "Ranchers", + "markdownDescription": "https://fonts.google.com/specimen/Ranchers", + "const": "Ranchers" + }, + { + "title": "Rancho", + "markdownDescription": "https://fonts.google.com/specimen/Rancho", + "const": "Rancho" + }, + { + "title": "Ranga", + "markdownDescription": "https://fonts.google.com/specimen/Ranga", + "const": "Ranga" + }, + { + "title": "Rasa", + "markdownDescription": "https://fonts.google.com/specimen/Rasa", + "const": "Rasa" + }, + { + "title": "Rationale", + "markdownDescription": "https://fonts.google.com/specimen/Rationale", + "const": "Rationale" + }, + { + "title": "Ravi Prakash", + "markdownDescription": "https://fonts.google.com/specimen/Ravi+Prakash", + "const": "Ravi Prakash" + }, + { + "title": "Readex Pro", + "markdownDescription": "https://fonts.google.com/specimen/Readex+Pro", + "const": "Readex Pro" + }, + { + "title": "Recursive", + "markdownDescription": "https://fonts.google.com/specimen/Recursive", + "const": "Recursive" + }, + { + "title": "Red Hat Display", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Display", + "const": "Red Hat Display" + }, + { + "title": "Red Hat Mono", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Mono", + "const": "Red Hat Mono" + }, + { + "title": "Red Hat Text", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Text", + "const": "Red Hat Text" + }, + { + "title": "Red Rose", + "markdownDescription": "https://fonts.google.com/specimen/Red+Rose", + "const": "Red Rose" + }, + { + "title": "Redacted", + "markdownDescription": "https://fonts.google.com/specimen/Redacted", + "const": "Redacted" + }, + { + "title": "Redacted Script", + "markdownDescription": "https://fonts.google.com/specimen/Redacted+Script", + "const": "Redacted Script" + }, + { + "title": "Redressed", + "markdownDescription": "https://fonts.google.com/specimen/Redressed", + "const": "Redressed" + }, + { + "title": "Reem Kufi", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi", + "const": "Reem Kufi" + }, + { + "title": "Reem Kufi Fun", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi+Fun", + "const": "Reem Kufi Fun" + }, + { + "title": "Reem Kufi Ink", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi+Ink", + "const": "Reem Kufi Ink" + }, + { + "title": "Reenie Beanie", + "markdownDescription": "https://fonts.google.com/specimen/Reenie+Beanie", + "const": "Reenie Beanie" + }, + { + "title": "Reggae One", + "markdownDescription": "https://fonts.google.com/specimen/Reggae+One", + "const": "Reggae One" + }, + { + "title": "Revalia", + "markdownDescription": "https://fonts.google.com/specimen/Revalia", + "const": "Revalia" + }, + { + "title": "Rhodium Libre", + "markdownDescription": "https://fonts.google.com/specimen/Rhodium+Libre", + "const": "Rhodium Libre" + }, + { + "title": "Ribeye", + "markdownDescription": "https://fonts.google.com/specimen/Ribeye", + "const": "Ribeye" + }, + { + "title": "Ribeye Marrow", + "markdownDescription": "https://fonts.google.com/specimen/Ribeye+Marrow", + "const": "Ribeye Marrow" + }, + { + "title": "Righteous", + "markdownDescription": "https://fonts.google.com/specimen/Righteous", + "const": "Righteous" + }, + { + "title": "Risque", + "markdownDescription": "https://fonts.google.com/specimen/Risque", + "const": "Risque" + }, + { + "title": "Road Rage", + "markdownDescription": "https://fonts.google.com/specimen/Road+Rage", + "const": "Road Rage" + }, + { + "title": "Roboto", + "markdownDescription": "https://fonts.google.com/specimen/Roboto", + "const": "Roboto" + }, + { + "title": "Roboto Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Condensed", + "const": "Roboto Condensed" + }, + { + "title": "Roboto Flex", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Flex", + "const": "Roboto Flex" + }, + { + "title": "Roboto Mono", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Mono", + "const": "Roboto Mono" + }, + { + "title": "Roboto Serif", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Serif", + "const": "Roboto Serif" + }, + { + "title": "Roboto Slab", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Slab", + "const": "Roboto Slab" + }, + { + "title": "Rochester", + "markdownDescription": "https://fonts.google.com/specimen/Rochester", + "const": "Rochester" + }, + { + "title": "Rock 3D", + "markdownDescription": "https://fonts.google.com/specimen/Rock+3D", + "const": "Rock 3D" + }, + { + "title": "Rock Salt", + "markdownDescription": "https://fonts.google.com/specimen/Rock+Salt", + "const": "Rock Salt" + }, + { + "title": "RocknRoll One", + "markdownDescription": "https://fonts.google.com/specimen/RocknRoll+One", + "const": "RocknRoll One" + }, + { + "title": "Rokkitt", + "markdownDescription": "https://fonts.google.com/specimen/Rokkitt", + "const": "Rokkitt" + }, + { + "title": "Romanesco", + "markdownDescription": "https://fonts.google.com/specimen/Romanesco", + "const": "Romanesco" + }, + { + "title": "Ropa Sans", + "markdownDescription": "https://fonts.google.com/specimen/Ropa+Sans", + "const": "Ropa Sans" + }, + { + "title": "Rosario", + "markdownDescription": "https://fonts.google.com/specimen/Rosario", + "const": "Rosario" + }, + { + "title": "Rosarivo", + "markdownDescription": "https://fonts.google.com/specimen/Rosarivo", + "const": "Rosarivo" + }, + { + "title": "Rouge Script", + "markdownDescription": "https://fonts.google.com/specimen/Rouge+Script", + "const": "Rouge Script" + }, + { + "title": "Rowdies", + "markdownDescription": "https://fonts.google.com/specimen/Rowdies", + "const": "Rowdies" + }, + { + "title": "Rozha One", + "markdownDescription": "https://fonts.google.com/specimen/Rozha+One", + "const": "Rozha One" + }, + { + "title": "Rubik", + "markdownDescription": "https://fonts.google.com/specimen/Rubik", + "const": "Rubik" + }, + { + "title": "Rubik 80s Fade", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+80s+Fade", + "const": "Rubik 80s Fade" + }, + { + "title": "Rubik Beastly", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Beastly", + "const": "Rubik Beastly" + }, + { + "title": "Rubik Bubbles", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Bubbles", + "const": "Rubik Bubbles" + }, + { + "title": "Rubik Burned", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Burned", + "const": "Rubik Burned" + }, + { + "title": "Rubik Dirt", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Dirt", + "const": "Rubik Dirt" + }, + { + "title": "Rubik Distressed", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Distressed", + "const": "Rubik Distressed" + }, + { + "title": "Rubik Gemstones", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Gemstones", + "const": "Rubik Gemstones" + }, + { + "title": "Rubik Glitch", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Glitch", + "const": "Rubik Glitch" + }, + { + "title": "Rubik Iso", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Iso", + "const": "Rubik Iso" + }, + { + "title": "Rubik Marker Hatch", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Marker+Hatch", + "const": "Rubik Marker Hatch" + }, + { + "title": "Rubik Maze", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Maze", + "const": "Rubik Maze" + }, + { + "title": "Rubik Microbe", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Microbe", + "const": "Rubik Microbe" + }, + { + "title": "Rubik Mono One", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Mono+One", + "const": "Rubik Mono One" + }, + { + "title": "Rubik Moonrocks", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Moonrocks", + "const": "Rubik Moonrocks" + }, + { + "title": "Rubik Pixels", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Pixels", + "const": "Rubik Pixels" + }, + { + "title": "Rubik Puddles", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Puddles", + "const": "Rubik Puddles" + }, + { + "title": "Rubik Spray Paint", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Spray+Paint", + "const": "Rubik Spray Paint" + }, + { + "title": "Rubik Storm", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Storm", + "const": "Rubik Storm" + }, + { + "title": "Rubik Vinyl", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Vinyl", + "const": "Rubik Vinyl" + }, + { + "title": "Rubik Wet Paint", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Wet+Paint", + "const": "Rubik Wet Paint" + }, + { + "title": "Ruda", + "markdownDescription": "https://fonts.google.com/specimen/Ruda", + "const": "Ruda" + }, + { + "title": "Rufina", + "markdownDescription": "https://fonts.google.com/specimen/Rufina", + "const": "Rufina" + }, + { + "title": "Ruge Boogie", + "markdownDescription": "https://fonts.google.com/specimen/Ruge+Boogie", + "const": "Ruge Boogie" + }, + { + "title": "Ruluko", + "markdownDescription": "https://fonts.google.com/specimen/Ruluko", + "const": "Ruluko" + }, + { + "title": "Rum Raisin", + "markdownDescription": "https://fonts.google.com/specimen/Rum+Raisin", + "const": "Rum Raisin" + }, + { + "title": "Ruslan Display", + "markdownDescription": "https://fonts.google.com/specimen/Ruslan+Display", + "const": "Ruslan Display" + }, + { + "title": "Russo One", + "markdownDescription": "https://fonts.google.com/specimen/Russo+One", + "const": "Russo One" + }, + { + "title": "Ruthie", + "markdownDescription": "https://fonts.google.com/specimen/Ruthie", + "const": "Ruthie" + }, + { + "title": "Ruwudu", + "markdownDescription": "https://fonts.google.com/specimen/Ruwudu", + "const": "Ruwudu" + }, + { + "title": "Rye", + "markdownDescription": "https://fonts.google.com/specimen/Rye", + "const": "Rye" + }, + { + "title": "STIX Two Text", + "markdownDescription": "https://fonts.google.com/specimen/STIX+Two+Text", + "const": "STIX Two Text" + }, + { + "title": "Sacramento", + "markdownDescription": "https://fonts.google.com/specimen/Sacramento", + "const": "Sacramento" + }, + { + "title": "Sahitya", + "markdownDescription": "https://fonts.google.com/specimen/Sahitya", + "const": "Sahitya" + }, + { + "title": "Sail", + "markdownDescription": "https://fonts.google.com/specimen/Sail", + "const": "Sail" + }, + { + "title": "Saira", + "markdownDescription": "https://fonts.google.com/specimen/Saira", + "const": "Saira" + }, + { + "title": "Saira Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Condensed", + "const": "Saira Condensed" + }, + { + "title": "Saira Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Extra+Condensed", + "const": "Saira Extra Condensed" + }, + { + "title": "Saira Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Semi+Condensed", + "const": "Saira Semi Condensed" + }, + { + "title": "Saira Stencil One", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Stencil+One", + "const": "Saira Stencil One" + }, + { + "title": "Salsa", + "markdownDescription": "https://fonts.google.com/specimen/Salsa", + "const": "Salsa" + }, + { + "title": "Sanchez", + "markdownDescription": "https://fonts.google.com/specimen/Sanchez", + "const": "Sanchez" + }, + { + "title": "Sancreek", + "markdownDescription": "https://fonts.google.com/specimen/Sancreek", + "const": "Sancreek" + }, + { + "title": "Sansita", + "markdownDescription": "https://fonts.google.com/specimen/Sansita", + "const": "Sansita" + }, + { + "title": "Sansita Swashed", + "markdownDescription": "https://fonts.google.com/specimen/Sansita+Swashed", + "const": "Sansita Swashed" + }, + { + "title": "Sarabun", + "markdownDescription": "https://fonts.google.com/specimen/Sarabun", + "const": "Sarabun" + }, + { + "title": "Sarala", + "markdownDescription": "https://fonts.google.com/specimen/Sarala", + "const": "Sarala" + }, + { + "title": "Sarina", + "markdownDescription": "https://fonts.google.com/specimen/Sarina", + "const": "Sarina" + }, + { + "title": "Sarpanch", + "markdownDescription": "https://fonts.google.com/specimen/Sarpanch", + "const": "Sarpanch" + }, + { + "title": "Sassy Frass", + "markdownDescription": "https://fonts.google.com/specimen/Sassy+Frass", + "const": "Sassy Frass" + }, + { + "title": "Satisfy", + "markdownDescription": "https://fonts.google.com/specimen/Satisfy", + "const": "Satisfy" + }, + { + "title": "Sawarabi Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Sawarabi+Gothic", + "const": "Sawarabi Gothic" + }, + { + "title": "Sawarabi Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Sawarabi+Mincho", + "const": "Sawarabi Mincho" + }, + { + "title": "Scada", + "markdownDescription": "https://fonts.google.com/specimen/Scada", + "const": "Scada" + }, + { + "title": "Scheherazade New", + "markdownDescription": "https://fonts.google.com/specimen/Scheherazade+New", + "const": "Scheherazade New" + }, + { + "title": "Schibsted Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Schibsted+Grotesk", + "const": "Schibsted Grotesk" + }, + { + "title": "Schoolbell", + "markdownDescription": "https://fonts.google.com/specimen/Schoolbell", + "const": "Schoolbell" + }, + { + "title": "Scope One", + "markdownDescription": "https://fonts.google.com/specimen/Scope+One", + "const": "Scope One" + }, + { + "title": "Seaweed Script", + "markdownDescription": "https://fonts.google.com/specimen/Seaweed+Script", + "const": "Seaweed Script" + }, + { + "title": "Secular One", + "markdownDescription": "https://fonts.google.com/specimen/Secular+One", + "const": "Secular One" + }, + { + "title": "Sedgwick Ave", + "markdownDescription": "https://fonts.google.com/specimen/Sedgwick+Ave", + "const": "Sedgwick Ave" + }, + { + "title": "Sedgwick Ave Display", + "markdownDescription": "https://fonts.google.com/specimen/Sedgwick+Ave+Display", + "const": "Sedgwick Ave Display" + }, + { + "title": "Sen", + "markdownDescription": "https://fonts.google.com/specimen/Sen", + "const": "Sen" + }, + { + "title": "Send Flowers", + "markdownDescription": "https://fonts.google.com/specimen/Send+Flowers", + "const": "Send Flowers" + }, + { + "title": "Sevillana", + "markdownDescription": "https://fonts.google.com/specimen/Sevillana", + "const": "Sevillana" + }, + { + "title": "Seymour One", + "markdownDescription": "https://fonts.google.com/specimen/Seymour+One", + "const": "Seymour One" + }, + { + "title": "Shadows Into Light", + "markdownDescription": "https://fonts.google.com/specimen/Shadows+Into+Light", + "const": "Shadows Into Light" + }, + { + "title": "Shadows Into Light Two", + "markdownDescription": "https://fonts.google.com/specimen/Shadows+Into+Light+Two", + "const": "Shadows Into Light Two" + }, + { + "title": "Shalimar", + "markdownDescription": "https://fonts.google.com/specimen/Shalimar", + "const": "Shalimar" + }, + { + "title": "Shantell Sans", + "markdownDescription": "https://fonts.google.com/specimen/Shantell+Sans", + "const": "Shantell Sans" + }, + { + "title": "Shanti", + "markdownDescription": "https://fonts.google.com/specimen/Shanti", + "const": "Shanti" + }, + { + "title": "Share", + "markdownDescription": "https://fonts.google.com/specimen/Share", + "const": "Share" + }, + { + "title": "Share Tech", + "markdownDescription": "https://fonts.google.com/specimen/Share+Tech", + "const": "Share Tech" + }, + { + "title": "Share Tech Mono", + "markdownDescription": "https://fonts.google.com/specimen/Share+Tech+Mono", + "const": "Share Tech Mono" + }, + { + "title": "Shippori Antique", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Antique", + "const": "Shippori Antique" + }, + { + "title": "Shippori Antique B1", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Antique+B1", + "const": "Shippori Antique B1" + }, + { + "title": "Shippori Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Mincho", + "const": "Shippori Mincho" + }, + { + "title": "Shippori Mincho B1", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Mincho+B1", + "const": "Shippori Mincho B1" + }, + { + "title": "Shizuru", + "markdownDescription": "https://fonts.google.com/specimen/Shizuru", + "const": "Shizuru" + }, + { + "title": "Shojumaru", + "markdownDescription": "https://fonts.google.com/specimen/Shojumaru", + "const": "Shojumaru" + }, + { + "title": "Short Stack", + "markdownDescription": "https://fonts.google.com/specimen/Short+Stack", + "const": "Short Stack" + }, + { + "title": "Shrikhand", + "markdownDescription": "https://fonts.google.com/specimen/Shrikhand", + "const": "Shrikhand" + }, + { + "title": "Siemreap", + "markdownDescription": "https://fonts.google.com/specimen/Siemreap", + "const": "Siemreap" + }, + { + "title": "Sigmar", + "markdownDescription": "https://fonts.google.com/specimen/Sigmar", + "const": "Sigmar" + }, + { + "title": "Sigmar One", + "markdownDescription": "https://fonts.google.com/specimen/Sigmar+One", + "const": "Sigmar One" + }, + { + "title": "Signika", + "markdownDescription": "https://fonts.google.com/specimen/Signika", + "const": "Signika" + }, + { + "title": "Signika Negative", + "markdownDescription": "https://fonts.google.com/specimen/Signika+Negative", + "const": "Signika Negative" + }, + { + "title": "Silkscreen", + "markdownDescription": "https://fonts.google.com/specimen/Silkscreen", + "const": "Silkscreen" + }, + { + "title": "Simonetta", + "markdownDescription": "https://fonts.google.com/specimen/Simonetta", + "const": "Simonetta" + }, + { + "title": "Single Day", + "markdownDescription": "https://fonts.google.com/specimen/Single+Day", + "const": "Single Day" + }, + { + "title": "Sintony", + "markdownDescription": "https://fonts.google.com/specimen/Sintony", + "const": "Sintony" + }, + { + "title": "Sirin Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Sirin+Stencil", + "const": "Sirin Stencil" + }, + { + "title": "Six Caps", + "markdownDescription": "https://fonts.google.com/specimen/Six+Caps", + "const": "Six Caps" + }, + { + "title": "Skranji", + "markdownDescription": "https://fonts.google.com/specimen/Skranji", + "const": "Skranji" + }, + { + "title": "Slabo 13px", + "markdownDescription": "https://fonts.google.com/specimen/Slabo+13px", + "const": "Slabo 13px" + }, + { + "title": "Slabo 27px", + "markdownDescription": "https://fonts.google.com/specimen/Slabo+27px", + "const": "Slabo 27px" + }, + { + "title": "Slackey", + "markdownDescription": "https://fonts.google.com/specimen/Slackey", + "const": "Slackey" + }, + { + "title": "Slackside One", + "markdownDescription": "https://fonts.google.com/specimen/Slackside+One", + "const": "Slackside One" + }, + { + "title": "Smokum", + "markdownDescription": "https://fonts.google.com/specimen/Smokum", + "const": "Smokum" + }, + { + "title": "Smooch", + "markdownDescription": "https://fonts.google.com/specimen/Smooch", + "const": "Smooch" + }, + { + "title": "Smooch Sans", + "markdownDescription": "https://fonts.google.com/specimen/Smooch+Sans", + "const": "Smooch Sans" + }, + { + "title": "Smythe", + "markdownDescription": "https://fonts.google.com/specimen/Smythe", + "const": "Smythe" + }, + { + "title": "Sniglet", + "markdownDescription": "https://fonts.google.com/specimen/Sniglet", + "const": "Sniglet" + }, + { + "title": "Snippet", + "markdownDescription": "https://fonts.google.com/specimen/Snippet", + "const": "Snippet" + }, + { + "title": "Snowburst One", + "markdownDescription": "https://fonts.google.com/specimen/Snowburst+One", + "const": "Snowburst One" + }, + { + "title": "Sofadi One", + "markdownDescription": "https://fonts.google.com/specimen/Sofadi+One", + "const": "Sofadi One" + }, + { + "title": "Sofia", + "markdownDescription": "https://fonts.google.com/specimen/Sofia", + "const": "Sofia" + }, + { + "title": "Sofia Sans", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans", + "const": "Sofia Sans" + }, + { + "title": "Sofia Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans+Condensed", + "const": "Sofia Sans Condensed" + }, + { + "title": "Sofia Sans Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans+Extra+Condensed", + "const": "Sofia Sans Extra Condensed" + }, + { + "title": "Sofia Sans Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans+Semi+Condensed", + "const": "Sofia Sans Semi Condensed" + }, + { + "title": "Solitreo", + "markdownDescription": "https://fonts.google.com/specimen/Solitreo", + "const": "Solitreo" + }, + { + "title": "Solway", + "markdownDescription": "https://fonts.google.com/specimen/Solway", + "const": "Solway" + }, + { + "title": "Sometype Mono", + "markdownDescription": "https://fonts.google.com/specimen/Sometype+Mono", + "const": "Sometype Mono" + }, + { + "title": "Song Myung", + "markdownDescription": "https://fonts.google.com/specimen/Song+Myung", + "const": "Song Myung" + }, + { + "title": "Sono", + "markdownDescription": "https://fonts.google.com/specimen/Sono", + "const": "Sono" + }, + { + "title": "Sonsie One", + "markdownDescription": "https://fonts.google.com/specimen/Sonsie+One", + "const": "Sonsie One" + }, + { + "title": "Sora", + "markdownDescription": "https://fonts.google.com/specimen/Sora", + "const": "Sora" + }, + { + "title": "Sorts Mill Goudy", + "markdownDescription": "https://fonts.google.com/specimen/Sorts+Mill+Goudy", + "const": "Sorts Mill Goudy" + }, + { + "title": "Source Code Pro", + "markdownDescription": "https://fonts.google.com/specimen/Source+Code+Pro", + "const": "Source Code Pro" + }, + { + "title": "Source Sans 3", + "markdownDescription": "https://fonts.google.com/specimen/Source+Sans+3", + "const": "Source Sans 3" + }, + { + "title": "Source Serif 4", + "markdownDescription": "https://fonts.google.com/specimen/Source+Serif+4", + "const": "Source Serif 4" + }, + { + "title": "Space Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Space+Grotesk", + "const": "Space Grotesk" + }, + { + "title": "Space Mono", + "markdownDescription": "https://fonts.google.com/specimen/Space+Mono", + "const": "Space Mono" + }, + { + "title": "Special Elite", + "markdownDescription": "https://fonts.google.com/specimen/Special+Elite", + "const": "Special Elite" + }, + { + "title": "Spectral", + "markdownDescription": "https://fonts.google.com/specimen/Spectral", + "const": "Spectral" + }, + { + "title": "Spectral SC", + "markdownDescription": "https://fonts.google.com/specimen/Spectral+SC", + "const": "Spectral SC" + }, + { + "title": "Spicy Rice", + "markdownDescription": "https://fonts.google.com/specimen/Spicy+Rice", + "const": "Spicy Rice" + }, + { + "title": "Spinnaker", + "markdownDescription": "https://fonts.google.com/specimen/Spinnaker", + "const": "Spinnaker" + }, + { + "title": "Spirax", + "markdownDescription": "https://fonts.google.com/specimen/Spirax", + "const": "Spirax" + }, + { + "title": "Splash", + "markdownDescription": "https://fonts.google.com/specimen/Splash", + "const": "Splash" + }, + { + "title": "Spline Sans", + "markdownDescription": "https://fonts.google.com/specimen/Spline+Sans", + "const": "Spline Sans" + }, + { + "title": "Spline Sans Mono", + "markdownDescription": "https://fonts.google.com/specimen/Spline+Sans+Mono", + "const": "Spline Sans Mono" + }, + { + "title": "Squada One", + "markdownDescription": "https://fonts.google.com/specimen/Squada+One", + "const": "Squada One" + }, + { + "title": "Square Peg", + "markdownDescription": "https://fonts.google.com/specimen/Square+Peg", + "const": "Square Peg" + }, + { + "title": "Sree Krushnadevaraya", + "markdownDescription": "https://fonts.google.com/specimen/Sree+Krushnadevaraya", + "const": "Sree Krushnadevaraya" + }, + { + "title": "Sriracha", + "markdownDescription": "https://fonts.google.com/specimen/Sriracha", + "const": "Sriracha" + }, + { + "title": "Srisakdi", + "markdownDescription": "https://fonts.google.com/specimen/Srisakdi", + "const": "Srisakdi" + }, + { + "title": "Staatliches", + "markdownDescription": "https://fonts.google.com/specimen/Staatliches", + "const": "Staatliches" + }, + { + "title": "Stalemate", + "markdownDescription": "https://fonts.google.com/specimen/Stalemate", + "const": "Stalemate" + }, + { + "title": "Stalinist One", + "markdownDescription": "https://fonts.google.com/specimen/Stalinist+One", + "const": "Stalinist One" + }, + { + "title": "Stardos Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Stardos+Stencil", + "const": "Stardos Stencil" + }, + { + "title": "Stick", + "markdownDescription": "https://fonts.google.com/specimen/Stick", + "const": "Stick" + }, + { + "title": "Stick No Bills", + "markdownDescription": "https://fonts.google.com/specimen/Stick+No+Bills", + "const": "Stick No Bills" + }, + { + "title": "Stint Ultra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Stint+Ultra+Condensed", + "const": "Stint Ultra Condensed" + }, + { + "title": "Stint Ultra Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Stint+Ultra+Expanded", + "const": "Stint Ultra Expanded" + }, + { + "title": "Stoke", + "markdownDescription": "https://fonts.google.com/specimen/Stoke", + "const": "Stoke" + }, + { + "title": "Strait", + "markdownDescription": "https://fonts.google.com/specimen/Strait", + "const": "Strait" + }, + { + "title": "Style Script", + "markdownDescription": "https://fonts.google.com/specimen/Style+Script", + "const": "Style Script" + }, + { + "title": "Stylish", + "markdownDescription": "https://fonts.google.com/specimen/Stylish", + "const": "Stylish" + }, + { + "title": "Sue Ellen Francisco", + "markdownDescription": "https://fonts.google.com/specimen/Sue+Ellen+Francisco", + "const": "Sue Ellen Francisco" + }, + { + "title": "Suez One", + "markdownDescription": "https://fonts.google.com/specimen/Suez+One", + "const": "Suez One" + }, + { + "title": "Sulphur Point", + "markdownDescription": "https://fonts.google.com/specimen/Sulphur+Point", + "const": "Sulphur Point" + }, + { + "title": "Sumana", + "markdownDescription": "https://fonts.google.com/specimen/Sumana", + "const": "Sumana" + }, + { + "title": "Sunflower", + "markdownDescription": "https://fonts.google.com/specimen/Sunflower", + "const": "Sunflower" + }, + { + "title": "Sunshiney", + "markdownDescription": "https://fonts.google.com/specimen/Sunshiney", + "const": "Sunshiney" + }, + { + "title": "Supermercado One", + "markdownDescription": "https://fonts.google.com/specimen/Supermercado+One", + "const": "Supermercado One" + }, + { + "title": "Sura", + "markdownDescription": "https://fonts.google.com/specimen/Sura", + "const": "Sura" + }, + { + "title": "Suranna", + "markdownDescription": "https://fonts.google.com/specimen/Suranna", + "const": "Suranna" + }, + { + "title": "Suravaram", + "markdownDescription": "https://fonts.google.com/specimen/Suravaram", + "const": "Suravaram" + }, + { + "title": "Suwannaphum", + "markdownDescription": "https://fonts.google.com/specimen/Suwannaphum", + "const": "Suwannaphum" + }, + { + "title": "Swanky and Moo Moo", + "markdownDescription": "https://fonts.google.com/specimen/Swanky+and+Moo+Moo", + "const": "Swanky and Moo Moo" + }, + { + "title": "Syncopate", + "markdownDescription": "https://fonts.google.com/specimen/Syncopate", + "const": "Syncopate" + }, + { + "title": "Syne", + "markdownDescription": "https://fonts.google.com/specimen/Syne", + "const": "Syne" + }, + { + "title": "Syne Mono", + "markdownDescription": "https://fonts.google.com/specimen/Syne+Mono", + "const": "Syne Mono" + }, + { + "title": "Syne Tactile", + "markdownDescription": "https://fonts.google.com/specimen/Syne+Tactile", + "const": "Syne Tactile" + }, + { + "title": "Tai Heritage Pro", + "markdownDescription": "https://fonts.google.com/specimen/Tai+Heritage+Pro", + "const": "Tai Heritage Pro" + }, + { + "title": "Tajawal", + "markdownDescription": "https://fonts.google.com/specimen/Tajawal", + "const": "Tajawal" + }, + { + "title": "Tangerine", + "markdownDescription": "https://fonts.google.com/specimen/Tangerine", + "const": "Tangerine" + }, + { + "title": "Tapestry", + "markdownDescription": "https://fonts.google.com/specimen/Tapestry", + "const": "Tapestry" + }, + { + "title": "Taprom", + "markdownDescription": "https://fonts.google.com/specimen/Taprom", + "const": "Taprom" + }, + { + "title": "Tauri", + "markdownDescription": "https://fonts.google.com/specimen/Tauri", + "const": "Tauri" + }, + { + "title": "Taviraj", + "markdownDescription": "https://fonts.google.com/specimen/Taviraj", + "const": "Taviraj" + }, + { + "title": "Teko", + "markdownDescription": "https://fonts.google.com/specimen/Teko", + "const": "Teko" + }, + { + "title": "Tektur", + "markdownDescription": "https://fonts.google.com/specimen/Tektur", + "const": "Tektur" + }, + { + "title": "Telex", + "markdownDescription": "https://fonts.google.com/specimen/Telex", + "const": "Telex" + }, + { + "title": "Tenali Ramakrishna", + "markdownDescription": "https://fonts.google.com/specimen/Tenali+Ramakrishna", + "const": "Tenali Ramakrishna" + }, + { + "title": "Tenor Sans", + "markdownDescription": "https://fonts.google.com/specimen/Tenor+Sans", + "const": "Tenor Sans" + }, + { + "title": "Text Me One", + "markdownDescription": "https://fonts.google.com/specimen/Text+Me+One", + "const": "Text Me One" + }, + { + "title": "Texturina", + "markdownDescription": "https://fonts.google.com/specimen/Texturina", + "const": "Texturina" + }, + { + "title": "Thasadith", + "markdownDescription": "https://fonts.google.com/specimen/Thasadith", + "const": "Thasadith" + }, + { + "title": "The Girl Next Door", + "markdownDescription": "https://fonts.google.com/specimen/The+Girl+Next+Door", + "const": "The Girl Next Door" + }, + { + "title": "The Nautigal", + "markdownDescription": "https://fonts.google.com/specimen/The+Nautigal", + "const": "The Nautigal" + }, + { + "title": "Tienne", + "markdownDescription": "https://fonts.google.com/specimen/Tienne", + "const": "Tienne" + }, + { + "title": "Tillana", + "markdownDescription": "https://fonts.google.com/specimen/Tillana", + "const": "Tillana" + }, + { + "title": "Tilt Neon", + "markdownDescription": "https://fonts.google.com/specimen/Tilt+Neon", + "const": "Tilt Neon" + }, + { + "title": "Tilt Prism", + "markdownDescription": "https://fonts.google.com/specimen/Tilt+Prism", + "const": "Tilt Prism" + }, + { + "title": "Tilt Warp", + "markdownDescription": "https://fonts.google.com/specimen/Tilt+Warp", + "const": "Tilt Warp" + }, + { + "title": "Timmana", + "markdownDescription": "https://fonts.google.com/specimen/Timmana", + "const": "Timmana" + }, + { + "title": "Tinos", + "markdownDescription": "https://fonts.google.com/specimen/Tinos", + "const": "Tinos" + }, + { + "title": "Tiro Bangla", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Bangla", + "const": "Tiro Bangla" + }, + { + "title": "Tiro Devanagari Hindi", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Devanagari+Hindi", + "const": "Tiro Devanagari Hindi" + }, + { + "title": "Tiro Devanagari Marathi", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Devanagari+Marathi", + "const": "Tiro Devanagari Marathi" + }, + { + "title": "Tiro Devanagari Sanskrit", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Devanagari+Sanskrit", + "const": "Tiro Devanagari Sanskrit" + }, + { + "title": "Tiro Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Gurmukhi", + "const": "Tiro Gurmukhi" + }, + { + "title": "Tiro Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Kannada", + "const": "Tiro Kannada" + }, + { + "title": "Tiro Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Tamil", + "const": "Tiro Tamil" + }, + { + "title": "Tiro Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Telugu", + "const": "Tiro Telugu" + }, + { + "title": "Titan One", + "markdownDescription": "https://fonts.google.com/specimen/Titan+One", + "const": "Titan One" + }, + { + "title": "Titillium Web", + "markdownDescription": "https://fonts.google.com/specimen/Titillium+Web", + "const": "Titillium Web" + }, + { + "title": "Tomorrow", + "markdownDescription": "https://fonts.google.com/specimen/Tomorrow", + "const": "Tomorrow" + }, + { + "title": "Tourney", + "markdownDescription": "https://fonts.google.com/specimen/Tourney", + "const": "Tourney" + }, + { + "title": "Trade Winds", + "markdownDescription": "https://fonts.google.com/specimen/Trade+Winds", + "const": "Trade Winds" + }, + { + "title": "Train One", + "markdownDescription": "https://fonts.google.com/specimen/Train+One", + "const": "Train One" + }, + { + "title": "Trirong", + "markdownDescription": "https://fonts.google.com/specimen/Trirong", + "const": "Trirong" + }, + { + "title": "Trispace", + "markdownDescription": "https://fonts.google.com/specimen/Trispace", + "const": "Trispace" + }, + { + "title": "Trocchi", + "markdownDescription": "https://fonts.google.com/specimen/Trocchi", + "const": "Trocchi" + }, + { + "title": "Trochut", + "markdownDescription": "https://fonts.google.com/specimen/Trochut", + "const": "Trochut" + }, + { + "title": "Truculenta", + "markdownDescription": "https://fonts.google.com/specimen/Truculenta", + "const": "Truculenta" + }, + { + "title": "Trykker", + "markdownDescription": "https://fonts.google.com/specimen/Trykker", + "const": "Trykker" + }, + { + "title": "Tsukimi Rounded", + "markdownDescription": "https://fonts.google.com/specimen/Tsukimi+Rounded", + "const": "Tsukimi Rounded" + }, + { + "title": "Tulpen One", + "markdownDescription": "https://fonts.google.com/specimen/Tulpen+One", + "const": "Tulpen One" + }, + { + "title": "Turret Road", + "markdownDescription": "https://fonts.google.com/specimen/Turret+Road", + "const": "Turret Road" + }, + { + "title": "Twinkle Star", + "markdownDescription": "https://fonts.google.com/specimen/Twinkle+Star", + "const": "Twinkle Star" + }, + { + "title": "Ubuntu", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu", + "const": "Ubuntu" + }, + { + "title": "Ubuntu Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu+Condensed", + "const": "Ubuntu Condensed" + }, + { + "title": "Ubuntu Mono", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu+Mono", + "const": "Ubuntu Mono" + }, + { + "title": "Uchen", + "markdownDescription": "https://fonts.google.com/specimen/Uchen", + "const": "Uchen" + }, + { + "title": "Ultra", + "markdownDescription": "https://fonts.google.com/specimen/Ultra", + "const": "Ultra" + }, + { + "title": "Unbounded", + "markdownDescription": "https://fonts.google.com/specimen/Unbounded", + "const": "Unbounded" + }, + { + "title": "Uncial Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Uncial+Antiqua", + "const": "Uncial Antiqua" + }, + { + "title": "Underdog", + "markdownDescription": "https://fonts.google.com/specimen/Underdog", + "const": "Underdog" + }, + { + "title": "Unica One", + "markdownDescription": "https://fonts.google.com/specimen/Unica+One", + "const": "Unica One" + }, + { + "title": "UnifrakturCook", + "markdownDescription": "https://fonts.google.com/specimen/UnifrakturCook", + "const": "UnifrakturCook" + }, + { + "title": "UnifrakturMaguntia", + "markdownDescription": "https://fonts.google.com/specimen/UnifrakturMaguntia", + "const": "UnifrakturMaguntia" + }, + { + "title": "Unkempt", + "markdownDescription": "https://fonts.google.com/specimen/Unkempt", + "const": "Unkempt" + }, + { + "title": "Unlock", + "markdownDescription": "https://fonts.google.com/specimen/Unlock", + "const": "Unlock" + }, + { + "title": "Unna", + "markdownDescription": "https://fonts.google.com/specimen/Unna", + "const": "Unna" + }, + { + "title": "Updock", + "markdownDescription": "https://fonts.google.com/specimen/Updock", + "const": "Updock" + }, + { + "title": "Urbanist", + "markdownDescription": "https://fonts.google.com/specimen/Urbanist", + "const": "Urbanist" + }, + { + "title": "VT323", + "markdownDescription": "https://fonts.google.com/specimen/VT323", + "const": "VT323" + }, + { + "title": "Vampiro One", + "markdownDescription": "https://fonts.google.com/specimen/Vampiro+One", + "const": "Vampiro One" + }, + { + "title": "Varela", + "markdownDescription": "https://fonts.google.com/specimen/Varela", + "const": "Varela" + }, + { + "title": "Varela Round", + "markdownDescription": "https://fonts.google.com/specimen/Varela+Round", + "const": "Varela Round" + }, + { + "title": "Varta", + "markdownDescription": "https://fonts.google.com/specimen/Varta", + "const": "Varta" + }, + { + "title": "Vast Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Vast+Shadow", + "const": "Vast Shadow" + }, + { + "title": "Vazirmatn", + "markdownDescription": "https://fonts.google.com/specimen/Vazirmatn", + "const": "Vazirmatn" + }, + { + "title": "Vesper Libre", + "markdownDescription": "https://fonts.google.com/specimen/Vesper+Libre", + "const": "Vesper Libre" + }, + { + "title": "Viaoda Libre", + "markdownDescription": "https://fonts.google.com/specimen/Viaoda+Libre", + "const": "Viaoda Libre" + }, + { + "title": "Vibes", + "markdownDescription": "https://fonts.google.com/specimen/Vibes", + "const": "Vibes" + }, + { + "title": "Vibur", + "markdownDescription": "https://fonts.google.com/specimen/Vibur", + "const": "Vibur" + }, + { + "title": "Victor Mono", + "markdownDescription": "https://fonts.google.com/specimen/Victor+Mono", + "const": "Victor Mono" + }, + { + "title": "Vidaloka", + "markdownDescription": "https://fonts.google.com/specimen/Vidaloka", + "const": "Vidaloka" + }, + { + "title": "Viga", + "markdownDescription": "https://fonts.google.com/specimen/Viga", + "const": "Viga" + }, + { + "title": "Vina Sans", + "markdownDescription": "https://fonts.google.com/specimen/Vina+Sans", + "const": "Vina Sans" + }, + { + "title": "Voces", + "markdownDescription": "https://fonts.google.com/specimen/Voces", + "const": "Voces" + }, + { + "title": "Volkhov", + "markdownDescription": "https://fonts.google.com/specimen/Volkhov", + "const": "Volkhov" + }, + { + "title": "Vollkorn", + "markdownDescription": "https://fonts.google.com/specimen/Vollkorn", + "const": "Vollkorn" + }, + { + "title": "Vollkorn SC", + "markdownDescription": "https://fonts.google.com/specimen/Vollkorn+SC", + "const": "Vollkorn SC" + }, + { + "title": "Voltaire", + "markdownDescription": "https://fonts.google.com/specimen/Voltaire", + "const": "Voltaire" + }, + { + "title": "Vujahday Script", + "markdownDescription": "https://fonts.google.com/specimen/Vujahday+Script", + "const": "Vujahday Script" + }, + { + "title": "Waiting for the Sunrise", + "markdownDescription": "https://fonts.google.com/specimen/Waiting+for+the+Sunrise", + "const": "Waiting for the Sunrise" + }, + { + "title": "Wallpoet", + "markdownDescription": "https://fonts.google.com/specimen/Wallpoet", + "const": "Wallpoet" + }, + { + "title": "Walter Turncoat", + "markdownDescription": "https://fonts.google.com/specimen/Walter+Turncoat", + "const": "Walter Turncoat" + }, + { + "title": "Warnes", + "markdownDescription": "https://fonts.google.com/specimen/Warnes", + "const": "Warnes" + }, + { + "title": "Water Brush", + "markdownDescription": "https://fonts.google.com/specimen/Water+Brush", + "const": "Water Brush" + }, + { + "title": "Waterfall", + "markdownDescription": "https://fonts.google.com/specimen/Waterfall", + "const": "Waterfall" + }, + { + "title": "Wavefont", + "markdownDescription": "https://fonts.google.com/specimen/Wavefont", + "const": "Wavefont" + }, + { + "title": "Wellfleet", + "markdownDescription": "https://fonts.google.com/specimen/Wellfleet", + "const": "Wellfleet" + }, + { + "title": "Wendy One", + "markdownDescription": "https://fonts.google.com/specimen/Wendy+One", + "const": "Wendy One" + }, + { + "title": "Whisper", + "markdownDescription": "https://fonts.google.com/specimen/Whisper", + "const": "Whisper" + }, + { + "title": "WindSong", + "markdownDescription": "https://fonts.google.com/specimen/WindSong", + "const": "WindSong" + }, + { + "title": "Wire One", + "markdownDescription": "https://fonts.google.com/specimen/Wire+One", + "const": "Wire One" + }, + { + "title": "Wix Madefor Display", + "markdownDescription": "https://fonts.google.com/specimen/Wix+Madefor+Display", + "const": "Wix Madefor Display" + }, + { + "title": "Wix Madefor Text", + "markdownDescription": "https://fonts.google.com/specimen/Wix+Madefor+Text", + "const": "Wix Madefor Text" + }, + { + "title": "Work Sans", + "markdownDescription": "https://fonts.google.com/specimen/Work+Sans", + "const": "Work Sans" + }, + { + "title": "Xanh Mono", + "markdownDescription": "https://fonts.google.com/specimen/Xanh+Mono", + "const": "Xanh Mono" + }, + { + "title": "Yaldevi", + "markdownDescription": "https://fonts.google.com/specimen/Yaldevi", + "const": "Yaldevi" + }, + { + "title": "Yanone Kaffeesatz", + "markdownDescription": "https://fonts.google.com/specimen/Yanone+Kaffeesatz", + "const": "Yanone Kaffeesatz" + }, + { + "title": "Yantramanav", + "markdownDescription": "https://fonts.google.com/specimen/Yantramanav", + "const": "Yantramanav" + }, + { + "title": "Yatra One", + "markdownDescription": "https://fonts.google.com/specimen/Yatra+One", + "const": "Yatra One" + }, + { + "title": "Yellowtail", + "markdownDescription": "https://fonts.google.com/specimen/Yellowtail", + "const": "Yellowtail" + }, + { + "title": "Yeon Sung", + "markdownDescription": "https://fonts.google.com/specimen/Yeon+Sung", + "const": "Yeon Sung" + }, + { + "title": "Yeseva One", + "markdownDescription": "https://fonts.google.com/specimen/Yeseva+One", + "const": "Yeseva One" + }, + { + "title": "Yesteryear", + "markdownDescription": "https://fonts.google.com/specimen/Yesteryear", + "const": "Yesteryear" + }, + { + "title": "Yomogi", + "markdownDescription": "https://fonts.google.com/specimen/Yomogi", + "const": "Yomogi" + }, + { + "title": "Young Serif", + "markdownDescription": "https://fonts.google.com/specimen/Young+Serif", + "const": "Young Serif" + }, + { + "title": "Yrsa", + "markdownDescription": "https://fonts.google.com/specimen/Yrsa", + "const": "Yrsa" + }, + { + "title": "Ysabeau", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau", + "const": "Ysabeau" + }, + { + "title": "Ysabeau Infant", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau+Infant", + "const": "Ysabeau Infant" + }, + { + "title": "Ysabeau Office", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau+Office", + "const": "Ysabeau Office" + }, + { + "title": "Ysabeau SC", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau+SC", + "const": "Ysabeau SC" + }, + { + "title": "Yuji Boku", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Boku", + "const": "Yuji Boku" + }, + { + "title": "Yuji Hentaigana Akari", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Hentaigana+Akari", + "const": "Yuji Hentaigana Akari" + }, + { + "title": "Yuji Hentaigana Akebono", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Hentaigana+Akebono", + "const": "Yuji Hentaigana Akebono" + }, + { + "title": "Yuji Mai", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Mai", + "const": "Yuji Mai" + }, + { + "title": "Yuji Syuku", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Syuku", + "const": "Yuji Syuku" + }, + { + "title": "Yusei Magic", + "markdownDescription": "https://fonts.google.com/specimen/Yusei+Magic", + "const": "Yusei Magic" + }, + { + "title": "ZCOOL KuaiLe", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+KuaiLe", + "const": "ZCOOL KuaiLe" + }, + { + "title": "ZCOOL QingKe HuangYou", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+QingKe+HuangYou", + "const": "ZCOOL QingKe HuangYou" + }, + { + "title": "ZCOOL XiaoWei", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+XiaoWei", + "const": "ZCOOL XiaoWei" + }, + { + "title": "Zen Antique", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Antique", + "const": "Zen Antique" + }, + { + "title": "Zen Antique Soft", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Antique+Soft", + "const": "Zen Antique Soft" + }, + { + "title": "Zen Dots", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Dots", + "const": "Zen Dots" + }, + { + "title": "Zen Kaku Gothic Antique", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Kaku+Gothic+Antique", + "const": "Zen Kaku Gothic Antique" + }, + { + "title": "Zen Kaku Gothic New", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Kaku+Gothic+New", + "const": "Zen Kaku Gothic New" + }, + { + "title": "Zen Kurenaido", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Kurenaido", + "const": "Zen Kurenaido" + }, + { + "title": "Zen Loop", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Loop", + "const": "Zen Loop" + }, + { + "title": "Zen Maru Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Maru+Gothic", + "const": "Zen Maru Gothic" + }, + { + "title": "Zen Old Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Old+Mincho", + "const": "Zen Old Mincho" + }, + { + "title": "Zen Tokyo Zoo", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Tokyo+Zoo", + "const": "Zen Tokyo Zoo" + }, + { + "title": "Zeyada", + "markdownDescription": "https://fonts.google.com/specimen/Zeyada", + "const": "Zeyada" + }, + { + "title": "Zhi Mang Xing", + "markdownDescription": "https://fonts.google.com/specimen/Zhi+Mang+Xing", + "const": "Zhi Mang Xing" + }, + { + "title": "Zilla Slab", + "markdownDescription": "https://fonts.google.com/specimen/Zilla+Slab", + "const": "Zilla Slab" + }, + { + "title": "Zilla Slab Highlight", + "markdownDescription": "https://fonts.google.com/specimen/Zilla+Slab+Highlight", + "const": "Zilla Slab Highlight" + } + ] +} \ No newline at end of file diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/assets/icons.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/assets/icons.json new file mode 100644 index 0000000..89f0c1f --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/assets/icons.json @@ -0,0 +1,14341 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/#search", + "type": "string", + "enum": [ + "fontawesome/brands/11ty", + "fontawesome/brands/42-group", + "fontawesome/brands/500px", + "fontawesome/brands/accessible-icon", + "fontawesome/brands/accusoft", + "fontawesome/brands/adn", + "fontawesome/brands/adversal", + "fontawesome/brands/affiliatetheme", + "fontawesome/brands/airbnb", + "fontawesome/brands/algolia", + "fontawesome/brands/alipay", + "fontawesome/brands/amazon-pay", + "fontawesome/brands/amazon", + "fontawesome/brands/amilia", + "fontawesome/brands/android", + "fontawesome/brands/angellist", + "fontawesome/brands/angrycreative", + "fontawesome/brands/angular", + "fontawesome/brands/app-store-ios", + "fontawesome/brands/app-store", + "fontawesome/brands/apper", + "fontawesome/brands/apple-pay", + "fontawesome/brands/apple", + "fontawesome/brands/artstation", + "fontawesome/brands/asymmetrik", + "fontawesome/brands/atlassian", + "fontawesome/brands/audible", + "fontawesome/brands/autoprefixer", + "fontawesome/brands/avianex", + "fontawesome/brands/aviato", + "fontawesome/brands/aws", + "fontawesome/brands/bandcamp", + "fontawesome/brands/battle-net", + "fontawesome/brands/behance-square", + "fontawesome/brands/behance", + "fontawesome/brands/bilibili", + "fontawesome/brands/bimobject", + "fontawesome/brands/bitbucket", + "fontawesome/brands/bitcoin", + "fontawesome/brands/bity", + "fontawesome/brands/black-tie", + "fontawesome/brands/blackberry", + "fontawesome/brands/blogger-b", + "fontawesome/brands/blogger", + "fontawesome/brands/bluesky", + "fontawesome/brands/bluetooth-b", + "fontawesome/brands/bluetooth", + "fontawesome/brands/bootstrap", + "fontawesome/brands/bots", + "fontawesome/brands/brave-reverse", + "fontawesome/brands/brave", + "fontawesome/brands/btc", + "fontawesome/brands/buffer", + "fontawesome/brands/buromobelexperte", + "fontawesome/brands/buy-n-large", + "fontawesome/brands/buysellads", + "fontawesome/brands/canadian-maple-leaf", + "fontawesome/brands/cash-app", + "fontawesome/brands/cc-amazon-pay", + "fontawesome/brands/cc-amex", + "fontawesome/brands/cc-apple-pay", + "fontawesome/brands/cc-diners-club", + "fontawesome/brands/cc-discover", + "fontawesome/brands/cc-jcb", + "fontawesome/brands/cc-mastercard", + "fontawesome/brands/cc-paypal", + "fontawesome/brands/cc-stripe", + "fontawesome/brands/cc-visa", + "fontawesome/brands/centercode", + "fontawesome/brands/centos", + "fontawesome/brands/chrome", + "fontawesome/brands/chromecast", + "fontawesome/brands/cloudflare", + "fontawesome/brands/cloudscale", + "fontawesome/brands/cloudsmith", + "fontawesome/brands/cloudversify", + "fontawesome/brands/cmplid", + "fontawesome/brands/codepen", + "fontawesome/brands/codiepie", + "fontawesome/brands/confluence", + "fontawesome/brands/connectdevelop", + "fontawesome/brands/contao", + "fontawesome/brands/cotton-bureau", + "fontawesome/brands/cpanel", + "fontawesome/brands/creative-commons-by", + "fontawesome/brands/creative-commons-nc-eu", + "fontawesome/brands/creative-commons-nc-jp", + "fontawesome/brands/creative-commons-nc", + "fontawesome/brands/creative-commons-nd", + "fontawesome/brands/creative-commons-pd-alt", + "fontawesome/brands/creative-commons-pd", + "fontawesome/brands/creative-commons-remix", + "fontawesome/brands/creative-commons-sa", + "fontawesome/brands/creative-commons-sampling-plus", + "fontawesome/brands/creative-commons-sampling", + "fontawesome/brands/creative-commons-share", + "fontawesome/brands/creative-commons-zero", + "fontawesome/brands/creative-commons", + "fontawesome/brands/critical-role", + "fontawesome/brands/css", + "fontawesome/brands/css3-alt", + "fontawesome/brands/css3", + "fontawesome/brands/cuttlefish", + "fontawesome/brands/d-and-d-beyond", + "fontawesome/brands/d-and-d", + "fontawesome/brands/dailymotion", + "fontawesome/brands/dart-lang", + "fontawesome/brands/dashcube", + "fontawesome/brands/debian", + "fontawesome/brands/deezer", + "fontawesome/brands/delicious", + "fontawesome/brands/deploydog", + "fontawesome/brands/deskpro", + "fontawesome/brands/dev", + "fontawesome/brands/deviantart", + "fontawesome/brands/dhl", + "fontawesome/brands/diaspora", + "fontawesome/brands/digg", + "fontawesome/brands/digital-ocean", + "fontawesome/brands/discord", + "fontawesome/brands/discourse", + "fontawesome/brands/disqus", + "fontawesome/brands/dochub", + "fontawesome/brands/docker", + "fontawesome/brands/draft2digital", + "fontawesome/brands/dribbble-square", + "fontawesome/brands/dribbble", + "fontawesome/brands/dropbox", + "fontawesome/brands/drupal", + "fontawesome/brands/duolingo", + "fontawesome/brands/dyalog", + "fontawesome/brands/earlybirds", + "fontawesome/brands/ebay", + "fontawesome/brands/edge-legacy", + "fontawesome/brands/edge", + "fontawesome/brands/elementor", + "fontawesome/brands/eleventy", + "fontawesome/brands/ello", + "fontawesome/brands/ember", + "fontawesome/brands/empire", + "fontawesome/brands/envira", + "fontawesome/brands/erlang", + "fontawesome/brands/ethereum", + "fontawesome/brands/etsy", + "fontawesome/brands/evernote", + "fontawesome/brands/expeditedssl", + "fontawesome/brands/facebook-f", + "fontawesome/brands/facebook-messenger", + "fontawesome/brands/facebook-square", + "fontawesome/brands/facebook", + "fontawesome/brands/fantasy-flight-games", + "fontawesome/brands/fedex", + "fontawesome/brands/fedora", + "fontawesome/brands/figma", + "fontawesome/brands/files-pinwheel", + "fontawesome/brands/firefox-browser", + "fontawesome/brands/firefox", + "fontawesome/brands/first-order-alt", + "fontawesome/brands/first-order", + "fontawesome/brands/firstdraft", + "fontawesome/brands/flickr", + "fontawesome/brands/flipboard", + "fontawesome/brands/flutter", + "fontawesome/brands/fly", + "fontawesome/brands/font-awesome-alt", + "fontawesome/brands/font-awesome-flag", + "fontawesome/brands/font-awesome-logo-full", + "fontawesome/brands/font-awesome", + "fontawesome/brands/fonticons-fi", + "fontawesome/brands/fonticons", + "fontawesome/brands/fort-awesome-alt", + "fontawesome/brands/fort-awesome", + "fontawesome/brands/forumbee", + "fontawesome/brands/foursquare", + "fontawesome/brands/free-code-camp", + "fontawesome/brands/freebsd", + "fontawesome/brands/fulcrum", + "fontawesome/brands/galactic-republic", + "fontawesome/brands/galactic-senate", + "fontawesome/brands/get-pocket", + "fontawesome/brands/gg-circle", + "fontawesome/brands/gg", + "fontawesome/brands/git-alt", + "fontawesome/brands/git-square", + "fontawesome/brands/git", + "fontawesome/brands/github-alt", + "fontawesome/brands/github-square", + "fontawesome/brands/github", + "fontawesome/brands/gitkraken", + "fontawesome/brands/gitlab-square", + "fontawesome/brands/gitlab", + "fontawesome/brands/gitter", + "fontawesome/brands/glide-g", + "fontawesome/brands/glide", + "fontawesome/brands/gofore", + "fontawesome/brands/golang", + "fontawesome/brands/goodreads-g", + "fontawesome/brands/goodreads", + "fontawesome/brands/google-drive", + "fontawesome/brands/google-pay", + "fontawesome/brands/google-play", + "fontawesome/brands/google-plus-g", + "fontawesome/brands/google-plus-square", + "fontawesome/brands/google-plus", + "fontawesome/brands/google-scholar", + "fontawesome/brands/google-wallet", + "fontawesome/brands/google", + "fontawesome/brands/gratipay", + "fontawesome/brands/grav", + "fontawesome/brands/gripfire", + "fontawesome/brands/grunt", + "fontawesome/brands/guilded", + "fontawesome/brands/gulp", + "fontawesome/brands/hacker-news-square", + "fontawesome/brands/hacker-news", + "fontawesome/brands/hackerrank", + "fontawesome/brands/hashnode", + "fontawesome/brands/hips", + "fontawesome/brands/hire-a-helper", + "fontawesome/brands/hive", + "fontawesome/brands/hooli", + "fontawesome/brands/hornbill", + "fontawesome/brands/hotjar", + "fontawesome/brands/houzz", + "fontawesome/brands/html5", + "fontawesome/brands/hubspot", + "fontawesome/brands/ideal", + "fontawesome/brands/imdb", + "fontawesome/brands/innosoft", + "fontawesome/brands/instagram-square", + "fontawesome/brands/instagram", + "fontawesome/brands/instalod", + "fontawesome/brands/intercom", + "fontawesome/brands/internet-explorer", + "fontawesome/brands/invision", + "fontawesome/brands/ioxhost", + "fontawesome/brands/itch-io", + "fontawesome/brands/itunes-note", + "fontawesome/brands/itunes", + "fontawesome/brands/java", + "fontawesome/brands/jedi-order", + "fontawesome/brands/jenkins", + "fontawesome/brands/jira", + "fontawesome/brands/joget", + "fontawesome/brands/joomla", + "fontawesome/brands/js-square", + "fontawesome/brands/js", + "fontawesome/brands/jsfiddle", + "fontawesome/brands/jxl", + "fontawesome/brands/kaggle", + "fontawesome/brands/kakao-talk", + "fontawesome/brands/keybase", + "fontawesome/brands/keycdn", + "fontawesome/brands/kickstarter-k", + "fontawesome/brands/kickstarter", + "fontawesome/brands/korvue", + "fontawesome/brands/laravel", + "fontawesome/brands/lastfm-square", + "fontawesome/brands/lastfm", + "fontawesome/brands/leanpub", + "fontawesome/brands/less", + "fontawesome/brands/letterboxd", + "fontawesome/brands/line", + "fontawesome/brands/linkedin-in", + "fontawesome/brands/linkedin", + "fontawesome/brands/linktree", + "fontawesome/brands/linode", + "fontawesome/brands/linux", + "fontawesome/brands/lumon-drop", + "fontawesome/brands/lumon", + "fontawesome/brands/lyft", + "fontawesome/brands/magento", + "fontawesome/brands/mailchimp", + "fontawesome/brands/mandalorian", + "fontawesome/brands/markdown", + "fontawesome/brands/mastodon", + "fontawesome/brands/maxcdn", + "fontawesome/brands/mdb", + "fontawesome/brands/medapps", + "fontawesome/brands/medium-m", + "fontawesome/brands/medium", + "fontawesome/brands/medrt", + "fontawesome/brands/meetup", + "fontawesome/brands/megaport", + "fontawesome/brands/mendeley", + "fontawesome/brands/meta", + "fontawesome/brands/microblog", + "fontawesome/brands/microsoft", + "fontawesome/brands/mintbit", + "fontawesome/brands/mix", + "fontawesome/brands/mixcloud", + "fontawesome/brands/mixer", + "fontawesome/brands/mizuni", + "fontawesome/brands/modx", + "fontawesome/brands/monero", + "fontawesome/brands/napster", + "fontawesome/brands/neos", + "fontawesome/brands/nfc-directional", + "fontawesome/brands/nfc-symbol", + "fontawesome/brands/nimblr", + "fontawesome/brands/node-js", + "fontawesome/brands/node", + "fontawesome/brands/notion", + "fontawesome/brands/npm", + "fontawesome/brands/ns8", + "fontawesome/brands/nutritionix", + "fontawesome/brands/octopus-deploy", + "fontawesome/brands/odnoklassniki-square", + "fontawesome/brands/odnoklassniki", + "fontawesome/brands/odysee", + "fontawesome/brands/old-republic", + "fontawesome/brands/openai", + "fontawesome/brands/opencart", + "fontawesome/brands/openid", + "fontawesome/brands/opensuse", + "fontawesome/brands/opera", + "fontawesome/brands/optin-monster", + "fontawesome/brands/orcid", + "fontawesome/brands/osi", + "fontawesome/brands/padlet", + "fontawesome/brands/page4", + "fontawesome/brands/pagelines", + "fontawesome/brands/palfed", + "fontawesome/brands/pandora", + "fontawesome/brands/patreon", + "fontawesome/brands/paypal", + "fontawesome/brands/perbyte", + "fontawesome/brands/periscope", + "fontawesome/brands/phabricator", + "fontawesome/brands/phoenix-framework", + "fontawesome/brands/phoenix-squadron", + "fontawesome/brands/php", + "fontawesome/brands/pied-piper-alt", + "fontawesome/brands/pied-piper-hat", + "fontawesome/brands/pied-piper-pp", + "fontawesome/brands/pied-piper-square", + "fontawesome/brands/pied-piper", + "fontawesome/brands/pinterest-p", + "fontawesome/brands/pinterest-square", + "fontawesome/brands/pinterest", + "fontawesome/brands/pix", + "fontawesome/brands/pixelfed", + "fontawesome/brands/pixiv", + "fontawesome/brands/playstation", + "fontawesome/brands/product-hunt", + "fontawesome/brands/pushed", + "fontawesome/brands/python", + "fontawesome/brands/qq", + "fontawesome/brands/quinscape", + "fontawesome/brands/quora", + "fontawesome/brands/r-project", + "fontawesome/brands/raspberry-pi", + "fontawesome/brands/ravelry", + "fontawesome/brands/react", + "fontawesome/brands/reacteurope", + "fontawesome/brands/readme", + "fontawesome/brands/rebel", + "fontawesome/brands/red-river", + "fontawesome/brands/reddit-alien", + "fontawesome/brands/reddit-square", + "fontawesome/brands/reddit", + "fontawesome/brands/redhat", + "fontawesome/brands/rendact", + "fontawesome/brands/renren", + "fontawesome/brands/replyd", + "fontawesome/brands/researchgate", + "fontawesome/brands/resolving", + "fontawesome/brands/rev", + "fontawesome/brands/rocketchat", + "fontawesome/brands/rockrms", + "fontawesome/brands/rust", + "fontawesome/brands/safari", + "fontawesome/brands/salesforce", + "fontawesome/brands/sass", + "fontawesome/brands/schlix", + "fontawesome/brands/screenpal", + "fontawesome/brands/scribd", + "fontawesome/brands/searchengin", + "fontawesome/brands/sellcast", + "fontawesome/brands/sellsy", + "fontawesome/brands/servicestack", + "fontawesome/brands/shirtsinbulk", + "fontawesome/brands/shoelace", + "fontawesome/brands/shopify", + "fontawesome/brands/shopware", + "fontawesome/brands/signal-messenger", + "fontawesome/brands/simplybuilt", + "fontawesome/brands/sistrix", + "fontawesome/brands/sith", + "fontawesome/brands/sitrox", + "fontawesome/brands/sketch", + "fontawesome/brands/skyatlas", + "fontawesome/brands/skype", + "fontawesome/brands/slack-hash", + "fontawesome/brands/slack", + "fontawesome/brands/slideshare", + "fontawesome/brands/snapchat-ghost", + "fontawesome/brands/snapchat-square", + "fontawesome/brands/snapchat", + "fontawesome/brands/soundcloud", + "fontawesome/brands/sourcetree", + "fontawesome/brands/space-awesome", + "fontawesome/brands/speakap", + "fontawesome/brands/speaker-deck", + "fontawesome/brands/spotify", + "fontawesome/brands/square-behance", + "fontawesome/brands/square-bluesky", + "fontawesome/brands/square-dribbble", + "fontawesome/brands/square-facebook", + "fontawesome/brands/square-figma", + "fontawesome/brands/square-font-awesome-stroke", + "fontawesome/brands/square-font-awesome", + "fontawesome/brands/square-git", + "fontawesome/brands/square-github", + "fontawesome/brands/square-gitlab", + "fontawesome/brands/square-google-plus", + "fontawesome/brands/square-hacker-news", + "fontawesome/brands/square-instagram", + "fontawesome/brands/square-js", + "fontawesome/brands/square-kickstarter", + "fontawesome/brands/square-lastfm", + "fontawesome/brands/square-letterboxd", + "fontawesome/brands/square-linkedin", + "fontawesome/brands/square-odnoklassniki", + "fontawesome/brands/square-pied-piper", + "fontawesome/brands/square-pinterest", + "fontawesome/brands/square-reddit", + "fontawesome/brands/square-snapchat", + "fontawesome/brands/square-steam", + "fontawesome/brands/square-threads", + "fontawesome/brands/square-tumblr", + "fontawesome/brands/square-twitter", + "fontawesome/brands/square-upwork", + "fontawesome/brands/square-viadeo", + "fontawesome/brands/square-vimeo", + "fontawesome/brands/square-web-awesome-stroke", + "fontawesome/brands/square-web-awesome", + "fontawesome/brands/square-whatsapp", + "fontawesome/brands/square-x-twitter", + "fontawesome/brands/square-xing", + "fontawesome/brands/square-youtube", + "fontawesome/brands/squarespace", + "fontawesome/brands/stack-exchange", + "fontawesome/brands/stack-overflow", + "fontawesome/brands/stackpath", + "fontawesome/brands/staylinked", + "fontawesome/brands/steam-square", + "fontawesome/brands/steam-symbol", + "fontawesome/brands/steam", + "fontawesome/brands/sticker-mule", + "fontawesome/brands/strava", + "fontawesome/brands/stripe-s", + "fontawesome/brands/stripe", + "fontawesome/brands/stubber", + "fontawesome/brands/studiovinari", + "fontawesome/brands/stumbleupon-circle", + "fontawesome/brands/stumbleupon", + "fontawesome/brands/superpowers", + "fontawesome/brands/supple", + "fontawesome/brands/suse", + "fontawesome/brands/swift", + "fontawesome/brands/symfony", + "fontawesome/brands/teamspeak", + "fontawesome/brands/telegram-plane", + "fontawesome/brands/telegram", + "fontawesome/brands/tencent-weibo", + "fontawesome/brands/tex", + "fontawesome/brands/the-red-yeti", + "fontawesome/brands/themeco", + "fontawesome/brands/themeisle", + "fontawesome/brands/think-peaks", + "fontawesome/brands/threads", + "fontawesome/brands/tidal", + "fontawesome/brands/tiktok", + "fontawesome/brands/trade-federation", + "fontawesome/brands/trello", + "fontawesome/brands/tumblr-square", + "fontawesome/brands/tumblr", + "fontawesome/brands/twitch", + "fontawesome/brands/twitter-square", + "fontawesome/brands/twitter", + "fontawesome/brands/typo3", + "fontawesome/brands/uber", + "fontawesome/brands/ubuntu", + "fontawesome/brands/uikit", + "fontawesome/brands/umbraco", + "fontawesome/brands/uncharted", + "fontawesome/brands/uniregistry", + "fontawesome/brands/unity", + "fontawesome/brands/unsplash", + "fontawesome/brands/untappd", + "fontawesome/brands/ups", + "fontawesome/brands/upwork", + "fontawesome/brands/usb", + "fontawesome/brands/usps", + "fontawesome/brands/ussunnah", + "fontawesome/brands/vaadin", + "fontawesome/brands/viacoin", + "fontawesome/brands/viadeo-square", + "fontawesome/brands/viadeo", + "fontawesome/brands/viber", + "fontawesome/brands/vimeo-square", + "fontawesome/brands/vimeo-v", + "fontawesome/brands/vimeo", + "fontawesome/brands/vine", + "fontawesome/brands/vk", + "fontawesome/brands/vnv", + "fontawesome/brands/vsco", + "fontawesome/brands/vuejs", + "fontawesome/brands/w3c", + "fontawesome/brands/watchman-monitoring", + "fontawesome/brands/waze", + "fontawesome/brands/web-awesome", + "fontawesome/brands/webflow", + "fontawesome/brands/weebly", + "fontawesome/brands/weibo", + "fontawesome/brands/weixin", + "fontawesome/brands/whatsapp-square", + "fontawesome/brands/whatsapp", + "fontawesome/brands/whmcs", + "fontawesome/brands/wikipedia-w", + "fontawesome/brands/windows", + "fontawesome/brands/wirsindhandwerk", + "fontawesome/brands/wix", + "fontawesome/brands/wizards-of-the-coast", + "fontawesome/brands/wodu", + "fontawesome/brands/wolf-pack-battalion", + "fontawesome/brands/wordpress-simple", + "fontawesome/brands/wordpress", + "fontawesome/brands/wpbeginner", + "fontawesome/brands/wpexplorer", + "fontawesome/brands/wpforms", + "fontawesome/brands/wpressr", + "fontawesome/brands/wsh", + "fontawesome/brands/x-twitter", + "fontawesome/brands/xbox", + "fontawesome/brands/xing-square", + "fontawesome/brands/xing", + "fontawesome/brands/y-combinator", + "fontawesome/brands/yahoo", + "fontawesome/brands/yammer", + "fontawesome/brands/yandex-international", + "fontawesome/brands/yandex", + "fontawesome/brands/yarn", + "fontawesome/brands/yelp", + "fontawesome/brands/yoast", + "fontawesome/brands/youtube-square", + "fontawesome/brands/youtube", + "fontawesome/brands/zhihu", + "fontawesome/regular/address-book", + "fontawesome/regular/address-card", + "fontawesome/regular/alarm-clock", + "fontawesome/regular/angry", + "fontawesome/regular/arrow-alt-circle-down", + "fontawesome/regular/arrow-alt-circle-left", + "fontawesome/regular/arrow-alt-circle-right", + "fontawesome/regular/arrow-alt-circle-up", + "fontawesome/regular/bar-chart", + "fontawesome/regular/bell-slash", + "fontawesome/regular/bell", + "fontawesome/regular/bookmark", + "fontawesome/regular/building", + "fontawesome/regular/calendar-alt", + "fontawesome/regular/calendar-check", + "fontawesome/regular/calendar-days", + "fontawesome/regular/calendar-minus", + "fontawesome/regular/calendar-plus", + "fontawesome/regular/calendar-times", + "fontawesome/regular/calendar-xmark", + "fontawesome/regular/calendar", + "fontawesome/regular/camera-alt", + "fontawesome/regular/camera", + "fontawesome/regular/caret-square-down", + "fontawesome/regular/caret-square-left", + "fontawesome/regular/caret-square-right", + "fontawesome/regular/caret-square-up", + "fontawesome/regular/chart-bar", + "fontawesome/regular/check-circle", + "fontawesome/regular/check-square", + "fontawesome/regular/chess-bishop", + "fontawesome/regular/chess-king", + "fontawesome/regular/chess-knight", + "fontawesome/regular/chess-pawn", + "fontawesome/regular/chess-queen", + "fontawesome/regular/chess-rook", + "fontawesome/regular/circle-check", + "fontawesome/regular/circle-dot", + "fontawesome/regular/circle-down", + "fontawesome/regular/circle-left", + "fontawesome/regular/circle-pause", + "fontawesome/regular/circle-play", + "fontawesome/regular/circle-question", + "fontawesome/regular/circle-right", + "fontawesome/regular/circle-stop", + "fontawesome/regular/circle-up", + "fontawesome/regular/circle-user", + "fontawesome/regular/circle-xmark", + "fontawesome/regular/circle", + "fontawesome/regular/clipboard", + "fontawesome/regular/clock-four", + "fontawesome/regular/clock", + "fontawesome/regular/clone", + "fontawesome/regular/closed-captioning", + "fontawesome/regular/cloud", + "fontawesome/regular/comment-alt", + "fontawesome/regular/comment-dots", + "fontawesome/regular/comment", + "fontawesome/regular/commenting", + "fontawesome/regular/comments", + "fontawesome/regular/compass", + "fontawesome/regular/contact-book", + "fontawesome/regular/contact-card", + "fontawesome/regular/copy", + "fontawesome/regular/copyright", + "fontawesome/regular/credit-card-alt", + "fontawesome/regular/credit-card", + "fontawesome/regular/dizzy", + "fontawesome/regular/dot-circle", + "fontawesome/regular/drivers-license", + "fontawesome/regular/edit", + "fontawesome/regular/envelope-open", + "fontawesome/regular/envelope", + "fontawesome/regular/eye-slash", + "fontawesome/regular/eye", + "fontawesome/regular/face-angry", + "fontawesome/regular/face-dizzy", + "fontawesome/regular/face-flushed", + "fontawesome/regular/face-frown-open", + "fontawesome/regular/face-frown", + "fontawesome/regular/face-grimace", + "fontawesome/regular/face-grin-beam-sweat", + "fontawesome/regular/face-grin-beam", + "fontawesome/regular/face-grin-hearts", + "fontawesome/regular/face-grin-squint-tears", + "fontawesome/regular/face-grin-squint", + "fontawesome/regular/face-grin-stars", + "fontawesome/regular/face-grin-tears", + "fontawesome/regular/face-grin-tongue-squint", + "fontawesome/regular/face-grin-tongue-wink", + "fontawesome/regular/face-grin-tongue", + "fontawesome/regular/face-grin-wide", + "fontawesome/regular/face-grin-wink", + "fontawesome/regular/face-grin", + "fontawesome/regular/face-kiss-beam", + "fontawesome/regular/face-kiss-wink-heart", + "fontawesome/regular/face-kiss", + "fontawesome/regular/face-laugh-beam", + "fontawesome/regular/face-laugh-squint", + "fontawesome/regular/face-laugh-wink", + "fontawesome/regular/face-laugh", + "fontawesome/regular/face-meh-blank", + "fontawesome/regular/face-meh", + "fontawesome/regular/face-rolling-eyes", + "fontawesome/regular/face-sad-cry", + "fontawesome/regular/face-sad-tear", + "fontawesome/regular/face-smile-beam", + "fontawesome/regular/face-smile-wink", + "fontawesome/regular/face-smile", + "fontawesome/regular/face-surprise", + "fontawesome/regular/face-tired", + "fontawesome/regular/file-alt", + "fontawesome/regular/file-archive", + "fontawesome/regular/file-audio", + "fontawesome/regular/file-clipboard", + "fontawesome/regular/file-code", + "fontawesome/regular/file-excel", + "fontawesome/regular/file-image", + "fontawesome/regular/file-lines", + "fontawesome/regular/file-pdf", + "fontawesome/regular/file-powerpoint", + "fontawesome/regular/file-text", + "fontawesome/regular/file-video", + "fontawesome/regular/file-word", + "fontawesome/regular/file-zipper", + "fontawesome/regular/file", + "fontawesome/regular/flag", + "fontawesome/regular/floppy-disk", + "fontawesome/regular/flushed", + "fontawesome/regular/folder-blank", + "fontawesome/regular/folder-closed", + "fontawesome/regular/folder-open", + "fontawesome/regular/folder", + "fontawesome/regular/font-awesome-flag", + "fontawesome/regular/font-awesome-logo-full", + "fontawesome/regular/font-awesome", + "fontawesome/regular/frown-open", + "fontawesome/regular/frown", + "fontawesome/regular/futbol-ball", + "fontawesome/regular/futbol", + "fontawesome/regular/gem", + "fontawesome/regular/grimace", + "fontawesome/regular/grin-alt", + "fontawesome/regular/grin-beam-sweat", + "fontawesome/regular/grin-beam", + "fontawesome/regular/grin-hearts", + "fontawesome/regular/grin-squint-tears", + "fontawesome/regular/grin-squint", + "fontawesome/regular/grin-stars", + "fontawesome/regular/grin-tears", + "fontawesome/regular/grin-tongue-squint", + "fontawesome/regular/grin-tongue-wink", + "fontawesome/regular/grin-tongue", + "fontawesome/regular/grin-wink", + "fontawesome/regular/grin", + "fontawesome/regular/hand-back-fist", + "fontawesome/regular/hand-lizard", + "fontawesome/regular/hand-paper", + "fontawesome/regular/hand-peace", + "fontawesome/regular/hand-point-down", + "fontawesome/regular/hand-point-left", + "fontawesome/regular/hand-point-right", + "fontawesome/regular/hand-point-up", + "fontawesome/regular/hand-pointer", + "fontawesome/regular/hand-rock", + "fontawesome/regular/hand-scissors", + "fontawesome/regular/hand-spock", + "fontawesome/regular/hand", + "fontawesome/regular/handshake-alt", + "fontawesome/regular/handshake-simple", + "fontawesome/regular/handshake", + "fontawesome/regular/hard-drive", + "fontawesome/regular/hdd", + "fontawesome/regular/headphones-alt", + "fontawesome/regular/headphones-simple", + "fontawesome/regular/headphones", + "fontawesome/regular/heart", + "fontawesome/regular/home-alt", + "fontawesome/regular/home-lg-alt", + "fontawesome/regular/home", + "fontawesome/regular/hospital-alt", + "fontawesome/regular/hospital-wide", + "fontawesome/regular/hospital", + "fontawesome/regular/hourglass-2", + "fontawesome/regular/hourglass-empty", + "fontawesome/regular/hourglass-half", + "fontawesome/regular/hourglass", + "fontawesome/regular/house", + "fontawesome/regular/id-badge", + "fontawesome/regular/id-card", + "fontawesome/regular/image", + "fontawesome/regular/images", + "fontawesome/regular/keyboard", + "fontawesome/regular/kiss-beam", + "fontawesome/regular/kiss-wink-heart", + "fontawesome/regular/kiss", + "fontawesome/regular/laugh-beam", + "fontawesome/regular/laugh-squint", + "fontawesome/regular/laugh-wink", + "fontawesome/regular/laugh", + "fontawesome/regular/lemon", + "fontawesome/regular/life-ring", + "fontawesome/regular/lightbulb", + "fontawesome/regular/list-alt", + "fontawesome/regular/map", + "fontawesome/regular/meh-blank", + "fontawesome/regular/meh-rolling-eyes", + "fontawesome/regular/meh", + "fontawesome/regular/message", + "fontawesome/regular/minus-square", + "fontawesome/regular/money-bill-1", + "fontawesome/regular/money-bill-alt", + "fontawesome/regular/moon", + "fontawesome/regular/newspaper", + "fontawesome/regular/note-sticky", + "fontawesome/regular/object-group", + "fontawesome/regular/object-ungroup", + "fontawesome/regular/paper-plane", + "fontawesome/regular/paste", + "fontawesome/regular/pause-circle", + "fontawesome/regular/pen-to-square", + "fontawesome/regular/play-circle", + "fontawesome/regular/plus-square", + "fontawesome/regular/question-circle", + "fontawesome/regular/rectangle-list", + "fontawesome/regular/rectangle-times", + "fontawesome/regular/rectangle-xmark", + "fontawesome/regular/registered", + "fontawesome/regular/sad-cry", + "fontawesome/regular/sad-tear", + "fontawesome/regular/save", + "fontawesome/regular/share-from-square", + "fontawesome/regular/share-square", + "fontawesome/regular/smile-beam", + "fontawesome/regular/smile-wink", + "fontawesome/regular/smile", + "fontawesome/regular/snowflake", + "fontawesome/regular/soccer-ball", + "fontawesome/regular/square-caret-down", + "fontawesome/regular/square-caret-left", + "fontawesome/regular/square-caret-right", + "fontawesome/regular/square-caret-up", + "fontawesome/regular/square-check", + "fontawesome/regular/square-full", + "fontawesome/regular/square-minus", + "fontawesome/regular/square-plus", + "fontawesome/regular/square", + "fontawesome/regular/star-half-alt", + "fontawesome/regular/star-half-stroke", + "fontawesome/regular/star-half", + "fontawesome/regular/star", + "fontawesome/regular/sticky-note", + "fontawesome/regular/stop-circle", + "fontawesome/regular/sun", + "fontawesome/regular/surprise", + "fontawesome/regular/thumbs-down", + "fontawesome/regular/thumbs-up", + "fontawesome/regular/times-circle", + "fontawesome/regular/times-rectangle", + "fontawesome/regular/tired", + "fontawesome/regular/trash-alt", + "fontawesome/regular/trash-can", + "fontawesome/regular/truck", + "fontawesome/regular/user-alt", + "fontawesome/regular/user-circle", + "fontawesome/regular/user-large", + "fontawesome/regular/user", + "fontawesome/regular/vcard", + "fontawesome/regular/window-close", + "fontawesome/regular/window-maximize", + "fontawesome/regular/window-minimize", + "fontawesome/regular/window-restore", + "fontawesome/regular/xmark-circle", + "fontawesome/solid/0", + "fontawesome/solid/1", + "fontawesome/solid/2", + "fontawesome/solid/3", + "fontawesome/solid/4", + "fontawesome/solid/5", + "fontawesome/solid/6", + "fontawesome/solid/7", + "fontawesome/solid/8", + "fontawesome/solid/9", + "fontawesome/solid/a", + "fontawesome/solid/ad", + "fontawesome/solid/add", + "fontawesome/solid/address-book", + "fontawesome/solid/address-card", + "fontawesome/solid/adjust", + "fontawesome/solid/air-freshener", + "fontawesome/solid/alarm-clock", + "fontawesome/solid/align-center", + "fontawesome/solid/align-justify", + "fontawesome/solid/align-left", + "fontawesome/solid/align-right", + "fontawesome/solid/allergies", + "fontawesome/solid/ambulance", + "fontawesome/solid/american-sign-language-interpreting", + "fontawesome/solid/anchor-circle-check", + "fontawesome/solid/anchor-circle-exclamation", + "fontawesome/solid/anchor-circle-xmark", + "fontawesome/solid/anchor-lock", + "fontawesome/solid/anchor", + "fontawesome/solid/angle-double-down", + "fontawesome/solid/angle-double-left", + "fontawesome/solid/angle-double-right", + "fontawesome/solid/angle-double-up", + "fontawesome/solid/angle-down", + "fontawesome/solid/angle-left", + "fontawesome/solid/angle-right", + "fontawesome/solid/angle-up", + "fontawesome/solid/angles-down", + "fontawesome/solid/angles-left", + "fontawesome/solid/angles-right", + "fontawesome/solid/angles-up", + "fontawesome/solid/angry", + "fontawesome/solid/ankh", + "fontawesome/solid/apple-alt", + "fontawesome/solid/apple-whole", + "fontawesome/solid/archive", + "fontawesome/solid/archway", + "fontawesome/solid/area-chart", + "fontawesome/solid/arrow-alt-circle-down", + "fontawesome/solid/arrow-alt-circle-left", + "fontawesome/solid/arrow-alt-circle-right", + "fontawesome/solid/arrow-alt-circle-up", + "fontawesome/solid/arrow-circle-down", + "fontawesome/solid/arrow-circle-left", + "fontawesome/solid/arrow-circle-right", + "fontawesome/solid/arrow-circle-up", + "fontawesome/solid/arrow-down-1-9", + "fontawesome/solid/arrow-down-9-1", + "fontawesome/solid/arrow-down-a-z", + "fontawesome/solid/arrow-down-long", + "fontawesome/solid/arrow-down-short-wide", + "fontawesome/solid/arrow-down-up-across-line", + "fontawesome/solid/arrow-down-up-lock", + "fontawesome/solid/arrow-down-wide-short", + "fontawesome/solid/arrow-down-z-a", + "fontawesome/solid/arrow-down", + "fontawesome/solid/arrow-left-long", + "fontawesome/solid/arrow-left-rotate", + "fontawesome/solid/arrow-left", + "fontawesome/solid/arrow-pointer", + "fontawesome/solid/arrow-right-arrow-left", + "fontawesome/solid/arrow-right-from-bracket", + "fontawesome/solid/arrow-right-from-file", + "fontawesome/solid/arrow-right-long", + "fontawesome/solid/arrow-right-rotate", + "fontawesome/solid/arrow-right-to-bracket", + "fontawesome/solid/arrow-right-to-city", + "fontawesome/solid/arrow-right-to-file", + "fontawesome/solid/arrow-right", + "fontawesome/solid/arrow-rotate-back", + "fontawesome/solid/arrow-rotate-backward", + "fontawesome/solid/arrow-rotate-forward", + "fontawesome/solid/arrow-rotate-left", + "fontawesome/solid/arrow-rotate-right", + "fontawesome/solid/arrow-trend-down", + "fontawesome/solid/arrow-trend-up", + "fontawesome/solid/arrow-turn-down", + "fontawesome/solid/arrow-turn-up", + "fontawesome/solid/arrow-up-1-9", + "fontawesome/solid/arrow-up-9-1", + "fontawesome/solid/arrow-up-a-z", + "fontawesome/solid/arrow-up-from-bracket", + "fontawesome/solid/arrow-up-from-ground-water", + "fontawesome/solid/arrow-up-from-water-pump", + "fontawesome/solid/arrow-up-long", + "fontawesome/solid/arrow-up-right-dots", + "fontawesome/solid/arrow-up-right-from-square", + "fontawesome/solid/arrow-up-short-wide", + "fontawesome/solid/arrow-up-wide-short", + "fontawesome/solid/arrow-up-z-a", + "fontawesome/solid/arrow-up", + "fontawesome/solid/arrows-alt-h", + "fontawesome/solid/arrows-alt-v", + "fontawesome/solid/arrows-alt", + "fontawesome/solid/arrows-down-to-line", + "fontawesome/solid/arrows-down-to-people", + "fontawesome/solid/arrows-h", + "fontawesome/solid/arrows-left-right-to-line", + "fontawesome/solid/arrows-left-right", + "fontawesome/solid/arrows-rotate", + "fontawesome/solid/arrows-spin", + "fontawesome/solid/arrows-split-up-and-left", + "fontawesome/solid/arrows-to-circle", + "fontawesome/solid/arrows-to-dot", + "fontawesome/solid/arrows-to-eye", + "fontawesome/solid/arrows-turn-right", + "fontawesome/solid/arrows-turn-to-dots", + "fontawesome/solid/arrows-up-down-left-right", + "fontawesome/solid/arrows-up-down", + "fontawesome/solid/arrows-up-to-line", + "fontawesome/solid/arrows-v", + "fontawesome/solid/arrows", + "fontawesome/solid/asl-interpreting", + "fontawesome/solid/assistive-listening-systems", + "fontawesome/solid/asterisk", + "fontawesome/solid/at", + "fontawesome/solid/atlas", + "fontawesome/solid/atom", + "fontawesome/solid/audio-description", + "fontawesome/solid/austral-sign", + "fontawesome/solid/automobile", + "fontawesome/solid/award", + "fontawesome/solid/b", + "fontawesome/solid/baby-carriage", + "fontawesome/solid/baby", + "fontawesome/solid/backspace", + "fontawesome/solid/backward-fast", + "fontawesome/solid/backward-step", + "fontawesome/solid/backward", + "fontawesome/solid/bacon", + "fontawesome/solid/bacteria", + "fontawesome/solid/bacterium", + "fontawesome/solid/bag-shopping", + "fontawesome/solid/bahai", + "fontawesome/solid/baht-sign", + "fontawesome/solid/balance-scale-left", + "fontawesome/solid/balance-scale-right", + "fontawesome/solid/balance-scale", + "fontawesome/solid/ban-smoking", + "fontawesome/solid/ban", + "fontawesome/solid/band-aid", + "fontawesome/solid/bandage", + "fontawesome/solid/bangladeshi-taka-sign", + "fontawesome/solid/bank", + "fontawesome/solid/bar-chart", + "fontawesome/solid/barcode", + "fontawesome/solid/bars-progress", + "fontawesome/solid/bars-staggered", + "fontawesome/solid/bars", + "fontawesome/solid/baseball-ball", + "fontawesome/solid/baseball-bat-ball", + "fontawesome/solid/baseball", + "fontawesome/solid/basket-shopping", + "fontawesome/solid/basketball-ball", + "fontawesome/solid/basketball", + "fontawesome/solid/bath", + "fontawesome/solid/bathtub", + "fontawesome/solid/battery-0", + "fontawesome/solid/battery-2", + "fontawesome/solid/battery-3", + "fontawesome/solid/battery-4", + "fontawesome/solid/battery-5", + "fontawesome/solid/battery-car", + "fontawesome/solid/battery-empty", + "fontawesome/solid/battery-full", + "fontawesome/solid/battery-half", + "fontawesome/solid/battery-quarter", + "fontawesome/solid/battery-three-quarters", + "fontawesome/solid/battery", + "fontawesome/solid/bed-pulse", + "fontawesome/solid/bed", + "fontawesome/solid/beer-mug-empty", + "fontawesome/solid/beer", + "fontawesome/solid/bell-concierge", + "fontawesome/solid/bell-slash", + "fontawesome/solid/bell", + "fontawesome/solid/bezier-curve", + "fontawesome/solid/bible", + "fontawesome/solid/bicycle", + "fontawesome/solid/biking", + "fontawesome/solid/binoculars", + "fontawesome/solid/biohazard", + "fontawesome/solid/birthday-cake", + "fontawesome/solid/bitcoin-sign", + "fontawesome/solid/blackboard", + "fontawesome/solid/blender-phone", + "fontawesome/solid/blender", + "fontawesome/solid/blind", + "fontawesome/solid/blog", + "fontawesome/solid/bold", + "fontawesome/solid/bolt-lightning", + "fontawesome/solid/bolt", + "fontawesome/solid/bomb", + "fontawesome/solid/bone", + "fontawesome/solid/bong", + "fontawesome/solid/book-atlas", + "fontawesome/solid/book-bible", + "fontawesome/solid/book-bookmark", + "fontawesome/solid/book-dead", + "fontawesome/solid/book-journal-whills", + "fontawesome/solid/book-medical", + "fontawesome/solid/book-open-reader", + "fontawesome/solid/book-open", + "fontawesome/solid/book-quran", + "fontawesome/solid/book-reader", + "fontawesome/solid/book-skull", + "fontawesome/solid/book-tanakh", + "fontawesome/solid/book", + "fontawesome/solid/bookmark", + "fontawesome/solid/border-all", + "fontawesome/solid/border-none", + "fontawesome/solid/border-style", + "fontawesome/solid/border-top-left", + "fontawesome/solid/bore-hole", + "fontawesome/solid/bottle-droplet", + "fontawesome/solid/bottle-water", + "fontawesome/solid/bowl-food", + "fontawesome/solid/bowl-rice", + "fontawesome/solid/bowling-ball", + "fontawesome/solid/box-archive", + "fontawesome/solid/box-open", + "fontawesome/solid/box-tissue", + "fontawesome/solid/box", + "fontawesome/solid/boxes-alt", + "fontawesome/solid/boxes-packing", + "fontawesome/solid/boxes-stacked", + "fontawesome/solid/boxes", + "fontawesome/solid/braille", + "fontawesome/solid/brain", + "fontawesome/solid/brazilian-real-sign", + "fontawesome/solid/bread-slice", + "fontawesome/solid/bridge-circle-check", + "fontawesome/solid/bridge-circle-exclamation", + "fontawesome/solid/bridge-circle-xmark", + "fontawesome/solid/bridge-lock", + "fontawesome/solid/bridge-water", + "fontawesome/solid/bridge", + "fontawesome/solid/briefcase-clock", + "fontawesome/solid/briefcase-medical", + "fontawesome/solid/briefcase", + "fontawesome/solid/broadcast-tower", + "fontawesome/solid/broom-ball", + "fontawesome/solid/broom", + "fontawesome/solid/brush", + "fontawesome/solid/bucket", + "fontawesome/solid/bug-slash", + "fontawesome/solid/bug", + "fontawesome/solid/bugs", + "fontawesome/solid/building-circle-arrow-right", + "fontawesome/solid/building-circle-check", + "fontawesome/solid/building-circle-exclamation", + "fontawesome/solid/building-circle-xmark", + "fontawesome/solid/building-columns", + "fontawesome/solid/building-flag", + "fontawesome/solid/building-lock", + "fontawesome/solid/building-ngo", + "fontawesome/solid/building-shield", + "fontawesome/solid/building-un", + "fontawesome/solid/building-user", + "fontawesome/solid/building-wheat", + "fontawesome/solid/building", + "fontawesome/solid/bullhorn", + "fontawesome/solid/bullseye", + "fontawesome/solid/burger", + "fontawesome/solid/burn", + "fontawesome/solid/burst", + "fontawesome/solid/bus-alt", + "fontawesome/solid/bus-side", + "fontawesome/solid/bus-simple", + "fontawesome/solid/bus", + "fontawesome/solid/business-time", + "fontawesome/solid/c", + "fontawesome/solid/cab", + "fontawesome/solid/cable-car", + "fontawesome/solid/cake-candles", + "fontawesome/solid/cake", + "fontawesome/solid/calculator", + "fontawesome/solid/calendar-alt", + "fontawesome/solid/calendar-check", + "fontawesome/solid/calendar-day", + "fontawesome/solid/calendar-days", + "fontawesome/solid/calendar-minus", + "fontawesome/solid/calendar-plus", + "fontawesome/solid/calendar-times", + "fontawesome/solid/calendar-week", + "fontawesome/solid/calendar-xmark", + "fontawesome/solid/calendar", + "fontawesome/solid/camera-alt", + "fontawesome/solid/camera-retro", + "fontawesome/solid/camera-rotate", + "fontawesome/solid/camera", + "fontawesome/solid/campground", + "fontawesome/solid/cancel", + "fontawesome/solid/candy-cane", + "fontawesome/solid/cannabis", + "fontawesome/solid/capsules", + "fontawesome/solid/car-alt", + "fontawesome/solid/car-battery", + "fontawesome/solid/car-burst", + "fontawesome/solid/car-crash", + "fontawesome/solid/car-on", + "fontawesome/solid/car-rear", + "fontawesome/solid/car-side", + "fontawesome/solid/car-tunnel", + "fontawesome/solid/car", + "fontawesome/solid/caravan", + "fontawesome/solid/caret-down", + "fontawesome/solid/caret-left", + "fontawesome/solid/caret-right", + "fontawesome/solid/caret-square-down", + "fontawesome/solid/caret-square-left", + "fontawesome/solid/caret-square-right", + "fontawesome/solid/caret-square-up", + "fontawesome/solid/caret-up", + "fontawesome/solid/carriage-baby", + "fontawesome/solid/carrot", + "fontawesome/solid/cart-arrow-down", + "fontawesome/solid/cart-flatbed-suitcase", + "fontawesome/solid/cart-flatbed", + "fontawesome/solid/cart-plus", + "fontawesome/solid/cart-shopping", + "fontawesome/solid/cash-register", + "fontawesome/solid/cat", + "fontawesome/solid/cedi-sign", + "fontawesome/solid/cent-sign", + "fontawesome/solid/certificate", + "fontawesome/solid/chain-broken", + "fontawesome/solid/chain-slash", + "fontawesome/solid/chain", + "fontawesome/solid/chair", + "fontawesome/solid/chalkboard-teacher", + "fontawesome/solid/chalkboard-user", + "fontawesome/solid/chalkboard", + "fontawesome/solid/champagne-glasses", + "fontawesome/solid/charging-station", + "fontawesome/solid/chart-area", + "fontawesome/solid/chart-bar", + "fontawesome/solid/chart-column", + "fontawesome/solid/chart-diagram", + "fontawesome/solid/chart-gantt", + "fontawesome/solid/chart-line", + "fontawesome/solid/chart-pie", + "fontawesome/solid/chart-simple", + "fontawesome/solid/check-circle", + "fontawesome/solid/check-double", + "fontawesome/solid/check-square", + "fontawesome/solid/check-to-slot", + "fontawesome/solid/check", + "fontawesome/solid/cheese", + "fontawesome/solid/chess-bishop", + "fontawesome/solid/chess-board", + "fontawesome/solid/chess-king", + "fontawesome/solid/chess-knight", + "fontawesome/solid/chess-pawn", + "fontawesome/solid/chess-queen", + "fontawesome/solid/chess-rook", + "fontawesome/solid/chess", + "fontawesome/solid/chevron-circle-down", + "fontawesome/solid/chevron-circle-left", + "fontawesome/solid/chevron-circle-right", + "fontawesome/solid/chevron-circle-up", + "fontawesome/solid/chevron-down", + "fontawesome/solid/chevron-left", + "fontawesome/solid/chevron-right", + "fontawesome/solid/chevron-up", + "fontawesome/solid/child-combatant", + "fontawesome/solid/child-dress", + "fontawesome/solid/child-reaching", + "fontawesome/solid/child-rifle", + "fontawesome/solid/child", + "fontawesome/solid/children", + "fontawesome/solid/church", + "fontawesome/solid/circle-arrow-down", + "fontawesome/solid/circle-arrow-left", + "fontawesome/solid/circle-arrow-right", + "fontawesome/solid/circle-arrow-up", + "fontawesome/solid/circle-check", + "fontawesome/solid/circle-chevron-down", + "fontawesome/solid/circle-chevron-left", + "fontawesome/solid/circle-chevron-right", + "fontawesome/solid/circle-chevron-up", + "fontawesome/solid/circle-dollar-to-slot", + "fontawesome/solid/circle-dot", + "fontawesome/solid/circle-down", + "fontawesome/solid/circle-exclamation", + "fontawesome/solid/circle-h", + "fontawesome/solid/circle-half-stroke", + "fontawesome/solid/circle-info", + "fontawesome/solid/circle-left", + "fontawesome/solid/circle-minus", + "fontawesome/solid/circle-nodes", + "fontawesome/solid/circle-notch", + "fontawesome/solid/circle-pause", + "fontawesome/solid/circle-play", + "fontawesome/solid/circle-plus", + "fontawesome/solid/circle-question", + "fontawesome/solid/circle-radiation", + "fontawesome/solid/circle-right", + "fontawesome/solid/circle-stop", + "fontawesome/solid/circle-up", + "fontawesome/solid/circle-user", + "fontawesome/solid/circle-xmark", + "fontawesome/solid/circle", + "fontawesome/solid/city", + "fontawesome/solid/clapperboard", + "fontawesome/solid/clinic-medical", + "fontawesome/solid/clipboard-check", + "fontawesome/solid/clipboard-list", + "fontawesome/solid/clipboard-question", + "fontawesome/solid/clipboard-user", + "fontawesome/solid/clipboard", + "fontawesome/solid/clock-four", + "fontawesome/solid/clock-rotate-left", + "fontawesome/solid/clock", + "fontawesome/solid/clone", + "fontawesome/solid/close", + "fontawesome/solid/closed-captioning", + "fontawesome/solid/cloud-arrow-down", + "fontawesome/solid/cloud-arrow-up", + "fontawesome/solid/cloud-bolt", + "fontawesome/solid/cloud-download-alt", + "fontawesome/solid/cloud-download", + "fontawesome/solid/cloud-meatball", + "fontawesome/solid/cloud-moon-rain", + "fontawesome/solid/cloud-moon", + "fontawesome/solid/cloud-rain", + "fontawesome/solid/cloud-showers-heavy", + "fontawesome/solid/cloud-showers-water", + "fontawesome/solid/cloud-sun-rain", + "fontawesome/solid/cloud-sun", + "fontawesome/solid/cloud-upload-alt", + "fontawesome/solid/cloud-upload", + "fontawesome/solid/cloud", + "fontawesome/solid/clover", + "fontawesome/solid/cny", + "fontawesome/solid/cocktail", + "fontawesome/solid/code-branch", + "fontawesome/solid/code-commit", + "fontawesome/solid/code-compare", + "fontawesome/solid/code-fork", + "fontawesome/solid/code-merge", + "fontawesome/solid/code-pull-request", + "fontawesome/solid/code", + "fontawesome/solid/coffee", + "fontawesome/solid/cog", + "fontawesome/solid/cogs", + "fontawesome/solid/coins", + "fontawesome/solid/colon-sign", + "fontawesome/solid/columns", + "fontawesome/solid/comment-alt", + "fontawesome/solid/comment-dollar", + "fontawesome/solid/comment-dots", + "fontawesome/solid/comment-medical", + "fontawesome/solid/comment-nodes", + "fontawesome/solid/comment-slash", + "fontawesome/solid/comment-sms", + "fontawesome/solid/comment", + "fontawesome/solid/commenting", + "fontawesome/solid/comments-dollar", + "fontawesome/solid/comments", + "fontawesome/solid/compact-disc", + "fontawesome/solid/compass-drafting", + "fontawesome/solid/compass", + "fontawesome/solid/compress-alt", + "fontawesome/solid/compress-arrows-alt", + "fontawesome/solid/compress", + "fontawesome/solid/computer-mouse", + "fontawesome/solid/computer", + "fontawesome/solid/concierge-bell", + "fontawesome/solid/contact-book", + "fontawesome/solid/contact-card", + "fontawesome/solid/cookie-bite", + "fontawesome/solid/cookie", + "fontawesome/solid/copy", + "fontawesome/solid/copyright", + "fontawesome/solid/couch", + "fontawesome/solid/cow", + "fontawesome/solid/credit-card-alt", + "fontawesome/solid/credit-card", + "fontawesome/solid/crop-alt", + "fontawesome/solid/crop-simple", + "fontawesome/solid/crop", + "fontawesome/solid/cross", + "fontawesome/solid/crosshairs", + "fontawesome/solid/crow", + "fontawesome/solid/crown", + "fontawesome/solid/crutch", + "fontawesome/solid/cruzeiro-sign", + "fontawesome/solid/cube", + "fontawesome/solid/cubes-stacked", + "fontawesome/solid/cubes", + "fontawesome/solid/cut", + "fontawesome/solid/cutlery", + "fontawesome/solid/d", + "fontawesome/solid/dashboard", + "fontawesome/solid/database", + "fontawesome/solid/deaf", + "fontawesome/solid/deafness", + "fontawesome/solid/dedent", + "fontawesome/solid/delete-left", + "fontawesome/solid/democrat", + "fontawesome/solid/desktop-alt", + "fontawesome/solid/desktop", + "fontawesome/solid/dharmachakra", + "fontawesome/solid/diagnoses", + "fontawesome/solid/diagram-next", + "fontawesome/solid/diagram-predecessor", + "fontawesome/solid/diagram-project", + "fontawesome/solid/diagram-successor", + "fontawesome/solid/diamond-turn-right", + "fontawesome/solid/diamond", + "fontawesome/solid/dice-d20", + "fontawesome/solid/dice-d6", + "fontawesome/solid/dice-five", + "fontawesome/solid/dice-four", + "fontawesome/solid/dice-one", + "fontawesome/solid/dice-six", + "fontawesome/solid/dice-three", + "fontawesome/solid/dice-two", + "fontawesome/solid/dice", + "fontawesome/solid/digging", + "fontawesome/solid/digital-tachograph", + "fontawesome/solid/directions", + "fontawesome/solid/disease", + "fontawesome/solid/display", + "fontawesome/solid/divide", + "fontawesome/solid/dizzy", + "fontawesome/solid/dna", + "fontawesome/solid/dog", + "fontawesome/solid/dollar-sign", + "fontawesome/solid/dollar", + "fontawesome/solid/dolly-box", + "fontawesome/solid/dolly-flatbed", + "fontawesome/solid/dolly", + "fontawesome/solid/donate", + "fontawesome/solid/dong-sign", + "fontawesome/solid/door-closed", + "fontawesome/solid/door-open", + "fontawesome/solid/dot-circle", + "fontawesome/solid/dove", + "fontawesome/solid/down-left-and-up-right-to-center", + "fontawesome/solid/down-long", + "fontawesome/solid/download", + "fontawesome/solid/drafting-compass", + "fontawesome/solid/dragon", + "fontawesome/solid/draw-polygon", + "fontawesome/solid/drivers-license", + "fontawesome/solid/droplet-slash", + "fontawesome/solid/droplet", + "fontawesome/solid/drum-steelpan", + "fontawesome/solid/drum", + "fontawesome/solid/drumstick-bite", + "fontawesome/solid/dumbbell", + "fontawesome/solid/dumpster-fire", + "fontawesome/solid/dumpster", + "fontawesome/solid/dungeon", + "fontawesome/solid/e", + "fontawesome/solid/ear-deaf", + "fontawesome/solid/ear-listen", + "fontawesome/solid/earth-africa", + "fontawesome/solid/earth-america", + "fontawesome/solid/earth-americas", + "fontawesome/solid/earth-asia", + "fontawesome/solid/earth-europe", + "fontawesome/solid/earth-oceania", + "fontawesome/solid/earth", + "fontawesome/solid/edit", + "fontawesome/solid/egg", + "fontawesome/solid/eject", + "fontawesome/solid/elevator", + "fontawesome/solid/ellipsis-h", + "fontawesome/solid/ellipsis-v", + "fontawesome/solid/ellipsis-vertical", + "fontawesome/solid/ellipsis", + "fontawesome/solid/envelope-circle-check", + "fontawesome/solid/envelope-open-text", + "fontawesome/solid/envelope-open", + "fontawesome/solid/envelope-square", + "fontawesome/solid/envelope", + "fontawesome/solid/envelopes-bulk", + "fontawesome/solid/equals", + "fontawesome/solid/eraser", + "fontawesome/solid/ethernet", + "fontawesome/solid/eur", + "fontawesome/solid/euro-sign", + "fontawesome/solid/euro", + "fontawesome/solid/exchange-alt", + "fontawesome/solid/exchange", + "fontawesome/solid/exclamation-circle", + "fontawesome/solid/exclamation-triangle", + "fontawesome/solid/exclamation", + "fontawesome/solid/expand-alt", + "fontawesome/solid/expand-arrows-alt", + "fontawesome/solid/expand", + "fontawesome/solid/explosion", + "fontawesome/solid/external-link-alt", + "fontawesome/solid/external-link-square-alt", + "fontawesome/solid/external-link-square", + "fontawesome/solid/external-link", + "fontawesome/solid/eye-dropper-empty", + "fontawesome/solid/eye-dropper", + "fontawesome/solid/eye-low-vision", + "fontawesome/solid/eye-slash", + "fontawesome/solid/eye", + "fontawesome/solid/eyedropper", + "fontawesome/solid/f", + "fontawesome/solid/face-angry", + "fontawesome/solid/face-dizzy", + "fontawesome/solid/face-flushed", + "fontawesome/solid/face-frown-open", + "fontawesome/solid/face-frown", + "fontawesome/solid/face-grimace", + "fontawesome/solid/face-grin-beam-sweat", + "fontawesome/solid/face-grin-beam", + "fontawesome/solid/face-grin-hearts", + "fontawesome/solid/face-grin-squint-tears", + "fontawesome/solid/face-grin-squint", + "fontawesome/solid/face-grin-stars", + "fontawesome/solid/face-grin-tears", + "fontawesome/solid/face-grin-tongue-squint", + "fontawesome/solid/face-grin-tongue-wink", + "fontawesome/solid/face-grin-tongue", + "fontawesome/solid/face-grin-wide", + "fontawesome/solid/face-grin-wink", + "fontawesome/solid/face-grin", + "fontawesome/solid/face-kiss-beam", + "fontawesome/solid/face-kiss-wink-heart", + "fontawesome/solid/face-kiss", + "fontawesome/solid/face-laugh-beam", + "fontawesome/solid/face-laugh-squint", + "fontawesome/solid/face-laugh-wink", + "fontawesome/solid/face-laugh", + "fontawesome/solid/face-meh-blank", + "fontawesome/solid/face-meh", + "fontawesome/solid/face-rolling-eyes", + "fontawesome/solid/face-sad-cry", + "fontawesome/solid/face-sad-tear", + "fontawesome/solid/face-smile-beam", + "fontawesome/solid/face-smile-wink", + "fontawesome/solid/face-smile", + "fontawesome/solid/face-surprise", + "fontawesome/solid/face-tired", + "fontawesome/solid/fan", + "fontawesome/solid/fast-backward", + "fontawesome/solid/fast-forward", + "fontawesome/solid/faucet-drip", + "fontawesome/solid/faucet", + "fontawesome/solid/fax", + "fontawesome/solid/feather-alt", + "fontawesome/solid/feather-pointed", + "fontawesome/solid/feather", + "fontawesome/solid/feed", + "fontawesome/solid/female", + "fontawesome/solid/ferry", + "fontawesome/solid/fighter-jet", + "fontawesome/solid/file-alt", + "fontawesome/solid/file-archive", + "fontawesome/solid/file-arrow-down", + "fontawesome/solid/file-arrow-up", + "fontawesome/solid/file-audio", + "fontawesome/solid/file-circle-check", + "fontawesome/solid/file-circle-exclamation", + "fontawesome/solid/file-circle-minus", + "fontawesome/solid/file-circle-plus", + "fontawesome/solid/file-circle-question", + "fontawesome/solid/file-circle-xmark", + "fontawesome/solid/file-clipboard", + "fontawesome/solid/file-code", + "fontawesome/solid/file-contract", + "fontawesome/solid/file-csv", + "fontawesome/solid/file-download", + "fontawesome/solid/file-edit", + "fontawesome/solid/file-excel", + "fontawesome/solid/file-export", + "fontawesome/solid/file-fragment", + "fontawesome/solid/file-half-dashed", + "fontawesome/solid/file-image", + "fontawesome/solid/file-import", + "fontawesome/solid/file-invoice-dollar", + "fontawesome/solid/file-invoice", + "fontawesome/solid/file-lines", + "fontawesome/solid/file-medical-alt", + "fontawesome/solid/file-medical", + "fontawesome/solid/file-pdf", + "fontawesome/solid/file-pen", + "fontawesome/solid/file-powerpoint", + "fontawesome/solid/file-prescription", + "fontawesome/solid/file-shield", + "fontawesome/solid/file-signature", + "fontawesome/solid/file-text", + "fontawesome/solid/file-upload", + "fontawesome/solid/file-video", + "fontawesome/solid/file-waveform", + "fontawesome/solid/file-word", + "fontawesome/solid/file-zipper", + "fontawesome/solid/file", + "fontawesome/solid/fill-drip", + "fontawesome/solid/fill", + "fontawesome/solid/film-alt", + "fontawesome/solid/film-simple", + "fontawesome/solid/film", + "fontawesome/solid/filter-circle-dollar", + "fontawesome/solid/filter-circle-xmark", + "fontawesome/solid/filter", + "fontawesome/solid/fingerprint", + "fontawesome/solid/fire-alt", + "fontawesome/solid/fire-burner", + "fontawesome/solid/fire-extinguisher", + "fontawesome/solid/fire-flame-curved", + "fontawesome/solid/fire-flame-simple", + "fontawesome/solid/fire", + "fontawesome/solid/first-aid", + "fontawesome/solid/fish-fins", + "fontawesome/solid/fish", + "fontawesome/solid/fist-raised", + "fontawesome/solid/flag-checkered", + "fontawesome/solid/flag-usa", + "fontawesome/solid/flag", + "fontawesome/solid/flask-vial", + "fontawesome/solid/flask", + "fontawesome/solid/floppy-disk", + "fontawesome/solid/florin-sign", + "fontawesome/solid/flushed", + "fontawesome/solid/folder-blank", + "fontawesome/solid/folder-closed", + "fontawesome/solid/folder-minus", + "fontawesome/solid/folder-open", + "fontawesome/solid/folder-plus", + "fontawesome/solid/folder-tree", + "fontawesome/solid/folder", + "fontawesome/solid/font-awesome-flag", + "fontawesome/solid/font-awesome-logo-full", + "fontawesome/solid/font-awesome", + "fontawesome/solid/font", + "fontawesome/solid/football-ball", + "fontawesome/solid/football", + "fontawesome/solid/forward-fast", + "fontawesome/solid/forward-step", + "fontawesome/solid/forward", + "fontawesome/solid/franc-sign", + "fontawesome/solid/frog", + "fontawesome/solid/frown-open", + "fontawesome/solid/frown", + "fontawesome/solid/funnel-dollar", + "fontawesome/solid/futbol-ball", + "fontawesome/solid/futbol", + "fontawesome/solid/g", + "fontawesome/solid/gamepad", + "fontawesome/solid/gas-pump", + "fontawesome/solid/gauge-high", + "fontawesome/solid/gauge-med", + "fontawesome/solid/gauge-simple-high", + "fontawesome/solid/gauge-simple-med", + "fontawesome/solid/gauge-simple", + "fontawesome/solid/gauge", + "fontawesome/solid/gavel", + "fontawesome/solid/gbp", + "fontawesome/solid/gear", + "fontawesome/solid/gears", + "fontawesome/solid/gem", + "fontawesome/solid/genderless", + "fontawesome/solid/ghost", + "fontawesome/solid/gift", + "fontawesome/solid/gifts", + "fontawesome/solid/glass-cheers", + "fontawesome/solid/glass-martini-alt", + "fontawesome/solid/glass-martini", + "fontawesome/solid/glass-water-droplet", + "fontawesome/solid/glass-water", + "fontawesome/solid/glass-whiskey", + "fontawesome/solid/glasses", + "fontawesome/solid/globe-africa", + "fontawesome/solid/globe-americas", + "fontawesome/solid/globe-asia", + "fontawesome/solid/globe-europe", + "fontawesome/solid/globe-oceania", + "fontawesome/solid/globe", + "fontawesome/solid/golf-ball-tee", + "fontawesome/solid/golf-ball", + "fontawesome/solid/gopuram", + "fontawesome/solid/graduation-cap", + "fontawesome/solid/greater-than-equal", + "fontawesome/solid/greater-than", + "fontawesome/solid/grid-horizontal", + "fontawesome/solid/grid-vertical", + "fontawesome/solid/grimace", + "fontawesome/solid/grin-alt", + "fontawesome/solid/grin-beam-sweat", + "fontawesome/solid/grin-beam", + "fontawesome/solid/grin-hearts", + "fontawesome/solid/grin-squint-tears", + "fontawesome/solid/grin-squint", + "fontawesome/solid/grin-stars", + "fontawesome/solid/grin-tears", + "fontawesome/solid/grin-tongue-squint", + "fontawesome/solid/grin-tongue-wink", + "fontawesome/solid/grin-tongue", + "fontawesome/solid/grin-wink", + "fontawesome/solid/grin", + "fontawesome/solid/grip-horizontal", + "fontawesome/solid/grip-lines-vertical", + "fontawesome/solid/grip-lines", + "fontawesome/solid/grip-vertical", + "fontawesome/solid/grip", + "fontawesome/solid/group-arrows-rotate", + "fontawesome/solid/guarani-sign", + "fontawesome/solid/guitar", + "fontawesome/solid/gun", + "fontawesome/solid/h-square", + "fontawesome/solid/h", + "fontawesome/solid/hamburger", + "fontawesome/solid/hammer", + "fontawesome/solid/hamsa", + "fontawesome/solid/hand-back-fist", + "fontawesome/solid/hand-dots", + "fontawesome/solid/hand-fist", + "fontawesome/solid/hand-holding-dollar", + "fontawesome/solid/hand-holding-droplet", + "fontawesome/solid/hand-holding-hand", + "fontawesome/solid/hand-holding-heart", + "fontawesome/solid/hand-holding-medical", + "fontawesome/solid/hand-holding-usd", + "fontawesome/solid/hand-holding-water", + "fontawesome/solid/hand-holding", + "fontawesome/solid/hand-lizard", + "fontawesome/solid/hand-middle-finger", + "fontawesome/solid/hand-paper", + "fontawesome/solid/hand-peace", + "fontawesome/solid/hand-point-down", + "fontawesome/solid/hand-point-left", + "fontawesome/solid/hand-point-right", + "fontawesome/solid/hand-point-up", + "fontawesome/solid/hand-pointer", + "fontawesome/solid/hand-rock", + "fontawesome/solid/hand-scissors", + "fontawesome/solid/hand-sparkles", + "fontawesome/solid/hand-spock", + "fontawesome/solid/hand", + "fontawesome/solid/handcuffs", + "fontawesome/solid/hands-american-sign-language-interpreting", + "fontawesome/solid/hands-asl-interpreting", + "fontawesome/solid/hands-bound", + "fontawesome/solid/hands-bubbles", + "fontawesome/solid/hands-clapping", + "fontawesome/solid/hands-helping", + "fontawesome/solid/hands-holding-child", + "fontawesome/solid/hands-holding-circle", + "fontawesome/solid/hands-holding", + "fontawesome/solid/hands-praying", + "fontawesome/solid/hands-wash", + "fontawesome/solid/hands", + "fontawesome/solid/handshake-alt-slash", + "fontawesome/solid/handshake-alt", + "fontawesome/solid/handshake-angle", + "fontawesome/solid/handshake-simple-slash", + "fontawesome/solid/handshake-simple", + "fontawesome/solid/handshake-slash", + "fontawesome/solid/handshake", + "fontawesome/solid/hanukiah", + "fontawesome/solid/hard-drive", + "fontawesome/solid/hard-hat", + "fontawesome/solid/hard-of-hearing", + "fontawesome/solid/hashtag", + "fontawesome/solid/hat-cowboy-side", + "fontawesome/solid/hat-cowboy", + "fontawesome/solid/hat-hard", + "fontawesome/solid/hat-wizard", + "fontawesome/solid/haykal", + "fontawesome/solid/hdd", + "fontawesome/solid/head-side-cough-slash", + "fontawesome/solid/head-side-cough", + "fontawesome/solid/head-side-mask", + "fontawesome/solid/head-side-virus", + "fontawesome/solid/header", + "fontawesome/solid/heading", + "fontawesome/solid/headphones-alt", + "fontawesome/solid/headphones-simple", + "fontawesome/solid/headphones", + "fontawesome/solid/headset", + "fontawesome/solid/heart-broken", + "fontawesome/solid/heart-circle-bolt", + "fontawesome/solid/heart-circle-check", + "fontawesome/solid/heart-circle-exclamation", + "fontawesome/solid/heart-circle-minus", + "fontawesome/solid/heart-circle-plus", + "fontawesome/solid/heart-circle-xmark", + "fontawesome/solid/heart-crack", + "fontawesome/solid/heart-music-camera-bolt", + "fontawesome/solid/heart-pulse", + "fontawesome/solid/heart", + "fontawesome/solid/heartbeat", + "fontawesome/solid/helicopter-symbol", + "fontawesome/solid/helicopter", + "fontawesome/solid/helmet-safety", + "fontawesome/solid/helmet-un", + "fontawesome/solid/heptagon", + "fontawesome/solid/hexagon-nodes-bolt", + "fontawesome/solid/hexagon-nodes", + "fontawesome/solid/hexagon", + "fontawesome/solid/highlighter", + "fontawesome/solid/hiking", + "fontawesome/solid/hill-avalanche", + "fontawesome/solid/hill-rockslide", + "fontawesome/solid/hippo", + "fontawesome/solid/history", + "fontawesome/solid/hockey-puck", + "fontawesome/solid/holly-berry", + "fontawesome/solid/home-alt", + "fontawesome/solid/home-lg-alt", + "fontawesome/solid/home-lg", + "fontawesome/solid/home-user", + "fontawesome/solid/home", + "fontawesome/solid/horse-head", + "fontawesome/solid/horse", + "fontawesome/solid/hospital-alt", + "fontawesome/solid/hospital-symbol", + "fontawesome/solid/hospital-user", + "fontawesome/solid/hospital-wide", + "fontawesome/solid/hospital", + "fontawesome/solid/hot-tub-person", + "fontawesome/solid/hot-tub", + "fontawesome/solid/hotdog", + "fontawesome/solid/hotel", + "fontawesome/solid/hourglass-1", + "fontawesome/solid/hourglass-2", + "fontawesome/solid/hourglass-3", + "fontawesome/solid/hourglass-empty", + "fontawesome/solid/hourglass-end", + "fontawesome/solid/hourglass-half", + "fontawesome/solid/hourglass-start", + "fontawesome/solid/hourglass", + "fontawesome/solid/house-chimney-crack", + "fontawesome/solid/house-chimney-medical", + "fontawesome/solid/house-chimney-user", + "fontawesome/solid/house-chimney-window", + "fontawesome/solid/house-chimney", + "fontawesome/solid/house-circle-check", + "fontawesome/solid/house-circle-exclamation", + "fontawesome/solid/house-circle-xmark", + "fontawesome/solid/house-crack", + "fontawesome/solid/house-damage", + "fontawesome/solid/house-fire", + "fontawesome/solid/house-flag", + "fontawesome/solid/house-flood-water-circle-arrow-right", + "fontawesome/solid/house-flood-water", + "fontawesome/solid/house-laptop", + "fontawesome/solid/house-lock", + "fontawesome/solid/house-medical-circle-check", + "fontawesome/solid/house-medical-circle-exclamation", + "fontawesome/solid/house-medical-circle-xmark", + "fontawesome/solid/house-medical-flag", + "fontawesome/solid/house-medical", + "fontawesome/solid/house-signal", + "fontawesome/solid/house-tsunami", + "fontawesome/solid/house-user", + "fontawesome/solid/house", + "fontawesome/solid/hryvnia-sign", + "fontawesome/solid/hryvnia", + "fontawesome/solid/hurricane", + "fontawesome/solid/i-cursor", + "fontawesome/solid/i", + "fontawesome/solid/ice-cream", + "fontawesome/solid/icicles", + "fontawesome/solid/icons", + "fontawesome/solid/id-badge", + "fontawesome/solid/id-card-alt", + "fontawesome/solid/id-card-clip", + "fontawesome/solid/id-card", + "fontawesome/solid/igloo", + "fontawesome/solid/ils", + "fontawesome/solid/image-portrait", + "fontawesome/solid/image", + "fontawesome/solid/images", + "fontawesome/solid/inbox", + "fontawesome/solid/indent", + "fontawesome/solid/indian-rupee-sign", + "fontawesome/solid/indian-rupee", + "fontawesome/solid/industry", + "fontawesome/solid/infinity", + "fontawesome/solid/info-circle", + "fontawesome/solid/info", + "fontawesome/solid/inr", + "fontawesome/solid/institution", + "fontawesome/solid/italic", + "fontawesome/solid/j", + "fontawesome/solid/jar-wheat", + "fontawesome/solid/jar", + "fontawesome/solid/jedi", + "fontawesome/solid/jet-fighter-up", + "fontawesome/solid/jet-fighter", + "fontawesome/solid/joint", + "fontawesome/solid/journal-whills", + "fontawesome/solid/jpy", + "fontawesome/solid/jug-detergent", + "fontawesome/solid/k", + "fontawesome/solid/kaaba", + "fontawesome/solid/key", + "fontawesome/solid/keyboard", + "fontawesome/solid/khanda", + "fontawesome/solid/kip-sign", + "fontawesome/solid/kiss-beam", + "fontawesome/solid/kiss-wink-heart", + "fontawesome/solid/kiss", + "fontawesome/solid/kit-medical", + "fontawesome/solid/kitchen-set", + "fontawesome/solid/kiwi-bird", + "fontawesome/solid/krw", + "fontawesome/solid/l", + "fontawesome/solid/ladder-water", + "fontawesome/solid/land-mine-on", + "fontawesome/solid/landmark-alt", + "fontawesome/solid/landmark-dome", + "fontawesome/solid/landmark-flag", + "fontawesome/solid/landmark", + "fontawesome/solid/language", + "fontawesome/solid/laptop-code", + "fontawesome/solid/laptop-file", + "fontawesome/solid/laptop-house", + "fontawesome/solid/laptop-medical", + "fontawesome/solid/laptop", + "fontawesome/solid/lari-sign", + "fontawesome/solid/laugh-beam", + "fontawesome/solid/laugh-squint", + "fontawesome/solid/laugh-wink", + "fontawesome/solid/laugh", + "fontawesome/solid/layer-group", + "fontawesome/solid/leaf", + "fontawesome/solid/left-long", + "fontawesome/solid/left-right", + "fontawesome/solid/legal", + "fontawesome/solid/lemon", + "fontawesome/solid/less-than-equal", + "fontawesome/solid/less-than", + "fontawesome/solid/level-down-alt", + "fontawesome/solid/level-down", + "fontawesome/solid/level-up-alt", + "fontawesome/solid/level-up", + "fontawesome/solid/life-ring", + "fontawesome/solid/lightbulb", + "fontawesome/solid/line-chart", + "fontawesome/solid/lines-leaning", + "fontawesome/solid/link-slash", + "fontawesome/solid/link", + "fontawesome/solid/lira-sign", + "fontawesome/solid/list-1-2", + "fontawesome/solid/list-alt", + "fontawesome/solid/list-check", + "fontawesome/solid/list-dots", + "fontawesome/solid/list-numeric", + "fontawesome/solid/list-ol", + "fontawesome/solid/list-squares", + "fontawesome/solid/list-ul", + "fontawesome/solid/list", + "fontawesome/solid/litecoin-sign", + "fontawesome/solid/location-arrow", + "fontawesome/solid/location-crosshairs", + "fontawesome/solid/location-dot", + "fontawesome/solid/location-pin-lock", + "fontawesome/solid/location-pin", + "fontawesome/solid/location", + "fontawesome/solid/lock-open", + "fontawesome/solid/lock", + "fontawesome/solid/locust", + "fontawesome/solid/long-arrow-alt-down", + "fontawesome/solid/long-arrow-alt-left", + "fontawesome/solid/long-arrow-alt-right", + "fontawesome/solid/long-arrow-alt-up", + "fontawesome/solid/long-arrow-down", + "fontawesome/solid/long-arrow-left", + "fontawesome/solid/long-arrow-right", + "fontawesome/solid/long-arrow-up", + "fontawesome/solid/low-vision", + "fontawesome/solid/luggage-cart", + "fontawesome/solid/lungs-virus", + "fontawesome/solid/lungs", + "fontawesome/solid/m", + "fontawesome/solid/magic-wand-sparkles", + "fontawesome/solid/magic", + "fontawesome/solid/magnet", + "fontawesome/solid/magnifying-glass-arrow-right", + "fontawesome/solid/magnifying-glass-chart", + "fontawesome/solid/magnifying-glass-dollar", + "fontawesome/solid/magnifying-glass-location", + "fontawesome/solid/magnifying-glass-minus", + "fontawesome/solid/magnifying-glass-plus", + "fontawesome/solid/magnifying-glass", + "fontawesome/solid/mail-bulk", + "fontawesome/solid/mail-forward", + "fontawesome/solid/mail-reply-all", + "fontawesome/solid/mail-reply", + "fontawesome/solid/male", + "fontawesome/solid/manat-sign", + "fontawesome/solid/map-location-dot", + "fontawesome/solid/map-location", + "fontawesome/solid/map-marked-alt", + "fontawesome/solid/map-marked", + "fontawesome/solid/map-marker-alt", + "fontawesome/solid/map-marker", + "fontawesome/solid/map-pin", + "fontawesome/solid/map-signs", + "fontawesome/solid/map", + "fontawesome/solid/marker", + "fontawesome/solid/mars-and-venus-burst", + "fontawesome/solid/mars-and-venus", + "fontawesome/solid/mars-double", + "fontawesome/solid/mars-stroke-h", + "fontawesome/solid/mars-stroke-right", + "fontawesome/solid/mars-stroke-up", + "fontawesome/solid/mars-stroke-v", + "fontawesome/solid/mars-stroke", + "fontawesome/solid/mars", + "fontawesome/solid/martini-glass-citrus", + "fontawesome/solid/martini-glass-empty", + "fontawesome/solid/martini-glass", + "fontawesome/solid/mask-face", + "fontawesome/solid/mask-ventilator", + "fontawesome/solid/mask", + "fontawesome/solid/masks-theater", + "fontawesome/solid/mattress-pillow", + "fontawesome/solid/maximize", + "fontawesome/solid/medal", + "fontawesome/solid/medkit", + "fontawesome/solid/meh-blank", + "fontawesome/solid/meh-rolling-eyes", + "fontawesome/solid/meh", + "fontawesome/solid/memory", + "fontawesome/solid/menorah", + "fontawesome/solid/mercury", + "fontawesome/solid/message", + "fontawesome/solid/meteor", + "fontawesome/solid/microchip", + "fontawesome/solid/microphone-alt-slash", + "fontawesome/solid/microphone-alt", + "fontawesome/solid/microphone-lines-slash", + "fontawesome/solid/microphone-lines", + "fontawesome/solid/microphone-slash", + "fontawesome/solid/microphone", + "fontawesome/solid/microscope", + "fontawesome/solid/mill-sign", + "fontawesome/solid/minimize", + "fontawesome/solid/minus-circle", + "fontawesome/solid/minus-square", + "fontawesome/solid/minus", + "fontawesome/solid/mitten", + "fontawesome/solid/mobile-alt", + "fontawesome/solid/mobile-android-alt", + "fontawesome/solid/mobile-android", + "fontawesome/solid/mobile-button", + "fontawesome/solid/mobile-phone", + "fontawesome/solid/mobile-retro", + "fontawesome/solid/mobile-screen-button", + "fontawesome/solid/mobile-screen", + "fontawesome/solid/mobile-vibrate", + "fontawesome/solid/mobile", + "fontawesome/solid/money-bill-1-wave", + "fontawesome/solid/money-bill-1", + "fontawesome/solid/money-bill-alt", + "fontawesome/solid/money-bill-transfer", + "fontawesome/solid/money-bill-trend-up", + "fontawesome/solid/money-bill-wave-alt", + "fontawesome/solid/money-bill-wave", + "fontawesome/solid/money-bill-wheat", + "fontawesome/solid/money-bill", + "fontawesome/solid/money-bills", + "fontawesome/solid/money-check-alt", + "fontawesome/solid/money-check-dollar", + "fontawesome/solid/money-check", + "fontawesome/solid/monument", + "fontawesome/solid/moon", + "fontawesome/solid/mortar-board", + "fontawesome/solid/mortar-pestle", + "fontawesome/solid/mosque", + "fontawesome/solid/mosquito-net", + "fontawesome/solid/mosquito", + "fontawesome/solid/motorcycle", + "fontawesome/solid/mound", + "fontawesome/solid/mountain-city", + "fontawesome/solid/mountain-sun", + "fontawesome/solid/mountain", + "fontawesome/solid/mouse-pointer", + "fontawesome/solid/mouse", + "fontawesome/solid/mug-hot", + "fontawesome/solid/mug-saucer", + "fontawesome/solid/multiply", + "fontawesome/solid/museum", + "fontawesome/solid/music", + "fontawesome/solid/n", + "fontawesome/solid/naira-sign", + "fontawesome/solid/navicon", + "fontawesome/solid/network-wired", + "fontawesome/solid/neuter", + "fontawesome/solid/newspaper", + "fontawesome/solid/non-binary", + "fontawesome/solid/not-equal", + "fontawesome/solid/notdef", + "fontawesome/solid/note-sticky", + "fontawesome/solid/notes-medical", + "fontawesome/solid/o", + "fontawesome/solid/object-group", + "fontawesome/solid/object-ungroup", + "fontawesome/solid/octagon", + "fontawesome/solid/oil-can", + "fontawesome/solid/oil-well", + "fontawesome/solid/om", + "fontawesome/solid/otter", + "fontawesome/solid/outdent", + "fontawesome/solid/p", + "fontawesome/solid/pager", + "fontawesome/solid/paint-brush", + "fontawesome/solid/paint-roller", + "fontawesome/solid/paintbrush", + "fontawesome/solid/palette", + "fontawesome/solid/pallet", + "fontawesome/solid/panorama", + "fontawesome/solid/paper-plane", + "fontawesome/solid/paperclip", + "fontawesome/solid/parachute-box", + "fontawesome/solid/paragraph", + "fontawesome/solid/parking", + "fontawesome/solid/passport", + "fontawesome/solid/pastafarianism", + "fontawesome/solid/paste", + "fontawesome/solid/pause-circle", + "fontawesome/solid/pause", + "fontawesome/solid/paw", + "fontawesome/solid/peace", + "fontawesome/solid/pen-alt", + "fontawesome/solid/pen-clip", + "fontawesome/solid/pen-fancy", + "fontawesome/solid/pen-nib", + "fontawesome/solid/pen-ruler", + "fontawesome/solid/pen-square", + "fontawesome/solid/pen-to-square", + "fontawesome/solid/pen", + "fontawesome/solid/pencil-alt", + "fontawesome/solid/pencil-ruler", + "fontawesome/solid/pencil-square", + "fontawesome/solid/pencil", + "fontawesome/solid/pentagon", + "fontawesome/solid/people-arrows-left-right", + "fontawesome/solid/people-arrows", + "fontawesome/solid/people-carry-box", + "fontawesome/solid/people-carry", + "fontawesome/solid/people-group", + "fontawesome/solid/people-line", + "fontawesome/solid/people-pulling", + "fontawesome/solid/people-robbery", + "fontawesome/solid/people-roof", + "fontawesome/solid/pepper-hot", + "fontawesome/solid/percent", + "fontawesome/solid/percentage", + "fontawesome/solid/person-arrow-down-to-line", + "fontawesome/solid/person-arrow-up-from-line", + "fontawesome/solid/person-biking", + "fontawesome/solid/person-booth", + "fontawesome/solid/person-breastfeeding", + "fontawesome/solid/person-burst", + "fontawesome/solid/person-cane", + "fontawesome/solid/person-chalkboard", + "fontawesome/solid/person-circle-check", + "fontawesome/solid/person-circle-exclamation", + "fontawesome/solid/person-circle-minus", + "fontawesome/solid/person-circle-plus", + "fontawesome/solid/person-circle-question", + "fontawesome/solid/person-circle-xmark", + "fontawesome/solid/person-digging", + "fontawesome/solid/person-dots-from-line", + "fontawesome/solid/person-dress-burst", + "fontawesome/solid/person-dress", + "fontawesome/solid/person-drowning", + "fontawesome/solid/person-falling-burst", + "fontawesome/solid/person-falling", + "fontawesome/solid/person-half-dress", + "fontawesome/solid/person-harassing", + "fontawesome/solid/person-hiking", + "fontawesome/solid/person-military-pointing", + "fontawesome/solid/person-military-rifle", + "fontawesome/solid/person-military-to-person", + "fontawesome/solid/person-praying", + "fontawesome/solid/person-pregnant", + "fontawesome/solid/person-rays", + "fontawesome/solid/person-rifle", + "fontawesome/solid/person-running", + "fontawesome/solid/person-shelter", + "fontawesome/solid/person-skating", + "fontawesome/solid/person-skiing-nordic", + "fontawesome/solid/person-skiing", + "fontawesome/solid/person-snowboarding", + "fontawesome/solid/person-swimming", + "fontawesome/solid/person-through-window", + "fontawesome/solid/person-walking-arrow-loop-left", + "fontawesome/solid/person-walking-arrow-right", + "fontawesome/solid/person-walking-dashed-line-arrow-right", + "fontawesome/solid/person-walking-luggage", + "fontawesome/solid/person-walking-with-cane", + "fontawesome/solid/person-walking", + "fontawesome/solid/person", + "fontawesome/solid/peseta-sign", + "fontawesome/solid/peso-sign", + "fontawesome/solid/phone-alt", + "fontawesome/solid/phone-flip", + "fontawesome/solid/phone-slash", + "fontawesome/solid/phone-square-alt", + "fontawesome/solid/phone-square", + "fontawesome/solid/phone-volume", + "fontawesome/solid/phone", + "fontawesome/solid/photo-film", + "fontawesome/solid/photo-video", + "fontawesome/solid/pie-chart", + "fontawesome/solid/piggy-bank", + "fontawesome/solid/pills", + "fontawesome/solid/ping-pong-paddle-ball", + "fontawesome/solid/pizza-slice", + "fontawesome/solid/place-of-worship", + "fontawesome/solid/plane-arrival", + "fontawesome/solid/plane-circle-check", + "fontawesome/solid/plane-circle-exclamation", + "fontawesome/solid/plane-circle-xmark", + "fontawesome/solid/plane-departure", + "fontawesome/solid/plane-lock", + "fontawesome/solid/plane-slash", + "fontawesome/solid/plane-up", + "fontawesome/solid/plane", + "fontawesome/solid/plant-wilt", + "fontawesome/solid/plate-wheat", + "fontawesome/solid/play-circle", + "fontawesome/solid/play", + "fontawesome/solid/plug-circle-bolt", + "fontawesome/solid/plug-circle-check", + "fontawesome/solid/plug-circle-exclamation", + "fontawesome/solid/plug-circle-minus", + "fontawesome/solid/plug-circle-plus", + "fontawesome/solid/plug-circle-xmark", + "fontawesome/solid/plug", + "fontawesome/solid/plus-circle", + "fontawesome/solid/plus-minus", + "fontawesome/solid/plus-square", + "fontawesome/solid/plus", + "fontawesome/solid/podcast", + "fontawesome/solid/poll-h", + "fontawesome/solid/poll", + "fontawesome/solid/poo-bolt", + "fontawesome/solid/poo-storm", + "fontawesome/solid/poo", + "fontawesome/solid/poop", + "fontawesome/solid/portrait", + "fontawesome/solid/pound-sign", + "fontawesome/solid/power-off", + "fontawesome/solid/pray", + "fontawesome/solid/praying-hands", + "fontawesome/solid/prescription-bottle-alt", + "fontawesome/solid/prescription-bottle-medical", + "fontawesome/solid/prescription-bottle", + "fontawesome/solid/prescription", + "fontawesome/solid/print", + "fontawesome/solid/procedures", + "fontawesome/solid/project-diagram", + "fontawesome/solid/pump-medical", + "fontawesome/solid/pump-soap", + "fontawesome/solid/puzzle-piece", + "fontawesome/solid/q", + "fontawesome/solid/qrcode", + "fontawesome/solid/question-circle", + "fontawesome/solid/question", + "fontawesome/solid/quidditch-broom-ball", + "fontawesome/solid/quidditch", + "fontawesome/solid/quote-left-alt", + "fontawesome/solid/quote-left", + "fontawesome/solid/quote-right-alt", + "fontawesome/solid/quote-right", + "fontawesome/solid/quran", + "fontawesome/solid/r", + "fontawesome/solid/radiation-alt", + "fontawesome/solid/radiation", + "fontawesome/solid/radio", + "fontawesome/solid/rainbow", + "fontawesome/solid/random", + "fontawesome/solid/ranking-star", + "fontawesome/solid/receipt", + "fontawesome/solid/record-vinyl", + "fontawesome/solid/rectangle-ad", + "fontawesome/solid/rectangle-list", + "fontawesome/solid/rectangle-times", + "fontawesome/solid/rectangle-xmark", + "fontawesome/solid/recycle", + "fontawesome/solid/redo-alt", + "fontawesome/solid/redo", + "fontawesome/solid/refresh", + "fontawesome/solid/registered", + "fontawesome/solid/remove-format", + "fontawesome/solid/remove", + "fontawesome/solid/reorder", + "fontawesome/solid/repeat", + "fontawesome/solid/reply-all", + "fontawesome/solid/reply", + "fontawesome/solid/republican", + "fontawesome/solid/restroom", + "fontawesome/solid/retweet", + "fontawesome/solid/ribbon", + "fontawesome/solid/right-from-bracket", + "fontawesome/solid/right-left", + "fontawesome/solid/right-long", + "fontawesome/solid/right-to-bracket", + "fontawesome/solid/ring", + "fontawesome/solid/rmb", + "fontawesome/solid/road-barrier", + "fontawesome/solid/road-bridge", + "fontawesome/solid/road-circle-check", + "fontawesome/solid/road-circle-exclamation", + "fontawesome/solid/road-circle-xmark", + "fontawesome/solid/road-lock", + "fontawesome/solid/road-spikes", + "fontawesome/solid/road", + "fontawesome/solid/robot", + "fontawesome/solid/rocket", + "fontawesome/solid/rod-asclepius", + "fontawesome/solid/rod-snake", + "fontawesome/solid/rotate-back", + "fontawesome/solid/rotate-backward", + "fontawesome/solid/rotate-forward", + "fontawesome/solid/rotate-left", + "fontawesome/solid/rotate-right", + "fontawesome/solid/rotate", + "fontawesome/solid/rouble", + "fontawesome/solid/route", + "fontawesome/solid/rss-square", + "fontawesome/solid/rss", + "fontawesome/solid/rub", + "fontawesome/solid/ruble-sign", + "fontawesome/solid/ruble", + "fontawesome/solid/rug", + "fontawesome/solid/ruler-combined", + "fontawesome/solid/ruler-horizontal", + "fontawesome/solid/ruler-vertical", + "fontawesome/solid/ruler", + "fontawesome/solid/running", + "fontawesome/solid/rupee-sign", + "fontawesome/solid/rupee", + "fontawesome/solid/rupiah-sign", + "fontawesome/solid/s", + "fontawesome/solid/sack-dollar", + "fontawesome/solid/sack-xmark", + "fontawesome/solid/sad-cry", + "fontawesome/solid/sad-tear", + "fontawesome/solid/sailboat", + "fontawesome/solid/satellite-dish", + "fontawesome/solid/satellite", + "fontawesome/solid/save", + "fontawesome/solid/scale-balanced", + "fontawesome/solid/scale-unbalanced-flip", + "fontawesome/solid/scale-unbalanced", + "fontawesome/solid/school-circle-check", + "fontawesome/solid/school-circle-exclamation", + "fontawesome/solid/school-circle-xmark", + "fontawesome/solid/school-flag", + "fontawesome/solid/school-lock", + "fontawesome/solid/school", + "fontawesome/solid/scissors", + "fontawesome/solid/screwdriver-wrench", + "fontawesome/solid/screwdriver", + "fontawesome/solid/scroll-torah", + "fontawesome/solid/scroll", + "fontawesome/solid/sd-card", + "fontawesome/solid/search-dollar", + "fontawesome/solid/search-location", + "fontawesome/solid/search-minus", + "fontawesome/solid/search-plus", + "fontawesome/solid/search", + "fontawesome/solid/section", + "fontawesome/solid/seedling", + "fontawesome/solid/septagon", + "fontawesome/solid/server", + "fontawesome/solid/shapes", + "fontawesome/solid/share-alt-square", + "fontawesome/solid/share-alt", + "fontawesome/solid/share-from-square", + "fontawesome/solid/share-nodes", + "fontawesome/solid/share-square", + "fontawesome/solid/share", + "fontawesome/solid/sheet-plastic", + "fontawesome/solid/shekel-sign", + "fontawesome/solid/shekel", + "fontawesome/solid/sheqel-sign", + "fontawesome/solid/sheqel", + "fontawesome/solid/shield-alt", + "fontawesome/solid/shield-blank", + "fontawesome/solid/shield-cat", + "fontawesome/solid/shield-dog", + "fontawesome/solid/shield-halved", + "fontawesome/solid/shield-heart", + "fontawesome/solid/shield-virus", + "fontawesome/solid/shield", + "fontawesome/solid/ship", + "fontawesome/solid/shipping-fast", + "fontawesome/solid/shirt", + "fontawesome/solid/shoe-prints", + "fontawesome/solid/shop-lock", + "fontawesome/solid/shop-slash", + "fontawesome/solid/shop", + "fontawesome/solid/shopping-bag", + "fontawesome/solid/shopping-basket", + "fontawesome/solid/shopping-cart", + "fontawesome/solid/shower", + "fontawesome/solid/shrimp", + "fontawesome/solid/shuffle", + "fontawesome/solid/shuttle-space", + "fontawesome/solid/shuttle-van", + "fontawesome/solid/sign-hanging", + "fontawesome/solid/sign-in-alt", + "fontawesome/solid/sign-in", + "fontawesome/solid/sign-language", + "fontawesome/solid/sign-out-alt", + "fontawesome/solid/sign-out", + "fontawesome/solid/sign", + "fontawesome/solid/signal-5", + "fontawesome/solid/signal-perfect", + "fontawesome/solid/signal", + "fontawesome/solid/signature", + "fontawesome/solid/signing", + "fontawesome/solid/signs-post", + "fontawesome/solid/sim-card", + "fontawesome/solid/single-quote-left", + "fontawesome/solid/single-quote-right", + "fontawesome/solid/sink", + "fontawesome/solid/sitemap", + "fontawesome/solid/skating", + "fontawesome/solid/skiing-nordic", + "fontawesome/solid/skiing", + "fontawesome/solid/skull-crossbones", + "fontawesome/solid/skull", + "fontawesome/solid/slash", + "fontawesome/solid/sleigh", + "fontawesome/solid/sliders-h", + "fontawesome/solid/sliders", + "fontawesome/solid/smile-beam", + "fontawesome/solid/smile-wink", + "fontawesome/solid/smile", + "fontawesome/solid/smog", + "fontawesome/solid/smoking-ban", + "fontawesome/solid/smoking", + "fontawesome/solid/sms", + "fontawesome/solid/snowboarding", + "fontawesome/solid/snowflake", + "fontawesome/solid/snowman", + "fontawesome/solid/snowplow", + "fontawesome/solid/soap", + "fontawesome/solid/soccer-ball", + "fontawesome/solid/socks", + "fontawesome/solid/solar-panel", + "fontawesome/solid/sort-alpha-asc", + "fontawesome/solid/sort-alpha-desc", + "fontawesome/solid/sort-alpha-down-alt", + "fontawesome/solid/sort-alpha-down", + "fontawesome/solid/sort-alpha-up-alt", + "fontawesome/solid/sort-alpha-up", + "fontawesome/solid/sort-amount-asc", + "fontawesome/solid/sort-amount-desc", + "fontawesome/solid/sort-amount-down-alt", + "fontawesome/solid/sort-amount-down", + "fontawesome/solid/sort-amount-up-alt", + "fontawesome/solid/sort-amount-up", + "fontawesome/solid/sort-asc", + "fontawesome/solid/sort-desc", + "fontawesome/solid/sort-down", + "fontawesome/solid/sort-numeric-asc", + "fontawesome/solid/sort-numeric-desc", + "fontawesome/solid/sort-numeric-down-alt", + "fontawesome/solid/sort-numeric-down", + "fontawesome/solid/sort-numeric-up-alt", + "fontawesome/solid/sort-numeric-up", + "fontawesome/solid/sort-up", + "fontawesome/solid/sort", + "fontawesome/solid/spa", + "fontawesome/solid/space-shuttle", + "fontawesome/solid/spaghetti-monster-flying", + "fontawesome/solid/spell-check", + "fontawesome/solid/spider", + "fontawesome/solid/spinner", + "fontawesome/solid/spiral", + "fontawesome/solid/splotch", + "fontawesome/solid/spoon", + "fontawesome/solid/spray-can-sparkles", + "fontawesome/solid/spray-can", + "fontawesome/solid/sprout", + "fontawesome/solid/square-arrow-up-right", + "fontawesome/solid/square-binary", + "fontawesome/solid/square-caret-down", + "fontawesome/solid/square-caret-left", + "fontawesome/solid/square-caret-right", + "fontawesome/solid/square-caret-up", + "fontawesome/solid/square-check", + "fontawesome/solid/square-envelope", + "fontawesome/solid/square-full", + "fontawesome/solid/square-h", + "fontawesome/solid/square-minus", + "fontawesome/solid/square-nfi", + "fontawesome/solid/square-parking", + "fontawesome/solid/square-pen", + "fontawesome/solid/square-person-confined", + "fontawesome/solid/square-phone-flip", + "fontawesome/solid/square-phone", + "fontawesome/solid/square-plus", + "fontawesome/solid/square-poll-horizontal", + "fontawesome/solid/square-poll-vertical", + "fontawesome/solid/square-root-alt", + "fontawesome/solid/square-root-variable", + "fontawesome/solid/square-rss", + "fontawesome/solid/square-share-nodes", + "fontawesome/solid/square-up-right", + "fontawesome/solid/square-virus", + "fontawesome/solid/square-xmark", + "fontawesome/solid/square", + "fontawesome/solid/staff-aesculapius", + "fontawesome/solid/staff-snake", + "fontawesome/solid/stairs", + "fontawesome/solid/stamp", + "fontawesome/solid/stapler", + "fontawesome/solid/star-and-crescent", + "fontawesome/solid/star-half-alt", + "fontawesome/solid/star-half-stroke", + "fontawesome/solid/star-half", + "fontawesome/solid/star-of-david", + "fontawesome/solid/star-of-life", + "fontawesome/solid/star", + "fontawesome/solid/step-backward", + "fontawesome/solid/step-forward", + "fontawesome/solid/sterling-sign", + "fontawesome/solid/stethoscope", + "fontawesome/solid/sticky-note", + "fontawesome/solid/stop-circle", + "fontawesome/solid/stop", + "fontawesome/solid/stopwatch-20", + "fontawesome/solid/stopwatch", + "fontawesome/solid/store-alt-slash", + "fontawesome/solid/store-alt", + "fontawesome/solid/store-slash", + "fontawesome/solid/store", + "fontawesome/solid/stream", + "fontawesome/solid/street-view", + "fontawesome/solid/strikethrough", + "fontawesome/solid/stroopwafel", + "fontawesome/solid/subscript", + "fontawesome/solid/subtract", + "fontawesome/solid/subway", + "fontawesome/solid/suitcase-medical", + "fontawesome/solid/suitcase-rolling", + "fontawesome/solid/suitcase", + "fontawesome/solid/sun-plant-wilt", + "fontawesome/solid/sun", + "fontawesome/solid/superscript", + "fontawesome/solid/surprise", + "fontawesome/solid/swatchbook", + "fontawesome/solid/swimmer", + "fontawesome/solid/swimming-pool", + "fontawesome/solid/synagogue", + "fontawesome/solid/sync-alt", + "fontawesome/solid/sync", + "fontawesome/solid/syringe", + "fontawesome/solid/t-shirt", + "fontawesome/solid/t", + "fontawesome/solid/table-cells-column-lock", + "fontawesome/solid/table-cells-large", + "fontawesome/solid/table-cells-row-lock", + "fontawesome/solid/table-cells-row-unlock", + "fontawesome/solid/table-cells", + "fontawesome/solid/table-columns", + "fontawesome/solid/table-list", + "fontawesome/solid/table-tennis-paddle-ball", + "fontawesome/solid/table-tennis", + "fontawesome/solid/table", + "fontawesome/solid/tablet-alt", + "fontawesome/solid/tablet-android", + "fontawesome/solid/tablet-button", + "fontawesome/solid/tablet-screen-button", + "fontawesome/solid/tablet", + "fontawesome/solid/tablets", + "fontawesome/solid/tachograph-digital", + "fontawesome/solid/tachometer-alt-average", + "fontawesome/solid/tachometer-alt-fast", + "fontawesome/solid/tachometer-alt", + "fontawesome/solid/tachometer-average", + "fontawesome/solid/tachometer-fast", + "fontawesome/solid/tachometer", + "fontawesome/solid/tag", + "fontawesome/solid/tags", + "fontawesome/solid/tanakh", + "fontawesome/solid/tape", + "fontawesome/solid/tarp-droplet", + "fontawesome/solid/tarp", + "fontawesome/solid/tasks-alt", + "fontawesome/solid/tasks", + "fontawesome/solid/taxi", + "fontawesome/solid/teeth-open", + "fontawesome/solid/teeth", + "fontawesome/solid/teletype", + "fontawesome/solid/television", + "fontawesome/solid/temperature-0", + "fontawesome/solid/temperature-1", + "fontawesome/solid/temperature-2", + "fontawesome/solid/temperature-3", + "fontawesome/solid/temperature-4", + "fontawesome/solid/temperature-arrow-down", + "fontawesome/solid/temperature-arrow-up", + "fontawesome/solid/temperature-down", + "fontawesome/solid/temperature-empty", + "fontawesome/solid/temperature-full", + "fontawesome/solid/temperature-half", + "fontawesome/solid/temperature-high", + "fontawesome/solid/temperature-low", + "fontawesome/solid/temperature-quarter", + "fontawesome/solid/temperature-three-quarters", + "fontawesome/solid/temperature-up", + "fontawesome/solid/tenge-sign", + "fontawesome/solid/tenge", + "fontawesome/solid/tent-arrow-down-to-line", + "fontawesome/solid/tent-arrow-left-right", + "fontawesome/solid/tent-arrow-turn-left", + "fontawesome/solid/tent-arrows-down", + "fontawesome/solid/tent", + "fontawesome/solid/tents", + "fontawesome/solid/terminal", + "fontawesome/solid/text-height", + "fontawesome/solid/text-slash", + "fontawesome/solid/text-width", + "fontawesome/solid/th-large", + "fontawesome/solid/th-list", + "fontawesome/solid/th", + "fontawesome/solid/theater-masks", + "fontawesome/solid/thermometer-0", + "fontawesome/solid/thermometer-1", + "fontawesome/solid/thermometer-2", + "fontawesome/solid/thermometer-3", + "fontawesome/solid/thermometer-4", + "fontawesome/solid/thermometer-empty", + "fontawesome/solid/thermometer-full", + "fontawesome/solid/thermometer-half", + "fontawesome/solid/thermometer-quarter", + "fontawesome/solid/thermometer-three-quarters", + "fontawesome/solid/thermometer", + "fontawesome/solid/thumb-tack-slash", + "fontawesome/solid/thumb-tack", + "fontawesome/solid/thumbs-down", + "fontawesome/solid/thumbs-up", + "fontawesome/solid/thumbtack-slash", + "fontawesome/solid/thumbtack", + "fontawesome/solid/thunderstorm", + "fontawesome/solid/ticket-alt", + "fontawesome/solid/ticket-simple", + "fontawesome/solid/ticket", + "fontawesome/solid/timeline", + "fontawesome/solid/times-circle", + "fontawesome/solid/times-rectangle", + "fontawesome/solid/times-square", + "fontawesome/solid/times", + "fontawesome/solid/tint-slash", + "fontawesome/solid/tint", + "fontawesome/solid/tired", + "fontawesome/solid/toggle-off", + "fontawesome/solid/toggle-on", + "fontawesome/solid/toilet-paper-alt", + "fontawesome/solid/toilet-paper-blank", + "fontawesome/solid/toilet-paper-slash", + "fontawesome/solid/toilet-paper", + "fontawesome/solid/toilet-portable", + "fontawesome/solid/toilet", + "fontawesome/solid/toilets-portable", + "fontawesome/solid/toolbox", + "fontawesome/solid/tools", + "fontawesome/solid/tooth", + "fontawesome/solid/torah", + "fontawesome/solid/torii-gate", + "fontawesome/solid/tornado", + "fontawesome/solid/tower-broadcast", + "fontawesome/solid/tower-cell", + "fontawesome/solid/tower-observation", + "fontawesome/solid/tractor", + "fontawesome/solid/trademark", + "fontawesome/solid/traffic-light", + "fontawesome/solid/trailer", + "fontawesome/solid/train-subway", + "fontawesome/solid/train-tram", + "fontawesome/solid/train", + "fontawesome/solid/tram", + "fontawesome/solid/transgender-alt", + "fontawesome/solid/transgender", + "fontawesome/solid/trash-alt", + "fontawesome/solid/trash-arrow-up", + "fontawesome/solid/trash-can-arrow-up", + "fontawesome/solid/trash-can", + "fontawesome/solid/trash-restore-alt", + "fontawesome/solid/trash-restore", + "fontawesome/solid/trash", + "fontawesome/solid/tree-city", + "fontawesome/solid/tree", + "fontawesome/solid/triangle-circle-square", + "fontawesome/solid/triangle-exclamation", + "fontawesome/solid/trophy", + "fontawesome/solid/trowel-bricks", + "fontawesome/solid/trowel", + "fontawesome/solid/truck-arrow-right", + "fontawesome/solid/truck-droplet", + "fontawesome/solid/truck-fast", + "fontawesome/solid/truck-field-un", + "fontawesome/solid/truck-field", + "fontawesome/solid/truck-front", + "fontawesome/solid/truck-loading", + "fontawesome/solid/truck-medical", + "fontawesome/solid/truck-monster", + "fontawesome/solid/truck-moving", + "fontawesome/solid/truck-pickup", + "fontawesome/solid/truck-plane", + "fontawesome/solid/truck-ramp-box", + "fontawesome/solid/truck", + "fontawesome/solid/try", + "fontawesome/solid/tshirt", + "fontawesome/solid/tty", + "fontawesome/solid/turkish-lira-sign", + "fontawesome/solid/turkish-lira", + "fontawesome/solid/turn-down", + "fontawesome/solid/turn-up", + "fontawesome/solid/tv-alt", + "fontawesome/solid/tv", + "fontawesome/solid/u", + "fontawesome/solid/umbrella-beach", + "fontawesome/solid/umbrella", + "fontawesome/solid/underline", + "fontawesome/solid/undo-alt", + "fontawesome/solid/undo", + "fontawesome/solid/universal-access", + "fontawesome/solid/university", + "fontawesome/solid/unlink", + "fontawesome/solid/unlock-alt", + "fontawesome/solid/unlock-keyhole", + "fontawesome/solid/unlock", + "fontawesome/solid/unsorted", + "fontawesome/solid/up-down-left-right", + "fontawesome/solid/up-down", + "fontawesome/solid/up-long", + "fontawesome/solid/up-right-and-down-left-from-center", + "fontawesome/solid/up-right-from-square", + "fontawesome/solid/upload", + "fontawesome/solid/usd", + "fontawesome/solid/user-alt-slash", + "fontawesome/solid/user-alt", + "fontawesome/solid/user-astronaut", + "fontawesome/solid/user-check", + "fontawesome/solid/user-circle", + "fontawesome/solid/user-clock", + "fontawesome/solid/user-cog", + "fontawesome/solid/user-doctor", + "fontawesome/solid/user-edit", + "fontawesome/solid/user-friends", + "fontawesome/solid/user-gear", + "fontawesome/solid/user-graduate", + "fontawesome/solid/user-group", + "fontawesome/solid/user-injured", + "fontawesome/solid/user-large-slash", + "fontawesome/solid/user-large", + "fontawesome/solid/user-lock", + "fontawesome/solid/user-md", + "fontawesome/solid/user-minus", + "fontawesome/solid/user-ninja", + "fontawesome/solid/user-nurse", + "fontawesome/solid/user-pen", + "fontawesome/solid/user-plus", + "fontawesome/solid/user-secret", + "fontawesome/solid/user-shield", + "fontawesome/solid/user-slash", + "fontawesome/solid/user-tag", + "fontawesome/solid/user-tie", + "fontawesome/solid/user-times", + "fontawesome/solid/user-xmark", + "fontawesome/solid/user", + "fontawesome/solid/users-between-lines", + "fontawesome/solid/users-cog", + "fontawesome/solid/users-gear", + "fontawesome/solid/users-line", + "fontawesome/solid/users-rays", + "fontawesome/solid/users-rectangle", + "fontawesome/solid/users-slash", + "fontawesome/solid/users-viewfinder", + "fontawesome/solid/users", + "fontawesome/solid/utensil-spoon", + "fontawesome/solid/utensils", + "fontawesome/solid/v", + "fontawesome/solid/van-shuttle", + "fontawesome/solid/vault", + "fontawesome/solid/vcard", + "fontawesome/solid/vector-polygon", + "fontawesome/solid/venus-double", + "fontawesome/solid/venus-mars", + "fontawesome/solid/venus", + "fontawesome/solid/vest-patches", + "fontawesome/solid/vest", + "fontawesome/solid/vial-circle-check", + "fontawesome/solid/vial-virus", + "fontawesome/solid/vial", + "fontawesome/solid/vials", + "fontawesome/solid/video-camera", + "fontawesome/solid/video-slash", + "fontawesome/solid/video", + "fontawesome/solid/vihara", + "fontawesome/solid/virus-covid-slash", + "fontawesome/solid/virus-covid", + "fontawesome/solid/virus-slash", + "fontawesome/solid/virus", + "fontawesome/solid/viruses", + "fontawesome/solid/voicemail", + "fontawesome/solid/volcano", + "fontawesome/solid/volleyball-ball", + "fontawesome/solid/volleyball", + "fontawesome/solid/volume-control-phone", + "fontawesome/solid/volume-down", + "fontawesome/solid/volume-high", + "fontawesome/solid/volume-low", + "fontawesome/solid/volume-mute", + "fontawesome/solid/volume-off", + "fontawesome/solid/volume-times", + "fontawesome/solid/volume-up", + "fontawesome/solid/volume-xmark", + "fontawesome/solid/vote-yea", + "fontawesome/solid/vr-cardboard", + "fontawesome/solid/w", + "fontawesome/solid/walkie-talkie", + "fontawesome/solid/walking", + "fontawesome/solid/wallet", + "fontawesome/solid/wand-magic-sparkles", + "fontawesome/solid/wand-magic", + "fontawesome/solid/wand-sparkles", + "fontawesome/solid/warehouse", + "fontawesome/solid/warning", + "fontawesome/solid/water-ladder", + "fontawesome/solid/water", + "fontawesome/solid/wave-square", + "fontawesome/solid/web-awesome", + "fontawesome/solid/weight-hanging", + "fontawesome/solid/weight-scale", + "fontawesome/solid/weight", + "fontawesome/solid/wheat-alt", + "fontawesome/solid/wheat-awn-circle-exclamation", + "fontawesome/solid/wheat-awn", + "fontawesome/solid/wheelchair-alt", + "fontawesome/solid/wheelchair-move", + "fontawesome/solid/wheelchair", + "fontawesome/solid/whiskey-glass", + "fontawesome/solid/wifi-3", + "fontawesome/solid/wifi-strong", + "fontawesome/solid/wifi", + "fontawesome/solid/wind", + "fontawesome/solid/window-close", + "fontawesome/solid/window-maximize", + "fontawesome/solid/window-minimize", + "fontawesome/solid/window-restore", + "fontawesome/solid/wine-bottle", + "fontawesome/solid/wine-glass-alt", + "fontawesome/solid/wine-glass-empty", + "fontawesome/solid/wine-glass", + "fontawesome/solid/won-sign", + "fontawesome/solid/won", + "fontawesome/solid/worm", + "fontawesome/solid/wrench", + "fontawesome/solid/x-ray", + "fontawesome/solid/x", + "fontawesome/solid/xmark-circle", + "fontawesome/solid/xmark-square", + "fontawesome/solid/xmark", + "fontawesome/solid/xmarks-lines", + "fontawesome/solid/y", + "fontawesome/solid/yen-sign", + "fontawesome/solid/yen", + "fontawesome/solid/yin-yang", + "fontawesome/solid/z", + "fontawesome/solid/zap", + "logo-monochrome", + "logo", + "material/ab-testing", + "material/abacus", + "material/abjad-arabic", + "material/abjad-hebrew", + "material/abugida-devanagari", + "material/abugida-thai", + "material/access-point-check", + "material/access-point-minus", + "material/access-point-network-off", + "material/access-point-network", + "material/access-point-off", + "material/access-point-plus", + "material/access-point-remove", + "material/access-point", + "material/account-alert-outline", + "material/account-alert", + "material/account-arrow-down-outline", + "material/account-arrow-down", + "material/account-arrow-left-outline", + "material/account-arrow-left", + "material/account-arrow-right-outline", + "material/account-arrow-right", + "material/account-arrow-up-outline", + "material/account-arrow-up", + "material/account-badge-outline", + "material/account-badge", + "material/account-box-edit-outline", + "material/account-box-minus-outline", + "material/account-box-multiple-outline", + "material/account-box-multiple", + "material/account-box-outline", + "material/account-box-plus-outline", + "material/account-box", + "material/account-cancel-outline", + "material/account-cancel", + "material/account-card-outline", + "material/account-card", + "material/account-cash-outline", + "material/account-cash", + "material/account-check-outline", + "material/account-check", + "material/account-child-circle", + "material/account-child-outline", + "material/account-child", + "material/account-circle-outline", + "material/account-circle", + "material/account-clock-outline", + "material/account-clock", + "material/account-cog-outline", + "material/account-cog", + "material/account-convert-outline", + "material/account-convert", + "material/account-cowboy-hat-outline", + "material/account-cowboy-hat", + "material/account-credit-card-outline", + "material/account-credit-card", + "material/account-details-outline", + "material/account-details", + "material/account-edit-outline", + "material/account-edit", + "material/account-eye-outline", + "material/account-eye", + "material/account-file-outline", + "material/account-file-text-outline", + "material/account-file-text", + "material/account-file", + "material/account-filter-outline", + "material/account-filter", + "material/account-group-outline", + "material/account-group", + "material/account-hard-hat-outline", + "material/account-hard-hat", + "material/account-heart-outline", + "material/account-heart", + "material/account-injury-outline", + "material/account-injury", + "material/account-key-outline", + "material/account-key", + "material/account-lock-open-outline", + "material/account-lock-open", + "material/account-lock-outline", + "material/account-lock", + "material/account-minus-outline", + "material/account-minus", + "material/account-multiple-check-outline", + "material/account-multiple-check", + "material/account-multiple-minus-outline", + "material/account-multiple-minus", + "material/account-multiple-outline", + "material/account-multiple-plus-outline", + "material/account-multiple-plus", + "material/account-multiple-remove-outline", + "material/account-multiple-remove", + "material/account-multiple", + "material/account-music-outline", + "material/account-music", + "material/account-network-off-outline", + "material/account-network-off", + "material/account-network-outline", + "material/account-network", + "material/account-off-outline", + "material/account-off", + "material/account-outline", + "material/account-plus-outline", + "material/account-plus", + "material/account-question-outline", + "material/account-question", + "material/account-reactivate-outline", + "material/account-reactivate", + "material/account-remove-outline", + "material/account-remove", + "material/account-school-outline", + "material/account-school", + "material/account-search-outline", + "material/account-search", + "material/account-settings-outline", + "material/account-settings", + "material/account-star-outline", + "material/account-star", + "material/account-supervisor-circle-outline", + "material/account-supervisor-circle", + "material/account-supervisor-outline", + "material/account-supervisor", + "material/account-switch-outline", + "material/account-switch", + "material/account-sync-outline", + "material/account-sync", + "material/account-tag-outline", + "material/account-tag", + "material/account-tie-hat-outline", + "material/account-tie-hat", + "material/account-tie-outline", + "material/account-tie-voice-off-outline", + "material/account-tie-voice-off", + "material/account-tie-voice-outline", + "material/account-tie-voice", + "material/account-tie-woman", + "material/account-tie", + "material/account-voice-off", + "material/account-voice", + "material/account-wrench-outline", + "material/account-wrench", + "material/account", + "material/adjust", + "material/advertisements-off", + "material/advertisements", + "material/air-conditioner", + "material/air-filter", + "material/air-horn", + "material/air-humidifier-off", + "material/air-humidifier", + "material/air-purifier-off", + "material/air-purifier", + "material/airbag", + "material/airballoon-outline", + "material/airballoon", + "material/airplane-alert", + "material/airplane-check", + "material/airplane-clock", + "material/airplane-cog", + "material/airplane-edit", + "material/airplane-landing", + "material/airplane-marker", + "material/airplane-minus", + "material/airplane-off", + "material/airplane-plus", + "material/airplane-remove", + "material/airplane-search", + "material/airplane-settings", + "material/airplane-takeoff", + "material/airplane", + "material/airport", + "material/alarm-bell", + "material/alarm-check", + "material/alarm-light-off-outline", + "material/alarm-light-off", + "material/alarm-light-outline", + "material/alarm-light", + "material/alarm-multiple", + "material/alarm-note-off", + "material/alarm-note", + "material/alarm-off", + "material/alarm-panel-outline", + "material/alarm-panel", + "material/alarm-plus", + "material/alarm-snooze", + "material/alarm", + "material/album", + "material/alert-box-outline", + "material/alert-box", + "material/alert-circle-check-outline", + "material/alert-circle-check", + "material/alert-circle-outline", + "material/alert-circle", + "material/alert-decagram-outline", + "material/alert-decagram", + "material/alert-minus-outline", + "material/alert-minus", + "material/alert-octagon-outline", + "material/alert-octagon", + "material/alert-octagram-outline", + "material/alert-octagram", + "material/alert-outline", + "material/alert-plus-outline", + "material/alert-plus", + "material/alert-remove-outline", + "material/alert-remove", + "material/alert-rhombus-outline", + "material/alert-rhombus", + "material/alert", + "material/alien-outline", + "material/alien", + "material/align-horizontal-center", + "material/align-horizontal-distribute", + "material/align-horizontal-left", + "material/align-horizontal-right", + "material/align-vertical-bottom", + "material/align-vertical-center", + "material/align-vertical-distribute", + "material/align-vertical-top", + "material/all-inclusive-box-outline", + "material/all-inclusive-box", + "material/all-inclusive", + "material/allergy", + "material/alpha-a-box-outline", + "material/alpha-a-box", + "material/alpha-a-circle-outline", + "material/alpha-a-circle", + "material/alpha-a", + "material/alpha-b-box-outline", + "material/alpha-b-box", + "material/alpha-b-circle-outline", + "material/alpha-b-circle", + "material/alpha-b", + "material/alpha-c-box-outline", + "material/alpha-c-box", + "material/alpha-c-circle-outline", + "material/alpha-c-circle", + "material/alpha-c", + "material/alpha-d-box-outline", + "material/alpha-d-box", + "material/alpha-d-circle-outline", + "material/alpha-d-circle", + "material/alpha-d", + "material/alpha-e-box-outline", + "material/alpha-e-box", + "material/alpha-e-circle-outline", + "material/alpha-e-circle", + "material/alpha-e", + "material/alpha-f-box-outline", + "material/alpha-f-box", + "material/alpha-f-circle-outline", + "material/alpha-f-circle", + "material/alpha-f", + "material/alpha-g-box-outline", + "material/alpha-g-box", + "material/alpha-g-circle-outline", + "material/alpha-g-circle", + "material/alpha-g", + "material/alpha-h-box-outline", + "material/alpha-h-box", + "material/alpha-h-circle-outline", + "material/alpha-h-circle", + "material/alpha-h", + "material/alpha-i-box-outline", + "material/alpha-i-box", + "material/alpha-i-circle-outline", + "material/alpha-i-circle", + "material/alpha-i", + "material/alpha-j-box-outline", + "material/alpha-j-box", + "material/alpha-j-circle-outline", + "material/alpha-j-circle", + "material/alpha-j", + "material/alpha-k-box-outline", + "material/alpha-k-box", + "material/alpha-k-circle-outline", + "material/alpha-k-circle", + "material/alpha-k", + "material/alpha-l-box-outline", + "material/alpha-l-box", + "material/alpha-l-circle-outline", + "material/alpha-l-circle", + "material/alpha-l", + "material/alpha-m-box-outline", + "material/alpha-m-box", + "material/alpha-m-circle-outline", + "material/alpha-m-circle", + "material/alpha-m", + "material/alpha-n-box-outline", + "material/alpha-n-box", + "material/alpha-n-circle-outline", + "material/alpha-n-circle", + "material/alpha-n", + "material/alpha-o-box-outline", + "material/alpha-o-box", + "material/alpha-o-circle-outline", + "material/alpha-o-circle", + "material/alpha-o", + "material/alpha-p-box-outline", + "material/alpha-p-box", + "material/alpha-p-circle-outline", + "material/alpha-p-circle", + "material/alpha-p", + "material/alpha-q-box-outline", + "material/alpha-q-box", + "material/alpha-q-circle-outline", + "material/alpha-q-circle", + "material/alpha-q", + "material/alpha-r-box-outline", + "material/alpha-r-box", + "material/alpha-r-circle-outline", + "material/alpha-r-circle", + "material/alpha-r", + "material/alpha-s-box-outline", + "material/alpha-s-box", + "material/alpha-s-circle-outline", + "material/alpha-s-circle", + "material/alpha-s", + "material/alpha-t-box-outline", + "material/alpha-t-box", + "material/alpha-t-circle-outline", + "material/alpha-t-circle", + "material/alpha-t", + "material/alpha-u-box-outline", + "material/alpha-u-box", + "material/alpha-u-circle-outline", + "material/alpha-u-circle", + "material/alpha-u", + "material/alpha-v-box-outline", + "material/alpha-v-box", + "material/alpha-v-circle-outline", + "material/alpha-v-circle", + "material/alpha-v", + "material/alpha-w-box-outline", + "material/alpha-w-box", + "material/alpha-w-circle-outline", + "material/alpha-w-circle", + "material/alpha-w", + "material/alpha-x-box-outline", + "material/alpha-x-box", + "material/alpha-x-circle-outline", + "material/alpha-x-circle", + "material/alpha-x", + "material/alpha-y-box-outline", + "material/alpha-y-box", + "material/alpha-y-circle-outline", + "material/alpha-y-circle", + "material/alpha-y", + "material/alpha-z-box-outline", + "material/alpha-z-box", + "material/alpha-z-circle-outline", + "material/alpha-z-circle", + "material/alpha-z", + "material/alpha", + "material/alphabet-aurebesh", + "material/alphabet-cyrillic", + "material/alphabet-greek", + "material/alphabet-latin", + "material/alphabet-piqad", + "material/alphabet-tengwar", + "material/alphabetical-off", + "material/alphabetical-variant-off", + "material/alphabetical-variant", + "material/alphabetical", + "material/altimeter", + "material/ambulance", + "material/ammunition", + "material/ampersand", + "material/amplifier-off", + "material/amplifier", + "material/anchor", + "material/android-studio", + "material/android", + "material/angle-acute", + "material/angle-obtuse", + "material/angle-right", + "material/angular", + "material/angularjs", + "material/animation-outline", + "material/animation-play-outline", + "material/animation-play", + "material/animation", + "material/ansible", + "material/antenna", + "material/anvil", + "material/apache-kafka", + "material/api-off", + "material/api", + "material/apple-finder", + "material/apple-icloud", + "material/apple-ios", + "material/apple-keyboard-caps", + "material/apple-keyboard-command", + "material/apple-keyboard-control", + "material/apple-keyboard-option", + "material/apple-keyboard-shift", + "material/apple-safari", + "material/apple", + "material/application-array-outline", + "material/application-array", + "material/application-braces-outline", + "material/application-braces", + "material/application-brackets-outline", + "material/application-brackets", + "material/application-cog-outline", + "material/application-cog", + "material/application-edit-outline", + "material/application-edit", + "material/application-export", + "material/application-import", + "material/application-outline", + "material/application-parentheses-outline", + "material/application-parentheses", + "material/application-settings-outline", + "material/application-settings", + "material/application-variable-outline", + "material/application-variable", + "material/application", + "material/approximately-equal-box", + "material/approximately-equal", + "material/apps-box", + "material/apps", + "material/arch", + "material/archive-alert-outline", + "material/archive-alert", + "material/archive-arrow-down-outline", + "material/archive-arrow-down", + "material/archive-arrow-up-outline", + "material/archive-arrow-up", + "material/archive-cancel-outline", + "material/archive-cancel", + "material/archive-check-outline", + "material/archive-check", + "material/archive-clock-outline", + "material/archive-clock", + "material/archive-cog-outline", + "material/archive-cog", + "material/archive-edit-outline", + "material/archive-edit", + "material/archive-eye-outline", + "material/archive-eye", + "material/archive-lock-open-outline", + "material/archive-lock-open", + "material/archive-lock-outline", + "material/archive-lock", + "material/archive-marker-outline", + "material/archive-marker", + "material/archive-minus-outline", + "material/archive-minus", + "material/archive-music-outline", + "material/archive-music", + "material/archive-off-outline", + "material/archive-off", + "material/archive-outline", + "material/archive-plus-outline", + "material/archive-plus", + "material/archive-refresh-outline", + "material/archive-refresh", + "material/archive-remove-outline", + "material/archive-remove", + "material/archive-search-outline", + "material/archive-search", + "material/archive-settings-outline", + "material/archive-settings", + "material/archive-star-outline", + "material/archive-star", + "material/archive-sync-outline", + "material/archive-sync", + "material/archive", + "material/arm-flex-outline", + "material/arm-flex", + "material/arrange-bring-forward", + "material/arrange-bring-to-front", + "material/arrange-send-backward", + "material/arrange-send-to-back", + "material/arrow-all", + "material/arrow-bottom-left-bold-box-outline", + "material/arrow-bottom-left-bold-box", + "material/arrow-bottom-left-bold-outline", + "material/arrow-bottom-left-thick", + "material/arrow-bottom-left-thin-circle-outline", + "material/arrow-bottom-left-thin", + "material/arrow-bottom-left", + "material/arrow-bottom-right-bold-box-outline", + "material/arrow-bottom-right-bold-box", + "material/arrow-bottom-right-bold-outline", + "material/arrow-bottom-right-thick", + "material/arrow-bottom-right-thin-circle-outline", + "material/arrow-bottom-right-thin", + "material/arrow-bottom-right", + "material/arrow-collapse-all", + "material/arrow-collapse-down", + "material/arrow-collapse-horizontal", + "material/arrow-collapse-left", + "material/arrow-collapse-right", + "material/arrow-collapse-up", + "material/arrow-collapse-vertical", + "material/arrow-collapse", + "material/arrow-decision-auto-outline", + "material/arrow-decision-auto", + "material/arrow-decision-outline", + "material/arrow-decision", + "material/arrow-down-bold-box-outline", + "material/arrow-down-bold-box", + "material/arrow-down-bold-circle-outline", + "material/arrow-down-bold-circle", + "material/arrow-down-bold-hexagon-outline", + "material/arrow-down-bold-outline", + "material/arrow-down-bold", + "material/arrow-down-box", + "material/arrow-down-circle-outline", + "material/arrow-down-circle", + "material/arrow-down-drop-circle-outline", + "material/arrow-down-drop-circle", + "material/arrow-down-left-bold", + "material/arrow-down-left", + "material/arrow-down-right-bold", + "material/arrow-down-right", + "material/arrow-down-thick", + "material/arrow-down-thin-circle-outline", + "material/arrow-down-thin", + "material/arrow-down", + "material/arrow-expand-all", + "material/arrow-expand-down", + "material/arrow-expand-horizontal", + "material/arrow-expand-left", + "material/arrow-expand-right", + "material/arrow-expand-up", + "material/arrow-expand-vertical", + "material/arrow-expand", + "material/arrow-horizontal-lock", + "material/arrow-left-bold-box-outline", + "material/arrow-left-bold-box", + "material/arrow-left-bold-circle-outline", + "material/arrow-left-bold-circle", + "material/arrow-left-bold-hexagon-outline", + "material/arrow-left-bold-outline", + "material/arrow-left-bold", + "material/arrow-left-bottom-bold", + "material/arrow-left-bottom", + "material/arrow-left-box", + "material/arrow-left-circle-outline", + "material/arrow-left-circle", + "material/arrow-left-drop-circle-outline", + "material/arrow-left-drop-circle", + "material/arrow-left-right-bold-outline", + "material/arrow-left-right-bold", + "material/arrow-left-right", + "material/arrow-left-thick", + "material/arrow-left-thin-circle-outline", + "material/arrow-left-thin", + "material/arrow-left-top-bold", + "material/arrow-left-top", + "material/arrow-left", + "material/arrow-oscillating-off", + "material/arrow-oscillating", + "material/arrow-projectile-multiple", + "material/arrow-projectile", + "material/arrow-right-bold-box-outline", + "material/arrow-right-bold-box", + "material/arrow-right-bold-circle-outline", + "material/arrow-right-bold-circle", + "material/arrow-right-bold-hexagon-outline", + "material/arrow-right-bold-outline", + "material/arrow-right-bold", + "material/arrow-right-bottom-bold", + "material/arrow-right-bottom", + "material/arrow-right-box", + "material/arrow-right-circle-outline", + "material/arrow-right-circle", + "material/arrow-right-drop-circle-outline", + "material/arrow-right-drop-circle", + "material/arrow-right-thick", + "material/arrow-right-thin-circle-outline", + "material/arrow-right-thin", + "material/arrow-right-top-bold", + "material/arrow-right-top", + "material/arrow-right", + "material/arrow-split-horizontal", + "material/arrow-split-vertical", + "material/arrow-top-left-bold-box-outline", + "material/arrow-top-left-bold-box", + "material/arrow-top-left-bold-outline", + "material/arrow-top-left-bottom-right-bold", + "material/arrow-top-left-bottom-right", + "material/arrow-top-left-thick", + "material/arrow-top-left-thin-circle-outline", + "material/arrow-top-left-thin", + "material/arrow-top-left", + "material/arrow-top-right-bold-box-outline", + "material/arrow-top-right-bold-box", + "material/arrow-top-right-bold-outline", + "material/arrow-top-right-bottom-left-bold", + "material/arrow-top-right-bottom-left", + "material/arrow-top-right-thick", + "material/arrow-top-right-thin-circle-outline", + "material/arrow-top-right-thin", + "material/arrow-top-right", + "material/arrow-u-down-left-bold", + "material/arrow-u-down-left", + "material/arrow-u-down-right-bold", + "material/arrow-u-down-right", + "material/arrow-u-left-bottom-bold", + "material/arrow-u-left-bottom", + "material/arrow-u-left-top-bold", + "material/arrow-u-left-top", + "material/arrow-u-right-bottom-bold", + "material/arrow-u-right-bottom", + "material/arrow-u-right-top-bold", + "material/arrow-u-right-top", + "material/arrow-u-up-left-bold", + "material/arrow-u-up-left", + "material/arrow-u-up-right-bold", + "material/arrow-u-up-right", + "material/arrow-up-bold-box-outline", + "material/arrow-up-bold-box", + "material/arrow-up-bold-circle-outline", + "material/arrow-up-bold-circle", + "material/arrow-up-bold-hexagon-outline", + "material/arrow-up-bold-outline", + "material/arrow-up-bold", + "material/arrow-up-box", + "material/arrow-up-circle-outline", + "material/arrow-up-circle", + "material/arrow-up-down-bold-outline", + "material/arrow-up-down-bold", + "material/arrow-up-down", + "material/arrow-up-drop-circle-outline", + "material/arrow-up-drop-circle", + "material/arrow-up-left-bold", + "material/arrow-up-left", + "material/arrow-up-right-bold", + "material/arrow-up-right", + "material/arrow-up-thick", + "material/arrow-up-thin-circle-outline", + "material/arrow-up-thin", + "material/arrow-up", + "material/arrow-vertical-lock", + "material/artboard", + "material/artstation", + "material/aspect-ratio", + "material/assistant", + "material/asterisk-circle-outline", + "material/asterisk", + "material/at", + "material/atlassian", + "material/atm", + "material/atom-variant", + "material/atom", + "material/attachment-check", + "material/attachment-lock", + "material/attachment-minus", + "material/attachment-off", + "material/attachment-plus", + "material/attachment-remove", + "material/attachment", + "material/atv", + "material/audio-input-rca", + "material/audio-input-stereo-minijack", + "material/audio-input-xlr", + "material/audio-video-off", + "material/audio-video", + "material/augmented-reality", + "material/aurora", + "material/auto-download", + "material/auto-fix", + "material/auto-mode", + "material/auto-upload", + "material/autorenew-off", + "material/autorenew", + "material/av-timer", + "material/awning-outline", + "material/awning", + "material/aws", + "material/axe-battle", + "material/axe", + "material/axis-arrow-info", + "material/axis-arrow-lock", + "material/axis-arrow", + "material/axis-lock", + "material/axis-x-arrow-lock", + "material/axis-x-arrow", + "material/axis-x-rotate-clockwise", + "material/axis-x-rotate-counterclockwise", + "material/axis-x-y-arrow-lock", + "material/axis-y-arrow-lock", + "material/axis-y-arrow", + "material/axis-y-rotate-clockwise", + "material/axis-y-rotate-counterclockwise", + "material/axis-z-arrow-lock", + "material/axis-z-arrow", + "material/axis-z-rotate-clockwise", + "material/axis-z-rotate-counterclockwise", + "material/axis", + "material/babel", + "material/baby-bottle-outline", + "material/baby-bottle", + "material/baby-buggy-off", + "material/baby-buggy", + "material/baby-carriage-off", + "material/baby-carriage", + "material/baby-face-outline", + "material/baby-face", + "material/baby", + "material/backburger", + "material/backspace-outline", + "material/backspace-reverse-outline", + "material/backspace-reverse", + "material/backspace", + "material/backup-restore", + "material/bacteria-outline", + "material/bacteria", + "material/badge-account-alert-outline", + "material/badge-account-alert", + "material/badge-account-horizontal-outline", + "material/badge-account-horizontal", + "material/badge-account-outline", + "material/badge-account", + "material/badminton", + "material/bag-carry-on-check", + "material/bag-carry-on-off", + "material/bag-carry-on", + "material/bag-checked", + "material/bag-personal-off-outline", + "material/bag-personal-off", + "material/bag-personal-outline", + "material/bag-personal-plus-outline", + "material/bag-personal-plus", + "material/bag-personal-tag-outline", + "material/bag-personal-tag", + "material/bag-personal", + "material/bag-suitcase-off-outline", + "material/bag-suitcase-off", + "material/bag-suitcase-outline", + "material/bag-suitcase", + "material/baguette", + "material/balcony", + "material/balloon", + "material/ballot-outline", + "material/ballot-recount-outline", + "material/ballot-recount", + "material/ballot", + "material/bandage", + "material/bank-check", + "material/bank-circle-outline", + "material/bank-circle", + "material/bank-minus", + "material/bank-off-outline", + "material/bank-off", + "material/bank-outline", + "material/bank-plus", + "material/bank-remove", + "material/bank-transfer-in", + "material/bank-transfer-out", + "material/bank-transfer", + "material/bank", + "material/barcode-off", + "material/barcode-scan", + "material/barcode", + "material/barley-off", + "material/barley", + "material/barn", + "material/barrel-outline", + "material/barrel", + "material/baseball-bat", + "material/baseball-diamond-outline", + "material/baseball-diamond", + "material/baseball-outline", + "material/baseball", + "material/bash", + "material/basket-check-outline", + "material/basket-check", + "material/basket-fill", + "material/basket-minus-outline", + "material/basket-minus", + "material/basket-off-outline", + "material/basket-off", + "material/basket-outline", + "material/basket-plus-outline", + "material/basket-plus", + "material/basket-remove-outline", + "material/basket-remove", + "material/basket-unfill", + "material/basket", + "material/basketball-hoop-outline", + "material/basketball-hoop", + "material/basketball", + "material/bat", + "material/bathtub-outline", + "material/bathtub", + "material/battery-10-bluetooth", + "material/battery-10", + "material/battery-20-bluetooth", + "material/battery-20", + "material/battery-30-bluetooth", + "material/battery-30", + "material/battery-40-bluetooth", + "material/battery-40", + "material/battery-50-bluetooth", + "material/battery-50", + "material/battery-60-bluetooth", + "material/battery-60", + "material/battery-70-bluetooth", + "material/battery-70", + "material/battery-80-bluetooth", + "material/battery-80", + "material/battery-90-bluetooth", + "material/battery-90", + "material/battery-alert-bluetooth", + "material/battery-alert-variant-outline", + "material/battery-alert-variant", + "material/battery-alert", + "material/battery-arrow-down-outline", + "material/battery-arrow-down", + "material/battery-arrow-up-outline", + "material/battery-arrow-up", + "material/battery-bluetooth-variant", + "material/battery-bluetooth", + "material/battery-charging-10", + "material/battery-charging-100", + "material/battery-charging-20", + "material/battery-charging-30", + "material/battery-charging-40", + "material/battery-charging-50", + "material/battery-charging-60", + "material/battery-charging-70", + "material/battery-charging-80", + "material/battery-charging-90", + "material/battery-charging-high", + "material/battery-charging-low", + "material/battery-charging-medium", + "material/battery-charging-outline", + "material/battery-charging-wireless-10", + "material/battery-charging-wireless-20", + "material/battery-charging-wireless-30", + "material/battery-charging-wireless-40", + "material/battery-charging-wireless-50", + "material/battery-charging-wireless-60", + "material/battery-charging-wireless-70", + "material/battery-charging-wireless-80", + "material/battery-charging-wireless-90", + "material/battery-charging-wireless-alert", + "material/battery-charging-wireless-outline", + "material/battery-charging-wireless", + "material/battery-charging", + "material/battery-check-outline", + "material/battery-check", + "material/battery-clock-outline", + "material/battery-clock", + "material/battery-heart-outline", + "material/battery-heart-variant", + "material/battery-heart", + "material/battery-high", + "material/battery-lock-open", + "material/battery-lock", + "material/battery-low", + "material/battery-medium", + "material/battery-minus-outline", + "material/battery-minus-variant", + "material/battery-minus", + "material/battery-negative", + "material/battery-off-outline", + "material/battery-off", + "material/battery-outline", + "material/battery-plus-outline", + "material/battery-plus-variant", + "material/battery-plus", + "material/battery-positive", + "material/battery-remove-outline", + "material/battery-remove", + "material/battery-sync-outline", + "material/battery-sync", + "material/battery-unknown-bluetooth", + "material/battery-unknown", + "material/battery", + "material/beach", + "material/beaker-alert-outline", + "material/beaker-alert", + "material/beaker-check-outline", + "material/beaker-check", + "material/beaker-minus-outline", + "material/beaker-minus", + "material/beaker-outline", + "material/beaker-plus-outline", + "material/beaker-plus", + "material/beaker-question-outline", + "material/beaker-question", + "material/beaker-remove-outline", + "material/beaker-remove", + "material/beaker", + "material/bed-clock", + "material/bed-double-outline", + "material/bed-double", + "material/bed-empty", + "material/bed-king-outline", + "material/bed-king", + "material/bed-outline", + "material/bed-queen-outline", + "material/bed-queen", + "material/bed-single-outline", + "material/bed-single", + "material/bed", + "material/bee-flower", + "material/bee", + "material/beehive-off-outline", + "material/beehive-outline", + "material/beekeeper", + "material/beer-outline", + "material/beer", + "material/bell-alert-outline", + "material/bell-alert", + "material/bell-badge-outline", + "material/bell-badge", + "material/bell-cancel-outline", + "material/bell-cancel", + "material/bell-check-outline", + "material/bell-check", + "material/bell-circle-outline", + "material/bell-circle", + "material/bell-cog-outline", + "material/bell-cog", + "material/bell-minus-outline", + "material/bell-minus", + "material/bell-off-outline", + "material/bell-off", + "material/bell-outline", + "material/bell-plus-outline", + "material/bell-plus", + "material/bell-remove-outline", + "material/bell-remove", + "material/bell-ring-outline", + "material/bell-ring", + "material/bell-sleep-outline", + "material/bell-sleep", + "material/bell", + "material/bench-back", + "material/bench", + "material/beta", + "material/betamax", + "material/biathlon", + "material/bicycle-basket", + "material/bicycle-cargo", + "material/bicycle-electric", + "material/bicycle-penny-farthing", + "material/bicycle", + "material/bike-fast", + "material/bike-pedal-clipless", + "material/bike-pedal-mountain", + "material/bike-pedal", + "material/bike", + "material/billboard", + "material/billiards-rack", + "material/billiards", + "material/binoculars", + "material/bio", + "material/biohazard", + "material/bird", + "material/bitbucket", + "material/bitcoin", + "material/black-mesa", + "material/blender-outline", + "material/blender-software", + "material/blender", + "material/blinds-horizontal-closed", + "material/blinds-horizontal", + "material/blinds-open", + "material/blinds-vertical-closed", + "material/blinds-vertical", + "material/blinds", + "material/block-helper", + "material/blood-bag", + "material/bluetooth-audio", + "material/bluetooth-connect", + "material/bluetooth-off", + "material/bluetooth-settings", + "material/bluetooth-transfer", + "material/bluetooth", + "material/blur-linear", + "material/blur-off", + "material/blur-radial", + "material/blur", + "material/bolt", + "material/bomb-off", + "material/bomb", + "material/bone-off", + "material/bone", + "material/book-account-outline", + "material/book-account", + "material/book-alert-outline", + "material/book-alert", + "material/book-alphabet", + "material/book-arrow-down-outline", + "material/book-arrow-down", + "material/book-arrow-left-outline", + "material/book-arrow-left", + "material/book-arrow-right-outline", + "material/book-arrow-right", + "material/book-arrow-up-outline", + "material/book-arrow-up", + "material/book-cancel-outline", + "material/book-cancel", + "material/book-check-outline", + "material/book-check", + "material/book-clock-outline", + "material/book-clock", + "material/book-cog-outline", + "material/book-cog", + "material/book-cross", + "material/book-edit-outline", + "material/book-edit", + "material/book-education-outline", + "material/book-education", + "material/book-heart-outline", + "material/book-heart", + "material/book-information-variant", + "material/book-lock-open-outline", + "material/book-lock-open", + "material/book-lock-outline", + "material/book-lock", + "material/book-marker-outline", + "material/book-marker", + "material/book-minus-multiple-outline", + "material/book-minus-multiple", + "material/book-minus-outline", + "material/book-minus", + "material/book-multiple-outline", + "material/book-multiple", + "material/book-music-outline", + "material/book-music", + "material/book-off-outline", + "material/book-off", + "material/book-open-blank-variant-outline", + "material/book-open-blank-variant", + "material/book-open-outline", + "material/book-open-page-variant-outline", + "material/book-open-page-variant", + "material/book-open-variant-outline", + "material/book-open-variant", + "material/book-open", + "material/book-outline", + "material/book-play-outline", + "material/book-play", + "material/book-plus-multiple-outline", + "material/book-plus-multiple", + "material/book-plus-outline", + "material/book-plus", + "material/book-refresh-outline", + "material/book-refresh", + "material/book-remove-multiple-outline", + "material/book-remove-multiple", + "material/book-remove-outline", + "material/book-remove", + "material/book-search-outline", + "material/book-search", + "material/book-settings-outline", + "material/book-settings", + "material/book-sync-outline", + "material/book-sync", + "material/book-variant", + "material/book", + "material/bookmark-box-multiple-outline", + "material/bookmark-box-multiple", + "material/bookmark-box-outline", + "material/bookmark-box", + "material/bookmark-check-outline", + "material/bookmark-check", + "material/bookmark-minus-outline", + "material/bookmark-minus", + "material/bookmark-multiple-outline", + "material/bookmark-multiple", + "material/bookmark-music-outline", + "material/bookmark-music", + "material/bookmark-off-outline", + "material/bookmark-off", + "material/bookmark-outline", + "material/bookmark-plus-outline", + "material/bookmark-plus", + "material/bookmark-remove-outline", + "material/bookmark-remove", + "material/bookmark", + "material/bookshelf", + "material/boom-gate-alert-outline", + "material/boom-gate-alert", + "material/boom-gate-arrow-down-outline", + "material/boom-gate-arrow-down", + "material/boom-gate-arrow-up-outline", + "material/boom-gate-arrow-up", + "material/boom-gate-outline", + "material/boom-gate-up-outline", + "material/boom-gate-up", + "material/boom-gate", + "material/boombox", + "material/boomerang", + "material/bootstrap", + "material/border-all-variant", + "material/border-all", + "material/border-bottom-variant", + "material/border-bottom", + "material/border-color", + "material/border-horizontal", + "material/border-inside", + "material/border-left-variant", + "material/border-left", + "material/border-none-variant", + "material/border-none", + "material/border-outside", + "material/border-radius", + "material/border-right-variant", + "material/border-right", + "material/border-style", + "material/border-top-variant", + "material/border-top", + "material/border-vertical", + "material/bottle-soda-classic-outline", + "material/bottle-soda-classic", + "material/bottle-soda-outline", + "material/bottle-soda", + "material/bottle-tonic-outline", + "material/bottle-tonic-plus-outline", + "material/bottle-tonic-plus", + "material/bottle-tonic-skull-outline", + "material/bottle-tonic-skull", + "material/bottle-tonic", + "material/bottle-wine-outline", + "material/bottle-wine", + "material/bow-arrow", + "material/bow-tie", + "material/bowl-mix-outline", + "material/bowl-mix", + "material/bowl-outline", + "material/bowl", + "material/bowling", + "material/box-cutter-off", + "material/box-cutter", + "material/box-shadow", + "material/box", + "material/boxing-glove", + "material/braille", + "material/brain", + "material/bread-slice-outline", + "material/bread-slice", + "material/bridge", + "material/briefcase-account-outline", + "material/briefcase-account", + "material/briefcase-arrow-left-right-outline", + "material/briefcase-arrow-left-right", + "material/briefcase-arrow-up-down-outline", + "material/briefcase-arrow-up-down", + "material/briefcase-check-outline", + "material/briefcase-check", + "material/briefcase-clock-outline", + "material/briefcase-clock", + "material/briefcase-download-outline", + "material/briefcase-download", + "material/briefcase-edit-outline", + "material/briefcase-edit", + "material/briefcase-eye-outline", + "material/briefcase-eye", + "material/briefcase-minus-outline", + "material/briefcase-minus", + "material/briefcase-off-outline", + "material/briefcase-off", + "material/briefcase-outline", + "material/briefcase-plus-outline", + "material/briefcase-plus", + "material/briefcase-remove-outline", + "material/briefcase-remove", + "material/briefcase-search-outline", + "material/briefcase-search", + "material/briefcase-upload-outline", + "material/briefcase-upload", + "material/briefcase-variant-off-outline", + "material/briefcase-variant-off", + "material/briefcase-variant-outline", + "material/briefcase-variant", + "material/briefcase", + "material/brightness-1", + "material/brightness-2", + "material/brightness-3", + "material/brightness-4", + "material/brightness-5", + "material/brightness-6", + "material/brightness-7", + "material/brightness-auto", + "material/brightness-percent", + "material/broadcast-off", + "material/broadcast", + "material/broom", + "material/brush-off", + "material/brush-outline", + "material/brush-variant", + "material/brush", + "material/bucket-outline", + "material/bucket", + "material/buffet", + "material/bug-check-outline", + "material/bug-check", + "material/bug-outline", + "material/bug-pause-outline", + "material/bug-pause", + "material/bug-play-outline", + "material/bug-play", + "material/bug-stop-outline", + "material/bug-stop", + "material/bug", + "material/bugle", + "material/bulkhead-light", + "material/bulldozer", + "material/bullet", + "material/bulletin-board", + "material/bullhorn-outline", + "material/bullhorn-variant-outline", + "material/bullhorn-variant", + "material/bullhorn", + "material/bullseye-arrow", + "material/bullseye", + "material/bulma", + "material/bunk-bed-outline", + "material/bunk-bed", + "material/bus-alert", + "material/bus-articulated-end", + "material/bus-articulated-front", + "material/bus-clock", + "material/bus-double-decker", + "material/bus-electric", + "material/bus-marker", + "material/bus-multiple", + "material/bus-school", + "material/bus-side", + "material/bus-sign", + "material/bus-stop-covered", + "material/bus-stop-uncovered", + "material/bus-stop", + "material/bus-wrench", + "material/bus", + "material/butterfly-outline", + "material/butterfly", + "material/button-cursor", + "material/button-pointer", + "material/cabin-a-frame", + "material/cable-data", + "material/cached", + "material/cactus", + "material/cake-layered", + "material/cake-variant-outline", + "material/cake-variant", + "material/cake", + "material/calculator-variant-outline", + "material/calculator-variant", + "material/calculator", + "material/calendar-account-outline", + "material/calendar-account", + "material/calendar-alert-outline", + "material/calendar-alert", + "material/calendar-arrow-left", + "material/calendar-arrow-right", + "material/calendar-badge-outline", + "material/calendar-badge", + "material/calendar-blank-multiple", + "material/calendar-blank-outline", + "material/calendar-blank", + "material/calendar-check-outline", + "material/calendar-check", + "material/calendar-clock-outline", + "material/calendar-clock", + "material/calendar-collapse-horizontal-outline", + "material/calendar-collapse-horizontal", + "material/calendar-cursor-outline", + "material/calendar-cursor", + "material/calendar-edit-outline", + "material/calendar-edit", + "material/calendar-end-outline", + "material/calendar-end", + "material/calendar-expand-horizontal-outline", + "material/calendar-expand-horizontal", + "material/calendar-export-outline", + "material/calendar-export", + "material/calendar-filter-outline", + "material/calendar-filter", + "material/calendar-heart-outline", + "material/calendar-heart", + "material/calendar-import-outline", + "material/calendar-import", + "material/calendar-lock-open-outline", + "material/calendar-lock-open", + "material/calendar-lock-outline", + "material/calendar-lock", + "material/calendar-minus-outline", + "material/calendar-minus", + "material/calendar-month-outline", + "material/calendar-month", + "material/calendar-multiple-check", + "material/calendar-multiple", + "material/calendar-multiselect-outline", + "material/calendar-multiselect", + "material/calendar-outline", + "material/calendar-plus-outline", + "material/calendar-plus", + "material/calendar-question-outline", + "material/calendar-question", + "material/calendar-range-outline", + "material/calendar-range", + "material/calendar-refresh-outline", + "material/calendar-refresh", + "material/calendar-remove-outline", + "material/calendar-remove", + "material/calendar-search-outline", + "material/calendar-search", + "material/calendar-star-four-points", + "material/calendar-star-outline", + "material/calendar-star", + "material/calendar-start-outline", + "material/calendar-start", + "material/calendar-sync-outline", + "material/calendar-sync", + "material/calendar-text-outline", + "material/calendar-text", + "material/calendar-today-outline", + "material/calendar-today", + "material/calendar-week-begin-outline", + "material/calendar-week-begin", + "material/calendar-week-outline", + "material/calendar-week", + "material/calendar-weekend-outline", + "material/calendar-weekend", + "material/calendar", + "material/call-made", + "material/call-merge", + "material/call-missed", + "material/call-received", + "material/call-split", + "material/camcorder-off", + "material/camcorder", + "material/camera-account", + "material/camera-burst", + "material/camera-control", + "material/camera-document-off", + "material/camera-document", + "material/camera-enhance-outline", + "material/camera-enhance", + "material/camera-flip-outline", + "material/camera-flip", + "material/camera-front-variant", + "material/camera-front", + "material/camera-gopro", + "material/camera-image", + "material/camera-iris", + "material/camera-lock-open-outline", + "material/camera-lock-open", + "material/camera-lock-outline", + "material/camera-lock", + "material/camera-marker-outline", + "material/camera-marker", + "material/camera-metering-center", + "material/camera-metering-matrix", + "material/camera-metering-partial", + "material/camera-metering-spot", + "material/camera-off-outline", + "material/camera-off", + "material/camera-outline", + "material/camera-party-mode", + "material/camera-plus-outline", + "material/camera-plus", + "material/camera-rear-variant", + "material/camera-rear", + "material/camera-retake-outline", + "material/camera-retake", + "material/camera-switch-outline", + "material/camera-switch", + "material/camera-timer", + "material/camera-wireless-outline", + "material/camera-wireless", + "material/camera", + "material/campfire", + "material/cancel", + "material/candelabra-fire", + "material/candelabra", + "material/candle", + "material/candy-off-outline", + "material/candy-off", + "material/candy-outline", + "material/candy", + "material/candycane", + "material/cannabis-off", + "material/cannabis", + "material/caps-lock", + "material/car-2-plus", + "material/car-3-plus", + "material/car-arrow-left", + "material/car-arrow-right", + "material/car-back", + "material/car-battery", + "material/car-brake-abs", + "material/car-brake-alert", + "material/car-brake-fluid-level", + "material/car-brake-hold", + "material/car-brake-low-pressure", + "material/car-brake-parking", + "material/car-brake-retarder", + "material/car-brake-temperature", + "material/car-brake-worn-linings", + "material/car-child-seat", + "material/car-clock", + "material/car-clutch", + "material/car-cog", + "material/car-connected", + "material/car-convertible", + "material/car-coolant-level", + "material/car-cruise-control", + "material/car-defrost-front", + "material/car-defrost-rear", + "material/car-door-lock-open", + "material/car-door-lock", + "material/car-door", + "material/car-electric-outline", + "material/car-electric", + "material/car-emergency", + "material/car-esp", + "material/car-estate", + "material/car-hatchback", + "material/car-info", + "material/car-key", + "material/car-lifted-pickup", + "material/car-light-alert", + "material/car-light-dimmed", + "material/car-light-fog", + "material/car-light-high", + "material/car-limousine", + "material/car-multiple", + "material/car-off", + "material/car-outline", + "material/car-parking-lights", + "material/car-pickup", + "material/car-search-outline", + "material/car-search", + "material/car-seat-cooler", + "material/car-seat-heater", + "material/car-seat", + "material/car-select", + "material/car-settings", + "material/car-shift-pattern", + "material/car-side", + "material/car-speed-limiter", + "material/car-sports", + "material/car-tire-alert", + "material/car-traction-control", + "material/car-turbocharger", + "material/car-wash", + "material/car-windshield-outline", + "material/car-windshield", + "material/car-wireless", + "material/car-wrench", + "material/car", + "material/carabiner", + "material/caravan", + "material/card-account-details-outline", + "material/card-account-details-star-outline", + "material/card-account-details-star", + "material/card-account-details", + "material/card-account-mail-outline", + "material/card-account-mail", + "material/card-account-phone-outline", + "material/card-account-phone", + "material/card-bulleted-off-outline", + "material/card-bulleted-off", + "material/card-bulleted-outline", + "material/card-bulleted-settings-outline", + "material/card-bulleted-settings", + "material/card-bulleted", + "material/card-minus-outline", + "material/card-minus", + "material/card-multiple-outline", + "material/card-multiple", + "material/card-off-outline", + "material/card-off", + "material/card-outline", + "material/card-plus-outline", + "material/card-plus", + "material/card-remove-outline", + "material/card-remove", + "material/card-search-outline", + "material/card-search", + "material/card-text-outline", + "material/card-text", + "material/card", + "material/cards-club-outline", + "material/cards-club", + "material/cards-diamond-outline", + "material/cards-diamond", + "material/cards-heart-outline", + "material/cards-heart", + "material/cards-outline", + "material/cards-playing-club-multiple-outline", + "material/cards-playing-club-multiple", + "material/cards-playing-club-outline", + "material/cards-playing-club", + "material/cards-playing-diamond-multiple-outline", + "material/cards-playing-diamond-multiple", + "material/cards-playing-diamond-outline", + "material/cards-playing-diamond", + "material/cards-playing-heart-multiple-outline", + "material/cards-playing-heart-multiple", + "material/cards-playing-heart-outline", + "material/cards-playing-heart", + "material/cards-playing-outline", + "material/cards-playing-spade-multiple-outline", + "material/cards-playing-spade-multiple", + "material/cards-playing-spade-outline", + "material/cards-playing-spade", + "material/cards-playing", + "material/cards-spade-outline", + "material/cards-spade", + "material/cards-variant", + "material/cards", + "material/carrot", + "material/cart-arrow-down", + "material/cart-arrow-right", + "material/cart-arrow-up", + "material/cart-check", + "material/cart-heart", + "material/cart-minus", + "material/cart-off", + "material/cart-outline", + "material/cart-percent", + "material/cart-plus", + "material/cart-remove", + "material/cart-variant", + "material/cart", + "material/case-sensitive-alt", + "material/cash-100", + "material/cash-check", + "material/cash-clock", + "material/cash-edit", + "material/cash-fast", + "material/cash-lock-open", + "material/cash-lock", + "material/cash-marker", + "material/cash-minus", + "material/cash-multiple", + "material/cash-off", + "material/cash-plus", + "material/cash-refund", + "material/cash-register", + "material/cash-remove", + "material/cash-sync", + "material/cash", + "material/cassette", + "material/cast-audio-variant", + "material/cast-audio", + "material/cast-connected", + "material/cast-education", + "material/cast-off", + "material/cast-variant", + "material/cast", + "material/castle", + "material/cat", + "material/cctv-off", + "material/cctv", + "material/ceiling-fan-light", + "material/ceiling-fan", + "material/ceiling-light-multiple-outline", + "material/ceiling-light-multiple", + "material/ceiling-light-outline", + "material/ceiling-light", + "material/cellphone-arrow-down-variant", + "material/cellphone-arrow-down", + "material/cellphone-basic", + "material/cellphone-charging", + "material/cellphone-check", + "material/cellphone-cog", + "material/cellphone-dock", + "material/cellphone-information", + "material/cellphone-key", + "material/cellphone-link-off", + "material/cellphone-link", + "material/cellphone-lock", + "material/cellphone-marker", + "material/cellphone-message-off", + "material/cellphone-message", + "material/cellphone-nfc-off", + "material/cellphone-nfc", + "material/cellphone-off", + "material/cellphone-play", + "material/cellphone-remove", + "material/cellphone-screenshot", + "material/cellphone-settings", + "material/cellphone-sound", + "material/cellphone-text", + "material/cellphone-wireless", + "material/cellphone", + "material/centos", + "material/certificate-outline", + "material/certificate", + "material/chair-rolling", + "material/chair-school", + "material/chandelier", + "material/charity-search", + "material/charity", + "material/chart-arc", + "material/chart-areaspline-variant", + "material/chart-areaspline", + "material/chart-bar-stacked", + "material/chart-bar", + "material/chart-bell-curve-cumulative", + "material/chart-bell-curve", + "material/chart-box-multiple-outline", + "material/chart-box-multiple", + "material/chart-box-outline", + "material/chart-box-plus-outline", + "material/chart-box", + "material/chart-bubble", + "material/chart-donut-variant", + "material/chart-donut", + "material/chart-gantt", + "material/chart-histogram", + "material/chart-line-stacked", + "material/chart-line-variant", + "material/chart-line", + "material/chart-multiline", + "material/chart-multiple", + "material/chart-pie-outline", + "material/chart-pie", + "material/chart-ppf", + "material/chart-sankey-variant", + "material/chart-sankey", + "material/chart-scatter-plot-hexbin", + "material/chart-scatter-plot", + "material/chart-timeline-variant-shimmer", + "material/chart-timeline-variant", + "material/chart-timeline", + "material/chart-tree", + "material/chart-waterfall", + "material/chat-alert-outline", + "material/chat-alert", + "material/chat-minus-outline", + "material/chat-minus", + "material/chat-outline", + "material/chat-plus-outline", + "material/chat-plus", + "material/chat-processing-outline", + "material/chat-processing", + "material/chat-question-outline", + "material/chat-question", + "material/chat-remove-outline", + "material/chat-remove", + "material/chat-sleep-outline", + "material/chat-sleep", + "material/chat", + "material/check-all", + "material/check-bold", + "material/check-circle-outline", + "material/check-circle", + "material/check-decagram-outline", + "material/check-decagram", + "material/check-network-outline", + "material/check-network", + "material/check-outline", + "material/check-underline-circle-outline", + "material/check-underline-circle", + "material/check-underline", + "material/check", + "material/checkbook-arrow-left", + "material/checkbook-arrow-right", + "material/checkbook", + "material/checkbox-blank-badge-outline", + "material/checkbox-blank-badge", + "material/checkbox-blank-circle-outline", + "material/checkbox-blank-circle", + "material/checkbox-blank-off-outline", + "material/checkbox-blank-off", + "material/checkbox-blank-outline", + "material/checkbox-blank", + "material/checkbox-intermediate-variant", + "material/checkbox-intermediate", + "material/checkbox-marked-circle-auto-outline", + "material/checkbox-marked-circle-minus-outline", + "material/checkbox-marked-circle-outline", + "material/checkbox-marked-circle-plus-outline", + "material/checkbox-marked-circle", + "material/checkbox-marked-outline", + "material/checkbox-marked", + "material/checkbox-multiple-blank-circle-outline", + "material/checkbox-multiple-blank-circle", + "material/checkbox-multiple-blank-outline", + "material/checkbox-multiple-blank", + "material/checkbox-multiple-marked-circle-outline", + "material/checkbox-multiple-marked-circle", + "material/checkbox-multiple-marked-outline", + "material/checkbox-multiple-marked", + "material/checkbox-multiple-outline", + "material/checkbox-outline", + "material/checkerboard-minus", + "material/checkerboard-plus", + "material/checkerboard-remove", + "material/checkerboard", + "material/cheese-off", + "material/cheese", + "material/chef-hat", + "material/chemical-weapon", + "material/chess-bishop", + "material/chess-king", + "material/chess-knight", + "material/chess-pawn", + "material/chess-queen", + "material/chess-rook", + "material/chevron-double-down", + "material/chevron-double-left", + "material/chevron-double-right", + "material/chevron-double-up", + "material/chevron-down-box-outline", + "material/chevron-down-box", + "material/chevron-down-circle-outline", + "material/chevron-down-circle", + "material/chevron-down", + "material/chevron-left-box-outline", + "material/chevron-left-box", + "material/chevron-left-circle-outline", + "material/chevron-left-circle", + "material/chevron-left", + "material/chevron-right-box-outline", + "material/chevron-right-box", + "material/chevron-right-circle-outline", + "material/chevron-right-circle", + "material/chevron-right", + "material/chevron-triple-down", + "material/chevron-triple-left", + "material/chevron-triple-right", + "material/chevron-triple-up", + "material/chevron-up-box-outline", + "material/chevron-up-box", + "material/chevron-up-circle-outline", + "material/chevron-up-circle", + "material/chevron-up", + "material/chili-alert-outline", + "material/chili-alert", + "material/chili-hot-outline", + "material/chili-hot", + "material/chili-medium-outline", + "material/chili-medium", + "material/chili-mild-outline", + "material/chili-mild", + "material/chili-off-outline", + "material/chili-off", + "material/chip", + "material/church-outline", + "material/church", + "material/cigar-off", + "material/cigar", + "material/circle-box-outline", + "material/circle-box", + "material/circle-double", + "material/circle-edit-outline", + "material/circle-expand", + "material/circle-half-full", + "material/circle-half", + "material/circle-medium", + "material/circle-multiple-outline", + "material/circle-multiple", + "material/circle-off-outline", + "material/circle-opacity", + "material/circle-outline", + "material/circle-slice-1", + "material/circle-slice-2", + "material/circle-slice-3", + "material/circle-slice-4", + "material/circle-slice-5", + "material/circle-slice-6", + "material/circle-slice-7", + "material/circle-slice-8", + "material/circle-small", + "material/circle", + "material/circular-saw", + "material/city-switch", + "material/city-variant-outline", + "material/city-variant", + "material/city", + "material/clipboard-account-outline", + "material/clipboard-account", + "material/clipboard-alert-outline", + "material/clipboard-alert", + "material/clipboard-arrow-down-outline", + "material/clipboard-arrow-down", + "material/clipboard-arrow-left-outline", + "material/clipboard-arrow-left", + "material/clipboard-arrow-right-outline", + "material/clipboard-arrow-right", + "material/clipboard-arrow-up-outline", + "material/clipboard-arrow-up", + "material/clipboard-check-multiple-outline", + "material/clipboard-check-multiple", + "material/clipboard-check-outline", + "material/clipboard-check", + "material/clipboard-clock-outline", + "material/clipboard-clock", + "material/clipboard-edit-outline", + "material/clipboard-edit", + "material/clipboard-file-outline", + "material/clipboard-file", + "material/clipboard-flow-outline", + "material/clipboard-flow", + "material/clipboard-list-outline", + "material/clipboard-list", + "material/clipboard-minus-outline", + "material/clipboard-minus", + "material/clipboard-multiple-outline", + "material/clipboard-multiple", + "material/clipboard-off-outline", + "material/clipboard-off", + "material/clipboard-outline", + "material/clipboard-play-multiple-outline", + "material/clipboard-play-multiple", + "material/clipboard-play-outline", + "material/clipboard-play", + "material/clipboard-plus-outline", + "material/clipboard-plus", + "material/clipboard-pulse-outline", + "material/clipboard-pulse", + "material/clipboard-remove-outline", + "material/clipboard-remove", + "material/clipboard-search-outline", + "material/clipboard-search", + "material/clipboard-text-clock-outline", + "material/clipboard-text-clock", + "material/clipboard-text-multiple-outline", + "material/clipboard-text-multiple", + "material/clipboard-text-off-outline", + "material/clipboard-text-off", + "material/clipboard-text-outline", + "material/clipboard-text-play-outline", + "material/clipboard-text-play", + "material/clipboard-text-search-outline", + "material/clipboard-text-search", + "material/clipboard-text", + "material/clipboard", + "material/clippy", + "material/clock-alert-outline", + "material/clock-alert", + "material/clock-check-outline", + "material/clock-check", + "material/clock-digital", + "material/clock-edit-outline", + "material/clock-edit", + "material/clock-end", + "material/clock-fast", + "material/clock-in", + "material/clock-minus-outline", + "material/clock-minus", + "material/clock-out", + "material/clock-outline", + "material/clock-plus-outline", + "material/clock-plus", + "material/clock-remove-outline", + "material/clock-remove", + "material/clock-star-four-points-outline", + "material/clock-star-four-points", + "material/clock-start", + "material/clock-time-eight-outline", + "material/clock-time-eight", + "material/clock-time-eleven-outline", + "material/clock-time-eleven", + "material/clock-time-five-outline", + "material/clock-time-five", + "material/clock-time-four-outline", + "material/clock-time-four", + "material/clock-time-nine-outline", + "material/clock-time-nine", + "material/clock-time-one-outline", + "material/clock-time-one", + "material/clock-time-seven-outline", + "material/clock-time-seven", + "material/clock-time-six-outline", + "material/clock-time-six", + "material/clock-time-ten-outline", + "material/clock-time-ten", + "material/clock-time-three-outline", + "material/clock-time-three", + "material/clock-time-twelve-outline", + "material/clock-time-twelve", + "material/clock-time-two-outline", + "material/clock-time-two", + "material/clock", + "material/close-box-multiple-outline", + "material/close-box-multiple", + "material/close-box-outline", + "material/close-box", + "material/close-circle-multiple-outline", + "material/close-circle-multiple", + "material/close-circle-outline", + "material/close-circle", + "material/close-network-outline", + "material/close-network", + "material/close-octagon-outline", + "material/close-octagon", + "material/close-outline", + "material/close-thick", + "material/close", + "material/closed-caption-outline", + "material/closed-caption", + "material/cloud-alert-outline", + "material/cloud-alert", + "material/cloud-arrow-down-outline", + "material/cloud-arrow-down", + "material/cloud-arrow-left-outline", + "material/cloud-arrow-left", + "material/cloud-arrow-right-outline", + "material/cloud-arrow-right", + "material/cloud-arrow-up-outline", + "material/cloud-arrow-up", + "material/cloud-braces", + "material/cloud-cancel-outline", + "material/cloud-cancel", + "material/cloud-check-outline", + "material/cloud-check-variant-outline", + "material/cloud-check-variant", + "material/cloud-check", + "material/cloud-circle-outline", + "material/cloud-circle", + "material/cloud-clock-outline", + "material/cloud-clock", + "material/cloud-cog-outline", + "material/cloud-cog", + "material/cloud-download-outline", + "material/cloud-download", + "material/cloud-key-outline", + "material/cloud-key", + "material/cloud-lock-open-outline", + "material/cloud-lock-open", + "material/cloud-lock-outline", + "material/cloud-lock", + "material/cloud-minus-outline", + "material/cloud-minus", + "material/cloud-off-outline", + "material/cloud-off", + "material/cloud-outline", + "material/cloud-percent-outline", + "material/cloud-percent", + "material/cloud-plus-outline", + "material/cloud-plus", + "material/cloud-print-outline", + "material/cloud-print", + "material/cloud-question-outline", + "material/cloud-question", + "material/cloud-refresh-outline", + "material/cloud-refresh-variant-outline", + "material/cloud-refresh-variant", + "material/cloud-refresh", + "material/cloud-remove-outline", + "material/cloud-remove", + "material/cloud-search-outline", + "material/cloud-search", + "material/cloud-sync-outline", + "material/cloud-sync", + "material/cloud-tags", + "material/cloud-upload-outline", + "material/cloud-upload", + "material/cloud", + "material/clouds", + "material/clover-outline", + "material/clover", + "material/coach-lamp-variant", + "material/coach-lamp", + "material/coat-rack", + "material/code-array", + "material/code-block-braces", + "material/code-block-brackets", + "material/code-block-parentheses", + "material/code-block-tags", + "material/code-braces-box", + "material/code-braces", + "material/code-brackets", + "material/code-equal", + "material/code-greater-than-or-equal", + "material/code-greater-than", + "material/code-json", + "material/code-less-than-or-equal", + "material/code-less-than", + "material/code-not-equal-variant", + "material/code-not-equal", + "material/code-parentheses-box", + "material/code-parentheses", + "material/code-string", + "material/code-tags-check", + "material/code-tags", + "material/codepen", + "material/coffee-maker-check-outline", + "material/coffee-maker-check", + "material/coffee-maker-outline", + "material/coffee-maker", + "material/coffee-off-outline", + "material/coffee-off", + "material/coffee-outline", + "material/coffee-to-go-outline", + "material/coffee-to-go", + "material/coffee", + "material/coffin", + "material/cog-box", + "material/cog-clockwise", + "material/cog-counterclockwise", + "material/cog-off-outline", + "material/cog-off", + "material/cog-outline", + "material/cog-pause-outline", + "material/cog-pause", + "material/cog-play-outline", + "material/cog-play", + "material/cog-refresh-outline", + "material/cog-refresh", + "material/cog-stop-outline", + "material/cog-stop", + "material/cog-sync-outline", + "material/cog-sync", + "material/cog-transfer-outline", + "material/cog-transfer", + "material/cog", + "material/cogs", + "material/collage", + "material/collapse-all-outline", + "material/collapse-all", + "material/color-helper", + "material/comma-box-outline", + "material/comma-box", + "material/comma-circle-outline", + "material/comma-circle", + "material/comma", + "material/comment-account-outline", + "material/comment-account", + "material/comment-alert-outline", + "material/comment-alert", + "material/comment-arrow-left-outline", + "material/comment-arrow-left", + "material/comment-arrow-right-outline", + "material/comment-arrow-right", + "material/comment-bookmark-outline", + "material/comment-bookmark", + "material/comment-check-outline", + "material/comment-check", + "material/comment-edit-outline", + "material/comment-edit", + "material/comment-eye-outline", + "material/comment-eye", + "material/comment-flash-outline", + "material/comment-flash", + "material/comment-minus-outline", + "material/comment-minus", + "material/comment-multiple-outline", + "material/comment-multiple", + "material/comment-off-outline", + "material/comment-off", + "material/comment-outline", + "material/comment-plus-outline", + "material/comment-plus", + "material/comment-processing-outline", + "material/comment-processing", + "material/comment-question-outline", + "material/comment-question", + "material/comment-quote-outline", + "material/comment-quote", + "material/comment-remove-outline", + "material/comment-remove", + "material/comment-search-outline", + "material/comment-search", + "material/comment-text-multiple-outline", + "material/comment-text-multiple", + "material/comment-text-outline", + "material/comment-text", + "material/comment", + "material/compare-horizontal", + "material/compare-remove", + "material/compare-vertical", + "material/compare", + "material/compass-off-outline", + "material/compass-off", + "material/compass-outline", + "material/compass-rose", + "material/compass", + "material/compost", + "material/cone-off", + "material/cone", + "material/connection", + "material/console-line", + "material/console-network-outline", + "material/console-network", + "material/console", + "material/consolidate", + "material/contactless-payment-circle-outline", + "material/contactless-payment-circle", + "material/contactless-payment", + "material/contacts-outline", + "material/contacts", + "material/contain-end", + "material/contain-start", + "material/contain", + "material/content-copy", + "material/content-cut", + "material/content-duplicate", + "material/content-paste", + "material/content-save-alert-outline", + "material/content-save-alert", + "material/content-save-all-outline", + "material/content-save-all", + "material/content-save-check-outline", + "material/content-save-check", + "material/content-save-cog-outline", + "material/content-save-cog", + "material/content-save-edit-outline", + "material/content-save-edit", + "material/content-save-minus-outline", + "material/content-save-minus", + "material/content-save-move-outline", + "material/content-save-move", + "material/content-save-off-outline", + "material/content-save-off", + "material/content-save-outline", + "material/content-save-plus-outline", + "material/content-save-plus", + "material/content-save-settings-outline", + "material/content-save-settings", + "material/content-save", + "material/contrast-box", + "material/contrast-circle", + "material/contrast", + "material/controller-classic-outline", + "material/controller-classic", + "material/controller-off", + "material/controller", + "material/cookie-alert-outline", + "material/cookie-alert", + "material/cookie-check-outline", + "material/cookie-check", + "material/cookie-clock-outline", + "material/cookie-clock", + "material/cookie-cog-outline", + "material/cookie-cog", + "material/cookie-edit-outline", + "material/cookie-edit", + "material/cookie-lock-outline", + "material/cookie-lock", + "material/cookie-minus-outline", + "material/cookie-minus", + "material/cookie-off-outline", + "material/cookie-off", + "material/cookie-outline", + "material/cookie-plus-outline", + "material/cookie-plus", + "material/cookie-refresh-outline", + "material/cookie-refresh", + "material/cookie-remove-outline", + "material/cookie-remove", + "material/cookie-settings-outline", + "material/cookie-settings", + "material/cookie", + "material/coolant-temperature", + "material/copyleft", + "material/copyright", + "material/cordova", + "material/corn-off", + "material/corn", + "material/cosine-wave", + "material/counter", + "material/countertop-outline", + "material/countertop", + "material/cow-off", + "material/cow", + "material/cpu-32-bit", + "material/cpu-64-bit", + "material/cradle-outline", + "material/cradle", + "material/crane", + "material/creation-outline", + "material/creation", + "material/creative-commons", + "material/credit-card-check-outline", + "material/credit-card-check", + "material/credit-card-chip-outline", + "material/credit-card-chip", + "material/credit-card-clock-outline", + "material/credit-card-clock", + "material/credit-card-edit-outline", + "material/credit-card-edit", + "material/credit-card-fast-outline", + "material/credit-card-fast", + "material/credit-card-lock-outline", + "material/credit-card-lock", + "material/credit-card-marker-outline", + "material/credit-card-marker", + "material/credit-card-minus-outline", + "material/credit-card-minus", + "material/credit-card-multiple-outline", + "material/credit-card-multiple", + "material/credit-card-off-outline", + "material/credit-card-off", + "material/credit-card-outline", + "material/credit-card-plus-outline", + "material/credit-card-plus", + "material/credit-card-refresh-outline", + "material/credit-card-refresh", + "material/credit-card-refund-outline", + "material/credit-card-refund", + "material/credit-card-remove-outline", + "material/credit-card-remove", + "material/credit-card-scan-outline", + "material/credit-card-scan", + "material/credit-card-search-outline", + "material/credit-card-search", + "material/credit-card-settings-outline", + "material/credit-card-settings", + "material/credit-card-sync-outline", + "material/credit-card-sync", + "material/credit-card-wireless-off-outline", + "material/credit-card-wireless-off", + "material/credit-card-wireless-outline", + "material/credit-card-wireless", + "material/credit-card", + "material/cricket", + "material/crop-free", + "material/crop-landscape", + "material/crop-portrait", + "material/crop-rotate", + "material/crop-square", + "material/crop", + "material/cross-bolnisi", + "material/cross-celtic", + "material/cross-outline", + "material/cross", + "material/crosshairs-gps", + "material/crosshairs-off", + "material/crosshairs-question", + "material/crosshairs", + "material/crowd", + "material/crown-circle-outline", + "material/crown-circle", + "material/crown-outline", + "material/crown", + "material/cryengine", + "material/crystal-ball", + "material/cube-off-outline", + "material/cube-off", + "material/cube-outline", + "material/cube-scan", + "material/cube-send", + "material/cube-unfolded", + "material/cube", + "material/cup-off-outline", + "material/cup-off", + "material/cup-outline", + "material/cup-water", + "material/cup", + "material/cupboard-outline", + "material/cupboard", + "material/cupcake", + "material/curling", + "material/currency-bdt", + "material/currency-brl", + "material/currency-btc", + "material/currency-cny", + "material/currency-eth", + "material/currency-eur-off", + "material/currency-eur", + "material/currency-fra", + "material/currency-gbp", + "material/currency-ils", + "material/currency-inr", + "material/currency-jpy", + "material/currency-krw", + "material/currency-kzt", + "material/currency-mnt", + "material/currency-ngn", + "material/currency-php", + "material/currency-rial", + "material/currency-rub", + "material/currency-rupee", + "material/currency-sign", + "material/currency-thb", + "material/currency-try", + "material/currency-twd", + "material/currency-uah", + "material/currency-usd-off", + "material/currency-usd", + "material/current-ac", + "material/current-dc", + "material/cursor-default-click-outline", + "material/cursor-default-click", + "material/cursor-default-gesture-outline", + "material/cursor-default-gesture", + "material/cursor-default-outline", + "material/cursor-default", + "material/cursor-move", + "material/cursor-pointer", + "material/cursor-text", + "material/curtains-closed", + "material/curtains", + "material/cylinder-off", + "material/cylinder", + "material/dance-ballroom", + "material/dance-pole", + "material/data-matrix-edit", + "material/data-matrix-minus", + "material/data-matrix-plus", + "material/data-matrix-remove", + "material/data-matrix-scan", + "material/data-matrix", + "material/database-alert-outline", + "material/database-alert", + "material/database-arrow-down-outline", + "material/database-arrow-down", + "material/database-arrow-left-outline", + "material/database-arrow-left", + "material/database-arrow-right-outline", + "material/database-arrow-right", + "material/database-arrow-up-outline", + "material/database-arrow-up", + "material/database-check-outline", + "material/database-check", + "material/database-clock-outline", + "material/database-clock", + "material/database-cog-outline", + "material/database-cog", + "material/database-edit-outline", + "material/database-edit", + "material/database-export-outline", + "material/database-export", + "material/database-eye-off-outline", + "material/database-eye-off", + "material/database-eye-outline", + "material/database-eye", + "material/database-import-outline", + "material/database-import", + "material/database-lock-outline", + "material/database-lock", + "material/database-marker-outline", + "material/database-marker", + "material/database-minus-outline", + "material/database-minus", + "material/database-off-outline", + "material/database-off", + "material/database-outline", + "material/database-plus-outline", + "material/database-plus", + "material/database-refresh-outline", + "material/database-refresh", + "material/database-remove-outline", + "material/database-remove", + "material/database-search-outline", + "material/database-search", + "material/database-settings-outline", + "material/database-settings", + "material/database-sync-outline", + "material/database-sync", + "material/database", + "material/death-star-variant", + "material/death-star", + "material/deathly-hallows", + "material/debian", + "material/debug-step-into", + "material/debug-step-out", + "material/debug-step-over", + "material/decagram-outline", + "material/decagram", + "material/decimal-comma-decrease", + "material/decimal-comma-increase", + "material/decimal-comma", + "material/decimal-decrease", + "material/decimal-increase", + "material/decimal", + "material/delete-alert-outline", + "material/delete-alert", + "material/delete-circle-outline", + "material/delete-circle", + "material/delete-clock-outline", + "material/delete-clock", + "material/delete-empty-outline", + "material/delete-empty", + "material/delete-forever-outline", + "material/delete-forever", + "material/delete-off-outline", + "material/delete-off", + "material/delete-outline", + "material/delete-restore", + "material/delete-sweep-outline", + "material/delete-sweep", + "material/delete-variant", + "material/delete", + "material/delta", + "material/desk-lamp-off", + "material/desk-lamp-on", + "material/desk-lamp", + "material/desk", + "material/deskphone", + "material/desktop-classic", + "material/desktop-tower-monitor", + "material/desktop-tower", + "material/details", + "material/dev-to", + "material/developer-board", + "material/deviantart", + "material/devices", + "material/dharmachakra", + "material/diabetes", + "material/dialpad", + "material/diameter-outline", + "material/diameter-variant", + "material/diameter", + "material/diamond-outline", + "material/diamond-stone", + "material/diamond", + "material/diaper-outline", + "material/dice-1-outline", + "material/dice-1", + "material/dice-2-outline", + "material/dice-2", + "material/dice-3-outline", + "material/dice-3", + "material/dice-4-outline", + "material/dice-4", + "material/dice-5-outline", + "material/dice-5", + "material/dice-6-outline", + "material/dice-6", + "material/dice-d10-outline", + "material/dice-d10", + "material/dice-d12-outline", + "material/dice-d12", + "material/dice-d20-outline", + "material/dice-d20", + "material/dice-d4-outline", + "material/dice-d4", + "material/dice-d6-outline", + "material/dice-d6", + "material/dice-d8-outline", + "material/dice-d8", + "material/dice-multiple-outline", + "material/dice-multiple", + "material/digital-ocean", + "material/dip-switch", + "material/directions-fork", + "material/directions", + "material/disc-alert", + "material/disc-player", + "material/disc", + "material/dishwasher-alert", + "material/dishwasher-off", + "material/dishwasher", + "material/disqus", + "material/distribute-horizontal-center", + "material/distribute-horizontal-left", + "material/distribute-horizontal-right", + "material/distribute-vertical-bottom", + "material/distribute-vertical-center", + "material/distribute-vertical-top", + "material/diversify", + "material/diving-flippers", + "material/diving-helmet", + "material/diving-scuba-flag", + "material/diving-scuba-mask", + "material/diving-scuba-tank-multiple", + "material/diving-scuba-tank", + "material/diving-scuba", + "material/diving-snorkel", + "material/diving", + "material/division-box", + "material/division", + "material/dlna", + "material/dna", + "material/dns-outline", + "material/dns", + "material/dock-bottom", + "material/dock-left", + "material/dock-right", + "material/dock-top", + "material/dock-window", + "material/docker", + "material/doctor", + "material/dog-service", + "material/dog-side-off", + "material/dog-side", + "material/dog", + "material/dolby", + "material/dolly", + "material/dolphin", + "material/domain-off", + "material/domain-plus", + "material/domain-remove", + "material/domain-switch", + "material/domain", + "material/dome-light", + "material/domino-mask", + "material/donkey", + "material/door-closed-cancel", + "material/door-closed-lock", + "material/door-closed", + "material/door-open", + "material/door-sliding-lock", + "material/door-sliding-open", + "material/door-sliding", + "material/door", + "material/doorbell-video", + "material/doorbell", + "material/dot-net", + "material/dots-circle", + "material/dots-grid", + "material/dots-hexagon", + "material/dots-horizontal-circle-outline", + "material/dots-horizontal-circle", + "material/dots-horizontal", + "material/dots-square", + "material/dots-triangle", + "material/dots-vertical-circle-outline", + "material/dots-vertical-circle", + "material/dots-vertical", + "material/download-box-outline", + "material/download-box", + "material/download-circle-outline", + "material/download-circle", + "material/download-lock-outline", + "material/download-lock", + "material/download-multiple-outline", + "material/download-multiple", + "material/download-network-outline", + "material/download-network", + "material/download-off-outline", + "material/download-off", + "material/download-outline", + "material/download", + "material/drag-horizontal-variant", + "material/drag-horizontal", + "material/drag-variant", + "material/drag-vertical-variant", + "material/drag-vertical", + "material/drag", + "material/drama-masks", + "material/draw-pen", + "material/draw", + "material/drawing-box", + "material/drawing", + "material/dresser-outline", + "material/dresser", + "material/drone", + "material/dropbox", + "material/drupal", + "material/duck", + "material/dumbbell", + "material/dump-truck", + "material/ear-hearing-loop", + "material/ear-hearing-off", + "material/ear-hearing", + "material/earbuds-off-outline", + "material/earbuds-off", + "material/earbuds-outline", + "material/earbuds", + "material/earth-arrow-down", + "material/earth-arrow-left", + "material/earth-arrow-right", + "material/earth-arrow-up", + "material/earth-box-minus", + "material/earth-box-off", + "material/earth-box-plus", + "material/earth-box-remove", + "material/earth-box", + "material/earth-minus", + "material/earth-off", + "material/earth-plus", + "material/earth-remove", + "material/earth", + "material/egg-easter", + "material/egg-fried", + "material/egg-off-outline", + "material/egg-off", + "material/egg-outline", + "material/egg", + "material/eiffel-tower", + "material/eight-track", + "material/eject-circle-outline", + "material/eject-circle", + "material/eject-outline", + "material/eject", + "material/electric-switch-closed", + "material/electric-switch", + "material/electron-framework", + "material/elephant", + "material/elevation-decline", + "material/elevation-rise", + "material/elevator-down", + "material/elevator-passenger-off-outline", + "material/elevator-passenger-off", + "material/elevator-passenger-outline", + "material/elevator-passenger", + "material/elevator-up", + "material/elevator", + "material/ellipse-outline", + "material/ellipse", + "material/email-alert-outline", + "material/email-alert", + "material/email-arrow-left-outline", + "material/email-arrow-left", + "material/email-arrow-right-outline", + "material/email-arrow-right", + "material/email-box", + "material/email-check-outline", + "material/email-check", + "material/email-edit-outline", + "material/email-edit", + "material/email-fast-outline", + "material/email-fast", + "material/email-heart-outline", + "material/email-lock-outline", + "material/email-lock", + "material/email-mark-as-unread", + "material/email-minus-outline", + "material/email-minus", + "material/email-multiple-outline", + "material/email-multiple", + "material/email-newsletter", + "material/email-off-outline", + "material/email-off", + "material/email-open-heart-outline", + "material/email-open-multiple-outline", + "material/email-open-multiple", + "material/email-open-outline", + "material/email-open", + "material/email-outline", + "material/email-plus-outline", + "material/email-plus", + "material/email-remove-outline", + "material/email-remove", + "material/email-seal-outline", + "material/email-seal", + "material/email-search-outline", + "material/email-search", + "material/email-sync-outline", + "material/email-sync", + "material/email-variant", + "material/email", + "material/ember", + "material/emby", + "material/emoticon-angry-outline", + "material/emoticon-angry", + "material/emoticon-confused-outline", + "material/emoticon-confused", + "material/emoticon-cool-outline", + "material/emoticon-cool", + "material/emoticon-cry-outline", + "material/emoticon-cry", + "material/emoticon-dead-outline", + "material/emoticon-dead", + "material/emoticon-devil-outline", + "material/emoticon-devil", + "material/emoticon-excited-outline", + "material/emoticon-excited", + "material/emoticon-frown-outline", + "material/emoticon-frown", + "material/emoticon-happy-outline", + "material/emoticon-happy", + "material/emoticon-kiss-outline", + "material/emoticon-kiss", + "material/emoticon-lol-outline", + "material/emoticon-lol", + "material/emoticon-minus-outline", + "material/emoticon-minus", + "material/emoticon-neutral-outline", + "material/emoticon-neutral", + "material/emoticon-outline", + "material/emoticon-plus-outline", + "material/emoticon-plus", + "material/emoticon-poop-outline", + "material/emoticon-poop", + "material/emoticon-remove-outline", + "material/emoticon-remove", + "material/emoticon-sad-outline", + "material/emoticon-sad", + "material/emoticon-sick-outline", + "material/emoticon-sick", + "material/emoticon-tongue-outline", + "material/emoticon-tongue", + "material/emoticon-wink-outline", + "material/emoticon-wink", + "material/emoticon", + "material/engine-off-outline", + "material/engine-off", + "material/engine-outline", + "material/engine", + "material/epsilon", + "material/equal-box", + "material/equal", + "material/equalizer-outline", + "material/equalizer", + "material/eraser-variant", + "material/eraser", + "material/escalator-box", + "material/escalator-down", + "material/escalator-up", + "material/escalator", + "material/eslint", + "material/et", + "material/ethereum", + "material/ethernet-cable-off", + "material/ethernet-cable", + "material/ethernet-off", + "material/ethernet", + "material/ev-plug-ccs1", + "material/ev-plug-ccs2", + "material/ev-plug-chademo", + "material/ev-plug-tesla", + "material/ev-plug-type1", + "material/ev-plug-type2", + "material/ev-station", + "material/evernote", + "material/excavator", + "material/exclamation-thick", + "material/exclamation", + "material/exit-run", + "material/exit-to-app", + "material/expand-all-outline", + "material/expand-all", + "material/expansion-card-variant", + "material/expansion-card", + "material/exponent-box", + "material/exponent", + "material/export-variant", + "material/export", + "material/eye-arrow-left-outline", + "material/eye-arrow-left", + "material/eye-arrow-right-outline", + "material/eye-arrow-right", + "material/eye-check-outline", + "material/eye-check", + "material/eye-circle-outline", + "material/eye-circle", + "material/eye-closed", + "material/eye-lock-open-outline", + "material/eye-lock-open", + "material/eye-lock-outline", + "material/eye-lock", + "material/eye-minus-outline", + "material/eye-minus", + "material/eye-off-outline", + "material/eye-off", + "material/eye-outline", + "material/eye-plus-outline", + "material/eye-plus", + "material/eye-refresh-outline", + "material/eye-refresh", + "material/eye-remove-outline", + "material/eye-remove", + "material/eye-settings-outline", + "material/eye-settings", + "material/eye", + "material/eyedropper-minus", + "material/eyedropper-off", + "material/eyedropper-plus", + "material/eyedropper-remove", + "material/eyedropper-variant", + "material/eyedropper", + "material/face-agent", + "material/face-man-outline", + "material/face-man-profile", + "material/face-man-shimmer-outline", + "material/face-man-shimmer", + "material/face-man", + "material/face-mask-outline", + "material/face-mask", + "material/face-recognition", + "material/face-woman-outline", + "material/face-woman-profile", + "material/face-woman-shimmer-outline", + "material/face-woman-shimmer", + "material/face-woman", + "material/facebook-gaming", + "material/facebook-messenger", + "material/facebook-workplace", + "material/facebook", + "material/factory", + "material/family-tree", + "material/fan-alert", + "material/fan-auto", + "material/fan-chevron-down", + "material/fan-chevron-up", + "material/fan-clock", + "material/fan-minus", + "material/fan-off", + "material/fan-plus", + "material/fan-remove", + "material/fan-speed-1", + "material/fan-speed-2", + "material/fan-speed-3", + "material/fan", + "material/fast-forward-10", + "material/fast-forward-15", + "material/fast-forward-30", + "material/fast-forward-45", + "material/fast-forward-5", + "material/fast-forward-60", + "material/fast-forward-outline", + "material/fast-forward", + "material/faucet-variant", + "material/faucet", + "material/fax", + "material/feather", + "material/feature-search-outline", + "material/feature-search", + "material/fedora", + "material/fence-electric", + "material/fence", + "material/fencing", + "material/ferris-wheel", + "material/ferry", + "material/file-account-outline", + "material/file-account", + "material/file-alert-outline", + "material/file-alert", + "material/file-arrow-left-right-outline", + "material/file-arrow-left-right", + "material/file-arrow-up-down-outline", + "material/file-arrow-up-down", + "material/file-cabinet", + "material/file-cad-box", + "material/file-cad", + "material/file-cancel-outline", + "material/file-cancel", + "material/file-certificate-outline", + "material/file-certificate", + "material/file-chart-check-outline", + "material/file-chart-check", + "material/file-chart-outline", + "material/file-chart", + "material/file-check-outline", + "material/file-check", + "material/file-clock-outline", + "material/file-clock", + "material/file-cloud-outline", + "material/file-cloud", + "material/file-code-outline", + "material/file-code", + "material/file-cog-outline", + "material/file-cog", + "material/file-compare", + "material/file-delimited-outline", + "material/file-delimited", + "material/file-document-alert-outline", + "material/file-document-alert", + "material/file-document-arrow-right-outline", + "material/file-document-arrow-right", + "material/file-document-check-outline", + "material/file-document-check", + "material/file-document-edit-outline", + "material/file-document-edit", + "material/file-document-minus-outline", + "material/file-document-minus", + "material/file-document-multiple-outline", + "material/file-document-multiple", + "material/file-document-outline", + "material/file-document-plus-outline", + "material/file-document-plus", + "material/file-document-refresh-outline", + "material/file-document-refresh", + "material/file-document-remove-outline", + "material/file-document-remove", + "material/file-document", + "material/file-download-outline", + "material/file-download", + "material/file-edit-outline", + "material/file-edit", + "material/file-excel-box-outline", + "material/file-excel-box", + "material/file-excel-outline", + "material/file-excel", + "material/file-export-outline", + "material/file-export", + "material/file-eye-outline", + "material/file-eye", + "material/file-find-outline", + "material/file-find", + "material/file-gif-box", + "material/file-hidden", + "material/file-image-marker-outline", + "material/file-image-marker", + "material/file-image-minus-outline", + "material/file-image-minus", + "material/file-image-outline", + "material/file-image-plus-outline", + "material/file-image-plus", + "material/file-image-remove-outline", + "material/file-image-remove", + "material/file-image", + "material/file-import-outline", + "material/file-import", + "material/file-jpg-box", + "material/file-key-outline", + "material/file-key", + "material/file-link-outline", + "material/file-link", + "material/file-lock-open-outline", + "material/file-lock-open", + "material/file-lock-outline", + "material/file-lock", + "material/file-marker-outline", + "material/file-marker", + "material/file-minus-outline", + "material/file-minus", + "material/file-move-outline", + "material/file-move", + "material/file-multiple-outline", + "material/file-multiple", + "material/file-music-outline", + "material/file-music", + "material/file-outline", + "material/file-pdf-box", + "material/file-percent-outline", + "material/file-percent", + "material/file-phone-outline", + "material/file-phone", + "material/file-plus-outline", + "material/file-plus", + "material/file-png-box", + "material/file-powerpoint-box-outline", + "material/file-powerpoint-box", + "material/file-powerpoint-outline", + "material/file-powerpoint", + "material/file-presentation-box", + "material/file-question-outline", + "material/file-question", + "material/file-refresh-outline", + "material/file-refresh", + "material/file-remove-outline", + "material/file-remove", + "material/file-replace-outline", + "material/file-replace", + "material/file-restore-outline", + "material/file-restore", + "material/file-rotate-left-outline", + "material/file-rotate-left", + "material/file-rotate-right-outline", + "material/file-rotate-right", + "material/file-search-outline", + "material/file-search", + "material/file-send-outline", + "material/file-send", + "material/file-settings-outline", + "material/file-settings", + "material/file-sign", + "material/file-star-four-points-outline", + "material/file-star-four-points", + "material/file-star-outline", + "material/file-star", + "material/file-swap-outline", + "material/file-swap", + "material/file-sync-outline", + "material/file-sync", + "material/file-table-box-multiple-outline", + "material/file-table-box-multiple", + "material/file-table-box-outline", + "material/file-table-box", + "material/file-table-outline", + "material/file-table", + "material/file-tree-outline", + "material/file-tree", + "material/file-undo-outline", + "material/file-undo", + "material/file-upload-outline", + "material/file-upload", + "material/file-video-outline", + "material/file-video", + "material/file-word-box-outline", + "material/file-word-box", + "material/file-word-outline", + "material/file-word", + "material/file-xml-box", + "material/file", + "material/film", + "material/filmstrip-box-multiple", + "material/filmstrip-box", + "material/filmstrip-off", + "material/filmstrip", + "material/filter-check-outline", + "material/filter-check", + "material/filter-cog-outline", + "material/filter-cog", + "material/filter-menu-outline", + "material/filter-menu", + "material/filter-minus-outline", + "material/filter-minus", + "material/filter-multiple-outline", + "material/filter-multiple", + "material/filter-off-outline", + "material/filter-off", + "material/filter-outline", + "material/filter-plus-outline", + "material/filter-plus", + "material/filter-remove-outline", + "material/filter-remove", + "material/filter-settings-outline", + "material/filter-settings", + "material/filter-variant-minus", + "material/filter-variant-plus", + "material/filter-variant-remove", + "material/filter-variant", + "material/filter", + "material/finance", + "material/find-replace", + "material/fingerprint-off", + "material/fingerprint", + "material/fire-alert", + "material/fire-circle", + "material/fire-extinguisher", + "material/fire-hydrant-alert", + "material/fire-hydrant-off", + "material/fire-hydrant", + "material/fire-off", + "material/fire-station", + "material/fire-truck", + "material/fire", + "material/firebase", + "material/firefox", + "material/fireplace-off", + "material/fireplace", + "material/firewire", + "material/firework-off", + "material/firework", + "material/fish-off", + "material/fish", + "material/fishbowl-outline", + "material/fishbowl", + "material/fit-to-page-outline", + "material/fit-to-page", + "material/fit-to-screen-outline", + "material/fit-to-screen", + "material/flag-checkered", + "material/flag-minus-outline", + "material/flag-minus", + "material/flag-off-outline", + "material/flag-off", + "material/flag-outline", + "material/flag-plus-outline", + "material/flag-plus", + "material/flag-remove-outline", + "material/flag-remove", + "material/flag-triangle", + "material/flag-variant-minus-outline", + "material/flag-variant-minus", + "material/flag-variant-off-outline", + "material/flag-variant-off", + "material/flag-variant-outline", + "material/flag-variant-plus-outline", + "material/flag-variant-plus", + "material/flag-variant-remove-outline", + "material/flag-variant-remove", + "material/flag-variant", + "material/flag", + "material/flare", + "material/flash-alert-outline", + "material/flash-alert", + "material/flash-auto", + "material/flash-off-outline", + "material/flash-off", + "material/flash-outline", + "material/flash-red-eye", + "material/flash-triangle-outline", + "material/flash-triangle", + "material/flash", + "material/flashlight-off", + "material/flashlight", + "material/flask-empty-minus-outline", + "material/flask-empty-minus", + "material/flask-empty-off-outline", + "material/flask-empty-off", + "material/flask-empty-outline", + "material/flask-empty-plus-outline", + "material/flask-empty-plus", + "material/flask-empty-remove-outline", + "material/flask-empty-remove", + "material/flask-empty", + "material/flask-minus-outline", + "material/flask-minus", + "material/flask-off-outline", + "material/flask-off", + "material/flask-outline", + "material/flask-plus-outline", + "material/flask-plus", + "material/flask-remove-outline", + "material/flask-remove", + "material/flask-round-bottom-empty-outline", + "material/flask-round-bottom-empty", + "material/flask-round-bottom-outline", + "material/flask-round-bottom", + "material/flask", + "material/fleur-de-lis", + "material/flip-horizontal", + "material/flip-to-back", + "material/flip-to-front", + "material/flip-vertical", + "material/floor-lamp-dual-outline", + "material/floor-lamp-dual", + "material/floor-lamp-outline", + "material/floor-lamp-torchiere-outline", + "material/floor-lamp-torchiere-variant-outline", + "material/floor-lamp-torchiere-variant", + "material/floor-lamp-torchiere", + "material/floor-lamp", + "material/floor-plan", + "material/floppy-variant", + "material/floppy", + "material/flower-outline", + "material/flower-pollen-outline", + "material/flower-pollen", + "material/flower-poppy", + "material/flower-tulip-outline", + "material/flower-tulip", + "material/flower", + "material/focus-auto", + "material/focus-field-horizontal", + "material/focus-field-vertical", + "material/focus-field", + "material/folder-account-outline", + "material/folder-account", + "material/folder-alert-outline", + "material/folder-alert", + "material/folder-arrow-down-outline", + "material/folder-arrow-down", + "material/folder-arrow-left-outline", + "material/folder-arrow-left-right-outline", + "material/folder-arrow-left-right", + "material/folder-arrow-left", + "material/folder-arrow-right-outline", + "material/folder-arrow-right", + "material/folder-arrow-up-down-outline", + "material/folder-arrow-up-down", + "material/folder-arrow-up-outline", + "material/folder-arrow-up", + "material/folder-cancel-outline", + "material/folder-cancel", + "material/folder-check-outline", + "material/folder-check", + "material/folder-clock-outline", + "material/folder-clock", + "material/folder-cog-outline", + "material/folder-cog", + "material/folder-download-outline", + "material/folder-download", + "material/folder-edit-outline", + "material/folder-edit", + "material/folder-eye-outline", + "material/folder-eye", + "material/folder-file-outline", + "material/folder-file", + "material/folder-google-drive", + "material/folder-heart-outline", + "material/folder-heart", + "material/folder-hidden", + "material/folder-home-outline", + "material/folder-home", + "material/folder-image", + "material/folder-information-outline", + "material/folder-information", + "material/folder-key-network-outline", + "material/folder-key-network", + "material/folder-key-outline", + "material/folder-key", + "material/folder-lock-open-outline", + "material/folder-lock-open", + "material/folder-lock-outline", + "material/folder-lock", + "material/folder-marker-outline", + "material/folder-marker", + "material/folder-minus-outline", + "material/folder-minus", + "material/folder-move-outline", + "material/folder-move", + "material/folder-multiple-image", + "material/folder-multiple-outline", + "material/folder-multiple-plus-outline", + "material/folder-multiple-plus", + "material/folder-multiple", + "material/folder-music-outline", + "material/folder-music", + "material/folder-network-outline", + "material/folder-network", + "material/folder-off-outline", + "material/folder-off", + "material/folder-open-outline", + "material/folder-open", + "material/folder-outline", + "material/folder-play-outline", + "material/folder-play", + "material/folder-plus-outline", + "material/folder-plus", + "material/folder-pound-outline", + "material/folder-pound", + "material/folder-question-outline", + "material/folder-question", + "material/folder-refresh-outline", + "material/folder-refresh", + "material/folder-remove-outline", + "material/folder-remove", + "material/folder-search-outline", + "material/folder-search", + "material/folder-settings-outline", + "material/folder-settings", + "material/folder-star-multiple-outline", + "material/folder-star-multiple", + "material/folder-star-outline", + "material/folder-star", + "material/folder-swap-outline", + "material/folder-swap", + "material/folder-sync-outline", + "material/folder-sync", + "material/folder-table-outline", + "material/folder-table", + "material/folder-text-outline", + "material/folder-text", + "material/folder-upload-outline", + "material/folder-upload", + "material/folder-wrench-outline", + "material/folder-wrench", + "material/folder-zip-outline", + "material/folder-zip", + "material/folder", + "material/font-awesome", + "material/food-apple-outline", + "material/food-apple", + "material/food-croissant", + "material/food-drumstick-off-outline", + "material/food-drumstick-off", + "material/food-drumstick-outline", + "material/food-drumstick", + "material/food-fork-drink", + "material/food-halal", + "material/food-hot-dog", + "material/food-kosher", + "material/food-off-outline", + "material/food-off", + "material/food-outline", + "material/food-steak-off", + "material/food-steak", + "material/food-takeout-box-outline", + "material/food-takeout-box", + "material/food-turkey", + "material/food-variant-off", + "material/food-variant", + "material/food", + "material/foot-print", + "material/football-australian", + "material/football-helmet", + "material/football", + "material/forest-outline", + "material/forest", + "material/forklift", + "material/form-dropdown", + "material/form-select", + "material/form-textarea", + "material/form-textbox-lock", + "material/form-textbox-password", + "material/form-textbox", + "material/format-align-bottom", + "material/format-align-center", + "material/format-align-justify", + "material/format-align-left", + "material/format-align-middle", + "material/format-align-right", + "material/format-align-top", + "material/format-annotation-minus", + "material/format-annotation-plus", + "material/format-bold", + "material/format-clear", + "material/format-color-fill", + "material/format-color-highlight", + "material/format-color-marker-cancel", + "material/format-color-text", + "material/format-columns", + "material/format-float-center", + "material/format-float-left", + "material/format-float-none", + "material/format-float-right", + "material/format-font-size-decrease", + "material/format-font-size-increase", + "material/format-font", + "material/format-header-1", + "material/format-header-2", + "material/format-header-3", + "material/format-header-4", + "material/format-header-5", + "material/format-header-6", + "material/format-header-decrease", + "material/format-header-equal", + "material/format-header-increase", + "material/format-header-pound", + "material/format-horizontal-align-center", + "material/format-horizontal-align-left", + "material/format-horizontal-align-right", + "material/format-indent-decrease", + "material/format-indent-increase", + "material/format-italic", + "material/format-letter-case-lower", + "material/format-letter-case-upper", + "material/format-letter-case", + "material/format-letter-ends-with", + "material/format-letter-matches", + "material/format-letter-spacing-variant", + "material/format-letter-spacing", + "material/format-letter-starts-with", + "material/format-line-height", + "material/format-line-spacing", + "material/format-line-style", + "material/format-line-weight", + "material/format-list-bulleted-square", + "material/format-list-bulleted-triangle", + "material/format-list-bulleted-type", + "material/format-list-bulleted", + "material/format-list-checkbox", + "material/format-list-checks", + "material/format-list-group-plus", + "material/format-list-group", + "material/format-list-numbered-rtl", + "material/format-list-numbered", + "material/format-list-text", + "material/format-overline", + "material/format-page-break", + "material/format-page-split", + "material/format-paint", + "material/format-paragraph-spacing", + "material/format-paragraph", + "material/format-pilcrow-arrow-left", + "material/format-pilcrow-arrow-right", + "material/format-pilcrow", + "material/format-quote-close-outline", + "material/format-quote-close", + "material/format-quote-open-outline", + "material/format-quote-open", + "material/format-rotate-90", + "material/format-section", + "material/format-size", + "material/format-strikethrough-variant", + "material/format-strikethrough", + "material/format-subscript", + "material/format-superscript", + "material/format-text-rotation-angle-down", + "material/format-text-rotation-angle-up", + "material/format-text-rotation-down-vertical", + "material/format-text-rotation-down", + "material/format-text-rotation-none", + "material/format-text-rotation-up", + "material/format-text-rotation-vertical", + "material/format-text-variant-outline", + "material/format-text-variant", + "material/format-text-wrapping-clip", + "material/format-text-wrapping-overflow", + "material/format-text-wrapping-wrap", + "material/format-text", + "material/format-textbox", + "material/format-title", + "material/format-underline-wavy", + "material/format-underline", + "material/format-vertical-align-bottom", + "material/format-vertical-align-center", + "material/format-vertical-align-top", + "material/format-wrap-inline", + "material/format-wrap-square", + "material/format-wrap-tight", + "material/format-wrap-top-bottom", + "material/forum-minus-outline", + "material/forum-minus", + "material/forum-outline", + "material/forum-plus-outline", + "material/forum-plus", + "material/forum-remove-outline", + "material/forum-remove", + "material/forum", + "material/forward", + "material/forwardburger", + "material/fountain-pen-tip", + "material/fountain-pen", + "material/fountain", + "material/fraction-one-half", + "material/freebsd", + "material/french-fries", + "material/frequently-asked-questions", + "material/fridge-alert-outline", + "material/fridge-alert", + "material/fridge-bottom", + "material/fridge-industrial-alert-outline", + "material/fridge-industrial-alert", + "material/fridge-industrial-off-outline", + "material/fridge-industrial-off", + "material/fridge-industrial-outline", + "material/fridge-industrial", + "material/fridge-off-outline", + "material/fridge-off", + "material/fridge-outline", + "material/fridge-top", + "material/fridge-variant-alert-outline", + "material/fridge-variant-alert", + "material/fridge-variant-off-outline", + "material/fridge-variant-off", + "material/fridge-variant-outline", + "material/fridge-variant", + "material/fridge", + "material/fruit-cherries-off", + "material/fruit-cherries", + "material/fruit-citrus-off", + "material/fruit-citrus", + "material/fruit-grapes-outline", + "material/fruit-grapes", + "material/fruit-pear", + "material/fruit-pineapple", + "material/fruit-watermelon", + "material/fuel-cell", + "material/fuel", + "material/fullscreen-exit", + "material/fullscreen", + "material/function-variant", + "material/function", + "material/furigana-horizontal", + "material/furigana-vertical", + "material/fuse-alert", + "material/fuse-blade", + "material/fuse-off", + "material/fuse", + "material/gamepad-circle-down", + "material/gamepad-circle-left", + "material/gamepad-circle-outline", + "material/gamepad-circle-right", + "material/gamepad-circle-up", + "material/gamepad-circle", + "material/gamepad-down", + "material/gamepad-left", + "material/gamepad-outline", + "material/gamepad-right", + "material/gamepad-round-down", + "material/gamepad-round-left", + "material/gamepad-round-outline", + "material/gamepad-round-right", + "material/gamepad-round-up", + "material/gamepad-round", + "material/gamepad-square-outline", + "material/gamepad-square", + "material/gamepad-up", + "material/gamepad-variant-outline", + "material/gamepad-variant", + "material/gamepad", + "material/gamma", + "material/gantry-crane", + "material/garage-alert-variant", + "material/garage-alert", + "material/garage-lock", + "material/garage-open-variant", + "material/garage-open", + "material/garage-variant-lock", + "material/garage-variant", + "material/garage", + "material/gas-burner", + "material/gas-cylinder", + "material/gas-station-in-use-outline", + "material/gas-station-in-use", + "material/gas-station-off-outline", + "material/gas-station-off", + "material/gas-station-outline", + "material/gas-station", + "material/gate-alert", + "material/gate-and", + "material/gate-arrow-left", + "material/gate-arrow-right", + "material/gate-buffer", + "material/gate-nand", + "material/gate-nor", + "material/gate-not", + "material/gate-open", + "material/gate-or", + "material/gate-xnor", + "material/gate-xor", + "material/gate", + "material/gatsby", + "material/gauge-empty", + "material/gauge-full", + "material/gauge-low", + "material/gauge", + "material/gavel", + "material/gender-female", + "material/gender-male-female-variant", + "material/gender-male-female", + "material/gender-male", + "material/gender-non-binary", + "material/gender-transgender", + "material/generator-mobile", + "material/generator-portable", + "material/generator-stationary", + "material/gentoo", + "material/gesture-double-tap", + "material/gesture-pinch", + "material/gesture-spread", + "material/gesture-swipe-down", + "material/gesture-swipe-horizontal", + "material/gesture-swipe-left", + "material/gesture-swipe-right", + "material/gesture-swipe-up", + "material/gesture-swipe-vertical", + "material/gesture-swipe", + "material/gesture-tap-box", + "material/gesture-tap-button", + "material/gesture-tap-hold", + "material/gesture-tap", + "material/gesture-two-double-tap", + "material/gesture-two-tap", + "material/gesture", + "material/ghost-off-outline", + "material/ghost-off", + "material/ghost-outline", + "material/ghost", + "material/gift-off-outline", + "material/gift-off", + "material/gift-open-outline", + "material/gift-open", + "material/gift-outline", + "material/gift", + "material/git", + "material/github", + "material/gitlab", + "material/glass-cocktail-off", + "material/glass-cocktail", + "material/glass-flute", + "material/glass-fragile", + "material/glass-mug-off", + "material/glass-mug-variant-off", + "material/glass-mug-variant", + "material/glass-mug", + "material/glass-pint-outline", + "material/glass-stange", + "material/glass-tulip", + "material/glass-wine", + "material/glasses", + "material/globe-light-outline", + "material/globe-light", + "material/globe-model", + "material/gmail", + "material/gnome", + "material/go-kart-track", + "material/go-kart", + "material/gog", + "material/gold", + "material/golf-cart", + "material/golf-tee", + "material/golf", + "material/gondola", + "material/goodreads", + "material/google-ads", + "material/google-analytics", + "material/google-assistant", + "material/google-cardboard", + "material/google-chrome", + "material/google-circles-communities", + "material/google-circles-extended", + "material/google-circles-group", + "material/google-circles", + "material/google-classroom", + "material/google-cloud", + "material/google-downasaur", + "material/google-drive", + "material/google-earth", + "material/google-fit", + "material/google-glass", + "material/google-hangouts", + "material/google-keep", + "material/google-lens", + "material/google-maps", + "material/google-my-business", + "material/google-nearby", + "material/google-play", + "material/google-plus", + "material/google-podcast", + "material/google-spreadsheet", + "material/google-street-view", + "material/google-translate", + "material/google", + "material/gradient-horizontal", + "material/gradient-vertical", + "material/grain", + "material/graph-outline", + "material/graph", + "material/graphql", + "material/grass", + "material/grave-stone", + "material/grease-pencil", + "material/greater-than-or-equal", + "material/greater-than", + "material/greenhouse", + "material/grid-large", + "material/grid-off", + "material/grid", + "material/grill-outline", + "material/grill", + "material/group", + "material/guitar-acoustic", + "material/guitar-electric", + "material/guitar-pick-outline", + "material/guitar-pick", + "material/guy-fawkes-mask", + "material/gymnastics", + "material/hail", + "material/hair-dryer-outline", + "material/hair-dryer", + "material/halloween", + "material/hamburger-check", + "material/hamburger-minus", + "material/hamburger-off", + "material/hamburger-plus", + "material/hamburger-remove", + "material/hamburger", + "material/hammer-screwdriver", + "material/hammer-sickle", + "material/hammer-wrench", + "material/hammer", + "material/hand-back-left-off-outline", + "material/hand-back-left-off", + "material/hand-back-left-outline", + "material/hand-back-left", + "material/hand-back-right-off-outline", + "material/hand-back-right-off", + "material/hand-back-right-outline", + "material/hand-back-right", + "material/hand-clap-off", + "material/hand-clap", + "material/hand-coin-outline", + "material/hand-coin", + "material/hand-cycle", + "material/hand-extended-outline", + "material/hand-extended", + "material/hand-front-left-outline", + "material/hand-front-left", + "material/hand-front-right-outline", + "material/hand-front-right", + "material/hand-heart-outline", + "material/hand-heart", + "material/hand-okay", + "material/hand-peace-variant", + "material/hand-peace", + "material/hand-pointing-down", + "material/hand-pointing-left", + "material/hand-pointing-right", + "material/hand-pointing-up", + "material/hand-saw", + "material/hand-wash-outline", + "material/hand-wash", + "material/hand-water", + "material/hand-wave-outline", + "material/hand-wave", + "material/handball", + "material/handcuffs", + "material/hands-pray", + "material/handshake-outline", + "material/handshake", + "material/hanger", + "material/hard-hat", + "material/harddisk-plus", + "material/harddisk-remove", + "material/harddisk", + "material/hat-fedora", + "material/hazard-lights", + "material/hdmi-port", + "material/hdr-off", + "material/hdr", + "material/head-alert-outline", + "material/head-alert", + "material/head-check-outline", + "material/head-check", + "material/head-cog-outline", + "material/head-cog", + "material/head-dots-horizontal-outline", + "material/head-dots-horizontal", + "material/head-flash-outline", + "material/head-flash", + "material/head-heart-outline", + "material/head-heart", + "material/head-lightbulb-outline", + "material/head-lightbulb", + "material/head-minus-outline", + "material/head-minus", + "material/head-outline", + "material/head-plus-outline", + "material/head-plus", + "material/head-question-outline", + "material/head-question", + "material/head-remove-outline", + "material/head-remove", + "material/head-snowflake-outline", + "material/head-snowflake", + "material/head-sync-outline", + "material/head-sync", + "material/head", + "material/headphones-bluetooth", + "material/headphones-box", + "material/headphones-off", + "material/headphones-settings", + "material/headphones", + "material/headset-dock", + "material/headset-off", + "material/headset", + "material/heart-box-outline", + "material/heart-box", + "material/heart-broken-outline", + "material/heart-broken", + "material/heart-circle-outline", + "material/heart-circle", + "material/heart-cog-outline", + "material/heart-cog", + "material/heart-flash", + "material/heart-half-full", + "material/heart-half-outline", + "material/heart-half", + "material/heart-minus-outline", + "material/heart-minus", + "material/heart-multiple-outline", + "material/heart-multiple", + "material/heart-off-outline", + "material/heart-off", + "material/heart-outline", + "material/heart-plus-outline", + "material/heart-plus", + "material/heart-pulse", + "material/heart-remove-outline", + "material/heart-remove", + "material/heart-search", + "material/heart-settings-outline", + "material/heart-settings", + "material/heart", + "material/heat-pump-outline", + "material/heat-pump", + "material/heat-wave", + "material/heating-coil", + "material/helicopter", + "material/help-box-multiple-outline", + "material/help-box-multiple", + "material/help-box-outline", + "material/help-box", + "material/help-circle-outline", + "material/help-circle", + "material/help-network-outline", + "material/help-network", + "material/help-rhombus-outline", + "material/help-rhombus", + "material/help", + "material/hexadecimal", + "material/hexagon-multiple-outline", + "material/hexagon-multiple", + "material/hexagon-outline", + "material/hexagon-slice-1", + "material/hexagon-slice-2", + "material/hexagon-slice-3", + "material/hexagon-slice-4", + "material/hexagon-slice-5", + "material/hexagon-slice-6", + "material/hexagon", + "material/hexagram-outline", + "material/hexagram", + "material/high-definition-box", + "material/high-definition", + "material/highway", + "material/hiking", + "material/history", + "material/hockey-puck", + "material/hockey-sticks", + "material/hololens", + "material/home-account", + "material/home-alert-outline", + "material/home-alert", + "material/home-analytics", + "material/home-assistant", + "material/home-automation", + "material/home-battery-outline", + "material/home-battery", + "material/home-circle-outline", + "material/home-circle", + "material/home-city-outline", + "material/home-city", + "material/home-clock-outline", + "material/home-clock", + "material/home-edit-outline", + "material/home-edit", + "material/home-export-outline", + "material/home-flood", + "material/home-floor-0", + "material/home-floor-1", + "material/home-floor-2", + "material/home-floor-3", + "material/home-floor-a", + "material/home-floor-b", + "material/home-floor-g", + "material/home-floor-l", + "material/home-floor-negative-1", + "material/home-group-minus", + "material/home-group-plus", + "material/home-group-remove", + "material/home-group", + "material/home-heart", + "material/home-import-outline", + "material/home-lightbulb-outline", + "material/home-lightbulb", + "material/home-lightning-bolt-outline", + "material/home-lightning-bolt", + "material/home-lock-open", + "material/home-lock", + "material/home-map-marker", + "material/home-minus-outline", + "material/home-minus", + "material/home-modern", + "material/home-off-outline", + "material/home-off", + "material/home-outline", + "material/home-percent-outline", + "material/home-percent", + "material/home-plus-outline", + "material/home-plus", + "material/home-remove-outline", + "material/home-remove", + "material/home-roof", + "material/home-search-outline", + "material/home-search", + "material/home-silo-outline", + "material/home-silo", + "material/home-sound-in-outline", + "material/home-sound-in", + "material/home-sound-out-outline", + "material/home-sound-out", + "material/home-switch-outline", + "material/home-switch", + "material/home-thermometer-outline", + "material/home-thermometer", + "material/home-variant-outline", + "material/home-variant", + "material/home", + "material/hook-off", + "material/hook", + "material/hoop-house", + "material/hops", + "material/horizontal-rotate-clockwise", + "material/horizontal-rotate-counterclockwise", + "material/horse-human", + "material/horse-variant-fast", + "material/horse-variant", + "material/horse", + "material/horseshoe", + "material/hospital-box-outline", + "material/hospital-box", + "material/hospital-building", + "material/hospital-marker", + "material/hospital", + "material/hot-tub", + "material/hours-12", + "material/hours-24", + "material/hub-outline", + "material/hub", + "material/hubspot", + "material/hulu", + "material/human-baby-changing-table", + "material/human-cane", + "material/human-capacity-decrease", + "material/human-capacity-increase", + "material/human-child", + "material/human-dolly", + "material/human-edit", + "material/human-female-boy", + "material/human-female-dance", + "material/human-female-female-child", + "material/human-female-female", + "material/human-female-girl", + "material/human-female", + "material/human-greeting-proximity", + "material/human-greeting-variant", + "material/human-greeting", + "material/human-handsdown", + "material/human-handsup", + "material/human-male-board-poll", + "material/human-male-board", + "material/human-male-boy", + "material/human-male-child", + "material/human-male-female-child", + "material/human-male-female", + "material/human-male-girl", + "material/human-male-height-variant", + "material/human-male-height", + "material/human-male-male-child", + "material/human-male-male", + "material/human-male", + "material/human-non-binary", + "material/human-pregnant", + "material/human-queue", + "material/human-scooter", + "material/human-walker", + "material/human-wheelchair", + "material/human-white-cane", + "material/human", + "material/humble-bundle", + "material/hvac-off", + "material/hvac", + "material/hydraulic-oil-level", + "material/hydraulic-oil-temperature", + "material/hydro-power", + "material/hydrogen-station", + "material/ice-cream-off", + "material/ice-cream", + "material/ice-pop", + "material/id-card", + "material/identifier", + "material/ideogram-cjk-variant", + "material/ideogram-cjk", + "material/image-album", + "material/image-area-close", + "material/image-area", + "material/image-auto-adjust", + "material/image-broken-variant", + "material/image-broken", + "material/image-check-outline", + "material/image-check", + "material/image-edit-outline", + "material/image-edit", + "material/image-filter-black-white", + "material/image-filter-center-focus-strong-outline", + "material/image-filter-center-focus-strong", + "material/image-filter-center-focus-weak", + "material/image-filter-center-focus", + "material/image-filter-drama-outline", + "material/image-filter-drama", + "material/image-filter-frames", + "material/image-filter-hdr-outline", + "material/image-filter-hdr", + "material/image-filter-none", + "material/image-filter-tilt-shift", + "material/image-filter-vintage", + "material/image-frame", + "material/image-lock-outline", + "material/image-lock", + "material/image-marker-outline", + "material/image-marker", + "material/image-minus-outline", + "material/image-minus", + "material/image-move", + "material/image-multiple-outline", + "material/image-multiple", + "material/image-off-outline", + "material/image-off", + "material/image-outline", + "material/image-plus-outline", + "material/image-plus", + "material/image-refresh-outline", + "material/image-refresh", + "material/image-remove-outline", + "material/image-remove", + "material/image-search-outline", + "material/image-search", + "material/image-size-select-actual", + "material/image-size-select-large", + "material/image-size-select-small", + "material/image-sync-outline", + "material/image-sync", + "material/image-text", + "material/image", + "material/import", + "material/inbox-arrow-down-outline", + "material/inbox-arrow-down", + "material/inbox-arrow-up-outline", + "material/inbox-arrow-up", + "material/inbox-full-outline", + "material/inbox-full", + "material/inbox-multiple-outline", + "material/inbox-multiple", + "material/inbox-outline", + "material/inbox-remove-outline", + "material/inbox-remove", + "material/inbox", + "material/incognito-circle-off", + "material/incognito-circle", + "material/incognito-off", + "material/incognito", + "material/induction", + "material/infinity", + "material/information-box-outline", + "material/information-box", + "material/information-off-outline", + "material/information-off", + "material/information-outline", + "material/information-slab-box-outline", + "material/information-slab-box", + "material/information-slab-circle-outline", + "material/information-slab-circle", + "material/information-slab-symbol", + "material/information-symbol", + "material/information-variant-box-outline", + "material/information-variant-box", + "material/information-variant-circle-outline", + "material/information-variant-circle", + "material/information-variant", + "material/information", + "material/instagram", + "material/instrument-triangle", + "material/integrated-circuit-chip", + "material/invert-colors-off", + "material/invert-colors", + "material/invoice-arrow-left-outline", + "material/invoice-arrow-left", + "material/invoice-arrow-right-outline", + "material/invoice-arrow-right", + "material/invoice-check-outline", + "material/invoice-check", + "material/invoice-clock-outline", + "material/invoice-clock", + "material/invoice-edit-outline", + "material/invoice-edit", + "material/invoice-export-outline", + "material/invoice-fast-outline", + "material/invoice-fast", + "material/invoice-import-outline", + "material/invoice-import", + "material/invoice-list-outline", + "material/invoice-list", + "material/invoice-minus-outline", + "material/invoice-minus", + "material/invoice-multiple-outline", + "material/invoice-multiple", + "material/invoice-outline", + "material/invoice-plus-outline", + "material/invoice-plus", + "material/invoice-remove-outline", + "material/invoice-remove", + "material/invoice-send-outline", + "material/invoice-send", + "material/invoice-text-arrow-left-outline", + "material/invoice-text-arrow-left", + "material/invoice-text-arrow-right-outline", + "material/invoice-text-arrow-right", + "material/invoice-text-check-outline", + "material/invoice-text-check", + "material/invoice-text-clock-outline", + "material/invoice-text-clock", + "material/invoice-text-edit-outline", + "material/invoice-text-edit", + "material/invoice-text-fast-outline", + "material/invoice-text-fast", + "material/invoice-text-minus-outline", + "material/invoice-text-minus", + "material/invoice-text-multiple-outline", + "material/invoice-text-multiple", + "material/invoice-text-outline", + "material/invoice-text-plus-outline", + "material/invoice-text-plus", + "material/invoice-text-remove-outline", + "material/invoice-text-remove", + "material/invoice-text-send-outline", + "material/invoice-text-send", + "material/invoice-text", + "material/invoice", + "material/iobroker", + "material/ip-network-outline", + "material/ip-network", + "material/ip-outline", + "material/ip", + "material/ipod", + "material/iron-board", + "material/iron-outline", + "material/iron", + "material/island-variant", + "material/island", + "material/iv-bag", + "material/jabber", + "material/jeepney", + "material/jellyfish-outline", + "material/jellyfish", + "material/jira", + "material/jquery", + "material/jsfiddle", + "material/jump-rope", + "material/kabaddi", + "material/kangaroo", + "material/karate", + "material/kayaking", + "material/keg", + "material/kettle-alert-outline", + "material/kettle-alert", + "material/kettle-off-outline", + "material/kettle-off", + "material/kettle-outline", + "material/kettle-pour-over", + "material/kettle-steam-outline", + "material/kettle-steam", + "material/kettle", + "material/kettlebell", + "material/key-alert-outline", + "material/key-alert", + "material/key-arrow-right", + "material/key-chain-variant", + "material/key-chain", + "material/key-change", + "material/key-link", + "material/key-minus", + "material/key-outline", + "material/key-plus", + "material/key-remove", + "material/key-star", + "material/key-variant", + "material/key-wireless", + "material/key", + "material/keyboard-backspace", + "material/keyboard-caps", + "material/keyboard-close-outline", + "material/keyboard-close", + "material/keyboard-esc", + "material/keyboard-f1", + "material/keyboard-f10", + "material/keyboard-f11", + "material/keyboard-f12", + "material/keyboard-f2", + "material/keyboard-f3", + "material/keyboard-f4", + "material/keyboard-f5", + "material/keyboard-f6", + "material/keyboard-f7", + "material/keyboard-f8", + "material/keyboard-f9", + "material/keyboard-off-outline", + "material/keyboard-off", + "material/keyboard-outline", + "material/keyboard-return", + "material/keyboard-settings-outline", + "material/keyboard-settings", + "material/keyboard-space", + "material/keyboard-tab-reverse", + "material/keyboard-tab", + "material/keyboard-variant", + "material/keyboard", + "material/khanda", + "material/kickstarter", + "material/kite-outline", + "material/kite", + "material/kitesurfing", + "material/klingon", + "material/knife-military", + "material/knife", + "material/knob", + "material/koala", + "material/kodi", + "material/kubernetes", + "material/label-multiple-outline", + "material/label-multiple", + "material/label-off-outline", + "material/label-off", + "material/label-outline", + "material/label-percent-outline", + "material/label-percent", + "material/label-variant-outline", + "material/label-variant", + "material/label", + "material/ladder", + "material/ladybug", + "material/lambda", + "material/lamp-outline", + "material/lamp", + "material/lamps-outline", + "material/lamps", + "material/lan-check", + "material/lan-connect", + "material/lan-disconnect", + "material/lan-pending", + "material/lan", + "material/land-fields", + "material/land-plots-circle-variant", + "material/land-plots-circle", + "material/land-plots-marker", + "material/land-plots", + "material/land-rows-horizontal", + "material/land-rows-vertical", + "material/landslide-outline", + "material/landslide", + "material/language-c", + "material/language-cpp", + "material/language-csharp", + "material/language-css3", + "material/language-fortran", + "material/language-go", + "material/language-haskell", + "material/language-html5", + "material/language-java", + "material/language-javascript", + "material/language-kotlin", + "material/language-lua", + "material/language-markdown-outline", + "material/language-markdown", + "material/language-php", + "material/language-python", + "material/language-r", + "material/language-ruby-on-rails", + "material/language-ruby", + "material/language-rust", + "material/language-swift", + "material/language-typescript", + "material/language-xaml", + "material/laptop-account", + "material/laptop-off", + "material/laptop", + "material/laravel", + "material/laser-pointer", + "material/lasso", + "material/lastpass", + "material/latitude", + "material/launch", + "material/lava-lamp", + "material/layers-edit", + "material/layers-minus", + "material/layers-off-outline", + "material/layers-off", + "material/layers-outline", + "material/layers-plus", + "material/layers-remove", + "material/layers-search-outline", + "material/layers-search", + "material/layers-triple-outline", + "material/layers-triple", + "material/layers", + "material/lead-pencil", + "material/leaf-circle-outline", + "material/leaf-circle", + "material/leaf-maple-off", + "material/leaf-maple", + "material/leaf-off", + "material/leaf", + "material/leak-off", + "material/leak", + "material/lectern", + "material/led-off", + "material/led-on", + "material/led-outline", + "material/led-strip-variant-off", + "material/led-strip-variant", + "material/led-strip", + "material/led-variant-off", + "material/led-variant-on", + "material/led-variant-outline", + "material/leek", + "material/less-than-or-equal", + "material/less-than", + "material/library-outline", + "material/library-shelves", + "material/library", + "material/license", + "material/lifebuoy", + "material/light-flood-down", + "material/light-flood-up", + "material/light-recessed", + "material/light-switch-off", + "material/light-switch", + "material/lightbulb-alert-outline", + "material/lightbulb-alert", + "material/lightbulb-auto-outline", + "material/lightbulb-auto", + "material/lightbulb-cfl-off", + "material/lightbulb-cfl-spiral-off", + "material/lightbulb-cfl-spiral", + "material/lightbulb-cfl", + "material/lightbulb-fluorescent-tube-outline", + "material/lightbulb-fluorescent-tube", + "material/lightbulb-group-off-outline", + "material/lightbulb-group-off", + "material/lightbulb-group-outline", + "material/lightbulb-group", + "material/lightbulb-multiple-off-outline", + "material/lightbulb-multiple-off", + "material/lightbulb-multiple-outline", + "material/lightbulb-multiple", + "material/lightbulb-night-outline", + "material/lightbulb-night", + "material/lightbulb-off-outline", + "material/lightbulb-off", + "material/lightbulb-on-10", + "material/lightbulb-on-20", + "material/lightbulb-on-30", + "material/lightbulb-on-40", + "material/lightbulb-on-50", + "material/lightbulb-on-60", + "material/lightbulb-on-70", + "material/lightbulb-on-80", + "material/lightbulb-on-90", + "material/lightbulb-on-outline", + "material/lightbulb-on", + "material/lightbulb-outline", + "material/lightbulb-question-outline", + "material/lightbulb-question", + "material/lightbulb-spot-off", + "material/lightbulb-spot", + "material/lightbulb-variant-outline", + "material/lightbulb-variant", + "material/lightbulb", + "material/lighthouse-on", + "material/lighthouse", + "material/lightning-bolt-circle", + "material/lightning-bolt-outline", + "material/lightning-bolt", + "material/line-scan", + "material/lingerie", + "material/link-box-outline", + "material/link-box-variant-outline", + "material/link-box-variant", + "material/link-box", + "material/link-circle-outline", + "material/link-circle", + "material/link-edit", + "material/link-lock", + "material/link-off", + "material/link-plus", + "material/link-variant-minus", + "material/link-variant-off", + "material/link-variant-plus", + "material/link-variant-remove", + "material/link-variant", + "material/link", + "material/linkedin", + "material/linux-mint", + "material/linux", + "material/lipstick", + "material/liquid-spot", + "material/liquor", + "material/list-box-outline", + "material/list-box", + "material/list-status", + "material/litecoin", + "material/loading", + "material/location-enter", + "material/location-exit", + "material/lock-alert-outline", + "material/lock-alert", + "material/lock-check-outline", + "material/lock-check", + "material/lock-clock", + "material/lock-minus-outline", + "material/lock-minus", + "material/lock-off-outline", + "material/lock-off", + "material/lock-open-alert-outline", + "material/lock-open-alert", + "material/lock-open-check-outline", + "material/lock-open-check", + "material/lock-open-minus-outline", + "material/lock-open-minus", + "material/lock-open-outline", + "material/lock-open-plus-outline", + "material/lock-open-plus", + "material/lock-open-remove-outline", + "material/lock-open-remove", + "material/lock-open-variant-outline", + "material/lock-open-variant", + "material/lock-open", + "material/lock-outline", + "material/lock-pattern", + "material/lock-percent-open-outline", + "material/lock-percent-open-variant-outline", + "material/lock-percent-open-variant", + "material/lock-percent-open", + "material/lock-percent-outline", + "material/lock-percent", + "material/lock-plus-outline", + "material/lock-plus", + "material/lock-question", + "material/lock-remove-outline", + "material/lock-remove", + "material/lock-reset", + "material/lock-smart", + "material/lock", + "material/locker-multiple", + "material/locker", + "material/login-variant", + "material/login", + "material/logout-variant", + "material/logout", + "material/longitude", + "material/looks", + "material/lotion-outline", + "material/lotion-plus-outline", + "material/lotion-plus", + "material/lotion", + "material/loupe", + "material/lumx", + "material/lungs", + "material/mace", + "material/magazine-pistol", + "material/magazine-rifle", + "material/magic-staff", + "material/magnet-on", + "material/magnet", + "material/magnify-close", + "material/magnify-expand", + "material/magnify-minus-cursor", + "material/magnify-minus-outline", + "material/magnify-minus", + "material/magnify-plus-cursor", + "material/magnify-plus-outline", + "material/magnify-plus", + "material/magnify-remove-cursor", + "material/magnify-remove-outline", + "material/magnify-scan", + "material/magnify", + "material/mail", + "material/mailbox-open-outline", + "material/mailbox-open-up-outline", + "material/mailbox-open-up", + "material/mailbox-open", + "material/mailbox-outline", + "material/mailbox-up-outline", + "material/mailbox-up", + "material/mailbox", + "material/manjaro", + "material/map-check-outline", + "material/map-check", + "material/map-clock-outline", + "material/map-clock", + "material/map-legend", + "material/map-marker-account-outline", + "material/map-marker-account", + "material/map-marker-alert-outline", + "material/map-marker-alert", + "material/map-marker-check-outline", + "material/map-marker-check", + "material/map-marker-circle", + "material/map-marker-distance", + "material/map-marker-down", + "material/map-marker-left-outline", + "material/map-marker-left", + "material/map-marker-minus-outline", + "material/map-marker-minus", + "material/map-marker-multiple-outline", + "material/map-marker-multiple", + "material/map-marker-off-outline", + "material/map-marker-off", + "material/map-marker-outline", + "material/map-marker-path", + "material/map-marker-plus-outline", + "material/map-marker-plus", + "material/map-marker-question-outline", + "material/map-marker-question", + "material/map-marker-radius-outline", + "material/map-marker-radius", + "material/map-marker-remove-outline", + "material/map-marker-remove-variant", + "material/map-marker-remove", + "material/map-marker-right-outline", + "material/map-marker-right", + "material/map-marker-star-outline", + "material/map-marker-star", + "material/map-marker-up", + "material/map-marker", + "material/map-minus", + "material/map-outline", + "material/map-plus", + "material/map-search-outline", + "material/map-search", + "material/map", + "material/mapbox", + "material/margin", + "material/marker-cancel", + "material/marker-check", + "material/marker", + "material/mastodon", + "material/material-design", + "material/material-ui", + "material/math-compass", + "material/math-cos", + "material/math-integral-box", + "material/math-integral", + "material/math-log", + "material/math-norm-box", + "material/math-norm", + "material/math-sin", + "material/math-tan", + "material/matrix", + "material/medal-outline", + "material/medal", + "material/medical-bag", + "material/medical-cotton-swab", + "material/medication-outline", + "material/medication", + "material/meditation", + "material/memory-arrow-down", + "material/memory", + "material/menorah-fire", + "material/menorah", + "material/menu-close", + "material/menu-down-outline", + "material/menu-down", + "material/menu-left-outline", + "material/menu-left", + "material/menu-open", + "material/menu-right-outline", + "material/menu-right", + "material/menu-swap-outline", + "material/menu-swap", + "material/menu-up-outline", + "material/menu-up", + "material/menu", + "material/merge", + "material/message-alert-outline", + "material/message-alert", + "material/message-arrow-left-outline", + "material/message-arrow-left", + "material/message-arrow-right-outline", + "material/message-arrow-right", + "material/message-badge-outline", + "material/message-badge", + "material/message-bookmark-outline", + "material/message-bookmark", + "material/message-bulleted-off", + "material/message-bulleted", + "material/message-check-outline", + "material/message-check", + "material/message-cog-outline", + "material/message-cog", + "material/message-draw", + "material/message-fast-outline", + "material/message-fast", + "material/message-flash-outline", + "material/message-flash", + "material/message-image-outline", + "material/message-image", + "material/message-lock-outline", + "material/message-lock", + "material/message-minus-outline", + "material/message-minus", + "material/message-off-outline", + "material/message-off", + "material/message-outline", + "material/message-plus-outline", + "material/message-plus", + "material/message-processing-outline", + "material/message-processing", + "material/message-question-outline", + "material/message-question", + "material/message-reply-outline", + "material/message-reply-text-outline", + "material/message-reply-text", + "material/message-reply", + "material/message-settings-outline", + "material/message-settings", + "material/message-star-outline", + "material/message-star", + "material/message-text-clock-outline", + "material/message-text-clock", + "material/message-text-fast-outline", + "material/message-text-fast", + "material/message-text-lock-outline", + "material/message-text-lock", + "material/message-text-outline", + "material/message-text", + "material/message-video", + "material/message", + "material/meteor", + "material/meter-electric-outline", + "material/meter-electric", + "material/meter-gas-outline", + "material/meter-gas", + "material/metronome-tick", + "material/metronome", + "material/micro-sd", + "material/microphone-message-off", + "material/microphone-message", + "material/microphone-minus", + "material/microphone-off", + "material/microphone-outline", + "material/microphone-plus", + "material/microphone-question-outline", + "material/microphone-question", + "material/microphone-settings", + "material/microphone-variant-off", + "material/microphone-variant", + "material/microphone", + "material/microscope", + "material/microsoft-access", + "material/microsoft-azure-devops", + "material/microsoft-azure", + "material/microsoft-bing", + "material/microsoft-dynamics-365", + "material/microsoft-edge", + "material/microsoft-excel", + "material/microsoft-internet-explorer", + "material/microsoft-office", + "material/microsoft-onedrive", + "material/microsoft-onenote", + "material/microsoft-outlook", + "material/microsoft-powerpoint", + "material/microsoft-sharepoint", + "material/microsoft-teams", + "material/microsoft-visual-studio-code", + "material/microsoft-visual-studio", + "material/microsoft-windows-classic", + "material/microsoft-windows", + "material/microsoft-word", + "material/microsoft-xbox-controller-battery-alert", + "material/microsoft-xbox-controller-battery-charging", + "material/microsoft-xbox-controller-battery-empty", + "material/microsoft-xbox-controller-battery-full", + "material/microsoft-xbox-controller-battery-low", + "material/microsoft-xbox-controller-battery-medium", + "material/microsoft-xbox-controller-battery-unknown", + "material/microsoft-xbox-controller-menu", + "material/microsoft-xbox-controller-off", + "material/microsoft-xbox-controller-view", + "material/microsoft-xbox-controller", + "material/microsoft-xbox", + "material/microsoft", + "material/microwave-off", + "material/microwave", + "material/middleware-outline", + "material/middleware", + "material/midi-port", + "material/midi", + "material/mine", + "material/minecraft", + "material/mini-sd", + "material/minidisc", + "material/minus-box-multiple-outline", + "material/minus-box-multiple", + "material/minus-box-outline", + "material/minus-box", + "material/minus-circle-multiple-outline", + "material/minus-circle-multiple", + "material/minus-circle-off-outline", + "material/minus-circle-off", + "material/minus-circle-outline", + "material/minus-circle", + "material/minus-network-outline", + "material/minus-network", + "material/minus-thick", + "material/minus", + "material/mirror-rectangle", + "material/mirror-variant", + "material/mirror", + "material/mixed-martial-arts", + "material/mixed-reality", + "material/molecule-co", + "material/molecule-co2", + "material/molecule", + "material/monitor-account", + "material/monitor-arrow-down-variant", + "material/monitor-arrow-down", + "material/monitor-cellphone-star", + "material/monitor-cellphone", + "material/monitor-dashboard", + "material/monitor-edit", + "material/monitor-eye", + "material/monitor-lock", + "material/monitor-multiple", + "material/monitor-off", + "material/monitor-screenshot", + "material/monitor-share", + "material/monitor-shimmer", + "material/monitor-small", + "material/monitor-speaker-off", + "material/monitor-speaker", + "material/monitor-star", + "material/monitor-vertical", + "material/monitor", + "material/moon-first-quarter", + "material/moon-full", + "material/moon-last-quarter", + "material/moon-new", + "material/moon-waning-crescent", + "material/moon-waning-gibbous", + "material/moon-waxing-crescent", + "material/moon-waxing-gibbous", + "material/moped-electric-outline", + "material/moped-electric", + "material/moped-outline", + "material/moped", + "material/more", + "material/mortar-pestle-plus", + "material/mortar-pestle", + "material/mosque-outline", + "material/mosque", + "material/mother-heart", + "material/mother-nurse", + "material/motion-outline", + "material/motion-pause-outline", + "material/motion-pause", + "material/motion-play-outline", + "material/motion-play", + "material/motion-sensor-off", + "material/motion-sensor", + "material/motion", + "material/motorbike-electric", + "material/motorbike-off", + "material/motorbike", + "material/mouse-bluetooth", + "material/mouse-left-click-outline", + "material/mouse-left-click", + "material/mouse-move-down", + "material/mouse-move-up", + "material/mouse-move-vertical", + "material/mouse-off", + "material/mouse-outline", + "material/mouse-right-click-outline", + "material/mouse-right-click", + "material/mouse-scroll-wheel", + "material/mouse-variant-off", + "material/mouse-variant", + "material/mouse", + "material/move-resize-variant", + "material/move-resize", + "material/movie-check-outline", + "material/movie-check", + "material/movie-cog-outline", + "material/movie-cog", + "material/movie-edit-outline", + "material/movie-edit", + "material/movie-filter-outline", + "material/movie-filter", + "material/movie-minus-outline", + "material/movie-minus", + "material/movie-off-outline", + "material/movie-off", + "material/movie-open-check-outline", + "material/movie-open-check", + "material/movie-open-cog-outline", + "material/movie-open-cog", + "material/movie-open-edit-outline", + "material/movie-open-edit", + "material/movie-open-minus-outline", + "material/movie-open-minus", + "material/movie-open-off-outline", + "material/movie-open-off", + "material/movie-open-outline", + "material/movie-open-play-outline", + "material/movie-open-play", + "material/movie-open-plus-outline", + "material/movie-open-plus", + "material/movie-open-remove-outline", + "material/movie-open-remove", + "material/movie-open-settings-outline", + "material/movie-open-settings", + "material/movie-open-star-outline", + "material/movie-open-star", + "material/movie-open", + "material/movie-outline", + "material/movie-play-outline", + "material/movie-play", + "material/movie-plus-outline", + "material/movie-plus", + "material/movie-remove-outline", + "material/movie-remove", + "material/movie-roll", + "material/movie-search-outline", + "material/movie-search", + "material/movie-settings-outline", + "material/movie-settings", + "material/movie-star-outline", + "material/movie-star", + "material/movie", + "material/mower-bag-on", + "material/mower-bag", + "material/mower-on", + "material/mower", + "material/muffin", + "material/multicast", + "material/multimedia", + "material/multiplication-box", + "material/multiplication", + "material/mushroom-off-outline", + "material/mushroom-off", + "material/mushroom-outline", + "material/mushroom", + "material/music-accidental-double-flat", + "material/music-accidental-double-sharp", + "material/music-accidental-flat", + "material/music-accidental-natural", + "material/music-accidental-sharp", + "material/music-box-multiple-outline", + "material/music-box-multiple", + "material/music-box-outline", + "material/music-box", + "material/music-circle-outline", + "material/music-circle", + "material/music-clef-alto", + "material/music-clef-bass", + "material/music-clef-treble", + "material/music-note-bluetooth-off", + "material/music-note-bluetooth", + "material/music-note-eighth-dotted", + "material/music-note-eighth", + "material/music-note-half-dotted", + "material/music-note-half", + "material/music-note-minus", + "material/music-note-off-outline", + "material/music-note-off", + "material/music-note-outline", + "material/music-note-plus", + "material/music-note-quarter-dotted", + "material/music-note-quarter", + "material/music-note-sixteenth-dotted", + "material/music-note-sixteenth", + "material/music-note-whole-dotted", + "material/music-note-whole", + "material/music-note", + "material/music-off", + "material/music-rest-eighth", + "material/music-rest-half", + "material/music-rest-quarter", + "material/music-rest-sixteenth", + "material/music-rest-whole", + "material/music", + "material/mustache", + "material/nail", + "material/nas", + "material/nativescript", + "material/nature-outline", + "material/nature-people-outline", + "material/nature-people", + "material/nature", + "material/navigation-outline", + "material/navigation-variant-outline", + "material/navigation-variant", + "material/navigation", + "material/near-me", + "material/necklace", + "material/needle-off", + "material/needle", + "material/netflix", + "material/network-off-outline", + "material/network-off", + "material/network-outline", + "material/network-pos", + "material/network-strength-1-alert", + "material/network-strength-1", + "material/network-strength-2-alert", + "material/network-strength-2", + "material/network-strength-3-alert", + "material/network-strength-3", + "material/network-strength-4-alert", + "material/network-strength-4-cog", + "material/network-strength-4", + "material/network-strength-off-outline", + "material/network-strength-off", + "material/network-strength-outline", + "material/network", + "material/new-box", + "material/newspaper-check", + "material/newspaper-minus", + "material/newspaper-plus", + "material/newspaper-remove", + "material/newspaper-variant-multiple-outline", + "material/newspaper-variant-multiple", + "material/newspaper-variant-outline", + "material/newspaper-variant", + "material/newspaper", + "material/nfc-search-variant", + "material/nfc-tap", + "material/nfc-variant-off", + "material/nfc-variant", + "material/nfc", + "material/ninja", + "material/nintendo-game-boy", + "material/nintendo-switch", + "material/nintendo-wii", + "material/nintendo-wiiu", + "material/nix", + "material/nodejs", + "material/noodles", + "material/not-equal-variant", + "material/not-equal", + "material/note-alert-outline", + "material/note-alert", + "material/note-check-outline", + "material/note-check", + "material/note-edit-outline", + "material/note-edit", + "material/note-minus-outline", + "material/note-minus", + "material/note-multiple-outline", + "material/note-multiple", + "material/note-off-outline", + "material/note-off", + "material/note-outline", + "material/note-plus-outline", + "material/note-plus", + "material/note-remove-outline", + "material/note-remove", + "material/note-search-outline", + "material/note-search", + "material/note-text-outline", + "material/note-text", + "material/note", + "material/notebook-check-outline", + "material/notebook-check", + "material/notebook-edit-outline", + "material/notebook-edit", + "material/notebook-heart-outline", + "material/notebook-heart", + "material/notebook-minus-outline", + "material/notebook-minus", + "material/notebook-multiple", + "material/notebook-outline", + "material/notebook-plus-outline", + "material/notebook-plus", + "material/notebook-remove-outline", + "material/notebook-remove", + "material/notebook", + "material/notification-clear-all", + "material/npm", + "material/nuke", + "material/null", + "material/numeric-0-box-multiple-outline", + "material/numeric-0-box-multiple", + "material/numeric-0-box-outline", + "material/numeric-0-box", + "material/numeric-0-circle-outline", + "material/numeric-0-circle", + "material/numeric-0", + "material/numeric-1-box-multiple-outline", + "material/numeric-1-box-multiple", + "material/numeric-1-box-outline", + "material/numeric-1-box", + "material/numeric-1-circle-outline", + "material/numeric-1-circle", + "material/numeric-1", + "material/numeric-10-box-multiple-outline", + "material/numeric-10-box-multiple", + "material/numeric-10-box-outline", + "material/numeric-10-box", + "material/numeric-10-circle-outline", + "material/numeric-10-circle", + "material/numeric-10", + "material/numeric-2-box-multiple-outline", + "material/numeric-2-box-multiple", + "material/numeric-2-box-outline", + "material/numeric-2-box", + "material/numeric-2-circle-outline", + "material/numeric-2-circle", + "material/numeric-2", + "material/numeric-3-box-multiple-outline", + "material/numeric-3-box-multiple", + "material/numeric-3-box-outline", + "material/numeric-3-box", + "material/numeric-3-circle-outline", + "material/numeric-3-circle", + "material/numeric-3", + "material/numeric-4-box-multiple-outline", + "material/numeric-4-box-multiple", + "material/numeric-4-box-outline", + "material/numeric-4-box", + "material/numeric-4-circle-outline", + "material/numeric-4-circle", + "material/numeric-4", + "material/numeric-5-box-multiple-outline", + "material/numeric-5-box-multiple", + "material/numeric-5-box-outline", + "material/numeric-5-box", + "material/numeric-5-circle-outline", + "material/numeric-5-circle", + "material/numeric-5", + "material/numeric-6-box-multiple-outline", + "material/numeric-6-box-multiple", + "material/numeric-6-box-outline", + "material/numeric-6-box", + "material/numeric-6-circle-outline", + "material/numeric-6-circle", + "material/numeric-6", + "material/numeric-7-box-multiple-outline", + "material/numeric-7-box-multiple", + "material/numeric-7-box-outline", + "material/numeric-7-box", + "material/numeric-7-circle-outline", + "material/numeric-7-circle", + "material/numeric-7", + "material/numeric-8-box-multiple-outline", + "material/numeric-8-box-multiple", + "material/numeric-8-box-outline", + "material/numeric-8-box", + "material/numeric-8-circle-outline", + "material/numeric-8-circle", + "material/numeric-8", + "material/numeric-9-box-multiple-outline", + "material/numeric-9-box-multiple", + "material/numeric-9-box-outline", + "material/numeric-9-box", + "material/numeric-9-circle-outline", + "material/numeric-9-circle", + "material/numeric-9-plus-box-multiple-outline", + "material/numeric-9-plus-box-multiple", + "material/numeric-9-plus-box-outline", + "material/numeric-9-plus-box", + "material/numeric-9-plus-circle-outline", + "material/numeric-9-plus-circle", + "material/numeric-9-plus", + "material/numeric-9", + "material/numeric-negative-1", + "material/numeric-off", + "material/numeric-positive-1", + "material/numeric", + "material/nut", + "material/nutrition", + "material/nuxt", + "material/oar", + "material/ocarina", + "material/oci", + "material/ocr", + "material/octagon-outline", + "material/octagon", + "material/octagram-edit-outline", + "material/octagram-edit", + "material/octagram-minus-outline", + "material/octagram-minus", + "material/octagram-outline", + "material/octagram-plus-outline", + "material/octagram-plus", + "material/octagram", + "material/octahedron-off", + "material/octahedron", + "material/odnoklassniki", + "material/offer", + "material/office-building-cog-outline", + "material/office-building-cog", + "material/office-building-marker-outline", + "material/office-building-marker", + "material/office-building-minus-outline", + "material/office-building-minus", + "material/office-building-outline", + "material/office-building-plus-outline", + "material/office-building-plus", + "material/office-building-remove-outline", + "material/office-building-remove", + "material/office-building", + "material/oil-lamp", + "material/oil-level", + "material/oil-temperature", + "material/oil", + "material/om", + "material/omega", + "material/one-up", + "material/onepassword", + "material/opacity", + "material/open-in-app", + "material/open-in-new", + "material/open-source-initiative", + "material/openid", + "material/opera", + "material/orbit-variant", + "material/orbit", + "material/order-alphabetical-ascending", + "material/order-alphabetical-descending", + "material/order-bool-ascending-variant", + "material/order-bool-ascending", + "material/order-bool-descending-variant", + "material/order-bool-descending", + "material/order-numeric-ascending", + "material/order-numeric-descending", + "material/origin", + "material/ornament-variant", + "material/ornament", + "material/outdoor-lamp", + "material/overscan", + "material/owl", + "material/pac-man", + "material/package-check", + "material/package-down", + "material/package-up", + "material/package-variant-closed-check", + "material/package-variant-closed-minus", + "material/package-variant-closed-plus", + "material/package-variant-closed-remove", + "material/package-variant-closed", + "material/package-variant-minus", + "material/package-variant-plus", + "material/package-variant-remove", + "material/package-variant", + "material/package", + "material/page-first", + "material/page-last", + "material/page-layout-body", + "material/page-layout-footer", + "material/page-layout-header-footer", + "material/page-layout-header", + "material/page-layout-sidebar-left", + "material/page-layout-sidebar-right", + "material/page-next-outline", + "material/page-next", + "material/page-previous-outline", + "material/page-previous", + "material/pail-minus-outline", + "material/pail-minus", + "material/pail-off-outline", + "material/pail-off", + "material/pail-outline", + "material/pail-plus-outline", + "material/pail-plus", + "material/pail-remove-outline", + "material/pail-remove", + "material/pail", + "material/palette-advanced", + "material/palette-outline", + "material/palette-swatch-outline", + "material/palette-swatch-variant", + "material/palette-swatch", + "material/palette", + "material/palm-tree", + "material/pan-bottom-left", + "material/pan-bottom-right", + "material/pan-down", + "material/pan-horizontal", + "material/pan-left", + "material/pan-right", + "material/pan-top-left", + "material/pan-top-right", + "material/pan-up", + "material/pan-vertical", + "material/pan", + "material/panda", + "material/pandora", + "material/panorama-fisheye", + "material/panorama-horizontal-outline", + "material/panorama-horizontal", + "material/panorama-outline", + "material/panorama-sphere-outline", + "material/panorama-sphere", + "material/panorama-variant-outline", + "material/panorama-variant", + "material/panorama-vertical-outline", + "material/panorama-vertical", + "material/panorama-wide-angle-outline", + "material/panorama-wide-angle", + "material/panorama", + "material/paper-cut-vertical", + "material/paper-roll-outline", + "material/paper-roll", + "material/paperclip-check", + "material/paperclip-lock", + "material/paperclip-minus", + "material/paperclip-off", + "material/paperclip-plus", + "material/paperclip-remove", + "material/paperclip", + "material/parachute-outline", + "material/parachute", + "material/paragliding", + "material/parking", + "material/party-popper", + "material/passport-alert", + "material/passport-biometric", + "material/passport-cancel", + "material/passport-check", + "material/passport-minus", + "material/passport-plus", + "material/passport-remove", + "material/passport", + "material/pasta", + "material/patio-heater", + "material/patreon", + "material/pause-box-outline", + "material/pause-box", + "material/pause-circle-outline", + "material/pause-circle", + "material/pause-octagon-outline", + "material/pause-octagon", + "material/pause", + "material/paw-off-outline", + "material/paw-off", + "material/paw-outline", + "material/paw", + "material/peace", + "material/peanut-off-outline", + "material/peanut-off", + "material/peanut-outline", + "material/peanut", + "material/pen-lock", + "material/pen-minus", + "material/pen-off", + "material/pen-plus", + "material/pen-remove", + "material/pen", + "material/pencil-box-multiple-outline", + "material/pencil-box-multiple", + "material/pencil-box-outline", + "material/pencil-box", + "material/pencil-circle-outline", + "material/pencil-circle", + "material/pencil-lock-outline", + "material/pencil-lock", + "material/pencil-minus-outline", + "material/pencil-minus", + "material/pencil-off-outline", + "material/pencil-off", + "material/pencil-outline", + "material/pencil-plus-outline", + "material/pencil-plus", + "material/pencil-remove-outline", + "material/pencil-remove", + "material/pencil-ruler-outline", + "material/pencil-ruler", + "material/pencil", + "material/penguin", + "material/pentagon-outline", + "material/pentagon", + "material/pentagram", + "material/percent-box-outline", + "material/percent-box", + "material/percent-circle-outline", + "material/percent-circle", + "material/percent-outline", + "material/percent", + "material/periodic-table", + "material/perspective-less", + "material/perspective-more", + "material/ph", + "material/phone-alert-outline", + "material/phone-alert", + "material/phone-bluetooth-outline", + "material/phone-bluetooth", + "material/phone-cancel-outline", + "material/phone-cancel", + "material/phone-check-outline", + "material/phone-check", + "material/phone-classic-off", + "material/phone-classic", + "material/phone-clock", + "material/phone-dial-outline", + "material/phone-dial", + "material/phone-forward-outline", + "material/phone-forward", + "material/phone-hangup-outline", + "material/phone-hangup", + "material/phone-in-talk-outline", + "material/phone-in-talk", + "material/phone-incoming-outgoing-outline", + "material/phone-incoming-outgoing", + "material/phone-incoming-outline", + "material/phone-incoming", + "material/phone-lock-outline", + "material/phone-lock", + "material/phone-log-outline", + "material/phone-log", + "material/phone-message-outline", + "material/phone-message", + "material/phone-minus-outline", + "material/phone-minus", + "material/phone-missed-outline", + "material/phone-missed", + "material/phone-off-outline", + "material/phone-off", + "material/phone-outgoing-outline", + "material/phone-outgoing", + "material/phone-outline", + "material/phone-paused-outline", + "material/phone-paused", + "material/phone-plus-outline", + "material/phone-plus", + "material/phone-refresh-outline", + "material/phone-refresh", + "material/phone-remove-outline", + "material/phone-remove", + "material/phone-return-outline", + "material/phone-return", + "material/phone-ring-outline", + "material/phone-ring", + "material/phone-rotate-landscape", + "material/phone-rotate-portrait", + "material/phone-settings-outline", + "material/phone-settings", + "material/phone-sync-outline", + "material/phone-sync", + "material/phone-voip", + "material/phone", + "material/pi-box", + "material/pi-hole", + "material/pi", + "material/piano-off", + "material/piano", + "material/pickaxe", + "material/picture-in-picture-bottom-right-outline", + "material/picture-in-picture-bottom-right", + "material/picture-in-picture-top-right-outline", + "material/picture-in-picture-top-right", + "material/pier-crane", + "material/pier", + "material/pig-variant-outline", + "material/pig-variant", + "material/pig", + "material/piggy-bank-outline", + "material/piggy-bank", + "material/pill-multiple", + "material/pill-off", + "material/pill", + "material/pillar", + "material/pin-off-outline", + "material/pin-off", + "material/pin-outline", + "material/pin", + "material/pine-tree-box", + "material/pine-tree-fire", + "material/pine-tree-variant-outline", + "material/pine-tree-variant", + "material/pine-tree", + "material/pinterest", + "material/pinwheel-outline", + "material/pinwheel", + "material/pipe-disconnected", + "material/pipe-leak", + "material/pipe-valve", + "material/pipe-wrench", + "material/pipe", + "material/pirate", + "material/pistol", + "material/piston", + "material/pitchfork", + "material/pizza", + "material/plane-car", + "material/plane-train", + "material/play-box-edit-outline", + "material/play-box-lock-open-outline", + "material/play-box-lock-open", + "material/play-box-lock-outline", + "material/play-box-lock", + "material/play-box-multiple-outline", + "material/play-box-multiple", + "material/play-box-outline", + "material/play-box", + "material/play-circle-outline", + "material/play-circle", + "material/play-network-outline", + "material/play-network", + "material/play-outline", + "material/play-pause", + "material/play-protected-content", + "material/play-speed", + "material/play", + "material/playlist-check", + "material/playlist-edit", + "material/playlist-minus", + "material/playlist-music-outline", + "material/playlist-music", + "material/playlist-play", + "material/playlist-plus", + "material/playlist-remove", + "material/playlist-star", + "material/plex", + "material/pliers", + "material/plus-box-multiple-outline", + "material/plus-box-multiple", + "material/plus-box-outline", + "material/plus-box", + "material/plus-circle-multiple-outline", + "material/plus-circle-multiple", + "material/plus-circle-outline", + "material/plus-circle", + "material/plus-lock-open", + "material/plus-lock", + "material/plus-minus-box", + "material/plus-minus-variant", + "material/plus-minus", + "material/plus-network-outline", + "material/plus-network", + "material/plus-outline", + "material/plus-thick", + "material/plus", + "material/pocket", + "material/podcast", + "material/podium-bronze", + "material/podium-gold", + "material/podium-silver", + "material/podium", + "material/point-of-sale", + "material/pokeball", + "material/pokemon-go", + "material/poker-chip", + "material/polaroid", + "material/police-badge-outline", + "material/police-badge", + "material/police-station", + "material/poll", + "material/polo", + "material/polymer", + "material/pool-thermometer", + "material/pool", + "material/popcorn", + "material/post-lamp", + "material/post-outline", + "material/post", + "material/postage-stamp", + "material/pot-mix-outline", + "material/pot-mix", + "material/pot-outline", + "material/pot-steam-outline", + "material/pot-steam", + "material/pot", + "material/pound-box-outline", + "material/pound-box", + "material/pound", + "material/power-cycle", + "material/power-off", + "material/power-on", + "material/power-plug-battery-outline", + "material/power-plug-battery", + "material/power-plug-off-outline", + "material/power-plug-off", + "material/power-plug-outline", + "material/power-plug", + "material/power-settings", + "material/power-sleep", + "material/power-socket-au", + "material/power-socket-ch", + "material/power-socket-de", + "material/power-socket-eu", + "material/power-socket-fr", + "material/power-socket-it", + "material/power-socket-jp", + "material/power-socket-uk", + "material/power-socket-us", + "material/power-socket", + "material/power-standby", + "material/power", + "material/powershell", + "material/prescription", + "material/presentation-play", + "material/presentation", + "material/pretzel", + "material/printer-3d-nozzle-alert-outline", + "material/printer-3d-nozzle-alert", + "material/printer-3d-nozzle-heat-outline", + "material/printer-3d-nozzle-heat", + "material/printer-3d-nozzle-off-outline", + "material/printer-3d-nozzle-off", + "material/printer-3d-nozzle-outline", + "material/printer-3d-nozzle", + "material/printer-3d-off", + "material/printer-3d", + "material/printer-alert", + "material/printer-check", + "material/printer-eye", + "material/printer-off-outline", + "material/printer-off", + "material/printer-outline", + "material/printer-pos-alert-outline", + "material/printer-pos-alert", + "material/printer-pos-cancel-outline", + "material/printer-pos-cancel", + "material/printer-pos-check-outline", + "material/printer-pos-check", + "material/printer-pos-cog-outline", + "material/printer-pos-cog", + "material/printer-pos-edit-outline", + "material/printer-pos-edit", + "material/printer-pos-minus-outline", + "material/printer-pos-minus", + "material/printer-pos-network-outline", + "material/printer-pos-network", + "material/printer-pos-off-outline", + "material/printer-pos-off", + "material/printer-pos-outline", + "material/printer-pos-pause-outline", + "material/printer-pos-pause", + "material/printer-pos-play-outline", + "material/printer-pos-play", + "material/printer-pos-plus-outline", + "material/printer-pos-plus", + "material/printer-pos-refresh-outline", + "material/printer-pos-refresh", + "material/printer-pos-remove-outline", + "material/printer-pos-remove", + "material/printer-pos-star-outline", + "material/printer-pos-star", + "material/printer-pos-stop-outline", + "material/printer-pos-stop", + "material/printer-pos-sync-outline", + "material/printer-pos-sync", + "material/printer-pos-wrench-outline", + "material/printer-pos-wrench", + "material/printer-pos", + "material/printer-search", + "material/printer-settings", + "material/printer-wireless", + "material/printer", + "material/priority-high", + "material/priority-low", + "material/professional-hexagon", + "material/progress-alert", + "material/progress-check", + "material/progress-clock", + "material/progress-close", + "material/progress-download", + "material/progress-helper", + "material/progress-pencil", + "material/progress-question", + "material/progress-star-four-points", + "material/progress-star", + "material/progress-tag", + "material/progress-upload", + "material/progress-wrench", + "material/projector-off", + "material/projector-screen-off-outline", + "material/projector-screen-off", + "material/projector-screen-outline", + "material/projector-screen-variant-off-outline", + "material/projector-screen-variant-off", + "material/projector-screen-variant-outline", + "material/projector-screen-variant", + "material/projector-screen", + "material/projector", + "material/propane-tank-outline", + "material/propane-tank", + "material/protocol", + "material/publish-off", + "material/publish", + "material/pulse", + "material/pump-off", + "material/pump", + "material/pumpkin", + "material/purse-outline", + "material/purse", + "material/puzzle-check-outline", + "material/puzzle-check", + "material/puzzle-edit-outline", + "material/puzzle-edit", + "material/puzzle-heart-outline", + "material/puzzle-heart", + "material/puzzle-minus-outline", + "material/puzzle-minus", + "material/puzzle-outline", + "material/puzzle-plus-outline", + "material/puzzle-plus", + "material/puzzle-remove-outline", + "material/puzzle-remove", + "material/puzzle-star-outline", + "material/puzzle-star", + "material/puzzle", + "material/pyramid-off", + "material/pyramid", + "material/qi", + "material/qqchat", + "material/qrcode-edit", + "material/qrcode-minus", + "material/qrcode-plus", + "material/qrcode-remove", + "material/qrcode-scan", + "material/qrcode", + "material/quadcopter", + "material/quality-high", + "material/quality-low", + "material/quality-medium", + "material/queue-first-in-last-out", + "material/quora", + "material/rabbit-variant-outline", + "material/rabbit-variant", + "material/rabbit", + "material/racing-helmet", + "material/racquetball", + "material/radar", + "material/radiator-disabled", + "material/radiator-off", + "material/radiator", + "material/radio-am", + "material/radio-fm", + "material/radio-handheld", + "material/radio-off", + "material/radio-tower", + "material/radio", + "material/radioactive-circle-outline", + "material/radioactive-circle", + "material/radioactive-off", + "material/radioactive", + "material/radiobox-blank", + "material/radiobox-indeterminate-variant", + "material/radiobox-marked", + "material/radiology-box-outline", + "material/radiology-box", + "material/radius-outline", + "material/radius", + "material/railroad-light", + "material/rake", + "material/raspberry-pi", + "material/raw-off", + "material/raw", + "material/ray-end-arrow", + "material/ray-end", + "material/ray-start-arrow", + "material/ray-start-end", + "material/ray-start-vertex-end", + "material/ray-start", + "material/ray-vertex", + "material/razor-double-edge", + "material/razor-single-edge", + "material/react", + "material/read", + "material/receipt-clock-outline", + "material/receipt-clock", + "material/receipt-outline", + "material/receipt-send-outline", + "material/receipt-send", + "material/receipt-text-arrow-left-outline", + "material/receipt-text-arrow-left", + "material/receipt-text-arrow-right-outline", + "material/receipt-text-arrow-right", + "material/receipt-text-check-outline", + "material/receipt-text-check", + "material/receipt-text-clock-outline", + "material/receipt-text-clock", + "material/receipt-text-edit-outline", + "material/receipt-text-edit", + "material/receipt-text-minus-outline", + "material/receipt-text-minus", + "material/receipt-text-outline", + "material/receipt-text-plus-outline", + "material/receipt-text-plus", + "material/receipt-text-remove-outline", + "material/receipt-text-remove", + "material/receipt-text-send-outline", + "material/receipt-text-send", + "material/receipt-text", + "material/receipt", + "material/record-circle-outline", + "material/record-circle", + "material/record-player", + "material/record-rec", + "material/record", + "material/rectangle-outline", + "material/rectangle", + "material/recycle-variant", + "material/recycle", + "material/reddit", + "material/redhat", + "material/redo-variant", + "material/redo", + "material/reflect-horizontal", + "material/reflect-vertical", + "material/refresh-auto", + "material/refresh-circle", + "material/refresh", + "material/regex", + "material/registered-trademark", + "material/reiterate", + "material/relation-many-to-many", + "material/relation-many-to-one-or-many", + "material/relation-many-to-one", + "material/relation-many-to-only-one", + "material/relation-many-to-zero-or-many", + "material/relation-many-to-zero-or-one", + "material/relation-one-or-many-to-many", + "material/relation-one-or-many-to-one-or-many", + "material/relation-one-or-many-to-one", + "material/relation-one-or-many-to-only-one", + "material/relation-one-or-many-to-zero-or-many", + "material/relation-one-or-many-to-zero-or-one", + "material/relation-one-to-many", + "material/relation-one-to-one-or-many", + "material/relation-one-to-one", + "material/relation-one-to-only-one", + "material/relation-one-to-zero-or-many", + "material/relation-one-to-zero-or-one", + "material/relation-only-one-to-many", + "material/relation-only-one-to-one-or-many", + "material/relation-only-one-to-one", + "material/relation-only-one-to-only-one", + "material/relation-only-one-to-zero-or-many", + "material/relation-only-one-to-zero-or-one", + "material/relation-zero-or-many-to-many", + "material/relation-zero-or-many-to-one-or-many", + "material/relation-zero-or-many-to-one", + "material/relation-zero-or-many-to-only-one", + "material/relation-zero-or-many-to-zero-or-many", + "material/relation-zero-or-many-to-zero-or-one", + "material/relation-zero-or-one-to-many", + "material/relation-zero-or-one-to-one-or-many", + "material/relation-zero-or-one-to-one", + "material/relation-zero-or-one-to-only-one", + "material/relation-zero-or-one-to-zero-or-many", + "material/relation-zero-or-one-to-zero-or-one", + "material/relative-scale", + "material/reload-alert", + "material/reload", + "material/reminder", + "material/remote-desktop", + "material/remote-off", + "material/remote-tv-off", + "material/remote-tv", + "material/remote", + "material/rename-box-outline", + "material/rename-box", + "material/rename-outline", + "material/rename", + "material/reorder-horizontal", + "material/reorder-vertical", + "material/repeat-off", + "material/repeat-once", + "material/repeat-variant", + "material/repeat", + "material/replay", + "material/reply-all-outline", + "material/reply-all", + "material/reply-circle", + "material/reply-outline", + "material/reply", + "material/reproduction", + "material/resistor-nodes", + "material/resistor", + "material/resize-bottom-right", + "material/resize", + "material/responsive", + "material/restart-alert", + "material/restart-off", + "material/restart", + "material/restore-alert", + "material/restore", + "material/rewind-10", + "material/rewind-15", + "material/rewind-30", + "material/rewind-45", + "material/rewind-5", + "material/rewind-60", + "material/rewind-outline", + "material/rewind", + "material/rhombus-medium-outline", + "material/rhombus-medium", + "material/rhombus-outline", + "material/rhombus-split-outline", + "material/rhombus-split", + "material/rhombus", + "material/ribbon", + "material/rice", + "material/rickshaw-electric", + "material/rickshaw", + "material/ring", + "material/rivet", + "material/road-variant", + "material/road", + "material/robber", + "material/robot-angry-outline", + "material/robot-angry", + "material/robot-confused-outline", + "material/robot-confused", + "material/robot-dead-outline", + "material/robot-dead", + "material/robot-excited-outline", + "material/robot-excited", + "material/robot-happy-outline", + "material/robot-happy", + "material/robot-industrial-outline", + "material/robot-industrial", + "material/robot-love-outline", + "material/robot-love", + "material/robot-mower-outline", + "material/robot-mower", + "material/robot-off-outline", + "material/robot-off", + "material/robot-outline", + "material/robot-vacuum-alert", + "material/robot-vacuum-off", + "material/robot-vacuum-variant-alert", + "material/robot-vacuum-variant-off", + "material/robot-vacuum-variant", + "material/robot-vacuum", + "material/robot", + "material/rocket-launch-outline", + "material/rocket-launch", + "material/rocket-outline", + "material/rocket", + "material/rodent", + "material/roller-shade-closed", + "material/roller-shade", + "material/roller-skate-off", + "material/roller-skate", + "material/rollerblade-off", + "material/rollerblade", + "material/rollupjs", + "material/rolodex-outline", + "material/rolodex", + "material/roman-numeral-1", + "material/roman-numeral-10", + "material/roman-numeral-2", + "material/roman-numeral-3", + "material/roman-numeral-4", + "material/roman-numeral-5", + "material/roman-numeral-6", + "material/roman-numeral-7", + "material/roman-numeral-8", + "material/roman-numeral-9", + "material/room-service-outline", + "material/room-service", + "material/rotate-360", + "material/rotate-3d-variant", + "material/rotate-3d", + "material/rotate-left-variant", + "material/rotate-left", + "material/rotate-orbit", + "material/rotate-right-variant", + "material/rotate-right", + "material/rounded-corner", + "material/router-network-wireless", + "material/router-network", + "material/router-wireless-off", + "material/router-wireless-settings", + "material/router-wireless", + "material/router", + "material/routes-clock", + "material/routes", + "material/rowing", + "material/rss-box", + "material/rss-off", + "material/rss", + "material/rug", + "material/rugby", + "material/ruler-square-compass", + "material/ruler-square", + "material/ruler", + "material/run-fast", + "material/run", + "material/rv-truck", + "material/sack-outline", + "material/sack-percent", + "material/sack", + "material/safe-square-outline", + "material/safe-square", + "material/safe", + "material/safety-goggles", + "material/sail-boat-sink", + "material/sail-boat", + "material/sale-outline", + "material/sale", + "material/salesforce", + "material/sass", + "material/satellite-uplink", + "material/satellite-variant", + "material/satellite", + "material/sausage-off", + "material/sausage", + "material/saw-blade", + "material/sawtooth-wave", + "material/saxophone", + "material/scale-balance", + "material/scale-bathroom", + "material/scale-off", + "material/scale-unbalanced", + "material/scale", + "material/scan-helper", + "material/scanner-off", + "material/scanner", + "material/scatter-plot-outline", + "material/scatter-plot", + "material/scent-off", + "material/scent", + "material/school-outline", + "material/school", + "material/scissors-cutting", + "material/scooter-electric", + "material/scooter", + "material/scoreboard-outline", + "material/scoreboard", + "material/screen-rotation-lock", + "material/screen-rotation", + "material/screw-flat-top", + "material/screw-lag", + "material/screw-machine-flat-top", + "material/screw-machine-round-top", + "material/screw-round-top", + "material/screwdriver", + "material/script-outline", + "material/script-text-key-outline", + "material/script-text-key", + "material/script-text-outline", + "material/script-text-play-outline", + "material/script-text-play", + "material/script-text", + "material/script", + "material/sd", + "material/seal-variant", + "material/seal", + "material/search-web", + "material/seat-flat-angled", + "material/seat-flat", + "material/seat-individual-suite", + "material/seat-legroom-extra", + "material/seat-legroom-normal", + "material/seat-legroom-reduced", + "material/seat-outline", + "material/seat-passenger", + "material/seat-recline-extra", + "material/seat-recline-normal", + "material/seat", + "material/seatbelt", + "material/security-network", + "material/security", + "material/seed-off-outline", + "material/seed-off", + "material/seed-outline", + "material/seed-plus-outline", + "material/seed-plus", + "material/seed", + "material/seesaw", + "material/segment", + "material/select-all", + "material/select-arrow-down", + "material/select-arrow-up", + "material/select-color", + "material/select-compare", + "material/select-drag", + "material/select-group", + "material/select-inverse", + "material/select-marker", + "material/select-multiple-marker", + "material/select-multiple", + "material/select-off", + "material/select-place", + "material/select-remove", + "material/select-search", + "material/select", + "material/selection-drag", + "material/selection-ellipse-arrow-inside", + "material/selection-ellipse-remove", + "material/selection-ellipse", + "material/selection-marker", + "material/selection-multiple-marker", + "material/selection-multiple", + "material/selection-off", + "material/selection-remove", + "material/selection-search", + "material/selection", + "material/semantic-web", + "material/send-check-outline", + "material/send-check", + "material/send-circle-outline", + "material/send-circle", + "material/send-clock-outline", + "material/send-clock", + "material/send-lock-outline", + "material/send-lock", + "material/send-outline", + "material/send-variant-clock-outline", + "material/send-variant-clock", + "material/send-variant-outline", + "material/send-variant", + "material/send", + "material/serial-port", + "material/server-minus-outline", + "material/server-minus", + "material/server-network-off", + "material/server-network-outline", + "material/server-network", + "material/server-off", + "material/server-outline", + "material/server-plus-outline", + "material/server-plus", + "material/server-remove", + "material/server-security", + "material/server", + "material/set-all", + "material/set-center-right", + "material/set-center", + "material/set-left-center", + "material/set-left-right", + "material/set-left", + "material/set-merge", + "material/set-none", + "material/set-right", + "material/set-split", + "material/set-square", + "material/set-top-box", + "material/settings-helper", + "material/shaker-outline", + "material/shaker", + "material/shape-circle-plus", + "material/shape-outline", + "material/shape-oval-plus", + "material/shape-plus-outline", + "material/shape-plus", + "material/shape-polygon-plus", + "material/shape-rectangle-plus", + "material/shape-square-plus", + "material/shape-square-rounded-plus", + "material/shape", + "material/share-all-outline", + "material/share-all", + "material/share-circle", + "material/share-off-outline", + "material/share-off", + "material/share-outline", + "material/share-variant-outline", + "material/share-variant", + "material/share", + "material/shark-fin-outline", + "material/shark-fin", + "material/shark-off", + "material/shark", + "material/sheep", + "material/shield-account-outline", + "material/shield-account-variant-outline", + "material/shield-account-variant", + "material/shield-account", + "material/shield-airplane-outline", + "material/shield-airplane", + "material/shield-alert-outline", + "material/shield-alert", + "material/shield-bug-outline", + "material/shield-bug", + "material/shield-car", + "material/shield-check-outline", + "material/shield-check", + "material/shield-cross-outline", + "material/shield-cross", + "material/shield-crown-outline", + "material/shield-crown", + "material/shield-edit-outline", + "material/shield-edit", + "material/shield-half-full", + "material/shield-half", + "material/shield-home-outline", + "material/shield-home", + "material/shield-key-outline", + "material/shield-key", + "material/shield-link-variant-outline", + "material/shield-link-variant", + "material/shield-lock-open-outline", + "material/shield-lock-open", + "material/shield-lock-outline", + "material/shield-lock", + "material/shield-moon-outline", + "material/shield-moon", + "material/shield-off-outline", + "material/shield-off", + "material/shield-outline", + "material/shield-plus-outline", + "material/shield-plus", + "material/shield-refresh-outline", + "material/shield-refresh", + "material/shield-remove-outline", + "material/shield-remove", + "material/shield-search", + "material/shield-star-outline", + "material/shield-star", + "material/shield-sun-outline", + "material/shield-sun", + "material/shield-sword-outline", + "material/shield-sword", + "material/shield-sync-outline", + "material/shield-sync", + "material/shield", + "material/shimmer", + "material/ship-wheel", + "material/shipping-pallet", + "material/shoe-ballet", + "material/shoe-cleat", + "material/shoe-formal", + "material/shoe-heel", + "material/shoe-print", + "material/shoe-sneaker", + "material/shopping-music", + "material/shopping-outline", + "material/shopping-search-outline", + "material/shopping-search", + "material/shopping", + "material/shore", + "material/shovel-off", + "material/shovel", + "material/shower-head", + "material/shower", + "material/shredder", + "material/shuffle-disabled", + "material/shuffle-variant", + "material/shuffle", + "material/shuriken", + "material/sickle", + "material/sigma-lower", + "material/sigma", + "material/sign-caution", + "material/sign-direction-minus", + "material/sign-direction-plus", + "material/sign-direction-remove", + "material/sign-direction", + "material/sign-language-outline", + "material/sign-language", + "material/sign-pole", + "material/sign-real-estate", + "material/sign-text", + "material/sign-yield", + "material/signal-2g", + "material/signal-3g", + "material/signal-4g", + "material/signal-5g", + "material/signal-cellular-1", + "material/signal-cellular-2", + "material/signal-cellular-3", + "material/signal-cellular-outline", + "material/signal-distance-variant", + "material/signal-hspa-plus", + "material/signal-hspa", + "material/signal-off", + "material/signal-variant", + "material/signal", + "material/signature-freehand", + "material/signature-image", + "material/signature-text", + "material/signature", + "material/silo-outline", + "material/silo", + "material/silverware-clean", + "material/silverware-fork-knife", + "material/silverware-fork", + "material/silverware-spoon", + "material/silverware-variant", + "material/silverware", + "material/sim-alert-outline", + "material/sim-alert", + "material/sim-off-outline", + "material/sim-off", + "material/sim-outline", + "material/sim", + "material/simple-icons", + "material/sina-weibo", + "material/sine-wave", + "material/sitemap-outline", + "material/sitemap", + "material/size-l", + "material/size-m", + "material/size-s", + "material/size-xl", + "material/size-xs", + "material/size-xxl", + "material/size-xxs", + "material/size-xxxl", + "material/skate-off", + "material/skate", + "material/skateboard", + "material/skateboarding", + "material/skew-less", + "material/skew-more", + "material/ski-cross-country", + "material/ski-water", + "material/ski", + "material/skip-backward-outline", + "material/skip-backward", + "material/skip-forward-outline", + "material/skip-forward", + "material/skip-next-circle-outline", + "material/skip-next-circle", + "material/skip-next-outline", + "material/skip-next", + "material/skip-previous-circle-outline", + "material/skip-previous-circle", + "material/skip-previous-outline", + "material/skip-previous", + "material/skull-crossbones-outline", + "material/skull-crossbones", + "material/skull-outline", + "material/skull-scan-outline", + "material/skull-scan", + "material/skull", + "material/skype-business", + "material/skype", + "material/slack", + "material/slash-forward-box", + "material/slash-forward", + "material/sledding", + "material/sleep-off", + "material/sleep", + "material/slide", + "material/slope-downhill", + "material/slope-uphill", + "material/slot-machine-outline", + "material/slot-machine", + "material/smart-card-off-outline", + "material/smart-card-off", + "material/smart-card-outline", + "material/smart-card-reader-outline", + "material/smart-card-reader", + "material/smart-card", + "material/smog", + "material/smoke-detector-alert-outline", + "material/smoke-detector-alert", + "material/smoke-detector-off-outline", + "material/smoke-detector-off", + "material/smoke-detector-outline", + "material/smoke-detector-variant-alert", + "material/smoke-detector-variant-off", + "material/smoke-detector-variant", + "material/smoke-detector", + "material/smoke", + "material/smoking-off", + "material/smoking-pipe-off", + "material/smoking-pipe", + "material/smoking", + "material/snail", + "material/snake", + "material/snapchat", + "material/snowboard", + "material/snowflake-alert", + "material/snowflake-check", + "material/snowflake-melt", + "material/snowflake-off", + "material/snowflake-thermometer", + "material/snowflake-variant", + "material/snowflake", + "material/snowman", + "material/snowmobile", + "material/snowshoeing", + "material/soccer-field", + "material/soccer", + "material/social-distance-2-meters", + "material/social-distance-6-feet", + "material/sofa-outline", + "material/sofa-single-outline", + "material/sofa-single", + "material/sofa", + "material/solar-panel-large", + "material/solar-panel", + "material/solar-power-variant-outline", + "material/solar-power-variant", + "material/solar-power", + "material/soldering-iron", + "material/solid", + "material/sony-playstation", + "material/sort-alphabetical-ascending-variant", + "material/sort-alphabetical-ascending", + "material/sort-alphabetical-descending-variant", + "material/sort-alphabetical-descending", + "material/sort-alphabetical-variant", + "material/sort-ascending", + "material/sort-bool-ascending-variant", + "material/sort-bool-ascending", + "material/sort-bool-descending-variant", + "material/sort-bool-descending", + "material/sort-calendar-ascending", + "material/sort-calendar-descending", + "material/sort-clock-ascending-outline", + "material/sort-clock-ascending", + "material/sort-clock-descending-outline", + "material/sort-clock-descending", + "material/sort-descending", + "material/sort-numeric-ascending-variant", + "material/sort-numeric-ascending", + "material/sort-numeric-descending-variant", + "material/sort-numeric-descending", + "material/sort-numeric-variant", + "material/sort-reverse-variant", + "material/sort-variant-lock-open", + "material/sort-variant-lock", + "material/sort-variant-off", + "material/sort-variant-remove", + "material/sort-variant", + "material/sort", + "material/soundbar", + "material/soundcloud", + "material/source-branch-check", + "material/source-branch-minus", + "material/source-branch-plus", + "material/source-branch-refresh", + "material/source-branch-remove", + "material/source-branch-sync", + "material/source-branch", + "material/source-commit-end-local", + "material/source-commit-end", + "material/source-commit-local", + "material/source-commit-next-local", + "material/source-commit-start-next-local", + "material/source-commit-start", + "material/source-commit", + "material/source-fork", + "material/source-merge", + "material/source-pull", + "material/source-repository-multiple", + "material/source-repository", + "material/soy-sauce-off", + "material/soy-sauce", + "material/spa-outline", + "material/spa", + "material/space-invaders", + "material/space-station", + "material/spade", + "material/speaker-bluetooth", + "material/speaker-message", + "material/speaker-multiple", + "material/speaker-off", + "material/speaker-pause", + "material/speaker-play", + "material/speaker-stop", + "material/speaker-wireless", + "material/speaker", + "material/spear", + "material/speedometer-medium", + "material/speedometer-slow", + "material/speedometer", + "material/spellcheck", + "material/sphere-off", + "material/sphere", + "material/spider-outline", + "material/spider-thread", + "material/spider-web", + "material/spider", + "material/spirit-level", + "material/spoon-sugar", + "material/spotify", + "material/spotlight-beam", + "material/spotlight", + "material/spray-bottle", + "material/spray", + "material/sprinkler-fire", + "material/sprinkler-variant", + "material/sprinkler", + "material/sprout-outline", + "material/sprout", + "material/square-circle-outline", + "material/square-circle", + "material/square-edit-outline", + "material/square-medium-outline", + "material/square-medium", + "material/square-off-outline", + "material/square-off", + "material/square-opacity", + "material/square-outline", + "material/square-root-box", + "material/square-root", + "material/square-rounded-badge-outline", + "material/square-rounded-badge", + "material/square-rounded-outline", + "material/square-rounded", + "material/square-small", + "material/square-wave", + "material/square", + "material/squeegee", + "material/ssh", + "material/stack-exchange", + "material/stack-overflow", + "material/stackpath", + "material/stadium-outline", + "material/stadium-variant", + "material/stadium", + "material/stairs-box", + "material/stairs-down", + "material/stairs-up", + "material/stairs", + "material/stamper", + "material/standard-definition", + "material/star-box-multiple-outline", + "material/star-box-multiple", + "material/star-box-outline", + "material/star-box", + "material/star-check-outline", + "material/star-check", + "material/star-circle-outline", + "material/star-circle", + "material/star-cog-outline", + "material/star-cog", + "material/star-crescent", + "material/star-david", + "material/star-face", + "material/star-four-points-box-outline", + "material/star-four-points-box", + "material/star-four-points-circle-outline", + "material/star-four-points-circle", + "material/star-four-points-outline", + "material/star-four-points-small", + "material/star-four-points", + "material/star-half-full", + "material/star-half", + "material/star-minus-outline", + "material/star-minus", + "material/star-off-outline", + "material/star-off", + "material/star-outline", + "material/star-plus-outline", + "material/star-plus", + "material/star-remove-outline", + "material/star-remove", + "material/star-settings-outline", + "material/star-settings", + "material/star-shooting-outline", + "material/star-shooting", + "material/star-three-points-outline", + "material/star-three-points", + "material/star", + "material/state-machine", + "material/steam", + "material/steering-off", + "material/steering", + "material/step-backward-2", + "material/step-backward", + "material/step-forward-2", + "material/step-forward", + "material/stethoscope", + "material/sticker-alert-outline", + "material/sticker-alert", + "material/sticker-check-outline", + "material/sticker-check", + "material/sticker-circle-outline", + "material/sticker-emoji", + "material/sticker-minus-outline", + "material/sticker-minus", + "material/sticker-outline", + "material/sticker-plus-outline", + "material/sticker-plus", + "material/sticker-remove-outline", + "material/sticker-remove", + "material/sticker-text-outline", + "material/sticker-text", + "material/sticker", + "material/stocking", + "material/stomach", + "material/stool-outline", + "material/stool", + "material/stop-circle-outline", + "material/stop-circle", + "material/stop", + "material/storage-tank-outline", + "material/storage-tank", + "material/store-24-hour", + "material/store-alert-outline", + "material/store-alert", + "material/store-check-outline", + "material/store-check", + "material/store-clock-outline", + "material/store-clock", + "material/store-cog-outline", + "material/store-cog", + "material/store-edit-outline", + "material/store-edit", + "material/store-marker-outline", + "material/store-marker", + "material/store-minus-outline", + "material/store-minus", + "material/store-off-outline", + "material/store-off", + "material/store-outline", + "material/store-plus-outline", + "material/store-plus", + "material/store-remove-outline", + "material/store-remove", + "material/store-search-outline", + "material/store-search", + "material/store-settings-outline", + "material/store-settings", + "material/store", + "material/storefront-check-outline", + "material/storefront-check", + "material/storefront-edit-outline", + "material/storefront-edit", + "material/storefront-minus-outline", + "material/storefront-minus", + "material/storefront-outline", + "material/storefront-plus-outline", + "material/storefront-plus", + "material/storefront-remove-outline", + "material/storefront-remove", + "material/storefront", + "material/stove", + "material/strategy", + "material/stretch-to-page-outline", + "material/stretch-to-page", + "material/string-lights-off", + "material/string-lights", + "material/subdirectory-arrow-left", + "material/subdirectory-arrow-right", + "material/submarine", + "material/subtitles-outline", + "material/subtitles", + "material/subway-alert-variant", + "material/subway-variant", + "material/subway", + "material/summit", + "material/sun-angle-outline", + "material/sun-angle", + "material/sun-clock-outline", + "material/sun-clock", + "material/sun-compass", + "material/sun-snowflake-variant", + "material/sun-snowflake", + "material/sun-thermometer-outline", + "material/sun-thermometer", + "material/sun-wireless-outline", + "material/sun-wireless", + "material/sunglasses", + "material/surfing", + "material/surround-sound-2-0", + "material/surround-sound-2-1", + "material/surround-sound-3-1", + "material/surround-sound-5-1-2", + "material/surround-sound-5-1", + "material/surround-sound-7-1", + "material/surround-sound", + "material/svg", + "material/swap-horizontal-bold", + "material/swap-horizontal-circle-outline", + "material/swap-horizontal-circle", + "material/swap-horizontal-hidden", + "material/swap-horizontal-variant", + "material/swap-horizontal", + "material/swap-vertical-bold", + "material/swap-vertical-circle-outline", + "material/swap-vertical-circle", + "material/swap-vertical-variant", + "material/swap-vertical", + "material/swim", + "material/switch", + "material/sword-cross", + "material/sword", + "material/syllabary-hangul", + "material/syllabary-hiragana", + "material/syllabary-katakana-halfwidth", + "material/syllabary-katakana", + "material/symbol", + "material/symfony", + "material/synagogue-outline", + "material/synagogue", + "material/sync-alert", + "material/sync-circle", + "material/sync-off", + "material/sync", + "material/tab-minus", + "material/tab-plus", + "material/tab-remove", + "material/tab-search", + "material/tab-unselected", + "material/tab", + "material/table-account", + "material/table-alert", + "material/table-arrow-down", + "material/table-arrow-left", + "material/table-arrow-right", + "material/table-arrow-up", + "material/table-border", + "material/table-cancel", + "material/table-chair", + "material/table-check", + "material/table-clock", + "material/table-cog", + "material/table-column-plus-after", + "material/table-column-plus-before", + "material/table-column-remove", + "material/table-column-width", + "material/table-column", + "material/table-edit", + "material/table-eye-off", + "material/table-eye", + "material/table-filter", + "material/table-furniture", + "material/table-headers-eye-off", + "material/table-headers-eye", + "material/table-heart", + "material/table-key", + "material/table-large-plus", + "material/table-large-remove", + "material/table-large", + "material/table-lock", + "material/table-merge-cells", + "material/table-minus", + "material/table-multiple", + "material/table-network", + "material/table-of-contents", + "material/table-off", + "material/table-picnic", + "material/table-pivot", + "material/table-plus", + "material/table-question", + "material/table-refresh", + "material/table-remove", + "material/table-row-height", + "material/table-row-plus-after", + "material/table-row-plus-before", + "material/table-row-remove", + "material/table-row", + "material/table-search", + "material/table-settings", + "material/table-split-cell", + "material/table-star", + "material/table-sync", + "material/table-tennis", + "material/table", + "material/tablet-cellphone", + "material/tablet-dashboard", + "material/tablet", + "material/taco", + "material/tag-arrow-down-outline", + "material/tag-arrow-down", + "material/tag-arrow-left-outline", + "material/tag-arrow-left", + "material/tag-arrow-right-outline", + "material/tag-arrow-right", + "material/tag-arrow-up-outline", + "material/tag-arrow-up", + "material/tag-check-outline", + "material/tag-check", + "material/tag-edit-outline", + "material/tag-edit", + "material/tag-faces", + "material/tag-heart-outline", + "material/tag-heart", + "material/tag-hidden", + "material/tag-minus-outline", + "material/tag-minus", + "material/tag-multiple-outline", + "material/tag-multiple", + "material/tag-off-outline", + "material/tag-off", + "material/tag-outline", + "material/tag-plus-outline", + "material/tag-plus", + "material/tag-remove-outline", + "material/tag-remove", + "material/tag-search-outline", + "material/tag-search", + "material/tag-text-outline", + "material/tag-text", + "material/tag", + "material/tailwind", + "material/tally-mark-1", + "material/tally-mark-2", + "material/tally-mark-3", + "material/tally-mark-4", + "material/tally-mark-5", + "material/tangram", + "material/tank", + "material/tanker-truck", + "material/tape-drive", + "material/tape-measure", + "material/target-account", + "material/target-variant", + "material/target", + "material/taxi", + "material/tea-outline", + "material/tea", + "material/teamviewer", + "material/teddy-bear", + "material/telescope", + "material/television-ambient-light", + "material/television-box", + "material/television-classic-off", + "material/television-classic", + "material/television-guide", + "material/television-off", + "material/television-pause", + "material/television-play", + "material/television-shimmer", + "material/television-speaker-off", + "material/television-speaker", + "material/television-stop", + "material/television", + "material/temperature-celsius", + "material/temperature-fahrenheit", + "material/temperature-kelvin", + "material/temple-buddhist-outline", + "material/temple-buddhist", + "material/temple-hindu-outline", + "material/temple-hindu", + "material/tennis-ball-outline", + "material/tennis-ball", + "material/tennis", + "material/tent", + "material/terraform", + "material/terrain", + "material/test-tube-empty", + "material/test-tube-off", + "material/test-tube", + "material/text-account", + "material/text-box-check-outline", + "material/text-box-check", + "material/text-box-edit-outline", + "material/text-box-edit", + "material/text-box-minus-outline", + "material/text-box-minus", + "material/text-box-multiple-outline", + "material/text-box-multiple", + "material/text-box-outline", + "material/text-box-plus-outline", + "material/text-box-plus", + "material/text-box-remove-outline", + "material/text-box-remove", + "material/text-box-search-outline", + "material/text-box-search", + "material/text-box", + "material/text-long", + "material/text-recognition", + "material/text-search-variant", + "material/text-search", + "material/text-shadow", + "material/text-short", + "material/text", + "material/texture-box", + "material/texture", + "material/theater", + "material/theme-light-dark", + "material/thermometer-alert", + "material/thermometer-auto", + "material/thermometer-bluetooth", + "material/thermometer-check", + "material/thermometer-chevron-down", + "material/thermometer-chevron-up", + "material/thermometer-high", + "material/thermometer-lines", + "material/thermometer-low", + "material/thermometer-minus", + "material/thermometer-off", + "material/thermometer-plus", + "material/thermometer-probe-off", + "material/thermometer-probe", + "material/thermometer-water", + "material/thermometer", + "material/thermostat-auto", + "material/thermostat-box-auto", + "material/thermostat-box", + "material/thermostat-cog", + "material/thermostat", + "material/thought-bubble-outline", + "material/thought-bubble", + "material/thumb-down-outline", + "material/thumb-down", + "material/thumb-up-outline", + "material/thumb-up", + "material/thumbs-up-down-outline", + "material/thumbs-up-down", + "material/ticket-account", + "material/ticket-confirmation-outline", + "material/ticket-confirmation", + "material/ticket-outline", + "material/ticket-percent-outline", + "material/ticket-percent", + "material/ticket", + "material/tie", + "material/tilde-off", + "material/tilde", + "material/timelapse", + "material/timeline-alert-outline", + "material/timeline-alert", + "material/timeline-check-outline", + "material/timeline-check", + "material/timeline-clock-outline", + "material/timeline-clock", + "material/timeline-minus-outline", + "material/timeline-minus", + "material/timeline-outline", + "material/timeline-plus-outline", + "material/timeline-plus", + "material/timeline-question-outline", + "material/timeline-question", + "material/timeline-remove-outline", + "material/timeline-remove", + "material/timeline-text-outline", + "material/timeline-text", + "material/timeline", + "material/timer-10", + "material/timer-3", + "material/timer-alert-outline", + "material/timer-alert", + "material/timer-cancel-outline", + "material/timer-cancel", + "material/timer-check-outline", + "material/timer-check", + "material/timer-cog-outline", + "material/timer-cog", + "material/timer-edit-outline", + "material/timer-edit", + "material/timer-lock-open-outline", + "material/timer-lock-open", + "material/timer-lock-outline", + "material/timer-lock", + "material/timer-marker-outline", + "material/timer-marker", + "material/timer-minus-outline", + "material/timer-minus", + "material/timer-music-outline", + "material/timer-music", + "material/timer-off-outline", + "material/timer-off", + "material/timer-outline", + "material/timer-pause-outline", + "material/timer-pause", + "material/timer-play-outline", + "material/timer-play", + "material/timer-plus-outline", + "material/timer-plus", + "material/timer-refresh-outline", + "material/timer-refresh", + "material/timer-remove-outline", + "material/timer-remove", + "material/timer-sand-complete", + "material/timer-sand-empty", + "material/timer-sand-full", + "material/timer-sand-paused", + "material/timer-sand", + "material/timer-settings-outline", + "material/timer-settings", + "material/timer-star-outline", + "material/timer-star", + "material/timer-stop-outline", + "material/timer-stop", + "material/timer-sync-outline", + "material/timer-sync", + "material/timer", + "material/timetable", + "material/tire", + "material/toaster-off", + "material/toaster-oven", + "material/toaster", + "material/toggle-switch-off-outline", + "material/toggle-switch-off", + "material/toggle-switch-outline", + "material/toggle-switch-variant-off", + "material/toggle-switch-variant", + "material/toggle-switch", + "material/toilet", + "material/toolbox-outline", + "material/toolbox", + "material/tools", + "material/tooltip-account", + "material/tooltip-cellphone", + "material/tooltip-check-outline", + "material/tooltip-check", + "material/tooltip-edit-outline", + "material/tooltip-edit", + "material/tooltip-image-outline", + "material/tooltip-image", + "material/tooltip-minus-outline", + "material/tooltip-minus", + "material/tooltip-outline", + "material/tooltip-plus-outline", + "material/tooltip-plus", + "material/tooltip-question-outline", + "material/tooltip-question", + "material/tooltip-remove-outline", + "material/tooltip-remove", + "material/tooltip-text-outline", + "material/tooltip-text", + "material/tooltip", + "material/tooth-outline", + "material/tooth", + "material/toothbrush-electric", + "material/toothbrush-paste", + "material/toothbrush", + "material/torch", + "material/tortoise", + "material/toslink", + "material/touch-text-outline", + "material/tournament", + "material/tow-truck", + "material/tower-beach", + "material/tower-fire", + "material/town-hall", + "material/toy-brick-marker-outline", + "material/toy-brick-marker", + "material/toy-brick-minus-outline", + "material/toy-brick-minus", + "material/toy-brick-outline", + "material/toy-brick-plus-outline", + "material/toy-brick-plus", + "material/toy-brick-remove-outline", + "material/toy-brick-remove", + "material/toy-brick-search-outline", + "material/toy-brick-search", + "material/toy-brick", + "material/track-light-off", + "material/track-light", + "material/trackpad-lock", + "material/trackpad", + "material/tractor-variant", + "material/tractor", + "material/trademark", + "material/traffic-cone", + "material/traffic-light-outline", + "material/traffic-light", + "material/train-bus", + "material/train-car-autorack", + "material/train-car-box-full", + "material/train-car-box-open", + "material/train-car-box", + "material/train-car-caboose", + "material/train-car-centerbeam-full", + "material/train-car-centerbeam", + "material/train-car-container", + "material/train-car-flatbed-car", + "material/train-car-flatbed-tank", + "material/train-car-flatbed", + "material/train-car-gondola-full", + "material/train-car-gondola", + "material/train-car-hopper-covered", + "material/train-car-hopper-full", + "material/train-car-hopper", + "material/train-car-intermodal", + "material/train-car-passenger-door-open", + "material/train-car-passenger-door", + "material/train-car-passenger-variant", + "material/train-car-passenger", + "material/train-car-tank", + "material/train-car", + "material/train-variant", + "material/train", + "material/tram-side", + "material/tram", + "material/transcribe-close", + "material/transcribe", + "material/transfer-down", + "material/transfer-left", + "material/transfer-right", + "material/transfer-up", + "material/transfer", + "material/transit-connection-horizontal", + "material/transit-connection-variant", + "material/transit-connection", + "material/transit-detour", + "material/transit-skip", + "material/transit-transfer", + "material/transition-masked", + "material/transition", + "material/translate-off", + "material/translate-variant", + "material/translate", + "material/transmission-tower-export", + "material/transmission-tower-import", + "material/transmission-tower-off", + "material/transmission-tower", + "material/trash-can-outline", + "material/trash-can", + "material/tray-alert", + "material/tray-arrow-down", + "material/tray-arrow-up", + "material/tray-full", + "material/tray-minus", + "material/tray-plus", + "material/tray-remove", + "material/tray", + "material/treasure-chest-outline", + "material/treasure-chest", + "material/tree-outline", + "material/tree", + "material/trello", + "material/trending-down", + "material/trending-neutral", + "material/trending-up", + "material/triangle-down-outline", + "material/triangle-down", + "material/triangle-outline", + "material/triangle-small-down", + "material/triangle-small-up", + "material/triangle-wave", + "material/triangle", + "material/triforce", + "material/trophy-award", + "material/trophy-broken", + "material/trophy-outline", + "material/trophy-variant-outline", + "material/trophy-variant", + "material/trophy", + "material/truck-alert-outline", + "material/truck-alert", + "material/truck-cargo-container", + "material/truck-check-outline", + "material/truck-check", + "material/truck-delivery-outline", + "material/truck-delivery", + "material/truck-fast-outline", + "material/truck-fast", + "material/truck-flatbed", + "material/truck-minus-outline", + "material/truck-minus", + "material/truck-off-road-off", + "material/truck-off-road", + "material/truck-outline", + "material/truck-plus-outline", + "material/truck-plus", + "material/truck-remove-outline", + "material/truck-remove", + "material/truck-snowflake", + "material/truck-trailer", + "material/truck", + "material/trumpet", + "material/tshirt-crew-outline", + "material/tshirt-crew", + "material/tshirt-v-outline", + "material/tshirt-v", + "material/tsunami", + "material/tumble-dryer-alert", + "material/tumble-dryer-off", + "material/tumble-dryer", + "material/tune-variant", + "material/tune-vertical-variant", + "material/tune-vertical", + "material/tune", + "material/tunnel-outline", + "material/tunnel", + "material/turbine", + "material/turkey", + "material/turnstile-outline", + "material/turnstile", + "material/turtle", + "material/twitch", + "material/twitter", + "material/two-factor-authentication", + "material/typewriter", + "material/ubisoft", + "material/ubuntu", + "material/ufo-outline", + "material/ufo", + "material/ultra-high-definition", + "material/umbraco", + "material/umbrella-beach-outline", + "material/umbrella-beach", + "material/umbrella-closed-outline", + "material/umbrella-closed-variant", + "material/umbrella-closed", + "material/umbrella-outline", + "material/umbrella", + "material/underwear-outline", + "material/undo-variant", + "material/undo", + "material/unfold-less-horizontal", + "material/unfold-less-vertical", + "material/unfold-more-horizontal", + "material/unfold-more-vertical", + "material/ungroup", + "material/unicode", + "material/unicorn-variant", + "material/unicorn", + "material/unicycle", + "material/unity", + "material/unreal", + "material/update", + "material/upload-box-outline", + "material/upload-box", + "material/upload-circle-outline", + "material/upload-circle", + "material/upload-lock-outline", + "material/upload-lock", + "material/upload-multiple-outline", + "material/upload-multiple", + "material/upload-network-outline", + "material/upload-network", + "material/upload-off-outline", + "material/upload-off", + "material/upload-outline", + "material/upload", + "material/usb-c-port", + "material/usb-flash-drive-outline", + "material/usb-flash-drive", + "material/usb-port", + "material/usb", + "material/vacuum-outline", + "material/vacuum", + "material/valve-closed", + "material/valve-open", + "material/valve", + "material/van-passenger", + "material/van-utility", + "material/vanish-quarter", + "material/vanish", + "material/vanity-light", + "material/variable-box", + "material/variable", + "material/vector-arrange-above", + "material/vector-arrange-below", + "material/vector-bezier", + "material/vector-circle-variant", + "material/vector-circle", + "material/vector-combine", + "material/vector-curve", + "material/vector-difference-ab", + "material/vector-difference-ba", + "material/vector-difference", + "material/vector-ellipse", + "material/vector-intersection", + "material/vector-line", + "material/vector-link", + "material/vector-point-edit", + "material/vector-point-minus", + "material/vector-point-plus", + "material/vector-point-select", + "material/vector-point", + "material/vector-polygon-variant", + "material/vector-polygon", + "material/vector-polyline-edit", + "material/vector-polyline-minus", + "material/vector-polyline-plus", + "material/vector-polyline-remove", + "material/vector-polyline", + "material/vector-radius", + "material/vector-rectangle", + "material/vector-selection", + "material/vector-square-close", + "material/vector-square-edit", + "material/vector-square-minus", + "material/vector-square-open", + "material/vector-square-plus", + "material/vector-square-remove", + "material/vector-square", + "material/vector-triangle", + "material/vector-union", + "material/vhs", + "material/vibrate-off", + "material/vibrate", + "material/video-2d", + "material/video-3d-off", + "material/video-3d-variant", + "material/video-3d", + "material/video-4k-box", + "material/video-account", + "material/video-box-off", + "material/video-box", + "material/video-check-outline", + "material/video-check", + "material/video-high-definition", + "material/video-image", + "material/video-input-antenna", + "material/video-input-component", + "material/video-input-hdmi", + "material/video-input-scart", + "material/video-input-svideo", + "material/video-marker-outline", + "material/video-marker", + "material/video-minus-outline", + "material/video-minus", + "material/video-off-outline", + "material/video-off", + "material/video-outline", + "material/video-plus-outline", + "material/video-plus", + "material/video-stabilization", + "material/video-standard-definition", + "material/video-switch-outline", + "material/video-switch", + "material/video-vintage", + "material/video-wireless-outline", + "material/video-wireless", + "material/video", + "material/view-agenda-outline", + "material/view-agenda", + "material/view-array-outline", + "material/view-array", + "material/view-carousel-outline", + "material/view-carousel", + "material/view-column-outline", + "material/view-column", + "material/view-comfy-outline", + "material/view-comfy", + "material/view-compact-outline", + "material/view-compact", + "material/view-dashboard-edit-outline", + "material/view-dashboard-edit", + "material/view-dashboard-outline", + "material/view-dashboard-variant-outline", + "material/view-dashboard-variant", + "material/view-dashboard", + "material/view-day-outline", + "material/view-day", + "material/view-gallery-outline", + "material/view-gallery", + "material/view-grid-compact", + "material/view-grid-outline", + "material/view-grid-plus-outline", + "material/view-grid-plus", + "material/view-grid", + "material/view-headline", + "material/view-list-outline", + "material/view-list", + "material/view-module-outline", + "material/view-module", + "material/view-parallel-outline", + "material/view-parallel", + "material/view-quilt-outline", + "material/view-quilt", + "material/view-sequential-outline", + "material/view-sequential", + "material/view-split-horizontal", + "material/view-split-vertical", + "material/view-stream-outline", + "material/view-stream", + "material/view-week-outline", + "material/view-week", + "material/vimeo", + "material/violin", + "material/virtual-reality", + "material/virus-off-outline", + "material/virus-off", + "material/virus-outline", + "material/virus", + "material/vlc", + "material/voicemail", + "material/volcano-outline", + "material/volcano", + "material/volleyball", + "material/volume-equal", + "material/volume-high", + "material/volume-low", + "material/volume-medium", + "material/volume-minus", + "material/volume-mute", + "material/volume-off", + "material/volume-plus", + "material/volume-source", + "material/volume-variant-off", + "material/volume-vibrate", + "material/vote-outline", + "material/vote", + "material/vpn", + "material/vuejs", + "material/vuetify", + "material/walk", + "material/wall-fire", + "material/wall-sconce-flat-outline", + "material/wall-sconce-flat-variant-outline", + "material/wall-sconce-flat-variant", + "material/wall-sconce-flat", + "material/wall-sconce-outline", + "material/wall-sconce-round-outline", + "material/wall-sconce-round-variant-outline", + "material/wall-sconce-round-variant", + "material/wall-sconce-round", + "material/wall-sconce", + "material/wall", + "material/wallet-bifold-outline", + "material/wallet-bifold", + "material/wallet-giftcard", + "material/wallet-membership", + "material/wallet-outline", + "material/wallet-plus-outline", + "material/wallet-plus", + "material/wallet-travel", + "material/wallet", + "material/wallpaper", + "material/wan", + "material/wardrobe-outline", + "material/wardrobe", + "material/warehouse", + "material/washing-machine-alert", + "material/washing-machine-off", + "material/washing-machine", + "material/watch-export-variant", + "material/watch-export", + "material/watch-import-variant", + "material/watch-import", + "material/watch-variant", + "material/watch-vibrate-off", + "material/watch-vibrate", + "material/watch", + "material/water-alert-outline", + "material/water-alert", + "material/water-boiler-alert", + "material/water-boiler-auto", + "material/water-boiler-off", + "material/water-boiler", + "material/water-check-outline", + "material/water-check", + "material/water-circle", + "material/water-minus-outline", + "material/water-minus", + "material/water-off-outline", + "material/water-off", + "material/water-opacity", + "material/water-outline", + "material/water-percent-alert", + "material/water-percent", + "material/water-plus-outline", + "material/water-plus", + "material/water-polo", + "material/water-pump-off", + "material/water-pump", + "material/water-remove-outline", + "material/water-remove", + "material/water-sync", + "material/water-thermometer-outline", + "material/water-thermometer", + "material/water-well-outline", + "material/water-well", + "material/water", + "material/waterfall", + "material/watering-can-outline", + "material/watering-can", + "material/watermark", + "material/wave-arrow-down", + "material/wave-arrow-up", + "material/wave-undercurrent", + "material/wave", + "material/waveform", + "material/waves-arrow-left", + "material/waves-arrow-right", + "material/waves-arrow-up", + "material/waves", + "material/waze", + "material/weather-cloudy-alert", + "material/weather-cloudy-arrow-right", + "material/weather-cloudy-clock", + "material/weather-cloudy", + "material/weather-dust", + "material/weather-fog", + "material/weather-hail", + "material/weather-hazy", + "material/weather-hurricane-outline", + "material/weather-hurricane", + "material/weather-lightning-rainy", + "material/weather-lightning", + "material/weather-moonset-down", + "material/weather-moonset-up", + "material/weather-moonset", + "material/weather-night-partly-cloudy", + "material/weather-night", + "material/weather-partly-cloudy", + "material/weather-partly-lightning", + "material/weather-partly-rainy", + "material/weather-partly-snowy-rainy", + "material/weather-partly-snowy", + "material/weather-pouring", + "material/weather-rainy", + "material/weather-snowy-heavy", + "material/weather-snowy-rainy", + "material/weather-snowy", + "material/weather-sunny-alert", + "material/weather-sunny-off", + "material/weather-sunny", + "material/weather-sunset-down", + "material/weather-sunset-up", + "material/weather-sunset", + "material/weather-tornado", + "material/weather-windy-variant", + "material/weather-windy", + "material/web-box", + "material/web-cancel", + "material/web-check", + "material/web-clock", + "material/web-minus", + "material/web-off", + "material/web-plus", + "material/web-refresh", + "material/web-remove", + "material/web-sync", + "material/web", + "material/webcam-off", + "material/webcam", + "material/webhook", + "material/webpack", + "material/webrtc", + "material/wechat", + "material/weight-gram", + "material/weight-kilogram", + "material/weight-lifter", + "material/weight-pound", + "material/weight", + "material/whatsapp", + "material/wheel-barrow", + "material/wheelchair-accessibility", + "material/wheelchair", + "material/whistle-outline", + "material/whistle", + "material/white-balance-auto", + "material/white-balance-incandescent", + "material/white-balance-iridescent", + "material/white-balance-sunny", + "material/widgets-outline", + "material/widgets", + "material/wifi-alert", + "material/wifi-arrow-down", + "material/wifi-arrow-left-right", + "material/wifi-arrow-left", + "material/wifi-arrow-right", + "material/wifi-arrow-up-down", + "material/wifi-arrow-up", + "material/wifi-cancel", + "material/wifi-check", + "material/wifi-cog", + "material/wifi-lock-open", + "material/wifi-lock", + "material/wifi-marker", + "material/wifi-minus", + "material/wifi-off", + "material/wifi-plus", + "material/wifi-refresh", + "material/wifi-remove", + "material/wifi-settings", + "material/wifi-star", + "material/wifi-strength-1-alert", + "material/wifi-strength-1-lock-open", + "material/wifi-strength-1-lock", + "material/wifi-strength-1", + "material/wifi-strength-2-alert", + "material/wifi-strength-2-lock-open", + "material/wifi-strength-2-lock", + "material/wifi-strength-2", + "material/wifi-strength-3-alert", + "material/wifi-strength-3-lock-open", + "material/wifi-strength-3-lock", + "material/wifi-strength-3", + "material/wifi-strength-4-alert", + "material/wifi-strength-4-lock-open", + "material/wifi-strength-4-lock", + "material/wifi-strength-4", + "material/wifi-strength-alert-outline", + "material/wifi-strength-lock-open-outline", + "material/wifi-strength-lock-outline", + "material/wifi-strength-off-outline", + "material/wifi-strength-off", + "material/wifi-strength-outline", + "material/wifi-sync", + "material/wifi", + "material/wikipedia", + "material/wind-power-outline", + "material/wind-power", + "material/wind-turbine-alert", + "material/wind-turbine-check", + "material/wind-turbine", + "material/window-close", + "material/window-closed-variant", + "material/window-closed", + "material/window-maximize", + "material/window-minimize", + "material/window-open-variant", + "material/window-open", + "material/window-restore", + "material/window-shutter-alert", + "material/window-shutter-auto", + "material/window-shutter-cog", + "material/window-shutter-open", + "material/window-shutter-settings", + "material/window-shutter", + "material/windsock", + "material/wiper-wash-alert", + "material/wiper-wash", + "material/wiper", + "material/wizard-hat", + "material/wordpress", + "material/wrap-disabled", + "material/wrap", + "material/wrench-check-outline", + "material/wrench-check", + "material/wrench-clock-outline", + "material/wrench-clock", + "material/wrench-cog-outline", + "material/wrench-cog", + "material/wrench-outline", + "material/wrench", + "material/xamarin", + "material/xml", + "material/xmpp", + "material/yahoo", + "material/yeast", + "material/yin-yang", + "material/yoga", + "material/youtube-gaming", + "material/youtube-studio", + "material/youtube-subscription", + "material/youtube-tv", + "material/youtube", + "material/yurt", + "material/z-wave", + "material/zend", + "material/zigbee", + "material/zip-box-outline", + "material/zip-box", + "material/zip-disk", + "material/zodiac-aquarius", + "material/zodiac-aries", + "material/zodiac-cancer", + "material/zodiac-capricorn", + "material/zodiac-gemini", + "material/zodiac-leo", + "material/zodiac-libra", + "material/zodiac-pisces", + "material/zodiac-sagittarius", + "material/zodiac-scorpio", + "material/zodiac-taurus", + "material/zodiac-virgo", + "octicons/accessibility-16", + "octicons/accessibility-24", + "octicons/accessibility-inset-16", + "octicons/accessibility-inset-24", + "octicons/agent-16", + "octicons/agent-24", + "octicons/ai-model-16", + "octicons/ai-model-24", + "octicons/alert-16", + "octicons/alert-24", + "octicons/alert-fill-12", + "octicons/alert-fill-16", + "octicons/alert-fill-24", + "octicons/apps-16", + "octicons/apps-24", + "octicons/archive-16", + "octicons/archive-24", + "octicons/arrow-both-16", + "octicons/arrow-both-24", + "octicons/arrow-down-16", + "octicons/arrow-down-24", + "octicons/arrow-down-left-16", + "octicons/arrow-down-left-24", + "octicons/arrow-down-right-16", + "octicons/arrow-down-right-24", + "octicons/arrow-left-16", + "octicons/arrow-left-24", + "octicons/arrow-right-16", + "octicons/arrow-right-24", + "octicons/arrow-switch-16", + "octicons/arrow-switch-24", + "octicons/arrow-up-16", + "octicons/arrow-up-24", + "octicons/arrow-up-left-16", + "octicons/arrow-up-left-24", + "octicons/arrow-up-right-16", + "octicons/arrow-up-right-24", + "octicons/beaker-16", + "octicons/beaker-24", + "octicons/bell-16", + "octicons/bell-24", + "octicons/bell-fill-16", + "octicons/bell-fill-24", + "octicons/bell-slash-16", + "octicons/bell-slash-24", + "octicons/blocked-16", + "octicons/blocked-24", + "octicons/bold-16", + "octicons/bold-24", + "octicons/book-16", + "octicons/book-24", + "octicons/bookmark-16", + "octicons/bookmark-24", + "octicons/bookmark-fill-24", + "octicons/bookmark-filled-16", + "octicons/bookmark-slash-16", + "octicons/bookmark-slash-24", + "octicons/bookmark-slash-fill-16", + "octicons/bookmark-slash-fill-24", + "octicons/boolean-off-16", + "octicons/boolean-off-24", + "octicons/boolean-on-16", + "octicons/boolean-on-24", + "octicons/briefcase-16", + "octicons/briefcase-24", + "octicons/broadcast-16", + "octicons/broadcast-24", + "octicons/browser-16", + "octicons/browser-24", + "octicons/bug-16", + "octicons/bug-24", + "octicons/cache-16", + "octicons/cache-24", + "octicons/calendar-16", + "octicons/calendar-24", + "octicons/check-16", + "octicons/check-24", + "octicons/check-circle-16", + "octicons/check-circle-24", + "octicons/check-circle-fill-12", + "octicons/check-circle-fill-16", + "octicons/check-circle-fill-24", + "octicons/checkbox-16", + "octicons/checkbox-24", + "octicons/checkbox-fill-16", + "octicons/checkbox-fill-24", + "octicons/checklist-16", + "octicons/checklist-24", + "octicons/chevron-down-12", + "octicons/chevron-down-16", + "octicons/chevron-down-24", + "octicons/chevron-left-12", + "octicons/chevron-left-16", + "octicons/chevron-left-24", + "octicons/chevron-right-12", + "octicons/chevron-right-16", + "octicons/chevron-right-24", + "octicons/chevron-up-12", + "octicons/chevron-up-16", + "octicons/chevron-up-24", + "octicons/circle-16", + "octicons/circle-24", + "octicons/circle-slash-16", + "octicons/circle-slash-24", + "octicons/clock-16", + "octicons/clock-24", + "octicons/clock-fill-16", + "octicons/clock-fill-24", + "octicons/cloud-16", + "octicons/cloud-24", + "octicons/cloud-offline-16", + "octicons/cloud-offline-24", + "octicons/code-16", + "octicons/code-24", + "octicons/code-of-conduct-16", + "octicons/code-of-conduct-24", + "octicons/code-review-16", + "octicons/code-review-24", + "octicons/code-square-16", + "octicons/code-square-24", + "octicons/codescan-16", + "octicons/codescan-24", + "octicons/codescan-checkmark-16", + "octicons/codescan-checkmark-24", + "octicons/codespaces-16", + "octicons/codespaces-24", + "octicons/columns-16", + "octicons/columns-24", + "octicons/command-palette-16", + "octicons/command-palette-24", + "octicons/comment-16", + "octicons/comment-24", + "octicons/comment-ai-16", + "octicons/comment-ai-24", + "octicons/comment-discussion-16", + "octicons/comment-discussion-24", + "octicons/compose-16", + "octicons/compose-24", + "octicons/container-16", + "octicons/container-24", + "octicons/copilot-16", + "octicons/copilot-24", + "octicons/copilot-48", + "octicons/copilot-96", + "octicons/copilot-error-16", + "octicons/copilot-warning-16", + "octicons/copy-16", + "octicons/copy-24", + "octicons/cpu-16", + "octicons/cpu-24", + "octicons/credit-card-16", + "octicons/credit-card-24", + "octicons/cross-reference-16", + "octicons/cross-reference-24", + "octicons/crosshairs-16", + "octicons/crosshairs-24", + "octicons/dash-16", + "octicons/dash-24", + "octicons/database-16", + "octicons/database-24", + "octicons/dependabot-16", + "octicons/dependabot-24", + "octicons/desktop-download-16", + "octicons/desktop-download-24", + "octicons/device-camera-16", + "octicons/device-camera-24", + "octicons/device-camera-video-16", + "octicons/device-camera-video-24", + "octicons/device-desktop-16", + "octicons/device-desktop-24", + "octicons/device-mobile-16", + "octicons/device-mobile-24", + "octicons/devices-16", + "octicons/devices-24", + "octicons/diamond-16", + "octicons/diamond-24", + "octicons/dice-16", + "octicons/dice-24", + "octicons/diff-16", + "octicons/diff-24", + "octicons/diff-added-16", + "octicons/diff-added-24", + "octicons/diff-ignored-16", + "octicons/diff-ignored-24", + "octicons/diff-modified-16", + "octicons/diff-modified-24", + "octicons/diff-removed-16", + "octicons/diff-removed-24", + "octicons/diff-renamed-16", + "octicons/diff-renamed-24", + "octicons/discussion-closed-16", + "octicons/discussion-closed-24", + "octicons/discussion-duplicate-16", + "octicons/discussion-duplicate-24", + "octicons/discussion-outdated-16", + "octicons/discussion-outdated-24", + "octicons/dot-16", + "octicons/dot-24", + "octicons/dot-fill-16", + "octicons/dot-fill-24", + "octicons/download-16", + "octicons/download-24", + "octicons/duplicate-16", + "octicons/duplicate-24", + "octicons/ellipsis-16", + "octicons/ellipsis-24", + "octicons/exclamation-16", + "octicons/exclamation-24", + "octicons/eye-16", + "octicons/eye-24", + "octicons/eye-closed-16", + "octicons/eye-closed-24", + "octicons/feed-discussion-16", + "octicons/feed-forked-16", + "octicons/feed-heart-16", + "octicons/feed-issue-closed-16", + "octicons/feed-issue-draft-16", + "octicons/feed-issue-open-16", + "octicons/feed-issue-reopen-16", + "octicons/feed-merged-16", + "octicons/feed-person-16", + "octicons/feed-plus-16", + "octicons/feed-public-16", + "octicons/feed-pull-request-closed-16", + "octicons/feed-pull-request-draft-16", + "octicons/feed-pull-request-open-16", + "octicons/feed-repo-16", + "octicons/feed-rocket-16", + "octicons/feed-star-16", + "octicons/feed-tag-16", + "octicons/feed-trophy-16", + "octicons/file-16", + "octicons/file-24", + "octicons/file-added-16", + "octicons/file-added-24", + "octicons/file-badge-16", + "octicons/file-badge-24", + "octicons/file-binary-16", + "octicons/file-binary-24", + "octicons/file-check-16", + "octicons/file-check-24", + "octicons/file-code-16", + "octicons/file-code-24", + "octicons/file-diff-16", + "octicons/file-diff-24", + "octicons/file-directory-16", + "octicons/file-directory-24", + "octicons/file-directory-fill-16", + "octicons/file-directory-fill-24", + "octicons/file-directory-open-fill-16", + "octicons/file-directory-open-fill-24", + "octicons/file-directory-symlink-16", + "octicons/file-directory-symlink-24", + "octicons/file-media-16", + "octicons/file-media-24", + "octicons/file-moved-16", + "octicons/file-moved-24", + "octicons/file-removed-16", + "octicons/file-removed-24", + "octicons/file-submodule-16", + "octicons/file-submodule-24", + "octicons/file-symlink-file-16", + "octicons/file-symlink-file-24", + "octicons/file-zip-16", + "octicons/file-zip-24", + "octicons/filter-16", + "octicons/filter-24", + "octicons/filter-remove-16", + "octicons/filter-remove-24", + "octicons/fiscal-host-16", + "octicons/fiscal-host-24", + "octicons/flame-16", + "octicons/flame-24", + "octicons/flowchart-16", + "octicons/flowchart-24", + "octicons/focus-center-16", + "octicons/focus-center-24", + "octicons/fold-16", + "octicons/fold-24", + "octicons/fold-down-16", + "octicons/fold-down-24", + "octicons/fold-up-16", + "octicons/fold-up-24", + "octicons/gear-16", + "octicons/gear-24", + "octicons/gift-16", + "octicons/gift-24", + "octicons/git-branch-16", + "octicons/git-branch-24", + "octicons/git-branch-check-16", + "octicons/git-branch-check-24", + "octicons/git-commit-16", + "octicons/git-commit-24", + "octicons/git-compare-16", + "octicons/git-compare-24", + "octicons/git-merge-16", + "octicons/git-merge-24", + "octicons/git-merge-queue-16", + "octicons/git-merge-queue-24", + "octicons/git-pull-request-16", + "octicons/git-pull-request-24", + "octicons/git-pull-request-closed-16", + "octicons/git-pull-request-closed-24", + "octicons/git-pull-request-draft-16", + "octicons/git-pull-request-draft-24", + "octicons/globe-16", + "octicons/globe-24", + "octicons/goal-16", + "octicons/goal-24", + "octicons/grabber-16", + "octicons/grabber-24", + "octicons/graph-16", + "octicons/graph-24", + "octicons/graph-bar-horizontal-16", + "octicons/graph-bar-horizontal-24", + "octicons/graph-bar-vertical-16", + "octicons/graph-bar-vertical-24", + "octicons/hash-16", + "octicons/hash-24", + "octicons/heading-16", + "octicons/heading-24", + "octicons/heart-16", + "octicons/heart-24", + "octicons/heart-fill-16", + "octicons/heart-fill-24", + "octicons/history-16", + "octicons/history-24", + "octicons/home-16", + "octicons/home-24", + "octicons/home-fill-16", + "octicons/home-fill-24", + "octicons/horizontal-rule-16", + "octicons/horizontal-rule-24", + "octicons/hourglass-16", + "octicons/hourglass-24", + "octicons/hubot-16", + "octicons/hubot-24", + "octicons/id-badge-16", + "octicons/id-badge-24", + "octicons/image-16", + "octicons/image-24", + "octicons/inbox-16", + "octicons/inbox-24", + "octicons/inbox-fill-16", + "octicons/inbox-fill-24", + "octicons/infinity-16", + "octicons/infinity-24", + "octicons/info-16", + "octicons/info-24", + "octicons/issue-closed-16", + "octicons/issue-closed-24", + "octicons/issue-draft-16", + "octicons/issue-draft-24", + "octicons/issue-opened-16", + "octicons/issue-opened-24", + "octicons/issue-reopened-16", + "octicons/issue-reopened-24", + "octicons/issue-tracked-by-16", + "octicons/issue-tracked-by-24", + "octicons/issue-tracks-16", + "octicons/issue-tracks-24", + "octicons/italic-16", + "octicons/italic-24", + "octicons/iterations-16", + "octicons/iterations-24", + "octicons/kebab-horizontal-16", + "octicons/kebab-horizontal-24", + "octicons/key-16", + "octicons/key-24", + "octicons/key-asterisk-16", + "octicons/key-asterisk-24", + "octicons/law-16", + "octicons/law-24", + "octicons/light-bulb-16", + "octicons/light-bulb-24", + "octicons/link-16", + "octicons/link-24", + "octicons/link-external-16", + "octicons/link-external-24", + "octicons/list-ordered-16", + "octicons/list-ordered-24", + "octicons/list-unordered-16", + "octicons/list-unordered-24", + "octicons/location-16", + "octicons/location-24", + "octicons/lock-16", + "octicons/lock-24", + "octicons/log-16", + "octicons/log-24", + "octicons/logo-gist-16", + "octicons/logo-gist-24", + "octicons/logo-github-16", + "octicons/logo-github-24", + "octicons/loop-16", + "octicons/loop-24", + "octicons/mail-16", + "octicons/mail-24", + "octicons/mark-github-16", + "octicons/mark-github-24", + "octicons/markdown-16", + "octicons/markdown-24", + "octicons/maximize-16", + "octicons/maximize-24", + "octicons/mcp-16", + "octicons/mcp-24", + "octicons/megaphone-16", + "octicons/megaphone-24", + "octicons/mention-16", + "octicons/mention-24", + "octicons/meter-16", + "octicons/meter-24", + "octicons/milestone-16", + "octicons/milestone-24", + "octicons/minimize-16", + "octicons/minimize-24", + "octicons/mirror-16", + "octicons/mirror-24", + "octicons/moon-16", + "octicons/moon-24", + "octicons/mortar-board-16", + "octicons/mortar-board-24", + "octicons/move-to-bottom-16", + "octicons/move-to-bottom-24", + "octicons/move-to-end-16", + "octicons/move-to-end-24", + "octicons/move-to-start-16", + "octicons/move-to-start-24", + "octicons/move-to-top-16", + "octicons/move-to-top-24", + "octicons/multi-select-16", + "octicons/multi-select-24", + "octicons/mute-16", + "octicons/mute-24", + "octicons/no-entry-16", + "octicons/no-entry-24", + "octicons/no-entry-fill-12", + "octicons/node-16", + "octicons/node-24", + "octicons/north-star-16", + "octicons/north-star-24", + "octicons/note-16", + "octicons/note-24", + "octicons/number-16", + "octicons/number-24", + "octicons/organization-16", + "octicons/organization-24", + "octicons/package-16", + "octicons/package-24", + "octicons/package-dependencies-16", + "octicons/package-dependencies-24", + "octicons/package-dependents-16", + "octicons/package-dependents-24", + "octicons/paintbrush-16", + "octicons/paintbrush-24", + "octicons/paper-airplane-16", + "octicons/paper-airplane-24", + "octicons/paperclip-16", + "octicons/paperclip-24", + "octicons/passkey-fill-16", + "octicons/passkey-fill-24", + "octicons/paste-16", + "octicons/paste-24", + "octicons/pause-16", + "octicons/pause-24", + "octicons/pencil-16", + "octicons/pencil-24", + "octicons/pencil-ai-16", + "octicons/pencil-ai-24", + "octicons/people-16", + "octicons/people-24", + "octicons/person-16", + "octicons/person-24", + "octicons/person-add-16", + "octicons/person-add-24", + "octicons/person-fill-16", + "octicons/person-fill-24", + "octicons/pin-16", + "octicons/pin-24", + "octicons/pin-slash-16", + "octicons/pin-slash-24", + "octicons/pivot-column-16", + "octicons/pivot-column-24", + "octicons/play-16", + "octicons/play-24", + "octicons/plug-16", + "octicons/plug-24", + "octicons/plus-16", + "octicons/plus-24", + "octicons/plus-circle-16", + "octicons/plus-circle-24", + "octicons/project-16", + "octicons/project-24", + "octicons/project-roadmap-16", + "octicons/project-roadmap-24", + "octicons/project-symlink-16", + "octicons/project-symlink-24", + "octicons/project-template-16", + "octicons/project-template-24", + "octicons/pulse-16", + "octicons/pulse-24", + "octicons/question-16", + "octicons/question-24", + "octicons/quote-16", + "octicons/quote-24", + "octicons/read-16", + "octicons/read-24", + "octicons/redo-16", + "octicons/redo-24", + "octicons/rel-file-path-16", + "octicons/rel-file-path-24", + "octicons/reply-16", + "octicons/reply-24", + "octicons/repo-16", + "octicons/repo-24", + "octicons/repo-clone-16", + "octicons/repo-clone-24", + "octicons/repo-delete-24", + "octicons/repo-deleted-16", + "octicons/repo-forked-16", + "octicons/repo-forked-24", + "octicons/repo-locked-16", + "octicons/repo-locked-24", + "octicons/repo-pull-16", + "octicons/repo-pull-24", + "octicons/repo-push-16", + "octicons/repo-push-24", + "octicons/repo-template-16", + "octicons/repo-template-24", + "octicons/report-16", + "octicons/report-24", + "octicons/rocket-16", + "octicons/rocket-24", + "octicons/rows-16", + "octicons/rows-24", + "octicons/rss-16", + "octicons/rss-24", + "octicons/ruby-16", + "octicons/ruby-24", + "octicons/screen-full-16", + "octicons/screen-full-24", + "octicons/screen-normal-16", + "octicons/screen-normal-24", + "octicons/search-16", + "octicons/search-24", + "octicons/server-16", + "octicons/server-24", + "octicons/share-16", + "octicons/share-24", + "octicons/share-android-16", + "octicons/share-android-24", + "octicons/shield-16", + "octicons/shield-24", + "octicons/shield-check-16", + "octicons/shield-check-24", + "octicons/shield-lock-16", + "octicons/shield-lock-24", + "octicons/shield-slash-16", + "octicons/shield-slash-24", + "octicons/shield-x-16", + "octicons/shield-x-24", + "octicons/sidebar-collapse-16", + "octicons/sidebar-collapse-24", + "octicons/sidebar-expand-16", + "octicons/sidebar-expand-24", + "octicons/sign-in-16", + "octicons/sign-in-24", + "octicons/sign-out-16", + "octicons/sign-out-24", + "octicons/single-select-16", + "octicons/single-select-24", + "octicons/skip-16", + "octicons/skip-24", + "octicons/skip-fill-16", + "octicons/skip-fill-24", + "octicons/sliders-16", + "octicons/sliders-24", + "octicons/smiley-16", + "octicons/smiley-24", + "octicons/smiley-frown-16", + "octicons/smiley-frown-24", + "octicons/smiley-frustrated-16", + "octicons/smiley-frustrated-24", + "octicons/smiley-grin-16", + "octicons/smiley-grin-24", + "octicons/smiley-neutral-16", + "octicons/smiley-neutral-24", + "octicons/sort-asc-16", + "octicons/sort-asc-24", + "octicons/sort-desc-16", + "octicons/sort-desc-24", + "octicons/space-16", + "octicons/space-24", + "octicons/spacing-large-16", + "octicons/spacing-large-24", + "octicons/spacing-medium-16", + "octicons/spacing-medium-24", + "octicons/spacing-small-16", + "octicons/spacing-small-24", + "octicons/sparkle-16", + "octicons/sparkle-24", + "octicons/sparkle-fill-16", + "octicons/sparkle-fill-24", + "octicons/sparkles-fill-16", + "octicons/sparkles-fill-24", + "octicons/split-view-16", + "octicons/split-view-24", + "octicons/sponsor-tiers-16", + "octicons/sponsor-tiers-24", + "octicons/square-16", + "octicons/square-24", + "octicons/square-circle-16", + "octicons/square-circle-24", + "octicons/square-fill-16", + "octicons/square-fill-24", + "octicons/squirrel-16", + "octicons/squirrel-24", + "octicons/stack-16", + "octicons/stack-24", + "octicons/star-16", + "octicons/star-24", + "octicons/star-fill-16", + "octicons/star-fill-24", + "octicons/stop-16", + "octicons/stop-24", + "octicons/stopwatch-16", + "octicons/stopwatch-24", + "octicons/strikethrough-16", + "octicons/strikethrough-24", + "octicons/sun-16", + "octicons/sun-24", + "octicons/sync-16", + "octicons/sync-24", + "octicons/tab-16", + "octicons/tab-24", + "octicons/tab-external-16", + "octicons/tab-external-24", + "octicons/table-16", + "octicons/table-24", + "octicons/tag-16", + "octicons/tag-24", + "octicons/tasklist-16", + "octicons/tasklist-24", + "octicons/telescope-16", + "octicons/telescope-24", + "octicons/telescope-fill-16", + "octicons/telescope-fill-24", + "octicons/terminal-16", + "octicons/terminal-24", + "octicons/three-bars-16", + "octicons/three-bars-24", + "octicons/thumbsdown-16", + "octicons/thumbsdown-24", + "octicons/thumbsup-16", + "octicons/thumbsup-24", + "octicons/tools-16", + "octicons/tools-24", + "octicons/tracked-by-closed-completed-16", + "octicons/tracked-by-closed-completed-24", + "octicons/tracked-by-closed-not-planned-16", + "octicons/tracked-by-closed-not-planned-24", + "octicons/trash-16", + "octicons/trash-24", + "octicons/triangle-down-16", + "octicons/triangle-down-24", + "octicons/triangle-left-16", + "octicons/triangle-left-24", + "octicons/triangle-right-16", + "octicons/triangle-right-24", + "octicons/triangle-up-16", + "octicons/triangle-up-24", + "octicons/trophy-16", + "octicons/trophy-24", + "octicons/typography-16", + "octicons/typography-24", + "octicons/undo-16", + "octicons/undo-24", + "octicons/unfold-16", + "octicons/unfold-24", + "octicons/unlink-16", + "octicons/unlink-24", + "octicons/unlock-16", + "octicons/unlock-24", + "octicons/unmute-16", + "octicons/unmute-24", + "octicons/unread-16", + "octicons/unread-24", + "octicons/unverified-16", + "octicons/unverified-24", + "octicons/unwrap-16", + "octicons/unwrap-24", + "octicons/upload-16", + "octicons/upload-24", + "octicons/verified-16", + "octicons/verified-24", + "octicons/versions-16", + "octicons/versions-24", + "octicons/video-16", + "octicons/video-24", + "octicons/vscode-16", + "octicons/vscode-32", + "octicons/vscode-48", + "octicons/webhook-16", + "octicons/workflow-16", + "octicons/workflow-24", + "octicons/wrap-16", + "octicons/wrap-24", + "octicons/x-12", + "octicons/x-16", + "octicons/x-24", + "octicons/x-circle-16", + "octicons/x-circle-24", + "octicons/x-circle-fill-12", + "octicons/x-circle-fill-16", + "octicons/x-circle-fill-24", + "octicons/zap-16", + "octicons/zap-24", + "octicons/zoom-in-16", + "octicons/zoom-in-24", + "octicons/zoom-out-16", + "octicons/zoom-out-24", + "simple/1001tracklists", + "simple/1and1", + "simple/1dot1dot1dot1", + "simple/1panel", + "simple/1password", + "simple/2fas", + "simple/2k", + "simple/30secondsofcode", + "simple/365datascience", + "simple/3m", + "simple/42", + "simple/4chan", + "simple/4d", + "simple/500px", + "simple/7zip", + "simple/99designs", + "simple/9gag", + "simple/abb", + "simple/abbott", + "simple/abbvie", + "simple/abdownloadmanager", + "simple/aboutdotme", + "simple/abstract", + "simple/abusedotch", + "simple/academia", + "simple/accenture", + "simple/accusoft", + "simple/accuweather", + "simple/acer", + "simple/acm", + "simple/acode", + "simple/actigraph", + "simple/activeloop", + "simple/activision", + "simple/activitypub", + "simple/actix", + "simple/actualbudget", + "simple/acura", + "simple/ada", + "simple/adafruit", + "simple/adaway", + "simple/adblock", + "simple/adblockplus", + "simple/addydotio", + "simple/adguard", + "simple/adidas", + "simple/adminer", + "simple/adonisjs", + "simple/adp", + "simple/adroll", + "simple/adventofcode", + "simple/adyen", + "simple/aegisauthenticator", + "simple/aeroflot", + "simple/aeromexico", + "simple/afdian", + "simple/affine", + "simple/aframe", + "simple/afterpay", + "simple/aftership", + "simple/agora", + "simple/aib", + "simple/aidungeon", + "simple/aiohttp", + "simple/aiqfome", + "simple/airasia", + "simple/airbnb", + "simple/airbrake", + "simple/airbus", + "simple/airbyte", + "simple/aircall", + "simple/aircanada", + "simple/airchina", + "simple/airfrance", + "simple/airindia", + "simple/airplayaudio", + "simple/airplayvideo", + "simple/airserbia", + "simple/airtable", + "simple/airtel", + "simple/airtransat", + "simple/ajv", + "simple/akamai", + "simple/akasaair", + "simple/akaunting", + "simple/akiflow", + "simple/alacritty", + "simple/alamy", + "simple/albertheijn", + "simple/alby", + "simple/alchemy", + "simple/aldinord", + "simple/aldisud", + "simple/alfred", + "simple/algolia", + "simple/algorand", + "simple/alibabacloud", + "simple/alibabadotcom", + "simple/alienware", + "simple/aliexpress", + "simple/alipay", + "simple/alist", + "simple/allegro", + "simple/alliedmodders", + "simple/alltrails", + "simple/almalinux", + "simple/alpinedotjs", + "simple/alpinelinux", + "simple/alternativeto", + "simple/alwaysdata", + "simple/amd", + "simple/ameba", + "simple/americanairlines", + "simple/americanexpress", + "simple/amg", + "simple/amp", + "simple/amul", + "simple/ana", + "simple/anaconda", + "simple/analogue", + "simple/andela", + "simple/android", + "simple/androidauto", + "simple/androidstudio", + "simple/angular", + "simple/anilist", + "simple/animalplanet", + "simple/animedotjs", + "simple/ankermake", + "simple/anki", + "simple/ansible", + "simple/answer", + "simple/ansys", + "simple/anta", + "simple/antdesign", + "simple/antena3", + "simple/antennapod", + "simple/anthropic", + "simple/antv", + "simple/anycubic", + "simple/anydesk", + "simple/anytype", + "simple/apache", + "simple/apacheairflow", + "simple/apacheant", + "simple/apacheavro", + "simple/apachecassandra", + "simple/apachecloudstack", + "simple/apachecordova", + "simple/apachecouchdb", + "simple/apachedolphinscheduler", + "simple/apachedoris", + "simple/apachedruid", + "simple/apacheecharts", + "simple/apacheflink", + "simple/apachefreemarker", + "simple/apachegroovy", + "simple/apacheguacamole", + "simple/apachehadoop", + "simple/apachehbase", + "simple/apachehive", + "simple/apachejmeter", + "simple/apachekafka", + "simple/apachekylin", + "simple/apachelucene", + "simple/apachemaven", + "simple/apachenetbeanside", + "simple/apachenifi", + "simple/apacheopenoffice", + "simple/apacheparquet", + "simple/apachepulsar", + "simple/apacherocketmq", + "simple/apachesolr", + "simple/apachespark", + "simple/apachestorm", + "simple/apachesuperset", + "simple/apachetomcat", + "simple/aparat", + "simple/apifox", + "simple/apmterminals", + "simple/apollographql", + "simple/apostrophe", + "simple/appgallery", + "simple/appian", + "simple/appimage", + "simple/appium", + "simple/apple", + "simple/applearcade", + "simple/applemusic", + "simple/applenews", + "simple/applepay", + "simple/applepodcasts", + "simple/appletv", + "simple/appmanager", + "simple/appsignal", + "simple/appsmith", + "simple/appstore", + "simple/appveyor", + "simple/appwrite", + "simple/aqua", + "simple/aral", + "simple/arangodb", + "simple/arc", + "simple/arcgis", + "simple/archicad", + "simple/archiveofourown", + "simple/archlinux", + "simple/ardour", + "simple/arduino", + "simple/argo", + "simple/argos", + "simple/ariakit", + "simple/arkecosystem", + "simple/arlo", + "simple/arm", + "simple/armkeil", + "simple/arstechnica", + "simple/artifacthub", + "simple/artixlinux", + "simple/artstation", + "simple/arxiv", + "simple/asahilinux", + "simple/asana", + "simple/asciidoctor", + "simple/asciinema", + "simple/asda", + "simple/aseprite", + "simple/assemblyscript", + "simple/asterisk", + "simple/astonmartin", + "simple/astra", + "simple/astral", + "simple/astro", + "simple/asus", + "simple/atandt", + "simple/atari", + "simple/atlasos", + "simple/atlassian", + "simple/auchan", + "simple/audacity", + "simple/audi", + "simple/audible", + "simple/audiobookshelf", + "simple/audioboom", + "simple/audiomack", + "simple/audiotechnica", + "simple/aurelia", + "simple/autentique", + "simple/auth0", + "simple/authelia", + "simple/authentik", + "simple/autocad", + "simple/autocannon", + "simple/autodesk", + "simple/autodeskmaya", + "simple/autodeskrevit", + "simple/autohotkey", + "simple/autoit", + "simple/automattic", + "simple/autoprefixer", + "simple/autozone", + "simple/avajs", + "simple/avaloniaui", + "simple/avast", + "simple/avianca", + "simple/avira", + "simple/avm", + "simple/awesomelists", + "simple/awesomewm", + "simple/awwwards", + "simple/axios", + "simple/axisbank", + "simple/b4x", + "simple/babel", + "simple/babelio", + "simple/babylondotjs", + "simple/backblaze", + "simple/backbone", + "simple/backbonedotjs", + "simple/backendless", + "simple/backstage", + "simple/backstage_casting", + "simple/badoo", + "simple/baidu", + "simple/bakalari", + "simple/bamboo", + "simple/bambulab", + "simple/bandcamp", + "simple/bandlab", + "simple/bandrautomation", + "simple/bandsintown", + "simple/bankofamerica", + "simple/barclays", + "simple/baremetrics", + "simple/barmenia", + "simple/basecamp", + "simple/baserow", + "simple/basicattentiontoken", + "simple/bastyon", + "simple/bat", + "simple/bata", + "simple/battledotnet", + "simple/bazel", + "simple/beatport", + "simple/beats", + "simple/beatsbydre", + "simple/beatstars", + "simple/beekeeperstudio", + "simple/behance", + "simple/beijingsubway", + "simple/bem", + "simple/bentley", + "simple/bento", + "simple/bentobox", + "simple/bentoml", + "simple/bereal", + "simple/betfair", + "simple/betterauth", + "simple/betterdiscord", + "simple/betterstack", + "simple/bevy", + "simple/bigbasket", + "simple/bigbluebutton", + "simple/bigcartel", + "simple/bigcommerce", + "simple/bilibili", + "simple/billboard", + "simple/bim", + "simple/binance", + "simple/bioconductor", + "simple/biolink", + "simple/biome", + "simple/bisecthosting", + "simple/bit", + "simple/bitbucket", + "simple/bitcoin", + "simple/bitcoincash", + "simple/bitcoinsv", + "simple/bitcomet", + "simple/bitdefender", + "simple/bitly", + "simple/bitrise", + "simple/bittorrent", + "simple/bitwarden", + "simple/bitwig", + "simple/black", + "simple/blackberry", + "simple/blackmagicdesign", + "simple/blazemeter", + "simple/blazor", + "simple/blender", + "simple/blibli", + "simple/blockbench", + "simple/blockchaindotcom", + "simple/blogger", + "simple/bloglovin", + "simple/blueprint", + "simple/bluesky", + "simple/bluesound", + "simple/bluetooth", + "simple/bmcsoftware", + "simple/bmw", + "simple/bnbchain", + "simple/boardgamegeek", + "simple/boat", + "simple/boehringeringelheim", + "simple/boeing", + "simple/bohemiainteractive", + "simple/bombardier", + "simple/bookalope", + "simple/bookbub", + "simple/bookingdotcom", + "simple/bookmeter", + "simple/bookmyshow", + "simple/bookstack", + "simple/boost", + "simple/boosty", + "simple/boots", + "simple/bootstrap", + "simple/borgbackup", + "simple/bosch", + "simple/bose", + "simple/botblecms", + "simple/boulanger", + "simple/bower", + "simple/box", + "simple/boxysvg", + "simple/braintree", + "simple/braintrust", + "simple/brandfetch", + "simple/brandfolder", + "simple/brave", + "simple/breaker", + "simple/brenntag", + "simple/brevo", + "simple/brex", + "simple/bricks", + "simple/britishairways", + "simple/broadcom", + "simple/bruno", + "simple/bsd", + "simple/bspwm", + "simple/bt", + "simple/buddy", + "simple/budibase", + "simple/buefy", + "simple/buffer", + "simple/bugatti", + "simple/bugcrowd", + "simple/buhl", + "simple/buildkite", + "simple/builtbybit", + "simple/bukalapak", + "simple/bulma", + "simple/bun", + "simple/bungie", + "simple/bunnydotnet", + "simple/bunq", + "simple/burgerking", + "simple/burpsuite", + "simple/burton", + "simple/buymeacoffee", + "simple/buysellads", + "simple/buzzfeed", + "simple/bvg", + "simple/byjus", + "simple/bytedance", + "simple/c", + "simple/cachet", + "simple/caddy", + "simple/cadillac", + "simple/cafepress", + "simple/cairographics", + "simple/cairometro", + "simple/caixabank", + "simple/cakephp", + "simple/caldotcom", + "simple/calendly", + "simple/calibreweb", + "simple/campaignmonitor", + "simple/camunda", + "simple/canonical", + "simple/canvas", + "simple/capacitor", + "simple/caprover", + "simple/cardano", + "simple/cardmarket", + "simple/carlsberggroup", + "simple/carrd", + "simple/carrefour", + "simple/carthrottle", + "simple/carto", + "simple/cashapp", + "simple/castbox", + "simple/castorama", + "simple/castro", + "simple/caterpillar", + "simple/cbc", + "simple/cbs", + "simple/ccc", + "simple/ccleaner", + "simple/cdprojekt", + "simple/ce", + "simple/celery", + "simple/celestron", + "simple/centos", + "simple/ceph", + "simple/cesium", + "simple/chai", + "simple/chainguard", + "simple/chainlink", + "simple/chakraui", + "simple/changedetection", + "simple/channel4", + "simple/charles", + "simple/chartdotjs", + "simple/chartmogul", + "simple/chase", + "simple/chatbot", + "simple/chatwoot", + "simple/checkio", + "simple/checkmarx", + "simple/checkmk", + "simple/chedraui", + "simple/cheerio", + "simple/chef", + "simple/chemex", + "simple/chessdotcom", + "simple/chevrolet", + "simple/chianetwork", + "simple/chinaeasternairlines", + "simple/chinasouthernairlines", + "simple/chocolatey", + "simple/chromatic", + "simple/chromewebstore", + "simple/chrysler", + "simple/chupachups", + "simple/cilium", + "simple/cinema4d", + "simple/cinnamon", + "simple/circle", + "simple/circleci", + "simple/circuitverse", + "simple/cirrusci", + "simple/cisco", + "simple/citrix", + "simple/citroen", + "simple/civicrm", + "simple/civo", + "simple/clarifai", + "simple/claris", + "simple/clarivate", + "simple/claude", + "simple/clerk", + "simple/clevercloud", + "simple/clickhouse", + "simple/clickup", + "simple/clion", + "simple/clockify", + "simple/clojure", + "simple/cloud66", + "simple/cloudbees", + "simple/cloudcannon", + "simple/cloudera", + "simple/cloudflare", + "simple/cloudflarepages", + "simple/cloudflareworkers", + "simple/cloudfoundry", + "simple/cloudinary", + "simple/cloudnativebuild", + "simple/cloudron", + "simple/cloudsmith", + "simple/cloudways", + "simple/clubforce", + "simple/clubhouse", + "simple/clyp", + "simple/cmake", + "simple/cncf", + "simple/cnes", + "simple/cnet", + "simple/cnn", + "simple/cobalt", + "simple/cocacola", + "simple/cockpit", + "simple/cockroachlabs", + "simple/cocoapods", + "simple/cocos", + "simple/coda", + "simple/codacy", + "simple/codeberg", + "simple/codeblocks", + "simple/codecademy", + "simple/codeceptjs", + "simple/codechef", + "simple/codeclimate", + "simple/codecov", + "simple/codecrafters", + "simple/codefactor", + "simple/codeforces", + "simple/codefresh", + "simple/codeigniter", + "simple/codemagic", + "simple/codementor", + "simple/codemirror", + "simple/codenewbie", + "simple/codeproject", + "simple/coder", + "simple/coderabbit", + "simple/codersrank", + "simple/coderwall", + "simple/codesandbox", + "simple/codeship", + "simple/codesignal", + "simple/codestream", + "simple/codewars", + "simple/codingame", + "simple/codingninjas", + "simple/codio", + "simple/coffeescript", + "simple/coggle", + "simple/coinbase", + "simple/coinmarketcap", + "simple/collaboraonline", + "simple/comicfury", + "simple/comma", + "simple/commerzbank", + "simple/commitlint", + "simple/commodore", + "simple/commonlisp", + "simple/commonworkflowlanguage", + "simple/compilerexplorer", + "simple/composer", + "simple/comptia", + "simple/comsol", + "simple/conan", + "simple/concourse", + "simple/condaforge", + "simple/conekta", + "simple/confluence", + "simple/construct3", + "simple/consul", + "simple/contabo", + "simple/contactlesspayment", + "simple/containerd", + "simple/contao", + "simple/contentful", + "simple/contentstack", + "simple/continente", + "simple/contributorcovenant", + "simple/conventionalcommits", + "simple/convertio", + "simple/cookiecutter", + "simple/coolermaster", + "simple/coolify", + "simple/coop", + "simple/copaairlines", + "simple/coppel", + "simple/cora", + "simple/coreldraw", + "simple/coronaengine", + "simple/coronarenderer", + "simple/corsair", + "simple/couchbase", + "simple/counterstrike", + "simple/countingworkspro", + "simple/coursera", + "simple/coveralls", + "simple/coze", + "simple/cpanel", + "simple/cplusplus", + "simple/cplusplusbuilder", + "simple/craftcms", + "simple/craftsman", + "simple/cratedb", + "simple/crayon", + "simple/creality", + "simple/createreactapp", + "simple/creativecommons", + "simple/creativetechnology", + "simple/credly", + "simple/crehana", + "simple/crewai", + "simple/crewunited", + "simple/criticalrole", + "simple/crowdin", + "simple/crowdsource", + "simple/crunchbase", + "simple/crunchyroll", + "simple/cryengine", + "simple/cryptomator", + "simple/cryptpad", + "simple/crystal", + "simple/csdn", + "simple/css", + "simple/cssdesignawards", + "simple/cssmodules", + "simple/csswizardry", + "simple/cts", + "simple/cucumber", + "simple/cultura", + "simple/curl", + "simple/curseforge", + "simple/cursor", + "simple/customink", + "simple/cyberdefenders", + "simple/cycling74", + "simple/cypress", + "simple/cytoscapedotjs", + "simple/d", + "simple/d3", + "simple/dacia", + "simple/daf", + "simple/dailydotdev", + "simple/dailymotion", + "simple/daisyui", + "simple/dapr", + "simple/darkreader", + "simple/dart", + "simple/darty", + "simple/daserste", + "simple/dash", + "simple/dash0", + "simple/dashlane", + "simple/dask", + "simple/dassaultsystemes", + "simple/databricks", + "simple/datacamp", + "simple/datadog", + "simple/datadotai", + "simple/datagrip", + "simple/dataiku", + "simple/datastax", + "simple/datefns", + "simple/datev", + "simple/datocms", + "simple/datto", + "simple/davinciresolve", + "simple/dazhongdianping", + "simple/dazn", + "simple/dbeaver", + "simple/dblp", + "simple/dcentertainment", + "simple/debian", + "simple/debridlink", + "simple/decapcms", + "simple/decentraland", + "simple/dedge", + "simple/deepcool", + "simple/deepgram", + "simple/deepin", + "simple/deepl", + "simple/deepmind", + "simple/deepnote", + "simple/deliveroo", + "simple/dell", + "simple/delonghi", + "simple/delphi", + "simple/delta", + "simple/deluge", + "simple/deno", + "simple/denon", + "simple/dependabot", + "simple/dependencycheck", + "simple/depositphotos", + "simple/derspiegel", + "simple/deutschebahn", + "simple/deutschebank", + "simple/deutschepost", + "simple/deutschetelekom", + "simple/deutschewelle", + "simple/devbox", + "simple/devdotto", + "simple/devexpress", + "simple/deviantart", + "simple/devpost", + "simple/devrant", + "simple/dgraph", + "simple/dhl", + "simple/diagramsdotnet", + "simple/dialogflow", + "simple/diaspora", + "simple/dictionarydotcom", + "simple/digg", + "simple/digikeyelectronics", + "simple/digitalocean", + "simple/dinersclub", + "simple/dior", + "simple/directus", + "simple/discogs", + "simple/discord", + "simple/discorddotjs", + "simple/discourse", + "simple/discover", + "simple/disqus", + "simple/disroot", + "simple/distrobox", + "simple/distrokid", + "simple/django", + "simple/dji", + "simple/dlib", + "simple/dlna", + "simple/dm", + "simple/dmm", + "simple/docker", + "simple/docsdotrs", + "simple/docsify", + "simple/doctrine", + "simple/docusaurus", + "simple/dodopayments", + "simple/dogecoin", + "simple/doi", + "simple/dolby", + "simple/dolibarr", + "simple/dolphin", + "simple/doordash", + "simple/dota2", + "simple/dotenv", + "simple/dotnet", + "simple/douban", + "simple/doubanread", + "simple/dovecot", + "simple/dovetail", + "simple/downdetector", + "simple/doxygen", + "simple/dpd", + "simple/dragonframe", + "simple/draugiemdotlv", + "simple/dreamstime", + "simple/dribbble", + "simple/drizzle", + "simple/drone", + "simple/drooble", + "simple/dropbox", + "simple/drupal", + "simple/dsautomobiles", + "simple/dts", + "simple/dtube", + "simple/ducati", + "simple/duckdb", + "simple/duckduckgo", + "simple/dungeonsanddragons", + "simple/dunked", + "simple/dunzo", + "simple/duolingo", + "simple/duplicati", + "simple/dvc", + "simple/dwavesystems", + "simple/dwm", + "simple/dynatrace", + "simple/e", + "simple/e3", + "simple/ea", + "simple/eac", + "simple/eagle", + "simple/easyeda", + "simple/easyjet", + "simple/ebay", + "simple/ebox", + "simple/eclipseadoptium", + "simple/eclipseche", + "simple/eclipseide", + "simple/eclipsejetty", + "simple/eclipsemosquitto", + "simple/eclipsevertdotx", + "simple/ecosia", + "simple/ecovacs", + "simple/edeka", + "simple/edgeimpulse", + "simple/editorconfig", + "simple/edotleclerc", + "simple/educative", + "simple/edx", + "simple/egghead", + "simple/egnyte", + "simple/eight", + "simple/eightsleep", + "simple/ejs", + "simple/elastic", + "simple/elasticcloud", + "simple/elasticsearch", + "simple/elasticstack", + "simple/elavon", + "simple/electron", + "simple/electronbuilder", + "simple/electronfiddle", + "simple/elegoo", + "simple/element", + "simple/elementary", + "simple/elementor", + "simple/elevenlabs", + "simple/eleventy", + "simple/elgato", + "simple/elixir", + "simple/elk", + "simple/elm", + "simple/elsevier", + "simple/embarcadero", + "simple/embark", + "simple/emberdotjs", + "simple/emby", + "simple/emirates", + "simple/emlakjet", + "simple/endeavouros", + "simple/enpass", + "simple/ens", + "simple/ente", + "simple/enterprisedb", + "simple/envato", + "simple/envoyproxy", + "simple/epel", + "simple/epicgames", + "simple/epson", + "simple/equinixmetal", + "simple/eraser", + "simple/ericsson", + "simple/erlang", + "simple/erpnext", + "simple/esbuild", + "simple/esea", + "simple/eslgaming", + "simple/eslint", + "simple/esotericsoftware", + "simple/esphome", + "simple/espressif", + "simple/esri", + "simple/etcd", + "simple/ethereum", + "simple/ethers", + "simple/ethiopianairlines", + "simple/etihadairways", + "simple/etsy", + "simple/europeanunion", + "simple/eventstore", + "simple/evernote", + "simple/everydotorg", + "simple/excalidraw", + "simple/exercism", + "simple/exordo", + "simple/exoscale", + "simple/expedia", + "simple/expensify", + "simple/expertsexchange", + "simple/expo", + "simple/express", + "simple/expressdotcom", + "simple/expressvpn", + "simple/eyeem", + "simple/f1", + "simple/f5", + "simple/facebook", + "simple/facebookgaming", + "simple/facebooklive", + "simple/faceit", + "simple/facepunch", + "simple/fairphone", + "simple/falco", + "simple/falcon", + "simple/fampay", + "simple/fandango", + "simple/fandom", + "simple/fanfou", + "simple/fantom", + "simple/farcaster", + "simple/fareharbor", + "simple/farfetch", + "simple/fastapi", + "simple/fastify", + "simple/fastlane", + "simple/fastly", + "simple/fathom", + "simple/fauna", + "simple/favro", + "simple/fcc", + "simple/fdroid", + "simple/fedex", + "simple/fedora", + "simple/feedly", + "simple/ferrari", + "simple/ferrarinv", + "simple/ferretdb", + "simple/ffmpeg", + "simple/fi", + "simple/fiat", + "simple/fidoalliance", + "simple/fifa", + "simple/fig", + "simple/figma", + "simple/figshare", + "simple/fila", + "simple/filament", + "simple/filedotio", + "simple/filen", + "simple/files", + "simple/filezilla", + "simple/fineco", + "simple/fing", + "simple/firebase", + "simple/firefish", + "simple/fireflyiii", + "simple/firefox", + "simple/firefoxbrowser", + "simple/fireship", + "simple/firewalla", + "simple/first", + "simple/fishaudio", + "simple/fishshell", + "simple/fitbit", + "simple/fivem", + "simple/fiverr", + "simple/fizz", + "simple/flashforge", + "simple/flask", + "simple/flat", + "simple/flathub", + "simple/flatpak", + "simple/flickr", + "simple/flightaware", + "simple/flipboard", + "simple/floatplane", + "simple/flood", + "simple/floorp", + "simple/fluentbit", + "simple/fluentd", + "simple/fluke", + "simple/flutter", + "simple/flux", + "simple/flydotio", + "simple/flyway", + "simple/fmod", + "simple/fnac", + "simple/folium", + "simple/folo", + "simple/fonoma", + "simple/fontawesome", + "simple/fontbase", + "simple/fontforge", + "simple/foobar2000", + "simple/foodpanda", + "simple/ford", + "simple/forgejo", + "simple/formbricks", + "simple/formik", + "simple/formspree", + "simple/formstack", + "simple/fortinet", + "simple/fortnite", + "simple/fortran", + "simple/fossa", + "simple/fossilscm", + "simple/foundryvirtualtabletop", + "simple/foursquare", + "simple/fox", + "simple/foxtel", + "simple/fozzy", + "simple/framer", + "simple/framework", + "simple/framework7", + "simple/franprix", + "simple/frappe", + "simple/fraunhofergesellschaft", + "simple/freebsd", + "simple/freecad", + "simple/freecodecamp", + "simple/freedesktopdotorg", + "simple/freelancer", + "simple/freelancermap", + "simple/freenas", + "simple/freenet", + "simple/freepik", + "simple/freetube", + "simple/fresh", + "simple/freshrss", + "simple/frigate", + "simple/fritz", + "simple/frontendmentor", + "simple/frontify", + "simple/fsharp", + "simple/fubo", + "simple/fueler", + "simple/fugacloud", + "simple/fujifilm", + "simple/fujitsu", + "simple/furaffinity", + "simple/furrynetwork", + "simple/fusionauth", + "simple/futurelearn", + "simple/fyle", + "simple/g2", + "simple/g2a", + "simple/g2g", + "simple/galaxus", + "simple/gamebanana", + "simple/gamedeveloper", + "simple/gamejolt", + "simple/gameloft", + "simple/gamemaker", + "simple/gamescience", + "simple/gandi", + "simple/garmin", + "simple/garudalinux", + "simple/gatling", + "simple/gatsby", + "simple/gcore", + "simple/gdal", + "simple/geeksforgeeks", + "simple/generalelectric", + "simple/generalmotors", + "simple/genius", + "simple/gentoo", + "simple/geocaching", + "simple/geode", + "simple/geopandas", + "simple/gerrit", + "simple/getx", + "simple/ghost", + "simple/ghostery", + "simple/ghostty", + "simple/gimp", + "simple/gin", + "simple/giphy", + "simple/git", + "simple/gitbook", + "simple/gitcode", + "simple/gitconnected", + "simple/gitea", + "simple/gitee", + "simple/gitextensions", + "simple/gitforwindows", + "simple/github", + "simple/githubactions", + "simple/githubcopilot", + "simple/githubpages", + "simple/githubsponsors", + "simple/gitignoredotio", + "simple/gitkraken", + "simple/gitlab", + "simple/gitlfs", + "simple/gitpod", + "simple/gitter", + "simple/glance", + "simple/glassdoor", + "simple/gldotinet", + "simple/gleam", + "simple/glide", + "simple/glitch", + "simple/globus", + "simple/glovo", + "simple/gltf", + "simple/gmail", + "simple/gmx", + "simple/gnome", + "simple/gnometerminal", + "simple/gnu", + "simple/gnubash", + "simple/gnuemacs", + "simple/gnuicecat", + "simple/gnuprivacyguard", + "simple/gnusocial", + "simple/go", + "simple/gocd", + "simple/godaddy", + "simple/godotengine", + "simple/gofundme", + "simple/gogdotcom", + "simple/gojek", + "simple/goland", + "simple/goldmansachs", + "simple/goodreads", + "simple/google", + "simple/googleadmob", + "simple/googleads", + "simple/googleadsense", + "simple/googleanalytics", + "simple/googleappsscript", + "simple/googleassistant", + "simple/googleauthenticator", + "simple/googlebigquery", + "simple/googlebigtable", + "simple/googlecalendar", + "simple/googlecampaignmanager360", + "simple/googlecardboard", + "simple/googlecast", + "simple/googlechat", + "simple/googlechrome", + "simple/googlechronicle", + "simple/googleclassroom", + "simple/googlecloud", + "simple/googlecloudcomposer", + "simple/googlecloudspanner", + "simple/googlecloudstorage", + "simple/googlecolab", + "simple/googlecontaineroptimizedos", + "simple/googledataflow", + "simple/googledataproc", + "simple/googledisplayandvideo360", + "simple/googledocs", + "simple/googledrive", + "simple/googleearth", + "simple/googleearthengine", + "simple/googlefonts", + "simple/googleforms", + "simple/googlegemini", + "simple/googlehome", + "simple/googlekeep", + "simple/googlelens", + "simple/googlemaps", + "simple/googlemarketingplatform", + "simple/googlemeet", + "simple/googlemessages", + "simple/googlenearby", + "simple/googlenews", + "simple/googlepay", + "simple/googlephotos", + "simple/googleplay", + "simple/googlepubsub", + "simple/googlescholar", + "simple/googlesearchconsole", + "simple/googlesheets", + "simple/googleslides", + "simple/googlestreetview", + "simple/googlesummerofcode", + "simple/googletagmanager", + "simple/googletasks", + "simple/googletranslate", + "simple/googletv", + "simple/gotomeeting", + "simple/gplv3", + "simple/grab", + "simple/gradio", + "simple/gradle", + "simple/gradleplaypublisher", + "simple/grafana", + "simple/grammarly", + "simple/grandfrais", + "simple/grapheneos", + "simple/graphite", + "simple/graphql", + "simple/grav", + "simple/gravatar", + "simple/graylog", + "simple/greasyfork", + "simple/greatlearning", + "simple/greenhouse", + "simple/greensock", + "simple/greptimedb", + "simple/griddotai", + "simple/gridsome", + "simple/grocy", + "simple/groupme", + "simple/groupon", + "simple/grunt", + "simple/gsap", + "simple/gsk", + "simple/gsma", + "simple/gsmarenadotcom", + "simple/gstreamer", + "simple/gtk", + "simple/guangzhoumetro", + "simple/guilded", + "simple/guitarpro", + "simple/gulp", + "simple/gumroad", + "simple/gumtree", + "simple/gunicorn", + "simple/gurobi", + "simple/gusto", + "simple/gutenberg", + "simple/h2database", + "simple/h3", + "simple/habr", + "simple/hackaday", + "simple/hackclub", + "simple/hackerearth", + "simple/hackernoon", + "simple/hackerone", + "simple/hackerrank", + "simple/hackster", + "simple/hackthebox", + "simple/hal", + "simple/handlebarsdotjs", + "simple/handm", + "simple/handshake", + "simple/handshake_protocol", + "simple/happycow", + "simple/harbor", + "simple/harmonyos", + "simple/hashcat", + "simple/hashicorp", + "simple/hashnode", + "simple/haskell", + "simple/hasura", + "simple/hatenabookmark", + "simple/haveibeenpwned", + "simple/havells", + "simple/haxe", + "simple/haystack", + "simple/hbo", + "simple/hbomax", + "simple/hcl", + "simple/hdfcbank", + "simple/headlessui", + "simple/headphonezone", + "simple/headspace", + "simple/hearth", + "simple/hearthisdotat", + "simple/hedera", + "simple/hedgedoc", + "simple/helium", + "simple/helix", + "simple/hellofresh", + "simple/hellyhansen", + "simple/helm", + "simple/helpdesk", + "simple/helpscout", + "simple/hepsiemlak", + "simple/here", + "simple/hermes", + "simple/heroicgameslauncher", + "simple/heroui", + "simple/hetzner", + "simple/hevy", + "simple/hexlet", + "simple/hexo", + "simple/hey", + "simple/hibernate", + "simple/hibob", + "simple/hilton", + "simple/hiltonhotelsandresorts", + "simple/hitachi", + "simple/hive", + "simple/hive_blockchain", + "simple/hivemq", + "simple/homarr", + "simple/homeadvisor", + "simple/homeassistant", + "simple/homeassistantcommunitystore", + "simple/homebrew", + "simple/homebridge", + "simple/homepage", + "simple/homify", + "simple/honda", + "simple/honey", + "simple/honeybadger", + "simple/honeygain", + "simple/hono", + "simple/honor", + "simple/hootsuite", + "simple/hoppscotch", + "simple/hostinger", + "simple/hotelsdotcom", + "simple/hotjar", + "simple/hotwire", + "simple/houdini", + "simple/houzz", + "simple/hp", + "simple/hsbc", + "simple/htc", + "simple/htcvive", + "simple/html5", + "simple/htmlacademy", + "simple/htmx", + "simple/htop", + "simple/httpie", + "simple/huawei", + "simple/hubspot", + "simple/huggingface", + "simple/hugo", + "simple/humblebundle", + "simple/humhub", + "simple/hungryjacks", + "simple/husqvarna", + "simple/hyper", + "simple/hyperskill", + "simple/hyperx", + "simple/hypothesis", + "simple/hyprland", + "simple/hyundai", + "simple/i18next", + "simple/i3", + "simple/iata", + "simple/ibeacon", + "simple/iberia", + "simple/iced", + "simple/iceland", + "simple/icicibank", + "simple/icinga", + "simple/icloud", + "simple/icomoon", + "simple/icon", + "simple/iconfinder", + "simple/iconify", + "simple/iconjar", + "simple/icons8", + "simple/icq", + "simple/ieee", + "simple/ifixit", + "simple/ifood", + "simple/ifttt", + "simple/igdb", + "simple/ign", + "simple/iheartradio", + "simple/ikea", + "simple/iledefrancemobilites", + "simple/ilovepdf", + "simple/imagedotsc", + "simple/imagej", + "simple/imdb", + "simple/imessage", + "simple/imgur", + "simple/immer", + "simple/immersivetranslate", + "simple/immich", + "simple/imou", + "simple/improvmx", + "simple/indeed", + "simple/indiansuperleague", + "simple/indiehackers", + "simple/indigo", + "simple/inductiveautomation", + "simple/inertia", + "simple/infiniti", + "simple/infinityfree", + "simple/influxdb", + "simple/infomaniak", + "simple/infoq", + "simple/infosys", + "simple/infracost", + "simple/ingress", + "simple/inkdrop", + "simple/inkscape", + "simple/inoreader", + "simple/inquirer", + "simple/insomnia", + "simple/inspire", + "simple/insta360", + "simple/instacart", + "simple/instagram", + "simple/instapaper", + "simple/instatus", + "simple/instructables", + "simple/instructure", + "simple/intel", + "simple/intellijidea", + "simple/interactiondesignfoundation", + "simple/interactjs", + "simple/interbase", + "simple/intercom", + "simple/intermarche", + "simple/internetarchive", + "simple/internetcomputer", + "simple/intigriti", + "simple/intuit", + "simple/invidious", + "simple/invoiceninja", + "simple/iobroker", + "simple/ionic", + "simple/ionos", + "simple/ios", + "simple/iota", + "simple/ipfs", + "simple/iris", + "simple/irobot", + "simple/isc2", + "simple/isro", + "simple/issuu", + "simple/istio", + "simple/itchdotio", + "simple/iterm2", + "simple/itunes", + "simple/itvx", + "simple/iveco", + "simple/jabber", + "simple/jaeger", + "simple/jameson", + "simple/jamstack", + "simple/japanairlines", + "simple/jasmine", + "simple/javascript", + "simple/jbl", + "simple/jcb", + "simple/jdoodle", + "simple/jeep", + "simple/jekyll", + "simple/jellyfin", + "simple/jenkins", + "simple/jest", + "simple/jet", + "simple/jetblue", + "simple/jetbrains", + "simple/jetpackcompose", + "simple/jfrog", + "simple/jfrogpipelines", + "simple/jhipster", + "simple/jinja", + "simple/jio", + "simple/jira", + "simple/jirasoftware", + "simple/jitpack", + "simple/jitsi", + "simple/johndeere", + "simple/joomla", + "simple/joplin", + "simple/jordan", + "simple/jouav", + "simple/jovian", + "simple/jpeg", + "simple/jquery", + "simple/jrgroup", + "simple/jsdelivr", + "simple/jsfiddle", + "simple/json", + "simple/jsonwebtokens", + "simple/jsr", + "simple/jss", + "simple/juce", + "simple/juejin", + "simple/juke", + "simple/julia", + "simple/junipernetworks", + "simple/junit5", + "simple/jupyter", + "simple/justeat", + "simple/justgiving", + "simple/k3s", + "simple/k6", + "simple/kaggle", + "simple/kagi", + "simple/kahoot", + "simple/kaios", + "simple/kakao", + "simple/kakaotalk", + "simple/kalilinux", + "simple/kamailio", + "simple/kando", + "simple/kaniko", + "simple/karlsruherverkehrsverbund", + "simple/kasasmart", + "simple/kashflow", + "simple/kaspersky", + "simple/katana", + "simple/kaufland", + "simple/kde", + "simple/kdeneon", + "simple/kdenlive", + "simple/kdeplasma", + "simple/kedro", + "simple/keenetic", + "simple/keepachangelog", + "simple/keepassxc", + "simple/keeper", + "simple/keeweb", + "simple/kenmei", + "simple/kentico", + "simple/keploy", + "simple/keras", + "simple/keybase", + "simple/keycdn", + "simple/keycloak", + "simple/keystone", + "simple/kfc", + "simple/khanacademy", + "simple/khronosgroup", + "simple/kia", + "simple/kibana", + "simple/kicad", + "simple/kick", + "simple/kickstarter", + "simple/kik", + "simple/kingstontechnology", + "simple/kinopoisk", + "simple/kinsta", + "simple/kirby", + "simple/kit", + "simple/kitsu", + "simple/kiwix", + "simple/klarna", + "simple/kleinanzeigen", + "simple/klm", + "simple/klook", + "simple/knative", + "simple/knexdotjs", + "simple/knime", + "simple/knip", + "simple/knowledgebase", + "simple/known", + "simple/koa", + "simple/koc", + "simple/kodak", + "simple/kodi", + "simple/koenigsegg", + "simple/kofax", + "simple/kofi", + "simple/komoot", + "simple/konami", + "simple/kong", + "simple/kongregate", + "simple/konva", + "simple/koreader", + "simple/kotlin", + "simple/koyeb", + "simple/kred", + "simple/krita", + "simple/ktm", + "simple/ktor", + "simple/kuaishou", + "simple/kubernetes", + "simple/kubespray", + "simple/kubuntu", + "simple/kucoin", + "simple/kueski", + "simple/kuma", + "simple/kununu", + "simple/kuula", + "simple/kx", + "simple/kyocera", + "simple/labex", + "simple/labview", + "simple/lada", + "simple/lamborghini", + "simple/langchain", + "simple/langflow", + "simple/langgraph", + "simple/languagetool", + "simple/lapce", + "simple/laragon", + "simple/laravel", + "simple/laravelhorizon", + "simple/laravelnova", + "simple/lastdotfm", + "simple/lastpass", + "simple/latex", + "simple/launchpad", + "simple/lazarus", + "simple/lazyvim", + "simple/lbry", + "simple/leaderprice", + "simple/leaflet", + "simple/leagueoflegends", + "simple/leanpub", + "simple/leetcode", + "simple/lefthook", + "simple/legacygames", + "simple/leica", + "simple/lemmy", + "simple/lemonsqueezy", + "simple/lenovo", + "simple/lens", + "simple/leptos", + "simple/lequipe", + "simple/lerna", + "simple/leroymerlin", + "simple/leslibraires", + "simple/less", + "simple/letsencrypt", + "simple/letterboxd", + "simple/levelsdotfyi", + "simple/lg", + "simple/liberadotchat", + "simple/liberapay", + "simple/librariesdotio", + "simple/librarything", + "simple/libreoffice", + "simple/libreofficebase", + "simple/libreofficecalc", + "simple/libreofficedraw", + "simple/libreofficeimpress", + "simple/libreofficemath", + "simple/libreofficewriter", + "simple/libretranslate", + "simple/libretube", + "simple/librewolf", + "simple/libuv", + "simple/lichess", + "simple/lidl", + "simple/lifx", + "simple/lightburn", + "simple/lighthouse", + "simple/lightning", + "simple/limesurvey", + "simple/line", + "simple/lineageos", + "simple/linear", + "simple/lining", + "simple/linkerd", + "simple/linkfire", + "simple/linksys", + "simple/linktree", + "simple/linphone", + "simple/lintcode", + "simple/linux", + "simple/linuxcontainers", + "simple/linuxfoundation", + "simple/linuxmint", + "simple/linuxprofessionalinstitute", + "simple/linuxserver", + "simple/lionair", + "simple/liquibase", + "simple/listenhub", + "simple/listmonk", + "simple/lit", + "simple/litecoin", + "simple/literal", + "simple/litiengine", + "simple/livechat", + "simple/livejournal", + "simple/livekit", + "simple/livewire", + "simple/llvm", + "simple/lmms", + "simple/lobsters", + "simple/local", + "simple/localsend", + "simple/localxpose", + "simple/lodash", + "simple/logmein", + "simple/logseq", + "simple/logstash", + "simple/looker", + "simple/loom", + "simple/loop", + "simple/loopback", + "simple/lootcrate", + "simple/lospec", + "simple/lotpolishairlines", + "simple/lottiefiles", + "simple/ltspice", + "simple/lua", + "simple/luanti", + "simple/luau", + "simple/lubuntu", + "simple/lucia", + "simple/lucid", + "simple/lucide", + "simple/ludwig", + "simple/lufthansa", + "simple/lumen", + "simple/lunacy", + "simple/luogu", + "simple/lutris", + "simple/lvgl", + "simple/lydia", + "simple/lyft", + "simple/maas", + "simple/macos", + "simple/macpaw", + "simple/macports", + "simple/macys", + "simple/magasinsu", + "simple/magic", + "simple/magisk", + "simple/mahindra", + "simple/mailbox", + "simple/mailchimp", + "simple/maildotcom", + "simple/maildotru", + "simple/mailgun", + "simple/mailtrap", + "simple/mainwp", + "simple/majorleaguehacking", + "simple/make", + "simple/makerbot", + "simple/malt", + "simple/malwarebytes", + "simple/mambaui", + "simple/mamp", + "simple/man", + "simple/manageiq", + "simple/mangacollec", + "simple/mangaupdates", + "simple/manjaro", + "simple/mantine", + "simple/mapbox", + "simple/mapillary", + "simple/maplibre", + "simple/maptiler", + "simple/mariadb", + "simple/mariadbfoundation", + "simple/markdown", + "simple/marko", + "simple/marriott", + "simple/marvelapp", + "simple/maserati", + "simple/mastercard", + "simple/mastercomfig", + "simple/mastodon", + "simple/materialdesign", + "simple/materialdesignicons", + "simple/materialformkdocs", + "simple/matillion", + "simple/matomo", + "simple/matrix", + "simple/matterdotjs", + "simple/mattermost", + "simple/matternet", + "simple/mautic", + "simple/max", + "simple/maxplanckgesellschaft", + "simple/maytag", + "simple/mazda", + "simple/maze", + "simple/mcafee", + "simple/mcdonalds", + "simple/mclaren", + "simple/mdblist", + "simple/mdbook", + "simple/mdnwebdocs", + "simple/mdx", + "simple/mealie", + "simple/mediafire", + "simple/mediamarkt", + "simple/mediapipe", + "simple/mediatek", + "simple/medibangpaint", + "simple/medium", + "simple/medusa", + "simple/meetup", + "simple/mega", + "simple/meilisearch", + "simple/meituan", + "simple/meizu", + "simple/mendeley", + "simple/mentorcruise", + "simple/mercadopago", + "simple/merck", + "simple/mercurial", + "simple/mermaid", + "simple/messenger", + "simple/meta", + "simple/metabase", + "simple/metacritic", + "simple/metafilter", + "simple/metager", + "simple/metasploit", + "simple/meteor", + "simple/metro", + "simple/metrodelaciudaddemexico", + "simple/metrodemadrid", + "simple/metrodeparis", + "simple/mewe", + "simple/mezmo", + "simple/mg", + "simple/microbit", + "simple/microdotblog", + "simple/microeditor", + "simple/micropython", + "simple/microstation", + "simple/microstrategy", + "simple/midi", + "simple/migadu", + "simple/mihon", + "simple/mihoyo", + "simple/mikrotik", + "simple/milanote", + "simple/milvus", + "simple/minds", + "simple/mingww64", + "simple/mini", + "simple/minimax", + "simple/minio", + "simple/mintlify", + "simple/minutemailer", + "simple/miraheze", + "simple/miro", + "simple/misskey", + "simple/mistralai", + "simple/mitsubishi", + "simple/mix", + "simple/mixcloud", + "simple/mixpanel", + "simple/mlb", + "simple/mlflow", + "simple/mobx", + "simple/mobxstatetree", + "simple/mocha", + "simple/mockserviceworker", + "simple/modal", + "simple/modelcontextprotocol", + "simple/modin", + "simple/modrinth", + "simple/modx", + "simple/mojeek", + "simple/moleculer", + "simple/momenteo", + "simple/monero", + "simple/moneygram", + "simple/mongodb", + "simple/mongoose", + "simple/mongoosedotws", + "simple/monica", + "simple/monkeytie", + "simple/monkeytype", + "simple/monogame", + "simple/monoprix", + "simple/monster", + "simple/monzo", + "simple/moo", + "simple/moodle", + "simple/moonrepo", + "simple/moq", + "simple/moqups", + "simple/morrisons", + "simple/moscowmetro", + "simple/motorola", + "simple/movistar", + "simple/mozilla", + "simple/mpv", + "simple/mqtt", + "simple/msi", + "simple/msibusiness", + "simple/mta", + "simple/mtr", + "simple/mubi", + "simple/mui", + "simple/muller", + "simple/mullvad", + "simple/multisim", + "simple/mumble", + "simple/muo", + "simple/mural", + "simple/musicbrainz", + "simple/mxlinux", + "simple/myanimelist", + "simple/myget", + "simple/myob", + "simple/myshows", + "simple/myspace", + "simple/mysql", + "simple/n26", + "simple/n8n", + "simple/namebase", + "simple/namecheap", + "simple/namemc", + "simple/namesilo", + "simple/namuwiki", + "simple/nano", + "simple/nanostores", + "simple/napster", + "simple/nasa", + "simple/nationalgrid", + "simple/nationalrail", + "simple/nativescript", + "simple/natsdotio", + "simple/naver", + "simple/nba", + "simple/nbb", + "simple/nbc", + "simple/ndr", + "simple/near", + "simple/nebula", + "simple/nec", + "simple/nederlandsespoorwegen", + "simple/neo4j", + "simple/neovim", + "simple/neptune", + "simple/nestjs", + "simple/netapp", + "simple/netbsd", + "simple/netcup", + "simple/netdata", + "simple/neteasecloudmusic", + "simple/netflix", + "simple/netgear", + "simple/netim", + "simple/netlify", + "simple/nette", + "simple/netto", + "simple/neutralinojs", + "simple/newbalance", + "simple/newegg", + "simple/newgrounds", + "simple/newjapanprowrestling", + "simple/newpipe", + "simple/newrelic", + "simple/newyorktimes", + "simple/nexon", + "simple/nextbike", + "simple/nextbilliondotai", + "simple/nextcloud", + "simple/nextdns", + "simple/nextdoor", + "simple/nextdotjs", + "simple/nextflow", + "simple/nextra", + "simple/nfc", + "simple/nfcore", + "simple/nginx", + "simple/nginxproxymanager", + "simple/ngrok", + "simple/ngrx", + "simple/nhl", + "simple/nhost", + "simple/nicehash", + "simple/niconico", + "simple/nike", + "simple/nikon", + "simple/nim", + "simple/nissan", + "simple/nixos", + "simple/nobaralinux", + "simple/nodebb", + "simple/nodedotjs", + "simple/nodegui", + "simple/nodemon", + "simple/nodered", + "simple/nokia", + "simple/nomad", + "simple/norco", + "simple/nordicsemiconductor", + "simple/nordvpn", + "simple/normalizedotcss", + "simple/norton", + "simple/norwegian", + "simple/note", + "simple/notebooklm", + "simple/notepadplusplus", + "simple/notion", + "simple/notist", + "simple/nounproject", + "simple/novu", + "simple/now", + "simple/npm", + "simple/nrwl", + "simple/nsis", + "simple/ntfy", + "simple/nubank", + "simple/nucleo", + "simple/nuget", + "simple/nuke", + "simple/numba", + "simple/numpy", + "simple/nunjucks", + "simple/nushell", + "simple/nutanix", + "simple/nuxt", + "simple/nvidia", + "simple/nvm", + "simple/nx", + "simple/nxp", + "simple/nzxt", + "simple/o2", + "simple/obb", + "simple/observable", + "simple/obsidian", + "simple/obsstudio", + "simple/obtainium", + "simple/ocaml", + "simple/oclc", + "simple/oclif", + "simple/octanerender", + "simple/octave", + "simple/octobercms", + "simple/octoprint", + "simple/octopusdeploy", + "simple/oculus", + "simple/odin", + "simple/odnoklassniki", + "simple/odoo", + "simple/odysee", + "simple/ohdear", + "simple/okcupid", + "simple/okta", + "simple/okx", + "simple/ollama", + "simple/omadacloud", + "simple/oneplus", + "simple/onestream", + "simple/onlyfans", + "simple/onlyoffice", + "simple/onnx", + "simple/onstar", + "simple/opel", + "simple/open3d", + "simple/openaccess", + "simple/openaigym", + "simple/openapiinitiative", + "simple/openbadges", + "simple/openbsd", + "simple/openbugbounty", + "simple/opencollective", + "simple/opencontainersinitiative", + "simple/opencritic", + "simple/opencv", + "simple/openfaas", + "simple/opengl", + "simple/openhab", + "simple/openid", + "simple/openjdk", + "simple/openjsfoundation", + "simple/openlayers", + "simple/openmediavault", + "simple/openmined", + "simple/opennebula", + "simple/openproject", + "simple/openrouter", + "simple/openscad", + "simple/opensea", + "simple/opensearch", + "simple/opensourcehardware", + "simple/opensourceinitiative", + "simple/openssl", + "simple/openstack", + "simple/openstreetmap", + "simple/opensuse", + "simple/opentelemetry", + "simple/opentext", + "simple/opentofu", + "simple/openverse", + "simple/openvpn", + "simple/openwrt", + "simple/openzeppelin", + "simple/openzfs", + "simple/opera", + "simple/operagx", + "simple/opnsense", + "simple/oppo", + "simple/opsgenie", + "simple/opslevel", + "simple/optimism", + "simple/optuna", + "simple/orange", + "simple/orcid", + "simple/oreilly", + "simple/org", + "simple/organicmaps", + "simple/origin", + "simple/osano", + "simple/osf", + "simple/osgeo", + "simple/oshkosh", + "simple/osmand", + "simple/osmc", + "simple/osu", + "simple/otto", + "simple/outline", + "simple/overcast", + "simple/overleaf", + "simple/ovh", + "simple/owasp", + "simple/owncloud", + "simple/oxc", + "simple/oxygen", + "simple/oyo", + "simple/p5dotjs", + "simple/packagist", + "simple/packer", + "simple/packt", + "simple/paddle", + "simple/paddlepaddle", + "simple/paddypower", + "simple/padlet", + "simple/pagekit", + "simple/pagerduty", + "simple/pagespeedinsights", + "simple/pagseguro", + "simple/palantir", + "simple/paloaltonetworks", + "simple/paloaltosoftware", + "simple/panasonic", + "simple/pandas", + "simple/pandora", + "simple/pantheon", + "simple/paperlessngx", + "simple/paperspace", + "simple/paperswithcode", + "simple/paradoxinteractive", + "simple/paramountplus", + "simple/paritysubstrate", + "simple/parrotsecurity", + "simple/parsedotly", + "simple/passbolt", + "simple/passport", + "simple/pastebin", + "simple/patreon", + "simple/payback", + "simple/paychex", + "simple/payhip", + "simple/payloadcms", + "simple/payoneer", + "simple/paypal", + "simple/paysafe", + "simple/paytm", + "simple/pcgamingwiki", + "simple/pdm", + "simple/pdq", + "simple/peakdesign", + "simple/pearson", + "simple/peerlist", + "simple/peertube", + "simple/pegasusairlines", + "simple/pelican", + "simple/peloton", + "simple/penny", + "simple/penpot", + "simple/percy", + "simple/perforce", + "simple/perl", + "simple/perplexity", + "simple/persistent", + "simple/personio", + "simple/petsathome", + "simple/peugeot", + "simple/pexels", + "simple/pfsense", + "simple/phabricator", + "simple/philipshue", + "simple/phoenixframework", + "simple/phonepe", + "simple/phosphoricons", + "simple/photobucket", + "simple/photocrowd", + "simple/photon", + "simple/photopea", + "simple/php", + "simple/phpbb", + "simple/phpmyadmin", + "simple/phpstorm", + "simple/piaggiogroup", + "simple/piapro", + "simple/picardsurgeles", + "simple/picartodottv", + "simple/picnic", + "simple/picpay", + "simple/picrew", + "simple/picsart", + "simple/picxy", + "simple/pihole", + "simple/pimcore", + "simple/pinboard", + "simple/pinescript", + "simple/pinetwork", + "simple/pingdom", + "simple/pinia", + "simple/pino", + "simple/pinterest", + "simple/pioneerdj", + "simple/piped", + "simple/pipx", + "simple/pivotaltracker", + "simple/piwigo", + "simple/pix", + "simple/pixabay", + "simple/pixelfed", + "simple/pixiv", + "simple/pixlr", + "simple/pkgsrc", + "simple/plane", + "simple/planet", + "simple/planetscale", + "simple/plangrid", + "simple/platformdotsh", + "simple/platformio", + "simple/platzi", + "simple/plausibleanalytics", + "simple/playcanvas", + "simple/playerdotme", + "simple/playerfm", + "simple/playstation", + "simple/playstation2", + "simple/playstation3", + "simple/playstation4", + "simple/playstation5", + "simple/playstationportable", + "simple/playstationvita", + "simple/pleroma", + "simple/plesk", + "simple/plex", + "simple/plotly", + "simple/plume", + "simple/pluralsight", + "simple/plurk", + "simple/pm2", + "simple/pnpm", + "simple/pocketbase", + "simple/pocketcasts", + "simple/podcastaddict", + "simple/podcastindex", + "simple/podman", + "simple/poe", + "simple/poetry", + "simple/polars", + "simple/polestar", + "simple/polkadot", + "simple/poly", + "simple/polygon", + "simple/polymerproject", + "simple/polywork", + "simple/pond5", + "simple/popos", + "simple/porkbun", + "simple/porsche", + "simple/portableappsdotcom", + "simple/portainer", + "simple/portswigger", + "simple/posit", + "simple/postcss", + "simple/postgresql", + "simple/posthog", + "simple/postiz", + "simple/postman", + "simple/postmates", + "simple/powers", + "simple/prdotco", + "simple/preact", + "simple/precommit", + "simple/prefect", + "simple/premid", + "simple/premierleague", + "simple/prepbytes", + "simple/prestashop", + "simple/presto", + "simple/prettier", + "simple/pretzel", + "simple/prevention", + "simple/prezi", + "simple/primefaces", + "simple/primeng", + "simple/primereact", + "simple/primevue", + "simple/printables", + "simple/prisma", + "simple/prismic", + "simple/privatedivision", + "simple/privateinternetaccess", + "simple/probot", + "simple/processingfoundation", + "simple/processon", + "simple/processwire", + "simple/producthunt", + "simple/progate", + "simple/progress", + "simple/prometheus", + "simple/pronounsdotpage", + "simple/prosieben", + "simple/proteus", + "simple/protocolsdotio", + "simple/protodotio", + "simple/proton", + "simple/protoncalendar", + "simple/protondb", + "simple/protondrive", + "simple/protonmail", + "simple/protonvpn", + "simple/protools", + "simple/protractor", + "simple/proxmox", + "simple/pterodactyl", + "simple/pubg", + "simple/publons", + "simple/pubmed", + "simple/pug", + "simple/pulumi", + "simple/puma", + "simple/puppet", + "simple/puppeteer", + "simple/purescript", + "simple/purgecss", + "simple/purism", + "simple/pushbullet", + "simple/pusher", + "simple/pwa", + "simple/pycharm", + "simple/pycqa", + "simple/pydantic", + "simple/pyg", + "simple/pypi", + "simple/pypy", + "simple/pyscaffold", + "simple/pysyft", + "simple/pytest", + "simple/python", + "simple/pythonanywhere", + "simple/pytorch", + "simple/pyup", + "simple/qantas", + "simple/qase", + "simple/qatarairways", + "simple/qbittorrent", + "simple/qemu", + "simple/qgis", + "simple/qi", + "simple/qiita", + "simple/qiskit", + "simple/qiwi", + "simple/qlik", + "simple/qlty", + "simple/qmk", + "simple/qnap", + "simple/qodo", + "simple/qq", + "simple/qt", + "simple/quad9", + "simple/qualcomm", + "simple/qualtrics", + "simple/qualys", + "simple/quantcast", + "simple/quantconnect", + "simple/quarkus", + "simple/quarto", + "simple/quasar", + "simple/qubesos", + "simple/quest", + "simple/quickbooks", + "simple/quicklook", + "simple/quicktime", + "simple/quicktype", + "simple/quizlet", + "simple/quora", + "simple/qwant", + "simple/qwik", + "simple/qwiklabs", + "simple/qzone", + "simple/r", + "simple/r3", + "simple/rabbitmq", + "simple/racket", + "simple/radar", + "simple/radarr", + "simple/radiofrance", + "simple/radixui", + "simple/radstudio", + "simple/railway", + "simple/rainmeter", + "simple/rainyun", + "simple/rakuten", + "simple/rakutenkobo", + "simple/ram", + "simple/rancher", + "simple/rapid", + "simple/rarible", + "simple/rasa", + "simple/raspberrypi", + "simple/ratatui", + "simple/ravelry", + "simple/ray", + "simple/raycast", + "simple/raylib", + "simple/razer", + "simple/razorpay", + "simple/rclone", + "simple/react", + "simple/reactbootstrap", + "simple/reacthookform", + "simple/reactiveresume", + "simple/reactivex", + "simple/reactos", + "simple/reactquery", + "simple/reactrouter", + "simple/reacttable", + "simple/readdotcv", + "simple/readme", + "simple/readthedocs", + "simple/reason", + "simple/reasonstudios", + "simple/recoil", + "simple/red", + "simple/redash", + "simple/redbubble", + "simple/redbull", + "simple/redcandlegames", + "simple/reddit", + "simple/redhat", + "simple/redhatopenshift", + "simple/redis", + "simple/redmine", + "simple/redox", + "simple/redragon", + "simple/redsys", + "simple/redux", + "simple/reduxsaga", + "simple/redwoodjs", + "simple/reebok", + "simple/refine", + "simple/refinedgithub", + "simple/rekaui", + "simple/relay", + "simple/relianceindustrieslimited", + "simple/remark", + "simple/remedyentertainment", + "simple/remix", + "simple/removedotbg", + "simple/renault", + "simple/render", + "simple/renovate", + "simple/renpy", + "simple/renren", + "simple/replicate", + "simple/replit", + "simple/republicofgamers", + "simple/rescript", + "simple/rescuetime", + "simple/researchgate", + "simple/resend", + "simple/resharper", + "simple/resurrectionremixos", + "simple/retool", + "simple/retroachievements", + "simple/retroarch", + "simple/retropie", + "simple/revanced", + "simple/revealdotjs", + "simple/revenuecat", + "simple/reverbnation", + "simple/revoltdotchat", + "simple/revolut", + "simple/rewe", + "simple/rezgo", + "simple/rhinoceros", + "simple/rich", + "simple/rider", + "simple/rimacautomobili", + "simple/rime", + "simple/ring", + "simple/riotgames", + "simple/ripple", + "simple/riscv", + "simple/riseup", + "simple/ritzcarlton", + "simple/rive", + "simple/roadmapdotsh", + "simple/roamresearch", + "simple/robinhood", + "simple/roblox", + "simple/robloxstudio", + "simple/roboflow", + "simple/robotframework", + "simple/rocket", + "simple/rocketdotchat", + "simple/rocksdb", + "simple/rockstargames", + "simple/rockwellautomation", + "simple/rockylinux", + "simple/roku", + "simple/roll20", + "simple/rollbar", + "simple/rolldown", + "simple/rollsroyce", + "simple/rollupdotjs", + "simple/rook", + "simple/roon", + "simple/root", + "simple/rootme", + "simple/roots", + "simple/rootsbedrock", + "simple/rootssage", + "simple/ros", + "simple/rossmann", + "simple/rotaryinternational", + "simple/rottentomatoes", + "simple/roundcube", + "simple/rsocket", + "simple/rss", + "simple/rstudioide", + "simple/rte", + "simple/rtl", + "simple/rtlzwei", + "simple/rtm", + "simple/rubocop", + "simple/ruby", + "simple/rubygems", + "simple/rubymine", + "simple/rubyonrails", + "simple/rubysinatra", + "simple/ruff", + "simple/rumahweb", + "simple/rumble", + "simple/rundeck", + "simple/runkeeper", + "simple/runkit", + "simple/runrundotit", + "simple/rust", + "simple/rustdesk", + "simple/rxdb", + "simple/ryanair", + "simple/rye", + "simple/s7airlines", + "simple/sabanci", + "simple/safari", + "simple/sage", + "simple/sagemath", + "simple/sahibinden", + "simple/sailfishos", + "simple/sailsdotjs", + "simple/salla", + "simple/saltproject", + "simple/samsclub", + "simple/samsung", + "simple/samsungpay", + "simple/sanfranciscomunicipalrailway", + "simple/sanic", + "simple/sanity", + "simple/saopaulometro", + "simple/sap", + "simple/sartorius", + "simple/sass", + "simple/sat1", + "simple/satellite", + "simple/saturn", + "simple/saucelabs", + "simple/saudia", + "simple/scala", + "simple/scalar", + "simple/scaleway", + "simple/scania", + "simple/schneiderelectric", + "simple/scikitlearn", + "simple/scilab", + "simple/scipy", + "simple/scopus", + "simple/scpfoundation", + "simple/scrapbox", + "simple/scrapy", + "simple/scratch", + "simple/screencastify", + "simple/scrimba", + "simple/scrollreveal", + "simple/scrumalliance", + "simple/scrutinizerci", + "simple/scylladb", + "simple/seafile", + "simple/seagate", + "simple/searxng", + "simple/seat", + "simple/seatgeek", + "simple/securityscorecard", + "simple/sefaria", + "simple/sega", + "simple/selenium", + "simple/sellfy", + "simple/semanticrelease", + "simple/semanticscholar", + "simple/semanticui", + "simple/semanticuireact", + "simple/semanticweb", + "simple/semaphoreci", + "simple/semrush", + "simple/semver", + "simple/sencha", + "simple/sennheiser", + "simple/sensu", + "simple/sentry", + "simple/sepa", + "simple/sequelize", + "simple/servbay", + "simple/serverfault", + "simple/serverless", + "simple/session", + "simple/sessionize", + "simple/setapp", + "simple/setuptools", + "simple/sfml", + "simple/shadcnui", + "simple/shadow", + "simple/shanghaimetro", + "simple/sharex", + "simple/sharp", + "simple/shazam", + "simple/shell", + "simple/shelly", + "simple/shenzhenmetro", + "simple/shieldsdotio", + "simple/shikimori", + "simple/shopee", + "simple/shopify", + "simple/shopware", + "simple/shortcut", + "simple/showpad", + "simple/showtime", + "simple/showwcase", + "simple/sidekiq", + "simple/sidequest", + "simple/siemens", + "simple/sifive", + "simple/signal", + "simple/silverairways", + "simple/similarweb", + "simple/simkl", + "simple/simpleanalytics", + "simple/simpleicons", + "simple/simplelocalize", + "simple/simplelogin", + "simple/simplenote", + "simple/simplex", + "simple/sinaweibo", + "simple/singaporeairlines", + "simple/singlestore", + "simple/sitecore", + "simple/sitepoint", + "simple/siyuan", + "simple/skaffold", + "simple/skeleton", + "simple/sketch", + "simple/sketchfab", + "simple/sketchup", + "simple/skillshare", + "simple/skoda", + "simple/sky", + "simple/skypack", + "simple/slackware", + "simple/slashdot", + "simple/slickpic", + "simple/slides", + "simple/slideshare", + "simple/slint", + "simple/smart", + "simple/smartthings", + "simple/smashingmagazine", + "simple/smoothcomp", + "simple/smrt", + "simple/smugmug", + "simple/snapchat", + "simple/snapcraft", + "simple/snapdragon", + "simple/sncf", + "simple/snort", + "simple/snowflake", + "simple/snowpack", + "simple/snyk", + "simple/socialblade", + "simple/society6", + "simple/socket", + "simple/socketdotio", + "simple/softcatala", + "simple/softpedia", + "simple/sogou", + "simple/solana", + "simple/solid", + "simple/solidity", + "simple/sololearn", + "simple/solus", + "simple/sonar", + "simple/sonarqubecloud", + "simple/sonarqubeforide", + "simple/sonarqubeserver", + "simple/sonarr", + "simple/sonatype", + "simple/songkick", + "simple/songoda", + "simple/sonicwall", + "simple/sonos", + "simple/sony", + "simple/soriana", + "simple/soundcharts", + "simple/soundcloud", + "simple/sourceengine", + "simple/sourceforge", + "simple/sourcehut", + "simple/sourcetree", + "simple/southwestairlines", + "simple/spacemacs", + "simple/spaceship", + "simple/spacex", + "simple/spacy", + "simple/sparkar", + "simple/sparkasse", + "simple/sparkfun", + "simple/sparkpost", + "simple/spdx", + "simple/speakerdeck", + "simple/spectrum", + "simple/speedtest", + "simple/speedypage", + "simple/sphinx", + "simple/spigotmc", + "simple/spine", + "simple/spinnaker", + "simple/splunk", + "simple/spoj", + "simple/spond", + "simple/spotify", + "simple/spotlight", + "simple/spreadshirt", + "simple/spreaker", + "simple/spring", + "simple/spring_creators", + "simple/springboot", + "simple/springsecurity", + "simple/spyderide", + "simple/sqlalchemy", + "simple/sqlite", + "simple/square", + "simple/squareenix", + "simple/squarespace", + "simple/srgssr", + "simple/ssrn", + "simple/sst", + "simple/stackbit", + "simple/stackblitz", + "simple/stackedit", + "simple/stackexchange", + "simple/stackhawk", + "simple/stackoverflow", + "simple/stackshare", + "simple/stadia", + "simple/staffbase", + "simple/stagetimer", + "simple/standardjs", + "simple/standardresume", + "simple/starbucks", + "simple/stardock", + "simple/starlingbank", + "simple/starship", + "simple/startdotgg", + "simple/startpage", + "simple/startrek", + "simple/starz", + "simple/statamic", + "simple/statista", + "simple/statuspage", + "simple/statuspal", + "simple/steam", + "simple/steamdb", + "simple/steamdeck", + "simple/steamworks", + "simple/steelseries", + "simple/steem", + "simple/steemit", + "simple/steinberg", + "simple/stellar", + "simple/stencil", + "simple/stencyl", + "simple/stimulus", + "simple/stmicroelectronics", + "simple/stockx", + "simple/stopstalk", + "simple/storyblok", + "simple/storybook", + "simple/strapi", + "simple/strava", + "simple/streamlabs", + "simple/streamlit", + "simple/streamrunners", + "simple/stremio", + "simple/stripe", + "simple/strongswan", + "simple/stryker", + "simple/stubhub", + "simple/studio3t", + "simple/styledcomponents", + "simple/stylelint", + "simple/styleshare", + "simple/stylus", + "simple/subaru", + "simple/sublimetext", + "simple/substack", + "simple/subtitleedit", + "simple/subversion", + "simple/suckless", + "simple/sui", + "simple/suitest", + "simple/sumologic", + "simple/suno", + "simple/sunrise", + "simple/supabase", + "simple/supercrease", + "simple/supermicro", + "simple/superuser", + "simple/surfshark", + "simple/surrealdb", + "simple/surveymonkey", + "simple/suse", + "simple/suzuki", + "simple/svelte", + "simple/svg", + "simple/svgdotjs", + "simple/svgo", + "simple/svgtrace", + "simple/swagger", + "simple/swarm", + "simple/sway", + "simple/swc", + "simple/swift", + "simple/swiggy", + "simple/swiper", + "simple/swisscows", + "simple/swr", + "simple/symantec", + "simple/symbolab", + "simple/symfony", + "simple/symphony", + "simple/sympy", + "simple/syncthing", + "simple/synology", + "simple/system76", + "simple/tabelog", + "simple/tablecheck", + "simple/tacobell", + "simple/tado", + "simple/taichigraphics", + "simple/taichilang", + "simple/tails", + "simple/tailscale", + "simple/tailwindcss", + "simple/taipy", + "simple/taketwointeractivesoftware", + "simple/talend", + "simple/talenthouse", + "simple/talos", + "simple/tamiya", + "simple/tampermonkey", + "simple/tanstack", + "simple/taobao", + "simple/tapas", + "simple/target", + "simple/tarom", + "simple/task", + "simple/tasmota", + "simple/tata", + "simple/tauri", + "simple/taxbuzz", + "simple/tcs", + "simple/teal", + "simple/teamcity", + "simple/teamspeak", + "simple/teamviewer", + "simple/techcrunch", + "simple/ted", + "simple/teepublic", + "simple/teespring", + "simple/tekton", + "simple/tele5", + "simple/telefonica", + "simple/telegram", + "simple/telegraph", + "simple/telenor", + "simple/telequebec", + "simple/temporal", + "simple/tensorflow", + "simple/teradata", + "simple/teratail", + "simple/termius", + "simple/terraform", + "simple/tesco", + "simple/tesla", + "simple/testcafe", + "simple/testin", + "simple/testinglibrary", + "simple/testrail", + "simple/tether", + "simple/textpattern", + "simple/textual", + "simple/tga", + "simple/thangs", + "simple/thanos", + "simple/thealgorithms", + "simple/theboringcompany", + "simple/theconversation", + "simple/thefinals", + "simple/theguardian", + "simple/theirishtimes", + "simple/themighty", + "simple/themodelsresource", + "simple/themoviedatabase", + "simple/thenorthface", + "simple/theodinproject", + "simple/theplanetarysociety", + "simple/theregister", + "simple/thesoundsresource", + "simple/thespritersresource", + "simple/thestorygraph", + "simple/thewashingtonpost", + "simple/theweatherchannel", + "simple/thingiverse", + "simple/thinkpad", + "simple/thirdweb", + "simple/threadless", + "simple/threads", + "simple/threedotjs", + "simple/threema", + "simple/thumbtack", + "simple/thunderbird", + "simple/thunderstore", + "simple/thurgauerkantonalbank", + "simple/thymeleaf", + "simple/ticketmaster", + "simple/ticktick", + "simple/tidal", + "simple/tiddlywiki", + "simple/tide", + "simple/tidyverse", + "simple/tietoevry", + "simple/tiktok", + "simple/tildapublishing", + "simple/tile", + "simple/timescale", + "simple/tina", + "simple/tinder", + "simple/tindie", + "simple/tinkercad", + "simple/tinygrad", + "simple/tinyletter", + "simple/tistory", + "simple/tldraw", + "simple/tmux", + "simple/todoist", + "simple/toggl", + "simple/toggltrack", + "simple/tokio", + "simple/tokyometro", + "simple/toll", + "simple/toml", + "simple/tomorrowland", + "simple/tomtom", + "simple/ton", + "simple/topcoder", + "simple/topdotgg", + "simple/toptal", + "simple/torbrowser", + "simple/torizon", + "simple/torproject", + "simple/toshiba", + "simple/totvs", + "simple/tourbox", + "simple/tower", + "simple/toyota", + "simple/tplink", + "simple/tqdm", + "simple/traccar", + "simple/tradingview", + "simple/traefikmesh", + "simple/traefikproxy", + "simple/trailforks", + "simple/trainerroad", + "simple/trakt", + "simple/transifex", + "simple/transmission", + "simple/transportforireland", + "simple/transportforlondon", + "simple/travisci", + "simple/treehouse", + "simple/trello", + "simple/trendmicro", + "simple/tresorit", + "simple/treyarch", + "simple/tricentis", + "simple/trilium", + "simple/triller", + "simple/trillertv", + "simple/trimble", + "simple/trino", + "simple/tripadvisor", + "simple/tripdotcom", + "simple/trivago", + "simple/trivy", + "simple/trove", + "simple/trpc", + "simple/truenas", + "simple/trueup", + "simple/trulia", + "simple/trustedshops", + "simple/trustpilot", + "simple/tryhackme", + "simple/tryitonline", + "simple/tsnode", + "simple/tubi", + "simple/tui", + "simple/tumblr", + "simple/turbo", + "simple/turborepo", + "simple/turbosquid", + "simple/turkishairlines", + "simple/turso", + "simple/tuta", + "simple/tuxedocomputers", + "simple/tv4play", + "simple/tvtime", + "simple/twenty", + "simple/twinkly", + "simple/twinmotion", + "simple/twitch", + "simple/typeform", + "simple/typeorm", + "simple/typer", + "simple/typescript", + "simple/typo3", + "simple/typst", + "simple/uber", + "simple/ubereats", + "simple/ubiquiti", + "simple/ubisoft", + "simple/ublockorigin", + "simple/ubuntu", + "simple/ubuntumate", + "simple/udacity", + "simple/udemy", + "simple/udotsdotnews", + "simple/ufc", + "simple/uikit", + "simple/uipath", + "simple/ukca", + "simple/ultralytics", + "simple/ulule", + "simple/umami", + "simple/umbraco", + "simple/umbrel", + "simple/uml", + "simple/unacademy", + "simple/underarmour", + "simple/underscoredotjs", + "simple/undertale", + "simple/unicode", + "simple/unilever", + "simple/uniqlo", + "simple/uniqlo_ja", + "simple/unitedairlines", + "simple/unitednations", + "simple/unity", + "simple/unjs", + "simple/unlicense", + "simple/unocss", + "simple/unpkg", + "simple/unraid", + "simple/unrealengine", + "simple/unsplash", + "simple/unstop", + "simple/untappd", + "simple/upcloud", + "simple/uphold", + "simple/uplabs", + "simple/upptime", + "simple/ups", + "simple/upstash", + "simple/uptimekuma", + "simple/upwork", + "simple/uservoice", + "simple/usps", + "simple/utorrent", + "simple/uv", + "simple/v", + "simple/v0", + "simple/v2ex", + "simple/v8", + "simple/vaadin", + "simple/vagrant", + "simple/vala", + "simple/valorant", + "simple/valve", + "simple/vanillaextract", + "simple/vapor", + "simple/vault", + "simple/vaultwarden", + "simple/vauxhall", + "simple/vbulletin", + "simple/vectary", + "simple/vectorlogozone", + "simple/vectorworks", + "simple/veeam", + "simple/veed", + "simple/veepee", + "simple/vega", + "simple/vegas", + "simple/velocity", + "simple/velog", + "simple/vencord", + "simple/venmo", + "simple/vercel", + "simple/verdaccio", + "simple/veritas", + "simple/verizon", + "simple/vespa", + "simple/vestel", + "simple/vexxhost", + "simple/vfairs", + "simple/viadeo", + "simple/viaplay", + "simple/viber", + "simple/viblo", + "simple/victoriametrics", + "simple/victronenergy", + "simple/vikunja", + "simple/vim", + "simple/vimeo", + "simple/vimeolivestream", + "simple/vinted", + "simple/virgin", + "simple/virginatlantic", + "simple/virginmedia", + "simple/virtualbox", + "simple/virustotal", + "simple/visa", + "simple/visualparadigm", + "simple/visx", + "simple/vite", + "simple/vitepress", + "simple/vitess", + "simple/vitest", + "simple/vivaldi", + "simple/vivawallet", + "simple/vivino", + "simple/vivint", + "simple/vivo", + "simple/vk", + "simple/vlcmediaplayer", + "simple/vmware", + "simple/vodafone", + "simple/voelkner", + "simple/voidlinux", + "simple/voipdotms", + "simple/volkswagen", + "simple/volvo", + "simple/vonage", + "simple/vorondesign", + "simple/vowpalwabbit", + "simple/vox", + "simple/vrchat", + "simple/vsco", + "simple/vscodium", + "simple/vtex", + "simple/vuedotjs", + "simple/vuetify", + "simple/vueuse", + "simple/vulkan", + "simple/vultr", + "simple/vyond", + "simple/w3schools", + "simple/wacom", + "simple/wagmi", + "simple/wagtail", + "simple/wails", + "simple/wakatime", + "simple/walkman", + "simple/wallabag", + "simple/walletconnect", + "simple/wantedly", + "simple/wappalyzer", + "simple/warp", + "simple/wasabi", + "simple/wasmcloud", + "simple/wasmer", + "simple/watchtower", + "simple/wattpad", + "simple/wayland", + "simple/waze", + "simple/wazirx", + "simple/wearos", + "simple/weasyl", + "simple/web3dotjs", + "simple/webassembly", + "simple/webauthn", + "simple/webcomponentsdotorg", + "simple/webdotde", + "simple/webdriverio", + "simple/webex", + "simple/webflow", + "simple/webgl", + "simple/webgpu", + "simple/weblate", + "simple/webmin", + "simple/webmoney", + "simple/webpack", + "simple/webrtc", + "simple/webstorm", + "simple/webtoon", + "simple/webtrees", + "simple/wechat", + "simple/wegame", + "simple/weightsandbiases", + "simple/welcometothejungle", + "simple/wellfound", + "simple/wellsfargo", + "simple/wemo", + "simple/weread", + "simple/westernunion", + "simple/wetransfer", + "simple/wezterm", + "simple/wgpu", + "simple/what3words", + "simple/whatsapp", + "simple/wheniwork", + "simple/wikibooks", + "simple/wikidata", + "simple/wikidotgg", + "simple/wikidotjs", + "simple/wikimediacommons", + "simple/wikimediafoundation", + "simple/wikipedia", + "simple/wikiquote", + "simple/wikisource", + "simple/wikiversity", + "simple/wikivoyage", + "simple/winamp", + "simple/windsurf", + "simple/wine", + "simple/wipro", + "simple/wire", + "simple/wireguard", + "simple/wireshark", + "simple/wise", + "simple/wish", + "simple/wistia", + "simple/wix", + "simple/wizzair", + "simple/wolfram", + "simple/wolframlanguage", + "simple/wolframmathematica", + "simple/wondershare", + "simple/wondersharefilmora", + "simple/woo", + "simple/woocommerce", + "simple/wordpress", + "simple/workplace", + "simple/worldhealthorganization", + "simple/wpengine", + "simple/wpexplorer", + "simple/wprocket", + "simple/writedotas", + "simple/wwe", + "simple/wwise", + "simple/wxt", + "simple/wykop", + "simple/wyze", + "simple/x", + "simple/xampp", + "simple/xcode", + "simple/xdadevelopers", + "simple/xdotorg", + "simple/xendit", + "simple/xero", + "simple/xfce", + "simple/xiaohongshu", + "simple/xiaomi", + "simple/xing", + "simple/xml", + "simple/xmpp", + "simple/xo", + "simple/xrp", + "simple/xsplit", + "simple/xstate", + "simple/xubuntu", + "simple/xyflow", + "simple/yaak", + "simple/yabai", + "simple/yale", + "simple/yamahacorporation", + "simple/yamahamotorcorporation", + "simple/yaml", + "simple/yandexcloud", + "simple/yarn", + "simple/ycombinator", + "simple/yelp", + "simple/yeti", + "simple/yii", + "simple/yoast", + "simple/yolo", + "simple/youhodler", + "simple/youtube", + "simple/youtubegaming", + "simple/youtubekids", + "simple/youtubemusic", + "simple/youtubeshorts", + "simple/youtubestudio", + "simple/youtubetv", + "simple/yr", + "simple/yubico", + "simple/yunohost", + "simple/zabka", + "simple/zaim", + "simple/zalando", + "simple/zalo", + "simple/zap", + "simple/zapier", + "simple/zara", + "simple/zazzle", + "simple/zcash", + "simple/zcool", + "simple/zdf", + "simple/zebpay", + "simple/zebratechnologies", + "simple/zedindustries", + "simple/zelle", + "simple/zenbrowser", + "simple/zend", + "simple/zendesk", + "simple/zenn", + "simple/zenodo", + "simple/zensar", + "simple/zerodha", + "simple/zerotier", + "simple/zettlr", + "simple/zhihu", + "simple/zig", + "simple/zigbee", + "simple/zigbee2mqtt", + "simple/ziggo", + "simple/zilch", + "simple/zillow", + "simple/zincsearch", + "simple/zingat", + "simple/zod", + "simple/zoho", + "simple/zoiper", + "simple/zola", + "simple/zomato", + "simple/zoom", + "simple/zorin", + "simple/zotero", + "simple/zsh", + "simple/zulip", + "simple/zyte" + ] +} \ No newline at end of file diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions.json new file mode 100644 index 0000000..6d9c727 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/$defs/external" + }, + { + "$ref": "#/$defs/external-community" + } + ] + }, + "uniqueItems": true, + "minItems": 1, + "$defs": { + "external": { + "description": "External markdown extensions, schema provided by us", + "anyOf": [ + { + "$ref": "extensions/markdown.json" + }, + { + "$ref": "extensions/pymdownx.json" + } + ] + }, + "external-community": { + "description": "External markdown extensions, schema provided by our community", + "anyOf": [ + { + "$ref": "https://raw.githubusercontent.com/Neoteroi/mkdocs-plugins/main/docs/extensions-schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/mikitex70/plantuml-markdown/master/plantuml_markdown.json" + } + ] + } + } +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions/markdown.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions/markdown.json new file mode 100644 index 0000000..879fee7 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions/markdown.json @@ -0,0 +1,157 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/", + "oneOf": [ + { + "title": "Abbreviations – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#abbreviations", + "enum": [ + "markdown.extensions.abbr", + "abbr" + ] + }, + { + "title": "Admonition – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#admonition", + "enum": [ + "markdown.extensions.admonition", + "admonition" + ] + }, + { + "title": "Attribute Lists – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#attribute-lists", + "enum": [ + "markdown.extensions.attr_list", + "attr_list" + ] + }, + { + "title": "Markdown extension: a classier syntax for admonitions", + "markdownDescription": "https://github.com/oprypin/markdown-callouts", + "enum": [ + "markdown.extensions.callouts", + "callouts", + "github-callouts" + ] + }, + { + "title": "Definition Lists – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#definition-lists", + "enum": [ + "markdown.extensions.def_list", + "def_list" + ] + }, + { + "title": "Footnotes – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#footnotes", + "enum": [ + "markdown.extensions.footnotes", + "footnotes" + ] + }, + { + "title": "Markdown in HTML – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#markdown-in-html", + "enum": [ + "markdown.extensions.md_in_html", + "md_in_html" + ] + }, + { + "title": "Sane Lists – Python Markdown", + "markdownDescription": "https://python-markdown.github.io/extensions/sane_lists/", + "enum": [ + "markdown.extensions.sane_lists", + "sane_lists" + ] + }, + { + "title": "Tables – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#tables", + "enum": [ + "markdown.extensions.tables", + "tables" + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "toc": { + "$ref": "#/$defs/toc" + }, + "markdown.extensions.toc": { + "$ref": "#/$defs/toc" + } + }, + "additionalProperties": false + }, + { + "title": "Table Of Contents – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#table-of-contents", + "enum": [ + "markdown.extensions.toc", + "toc" + ] + } + ] + } + ], + "$defs": { + "toc": { + "title": "Table Of Contents – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#table-of-contents", + "type": "object", + "properties": { + "title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.title", + "type": "string" + }, + "permalink": { + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.permalink", + "type": "boolean" + }, + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.permalink", + "type": "string" + } + ], + "default": true + }, + "anchorlink": { + "markdownDescription": "https://python-markdown.github.io/extensions/toc/#usage", + "type": "boolean", + "default": false + }, + "permalink_title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.permalink_title", + "type": "string" + }, + "slugify": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "toc_depth": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.toc_depth", + "type": "number", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ] + } + }, + "additionalProperties": false + } + } +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions/pymdownx.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions/pymdownx.json new file mode 100644 index 0000000..137bb30 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extensions/pymdownx.json @@ -0,0 +1,768 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/", + "oneOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.arithmatex": { + "title": "Arithmatex – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex", + "type": "object", + "properties": { + "generic": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Arithmatex – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex", + "const": "pymdownx.arithmatex" + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.betterem": { + "title": "BetterEm – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem", + "type": "object", + "properties": { + "smart_enable": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/betterem/#options", + "type": "string", + "enum": [ + "all", + "asterisk", + "underscore", + "none" + ], + "default": "all" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "BetterEm – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem", + "const": "pymdownx.betterem" + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.blocks.caption": { + "title": "Caption – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caption", + "type": "object", + "properties": { + "types": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#global-options", + "type": "array", + "items": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#configuring-figure-types", + "oneOf": [ + { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#configuring-figure-types", + "type":"string" + }, + { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#configuring-figure-types", + "type": "object", + "properties": { + "name": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#configuring-figure-types", + "type": "string" + }, + "prefix": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#configuring-figure-types", + "type": "string" + } + } + } + ] + }, + "uniqueItems": true, + "minItems": 1 + }, + "prepend": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#global-options", + "type": "boolean", + "default": false + }, + "auto": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#global-options", + "type": "boolean", + "default": true + }, + "auto_leval": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/#global-options", + "type": "integer", + "default": 0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Caption – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caption", + "const": "pymdownx.blocks.caption" + } + ] + }, + { + "oneOf": [ + { + "title": "Caret – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "const": "pymdownx.caret" + }, + { + "type": "object", + "properties": { + "pymdownx.caret": { + "title": "Caret – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_insert": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + }, + "insert": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + }, + "superscript": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Critic – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic", + "const": "pymdownx.critic" + }, + { + "type": "object", + "properties": { + "pymdownx.critic": { + "title": "Critic – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic", + "type": "object", + "properties": { + "mode": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.critic.mode", + "enum": [ + "view", + "accept", + "reject" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "title": "Details – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#details", + "const": "pymdownx.details" + }, + { + "oneOf": [ + { + "title": "Emoji – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#emoji", + "const": "pymdownx.emoji" + }, + { + "type": "object", + "properties": { + "pymdownx.emoji": { + "title": "Emoji – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#emoji", + "type": "object", + "properties": { + "emoji_generator": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.emoji_generator", + "default": "!!python/name:material.extensions.emoji.to_svg" + }, + "emoji_index": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.emoji_index", + "default": "!!python/name:material.extensions.emoji.twemoji" + }, + "options": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.options.custom_icons", + "type": "object", + "properties": { + "custom_icons": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.options.custom_icons", + "type": "array", + "items": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.options.custom_icons", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": [ + "emoji_generator", + "emoji_index" + ] + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Highlight – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight", + "const": "pymdownx.highlight" + }, + { + "type": "object", + "properties": { + "pymdownx.highlight": { + "title": "Highlight – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight", + "type": "object", + "properties": { + "use_pygments": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.use_pygments", + "type": "boolean" + }, + "pygments_lang_class": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.pygments_lang_class", + "type": "boolean" + }, + "auto_title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.auto_title", + "type": "boolean" + }, + "auto_title_map": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/highlight/#options", + "type": "object" + }, + "linenums": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.linenums", + "type": "boolean" + }, + "linenums_style": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.linenums_style", + "enum": [ + "inline", + "pymdownx-inline", + "table" + ] + }, + "anchor_linenums": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.anchor_linenums", + "type": "boolean" + }, + "line_spans": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.line_spans", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "title": "InlineHilite – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#inlinehilite", + "const": "pymdownx.inlinehilite" + }, + { + "oneOf": [ + { + "title": "Keys – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys", + "const": "pymdownx.keys" + }, + { + "type": "object", + "properties": { + "pymdownx.keys": { + "title": "Keys – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys", + "type": "object", + "properties": { + "separator": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "string", + "default": "+" + }, + "strict": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": false + }, + "camel_case": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": false + }, + "key_map": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "object" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "MagicLink – Python Markdown Extensions", + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/", + "const": "pymdownx.magiclink" + }, + { + "type": "object", + "properties": { + "pymdownx.magiclink": { + "title": "MagicLink – Python Markdown Extensions", + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/", + "type": "object", + "properties": { + "hide_protocol":{ + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "labels": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#labels", + "type": "object", + "default": { + "commit": "Commit", + "compare": "Compare", + "issue": "Issue", + "pull": "Pull Request", + "mention": "User", + "repository": "Repository" + } + }, + "normalize_issue_symbols": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "user": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string", + "default": "" + }, + "provider": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string", + "default": "github" + }, + "repo": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string", + "repo": "" + }, + "repo_url_shorthand": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": true + }, + "repo_url_shortener": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "social_url_shorthand": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "social_url_shortener": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "shortener_user_exclude": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#user-excludes", + "type": "object" + } + }, + "additionalProperties": false, + "required": [ + "user", + "repo" + ] + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Mark – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "const": "pymdownx.mark" + }, + { + "type": "object", + "properties": { + "pymdownx.mark": { + "title": "Mark – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_mark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "SmartSymbols – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols", + "const": "pymdownx.smartsymbols" + }, + { + "type": "object", + "properties": { + "pymdownx.smartsymbols": { + "title": "SmartSymbols – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols", + "type": "object", + "properties": { + "trademark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "copyright": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "registered": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "care_of": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "plusminus": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "arrows": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "notequal": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "fractions": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "ordinal_numbers": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.snippets": { + "title": "Snippets – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets", + "type": "object", + "properties": { + "base_path": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "array", + "items": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + }, + "auto_append": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "array", + "items": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + }, + "check_paths": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "boolean", + "default": true + }, + "url_download": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "boolean", + "default": false + }, + "url_max_size": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "integer", + "default": 33554432 + }, + "url_timeout": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "number", + "default": 10.0 + }, + "url_request_headers": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "object", + "default": {} + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Snippets – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets", + "const": "pymdownx.snippets" + } + ] + }, + { + "oneOf": [ + { + "title": "SuperFences – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences", + "const": "pymdownx.superfences" + }, + { + "type": "object", + "properties": { + "pymdownx.superfences": { + "title": "SuperFences – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences", + "type": "object", + "properties": { + "custom_fences": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.superfences.custom_fences", + "type": "array", + "items": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.superfences.custom_fences", + "type": "object", + "properties": { + "name": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + }, + "class": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + }, + "format": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + } + }, + "additionalProperties": false + }, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "properties": { + "pymdownx.tabbed": { + "title": "Tabbed – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tabbed", + "type": "object", + "properties": { + "alternate_style": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tabbed.alternate_style", + "type": "boolean", + "enum": [ + true + ], + "default": true + }, + "combine_header_slug": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tabbed.combine_header_slug", + "type": "boolean", + "default": true + }, + "slugify": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tabbed.slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + } + }, + "additionalProperties": false, + "required": [ + "alternate_style" + ] + } + }, + "additionalProperties": false + }, + { + "oneOf": [ + { + "title": "Tasklist – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist", + "const": "pymdownx.tasklist" + }, + { + "type": "object", + "properties": { + "pymdownx.tasklist": { + "title": "Tasklist – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist", + "type": "object", + "properties": { + "custom_checkbox": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tasklist.custom_checkbox", + "type": "boolean", + "default": true + }, + "clickable_checkbox": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tasklist.clickable_checkbox", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Tilde – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "const": "pymdownx.tilde" + }, + { + "type": "object", + "properties": { + "pymdownx.tilde": { + "title": "Tilde – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_delete": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + }, + "delete": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + }, + "subscript": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extra.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extra.json new file mode 100644 index 0000000..ac2ae10 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/extra.json @@ -0,0 +1,445 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Extra configuration", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "object", + "properties": { + "homepage": { + "title": "Homepage link (when clicking on logo)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo", + "type": "string" + }, + "analytics": { + "title": "Analytics provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "google" + } + } + }, + "then": { + "properties": { + "provider": { + "title": "Google Analytics", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "const": "google" + }, + "property": { + "anyOf": [ + { + "title": "Google Analytics 4", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "pattern": "^G-\\w{10}$" + }, + { + "title": "Unknown property", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "type": "string" + } + ] + }, + "feedback": { + "$ref": "#/$defs/feedback" + } + }, + "required": [ + "provider", + "property" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "provider": { + "type": "string" + } + } + }, + "then": { + "properties": { + "provider": { + "title": "Custom analytics provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#custom-site-analytics", + "type": "string" + }, + "feedback": { + "$ref": "#/$defs/feedback" + } + }, + "required": [ + "provider" + ] + } + } + ], + "defaultSnippets": [ + { + "label": "feedback (default)", + "body": { + "feedback": { + "title": "${1:Was this page helpful}", + "ratings": [ + { + "icon": "${2:material/emoticon-happy-outline}", + "name": "${3:This page was helpful}", + "data": 1, + "note": "${4:Thanks for your feedback!}" + }, + { + "icon": "${5:material/emoticon-sad-outline}", + "name": "${6:This page could be improved}", + "data": 0, + "note": "${7:Thanks for your feedback!}" + } + ] + } + } + } + ] + }, + "annotate": { + "title": "Custom selectors for annotations", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#custom-selectors", + "type": "object", + "patternProperties": { + ".*": { + "title": "Custom selector", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#custom-selectors", + "type": "array", + "items": { + "type": "string", + "pattern": "^\\.\\w+" + } + } + } + }, + "consent": { + "title": "Cookie consent", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "object", + "properties": { + "title": { + "title": "Cookie consent title", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.title", + "type": "string", + "default": "Cookie consent" + }, + "description": { + "title": "Cookie consent description", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.description", + "type": "string" + }, + "cookies": { + "title": "Cookies", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.cookies", + "type": "object", + "properties": { + "analytics": { + "$ref": "#/$defs/cookie" + }, + "github": { + "$ref": "#/$defs/cookie" + } + }, + "patternProperties": { + "\\w+": { + "$ref": "#/$defs/cookie" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "analytics (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.cookies", + "body": { + "analytics": { + "name": "Google Analytics", + "checked": true + } + } + }, + { + "label": "github (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.cookies", + "body": { + "analytics": { + "name": "GitHub", + "checked": true + } + } + } + ] + }, + "actions": { + "title": "Cookie consent actions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.actions", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Button to accept cookies", + "const": "accept" + }, + { + "title": "Button to reject cookies", + "const": "reject" + }, + { + "title": "Button to manage settings", + "const": "manage" + } + ] + }, + "uniqueItems": true + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "actions (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.actions", + "body": { + "actions": [ + "accept", + "manage" + ] + } + } + ], + "required": [ + "title", + "description" + ] + }, + "social": { + "title": "Social links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#social-links", + "type": "array", + "items": { + "title": "Social link", + "type": "object", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "link": { + "title": "Social link", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#+social.link", + "type": "string" + }, + "name": { + "title": "Social link name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#+social.name", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "link" + ] + } + }, + "alternate": { + "title": "Site language selector", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector", + "type": "array", + "items": { + "title": "Alternate language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector", + "type": "object", + "properties": { + "name": { + "title": "Alternate language name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#+alternate.name", + "type": "string" + }, + "link": { + "title": "Alternate language link", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#+alternate.link", + "type": "string" + }, + "lang": { + "title": "Alternate language code (ISO 639-1)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#+alternate.lang", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "link", + "lang" + ] + } + }, + "tags": { + "title": "Tag identifiers", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons-and-identifiers", + "type": "object", + "patternProperties": { + ".*": { + "title": "Tag identifier mapping", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons-and-identifiers", + "pattern": "^[\\w-]+$" + } + } + }, + "version": { + "title": "Versioning", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning", + "type": "object", + "properties": { + "provider": { + "title": "Versioning provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning", + "const": "mike" + }, + "default": { + "title": "Default version", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#version-warning", + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "default": "stable" + }, + "alias": { + "title": "Show alias next to version number", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-versioning/#version-alias", + "type": "boolean", + "default": true + } + } + }, + "generator": { + "title": "Generator notice", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#generator-notice", + "type": "boolean", + "default": true + } + }, + "additionalProperties": true, + "$defs": { + "cookie": { + "title": "Cookie", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "oneOf": [ + { + "type": "object", + "properties": { + "name": { + "title": "Cookie name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + }, + "checked": { + "title": "Initial state", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "required": [ + "name" + ] + }, + { + "title": "Cookie name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + } + ] + }, + "icon": { + "anyOf": [ + { + "$ref": "assets/icons.json" + }, + { + "title": "Unknown icon", + "type": "string" + } + ] + }, + "feedback": { + "title": "Was this page helpful?", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "object", + "properties": { + "title": { + "title": "Feedback widget title", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "string", + "default": "Was this page helpful?" + }, + "ratings": { + "title": "Feedback ratings", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "array", + "items": { + "title": "Feedback rating", + "type": "object", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "name": { + "title": "Feedback rating name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.name", + "type": "string" + }, + "data": { + "title": "Feedback rating data", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.data", + "type": "number" + }, + "note": { + "title": "Feedback rating data", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.note", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "name", + "data", + "note" + ] + } + } + }, + "additionalProperties": false, + "required": [ + "title" + ] + } + }, + "defaultSnippets": [ + { + "label": "analytics (default)", + "body": { + "analytics": { + "provider": "${1:google}", + "property": "${2:G-XXXXXXXXXX}" + } + } + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/nav.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/nav.json new file mode 100644 index 0000000..8e17fef --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/nav.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Navigation tree", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "type": "array", + "items": { + "anyOf": [ + { + "title": "Navigation item", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "pattern": "\\.md$" + }, + { + "type": "object", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "patternProperties": { + ".*": { + "oneOf": [ + { + "title": "Navigation item", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "pattern": "\\.md$" + }, + { + "$ref": "#" + } + ] + } + } + } + ] + }, + "additionalItems": false +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins.json new file mode 100644 index 0000000..4d019eb --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins.json @@ -0,0 +1,140 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Plugins", + "markdownDescription": "https://www.mkdocs.org/dev-guide/plugins/", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/$defs/built-in" + }, + { + "$ref": "#/$defs/external" + }, + { + "$ref": "#/$defs/external-community" + } + ] + }, + "uniqueItems": true, + "minItems": 1, + "$defs": { + "built-in": { + "description": "Built-in plugins", + "anyOf": [ + { + "$ref": "plugins/blog.json" + }, + { + "$ref": "plugins/group.json" + }, + { + "$ref": "plugins/info.json" + }, + { + "$ref": "plugins/meta.json" + }, + { + "$ref": "plugins/offline.json" + }, + { + "$ref": "plugins/optimize.json" + }, + { + "$ref": "plugins/privacy.json" + }, + { + "$ref": "plugins/projects.json" + }, + { + "$ref": "plugins/search.json" + }, + { + "$ref": "plugins/social.json" + }, + { + "$ref": "plugins/tags.json" + }, + { + "$ref": "plugins/typeset.json" + } + ] + }, + "external": { + "description": "External plugins, schema provided by us", + "anyOf": [ + { + "$ref": "plugins/external/awesome-nav.json" + }, + { + "$ref": "plugins/external/gen-files.json" + }, + { + "$ref": "plugins/external/git-authors.json" + }, + { + "$ref": "plugins/external/git-committers.json" + }, + { + "$ref": "plugins/external/git-revision-date.json" + }, + { + "$ref": "plugins/external/literate-nav.json" + }, + { + "$ref": "plugins/external/macros.json" + }, + { + "$ref": "plugins/external/minify.json" + }, + { + "$ref": "plugins/external/redirects.json" + }, + { + "$ref": "plugins/external/section-index.json" + } + ] + }, + "external-community": { + "description": "External plugins, schema provided by our community", + "anyOf": [ + { + "$ref": "https://raw.githubusercontent.com/mondeja/mkdocs-include-markdown-plugin/master/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/mondeja/mkdocs-material-relative-language-selector/master/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/Guts/mkdocs-rss-plugin/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/timvink/mkdocs-git-revision-date-localized-plugin/master/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/blueswen/mkdocs-glightbox/main/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/prcr/mkdocs-meta-descriptions-plugin/main/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/mkdocstrings/mkdocstrings/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/pawamoy/mkdocs-coverage/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/pawamoy/mkdocs-spellcheck/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/pawamoy/markdown-exec/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/timvink/mkdocs-table-reader-plugin/master/docs/schema.json" + }, + { + "$ref": "https://gitlab.com/frederic-zinelli/mkdocs-addresses/-/raw/main/mkdocs-addresses-schema.json" + } + ] + } + } +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/blog.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/blog.json new file mode 100644 index 0000000..ef46b43 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/blog.json @@ -0,0 +1,449 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in blog plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/", + "const": "blog" + }, + { + "type": "object", + "properties": { + "blog": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.enabled", + "type": "boolean", + "default": true + }, + "blog_dir": { + "title": "Blog directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.blog_dir", + "type": "string", + "default": "blog" + }, + "blog_toc": { + "title": "Table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.blog_toc", + "type": "boolean", + "default": false + }, + "post_dir": { + "title": "Post directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_dir", + "type": "string", + "default": "\"{blog\\}/posts\"" + }, + "post_date_format": { + "title": "Format string for post dates", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_date_format", + "default": "long", + "oneOf": [ + { + "enum": [ + "full", + "long", + "medium", + "short" + ] + }, + { + "type": "string" + } + ] + }, + "post_url_date_format": { + "title": "Format string for post dates in URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_url_date_format", + "oneOf": [ + { + "enum": [ + "yyyy", + "yyyy/MM", + "yyyy/MM/dd" + ] + }, + { + "type": "string" + } + ], + "default": "yyyy" + }, + "post_url_format": { + "title": "Format string for post URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_url_format", + "oneOf": [ + { + "enum": [ + "\"{date}/{file}\"", + "\"{date}/{slug}\"", + "\"{file}\"", + "\"{slug}\"" + ] + }, + { + "type": "string" + } + ] + }, + "post_url_max_categories": { + "title": "Number of categories in post URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_url_max_categories", + "type": "number", + "default": 1 + }, + "post_slugify": { + "title": "Post slugify function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "post_slugify_separator": { + "title": "Post slugify separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_slugify_separator", + "type": "string", + "default": "\"-\"" + }, + "post_excerpt": { + "title": "Post excerpts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt", + "oneOf": [ + { + "title": "Post excerpts are optional", + "const": "optional" + }, + { + "title": "Post excerpts are required, thus the build will fail", + "const": "required" + } + ], + "default": "optional" + }, + "post_excerpt_max_authors": { + "title": "Number of authors to render in post excerpts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt_max_authors", + "type": "number", + "default": 1 + }, + "post_excerpt_max_categories": { + "title": "Number of categories to render in post excerpts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt_max_categories", + "type": "number", + "default": 5 + }, + "post_excerpt_separator": { + "title": "Post excerpt separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt_separator", + "type": "string", + "default": "<!-- more -->" + }, + "post_readtime": { + "title": "Post reading time computation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_readtime", + "type": "boolean", + "default": true + }, + "post_readtime_words_per_minute": { + "title": "Post reading time words per minute", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_readtime_words_per_minute", + "type": "number", + "default": 265 + }, + "archive": { + "title": "Archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive", + "type": "boolean", + "default": true + }, + "archive_name": { + "title": "Archive name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_name", + "type": "string", + "default": "Archive" + }, + "archive_date_format": { + "title": "Format string for archive dates", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_date_format", + "oneOf": [ + { + "enum": [ + "yyyy", + "MMMM yyyy" + ] + }, + { + "type": "string" + } + ], + "default": "yyyy" + }, + "archive_url_date_format": { + "title": "Format string for archive dates in URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_url_date_format", + "oneOf": [ + { + "enum": [ + "yyyy", + "yyyy/MM" + ] + }, + { + "type": "string" + } + ], + "default": "yyyy" + }, + "archive_url_format": { + "title": "Format string for archive URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_url_format", + "oneOf": [ + { + "enum": [ + "\"archive/{date}\"" + ] + }, + { + "type": "string" + } + ] + }, + "archive_pagination": { + "title": "Pagination for archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination", + "type": "boolean", + "default": true + }, + "archive_pagination_per_page": { + "title": "Posts per page for archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination_per_page", + "type": "number", + "default": 10 + }, + "archive_toc": { + "title": "Table of contents for archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_toc", + "type": "boolean", + "default": false + }, + "categories": { + "title": "Categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories", + "type": "boolean", + "default": true + }, + "categories_name": { + "title": "Categories name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_name", + "type": "string", + "default": "Categories" + }, + "categories_url_format": { + "title": "Format string for category URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_url_format", + "oneOf": [ + { + "enum": [ + "\"category/{slug}\"", + "\"{slug}\"" + ] + }, + { + "type": "string" + } + ] + }, + "categories_slugify": { + "title": "Categories slugify function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "categories_slugify_separator": { + "title": "Categories slugify separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_slugify_separator", + "type": "string", + "default": "\"-\"" + }, + "categories_sort_by": { + "title": "Sort categories by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_sort_by", + "default": "!!python/name:material.plugins.blog.view_name", + "oneOf": [ + { + "type": "string" + }, + { + "enum": [ + "!!python/name:material.plugins.blog.view_name", + "!!python/name:material.plugins.blog.view_post_count" + ] + } + ] + }, + "categories_sort_reverse": { + "title": "Soft categories in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_sort_reverse", + "default": false + }, + "categories_allowed": { + "title": "Allowed categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_allowed", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "categories_pagination": { + "title": "Pagination for categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination", + "type": "boolean", + "default": true + }, + "categories_pagination_per_page": { + "title": "Posts per page for categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination_per_page", + "type": "number", + "default": 10 + }, + "categories_toc": { + "title": "Table of contents for categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_toc", + "type": "boolean", + "default": false + }, + "authors": { + "title": "Author info", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors", + "type": "boolean", + "default": true + }, + "authors_file": { + "title": "Authors file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_file", + "type": "string", + "default": "\"{blog}/.authors.yml\"" + }, + "authors_profiles": { + "title": "Author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles", + "type": "boolean", + "default": false + }, + "authors_profiles_name": { + "title": "Authors profiles name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_name", + "type": "string", + "default": "Authors" + }, + "authors_profiles_url_format": { + "title": "Format string for author profile URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_url_format", + "oneOf": [ + { + "enum": [ + "\"author/{slug}\"", + "\"{slug}\"" + ] + }, + { + "type": "string" + } + ] + }, + "authors_profiles_pagination": { + "title": "Pagination for author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_pagination", + "type": "boolean", + "default": true + }, + "authors_profiles_pagination_per_page": { + "title": "Posts per page for author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_pagination_per_page", + "type": "number", + "default": 10 + }, + "authors_profiles_toc": { + "title": "Table of contents for author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_toc", + "type": "boolean", + "default": false + }, + "pagination": { + "title": "Pagination", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination", + "type": "boolean", + "default": true + }, + "pagination_per_page": { + "title": "Posts per page", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_per_page", + "type": "number", + "default": 10 + }, + "pagination_url_format": { + "title": "Format string for pagination URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_url_format", + "oneOf": [ + { + "enum": [ + "\"page/{page}\"", + "\"{page}\"" + ] + }, + { + "type": "string" + } + ] + }, + "pagination_template": { + "title": "Template string for pagination", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_template", + "oneOf": [ + { + "enum": [ + "~2~", + "$link_first $link_previous ~2~ $link_next $link_last", + "$link_previous $page $link_next" + ] + }, + { + "type": "string" + } + ], + "default": "~2~" + }, + "pagination_keep_content": { + "title": "Paginated indexes inherit content", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_keep_content", + "type": "boolean", + "default": false + }, + "draft": { + "title": "Render posts marked as drafts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.draft", + "type": "boolean", + "default": false + }, + "draft_on_serve": { + "title": "Render posts marked as drafts when previewing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.draft_on_serve", + "type": "boolean", + "default": true + }, + "draft_if_future_date": { + "title": "Automatically mark posts with future dates as drafts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.draft_if_future_date", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/awesome-nav.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/awesome-nav.json new file mode 100644 index 0000000..20be476 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/awesome-nav.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "Custom advanced navigation config for MkDocs using extra YAML files.", + "oneOf": [ + { + "markdownDescription": "https://github.com/lukasgeiter/mkdocs-awesome-nav", + "const": "awesome-nav" + }, + { + "type": "object", + "properties": { + "awesome-nav": { + "type": "object", + "markdownDescription": "https://lukasgeiter.github.io/mkdocs-awesome-nav", + "properties": { + "filename": { + "title": "The YAML file that defines the navigation", + "markdownDescription": "https://lukasgeiter.github.io/mkdocs-awesome-nav", + "type": "string", + "default": ".nav.yml" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/gen-files.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/gen-files.json new file mode 100644 index 0000000..ceec5de --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/gen-files.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Generate pages during the build", + "oneOf": [ + { + "markdownDescription": "https://github.com/oprypin/mkdocs-gen-files", + "const": "git-authors" + }, + { + "type": "object", + "properties": { + "gen-files": { + "additionalProperties": false, + "properties": { + "scripts": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": ["object", "null"] + } + } + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-authors.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-authors.json new file mode 100644 index 0000000..f7b5e31 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-authors.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add git authors to pages", + "oneOf": [ + { + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/", + "const": "git-authors" + }, + { + "type": "object", + "properties": { + "git-authors": { + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html#enabled", + "type": "boolean", + "default": true + }, + "exclude": { + "title": "List of Markdown file patterns", + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html#exclude", + "type": "array", + "items": { + "pattern": "(\\*|\\.md)$" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-committers.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-committers.json new file mode 100644 index 0000000..06a70f4 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-committers.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add git contributors to pages", + "oneOf": [ + { + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2", + "const": "git-committers" + }, + { + "type": "object", + "properties": { + "git-committers": { + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#+git-committers.enabled", + "type": "boolean", + "default": true + }, + "repository": { + "title": "Repository slug", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#+git-committers.repository", + "type": "string" + }, + "branch": { + "title": "Repository branch", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#+git-committers.branch", + "type": "string", + "default": "master" + } + }, + "additionalProperties": false, + "required": [ + "repository" + ] + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-revision-date.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-revision-date.json new file mode 100644 index 0000000..968bed6 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/git-revision-date.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add git revision date to pages", + "oneOf": [ + { + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin", + "const": "git-revision-date" + }, + { + "type": "object", + "properties": { + "git-revision-date": { + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin", + "type": "object", + "properties": { + "enable_if_env": { + "title": "Enable plugin when environment variable is set", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "string" + }, + "modify_md": { + "title": "Enable plugin to be used in Markdown files", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "boolean", + "default": true + }, + "as_datetime": { + "title": "Output as Python datetime", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/literate-nav.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/literate-nav.json new file mode 100644 index 0000000..1cdeb0b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/literate-nav.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "Configure navigation in Markdown instead of YAML", + "oneOf": [ + { + "markdownDescription": "https://github.com/oprypin/mkdocs-literate-nav", + "const": "literate-nav" + }, + { + "type": "object", + "properties": { + "literate-nav": { + "markdownDescription": "https://github.com/oprypin/mkdocs-literate-nav", + "type": "object", + "properties": { + "nav_file": { + "title": "The name of the file to read to determine the navigation for a particular directory under `docs_dir`", + "markdownDescription": "https://oprypin.github.io/mkdocs-literate-nav/reference.html#nav_file", + "type": "string", + "default": "SUMMARY.md" + }, + "implicit_index": { + "title": "If set and a directory has a file named `index.md` or `README.md`, but the literate nav for that directory that never includes it, it will be inserted as the first item of the nav", + "markdownDescription": "https://oprypin.github.io/mkdocs-literate-nav/reference.html#implicit_index", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/macros.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/macros.json new file mode 100644 index 0000000..122de24 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/macros.json @@ -0,0 +1,70 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "Use variables and macros in Markdown", + "oneOf": [ + { + "markdownDescription": "https://github.com/fralau/mkdocs_macros_plugin", + "const": "macros" + }, + { + "type": "object", + "properties": { + "macros": { + "markdownDescription": "", + "type": "object", + "properties": { + "module_name": { + "title": "Name of the Python module containing macros, filters and variables", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/#configuration-of-the-plugin", + "type": "string", + "default": "main" + }, + "modules": { + "title": "List of preinstalled Python modules, i.e. listed by `pip list`", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/#configuration-of-the-plugin", + "type": "array" + }, + "include_dir": { + "title": "Directory for including external files", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#changing-the-directory-of-the-includes", + "type": "string" + }, + "include_yaml": { + "title": "List of yaml files or `key: filename` pairs to be included", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#including-external-yaml-files", + "type": "array" + }, + "j2_block_start_string": { + "title": "Non-standard Jinja2 marker for start of block", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "j2_block_end_string": { + "title": "Non-standard Jinja2 marker for end of block", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "j2_variable_start_string": { + "title": "Non-standard Jinja2 marker for start of variable", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "j2_variable_end_string": { + "title": "Non-standard Jinja2 marker for end of variable", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "on_error_fail": { + "title": "Stop build/serve when macro error happens", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#can-i-make-mkdocs-macros-build-process-to-fail-in-case-of-error-instead-of-displaying-the-error-on-the-page", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/minify.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/minify.json new file mode 100644 index 0000000..5867fa6 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/minify.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Minify HTML, JavaScript and CSS during the build", + "type": "object", + "properties": { + "minify": { + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin", + "type": "object", + "dependencies": { + "minify_js": [ + "js_files" + ], + "minify_css": [ + "css_files" + ] + }, + "properties": { + "minify_html": { + "title": "Minify HTML files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": true + }, + "minify_js": { + "title": "Minify JavaScript files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": false + }, + "minify_css": { + "title": "Minify CSS files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": false + }, + "htmlmin_opts": { + "title": "Options for HTML minifier", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "object" + }, + "cache_safe": { + "title": "Add hash to Javascript and CSS file names", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": false + }, + "js_files": { + "title": "JavaScript files to minify", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "array", + "items": { + "title": "Path to JavaScript file", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "pattern": "\\.js$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "css_files": { + "title": "CSS files to minify", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "pattern": "\\.css$" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/redirects.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/redirects.json new file mode 100644 index 0000000..e053486 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/redirects.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add redirects when moving pages to new locations", + "type": "object", + "properties": { + "redirects": { + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects", + "type": "object", + "properties": { + "redirect_maps": { + "title": "Mapping of Markdown files", + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects#using", + "type": "object", + "patternProperties": { + "\\.md$": { + "oneOf": [ + { + "title": "Internal redirect", + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects#using", + "pattern": "\\.md(#\\S+)?$" + }, + { + "title": "External redirect", + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects#using", + "pattern": "^https?:" + } + ] + } + }, + "defaultSnippets": [ + { + "label": "Internal redirect", + "body": { + "${1:from}.md": "${2:to}.md" + } + }, + { + "label": "External redirect", + "body": { + "${1:from}.md": "https://${2:to.url}" + } + } + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/section-index.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/section-index.json new file mode 100644 index 0000000..3c83526 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/external/section-index.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add index section pages to navigation", + "oneOf": [ + { + "markdownDescription": "https://github.com/oprypin/mkdocs-section-index", + "const": "section-index" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "section-index": {} + } + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/group.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/group.json new file mode 100644 index 0000000..f5c5647 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/group.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in group plugin", + "oneOf": [ + { + "type": "object", + "properties": { + "group": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/group/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/group/#config.enabled", + "type": "boolean", + "default": true + }, + "plugins": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/group/#config.plugins", + "$ref": "../plugins.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/info.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/info.json new file mode 100644 index 0000000..320b73c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/info.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in info plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/", + "const": "info" + }, + { + "type": "object", + "properties": { + "info": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.enabled", + "type": "boolean", + "default": true + }, + "enabled_on_serve": { + "title": "Enable plugin when previewing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.enabled_on_serve", + "type": "boolean", + "default": false + }, + "archive": { + "title": "Enable creation of archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.archive", + "type": "boolean", + "default": true + }, + "archive_stop_on_violation": { + "title": "Stop creation of archive on violation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.archive_stop_on_violation", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/meta.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/meta.json new file mode 100644 index 0000000..7e8c5e7 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/meta.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in meta plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/", + "const": "meta" + }, + { + "type": "object", + "properties": { + "meta": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/#config.enabled", + "type": "boolean", + "default": true + }, + "meta_file": { + "title": "Meta file name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/#config.meta_file", + "pattern": "\\.yml$", + "default": "\"**/.meta.yml\"" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/offline.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/offline.json new file mode 100644 index 0000000..838168d --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/offline.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in offline plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/", + "const": "offline" + }, + { + "type": "object", + "properties": { + "offline": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/#config.enabled", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/optimize.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/optimize.json new file mode 100644 index 0000000..f61a73f --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/optimize.json @@ -0,0 +1,118 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in optimize plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/", + "const": "optimize" + }, + { + "type": "object", + "properties": { + "optimize": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/optimize" + }, + "optimize_png": { + "title": "Optimization of PNGs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_png", + "type": "boolean", + "default": true + }, + "optimize_png_speed": { + "title": "Speed/quality tradeoff [1,10]", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_png_speed", + "type": "number", + "default": 4 + }, + "optimize_png_strip": { + "title": "Strip unnecessary metadata from PNGs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_png_strip", + "type": "boolean", + "default": true + }, + "optimize_jpg": { + "title": "Optimization of JPGs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_jpg", + "type": "boolean", + "default": true + }, + "optimize_jpg_quality": { + "title": "Speed/quality tradeoff for pngquant [0,10]", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_jpg_quality", + "type": "number", + "default": 60 + }, + "optimize_jpg_progressive": { + "title": "Progressive encoding (faster rendering)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_jpg_progressive", + "type": "boolean", + "default": true + }, + "optimize_include": { + "title": "Files or folders to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_include", + "type": "array", + "items": { + "title": "Files or folders matching this pattern will be included", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_include", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "optimize_exclude": { + "title": "Files or folders to exclude", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_exclude", + "type": "array", + "items": { + "title": "Files or folders matching this pattern will be excluded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "print_gain": { + "title": "Print optimization gain", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.print_gain", + "type": "boolean", + "default": true + }, + "print_gain_summary": { + "title": "Print optimization gain summary", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.print_gain_summary", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/privacy.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/privacy.json new file mode 100644 index 0000000..1233ac5 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/privacy.json @@ -0,0 +1,127 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in privacy plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/", + "const": "privacy" + }, + { + "type": "object", + "properties": { + "privacy": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/privacy" + }, + "log": { + "title": "Enable logging", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.log", + "type": "boolean", + "default": true + }, + "log_level": { + "title": "Log level", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.log_level", + "enum": [ + "error", + "warn", + "info", + "debug" + ], + "default": "info" + }, + "assets": { + "title": "Process external assets", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets", + "type": "boolean", + "default": true + }, + "assets_fetch": { + "title": "Download external assets", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_fetch", + "type": "boolean", + "default": true + }, + "assets_fetch_dir": { + "title": "Download external assets to this directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_fetch_dir", + "type": "string", + "default": "assets/external" + }, + "assets_include": { + "title": "External assets to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_include", + "type": "array", + "items": { + "title": "External assets matching this pattern will be downloaded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_include", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "assets_exclude": { + "title": "External assets to exclude", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_exclude", + "type": "array", + "items": { + "title": "External assets matching this pattern will not be downloaded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "links": { + "title": "Process external links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.links", + "type": "boolean", + "default": true + }, + "links_attr_map": { + "title": "Custom attributes to add to external links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.links_attr_map", + "type": "object", + "patternProperties": { + "^[\\w_]+$": { + "type": "string" + } + } + }, + "links_noopener": { + "title": "Behavior for external links that open in new windows", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.links_noopener", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/projects.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/projects.json new file mode 100644 index 0000000..74b4be8 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/projects.json @@ -0,0 +1,97 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in projects plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/", + "const": "projects" + }, + { + "type": "object", + "properties": { + "projects": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/projects" + }, + "log": { + "title": "Enable logging", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.log", + "type": "boolean", + "default": true + }, + "log_level": { + "title": "Log level", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.log_level", + "enum": [ + "error", + "warn", + "info", + "debug" + ], + "default": "info" + }, + "projects": { + "title": "Enable projects", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects", + "type": "boolean", + "default": true + }, + "projects_dir": { + "title": "Projects directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects_dir", + "type": "string", + "default": "projects" + }, + "projects_config_files": { + "title": "Projects configuration files", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects_config_files", + "type": "string", + "default": "\"*/mkdocs.yml\"" + }, + "projects_config_transform": { + "title": "Projects configuration transform", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects_config_transform", + "type": "string", + "defaultSnippets": [ + { + "body": "!!python/name:${1:module}.${2:function}" + } + ] + }, + "hoisting": { + "title": "Enable hoisting", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.hoisting", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/search.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/search.json new file mode 100644 index 0000000..dd1ad9e --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/search.json @@ -0,0 +1,152 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in search plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/", + "const": "search" + }, + { + "type": "object", + "properties": { + "search": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/", + "type": "object", + "properties": { + "lang": { + "oneOf": [ + { + "$ref": "#/$defs/lang" + }, + { + "type": "array", + "items": { + "$ref": "#/$defs/lang" + }, + "uniqueItems": true, + "minItems": 1 + } + ], + "default": "en" + }, + "separator": { + "title": "Separator for indexing and query tokenization", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.separator", + "type": "string" + }, + "pipeline": { + "title": "Text processing pipeline for indexing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.pipeline", + "type": "array", + "items": { + "enum": [ + "stemmer", + "stopWordFilter", + "trimmer" + ] + }, + "uniqueItems": true + }, + "jieba_dict": { + "title": "Jieba dictionary replacement", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.jieba_dict", + "type": "string" + }, + "jieba_dict_user": { + "title": "Jieba dictionary augmentation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.jieba_dict_user", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "$defs": { + "lang": { + "title": "Site search language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.lang", + "oneOf": [ + { + "title": "Site search language: Arabic", + "const": "ar" + }, + { + "title": "Site search language: Danish", + "const": "da" + }, + { + "title": "Site search language: German", + "const": "de" + }, + { + "title": "Site search language: Dutch", + "const": "du" + }, + { + "title": "Site search language: English", + "const": "en" + }, + { + "title": "Site search language: Spanish", + "const": "es" + }, + { + "title": "Site search language: Finnish", + "const": "fi" + }, + { + "title": "Site search language: French", + "const": "fr" + }, + { + "title": "Site search language: Hungarian", + "const": "hu" + }, + { + "title": "Site search language: Italian", + "const": "it" + }, + { + "title": "Site search language: Japanese", + "const": "ja" + }, + { + "title": "Site search language: Norwegian", + "const": "no" + }, + { + "title": "Site search language: Portuguese", + "const": "pt" + }, + { + "title": "Site search language: Romanian", + "const": "ro" + }, + { + "title": "Site search language: Russian", + "const": "ru" + }, + { + "title": "Site search language: Swedish", + "const": "sv" + }, + { + "title": "Site search language: Thai", + "const": "th" + }, + { + "title": "Site search language: Turkish", + "const": "tr" + }, + { + "title": "Site search language: Vietnamese", + "const": "vi" + } + ] + } + } +} + diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/social.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/social.json new file mode 100644 index 0000000..a8eeae9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/social.json @@ -0,0 +1,157 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in social plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/", + "const": "social" + }, + { + "type": "object", + "properties": { + "social": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/social" + }, + "cards": { + "title": "Social cards", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards", + "type": "boolean", + "default": true + }, + "log": { + "title": "Enable logging", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.log", + "type": "boolean", + "default": true + }, + "log_level": { + "title": "Log level", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.log_level", + "enum": [ + "warn", + "info", + "ignore" + ], + "default": "warn" + }, + "cards_dir": { + "title": "Social cards directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_dir", + "type": "string", + "default": "assets/images/social" + }, + "cards_layout_dir": { + "title": "Social cards layout directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_layout_dir", + "type": "string", + "default": "layouts" + }, + "cards_layout": { + "title": "Social cards layout", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_layout", + "default": "default", + "oneOf": [ + { + "enum": [ + "default", + "default/accent", + "default/invert", + "default/variant" + ] + }, + { + "type": "string" + } + ] + }, + "cards_layout_options": { + "title": "Social cards layout options", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_layout_options", + "type": "object" + }, + "cards_include": { + "title": "Pages or folders to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_include", + "type": "array", + "items": { + "title": "Pages or folders matching this pattern will be included", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_include", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "cards_exclude": { + "title": "Pages or folders to exclude", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_exclude", + "type": "array", + "items": { + "title": "Pages or folders matching this pattern will be excluded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "debug": { + "title": "Debug mode", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug", + "type": "boolean", + "default": true + }, + "debug_on_build": { + "title": "Always disable debug mode on build", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_on_build", + "type": "boolean", + "default": false + }, + "debug_grid": { + "title": "Debug grid", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_grid", + "type": "boolean", + "default": true + }, + "debug_grid_step": { + "title": "Debug grid step size", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_grid_step", + "type": "number", + "default": 32 + }, + "debug_color": { + "title": "Debug color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_color", + "type": "string", + "default": "yellow" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/tags.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/tags.json new file mode 100644 index 0000000..447afd5 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/tags.json @@ -0,0 +1,225 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in tags plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/", + "const": "tags" + }, + { + "type": "object", + "properties": { + "tags": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.enabled", + "type": "boolean", + "default": true + }, + "tags": { + "title": "Rendering of tags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags", + "type": "boolean", + "default": true + }, + "tags_file": { + "title": "Markdown file to render tags index", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_file", + "pattern": "\\.md$", + "default": "tags.md" + }, + "tags_slugify": { + "title": "Tags slugify function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "tags_slugify_separator": { + "title": "Tags slugify separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_slugify_separator", + "type": "string", + "default": "-" + }, + "tags_slugify_format": { + "title": "Format string for tags slugifier", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_slugify_format", + "type": "string", + "default": "\"tag:{slug}\"" + }, + "tags_hierarchy": { + "title": "Rendering of tags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags", + "type": "boolean", + "default": true + }, + "tags_sort_by": { + "title": "Sort tags by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_sort_by", + "default": "!!python/name:material.plugins.tags.casefold" + }, + "tags_sort_reverse": { + "title": "Soft tags in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_sort_reverse", + "default": false + }, + "tags_name_property": { + "title": "Tags front matter property", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_name_property", + "type": "string", + "default": "tags" + }, + "tags_name_variable": { + "title": "Tags Jinja variable name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_name_variable", + "type": "string", + "default": "tags" + }, + "tags_allowed": { + "title": "Tags allowed", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_allowed", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "listings": { + "title": "Rendering of listings", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings", + "type": "boolean", + "default": true + }, + "listings_map": { + "title": "Map of listing configurations", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_map", + "type": "object", + "patternProperties": { + ".*": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#listing-configuration", + "type": "object", + "properties": { + "scope": { + "title": "Scoped listing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#listing.scope", + "default": false + }, + "shadow": { + "title": "Render shadow tags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#listing.shadow", + "default": true + }, + "include": { + "title": "Tag inclusion list", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#listing.include", + "type": "array", + "uniqueItems": true + }, + "exclude": { + "title": "Tag exclusion list", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#listing.exclude", + "type": "array", + "uniqueItems": true + }, + "toc": { + "title": "Render tags in table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#listing.toc", + "default": true + } + } + } + }, + "additionalProperties": false + }, + "listings_sort_by": { + "title": "Sort listing items by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_sort_by", + "default": "!!python/name:material.plugins.tags.casefold" + }, + "listings_sort_reverse": { + "title": "Soft listing items in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_sort_reverse", + "default": false + }, + "listings_tags_sort_by": { + "title": "Sort listing tags by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_tags_sort_by", + "default": "!!python/name:material.plugins.tags.casefold" + }, + "listings_tags_sort_reverse": { + "title": "Soft listing tags in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_tags_sort_reverse", + "default": false + }, + "listings_directive": { + "title": "Listings directive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_directive", + "type": "string", + "default": "material/tags" + }, + "listings_toc": { + "title": "Render tags in table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.listings_toc", + "default": true + }, + "shadow": { + "title": "Rendering shadow tags on build", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.shadow", + "type": "boolean", + "default": false + }, + "shadow_on_serve": { + "title": "Rendering shadow tags on serve", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.shadow_on_serve", + "type": "boolean", + "default": true + }, + "shadow_tags": { + "title": "Shadow tags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.shadow_tags", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "shadow_tags_prefix": { + "title": "Shadow tags prefix", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.shadow_tags_prefix", + "type": "string", + "default": "_" + }, + "shadow_tags_suffix": { + "title": "Shadow tags suffix", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.shadow_tags_suffix", + "type": "string" + }, + "export": { + "title": "Tags export", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.export", + "type": "boolean", + "default": true + }, + "export_file": { + "title": "Tags file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.export_file", + "type": "boolean", + "default": "tags.json" + }, + "export_only": { + "title": "Only export tags, don't render them", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.export_only", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/typeset.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/typeset.json new file mode 100644 index 0000000..1975da5 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/plugins/typeset.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in typeset plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/", + "const": "typeset" + }, + { + "type": "object", + "properties": { + "typeset": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/#config.enabled", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/theme.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/theme.json new file mode 100644 index 0000000..15fca4b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/theme.json @@ -0,0 +1,893 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Theme configuration", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "object", + "properties": { + "name": { + "title": "Theme name", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#name", + "oneOf": [ + { + "const": "material" + }, + { + "type": "null" + } + ], + "default": "material" + }, + "custom_dir": { + "title": "Directory with theme overrides", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#setup-and-theme-structure", + "type": "string", + "defaultSnippets": [ + { + "body": "${1:overrides}" + } + ] + }, + "static_templates": { + "title": "Static templates to render", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#static_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#static_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "language": { + "title": "Site language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/", + "oneOf": [ + { + "title": "Site language: Custom", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#custom-translations", + "const": "custom" + }, + { + "title": "Site language: Afrikaans", + "const": "af" + }, + { + "title": "Site language: Arabic", + "const": "ar" + }, + { + "title": "Site language: Bulgarian", + "const": "bg" + }, + { + "title": "Site language: Bengali (Bangla)", + "const": "bn" + }, + { + "title": "Site language: Catalan", + "const": "ca" + }, + { + "title": "Site language: Czech", + "const": "cs" + }, + { + "title": "Site language: Danish", + "const": "da" + }, + { + "title": "Site language: German", + "const": "de" + }, + { + "title": "Site language: Greek", + "const": "el" + }, + { + "title": "Site language: English", + "const": "en" + }, + { + "title": "Site language: Esperanto", + "const": "eo" + }, + { + "title": "Site language: Spanish", + "const": "es" + }, + { + "title": "Site language: Estonian", + "const": "et" + }, + { + "title": "Site language: Persian (Farsi)", + "const": "fa" + }, + { + "title": "Site language: Finnish", + "const": "fi" + }, + { + "title": "Site language: French", + "const": "fr" + }, + { + "title": "Site language: Galician", + "const": "gl" + }, + { + "title": "Site language: Hebrew", + "const": "he" + }, + { + "title": "Site language: Hindi", + "const": "hi" + }, + { + "title": "Site language: Croatian", + "const": "hr" + }, + { + "title": "Site language: Hungarian", + "const": "hu" + }, + { + "title": "Site language: Armenian", + "const": "hy" + }, + { + "title": "Site language: Indonesian", + "const": "id" + }, + { + "title": "Site language: Icelandic", + "const": "is" + }, + { + "title": "Site language: Italian", + "const": "it" + }, + { + "title": "Site language: Japanese", + "const": "ja" + }, + { + "title": "Site language: Georgian", + "const": "ka" + }, + { + "title": "Site language: Kannada", + "const": "kn" + }, + { + "title": "Site language: Korean", + "const": "ko" + }, + { + "title": "Site language: Lithuanian", + "const": "lt" + }, + { + "title": "Site language: Latvian", + "const": "lv" + }, + { + "title": "Site language: Macedonian", + "const": "mk" + }, + { + "title": "Site language: Mongolian", + "const": "mn" + }, + { + "title": "Site language: Bahasa Malaysia", + "const": "ms" + }, + { + "title": "Site language: Burmese", + "const": "my" + }, + { + "title": "Site language: Dutch", + "const": "nl" + }, + { + "title": "Site language: Norwegian (Bokmål)", + "const": "nb" + }, + { + "title": "Site language: Norwegian (Nynorsk)", + "const": "nn" + }, + { + "title": "Site language: Polish", + "const": "pl" + }, + { + "title": "Site language: Portuguese", + "const": "pt" + }, + { + "title": "Site language: Portuguese (Brasilian)", + "const": "pt-BR" + }, + { + "title": "Site language: Romanian", + "const": "ro" + }, + { + "title": "Site language: Russian", + "const": "ru" + }, + { + "title": "Site language: Sanskrit", + "const": "sa" + }, + { + "title": "Site language: Serbo-Croatian", + "const": "sh" + }, + { + "title": "Site language: Sinhalese", + "const": "si" + }, + { + "title": "Site language: Slovak", + "const": "sk" + }, + { + "title": "Site language: Slovenian", + "const": "sl" + }, + { + "title": "Site language: Albanian", + "const": "sq" + }, + { + "title": "Site language: Serbian", + "const": "sr" + }, + { + "title": "Site language: Swedish", + "const": "sv" + }, + { + "title": "Site language: Tamil", + "const": "ta" + }, + { + "title": "Site language: Telugu", + "const": "te" + }, + { + "title": "Site language: Thai", + "const": "th" + }, + { + "title": "Site language: Tagalog", + "const": "tl" + }, + { + "title": "Site language: Turkish", + "const": "tr" + }, + { + "title": "Site language: Ukrainian", + "const": "uk" + }, + { + "title": "Site language: Urdu", + "const": "ur" + }, + { + "title": "Site language: Uzbek", + "const": "uz" + }, + { + "title": "Site language: Vietnamese", + "const": "vi" + }, + { + "title": "Site language: Chinese (Simplified)", + "const": "zh" + }, + { + "title": "Site language: Chinese (Traditional)", + "const": "zh-Hant" + }, + { + "title": "Site language: Chinese (Taiwanese)", + "const": "zh-TW" + } + ], + "default": "en" + }, + "direction": { + "title": "Directionality", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#directionality", + "enum": [ + "ltr", + "rtl" + ] + }, + "favicon": { + "title": "Favicon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#favicon", + "pattern": "\\.(ico|png|svg|jpe?g|gif)$", + "defaultSnippets": [ + { + "body": "${1:path/to/file}.png" + } + ] + }, + "logo": { + "title": "Logo", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo", + "pattern": "\\.(png|svg|jpe?g|gif|webp)$", + "defaultSnippets": [ + { + "body": "${1:path/to/file}.png" + } + ] + }, + "icon": { + "title": "Icons", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/", + "type": "object", + "properties": { + "edit": { + "$ref": "#/$defs/icon" + }, + "view": { + "$ref": "#/$defs/icon" + }, + "logo": { + "$ref": "#/$defs/icon" + }, + "repo": { + "$ref": "#/$defs/icon" + }, + "annotation": { + "$ref": "#/$defs/icon" + }, + "top": { + "$ref": "#/$defs/icon" + }, + "share": { + "$ref": "#/$defs/icon" + }, + "menu": { + "$ref": "#/$defs/icon" + }, + "alternate": { + "$ref": "#/$defs/icon" + }, + "search": { + "$ref": "#/$defs/icon" + }, + "close": { + "$ref": "#/$defs/icon" + }, + "previous": { + "$ref": "#/$defs/icon" + }, + "next": { + "$ref": "#/$defs/icon" + }, + "admonition": { + "title": "Admonition icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/admonitions/#admonition-icons", + "type": "object", + "properties": { + "note": { + "$ref": "#/$defs/icon" + }, + "abstract": { + "$ref": "#/$defs/icon" + }, + "info": { + "$ref": "#/$defs/icon" + }, + "tip": { + "$ref": "#/$defs/icon" + }, + "success": { + "$ref": "#/$defs/icon" + }, + "question": { + "$ref": "#/$defs/icon" + }, + "warning": { + "$ref": "#/$defs/icon" + }, + "failure": { + "$ref": "#/$defs/icon" + }, + "danger": { + "$ref": "#/$defs/icon" + }, + "bug": { + "$ref": "#/$defs/icon" + }, + "example": { + "$ref": "#/$defs/icon" + }, + "quote": { + "$ref": "#/$defs/icon" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "note", + "body": "note: ${1:material/pencil-circle}" + }, + { + "label": "abstract", + "body": "abstract: ${1:material/clipboard-text}" + }, + { + "label": "info", + "body": "info: ${1:material/information}" + }, + { + "label": "tip", + "body": "tip: ${1:material/fire}" + }, + { + "label": "success", + "body": "success: ${1:material/check}" + }, + { + "label": "question", + "body": "question: ${1:material/help-circle}" + }, + { + "label": "warning", + "body": "warning: ${1:material/alert}" + }, + { + "label": "failure", + "body": "failure: ${1:material/close}" + }, + { + "label": "danger", + "body": "danger: ${1:material/lightning-bolt-circle}" + }, + { + "label": "bug", + "body": "bug: ${1:material/shield-bug}" + }, + { + "label": "example", + "body": "example: ${1:material/test-tube}" + }, + { + "label": "quote", + "body": "quote: ${1:material/format-quote-close}" + } + ] + }, + "tag": { + "title": "Tag icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons-and-identifiers", + "type": "object", + "patternProperties": { + "^[\\w-]+$": { + "$ref": "#/$defs/icon" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "edit", + "body": "edit: ${1:material/pencil}" + }, + { + "label": "logo", + "body": "logo: ${1:material/library}" + }, + { + "label": "repo", + "body": "repo: ${1:fontawesome/brands/git-alt}" + }, + { + "label": "top", + "body": "top: ${1:material/arrow-up}" + }, + { + "label": "menu", + "body": "menu: ${1:material/menu}" + }, + { + "label": "alternate", + "body": "alternate: ${1:material/translate}" + }, + { + "label": "share", + "body": "share: ${1:material/share-variant}" + }, + { + "label": "search", + "body": "search: ${1:material/magnify}" + }, + { + "label": "previous", + "body": "previous: ${1:material/arrow-left}" + }, + { + "label": "next", + "body": "next: ${1:material/arrow-right}" + } + ] + }, + "features": { + "title": "Feature flags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Mark as read", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#mark-as-read", + "const": "announce.dismiss" + }, + { + "title": "Edit this page", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#code-actions", + "const": "content.action.edit" + }, + { + "title": "View source of this page", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#code-actions", + "const": "content.action.view" + }, + { + "title": "Code annotations", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-annotations", + "const": "content.code.annotate" + }, + { + "title": "Code copy button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-copy-button", + "const": "content.code.copy" + }, + { + "title": "Code selection button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-selection-button", + "const": "content.code.select" + }, + { + "title": "Footnote tooltips", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/footnotes/#footnote-tooltips", + "const": "content.footnote.tooltips" + }, + { + "title": "Linked content tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/content-tabs/#linked-content-tabs", + "const": "content.tabs.link" + }, + { + "title": "Improved tooltips", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/tooltips/#improved-tooltips", + "const": "content.tooltips" + }, + { + "title": "Header hides automatically when scrolling", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#automatic-hiding", + "const": "header.autohide" + }, + { + "title": "Navigation expansion", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-expansion", + "const": "navigation.expand" + }, + { + "title": "Navigation footer", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-footer", + "const": "navigation.footer" + }, + { + "title": "Section index pages", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#section-index-pages", + "const": "navigation.indexes" + }, + { + "title": "Instant loading", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-loading", + "const": "navigation.instant" + }, + { + "title": "Instant prefetching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-prefetching", + "const": "navigation.instant.prefetch" + }, + { + "title": "Progress indicator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#progress-indicator", + "const": "navigation.instant.progress" + }, + { + "title": "Navigation path (Breadcrumbs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-path", + "const": "navigation.path" + }, + { + "title": "Navigation pruning", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-pruning", + "const": "navigation.prune" + }, + { + "title": "Navigation sections", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections", + "const": "navigation.sections" + }, + { + "title": "Navigation tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-tabs", + "const": "navigation.tabs" + }, + { + "title": "Sticky navigation tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#sticky-navigation-tabs", + "const": "navigation.tabs.sticky" + }, + { + "title": "Back-to-top button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#back-to-top-button", + "const": "navigation.top" + }, + { + "title": "Anchor tracking", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-tracking", + "const": "navigation.tracking" + }, + { + "title": "Search highlighting", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-highlighting", + "const": "search.highlight" + }, + { + "title": "Search sharing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-sharing", + "const": "search.share" + }, + { + "title": "Search suggestions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-suggestions", + "const": "search.suggest" + }, + { + "title": "Integrated table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-following", + "const": "toc.follow" + }, + { + "title": "Integrated table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-integration", + "const": "toc.integrate" + } + ] + }, + "uniqueItems": true, + "minItems": 1 + }, + "palette": { + "oneOf": [ + { + "title": "Color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/", + "type": "object", + "properties": { + "scheme": { + "$ref": "#/$defs/scheme" + }, + "primary": { + "$ref": "#/$defs/primary" + }, + "accent": { + "$ref": "#/$defs/accent" + } + }, + "additionalProperties": false + }, + { + "title": "Color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/", + "type": "array", + "items": { + "type": "object", + "properties": { + "scheme": { + "$ref": "#/$defs/scheme" + }, + "primary": { + "$ref": "#/$defs/primary" + }, + "accent": { + "$ref": "#/$defs/accent" + }, + "media": { + "oneOf": [ + { + "title": "System preference", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#system-preference", + "type": "string", + "enum": [ + "\"(prefers-color-scheme: light)\"", + "\"(prefers-color-scheme: dark)\"" + ] + }, + { + "type": "string" + } + ], + "defaultSnippets": [ + { + "label": "\"(prefers-color-scheme: light)\"", + "body": "\"(prefers-color-scheme: ${1:light})\"" + } + ] + }, + "toggle": { + "title": "Color palette toggle", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-palette-toggle", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "name": { + "title": "Color palette toggle name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#toggle-name", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "name" + ] + } + }, + "additionalProperties": false, + "required": [ + "toggle" + ] + }, + "uniqueItems": true, + "minItems": 1 + } + ], + "default": { + "scheme": "default", + "primary": "indigo", + "accent": "indigo" + } + }, + "font": { + "oneOf": [ + { + "title": "Google Fonts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/", + "type": "object", + "properties": { + "text": { + "$ref": "assets/fonts.json" + }, + "code": { + "$ref": "assets/fonts.json" + } + }, + "additionalProperties": false + }, + { + "title": "Disable Google Fonts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/#autoloading", + "enum": [ + false + ] + } + ], + "defaultSnippets": [ + { + "body": { + "text": "${1:Roboto}", + "code": "${2:Roboto Mono}" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "name" + ], + "$defs": { + "scheme": { + "title": "Color scheme", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-scheme", + "anyOf": [ + { + "enum": [ + "default", + "slate" + ] + }, + { + "type": "string" + } + ] + }, + "primary": { + "title": "Primary color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#primary-color", + "enum": [ + "red", + "pink", + "purple", + "deep purple", + "indigo", + "blue", + "light blue", + "cyan", + "teal", + "green", + "light green", + "lime", + "yellow", + "amber", + "orange", + "deep orange", + "brown", + "grey", + "blue grey", + "black", + "white", + "custom" + ] + }, + "accent": { + "title": "Accent color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#accent-color", + "enum": [ + "red", + "pink", + "purple", + "deep purple", + "indigo", + "blue", + "light blue", + "cyan", + "teal", + "green", + "light green", + "lime", + "yellow", + "amber", + "orange", + "deep orange", + "brown", + "grey", + "blue grey", + "black", + "white", + "custom" + ] + }, + "icon": { + "anyOf": [ + { + "$ref": "assets/icons.json" + }, + { + "title": "Unknown icon", + "type": "string" + } + ] + } + } +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/validation.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/validation.json new file mode 100644 index 0000000..dd61f65 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/schema/validation.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Validation settings", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#validation", + "type": "object", + "properties": { + "omitted_files": { "$ref": "#/$defs/omitted_files" }, + "not_found": { "$ref": "#/$defs/not_found" }, + "absolute_links": { "$ref": "#/$defs/absolute_links" }, + "anchors": { "$ref": "#/$defs/anchors" }, + "unrecognized_links": { "$ref": "#/$defs/unrecognized_links" }, + "nav": { + "title": "validation of navigation", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#validation", + "properties": { + "omitted_files": { "$ref": "#/$defs/omitted_files" }, + "not_found": { "$ref": "#/$defs/not_found" }, + "absolute_links": { "$ref": "#/$defs/absolute_links" } + }, + "additionalProperties": false + }, + "links": { + "title": "Validation of links", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#validation", + "properties": { + "anchors": { "$ref": "#/$defs/anchors" }, + "not_found": { "$ref": "#/$defs/not_found" }, + "absolute_links": { "$ref": "#/$defs/absolute_links" }, + "unrecognized_links": { "$ref": "#/$defs/unrecognized_links" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "$defs": { + "omitted_files": { + "title": "warning level when files exist but are not referenced in navigation", + "$ref": "#/$defs/warning_levels" + }, + "not_found": { + "title": "warning level when file referenced is not found or is excluded", + "$ref": "#/$defs/warning_levels" + }, + "absolute_links": { + "title": "warning level when absolute links are used", + "oneOf": [ + { "$ref": "#/$defs/warning_levels" }, + { "enum": ["relative_to_docs"] } + ] + }, + "unrecognized_links": { + "title": "warning level when a relative link cannot be resolved to a document", + "$ref": "#/$defs/warning_levels" + }, + "anchors": { + "title": "warning level when an #anchor does not exist on the linked document", + "$ref": "#/$defs/warning_levels" + }, + "warning_levels": { + "enum": ["warn", "info", "ignore"] + } + } +} diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/adding-a-comment-system.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/adding-a-comment-system.md new file mode 100644 index 0000000..5238926 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/adding-a-comment-system.md @@ -0,0 +1,113 @@ +# Adding a comment system + +Material for MkDocs allows to easily add the third-party comment system of your +choice to the footer of any page by using [theme extension]. As an example, +we'll be integrating [Giscus], which is Open Source, free, and uses GitHub +discussions as a backend. + + [Giscus]: https://giscus.app/ + +## Customization + +### Giscus integration + +Before you can use [Giscus], you need to complete the following steps: + +1. __Install the [Giscus GitHub App]__ and grant access to the repository + that should host comments as GitHub discussions. Note that this can be a + repository different from your documentation. +2. __Visit [Giscus] and generate the snippet__ through their configuration tool + to load the comment system. Copy the snippet for the next step. The + resulting snippet should look similar to this: + + ``` html + <script + src="https://giscus.app/client.js" + data-repo="<username>/<repository>" + data-repo-id="..." + data-category="..." + data-category-id="..." + data-mapping="pathname" + data-reactions-enabled="1" + data-emit-metadata="1" + data-theme="light" + data-lang="en" + crossorigin="anonymous" + async + > + </script> + ``` + +The [`comments.html`][comments] partial (empty by default) is the best place to +add the snippet generated by [Giscus]. Follow the guide on [theme extension] +and [override the `comments.html` partial][overriding partials] with: + +``` html hl_lines="3" +{% if page.meta.comments %} + <h2 id="__comments">{{ lang.t("meta.comments") }}</h2> + <!-- Insert generated snippet here --> + + <!-- Synchronize Giscus theme with palette --> + <script> + var giscus = document.querySelector("script[src*=giscus]") + + // Set palette on initial load + var palette = __md_get("__palette") + if (palette && typeof palette.color === "object") { + var theme = palette.color.scheme === "slate" + ? "transparent_dark" + : "light" + + // Instruct Giscus to set theme + giscus.setAttribute("data-theme", theme) // (1)! + } + + // Register event handlers after documented loaded + document.addEventListener("DOMContentLoaded", function() { + var ref = document.querySelector("[data-md-component=palette]") + ref.addEventListener("change", function() { + var palette = __md_get("__palette") + if (palette && typeof palette.color === "object") { + var theme = palette.color.scheme === "slate" + ? "transparent_dark" + : "light" + + // Instruct Giscus to change theme + var frame = document.querySelector(".giscus-frame") + frame.contentWindow.postMessage( + { giscus: { setConfig: { theme } } }, + "https://giscus.app" + ) + } + }) + }) + </script> +{% endif %} +``` + +1. This code block ensures that [Giscus] renders with a dark theme when the + palette is set to `slate`. Note that multiple dark themes are available, + so you can change it to your liking. + +Replace the highlighted line with the snippet you generated with the [Giscus] +configuration tool in the previous step. If you copied the snippet from above, +you can enable comments on a page by setting the `comments` front matter +property to `true`: + +``` yaml +--- +comments: true +--- + +# Page title +... +``` + +If you wish to enable comments for an entire folder, you can use the +[built-in meta plugin]. + + [Giscus GitHub App]: https://github.com/apps/giscus + [theme extension]: ../customization.md#extending-the-theme + [comments]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/partials/comments.html + [overriding partials]: ../customization.md#overriding-partials + [built-in meta plugin]: ../plugins/meta.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/adding-a-git-repository.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/adding-a-git-repository.md new file mode 100644 index 0000000..cf347f7 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/adding-a-git-repository.md @@ -0,0 +1,354 @@ +# Adding a git repository + +If your documentation is related to source code, Material for MkDocs provides +the ability to display information to the project's repository as part of the +static site, including stars and forks. Furthermore, the +[date of last update and creation], as well as [contributors] can be shown. + +## Configuration + +### Repository + +<!-- md:version 0.1.0 --> +<!-- md:default none --> + +In order to display a link to the repository of your project as part of your +documentation, set [`repo_url`][repo_url] in `mkdocs.yml` to the public URL of +your repository, e.g.: + +``` yaml +repo_url: https://github.com/squidfunk/mkdocs-material +``` + +The link to the repository will be rendered next to the search bar on big +screens and as part of the main navigation drawer on smaller screen sizes. + +Additionally, for public repositories hosted on [GitHub] or [GitLab], the +latest release tag[^1], as well as the number of stars and forks, are +automatically requested and rendered. + + [^1]: + Unfortunately, GitHub only provides an API endpoint to obtain the [latest + release] - not the latest tag. Thus, make sure to [create a release] (not + pre-release) for the latest tag you want to display next to the number of + stars and forks. For GitLab, although it is possible to get a [list of tags + sorted by update time], the [equivalent API endpoint] is used. So, make sure + you also [create a release for GitLab repositories]. + + [repo_url]: https://www.mkdocs.org/user-guide/configuration/#repo_url + [latest release]: https://docs.github.com/en/rest/reference/releases#get-the-latest-release + [create a release]: https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release + [list of tags sorted by update time]: https://docs.gitlab.com/ee/api/tags.html#list-project-repository-tags + [equivalent API endpoint]: https://docs.gitlab.com/ee/api/releases/#get-the-latest-release + [create a release for GitLab repositories]: https://docs.gitlab.com/ee/user/project/releases/#create-a-release + +#### Repository name + +<!-- md:version 0.1.0 --> +<!-- md:default _automatically set to_ `GitHub`, `GitLab` _or_ `Bitbucket` --> + +MkDocs will infer the source provider by examining the URL and try to set the +_repository name_ automatically. If you wish to customize the name, set +[`repo_name`][repo_name] in `mkdocs.yml`: + +``` yaml +repo_name: squidfunk/mkdocs-material +``` + + [repo_name]: https://www.mkdocs.org/user-guide/configuration/#repo_name + +#### Repository icon + +<!-- md:version 5.0.0 --> +<!-- md:default computed --> + +While the default repository icon is a generic git icon, it can be set to +any icon bundled with the theme by referencing a valid icon path in +`mkdocs.yml`: + +``` yaml +theme: + icon: + repo: fontawesome/brands/git-alt # (1)! +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="git" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +Some popular choices: + +- :fontawesome-brands-git: – `fontawesome/brands/git` +- :fontawesome-brands-git-alt: – `fontawesome/brands/git-alt` +- :fontawesome-brands-github: – `fontawesome/brands/github` +- :fontawesome-brands-github-alt: – `fontawesome/brands/github-alt` +- :fontawesome-brands-gitlab: – `fontawesome/brands/gitlab` +- :fontawesome-brands-gitkraken: – `fontawesome/brands/gitkraken` +- :fontawesome-brands-bitbucket: – `fontawesome/brands/bitbucket` +- :fontawesome-solid-trash: – `fontawesome/solid/trash` + + [icon search]: ../reference/icons-emojis.md#search + +#### Code actions + +<!-- md:version 9.0.0 --> +<!-- md:feature --> + +If the [repository URL] points to a valid [GitHub], [GitLab] or [Bitbucket] +repository, [MkDocs] provides a setting called [`edit_uri`][edit_uri], which +resolves to the subfolder where your documentation is hosted. + +If your default branch is called `main`, change the setting to: + +``` yaml +edit_uri: edit/main/docs/ +``` + +After making sure that `edit_uri` is correctly configured, buttons for code +actions can be added. Two types of code actions are supported: `edit` and `view` +(GitHub only): + +=== ":material-file-edit-outline: Edit this page" + + ``` yaml + theme: + features: + - content.action.edit + ``` + +=== ":material-file-eye-outline: View source of this page" + + ``` yaml + theme: + features: + - content.action.view + ``` + +The icon of the edit and view buttons can be changed with the following lines: + +``` yaml +theme: + icon: + edit: material/pencil # (1)! + view: material/eye +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="material pencil" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + + [repository URL]: #repository + [GitHub]: https://github.com/ + [GitLab]: https://about.gitlab.com/ + [Bitbucket]: https://bitbucket.org/ + [MkDocs]: https://www.mkdocs.org + [edit_uri]: https://www.mkdocs.org/user-guide/configuration/#edit_uri + +### Revisioning + +The following plugins are fully integrated with Material for MkDocs, allowing +for showing the [date of last update and creation] of a document, as well as +links to all [contributors] or [authors] involved. + + [date of last update and creation]: #document-dates + [contributors]: #document-contributors + [authors]: #document-authors + +#### Document dates + +<!-- md:version 4.6.0 --> +<!-- md:plugin [git-revision-date-localized] --> + +The [git-revision-date-localized] plugin adds support for adding the date of +last update and creation of a document at the bottom of each page. Install it +with `pip`: + +``` +pip install mkdocs-git-revision-date-localized-plugin +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - git-revision-date-localized: + enable_creation_date: true +``` + +The following configuration options are supported: + +<!-- md:option git-revision-date-localized.enabled --> + +: <!-- md:default `true` --> This option specifies whether + the plugin is enabled when building your project. If you want to switch + the plugin off, e.g. for local builds, use an [environment variable]: + + ``` yaml + plugins: + - git-revision-date-localized: + enabled: !ENV [CI, false] + ``` + +<!-- md:option git-revision-date-localized.type --> + +: <!-- md:default `date` --> The format of the date to be + displayed. Valid values are `date`, `datetime`, `iso_date`, `iso_datetime` + and `timeago`: + + ``` yaml + plugins: + - git-revision-date-localized: + type: date + ``` + +<!-- md:option git-revision-date-localized.enable_creation_date --> + +: <!-- md:default `false` --> Enables the display of the + creation date of the file associated with the page next to the last updated + date at the bottom of the page: + + ``` yaml + plugins: + - git-revision-date-localized: + enable_creation_date: true + ``` + + !!! note "When using build environments" + + If you are deploying through a CI system, you might need to adjust your + CI settings when fetching the code. For more information, see + [git-revision-date-localized]. + +<!-- md:option git-revision-date-localized.fallback_to_build_date --> + +: <!-- md:default `false` --> Enables falling back to + the time when `mkdocs build` was executed. Can be used as a fallback when + the build is performed outside of a git repository: + + ``` yaml + plugins: + - git-revision-date-localized: + fallback_to_build_date: true + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + + [git-revision-date-localized]: https://github.com/timvink/mkdocs-git-revision-date-localized-plugin + +#### Document contributors + +<!-- md:version 9.5.0 --> +<!-- md:plugin [git-committers] --> +<!-- md:flag experimental --> + +The [git-committers][^2] plugin renders the GitHub avatars of all contributors, +linking to their GitHub profiles at the bottom of each page. As always, it can +be installed with `pip`: + + [^2]: + We currently recommend using a fork of the [git-committers] plugin, as it + contains many improvements that have not yet been merged back into the + original plugin. See byrnereese/mkdocs-git-committers-plugin#12 for more + information. + +``` +pip install mkdocs-git-committers-plugin-2 +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - git-committers: + repository: squidfunk/mkdocs-material + branch: main +``` + +The following configuration options are supported: + +<!-- md:option git-committers.enabled --> + +: <!-- md:default `true` --> This option specifies whether + the plugin is enabled when building your project. If you want to switch + the plugin off, e.g. for local builds, use an [environment variable]: + + ``` yaml + plugins: + - git-committers: + enabled: !ENV [CI, false] + ``` + +<!-- md:option git-committers.repository --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must be set to the slug of the repository that contains your + documentation. The slug must follow the pattern `<username>/<repository>`: + + ``` yaml + plugins: + - git-committers: + repository: squidfunk/mkdocs-material + ``` + +<!-- md:option git-committers.branch --> + +: <!-- md:default `master` --> This property should be set to + the branch of the repository from which to retrieve the contributors. To use the `main` branch: + + ``` yaml + plugins: + - git-committers: + branch: main + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + + [git-committers]: https://github.com/ojacques/mkdocs-git-committers-plugin-2 + [environment variable]: https://www.mkdocs.org/user-guide/configuration/#environment-variables + [rate limits]: https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + +#### Document authors + +<!-- md:version 9.5.0 --> +<!-- md:plugin [git-authors] --> +<!-- md:flag experimental --> + +The [git-authors] plugin is a lightweight alternative to the +[git-committers] plugin and extracts the authors of a document from git to display +them at the bottom of each page. + +Material for MkDocs offers deep integration for [git-authors]. This means the +[customized overrides](https://timvink.github.io/mkdocs-git-authors-plugin/usage.html#mkdocs-material-theme) +are not necessary, and additional styling (such as nice icons) are added. +Simply install it with `pip`: + +``` +pip install mkdocs-git-authors-plugin +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - git-authors +``` + + [git-authors]: https://github.com/timvink/mkdocs-git-authors-plugin/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/building-an-optimized-site.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/building-an-optimized-site.md new file mode 100644 index 0000000..3b133ee --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/building-an-optimized-site.md @@ -0,0 +1,106 @@ +# Building an optimized site + +Material for MkDocs, by default, allows to build optimized sites that rank great +on search engines, load fast (even on slow networks), and work perfectly without +JavaScript. Additionally, the [built-in optimize plugin] adds support for +further useful automatic optimization techniques. + + [built-in optimize plugin]: #built-in-optimize-plugin + +## Configuration + +### Built-in projects plugin + +<!-- md:version 9.7.0 --> +<!-- md:plugin [projects] – built-in --> +<!-- md:flag experimental --> + +The built-in projects plugin allows to split your documentation into multiple +distinct MkDocs projects, __build them concurrently__ and +__serve them together__. Add the following to `mkdocs.yml`: + +``` yaml +plugins: + - projects +``` + +For a list of all settings, please consult the [plugin documentation]. + + [projects]: ../plugins/projects.md + [plugin documentation]: ../plugins/projects.md + +??? info "Use cases for the projects plugin" + + Ideal use cases for the projects plugin are: + + - Building a multi-language site + - Building a blog alongside your documentation + - Splitting large code bases for better performance + + Note that the plugin is currently experimental. We're releasing it early, + so that we can improve it together with our users and make it even more + powerful as we discover new use cases. + +#### Scope + +<!-- md:version 8.0.0 --> +<!-- md:default none --> + +There might be a use case, where you want to share user-level settings like +the selected [color palette], or [cookie consent] across all projects. To do +so, add the following lines to `mkdocs.yml`: + +``` yaml +extra: + scope: / +``` + +!!! example "How it works" + + Suppose you have this site structure: + ``` + . + └── / + ├── subsite-a/ + ├── subsite-b/ + └── subsite-c/ + ``` + By default, each site will have its own scope (`/subsite-a/`, `/subsite-b/`, + `/subsite-c/`). To modify this behaviour, add the following lines to + `mkdocs.yml`: + + ``` yaml + extra: + scope: / + ``` + + By setting it to `/`, it should allow you to share the following preferences + across the main site and all subsites: + + - [Cookie consent][cookie consent] + - [Linking of content tabs, i.e. active tab] + - [Color palette][color palette] + + [Scope support]: https://github.com/squidfunk/mkdocs-material/releases/tag/8.0.0 + [cookie consent]: ../setup/ensuring-data-privacy.md#cookie-consent + [Linking of content tabs, i.e. active tab]: ../reference/content-tabs.md + [color palette]: ../setup/changing-the-colors.md#color-palette + +### Built-in optimize plugin + +<!-- md:version 9.7.0 --> +<!-- md:plugin [optimize] – built-in --> +<!-- md:flag experimental --> + +The built-in optimize plugin automatically identifies and optimizes all media +files as part of the build using compression and conversion techniques. Add +the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - optimize +``` + +For a list of all settings, please consult the [plugin documentation][optimize]. + + [optimize]: ../plugins/optimize.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/building-for-offline-usage.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/building-for-offline-usage.md new file mode 100644 index 0000000..9ceacf0 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/building-for-offline-usage.md @@ -0,0 +1,55 @@ +# Building for offline usage + +If you want to ship your documentation together with your product, MkDocs has +you covered – with support from themes, [MkDocs] supports building +offline-capable documentation. Notably, Material for MkDocs offers offline +support for many of its features. + + [MkDocs]: https://www.mkdocs.org + +## Configuration + +### Built-in offline plugin + +<!-- md:version 9.0.0 --> +<!-- md:plugin [offline] – built-in --> + +The built-in offline plugin makes sure that the [site search] works when you +distribute the contents of your [site directory] as a download. Simply add +the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - offline +``` + +For a list of all settings, please consult the [plugin documentation]. + + [offline]: ../plugins/offline.md + [plugin documentation]: ../plugins/offline.md + +!!! tip "Automatically bundle all external assets" + + The [built-in privacy plugin] makes it easy to use external assets + while building documentation for offline usage, as it will automatically + download all external assets to distribute them with your documentation. + + [site search]: setting-up-site-search.md + [site directory]: https://www.mkdocs.org/user-guide/configuration/#site_dir + [built-in privacy plugin]:../plugins/privacy.md + +#### Limitations + +Material for MkDocs offers many interactive features, some of which will not +work from the file system due to the restrictions of modern browsers: all +features that use the `fetch` API will error. + +Thus, when building for offline usage, make sure to disable the following +configuration settings: [instant loading], [site analytics], [git repository], +[versioning] and [comment systems]. + + [Instant loading]: setting-up-navigation.md#instant-loading + [Site analytics]: setting-up-site-analytics.md + [Versioning]: setting-up-versioning.md + [Git repository]: adding-a-git-repository.md + [Comment systems]: adding-a-comment-system.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-colors.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-colors.md new file mode 100644 index 0000000..bcaffff --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-colors.md @@ -0,0 +1,401 @@ +# Changing the colors + +As any proper Material Design implementation, Material for MkDocs supports +Google's original [color palette], which can be easily configured through +`mkdocs.yml`. Furthermore, colors can be customized with a few lines of CSS to +fit your brand's identity by using [CSS variables][custom colors]. + + [color palette]: http://www.materialui.co/colors + [custom colors]: #custom-colors + +## Configuration + +### Color palette + +#### Color scheme + +<!-- md:version 5.2.0 --> +<!-- md:default `default` --> + +Material for MkDocs supports two color schemes: a __light mode__, which is just +called `default`, and a __dark mode__, which is called `slate`. The color scheme +can be set via `mkdocs.yml`: + +``` yaml +theme: + palette: + scheme: default +``` + +Click on a tile to change the color scheme: + +<div class="mdx-switch"> + <button data-md-color-scheme="default"><code>default</code></button> + <button data-md-color-scheme="slate"><code>slate</code></button> +</div> + +<script> + var buttons = document.querySelectorAll("button[data-md-color-scheme]") + buttons.forEach(function(button) { + button.addEventListener("click", function() { + document.body.setAttribute("data-md-color-switching", "") + var attr = this.getAttribute("data-md-color-scheme") + document.body.setAttribute("data-md-color-scheme", attr) + var name = document.querySelector("#__code_0 code span.l") + name.textContent = attr + setTimeout(function() { + document.body.removeAttribute("data-md-color-switching") + }) + }) + }) +</script> + +#### Primary color + +<!-- md:version 0.2.0 --> +<!-- md:default `indigo` --> + +The primary color is used for the header, the sidebar, text links and several +other components. In order to change the primary color, set the following value +in `mkdocs.yml` to a valid color name: + +``` yaml +theme: + palette: + primary: indigo +``` + +Click on a tile to change the primary color: + +<div class="mdx-switch"> + <button data-md-color-primary="red"><code>red</code></button> + <button data-md-color-primary="pink"><code>pink</code></button> + <button data-md-color-primary="purple"><code>purple</code></button> + <button data-md-color-primary="deep-purple"><code>deep purple</code></button> + <button data-md-color-primary="indigo"><code>indigo</code></button> + <button data-md-color-primary="blue"><code>blue</code></button> + <button data-md-color-primary="light-blue"><code>light blue</code></button> + <button data-md-color-primary="cyan"><code>cyan</code></button> + <button data-md-color-primary="teal"><code>teal</code></button> + <button data-md-color-primary="green"><code>green</code></button> + <button data-md-color-primary="light-green"><code>light green</code></button> + <button data-md-color-primary="lime"><code>lime</code></button> + <button data-md-color-primary="yellow"><code>yellow</code></button> + <button data-md-color-primary="amber"><code>amber</code></button> + <button data-md-color-primary="orange"><code>orange</code></button> + <button data-md-color-primary="deep-orange"><code>deep orange</code></button> + <button data-md-color-primary="brown"><code>brown</code></button> + <button data-md-color-primary="grey"><code>grey</code></button> + <button data-md-color-primary="blue-grey"><code>blue grey</code></button> + <button data-md-color-primary="black"><code>black</code></button> + <button data-md-color-primary="white"><code>white</code></button> +</div> + +<script> + var buttons = document.querySelectorAll("button[data-md-color-primary]") + buttons.forEach(function(button) { + button.addEventListener("click", function() { + var attr = this.getAttribute("data-md-color-primary") + document.body.setAttribute("data-md-color-primary", attr) + var name = document.querySelector("#__code_1 code span.l") + name.textContent = attr.replace("-", " ") + }) + }) +</script> + +See our guide below to learn how to set [custom colors]. + +#### Accent color + +<!-- md:version 0.2.0 --> +<!-- md:default `indigo` --> + +The accent color is used to denote elements that can be interacted with, e.g. +hovered links, buttons and scrollbars. It can be changed in `mkdocs.yml` by +choosing a valid color name: + +``` yaml +theme: + palette: + accent: indigo +``` + +Click on a tile to change the accent color: + +<style> + .md-typeset button[data-md-color-accent] > code { + background-color: var(--md-code-bg-color); + color: var(--md-accent-fg-color); + } +</style> + +<div class="mdx-switch"> + <button data-md-color-accent="red"><code>red</code></button> + <button data-md-color-accent="pink"><code>pink</code></button> + <button data-md-color-accent="purple"><code>purple</code></button> + <button data-md-color-accent="deep-purple"><code>deep purple</code></button> + <button data-md-color-accent="indigo"><code>indigo</code></button> + <button data-md-color-accent="blue"><code>blue</code></button> + <button data-md-color-accent="light-blue"><code>light blue</code></button> + <button data-md-color-accent="cyan"><code>cyan</code></button> + <button data-md-color-accent="teal"><code>teal</code></button> + <button data-md-color-accent="green"><code>green</code></button> + <button data-md-color-accent="light-green"><code>light green</code></button> + <button data-md-color-accent="lime"><code>lime</code></button> + <button data-md-color-accent="yellow"><code>yellow</code></button> + <button data-md-color-accent="amber"><code>amber</code></button> + <button data-md-color-accent="orange"><code>orange</code></button> + <button data-md-color-accent="deep-orange"><code>deep orange</code></button> +</div> + +<script> + var buttons = document.querySelectorAll("button[data-md-color-accent]") + buttons.forEach(function(button) { + button.addEventListener("click", function() { + var attr = this.getAttribute("data-md-color-accent") + document.body.setAttribute("data-md-color-accent", attr) + var name = document.querySelector("#__code_2 code span.l") + name.textContent = attr.replace("-", " ") + }) + }) +</script> + +See our guide below to learn how to set [custom colors]. + +### Color palette toggle + +<!-- md:version 7.1.0 --> +<!-- md:default none --> +<!-- md:example color-palette-toggle --> + +Offering a light _and_ dark color palette makes your documentation pleasant to +read at different times of the day, so the user can choose accordingly. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + palette: # (1)! + + # Palette toggle for light mode + - scheme: default + toggle: + icon: material/brightness-7 # (2)! + name: Switch to dark mode + + # Palette toggle for dark mode + - scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode +``` + +1. Note that the `theme.palette` setting is now defined as a list. + +2. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="brightness" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +This configuration will render a color palette toggle next to the search bar. +Note that you can also define separate settings for [`primary`][palette.primary] +and [`accent`][palette.accent] per color palette. + +The following properties must be set for each toggle: + +<!-- md:option palette.toggle.icon --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must point to a valid icon path referencing any icon bundled + with the theme, or the build will not succeed. Some popular combinations: + + * :material-brightness-7: + :material-brightness-4: – `material/brightness-7` + `material/brightness-4` + * :material-toggle-switch: + :material-toggle-switch-off-outline: – `material/toggle-switch` + `material/toggle-switch-off-outline` + * :material-weather-night: + :material-weather-sunny: – `material/weather-night` + `material/weather-sunny` + * :material-eye: + :material-eye-outline: – `material/eye` + `material/eye-outline` + * :material-lightbulb: + :material-lightbulb-outline: – `material/lightbulb` + `material/lightbulb-outline` + +<!-- md:option palette.toggle.name --> + +: <!-- md:default none --> <!-- md:flag required --> + This property is used as the toggle's `title` attribute and should be set to + a discernable name to improve accessibility. It's rendered as a [tooltip]. + + [palette.scheme]: #color-scheme + [palette.primary]: #primary-color + [palette.accent]: #accent-color + [icon search]: ../reference/icons-emojis.md#search + [tooltip]: ../reference/tooltips.md + +### System preference + +<!-- md:version 7.1.0 --> +<!-- md:default none --> +<!-- md:example color-palette-system-preference --> + +Each color palette can be linked to the user's system preference for light and +dark appearance by using a media query. Simply add a `media` property next to +the `scheme` definition in `mkdocs.yml`: + +``` yaml +theme: + palette: + + # Palette toggle for light mode + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode +``` + +When the user first visits your site, the media queries are evaluated in the +order of their definition. The first media query that matches selects the +default color palette. + +#### Automatic light / dark mode + +<!-- md:version 9.5.0 --> +<!-- md:flag experimental --> +<!-- md:example color-palette-system-preference --> + +Newer operating systems allow to automatically switch between light and dark +appearance during day and night times. Material for MkDocs adds support for +automatic light / dark mode, delegating color palette selection to the user's +operating system. Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + palette: + + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + + # Palette toggle for light mode + - media: "(prefers-color-scheme: light)" + scheme: default # (1)! + toggle: + icon: material/brightness-7 + name: Switch to dark mode + + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to system preference +``` + +1. You can also define separate settings for [`primary`][palette.primary] and + [`accent`][palette.accent] per color palette, i.e. different colors for + light and dark mode. + +Material for MkDocs will now change the color palette each time the operating +system switches between light and dark appearance, even when the user doesn't +reload the site. + +## Customization + +### Custom colors + +<!-- md:version 5.0.0 --> +<!-- md:example custom-colors --> + +Material for MkDocs implements colors using [CSS variables] (custom +properties). If you want to customize the colors beyond the palette (e.g. to +use your brand-specific colors), you can add an [additional style sheet] and +tweak the values of the CSS variables. + +First, set the [`primary`][palette.primary] or [`accent`][palette.accent] values +in `mkdocs.yml` to `custom`, to signal to the theme that you want to define +custom colors, e.g., when you want to override the `primary` color: + +``` yaml +theme: + palette: + primary: custom +``` + +Let's say you're :fontawesome-brands-youtube:{ style="color: #EE0F0F" } +__YouTube__, and want to set the primary color to your brand's palette. Just +add: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + :root > * { + --md-primary-fg-color: #EE0F0F; + --md-primary-fg-color--light: #ECB7B7; + --md-primary-fg-color--dark: #90030C; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +See the file containing the [color definitions] for a list of all CSS variables. + + [CSS variables]: https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties + [color definitions]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/assets/stylesheets/main/_colors.scss + [additional style sheet]: ../customization.md#additional-css + + +### Custom color schemes + +Besides overriding specific colors, you can create your own, named color scheme +by wrapping the definitions in a `[data-md-color-scheme="..."]` +[attribute selector], which you can then set via `mkdocs.yml` as described +in the [color schemes][palette.scheme] section: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + [data-md-color-scheme="youtube"] { + --md-primary-fg-color: #EE0F0F; + --md-primary-fg-color--light: #ECB7B7; + --md-primary-fg-color--dark: #90030C; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + theme: + palette: + scheme: youtube + extra_css: + - stylesheets/extra.css + ``` + +Additionally, the `slate` color scheme defines all of it's colors via `hsla` +color functions and deduces its colors from the `--md-hue` CSS variable. You +can tune the `slate` theme with: + +``` css +[data-md-color-scheme="slate"] { + --md-hue: 210; /* (1)! */ +} +``` + +1. The `hue` value must be in the range of `[0, 360]` + + [attribute selector]: https://www.w3.org/TR/selectors-4/#attribute-selectors diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-fonts.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-fonts.md new file mode 100644 index 0000000..cb7da21 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-fonts.md @@ -0,0 +1,119 @@ +# Changing the fonts + +Material for MkDocs makes it easy to change the typeface of your project +documentation, as it directly integrates with [Google Fonts]. Alternatively, +fonts can be custom-loaded if self-hosting is preferred for data privacy reasons +or another destination should be used. + + [Google Fonts]: https://fonts.google.com + +## Configuration + +### Regular font + +<!-- md:version 0.1.2 --> +<!-- md:default [`Roboto`][Roboto] --> + +The regular font is used for all body copy, headlines, and essentially +everything that does not need to be monospaced. It can be set to any +valid [Google Font][Google Fonts] via `mkdocs.yml`: + +``` yaml +theme: + font: + text: Roboto +``` + +The typeface will be loaded in 300, 400, _400i_ and __700__. + + [Roboto]: https://fonts.google.com/specimen/Roboto + +### Monospaced font + +<!-- md:version 0.1.2 --> +<!-- md:default [`Roboto Mono`][Roboto Mono] --> + +The _monospaced font_ is used for code blocks and can be configured separately. +Just like the regular font, it can be set to any valid [Google Font] +[Google Fonts] via `mkdocs.yml`: + +``` yaml +theme: + font: + code: Roboto Mono +``` + +The typeface will be loaded in 400. + + [Roboto Mono]: https://fonts.google.com/specimen/Roboto+Mono + +### Autoloading + +<!-- md:version 1.0.0 --> +<!-- md:default none --> + +If you want to prevent typefaces from being loaded from [Google Fonts], e.g. +to adhere to [data privacy] regulations, and fall back to system fonts, add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + font: false +``` + +!!! tip "Automatically bundle Google Fonts" + + The [built-in privacy plugin] makes it easy to use Google Fonts + while complying with the __General Data Protection Regulation__ (GDPR), + by automatically downloading and self-hosting the web font files. + + [data privacy]: https://developers.google.com/fonts/faq/privacy + [built-in privacy plugin]:../plugins/privacy.md + +## Customization + +### Additional fonts + +If you want to load an (additional) font from another destination or override +the system font, you can use an [additional style sheet] to add the +corresponding `@font-face` definition: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + @font-face { + font-family: "<font>"; + src: "..."; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + +The font can then be applied to specific elements, e.g. only headlines, or +globally to be used as the site-wide regular or monospaced font: + +=== "Regular font" + + ``` css + :root { + --md-text-font: "<font>"; /* (1)! */ + } + ``` + + 1. Always define fonts through CSS variables and not `font-family`, as + this would disable the system font fallback. + +=== "Monospaced font" + + ``` css + :root { + --md-code-font: "<font>"; + } + ``` + + [additional style sheet]: ../customization.md#additional-css diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-language.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-language.md new file mode 100644 index 0000000..e61ad4b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-language.md @@ -0,0 +1,184 @@ +# Changing the language + +Material for MkDocs supports internationalization (i18n) and provides +translations for template variables and labels in 60+ languages. Additionally, +the site search can be configured to use a language-specific stemmer, if +available. + +## Configuration + +### Site language + +<!-- md:version 1.12.0 --> +<!-- md:default `en` --> + +You can set the site language in `mkdocs.yml` with: + +``` yaml +theme: + language: en # (1)! +``` + +1. HTML5 only allows to set a [single language per document], which is why + Material for MkDocs only supports setting a canonical language for the + entire project, i.e. one per `mkdocs.yml`. + + The easiest way to build a multi-language documentation is to create one + project in a subfolder per language, and then use the [language selector] + to interlink those projects. + +The following languages are supported: + +<!-- hooks/translations.py --> + +Note that some languages will produce unreadable anchor links due to the way +the default slug function works. Consider using a [Unicode-aware slug function]. + + [single language per document]: https://www.w3.org/International/questions/qa-html-language-declarations.en#attributes + [language selector]: #site-language-selector + [Unicode-aware slug function]: extensions/python-markdown.md#+toc.slugify + +### Site language selector + +<!-- md:version 7.0.0 --> +<!-- md:default none --> + +If your documentation is available in multiple languages, a language selector +pointing to those languages can be added to the header. Alternate languages +can be defined via `mkdocs.yml`. + +``` yaml +extra: + alternate: + - name: English + link: /en/ # (1)! + lang: en + - name: Deutsch + link: /de/ + lang: de +``` + +1. Note that this must be an absolute link. If it includes a domain part, it's + used as defined. Otherwise the domain part of the [`site_url`][site_url] as + set in `mkdocs.yml` is prepended to the link. + +The following properties are available for each alternate language: + +<!-- md:option alternate.name --> + +: <!-- md:default none --> <!-- md:flag required --> + This value of this property is used inside the language selector as the + name of the language and must be set to a non-empty string. + +<!-- md:option alternate.link --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must be set to an absolute link, which might also point to + another domain or subdomain not necessarily generated with MkDocs. + +<!-- md:option alternate.lang --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must contain an [ISO 639-1 language code] and is used for + the `hreflang` attribute of the link, improving discoverability via search + engines. + +[![Language selector preview]][Language selector preview] + + [site_url]: https://www.mkdocs.org/user-guide/configuration/#site_url + [ISO 639-1 language code]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + [Language selector preview]: ../assets/screenshots/language-selection.png + +#### Stay on page + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +When switching between languages, e.g., if language `en` and `de` contain a page +with the same path name, the user will stay on the current page: + +``` +docs.example.com/en/ -> docs.example.com/de/ +docs.example.com/en/foo/ -> docs.example.com/de/foo/ +docs.example.com/en/bar/ -> docs.example.com/de/bar/ +``` + +No configuration is necessary. + +### Directionality + +<!-- md:version 2.5.0 --> +<!-- md:default computed --> + +While many languages are read `ltr` (left-to-right), Material for MkDocs also +supports `rtl` (right-to-left) directionality which is deduced from the +selected language, but can also be set with: + +``` yaml +theme: + direction: ltr +``` + +Click on a tile to change the directionality: + +<div class="mdx-switch"> + <button data-md-dir="ltr"><code>ltr</code></button> + <button data-md-dir="rtl"><code>rtl</code></button> +</div> + +<script> + var buttons = document.querySelectorAll("button[data-md-dir]") + buttons.forEach(function(button) { + button.addEventListener("click", function() { + var attr = this.getAttribute("data-md-dir") + document.body.dir = attr + var name = document.querySelector("#__code_2 code span.l") + name.textContent = attr + }) + }) +</script> + +## Customization + +### Custom translations + +If you want to customize some of the translations for a language, just follow +the guide on [theme extension] and create a new partial in the `overrides` +folder. Then, import the [translations] of the language as a fallback and only +adjust the ones you want to override: + +=== ":octicons-file-code-16: `overrides/partials/languages/custom.html`" + + ``` html + <!-- Import translations for language and fallback --> + {% import "partials/languages/de.html" as language %} + {% import "partials/languages/en.html" as fallback %} <!-- (1)! --> + + <!-- Define custom translations --> + {% macro override(key) %}{{ { + "source.file.date.created": "Erstellt am", <!-- (2)! --> + "source.file.date.updated": "Aktualisiert am" + }[key] }}{% endmacro %} + + <!-- Re-export translations --> + {% macro t(key) %}{{ + override(key) or language.t(key) or fallback.t(key) + }}{% endmacro %} + ``` + + 1. Note that `en` must always be used as a fallback language, as it's the + default theme language. + + 2. Check the [list of available languages], pick the translation you want + to override for your language and add them here. + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + theme: + language: custom + ``` + + [theme extension]: ../customization.md#extending-the-theme + [translations]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/partials/languages/ + [list of available languages]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/partials/languages/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-logo-and-icons.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-logo-and-icons.md new file mode 100644 index 0000000..c26529c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/changing-the-logo-and-icons.md @@ -0,0 +1,166 @@ +# Changing the logo and icons + +When installing Material for MkDocs, you immediately get access to _over 8,000 +icons_ ready to be used for customization of specific parts of the theme and/or +when writing your documentation in Markdown. Not enough? You can also add +[additional icons] with minimal effort. + + [additional icons]: #additional-icons + +## Configuration + +### Logo + +<!-- md:version 0.1.0 --> +<!-- md:default `material/library` --> + +The logo can be changed to a user-provided image (any type, incl. `*.png` and +`*.svg`) located in the `docs` folder, or to any icon bundled with the theme. +Add the following lines to `mkdocs.yml`: + +=== ":octicons-image-16: Image" + + ``` yaml + theme: + logo: assets/logo.png + ``` + +=== ":octicons-package-16: Icon, bundled" + + ``` yaml + theme: + icon: + logo: material/library # (1)! + ``` + + 1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="material library" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + + [icon search]: ../reference/icons-emojis.md#search + +Normally, the logo in the header and sidebar links to the homepage of the +documentation, which is the same as `site_url`. This behavior can be changed +with the following configuration: + +``` yaml +extra: + homepage: https://example.com +``` + +### Favicon + +<!-- md:version 0.1.0 --> +<!-- md:default [`assets/images/favicon.png`][Favicon default] --> + +The favicon can be changed to a path pointing to a user-provided image, which +must be located in the `docs` folder. Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + favicon: images/favicon.png +``` + + [Favicon default]: https://github.com/squidfunk/mkdocs-material/blob/master/material/templates/assets/images/favicon.png + +### Site icons + +[:octicons-tag-24: 9.2.0][Site icon support] + +Most icons you see on your site, such as navigation icons, can also be changed. For example, +to change the navigation arrows in the footer, add the following lines to `mkdocs.yml`: + +```yaml +theme: + icon: + previous: fontawesome/solid/angle-left + next: fontawesome/solid/angle-right +``` + +The following is a complete list of customizable icons used by the theme: + +| Icon name | Purpose | +|:-------------|:------------------------------------------------------------------------------| +| `logo` | See [Logo](#logo) | +| `menu` | Open drawer | +| `alternate` | Change language | +| `search` | Search icon | +| `share` | Share search | +| `close` | Reset search, dismiss announcements | +| `top` | Back-to-top button | +| `edit` | Edit current page | +| `view` | View page source | +| `repo` | Repository icon | +| `admonition` | See [Admonition icons](../reference/admonitions.md#admonition-icons) | +| `tag` | See [Tag icons and identifiers](setting-up-tags.md#tag-icons-and-identifiers) | +| `previous` | Previous page in footer, hide search on mobile | +| `next` | Next page in footer | + + [Site icon support]: https://github.com/squidfunk/mkdocs-material/releases/tag/9.2.0 + +## Customization + +### Additional icons + +In order to use custom icons, [extend the theme] and create a new folder named +`.icons` in the [`custom_dir`][custom_dir] you want to use for overrides. +Next, add your `*.svg` icons into a subfolder of the `.icons` folder. Let's say +you downloaded and unpacked the [Bootstrap] icon set, and want to add it to +your project documentation. The structure of your project should look like this: + +``` { .sh .no-copy } +. +├─ overrides/ +│ └─ .icons/ +│ └─ bootstrap/ +│ └─ *.svg +└─ mkdocs.yml +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + options: + custom_icons: + - overrides/.icons +``` + +You can now use all :fontawesome-brands-bootstrap: Bootstrap icons anywhere in +Markdown files, as well as everywhere icons can be used in `mkdocs.yml`. +However, note that the syntaxes are slightly different: + +- __Using icons in configuration__: take the path of the `*.svg` icon file + starting at the `.icons` folder and drop the file extension, e.g. for + `.icons/bootstrap/envelope-paper.svg`, use: + + ``` yaml + theme: + icon: + logo: bootstrap/envelope-paper + ``` + +- __Using icons in Markdown files__: additionally to taking the path from the + `.icons` folder as noted above, replace all `/` with `-` and enclose the icon + shortcode in two colons: + + ``` + :bootstrap-envelope-paper: + ``` + +For further notes on icon usage, please consult the [icon reference]. + + [extend the theme]: ../customization.md#extending-the-theme + [custom_dir]: https://www.mkdocs.org/user-guide/configuration/#custom_dir + [Bootstrap]: https://icons.getbootstrap.com/ + [icon reference]: ../reference/icons-emojis.md#using-icons diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/ensuring-data-privacy.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/ensuring-data-privacy.md new file mode 100644 index 0000000..113562c --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/ensuring-data-privacy.md @@ -0,0 +1,320 @@ +# Ensuring data privacy + +Material for MkDocs makes compliance with data privacy regulations very easy, +as it offers a native [cookie consent] solution to seek explicit consent from +users before setting up [analytics]. Additionally, external assets can be +automatically downloaded for [self-hosting]. + + [cookie consent]: #cookie-consent + [analytics]: setting-up-site-analytics.md + [self-hosting]: #built-in-privacy-plugin + +## Configuration + +### Cookie consent + +<!-- md:version 8.4.0 --> +<!-- md:default none --> +<!-- md:flag experimental --> +<!-- md:example cookie-consent --> + +Material for MkDocs ships a native and extensible cookie consent form which +asks the user for consent prior to sending requests to third parties. Add the +following to `mkdocs.yml`: + +``` yaml +extra: + consent: + title: Cookie consent + description: >- # (1)! + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. +``` + +1. You can add arbitrary HTML tags in the `description`, e.g. to link to your + terms of service or other parts of the site. + +The following properties are available: + +<!-- md:option consent.title --> + +: <!-- md:default none --> <!-- md:flag required --> + This property sets the title of the cookie consent, which is rendered at the + top of the form and must be set to a non-empty string. + +<!-- md:option consent.description --> + +: <!-- md:default none --> <!-- md:flag required --> + This property sets the description of the cookie consent, is rendered below + the title, and may include raw HTML (e.g. a links to the terms of service). + +<!-- md:option consent.cookies --> + +: <!-- md:default none --> This property allows to add custom + cookies or change the initial `checked` state and name of built-in cookies. + Currently, the following cookies are built-in: + + - __Google Analytics__ – `analytics` (enabled by default) + - __GitHub__ – `github` (enabled by default) + + Each cookie must receive a unique identifier which is used as a key in the + `cookies` map, and can be either set to a string, or to a map defining + `name` and `checked` state: + + === "Custom cookie name" + + ``` yaml + extra: + consent: + cookies: + analytics: Custom name + ``` + + === "Custom initial state" + + ``` yaml + extra: + consent: + cookies: + analytics: + name: Google Analytics + checked: false + ``` + + === "Custom cookie" + + ``` yaml + extra: + consent: + cookies: + analytics: Google Analytics # (1)! + custom: Custom cookie + ``` + + 1. If you define a custom cookie as part of the `cookies` property, + the `analytics` cookie must be added back explicitly, or analytics + won't be triggered. + + If Google Analytics was configured via `mkdocs.yml`, the cookie consent will + automatically include a setting for the user to disable it. [Custom cookies] + can be used from JavaScript. + +<!-- md:option consent.actions --> + +: <!-- md:default `[accept, manage]` --> This property defines + which buttons are shown and in which order, e.g. to allow the user to accept + cookies and manage settings: + + ``` yaml + extra: + consent: + actions: + - accept + - manage # (1)! + ``` + + 1. If the `manage` settings button is omitted from the `actions` property, + the settings are always shown. + + The cookie consent form includes three types of buttons: + + - `accept` – Button to accept selected cookies + - `reject` – Button to reject all cookies + - `manage` – Button to manage settings + +When a user first visits your site, a cookie consent form is rendered: + +[![Cookie consent enabled]][Cookie consent enabled] + + [Custom cookies]: #custom-cookies + [Cookie consent enabled]: ../assets/screenshots/consent.png + +#### Change cookie settings + +In order to comply with GDPR, users must be able to change their cookie settings +at any time. This can be done by adding a simple link to your [copyright notice] +in `mkdocs.yml`: + +``` yaml +copyright: > + Copyright © 2016 - 2024 Martin Donath – + <a href="#__consent">Change cookie settings</a> +``` + + [copyright notice]: setting-up-the-footer.md#copyright-notice + +### Built-in privacy plugin + +<!-- md:version 9.5.0 --> +<!-- md:plugin [privacy][built-in privacy plugin] --> +<!-- md:flag experimental --> + +The built-in privacy plugin automatically identifies external assets as part +of the build process and downloads all assets for very simple self-hosting. Add +the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - privacy +``` + +For a list of all settings, please consult the [plugin documentation]. + + [plugin documentation]: ../plugins/privacy.md + +!!! tip "Hosting images externally and optimizing them automatically" + + This option makes the [built-in privacy plugin] an excellent choice for + when you want to host assets like images outside of your git repository + in another location to keep them fresh and your repository lean. + + Additionally, as of <!-- md:version 9.7.0 -->, the + built-in privacy plugin was entirely rewritten and now works perfectly + with the [built-in optimize plugin], which means that external assets + can be passed through the same optimization pipeline as the rest of your + documentation. This means you can store and edit unoptimized files + outside of your repository, and let both plugins built a highly + optimized site for you. + + If you want to implement separate pipelines, i.e., optimize some images + differently from others or exclude some images from downloading, you can + use multiple instances of the [built-in privacy plugin]. + +!!! question "Why can't Material for MkDocs bundle all assets by design?" + + The primary reason why Material for MkDocs can't just bundle all of its own + assets is the integration with [Google Fonts], which offers over a thousand + different fonts that can be used to render your documentation. Most of the + fonts include several weights and are split up into different character sets + to keep the download size small, so the browser only downloads what is + really needed. For Roboto, our default [regular font], this results in [42 + `*.woff2` files in total][example]. + + If Material for MkDocs would bundle all font files, the download size would + be in the hundreds of megabytes, slowing down automated builds. Furthermore, + authors might add external assets like third-party scripts or style sheets + that would need to be remembered to be defined as further local assets. + + This is the very reason the [built-in privacy plugin] exists — it automates + the process of downloading all external assets manually to ensure compliance + with GDPR with some some [technical limitations]. + + [Google Fonts]: changing-the-fonts.md + [regular font]: changing-the-fonts.md#regular-font + [example]: #example + [built-in optimize plugin]: ../plugins/optimize.md + [technical limitations]: ../plugins/privacy.md#limitations + +??? example "Expand to inspect example" + + For the official documentation, the [built-in privacy plugin] downloads the + following resources: + + ``` { .sh .no-copy #example } + . + └─ assets/external/ + ├─ unpkg.com/tablesort@5.3.0/dist/tablesort.min.js + ├─ fonts.googleapis.com/css + └─ fonts.gstatic.com/s/ + ├─ roboto/v29/ + │ ├─ KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 + │ ├─ KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xIIzI.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 + │ ├─ KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fBBc4.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfBBc4.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 + │ ├─ KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 + │ ├─ KFOmCnqEu92Fr1Mu4WxKOzY.woff2 + │ ├─ KFOmCnqEu92Fr1Mu4mxK.woff2 + │ ├─ KFOmCnqEu92Fr1Mu5mxKOzY.woff2 + │ ├─ KFOmCnqEu92Fr1Mu72xKOzY.woff2 + │ ├─ KFOmCnqEu92Fr1Mu7GxKOzY.woff2 + │ ├─ KFOmCnqEu92Fr1Mu7WxKOzY.woff2 + │ └─ KFOmCnqEu92Fr1Mu7mxKOzY.woff2 + └─ robotomono/v13/ + ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 + ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 + ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 + ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 + ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 + ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 + ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 + ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 + ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 + ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 + ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 + └─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 + ``` + + [built-in privacy plugin]: ../plugins/privacy.md + [preconnect]: https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch + +## Customization + +### Custom cookies + +<!-- md:version 8.4.0 --> +<!-- md:example custom-cookies --> + +If you've customized the [cookie consent] and added a `custom` cookie, the user +will be prompted to accept or reject your custom cookie. Once the user accepts +or rejects the cookie consent, or [changes the settings], the page reloads[^1]. +Use [additional JavaScript] to query the result: + + [^1]: + We reload the page to make interop with custom cookies simpler. If Material + for MkDocs would implement a callback-based approach, the author would need + to make sure to correctly update all scripts that use cookies. Additionally, + the cookie consent is only answered initially, which is why we consider this + to be a good trade-off of DX and UX. + +=== ":octicons-file-code-16: `docs/javascripts/consent.js`" + + ``` js + var consent = __md_get("__consent") + if (consent && consent.custom) { + /* The user accepted the cookie */ + } else { + /* The user rejected the cookie */ + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - javascripts/consent.js + ``` + + [additional JavaScript]: ../customization.md#additional-javascript + [changes the settings]: #change-cookie-settings diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/index.md new file mode 100644 index 0000000..7acf2e6 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/index.md @@ -0,0 +1,137 @@ +--- +title: Extensions +--- + +# Extensions + +Markdown is a very small language with a kind-of reference implementation called +[John Gruber's Markdown]. [Python Markdown] and [Python Markdown Extensions] +are two packages that enhance the Markdown writing experience, adding useful +syntax extensions for technical writing. + + [John Gruber's Markdown]: https://daringfireball.net/projects/markdown/ + [Python Markdown]: python-markdown.md + [Python Markdown Extensions]: python-markdown-extensions.md + +## Supported extensions + +The following extensions are all supported by Material for MkDocs and therefore +strongly recommended. Click on each extension to learn about its purpose and +configuration: + +<div class="mdx-columns" markdown> + +- [Abbreviations] +- [Admonition] +- [Arithmatex] +- [Attribute Lists] +- [BetterEm] +- [Caret, Mark & Tilde] +- [Critic] +- [Definition Lists] +- [Details] +- [Emoji] +- [Footnotes] +- [Highlight] +- [Keys] +- [Markdown in HTML] +- [SmartSymbols] +- [Snippets] +- [SuperFences] +- [Tabbed] +- [Table of Contents] +- [Tables] +- [Tasklist] + +</div> + + [Abbreviations]: python-markdown.md#abbreviations + [Admonition]: python-markdown.md#admonition + [Arithmatex]: python-markdown-extensions.md#arithmatex + [Attribute Lists]: python-markdown.md#attribute-lists + [BetterEm]: python-markdown-extensions.md#betterem + [Caret, Mark & Tilde]: python-markdown-extensions.md#caret-mark-tilde + [Critic]: python-markdown-extensions.md#critic + [Definition Lists]: python-markdown.md#definition-lists + [Details]: python-markdown-extensions.md#details + [Emoji]: python-markdown-extensions.md#emoji + [Footnotes]: python-markdown.md#footnotes + [Highlight]: python-markdown-extensions.md#highlight + [Keys]: python-markdown-extensions.md#keys + [Markdown in HTML]: python-markdown.md#markdown-in-html + [SmartSymbols]: python-markdown-extensions.md#smartsymbols + [Snippets]: python-markdown-extensions.md#snippets + [SuperFences]: python-markdown-extensions.md#superfences + [Tabbed]: python-markdown-extensions.md#tabbed + [Table of Contents]: python-markdown.md#table-of-contents + [Tables]: python-markdown.md#tables + [Tasklist]: python-markdown-extensions.md#tasklist + +## Configuration + +Extensions are configured as part of `mkdocs.yml` – the MkDocs configuration +file. The following sections contain two example configurations to bootstrap +your documentation project. + + [overview]: #advanced-configuration + +### Minimal configuration + +This configuration is a good starting point for when you're using Material for +MkDocs for the first time. The best idea is to explore the [reference], and +gradually add what you want to use: + +``` yaml +markdown_extensions: + + # Python Markdown + - toc: + permalink: true + + # Python Markdown Extensions + - pymdownx.highlight + - pymdownx.superfences +``` + + [reference]: ../../reference/index.md + +### Recommended configuration + +This configuration enables all Markdown-related features of Material for MkDocs +and is great for experienced users bootstrapping a new documentation project: + +``` yaml +markdown_extensions: + + # Python Markdown + - abbr + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - toc: + permalink: true + + # Python Markdown Extensions + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde +``` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/python-markdown-extensions.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/python-markdown-extensions.md new file mode 100644 index 0000000..97aa098 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/python-markdown-extensions.md @@ -0,0 +1,801 @@ +# Python Markdown Extensions + +The [Python Markdown Extensions] package is an excellent collection of +additional extensions perfectly suited for advanced technical writing. Material +for MkDocs lists this package as an explicit dependency, so it's automatically +installed with a supported version. + + [Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/ + +## Supported extensions + +In general, all extensions that are part of [Python Markdown Extensions] should +work with Material for MkDocs. The following list includes all extensions that +are natively supported, meaning they work without any further adjustments. + +### Arithmatex + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.arithmatex][Arithmatex] --> + +The [Arithmatex] extension allows for rendering of block and inline block +equations and integrates seamlessly with [MathJax][^1] – a library for +mathematical typesetting. Enable it via `mkdocs.yml`: + + [^1]: + Other libraries like [KaTeX] are also supported and can be integrated with + some additional effort. See the [Arithmatex documentation on KaTeX] for + further guidance, as this is beyond the scope of Material for MkDocs. + +``` yaml +markdown_extensions: + - pymdownx.arithmatex: + generic: true +``` + +Besides enabling the extension in `mkdocs.yml`, a MathJax configuration and +the JavaScript runtime need to be included, which can be done with a few lines +of [additional JavaScript]: + +=== ":octicons-file-code-16: `docs/javascripts/mathjax.js`" + + ``` js + window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } + }; + + document$.subscribe(() => { // (1)! + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() + }) + ``` + + 1. This integrates MathJax with [instant loading] + + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - javascripts/mathjax.js + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + +See reference for usage: + +- [Using block syntax] +- [Using inline block syntax] + + [Arithmatex]: https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/ + [Arithmatex documentation on KaTeX]: https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/#loading-katex + [MathJax]: https://www.mathjax.org/ + [KaTeX]: https://github.com/Khan/KaTeX + [additional JavaScript]: ../../customization.md#additional-javascript + [instant loading]: ../setting-up-navigation.md#instant-loading + [Using block syntax]: ../../reference/math.md#using-block-syntax + [Using inline block syntax]: ../../reference/math.md#using-inline-block-syntax + +### BetterEm + +<!-- md:version 0.1.0 --> +<!-- md:extension [pymdownx.betterem][BetterEm] --> + +The [BetterEm] extension improves the detection of Markup to emphasize text +in Markdown using special characters, i.e. for `**bold**` and `_italic_` +formatting. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.betterem +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. See the [BetterEm +documentation][BetterEm] for more information. + + [BetterEm]: https://facelessuser.github.io/pymdown-extensions/extensions/betterem/ + +### Caption + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.blocks.caption][Caption] --> + +The [Caption] extension adds the ability to add captions to any Markdown block, +including images, tables, and code blocks. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.blocks.caption +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. See the [Caption +documentation][Caption] for more information. + + [Caption]: https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/ + +### Caret, Mark & Tilde + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.caret][Caret] --> + +The [Caret], [Mark] and [Tilde] extensions add the ability to highlight text +and define sub- and superscript using a simple syntax. Enable them together +via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.caret + - pymdownx.mark + - pymdownx.tilde +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. See the [Caret], [Mark] +and [Tilde documentation][Tilde] for guidance. + +See reference for usage: + +- [Highlighting text] +- [Sub- and superscripts] + + [Caret]: https://facelessuser.github.io/pymdown-extensions/extensions/caret/ + [Mark]: https://facelessuser.github.io/pymdown-extensions/extensions/mark/ + [Tilde]: https://facelessuser.github.io/pymdown-extensions/extensions/tilde/ + [Highlighting text]: ../../reference/formatting.md#highlighting-text + [Sub- and superscripts]: ../../reference/formatting.md#sub-and-superscripts + +### Critic + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.critic][Critic] --> + +The [Critic] extension allows for the usage of [Critic Markup] to highlight +added, deleted or updated sections in a document, i.e. for tracking changes in +Markdown syntax. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.critic +``` + +The following configuration options are supported: + +<!-- md:option pymdownx.critic.mode --> + +: <!-- md:default `view` --> This option defines how the markup + should be parsed, i.e. whether to just `view` all suggested changes, or + alternatively `accept` or `reject` them: + + === "View changes" + + ``` yaml + markdown_extensions: + - pymdownx.critic: + mode: view + ``` + + === "Accept changes" + + ``` yaml + markdown_extensions: + - pymdownx.critic: + mode: accept + ``` + + === "Reject changes" + + ``` yaml + markdown_extensions: + - pymdownx.critic: + mode: reject + ``` + +See reference for usage: + +- [Highlighting changes] + + [Critic]: https://facelessuser.github.io/pymdown-extensions/extensions/critic/ + [Critic Markup]: https://github.com/CriticMarkup/CriticMarkup-toolkit + [Highlighting changes]: ../../reference/formatting.md#highlighting-changes + +### Details + +<!-- md:version 1.9.0 --> +<!-- md:extension [pymdownx.details][Details] --> + +The [Details] extension supercharges the [Admonition] extension, making the +resulting _call-outs_ collapsible, allowing them to be opened and closed by the +user. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.details +``` + +No configuration options are available. See reference for usage: + +- [Collapsible blocks] + + [Details]: https://facelessuser.github.io/pymdown-extensions/extensions/details/ + [Admonition]: python-markdown.md#admonition + [Collapsible blocks]: ../../reference/admonitions.md#collapsible-blocks + +### Emoji + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.emoji][Emoji] --> + +The [Emoji] extension automatically inlines bundled and custom icons and emojis +in `*.svg` file format into the resulting HTML page. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji # (1)! + emoji_generator: !!python/name:material.extensions.emoji.to_svg +``` + +1. [Python Markdown Extensions] uses the `pymdownx` namespace, but in order to + support the inlining of icons, the `materialx` namespace must be used, as it + extends the functionality of `pymdownx`. + +The following configuration options are supported: + +<!-- md:option pymdownx.emoji.emoji_index --> + +: <!-- md:default `emojione` --> This option defines which set + of emojis is used for rendering. Note that the use of `emojione` is not + recommended due to [restrictions in licensing][Emoji index]: + + ``` yaml + markdown_extensions: + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + ``` + +<!-- md:option pymdownx.emoji.emoji_generator --> + +: <!-- md:default `to_png` --> This option defines how the + resolved emoji or icon shortcode is render. Note that icons can only be + used together with the `to_svg` configuration: + + ``` yaml + markdown_extensions: + - pymdownx.emoji: + emoji_generator: !!python/name:material.extensions.emoji.to_svg + ``` + +<!-- md:option pymdownx.emoji.options.custom_icons --> + +: <!-- md:default none --> This option allows to list folders + with additional icon sets to be used in Markdown or `mkdocs.yml`, which is + explained in more detail in the [icon customization guide]: + + ``` yaml + markdown_extensions: + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + options: + custom_icons: + - overrides/.icons + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + +See reference for usage: + +- [Using emojis] +- [Using icons] +- [Using icons in templates] + + [Emoji]: https://facelessuser.github.io/pymdown-extensions/extensions/emoji/ + [Emoji index]: https://facelessuser.github.io/pymdown-extensions/extensions/emoji/#default-emoji-indexes + [icon customization guide]: ../changing-the-logo-and-icons.md#additional-icons + [Using emojis]: ../../reference/icons-emojis.md#using-emojis + [Using icons]: ../../reference/icons-emojis.md#using-icons + [Using icons in templates]: ../../reference/icons-emojis.md#using-icons-in-templates + +### Highlight + +<!-- md:version 5.0.0 --> +<!-- md:extension [pymdownx.highlight][Highlight] --> + +The [Highlight] extension adds support for syntax highlighting of code blocks +(with the help of [SuperFences][pymdownx.superfences]) and inline code blocks +(with the help of [InlineHilite][pymdownx.inlinehilite]). Enable it via +`mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.superfences # (1)! +``` + +1. [Highlight] is used by the [SuperFences][pymdownx.superfences] extension to + perform syntax highlighting on code blocks, not the other way round, which + is why this extension also needs to be enabled. + +The following configuration options are supported: + +<!-- md:option pymdownx.highlight.use_pygments --> + +: <!-- md:default `true` --> This option allows to control + whether highlighting should be carried out during build time using + [Pygments] or in the browser with a JavaScript syntax highlighter: + + === "Pygments" + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + use_pygments: true + - pymdownx.superfences + ``` + + === "JavaScript" + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + use_pygments: false + ``` + + As an example, [Highlight.js], a JavaScript syntax highlighter, can be + integrated with some [additional JavaScript] and an [additional style + sheet] in `mkdocs.yml`: + + === ":octicons-file-code-16: `docs/javascripts/highlight.js`" + + ``` js + document$.subscribe(() => { + hljs.highlightAll() + }) + ``` + + === ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js + - javascripts/highlight.js + extra_css: + - https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/styles/default.min.css + ``` + + Note that [Highlight.js] has no affiliation with the + [Highlight][pymdownx.highlight] extension. + + All following configuration options are only compatible with build-time + syntax highlighting using [Pygments], so they don't apply if `use_pygments` + is set to `false`. + +<!-- md:option pymdownx.highlight.pygments_lang_class --> + +: <!-- md:default `false` --> This option instructs [Pygments] + to add a CSS class to identify the language of the code block, which is + essential for custom annotation markers to function: + +``` yaml +markdown_extensions: + - pymdownx.highlight: + pygments_lang_class: true +``` + +<!-- md:option pymdownx.highlight.auto_title --> + +: <!-- md:default `false` --> This option will automatically + add a [title] to all code blocks that shows the name of the language being + used, e.g. `Python` is printed for a `py` block: + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + auto_title: true + ``` + +<!-- md:option pymdownx.highlight.linenums --> + +: <!-- md:default `false` --> This option will add line numbers + to _all_ code blocks. If you wish to add line numbers to _some_, but not all + code blocks, consult the section on [adding line numbers][Adding line + numbers] in the code block reference, which also contains some tips on + working with line numbers: + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + linenums: true + ``` + +<!-- md:option pymdownx.highlight.linenums_style --> + +: <!-- md:default `table` --> The [Highlight] extension + provides three ways to add line numbers, two of which are supported by + Material for MkDocs. While `table` wraps a code block in a `<table>` + element, `pymdownx-inline` renders line numbers as part of the line itself: + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + linenums_style: pymdownx-inline + ``` + + Note that `inline` will put line numbers next to the actual code, which + means that they will be included when selecting text with the cursor or + copying a code block to the clipboard. Thus, the usage of either `table` + or `pymdownx-inline` is recommended. + +<!-- md:option pymdownx.highlight.anchor_linenums --> + +: <!-- md:version 8.1.0 --> :octicons-milestone-24: + Default: `false` – If a code blocks contains line numbers, enabling this + setting will wrap them with anchor links, so they can be hyperlinked and + shared more easily: + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + ``` + +<!-- md:option pymdownx.highlight.line_spans --> + +: <!-- md:default none --> When this option is set, each + line of a code block is wrapped in a `span`, which is essential for features + like line highlighting to work correctly: + + ``` yaml + markdown_extensions: + - pymdownx.highlight: + line_spans: __span + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + +See reference for usage: + +- [Using code blocks] +- [Adding a title] +- [Adding line numbers] +- [Highlighting specific lines] +- [Custom syntax theme] + + [Highlight]: https://facelessuser.github.io/pymdown-extensions/extensions/highlight/ + [CodeHilite]: python-markdown.md#codehilite + [pymdownx.superfences]: #superfences + [pymdownx.inlinehilite]: #inlinehilite + [Pygments]: https://pygments.org + [additional style sheet]: ../../customization.md#additional-css + [Highlight.js]: https://highlightjs.org/ + [title]: ../../reference/code-blocks.md#adding-a-title + [Adding line numbers]: ../../reference/code-blocks.md#adding-line-numbers + [Using code blocks]: ../../reference/code-blocks.md#usage + [Adding a title]: ../../reference/code-blocks.md#adding-a-title + [Highlighting specific lines]: ../../reference/code-blocks.md#highlighting-specific-lines + [Custom syntax theme]: ../../reference/code-blocks.md#custom-syntax-theme + +### InlineHilite + +<!-- md:version 5.0.0 --> +<!-- md:extension [pymdownx.inlinehilite][InlineHilite] --> + +The [InlineHilite] extension add support for syntax highlighting of inline code +blocks. It's built on top of the [Highlight][pymdownx.highlight] extension, from +which it sources its configuration. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.highlight + - pymdownx.inlinehilite +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. The only exception is +the [`css_class`][InlineHilite options] option, which must not be changed. See the +[InlineHilite documentation][InlineHilite] for guidance. + +See reference for usage: + +- [Highlighting inline code blocks] + + [InlineHilite]: https://facelessuser.github.io/pymdown-extensions/extensions/inlinehilite/ + [InlineHilite options]: https://facelessuser.github.io/pymdown-extensions/extensions/inlinehilite/#options + [pymdownx.highlight]: #highlight + [Highlighting inline code blocks]: ../../reference/code-blocks.md#highlighting-inline-code-blocks + +### Keys + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.keys][Keys] --> + +The [Keys] extension adds a simple syntax to allow for the rendering of keyboard +keys and combinations, e.g. ++ctrl+alt+del++. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.keys +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. The only exception is +the [`class`][Keys options] option, which must not be changed. See the +[Keys documentation][Keys] for more information. + +See reference for usage: + +- [Adding keyboard keys] + + [Keys]: https://facelessuser.github.io/pymdown-extensions/extensions/keys/ + [Keys options]: https://facelessuser.github.io/pymdown-extensions/extensions/keys/#options + [Adding keyboard keys]: ../../reference/formatting.md#adding-keyboard-keys + +### SmartSymbols + +<!-- md:version 0.1.0 --> +<!-- md:extension [pymdownx.smartsymbols][SmartSymbols] --> + +The [SmartSymbols] extension converts some sequences of characters into their +corresponding symbols, e.g. copyright symbols or fractions. Enable it via +`mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.smartsymbols +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. See the [SmartSymbols +documentation][SmartSymbols] for guidance. + + [SmartSymbols]: https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/ + +### Snippets + +<!-- md:version 0.1.0 --> +<!-- md:extension [pymdownx.snippets][Snippets] --> + +The [Snippets] extension adds the ability to embed content from arbitrary files +into a document, including other documents or source files, by using a simple +syntax. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.snippets +``` + +The configuration options of this extension are not specific to Material for +MkDocs, as they only impact the Markdown parsing stage. See the [Snippets +documentation][Snippets] for more information. + +See reference for usage: + +- [Adding a glossary] +- [Embedding external files] + + [Snippets]: https://facelessuser.github.io/pymdown-extensions/extensions/snippets/ + [Adding a glossary]: ../../reference/tooltips.md#adding-a-glossary + [Embedding external files]: ../../reference/code-blocks.md#embedding-external-files + +### SuperFences + +<!-- md:version 0.1.0 --> +<!-- md:extension [pymdownx.superfences][SuperFences] --> + +The [SuperFences] extension allows for arbitrary nesting of code and content +blocks inside each other, including admonitions, tabs, lists and all other +elements. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.superfences +``` + +The following configuration options are supported: + +<!-- md:option pymdownx.superfences.custom_fences --> + +: <!-- md:default none --> This option allows to define a + handler for custom fences, e.g. to preserve the definitions of [Mermaid.js] + diagrams to be interpreted in the browser: + + ``` yaml + markdown_extensions: + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + ``` + + Note that this will primarily prevent syntax highlighting from being + applied. See the reference on [diagrams] to learn how Mermaid.js is + integrated with Material for MkDocs. + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + +See reference for usage: + +- [Using annotations] +- [Using code blocks] +- [Using content tabs] +- [Using flowcharts] +- [Using sequence diagrams] +- [Using state diagrams] +- [Using class diagrams] +- [Using entity-relationship diagrams] + + [SuperFences]: https://facelessuser.github.io/pymdown-extensions/extensions/superfences/ + [Fenced Code Blocks]: python-markdown.md#fenced-code-blocks + [Mermaid.js]: https://mermaid-js.github.io/mermaid/ + [diagrams]: ../../reference/diagrams.md + [Using annotations]: ../../reference/annotations.md#usage + [Using content tabs]: ../../reference/content-tabs.md#usage + [Using flowcharts]: ../../reference/diagrams.md#using-flowcharts + [Using sequence diagrams]: ../../reference/diagrams.md#using-sequence-diagrams + [Using state diagrams]: ../../reference/diagrams.md#using-state-diagrams + [Using class diagrams]: ../../reference/diagrams.md#using-class-diagrams + [Using entity-relationship diagrams]: ../../reference/diagrams.md#using-entity-relationship-diagrams + +### Tabbed + +<!-- md:version 5.0.0 --> +<!-- md:extension [pymdownx.tabbed][Tabbed] --> + +The [Tabbed] extension allows the usage of content tabs, a simple way to group +related content and code blocks under accessible tabs. Enable it via +`mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.tabbed: + alternate_style: true +``` + +The following configuration options are supported: + +<!-- md:option pymdownx.tabbed.alternate_style --> + +: <!-- md:version 7.3.1 --> <!-- md:default `false` --> + <!-- md:flag required --> This option enables the content tabs + [alternate style], which has [better behavior on mobile viewports], and is + the only supported style: + + ``` yaml + markdown_extensions: + - pymdownx.tabbed: + alternate_style: true + ``` + +<!-- md:option pymdownx.tabbed.combine_header_slug --> + +: <!-- md:default `false` --> This option enables the content tabs' + [`combine_header_slug` style] flag, which prepends the id of the header to + the id of the tab: + + ``` yaml + markdown_extensions: + - pymdownx.tabbed: + combine_header_slug: true + ``` + +<!-- md:option pymdownx.tabbed.slugify --> + +: <!-- md:default `None` --> This option allows for + customization of the slug function. For some languages, the default may not + produce good and readable identifiers – consider using another slug function + like for example those from [Python Markdown Extensions][Slugs]: + + === "Unicode" + + ``` yaml + markdown_extensions: + - pymdownx.tabbed: + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + ``` + + === "Unicode, case-sensitive" + + ``` yaml + markdown_extensions: + - pymdownx.tabbed: + slugify: !!python/object/apply:pymdownx.slugs.slugify {} + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + +See reference for usage: + +- [Grouping code blocks] +- [Grouping other content] +- [Embedded content] + + [Tabbed]: https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/ + [alternate style]: https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/#alternate-style + [combine_header_slug style]: https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/#tab-ids + [better behavior on mobile viewports]: https://x.com/squidfunk/status/1424740370596958214 + [Grouping code blocks]: ../../reference/content-tabs.md#grouping-code-blocks + [Grouping other content]: ../../reference/content-tabs.md#grouping-other-content + [Embedded content]: ../../reference/content-tabs.md#embedded-content + [Slugs]: https://facelessuser.github.io/pymdown-extensions/extras/slugs/ + +### Tasklist + +<!-- md:version 1.0.0 --> +<!-- md:extension [pymdownx.tasklist][Tasklist] --> + +The [Tasklist] extension allows for the usage of [GitHub Flavored Markdown] +inspired [task lists][Tasklist specification], following the same syntactical +conventions. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - pymdownx.tasklist: + custom_checkbox: true +``` + +The following configuration options are supported: + +<!-- md:option pymdownx.tasklist.custom_checkbox --> + +: <!-- md:default `false` --> This option toggles the rendering + style of checkboxes, replacing native checkbox styles with beautiful icons, + and is therefore recommended: + + ``` yaml + markdown_extensions: + - pymdownx.tasklist: + custom_checkbox: true + ``` + +<!-- md:option pymdownx.tasklist.clickable_checkbox --> + +: <!-- md:default `false` --> This option toggles whether + checkboxes are clickable. As the state is not persisted, the use of this + option is _rather discouraged_ from a user experience perspective: + + ``` yaml + markdown_extensions: + - pymdownx.tasklist: + clickable_checkbox: true + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + +See reference for usage: + +- [Using task lists] + + [Tasklist]: https://facelessuser.github.io/pymdown-extensions/extensions/tasklist/ + [GitHub Flavored Markdown]: https://github.github.com/gfm/ + [Tasklist specification]: https://github.github.com/gfm/#task-list-items-extension- + [Using task lists]: ../../reference/lists.md#using-task-lists diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/python-markdown.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/python-markdown.md new file mode 100644 index 0000000..a724e2f --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/extensions/python-markdown.md @@ -0,0 +1,347 @@ +# Python Markdown + +Material for MkDocs supports a large number of [Python Markdown] extensions, +which is part of what makes it so attractive for technical writing. Following +is a list of all supported extensions, linking to the relevant sections of the +reference for which features they need to be enabled. + + [Python Markdown]: https://python-markdown.github.io/ + +## Supported extensions + +### Abbreviations + +<!-- md:version 1.0.0 --> +<!-- md:extension [abbr][Abbreviations] --> + +The [Abbreviations] extension adds the ability to add a small tooltip to an +element, by wrapping it with an `abbr` tag. Only plain text (no markup) is +supported. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - abbr +``` + +No configuration options are available. See reference for usage: + +- [Adding abbreviations] +- [Adding a glossary] + + [Abbreviations]: https://python-markdown.github.io/extensions/abbreviations/ + [Adding abbreviations]: ../../reference/tooltips.md#adding-abbreviations + [Adding a glossary]: ../../reference/tooltips.md#adding-a-glossary + +### Admonition + +<!-- md:version 0.1.0 --> +<!-- md:extension [admonition][Admonition] --> + +The [Admonition] extension adds support for admonitions, more commonly known as +_call-outs_, which can be defined in Markdown by using a simple syntax. Enable +it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - admonition +``` + +No configuration options are available. See reference for usage: + +- [Adding admonitions] +- [Changing the title] +- [Removing the title] +- [Supported types] + + [Admonition]: https://python-markdown.github.io/extensions/admonition/ + [Adding admonitions]: ../../reference/admonitions.md#usage + [Changing the title]: ../../reference/admonitions.md#changing-the-title + [Removing the title]: ../../reference/admonitions.md#removing-the-title + [Supported types]: ../../reference/admonitions.md#supported-types + +### Attribute Lists + +<!-- md:version 0.1.0 --> +<!-- md:extension [attr_list][Attribute Lists] --> + +The [Attribute Lists] extension allows to add HTML attributes and CSS classes +to [almost every][Attribute Lists limitations] Markdown inline- and block-level +element with a special syntax. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - attr_list +``` + +No configuration options are available. See reference for usage: + +- [Using annotations] +- [Using grids] +- [Adding buttons] +- [Adding tooltips] +- [Using icons with colors] +- [Using icons with animations] +- [Image alignment] +- [Image lazy-loading] + + [Attribute Lists]: https://python-markdown.github.io/extensions/attr_list/ + [Attribute Lists limitations]: https://python-markdown.github.io/extensions/attr_list/#limitations + [Using grids]: ../../reference/grids.md#using-grids + [Adding buttons]: ../../reference/buttons.md#adding-buttons + [Adding tooltips]: ../../reference/tooltips.md#adding-tooltips + [Using icons with colors]: ../../reference/icons-emojis.md#with-colors + [Using icons with animations]: ../../reference/icons-emojis.md#with-animations + [Image alignment]: ../../reference/images.md#image-alignment + [Image lazy-loading]: ../../reference/images.md#image-lazy-loading + +### Definition Lists + +<!-- md:version 1.1.0 --> +<!-- md:extension [def_list][Definition Lists] --> + +The [Definition Lists] extension adds the ability to add definition lists (more +commonly known as [description lists] – `dl` in HTML) via Markdown to a +document. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - def_list +``` + +No configuration options are available. See reference for usage: + +- [Using definition lists] + + [Definition Lists]: https://python-markdown.github.io/extensions/definition_lists/ + [description lists]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl + [Using definition lists]: ../../reference/lists.md#using-definition-lists + +### Footnotes + +<!-- md:version 1.0.0 --> +<!-- md:extension [footnotes][Footnotes] --> + +The [Footnotes] extension allows to define inline footnotes, which are then +rendered below all Markdown content of a document. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - footnotes +``` + +No configuration options are supported. See reference for usage: + +- [Adding footnote references] +- [Adding footnote content] + + [Footnotes]: https://python-markdown.github.io/extensions/footnotes/ + [Adding footnote references]: ../../reference/footnotes.md#adding-footnote-references + [Adding footnote content]: ../../reference/footnotes.md#adding-footnote-content + +### Markdown in HTML + +<!-- md:version 0.1.0 --> +<!-- md:extension [md_in_html][Markdown in HTML] --> + +The [Markdown in HTML] extension allows for writing Markdown inside of HTML, +which is useful for wrapping Markdown content with custom elements. Enable it +via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - md_in_html +``` + +> By default, Markdown ignores any content within a raw HTML block-level +> element. With the `md_in_html` extension enabled, the content of a raw HTML +> block-level element can be parsed as Markdown by including a `markdown` +> attribute on the opening tag. The `markdown` attribute will be stripped from +> the output, while all other attributes will be preserved. + +No configuration options are available. See reference for usage: + +- [Using annotations] +- [Using grids] +- [Image captions] + + [Markdown in HTML]: https://python-markdown.github.io/extensions/md_in_html/ + [Using annotations]: ../../reference/annotations.md#usage + [Using grids]: ../../reference/grids.md#usage + [Image captions]: ../../reference/images.md#image-captions + +### Table of Contents + +<!-- md:version 0.1.0 --> +<!-- md:extension [toc][Table of Contents] --> + +The [Table of Contents] extension automatically generates a table of contents +from a document, which Material for MkDocs will render as part of the resulting +page. Enable it via `mkdocs.yml`: + +``` yaml +markdown_extensions: + - toc: + permalink: true +``` + +The following configuration options are supported: + +<!-- md:option toc.title --> + +: <!-- md:version 7.3.5 --> <!-- md:default computed --> – + This option sets the title of the table of contents in the right navigation + sidebar, which is normally automatically sourced from the translations for + the [site language] as set in `mkdocs.yml`: + + ``` yaml + markdown_extensions: + - toc: + title: On this page + ``` + +<!-- md:option toc.permalink --> + +: <!-- md:default `false` --> This option adds an anchor link + containing the paragraph symbol `¶` or another custom symbol at the end of + each headline, exactly like on the page you're currently viewing, which + Material for MkDocs will make appear on hover: + + === "¶" + + ``` yaml + markdown_extensions: + - toc: + permalink: true + ``` + + === "⚓︎" + + ``` yaml + markdown_extensions: + - toc: + permalink: ⚓︎ + ``` + +<!-- md:option toc.permalink_title --> + +: <!-- md:default `Permanent link` --> This option sets the + title of the anchor link which is shown on hover and read by screen readers. + For accessibility reasons, it might be beneficial to change it to a more + discernable name, stating that the anchor links to the section itself: + + ``` yaml + markdown_extensions: + - toc: + permalink_title: Anchor link to this section for reference + ``` + +<!-- md:option toc.slugify --> + +: <!-- md:default `toc.slugify` --> This option allows for + customization of the slug function. For some languages, the default may not + produce good and readable identifiers – consider using another slug function + like for example those from [Python Markdown Extensions][Slugs]: + + === "Unicode" + + ``` yaml + markdown_extensions: + - toc: + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + ``` + + === "Unicode, case-sensitive" + + ``` yaml + markdown_extensions: + - toc: + slugify: !!python/object/apply:pymdownx.slugs.slugify {} + ``` + +<!-- md:option toc.toc_depth --> + +: <!-- md:default `6` --> Define the range of levels to be + included in the table of contents. This may be useful for project + documentation with deeply structured headings to decrease the length of the + table of contents, or to remove the table of contents altogether: + + === "Hide levels 4-6" + + ``` yaml + markdown_extensions: + - toc: + toc_depth: 3 + ``` + + === "Hide table of contents" + + ``` yaml + markdown_extensions: + - toc: + toc_depth: 0 + ``` + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use +them at your own risk. + + [Table of Contents]: https://python-markdown.github.io/extensions/toc/ + [site language]: ../changing-the-language.md#site-language + [Slugs]: https://facelessuser.github.io/pymdown-extensions/extras/slugs/ + +### Tables + +<!-- md:version 0.1.0 --> +<!-- md:extension [tables][Tables] --> + +The [Tables] extension adds the ability to create tables in Markdown by using a +simple syntax. Enable it via `mkdocs.yml` (albeit it should be enabled by +default): + +``` yaml +markdown_extensions: + - tables +``` + +No configuration options are available. See reference for usage: + +- [Using data tables] +- [Column alignment] + + [Tables]: https://python-markdown.github.io/extensions/tables/ + [Using data tables]: ../../reference/data-tables.md#usage + [Column alignment]: ../../reference/data-tables.md#column-alignment + +## Superseded extensions + +The following [Python Markdown] extensions are not (or might not be) supported +anymore, and are therefore not recommended for use. Instead, the alternatives +should be considered. + +### Fenced Code Blocks + +<!-- md:version 0.1.0 --> +<!-- md:extension [fenced_code_blocks][Fenced Code Blocks] --> + +Superseded by [SuperFences]. This extension might still work, but the +[SuperFences] extension is superior in many ways, as it allows for arbitrary +nesting, and is therefore recommended. + + [Fenced Code Blocks]: https://python-markdown.github.io/extensions/fenced_code_blocks/ + [SuperFences]: https://facelessuser.github.io/pymdown-extensions/extensions/superfences/ + +### CodeHilite + +<!-- md:version 0.1.0 --> +<!-- md:extension [codehilite][CodeHilite] --> + +Superseded by [Highlight]. Support for CodeHilite was dropped in +<!-- md:version 6.0.0 -->, as [Highlight] has a better integration with other +essential extensions like [SuperFences] and [InlineHilite]. + + [CodeHilite]: https://python-markdown.github.io/extensions/code_hilite/ + [CodeHilite support]: https://github.com/squidfunk/mkdocs-material/releases/tag/0.1.0 + [Highlight]: https://facelessuser.github.io/pymdown-extensions/extensions/highlight/ + [InlineHilite]: https://facelessuser.github.io/pymdown-extensions/extensions/inlinehilite/ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/index.md new file mode 100644 index 0000000..c470698 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/index.md @@ -0,0 +1,90 @@ +# Setup + +Material for MkDocs offers a wide range of options for customizing your +documentation. In this section, we will explain how you can create a meaningful +structure for your site, change the look and feel, add a blog and comment system, +and build a highly optimized site. + +## Site structure + +Set up and customize the structure of your documentation by configuring the +header and footer to your taste, choosing among many modes of navigation, +setting up site search, and more. + +<div class="grid cards" markdown> + +- :fontawesome-solid-earth-americas: __[Language]__ – Choose out of the 60+ supported languages or add a new one +- :material-page-layout-sidebar-left: __[Navigation]__ – Create a clear, concise, and comprehensive navigation structure +- :material-page-layout-header: __[Header]__ – Customize the behavior of the header, add an announcement bar +- :material-page-layout-footer: __[Footer]__ – Add links to your social media profiles or websites in the footer +- :material-tab-search: __[Search]__ – Set up and configure search, running entirely in the user's browser +- :material-tag-plus-outline: __[Tags]__ – Categorize your pages with tags and group related pages + +</div> + + [Language]: changing-the-language.md + [Navigation]: setting-up-navigation.md + [Header]: setting-up-the-header.md + [Footer]: setting-up-the-footer.md + [Search]: setting-up-site-search.md + [Tags]: setting-up-tags.md + + +## Appearance + +Match your brand's colors, fonts, icons, logo, and more with a few lines of +configuration – Material for MkDocs makes it easy to extend the basic +configuration or alter the appearance. + +<div class="grid cards" markdown> + +- :material-brush-variant: __[Colors]__ – Change colors with an existing color palette or customize with CSS +- :material-format-font: __[Fonts]__ – Choose among 1,000 Google Fonts or load self-hosted fonts +- :material-google-downasaur: __[Logo & Icons]__ – Change the logo, use any of the 8,000+ icons, or add new ones +- :material-cards-variant: __[Social Cards]__ – Automatically create social media previews when sharing links + +</div> + + [Colors]: changing-the-colors.md + [Fonts]: changing-the-fonts.md + [Logo & Icons]: changing-the-logo-and-icons.md + [Social Cards]: setting-up-social-cards.md + +## Content + +Create a blog, integrate a comment system, connect a git repository, and set up +versioned documentation that matches your project's versioning methodology. + +<div class="grid cards" markdown> + +- :material-book-open-outline: __[Blog]__ – Set up a standalone blog or host it alongside your documentation +- :material-comment-text-outline: __[Comment System]__ – Add a third-party comment system on any page or footer +- :octicons-versions-16: __[Versioning]__ – Deploy multiple versions by integrating with external utilities +- :octicons-repo-16: __[Repository]__ – Connect your documentation to your git repository + +</div> + + [Blog]: setting-up-a-blog.md + [Comment System]: adding-a-comment-system.md + [Versioning]: setting-up-versioning.md + [Repository]: adding-a-git-repository.md + +## Optimization + +Add site analytics and build an optimized site by adding automatic image +compression, complying with GDPR data privacy regulations, and making it +offline-capable. + +<div class="grid cards" markdown> + +- :material-google-analytics: __[Site analytics]__ – Learn how your users experience your documentation +- :material-screwdriver: __[Optimized site]__ – Create optimized sites that rank great on search engines +- :octicons-lock-16: __[Data Privacy]__ – Ensure compliance with data privacy regulations +- :octicons-cloud-offline-16: __[Offline usage]__ – Build an online and offline-capable documentation + +</div> + + [Site analytics]: setting-up-site-analytics.md + [Optimized site]: building-an-optimized-site.md + [Data Privacy]: ensuring-data-privacy.md + [Offline usage]: building-for-offline-usage.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-a-blog.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-a-blog.md new file mode 100644 index 0000000..180a21e --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-a-blog.md @@ -0,0 +1,677 @@ +# Setting up a blog + +Material for MkDocs makes it very easy to build a blog, either as a sidecar to +your documentation or standalone. Focus on your content while the engine does +all the heavy lifting, automatically generating [archive] and [category] +indexes, [post slugs], configurable [pagination] and more. + +--- + +__Check out our [blog], which is created with the new [built-in blog plugin]!__ + + [archive]: ../plugins/blog.md#archive + [category]: ../plugins/blog.md#categories + [post slugs]: ../plugins/blog.md#config.post_url_format + [pagination]: ../plugins/blog.md#pagination + [blog]: ../blog/index.md + +## Configuration + +### Built-in blog plugin + +<!-- md:version 9.2.0 --> +<!-- md:plugin --> +<!-- md:flag experimental --> +<!-- md:demo create-blog --> + +The built-in blog plugin adds support for building a blog from a folder of +posts, which are annotated with dates and other structured data. First, add the +following lines to `mkdocs.yml`: + +``` yaml +plugins: + - blog +``` + +If you do not have a navigation (`nav`) definition in your `mkdocs.yml` then +there is nothing else to do there as the blog plugin will add navigation +automatically. If you do have a navigation defined then you need to add *the +blog index page only* to it. You need not and should not add the individual +blog posts. For example: + +```yaml +nav: + - index.md + - Blog: + - blog/index.md +``` + +For a list of all settings, please consult the [plugin documentation]. + + [plugin documentation]: ../plugins/blog.md + [built-in blog plugin]: ../plugins/blog.md + +### RSS + +<!-- md:version 9.2.0 --> +<!-- md:plugin [rss] --> + +The [built-in blog plugin] integrates seamlessly with the [RSS plugin][rss], +which provides a simple way to add an RSS feed to your blog (or to your whole +documentation). Install it with `pip`: + +``` +pip install mkdocs-rss-plugin +``` + +Then, add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - rss: + match_path: blog/posts/.* # (1)! + date_from_meta: + as_creation: date + categories: + - categories + - tags # (2)! +``` + +1. The RSS plugin allows to filter for URLs to be included in the feed. In + this example, only blog posts will be part of the feed. + +2. If you want to include a post's categories as well as its tags in the feed, + add both `categories` and `tags` here. + +The following configuration options are supported: + +<!-- md:option rss.enabled --> + +: <!-- md:default `true` --> This option specifies whether + the plugin is enabled when building your project. If you want to speed up + local builds, you can use an [environment variable][mkdocs.env]: + + ``` yaml + plugins: + - rss: + enabled: !ENV [CI, false] + ``` + +<!-- md:option rss.match_path --> + +: <!-- md:default `.*` --> This option specifies which + pages should be included in the feed. For example, to only include blog + posts in the feed, use the following regular expression: + + ``` yaml + plugins: + - rss: + match_path: blog/posts/.* + ``` + +<!-- md:option rss.date_from_meta --> + +: <!-- md:default none --> This option specifies which + front matter property should be used as a creation date of a page in the + feed. It's recommended to use the `date` property: + + ``` yaml + plugins: + - rss: + date_from_meta: + as_creation: date + ``` + +<!-- md:option rss.categories --> + +: <!-- md:default none --> This option specifies which + front matter properties are used as categories as part of the feed. If you + use [categories] and [tags], add both with the following lines: + + ``` yaml + plugins: + - rss: + categories: + - categories + - tags + ``` + +<!-- md:option rss.comments_path --> + +: <!-- md:default none --> This option specifies the anchor + at which comments for a post or page can be found. If you've integrated a + [comment system], add the following lines: + + ``` yaml + plugins: + - rss: + comments_path: "#__comments" + ``` + +Material for MkDocs will automatically add the [necessary metadata] to your site +which will make the RSS feed discoverable by browsers and feed readers. + +The other configuration options of this extension are not officially supported +by Material for MkDocs, which is why they may yield unexpected results. Use them +at your own risk. + + [rss]: https://guts.github.io/mkdocs-rss-plugin/ + [categories]: ../plugins/blog.md#categories + [tags]: setting-up-tags.md#built-in-tags-plugin + [comment system]: adding-a-comment-system.md + [necessary metadata]: https://guts.github.io/mkdocs-rss-plugin/configuration/#integration + [theme extension]: ../customization.md + +### Blog only + +You might need to build a pure blog without any documentation. +In this case, you can create a folder tree like this: + +``` { .sh .no-copy } +. +├─ docs/ +│ ├─ posts/ # (1)! +│ ├─ .authors.yml +│ └─ index.md +└─ mkdocs.yml +``` + +1. Notice that the `posts` directory is in the root of `docs` without + intermediate `blog` directory. + +And add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - blog: + blog_dir: . # (1)! +``` + +1. Please see the [plugin documentation] for more information about the + [`blog_dir`][blog_dir] setting. + +With this configuration, the url of the blog post will be `/<post_slug>` +instead of `/blog/<post_slug>`. + +## Usage + +### Writing your first post + +After you've successfully set up the [built-in blog plugin], it's time to write +your first post. The plugin doesn't assume any specific directory structure, so +you're completely free in how you organize your posts, as long as they are all +located inside the `posts` directory: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ blog/ +│ ├─ posts/ +│ │ └─ hello-world.md # (1)! +│ └─ index.md +└─ mkdocs.yml +``` + +1. If you'd like to arrange posts differently, you're free to do so. The URLs + are built from the format specified in [`post_url_format`][post slugs] and + the titles and dates of posts, no matter how they are organized + inside the `posts` directory. + +Create a new file called `hello-world.md` and add the following lines: + +``` yaml +--- +draft: true # (1)! +date: 2024-01-31 # (2)! +categories: + - Hello + - World +--- + +# Hello world! +... +``` + +1. If you mark a post as a [draft], a red marker appears next to the post date + on index pages. When the site is built, drafts are not included in the + output. [This behavior can be changed], e.g. for rendering drafts when + building deploy previews. + +2. If you wish to provide multiple dates, you can use the following syntax, + allowing you to define a date when you last updated the blog post + + further custom dates you can add to the template: + + ``` yaml + --- + date: + created: 2022-01-31 + updated: 2022-02-02 + --- + + # Hello world! + ``` + + Note that the creation date __must__ be set under `date.created`, as each + blog post must have a creation date set. + +When you spin up the [live preview server], you should be greeted by your first +post! You'll also realize, that [archive] and [category] indexes have been +automatically generated for you. + + [draft]: ../plugins/blog.md#drafts + [This behavior can be changed]: ../plugins/blog.md#config.draft + [live preview server]: ../creating-your-site.md#previewing-as-you-write + +#### Adding an excerpt + +The blog index, as well as [archive] and [category] indexes can either list the +entire content of each post, or excerpts of posts. An excerpt can be created by +adding a `<!-- more -->` separator after the first few paragraphs of a post: + +``` py +# Hello world! + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod +nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor +massa, nec semper lorem quam in massa. + +<!-- more --> +... +``` + +When the [built-in blog plugin] generates all indexes, the content before the +[excerpt separator] is automatically extracted, allowing the user to start +reading a post before deciding to jump in. + + [excerpt separator]: ../plugins/blog.md#config.post_excerpt_separator + +#### Adding authors + +In order to add a little more personality to your posts, you can associate each +post with one or multiple [authors]. First, create the +[`.authors.yml`][authors_file] file in your blog directory, and add an author: + +``` yaml +authors: + squidfunk: + name: Martin Donath + description: Creator + avatar: https://github.com/squidfunk.png +``` + +The [`.authors.yml`][authors_file] file associates each author with an +identifier (in this example `squidfunk`), which can then be used in posts. +Different attributes can be configured. For a list of all possible attributes, +please consult the [`authors_file`][authors_file] documentation. + +Now, you can assign one or more authors to a post by referencing their +identifiers in the front matter of the Markdown file under the `authors` +property. For each author, a small profile is rendered in the left sidebar of +each post, as well as in post excerpts on index pages: + +``` yaml +--- +date: 2024-01-31 +authors: + - squidfunk + ... +--- + +# Hello world! +... +``` + + [authors]: ../plugins/blog.md#authors + [authors_file]: ../plugins/blog.md#config.authors_file + +#### Adding author profiles + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +If you wish to add a dedicated page for each author, you can enable author +profiles by setting the [`authors_profiles`][authors_profiles] configuration +option to `true`. Just add the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - blog: + authors_profiles: true +``` + +If you combine this with [custom index pages], you can create a dedicated page +for each author with a short description, social media links, etc. – basically +anything you can write in Markdown. The list of posts is then appended after +the content of the page. + + [authors_profiles]: ../plugins/blog.md#config.authors_profiles + [custom index pages]: #custom-index-pages + +#### Adding categories + +Categories are an excellent way for grouping your posts thematically on +dedicated index pages. This way, a user interested in a specific topic can +explore all of your posts on this topic. Make sure [categories] are enabled and +add them to the front matter `categories` property: + +``` yaml +--- +date: 2024-01-31 +categories: + - Hello + - World +--- + +# Hello world! +... +``` + +If you want to save yourself from typos when typing out categories, you can +define your desired categories in `mkdocs.yml` as part of the +[`categories_allowed`][categories_allowed] configuration option. The +[built-in blog plugin] will stop the build if a category is not found within +the list. + + [categories_allowed]: ../plugins/blog.md#config.categories_allowed + +#### Adding tags + +Besides [categories], the [built-in blog plugin] also integrates with the +[built-in tags plugin]. If you add tags in the front matter `tags` property as +part of a post, the post is linked from the [tags index]: + +``` yaml +--- +date: 2024-01-31 +tags: + - Foo + - Bar +--- + +# Hello world! +... +``` + +As usual, the tags are rendered above the main headline and posts are linked +on the tags index page, if configured. Note that posts are, as pages, only +linked with their titles. + + [built-in tags plugin]: ../plugins/tags.md + [tags index]: setting-up-tags.md#adding-a-tags-index + +#### Changing the slug + +Slugs are the shortened description of your post used in the URL. They are automatically generated, but you can specify a custom slug for a page: + +``` yaml +--- +slug: hello-world +--- + +# Hello there world! +... +``` + +#### Adding related links + +<!-- md:version 9.6.0 --> +<!-- md:flag experimental --> + +Related links offer the perfect way to prominently add a _further reading_ +section to your post that is included in the left sidebar, guiding the user to +other destinations of your documentation. Use the front matter `links` property +to add related links to a post: + +``` yaml +--- +date: 2024-01-31 +links: + - plugins/search.md + - insiders/how-to-sponsor.md +--- + +# Hello world! +... +``` + +You can use the exact same syntax as for the [`nav`][mkdocs.nav] section in +`mkdocs.yml`, which means you can set explicit titles for links, add external +links and even use nesting: + +``` yaml +--- +date: 2024-01-31 +links: + - plugins/search.md + - insiders/how-to-sponsor.md + - Nested section: + - External link: https://example.com + - setup/setting-up-site-search.md +--- + +# Hello world! +... +``` + +If you look closely, you'll realize that you can even use an anchor to link to +a specific section of a document, extending the possibilities of the +[`nav`][mkdocs.nav] syntax in `mkdocs.yml`. The [built-in blog plugin] resolves +the anchor and sets the title of the anchor as a [subtitle] of the related link. + +Note that all links must be relative to [`docs_dir`][mkdocs.docs_dir], as is +also the case for the [`nav`][mkdocs.nav] setting. + + [subtitle]: ../reference/index.md#setting-the-page-subtitle + +#### Linking from and to posts + +While [post URLs][post slugs] are dynamically computed, the [built-in blog +plugin] ensures that all links from and to posts and a post's assets are +correct. If you want to link to a post, just use the path to the Markdown file +as a link reference (links must be relative): + +``` markdown +[Hello World!](blog/posts/hello-world.md) +``` + +Linking from a post to a page, e.g. the index, follows the same method: + +``` markdown +[Blog](../index.md) +``` + +All assets inside the `posts` directory are copied to the `blog/assets` folder +when the site is being built. Of course, you can also reference assets from +posts outside of the `posts` directory. The [built-in blog plugin] ensures that +all links are correct. + +#### Pinning a post + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +If you want to pin a post to the top of the index page, as well as the archive +and category indexes it is part of, you can use the front matter `pin` property: + +``` yaml +--- +date: 2024-01-31 +pin: true +--- + +# Hello world! +... +``` + +If multiple posts are pinned, they are sorted by their creation date, with the +most recent pinned post being shown first, followed by the other pinned posts in +descending order. + +#### Setting the reading time + +When [enabled], the reading the expected reading time of each post is computed, +which is rendered as part of the post and post excerpt. Nowadays, many blogs +show reading times, which is why the [built-in blog plugin] offers this +capability as well. + +Sometimes, however, the computed reading time might not feel accurate, or +result in odd and unpleasant numbers. For this reason, reading time can be +overridden and explicitly set with the front matter `readtime` property for a +post: + +``` yaml +--- +date: 2024-01-31 +readtime: 15 +--- + +# Hello world! +... +``` + +This will disable automatic reading time computation. + +!!! warning "Chinese, Japanese and Korean characters" + + Reading time computation currently does not take segmentation of Chinese, + Japanese and Korean characters into account. This means that the reading + time for posts in these languages may be inaccurate. We're planning on + adding support in the future. In the meantime, please use the `readtime` + front matter property to set the reading time. + + [enabled]: ../plugins/blog.md#config.post_readtime + +#### Setting defaults + +<!-- md:version 9.6.0 --> +<!-- md:plugin [meta][built-in meta plugin] – built-in --> +<!-- md:flag experimental --> + +If you have a lot of posts, it might feel redundant to define all of the above +for each post. Luckily, the [built-in meta plugin] allows to set default front +matter properties per folder. You can group your posts by categories, or +authors, and add a `.meta.yml` file to set common properties: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ blog/ +│ ├─ posts/ +│ ├─ .meta.yml # (1)! +│ └─ index.md +└─ mkdocs.yml +``` + +1. As already noted, you can also place a `.meta.yml` file in nested folders + of the `posts` directory. This file then can define all front matter + properties that are valid in posts, e.g.: + + ``` yaml + authors: + - squidfunk + categories: + - Hello + - World + ``` + +Note that order matters – the [built-in meta plugin] must be defined before the +blog plugin in `mkdocs.yml`, so that all set defaults are correctly picked up +by the [built-in blog plugin]: + +``` yaml +plugins: + - meta + - blog +``` + +Lists and dictionaries in `.meta.yml` files are merged and deduplicated with the +values defined for a post, which means you can define common properties in +`.meta.yml` and then add specific properties or overrides for each post. + + [built-in meta plugin]: ../plugins/meta.md + +### Adding pages + +Besides posts, it's also possible to add static pages to your blog by listing +the pages in the [`nav`][mkdocs.nav] section of `mkdocs.yml`. All generated +indexes are included after the last specified page. For example, to add a page +on the authors of the blog, add the following to `mkdocs.yml`: + +``` yaml +nav: + - Blog: + - blog/index.md + - blog/authors.md + ... +``` + +## Customization + +### Custom index pages + +<!-- md:version 9.6.0 --> +<!-- md:flag experimental --> + +If you want to add custom content to automatically generated [archive] and +[category] indexes, e.g. to add a category description prior to the list of +posts, you can manually create the category page in the same location where +the [built-in blog plugin] would create it: + +``` { .sh .no-copy } +. +├─ docs/ +│ └─ blog/ +│ ├─ category/ +│ │ └─ hello.md # (1)! +│ ├─ posts/ +│ └─ index.md +└─ mkdocs.yml +``` + +1. The easiest way is to first [add the category] to the blog post, then take + the URL generated by the [built-in blog plugin] and create the file at the + corresponding location in the [`blog_dir`][blog_dir] folder. + + Note that the shown directory listing is based on the default configuration. + If you specify different values for the following options, be sure to adjust + the path accordingly: + + - [`blog_dir`][blog_dir] + - [`categories_url_format`][categories_url_format] + - [`categories_slugify`][categories_slugify] + +You can now add arbitrary content to the newly created file, or set specific +front matter properties for this page, e.g. to change the [page description]: + +``` yaml +--- +description: Nullam urna elit, malesuada eget finibus ut, ac tortor. +--- + +# Hello +... +``` + +All post excerpts belonging to the category are automatically appended. + + [add the category]: #adding-categories + [page description]: ../reference/index.md#setting-the-page-description + [categories_url_format]: ../plugins/blog.md#config.categories_url_format + [categories_slugify]: ../plugins/blog.md#config.categories_slugify + [blog_dir]: ../plugins/blog.md#config.blog_dir + +### Overriding templates + +The [built-in blog plugin] is built on the same basis as Material for MkDocs, +which means you can override all templates used for the blog by using +[theme extension] as usual. + +The following templates are added by the [built-in blog plugin]: + +- [`blog.html`][blog.html] – Template for blog, archive and category index +- [`blog-post.html`][blog-post.html] – Template for blog post + + [theme extension]: ../customization.md#extending-the-theme + + [blog.html]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/blog.html + [blog-post.html]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/blog-post.html diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-navigation.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-navigation.md new file mode 100644 index 0000000..ff8bf55 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-navigation.md @@ -0,0 +1,649 @@ +# Setting up navigation + +A clear and concise navigation structure is an important aspect of good project +documentation. Material for MkDocs provides a multitude of options to configure +the behavior of navigational elements, including [tabs] and [sections], and one +of its flagship features: [instant loading]. + + [tabs]: #navigation-tabs + [sections]: #navigation-sections + [instant loading]: #instant-loading + +Additional navigation can be configured [in the footer] as well as with the +[tags plugin]. The [blog plugin] also sets up additional navigation. + +[in the footer]: setting-up-the-footer.md#navigation +[tags plugin]: ../plugins/tags.md +[blog plugin]: ../plugins/blog.md + +## Configuration + +### Instant loading + +<!-- md:version 5.0.0 --> +<!-- md:feature --> + +When instant loading is enabled, clicks on all internal links will be +intercepted and dispatched via [XHR] without fully reloading the page. Add +the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.instant +``` + +The resulting page is parsed and injected and all event handlers and components +are rebound automatically, i.e., __Material for MkDocs now behaves like a Single +Page Application__. Now, the search index survives navigation, which is +especially useful for large documentation sites. + +!!! info "The [`site_url`][mkdocs.site_url] setting must be set" + + Note that you must set [`site_url`][mkdocs.site_url] when using instant + navigation, as instant navigation relies on the generated `sitemap.xml` + which will be empty if this setting is omitted. Example: + + ``` yaml + site_url: https://example.com + ``` + + [XHR]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest + +#### Instant prefetching + +<!-- md:version 9.7.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +Instant prefetching is a new experimental feature that will start to fetch a +page once the user hovers over a link. This will reduce the perceived loading +time for the user, especially on slow connections, as the page will be available +immediately upon navigation. Enable it with: + +``` yaml +theme: + features: + - navigation.instant + - navigation.instant.prefetch +``` + +#### Progress indicator + +<!-- md:version 9.4.3 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +In order to provide a better user experience on slow connections when using +instant navigation, a progress indicator can be enabled. It will be shown at +the top of the page and will be hidden once the page has fully loaded. You can +enable it in `mkdocs.yml` with: + +``` yaml +theme: + features: + - navigation.instant + - navigation.instant.progress +``` + +The progress indicator will only show if the page hasn't finished loading after +400ms, so that fast connections will never show it for a better instant +experience. + +### Instant previews + +<!-- md:version 9.7.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +Instant previews are a brand new feature that allow the user to preview another +site of your documentation without navigating to it. They can be very helpful to +keep the user in context. Instant previews can be enabled on any header link +with the `data-preview` attribute: + +```` markdown title="Link with instant preview" +``` markdown +[Attribute Lists](#){ data-preview } +``` +```` + +<div class="result" markdown> + +[Attribute Lists](extensions/python-markdown.md#attribute-lists){ data-preview } + +</div> + +!!! info "Limitations" + + Instant previews are still an experimental feature and currently limited to + headerlinks. This means, you can use them on any internal link that points + to a header on another page, but not other elements with `id` attributes. + After we have gathered enough feedback, we will consider extending this + feature to other, and possibly arbitrary elements. + +#### Automatic previews + +<!-- md:version 9.7.0 --> +<!-- md:extension --> +<!-- md:flag experimental --> + +The recommended way to work with instant previews is to use the Markdown +extension that is included with Material for MkDocs, as it allows you to enable +instant previews on a per-page or per-section level for your documentation: + +``` yaml +markdown_extensions: + - material.extensions.preview: + configurations: + - targets: + include: + - changelog/index.md + - customization.md + - insiders/changelog/* + - setup/extensions/* +``` + +The above configuration is what we use for our documentation. We've enabled +instant previews for our changelogs, customization guide, and Insiders sections, +as well as for all Markdown extensions that we support. + +!!! info "Full configuration example" + + ``` yaml + markdown_extensions: + - material.extensions.preview: + configurations: + - sources: # (1)! + include: + - ... + exclude: + - ... + targets: # (2)! + include: + - ... + exclude: + - ... + ``` + + 1. Sources specify the pages _on_ which instant previews should be enabled. + If this setting is omitted, instant previews will be enabled on all + pages. You can use patterns to include or exclude pages. Exclusion is + evaluated on top of inclusion, so if a page is matched by both, it will + be excluded. + + Note that you can define multiple items under the `configurations` + setting, which allows to precisely control where instant previews are + shown. + + 2. Targets specify the pages _to_ which instant previews should be enabled. + This is the recommended way to enable instant previews. +--- + +Instant previews can also be enabled globally by adding the following lines to +`mkdocs.yml`, which will enable instant previews for all header links, +alleviating the need to add data attributes: + +``` yaml +theme: + features: + - navigation.instant.preview +``` + +!!! info "The [`site_url`][mkdocs.site_url] setting must be set" + + Note that you must set [`site_url`][mkdocs.site_url] when using instant + previews, as instant previews rely on the generated `sitemap.xml` + which will be empty if this setting is omitted. Example: + + ``` yaml + site_url: https://example.com + ``` + +### Anchor tracking + +<!-- md:version 8.0.0 --> +<!-- md:feature --> + +When anchor tracking is enabled, the URL in the address bar is automatically +updated with the active anchor as highlighted in the table of contents. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.tracking +``` + +### Navigation tabs + +<!-- md:version 1.1.0 --> +<!-- md:feature --> + +When tabs are enabled, top-level sections are rendered in a menu layer below +the header for viewports above `1220px`, but remain as-is on mobile.[^1] Add +the following lines to `mkdocs.yml`: + + [^1]: + Prior to <!-- md:version 6.2.0 -->, navigation tabs had a slightly different + behavior. All top-level pages (i.e. all top-level entries directly + referring to a `*.md` file) defined inside the `nav` entry of `mkdocs.yml` + were grouped under the first tab which received the title of the first page. + This made it impossible to include a top-level page (or external link) as a + tab item, as was reported in #1884 and #2072. From <!-- md:version 6.2.0 --> + on, navigation tabs include all top-level pages and sections. + +``` yaml +theme: + features: + - navigation.tabs +``` + +=== "With tabs" + + [![Navigation tabs enabled]][Navigation tabs enabled] + +=== "Without" + + [![Navigation tabs disabled]][Navigation tabs disabled] + + [Navigation tabs enabled]: ../assets/screenshots/navigation-tabs.png + [Navigation tabs disabled]: ../assets/screenshots/navigation.png + +#### Sticky navigation tabs + +<!-- md:version 7.3.0 --> +<!-- md:feature --> + +When sticky tabs are enabled, navigation tabs will lock below the header and +always remain visible when scrolling down. Just add the following two feature +flags to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.tabs + - navigation.tabs.sticky +``` + +=== "With sticky tabs" + + [![Sticky navigation tabs enabled]][Sticky navigation tabs enabled] + +=== "Without" + + [![Sticky navigation tabs disabled]][Sticky navigation tabs disabled] + + [Sticky navigation tabs enabled]: ../assets/screenshots/navigation-tabs-sticky.png + [Sticky navigation tabs disabled]: ../assets/screenshots/navigation-tabs-collapsed.png + +### Navigation sections + +<!-- md:version 6.2.0 --> +<!-- md:feature --> + +When sections are enabled, top-level sections are rendered as groups in the +sidebar for viewports above `1220px`, but remain as-is on mobile. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.sections +``` + +=== "With sections" + + [![Navigation sections enabled]][Navigation sections enabled] + +=== "Without" + + [![Navigation sections disabled]][Navigation sections disabled] + + [Navigation sections enabled]: ../assets/screenshots/navigation-sections.png + [Navigation sections disabled]: ../assets/screenshots/navigation.png + +Both feature flags, [`navigation.tabs`][tabs] and +[`navigation.sections`][sections], can be combined with each other. If both +feature flags are enabled, sections are rendered for level 2 navigation items. + +### Navigation expansion + +<!-- md:version 6.2.0 --> +<!-- md:feature --> + +When expansion is enabled, the left sidebar will expand all collapsible +subsections by default, so the user doesn't have to open subsections manually. +Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.expand +``` + +=== "With expansion" + + [![Navigation expansion enabled]][Navigation expansion enabled] + +=== "Without" + + [![Navigation expansion disabled]][Navigation expansion disabled] + + [Navigation expansion enabled]: ../assets/screenshots/navigation-expand.png + [Navigation expansion disabled]: ../assets/screenshots/navigation.png + +### Navigation path <small>Breadcrumbs</small> { id=navigation-path } + +<!-- md:version 9.7.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +When navigation paths are activated, a breadcrumb navigation is rendered above +the title of each page, which might make orientation easier for users visiting your +documentation on devices with smaller screens. Add the following lines to +`mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.path +``` + +=== "With navigation path" + + [![Navigation path enabled]][Navigation path enabled] + +=== "Without" + + [![Navigation path disabled]][Navigation path disabled] + + [Navigation path enabled]: ../assets/screenshots/navigation-path-on.png + [Navigation path disabled]: ../assets/screenshots/navigation-path-off.png + +### Navigation pruning + +<!-- md:version 9.2.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +When pruning is enabled, only the visible navigation items are included in the +rendered HTML, __reducing the size of the built site by 33% or more__. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.prune # (1)! +``` + +1. This feature flag is not compatible with + [`navigation.expand`][navigation.expand], as navigation expansion requires + the complete navigation structure. + +This feature flag is especially useful for documentation sites with 100+ or even +1,000+ of pages, as the navigation makes up a significant fraction of the HTML. +Navigation pruning will replace all expandable sections with links to the first +page in that section (or the section index page). + + [navigation.expand]: #navigation-expansion + +### Section index pages + +<!-- md:version 7.3.0 --> +<!-- md:feature --> + +When section index pages are enabled, documents can be directly attached to +sections, which is particularly useful for providing overview pages. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.indexes # (1)! +``` + +1. This feature flag is not compatible with [`toc.integrate`][toc.integrate], + as sections cannot host the table of contents due to missing space. + +=== "With section index pages" + + [![Section index pages enabled]][Section index pages enabled] + +=== "Without" + + [![Section index pages disabled]][Section index pages disabled] + +In order to link a page to a section, create a new document with the name +`index.md` in the respective folder, and add it to the beginning of your +navigation section: + +``` yaml +nav: + - Section: + - section/index.md # (1)! + - Page 1: section/page-1.md + ... + - Page n: section/page-n.md +``` + +1. MkDocs also considers files called `README.md` as [index pages]. + + [Section index pages enabled]: ../assets/screenshots/navigation-index-on.png + [Section index pages disabled]: ../assets/screenshots/navigation-index-off.png + [toc.integrate]: #navigation-integration + [index pages]: https://www.mkdocs.org/user-guide/writing-your-docs/#index-pages + +### Table of contents + +#### Anchor following + +<!-- md:version 8.5.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +When anchor following for the [table of contents] is enabled, the sidebar is +automatically scrolled so that the active anchor is always visible. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - toc.follow +``` + +#### Navigation integration + +<!-- md:version 6.2.0 --> +<!-- md:feature --> + +When navigation integration for the [table of contents] is enabled, it is always +rendered as part of the navigation sidebar on the left. Add the following lines +to `mkdocs.yml`: + +``` yaml +theme: + features: + - toc.integrate # (1)! +``` + +1. This feature flag is not compatible with + [`navigation.indexes`][navigation.indexes], as sections cannot host the + table of contents due to missing space. + +=== "With navigation integration" + + [![Navigation integration enabled]][Navigation integration enabled] + +=== "Without" + + [![Navigation integration disabled]][Navigation integration disabled] + + [table of contents]: extensions/python-markdown.md#table-of-contents + [Navigation integration enabled]: ../assets/screenshots/toc-integrate.png + [Navigation integration disabled]: ../assets/screenshots/navigation-tabs.png + [navigation.indexes]: #section-index-pages + +### Back-to-top button + +<!-- md:version 7.1.0 --> +<!-- md:feature --> + +A back-to-top button can be shown when the user, after scrolling down, starts +to scroll up again. It's rendered centered and just below the header. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.top +``` + +## Usage + +### Hiding the sidebars + +<!-- md:version 6.2.0 --> +<!-- md:flag metadata --> + +The navigation and/or table of contents sidebars can be hidden for a document +with the front matter `hide` property. Add the following lines at the top of a +Markdown file: + +``` yaml +--- +hide: + - navigation + - toc +--- + +# Page title +... +``` + +=== "Hide navigation" + + [![Hide navigation enabled]][Hide navigation enabled] + +=== "Hide table of contents" + + [![Hide table of contents enabled]][Hide table of contents enabled] + +=== "Hide both" + + [![Hide both enabled]][Hide both enabled] + + [Hide navigation enabled]: ../assets/screenshots/hide-navigation.png + [Hide table of contents enabled]: ../assets/screenshots/hide-toc.png + [Hide both enabled]: ../assets/screenshots/hide-navigation-toc.png + +### Hiding the navigation path + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> + +While the [navigation path] is rendered above the main headline, sometimes, it +might be desirable to hide it for a specific page, which can be achieved with +the front matter `hide` property: + +``` yaml +--- +hide: + - path +--- + +# Page title +... +``` + + [navigation path]: #navigation-path + +## Customization + +### Keyboard shortcuts + +Material for MkDocs includes several keyboard shortcuts that make it possible +to navigate your project documentation via keyboard. There are two modes: + +<!-- md:option mode:search --> + +: This mode is active when the _search is focused_. It provides several key + bindings to make search accessible and navigable via keyboard: + + * ++arrow-down++ , ++arrow-up++ : select next / previous result + * ++esc++ , ++tab++ : close search dialog + * ++enter++ : follow selected result + +<!-- md:option mode:global --> + +: This mode is active when _search is not focussed_ and when there's no other + focussed element that is susceptible to keyboard input. The following keys + are bound: + + * ++f++ , ++s++ , ++slash++ : open search dialog + * ++p++ , ++comma++ : go to previous page + * ++n++ , ++period++ : go to next page + +Let's say you want to bind some action to the ++x++ key. By using [additional +JavaScript], you can subscribe to the `keyboard$` observable and attach +your custom event listener: + +=== ":octicons-file-code-16: `docs/javascripts/shortcuts.js`" + + ``` js + keyboard$.subscribe(function(key) { + if (key.mode === "global" && key.type === "x") { + /* Add custom keyboard handler here */ + key.claim() // (1)! + } + }) + ``` + + 1. The call to `key.claim()` will execute `preventDefault()` on the + underlying event, so the keypress will not propagate further and + touch other event listeners. + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - javascripts/shortcuts.js + ``` + + [additional JavaScript]: ../customization.md#additional-javascript + +### Content area width + +The width of the content area is set so the length of each line doesn't exceed +80-100 characters, depending on the width of the characters. While this +is a reasonable default, as longer lines tend to be harder to read, it may be +desirable to increase the overall width of the content area, or even make it +stretch to the entire available space. + +This can easily be achieved with an [additional style sheet] and a few lines +of CSS: + +=== ":octicons-file-code-16: `docs/stylesheets/extra.css`" + + ``` css + .md-grid { + max-width: 1440px; /* (1)! */ + } + ``` + + 1. If you want the content area to always stretch to the available screen + space, reset `max-width` with the following CSS: + + ``` css + .md-grid { + max-width: initial; + } + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_css: + - stylesheets/extra.css + ``` + + [additional style sheet]: ../customization.md#additional-css diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-site-analytics.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-site-analytics.md new file mode 100644 index 0000000..5a8c523 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-site-analytics.md @@ -0,0 +1,324 @@ +# Setting up site analytics + +As with any other service offered on the web, understanding how your project +documentation is actually used can be an essential success factor. Material for +MkDocs natively integrates with [Google Analytics] and offers a customizable +[cookie consent] and a [feedback widget]. + + [Google Analytics]: https://developers.google.com/analytics + [cookie consent]: ensuring-data-privacy.md#cookie-consent + [feedback widget]: #was-this-page-helpful + +## Configuration + +### Google Analytics + +<!-- md:version 7.1.8 --> +<!-- md:default none --> + +Material for MkDocs integrates natively with Google Analytics 4[^1]. If you +already set up Google Analytics and have a property, enable it by adding the +following lines to `mkdocs.yml`: + + [^1]: + Prior to Material for MkDocs 9.2.0, Universal Analytics was supported as + well. However, since Universal Analytics has been sunset, this integration + was removed in 9.2.0. + +``` yaml +extra: + analytics: + provider: google + property: G-XXXXXXXXXX +``` + +??? question "How to measure site search usage?" + + Besides page views and events, [site search] can be tracked to better + understand how people use your documentation and what they expect to find. + In order to enable site search tracking, the following steps are required: + + 1. Go to your Google Analytics __admin settings__ + 2. Select the property for the respective tracking code + 3. Select the __data streams__ tab and click the corresponding URL + 4. Click the gear icon within the __enhanced measurement__ section + 5. Ensure that __site search__ is enabled + + [site search]: setting-up-site-search.md + +### Was this page helpful? + +<!-- md:version 8.4.0 --> +<!-- md:default none --> + +A simple [feedback widget] can be included at the bottom of each page, +encouraging users to give instant feedback whether a page was helpful or not. +Add the following lines to `mkdocs.yml`: + +``` yaml +extra: + analytics: # (1)! + feedback: + title: Was this page helpful? + ratings: + - icon: material/emoticon-happy-outline + name: This page was helpful + data: 1 + note: >- + Thanks for your feedback! + - icon: material/emoticon-sad-outline + name: This page could be improved + data: 0 + note: >- # (2)! + Thanks for your feedback! Help us improve this page by + using our <a href="..." target="_blank" rel="noopener">feedback form</a>. +``` + +1. This feature is natively integrated with [Google Analytics][analytics], + which is why `provider` and `property` are also required. However, it's also + possible to provide a [custom feedback integration]. + +2. You can add arbitrary HTML tags to the note which is shown after the user + submitted the feedback, e.g. to link to a feedback form. + +Both properties, `title` and `ratings`, are required. Note that it's allowed to +define more than two ratings, e.g. to implement a 1-5 star rating. Since the +feedback widget sends data to a third-party service, it is, of course, natively +integrated with the [cookie consent] feature[^2]. + + [^2]: + If the user doesn't accept the `analytics` cookie, the feedback widget is + not shown. + +??? question "How to visualize the collected feedback ratings?" + + To visualize feedback ratings you'll need to create a custom report with + [Google Analytics] that will quickly show you the worst- and best-rated + pages of your project documentation. + + 1. Go to your Google Analytics __dashboard__ + + 2. Go to the __Admin__ page on the left hand menu (at the bottom), then select + __custom definitions__ on the __Data display__ card + + 3. Click the __custom metrics__ tab and then __create custom metrics__, + enter the following values: + + * Metric name: Page helpful + * Description: Was this page helpful? + * Event parameter: `data` + * Unit of measurement: Standard + + 4. Go to the __explore__ page on the left hand menu, create a new + __blank exploration__ + + 5. Configure the report as follows: + + * Dimensions: Add `Event name` and `Page location` + * Metrics: Add `Event count` and `Page helpful` + (the custom metric created in step 3) + * Rows: `Page location` + * Values: Drag in both `Event count` and `Page helpful` + * Filters: Add a new filter for + `Event name / exactly matches / feedback` + + !!! warning "Delay in data availability" + + The report may take 24 hours or longer to begin displaying data + + Now, after you've saved the report and collected some feedback ratings, + you'll have a list of all pages with the total number of ratings, and an + average rating per page. This should help you identify pages that need to + be improved: + + !!! danger "Google Analytics 4 does not support average values" + + To our knowledge, Google Analytics 4 has currently no feature that + allows to define a custom calculated metric to compute the average + rating of a page. See #5740. + + [![feedback report]][feedback report] + +The following properties are available for each rating: + +<!-- md:option analytics.feedback.ratings.icon --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must point to a valid icon path referencing [any icon bundled + with the theme][custom icons], or the build will not succeed. Some popular + combinations: + + * :material-emoticon-happy-outline: + :material-emoticon-sad-outline: – `material/emoticon-happy-outline` + `material/emoticon-sad-outline` + * :material-thumb-up-outline: + :material-thumb-down-outline: – `material/thumb-up-outline` + `material/thumb-down-outline` + * :material-heart: + :material-heart-broken: – `material/heart` + `material/heart-broken` + +<!-- md:option analytics.feedback.ratings.name --> + +: <!-- md:default none --> <!-- md:flag required --> + The value of this property is shown on user interaction (i.e. keyboard focus + or mouse hover), explaining the meaning of the rating behind the icon. + +<!-- md:option analytics.feedback.ratings.data --> + +: <!-- md:default none --> <!-- md:flag required --> + The value of this property is sent as a data value with the custom event + that is transmitted to Google Analytics[^3] (or any custom integration). + + [^3]: + Note that for Google Analytics, the data value must be an integer. + +<!-- md:option analytics.feedback.ratings.note --> + +: <!-- md:default none --> <!-- md:flag required --> + The value of this property is shown after the user selected the rating. + It may contain arbitrary HTML tags, which is especially useful to ask the + user to provide more detailed feedback for the current page through a form. + It's also possible to pre-fill forms with the URL and title of the current + page by using the following placeholders: + + - `{url}` – Page URL + - `{title}` – Page title + + ``` + https://github.com/.../issues/new/?title=[Feedback]+{title}+-+{url} + ``` + + In this example, when clicking the link, the user is redirected to the "new + issue" form of your repository, with a pre-filled title including the path + of the current document, e.g.: + + ``` + [Feedback] Setting up site analytics – /setup/setting-up-site-analytics/ + ``` + + An alternative to GitHub issues is [Google Forms]. + + [feedback widget]: #feedback + [analytics]: #google-analytics + [feedback report]: ../assets/screenshots/feedback-report.png + [custom feedback integration]: #custom-site-feedback + [custom icons]: https://github.com/squidfunk/mkdocs-material/tree/master/material/templates/.icons + [Google Forms]: https://www.google.com/forms/about/ + +## Usage + +### Hiding the feedback widget + +The [feedback widget] can be hidden for a document with the front matter `hide` +property. Add the following lines at the top of a Markdown file: + +``` yaml +--- +hide: + - feedback +--- + +# Page title +... +``` + +## Customization + +### Custom site analytics + +In order to integrate another analytics service provider offering a +JavaScript-based tracking solution, just follow the guide on [theme extension] +and create a new partial in the `overrides` folder. The name of the partial is +used to configure the custom integration via `mkdocs.yml`: + +=== ":octicons-file-code-16: `overrides/partials/integrations/analytics/custom.html`" + + ``` html + <script> + /* Add custom analytics integration here, e.g. */ + var property = "{{ config.extra.analytics.property }}" // (1)! + + /* Wait for page to load and application to mount */ + document.addEventListener("DOMContentLoaded", function() { + location$.subscribe(function(url) { + /* Add custom page event tracking here */ // (2)! + }) + }) + </script> + ``` + + 1. As an example, this variable receives the value set in `mkdocs.yml`, + which is `"foobar"` for `property`. + 2. If you're using [instant loading], you can use the `location$` + observable to listen for navigation events, which always emits the + current `URL`. + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra: + analytics: + provider: custom + property: foobar # (1)! + ``` + + 1. You can add arbitrary key-value combinations to configure your + custom integration. This is especially useful if you're sharing the + custom integration across multiple repositories. + + [theme extension]: ../customization.md#extending-the-theme + [instant loading]: setting-up-navigation.md#instant-loading + +### Custom site feedback + +A custom feedback widget integration just needs to process the events that are +generated by users interacting with the feedback widget with the help of some +[additional JavaScript]: + +=== ":octicons-file-code-16: `docs/javascripts/feedback.js`" + + ``` js + document$.subscribe(function() { + var feedback = document.forms.feedback + if (typeof feedback === "undefined") return + + feedback.hidden = false // (1)! + + feedback.addEventListener("submit", function(ev) { + ev.preventDefault() + + var page = document.location.pathname // (2)! + var data = ev.submitter.getAttribute("data-md-value") + + console.log(page, data) // (3)! + + feedback.firstElementChild.disabled = true // (4)! + + var note = feedback.querySelector( + ".md-feedback__note [data-md-value='" + data + "']" + ) + if (note) + note.hidden = false // (5)! + }) + } + ``` + + 1. The feedback widget is hidden by default so that it does not appear when + people have JavaScript turned off. So, it needs to be turned on here. + + 2. Retrieve page and feedback value. + + 3. Replace this with the code that sends the data off to your analytics + provider. + + 4. Disable the form after submission. + + 5. Show the configured notes. Which one is shown depends on the user + feedback. + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + extra_javascript: + - javascripts/feedback.js + ``` + +  +{ #feedback style="margin: 0; height: 0" } + + [additional JavaScript]: ../customization.md#additional-javascript diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-site-search.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-site-search.md new file mode 100644 index 0000000..605c9c9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-site-search.md @@ -0,0 +1,229 @@ +--- +search: + boost: 1.05 +--- + +# Setting up site search + +Material for MkDocs provides an excellent client-side search implementation, +omitting the need for the integration of third-party services, which might +not be compliant with privacy regulations. Moreover, search even works +[offline], allowing users to download your documentation. + + [offline]: building-for-offline-usage.md + +## Configuration + +### Built-in search plugin + +<!-- md:version 0.1.0 --> +<!-- md:plugin --> + +The built-in search plugin integrates seamlessly with Material for MkDocs, +adding multilingual client-side search with [lunr] and [lunr-languages]. It's +enabled by default, but must be re-added to `mkdocs.yml` when other plugins +are used: + +``` yaml +plugins: + - search +``` + +For a list of all settings, please consult the [plugin documentation]. + + [plugin documentation]: ../plugins/search.md + + [lunr]: https://lunrjs.com + [lunr-languages]: https://github.com/MihaiValentin/lunr-languages + +### Search suggestions + +<!-- md:version 7.2.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +When search suggestions are enabled, the search will display the likeliest +completion for the last word which can be accepted with the ++arrow-right++ key. +Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - search.suggest +``` + +Searching for [:octicons-search-24: search su][Search suggestions example] +yields ^^search suggestions^^ as a suggestion. + + [Search suggestions example]: ?q=search+su + +### Search highlighting + +<!-- md:version 7.2.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +When search highlighting is enabled and a user clicks on a search result, +Material for MkDocs will highlight all occurrences after following the link. +Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - search.highlight +``` + +Searching for [:octicons-search-24: code blocks][Search highlighting example] +highlights all occurrences of both terms. + + [Search highlighting example]: ../reference/code-blocks.md?h=code+blocks + +### Search sharing + +<!-- md:version 7.2.0 --> +<!-- md:feature --> + +When search sharing is activated, a :material-share-variant: share button is +rendered next to the reset button, which allows to deep link to the current +search query and result. Add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - search.share +``` + +When a user clicks the share button, the URL is automatically copied to the +clipboard. + +## Usage + +### Search boosting + +<!-- md:version 8.3.0 --> +<!-- md:flag metadata --> + +Pages can be boosted in search with the front matter `search.boost` property, +which will make them rank higher. Add the following lines at the top of a +Markdown file: + +=== ":material-arrow-up-circle: Rank up" + + ``` yaml + --- + search: + boost: 2 # (1)! + --- + + # Page title + ... + ``` + + 1. :woman_in_lotus_position: When boosting pages, be gentle and start with + __low values__. + +=== ":material-arrow-down-circle: Rank down" + + ``` yaml + --- + search: + boost: 0.5 + --- + + # Page title + ... + ``` + +### Search exclusion + +<!-- md:version 9.0.0 --> +<!-- md:flag metadata --> +<!-- md:flag experimental --> + +Pages can be excluded from search with the front matter `search.exclude` +property, removing them from the index. Add the following lines at the top of a +Markdown file: + +``` yaml +--- +search: + exclude: true +--- + +# Page title +... +``` + +#### Excluding sections + +When [Attribute Lists] is enabled, specific sections of pages can be excluded +from search by adding the `data-search-exclude` pragma after a Markdown +heading: + +=== ":octicons-file-code-16: `docs/page.md`" + + ``` markdown + # Page title + + ## Section 1 + + The content of this section is included + + ## Section 2 { data-search-exclude } + + The content of this section is excluded + ``` + +=== ":octicons-codescan-16: `search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"", + "title":"Document title" + }, + { + "location":"page/#section-1", + "text":"<p>The content of this section is included</p>", + "title":"Section 1" + } + ] + } + ``` + + [Attribute Lists]: extensions/python-markdown.md#attribute-lists + +#### Excluding blocks + +When [Attribute Lists] is enabled, specific sections of pages can be excluded +from search by adding the `data-search-exclude` pragma after a Markdown +inline- or block-level element: + +=== ":octicons-file-code-16: `docs/page.md`" + + ``` markdown + # Page title + + The content of this block is included + + The content of this block is excluded + { data-search-exclude } + ``` + +=== ":octicons-codescan-16: `search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"<p>The content of this block is included</p>", + "title":"Document title" + } + ] + } + ``` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-social-cards.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-social-cards.md new file mode 100644 index 0000000..af270e1 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-social-cards.md @@ -0,0 +1,636 @@ +# Setting up social cards + +Material for MkDocs can automatically create beautiful social cards for your +documentation, which appear as link previews on social media platforms. You +can select from several [pre-designed layouts][default layouts] or create +[custom layouts] to match your unique style and branding. + +--- + +:fontawesome-brands-youtube:{ style="color: #EE0F0F" } +__[How to build custom social cards]__ by @james-willett – :octicons-clock-24: +24m – Learn how to create entirely custom social cards perfectly matching your +branding for each page automatically! + + [How to build custom social cards]: https://www.youtube.com/watch?v=4OjnOc6ftJ8 + +<figure markdown> + +[![Layout default variant]][Layout default variant] + + <figcaption markdown> + +Social card of our [formatting] reference + + </figcaption> +</figure> + + [default layouts]: ../plugins/social.md#layouts + [custom layouts]: #customization + [formatting]: ../reference/formatting.md + [Layout default variant]: ../assets/screenshots/social-cards-variant.png + +## Configuration + +### Built-in social plugin + +<!-- md:version 8.5.0 --> +<!-- md:plugin --> +<!-- md:flag experimental --> +<!-- md:demo create-social-cards --> + +The built-in social plugin automatically generate a custom preview image for +each page. Install all [dependencies for image processing] and add the +following lines to `mkdocs.yml`: + +``` yaml +plugins: + - social +``` + +For a list of all settings, please consult the [plugin documentation]. + + [plugin documentation]: ../plugins/social.md + +!!! info "The [`site_url`][site_url] setting must be set" + + Note that you must set [`site_url`][site_url] when using the social plugin, + or the generated cards will not be correctly linked. Social media services + like X and Facebook demand that social previews point to an absolute + URL, which the plugin can only compute when [`site_url`][site_url] is set. + Example: + + ``` yaml + site_url: https://example.com + ``` + + [dependencies for image processing]: ../plugins/requirements/image-processing.md + [site_url]: https://www.mkdocs.org/user-guide/configuration/#site_url + +## Usage + +If you want to adjust the title or set a custom description for the social card, +you can set the front matter [`title`][Changing the title] and +[`description`][Changing the description] properties, which take precedence over +the defaults, or use: + +- [`cards_layout_options.title`](../plugins/social.md#option.title) +- [`cards_layout_options.description`](../plugins/social.md#option.description) + + [Changing the title]: ../reference/index.md#setting-the-page-title + [Changing the description]: ../reference/index.md#setting-the-page-description + +### Choosing a font + +Some fonts do not contain CJK characters, like for example the +[default font, `Roboto`][font]. In case your `site_name`, `site_description`, or +page title contain CJK characters, choose another font from [Google Fonts] which +comes with CJK characters, e.g. one from the `Noto Sans` font family: + +=== "Chinese (Simplified)" + + ``` yaml + plugins: + - social: + cards_layout_options: + font_family: Noto Sans SC + ``` + +=== "Chinese (Traditional)" + + ``` yaml + plugins: + - social: + cards_layout_options: + font_family: Noto Sans TC + ``` + +=== "Japanese" + + ``` yaml + plugins: + - social: + cards_layout_options: + font_family: Noto Sans JP + ``` + +=== "Korean" + + ``` yaml + plugins: + - social: + cards_layout_options: + font_family: Noto Sans KR + ``` + + [font]: changing-the-fonts.md#regular-font + +### Changing the layout + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:flag experimental --> + +If you want to use a different layout for a single page (e.g. your landing +page), you can use the `social` front matter property together with the +[`cards_layout`](../plugins/social.md#meta.social.cards_layout) key, exactly as +in `mkdocs.yml`: + +``` yaml +--- +social: + cards_layout: custom +--- + +# Page title +... +``` + +You can apply those changes for entire subtrees of your documentation, e.g., +to generate different social cards for your blog and API reference, by using +the [built-in meta plugin]. + + [built-in meta plugin]: ../plugins/meta.md + +### Parametrizing the layout + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:flag experimental --> + +Besides changing the entire layout, you can override all options that a layout +exposes. This means you can parametrize social cards with custom front matter +properties, such as `tags`, `date`, `author` or anything you can think of. +Simply define [`cards_layout_options`](../plugins/social.md#meta.social.cards_layout_options): + +``` yaml +--- +social: + cards_layout_options: + background_color: blue # Change background color + background_image: null # Remove background image +--- + +# Page title +... +``` + +You can apply those changes for entire subtrees of your documentation, e.g., +to generate different social cards for your blog and API reference, by using +the [built-in meta plugin]. + +### Disabling social cards + +<!-- md:version 9.7.0 --> +<!-- md:flag metadata --> +<!-- md:flag experimental --> + +If you wish to disable social cards for a page, simply add the following to the +front matter of the Markdown document: + +``` yaml +--- +social: + cards: false +--- + +# Page title +... +``` + +## Customization + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +<div class="mdx-social"> + <div class="mdx-social__layer"> + <div class="mdx-social__image"> + <span class="mdx-social__label">Layer 0</span> + <img src="../../assets/screenshots/social-cards-layer-0.png" /> + </div> + </div> + <div class="mdx-social__layer"> + <div class="mdx-social__image"> + <span class="mdx-social__label">Layer 1</span> + <img src="../../assets/screenshots/social-cards-layer-1.png" /> + </div> + </div> + <div class="mdx-social__layer"> + <div class="mdx-social__image"> + <span class="mdx-social__label">Layer 2</span> + <img src="../../assets/screenshots/social-cards-layer-2.png" /> + </div> + </div> + <div class="mdx-social__layer"> + <div class="mdx-social__image"> + <span class="mdx-social__label">Layer 3</span> + <img src="../../assets/screenshots/social-cards-layer-3.png" /> + </div> + </div> + <div class="mdx-social__layer"> + <div class="mdx-social__image"> + <span class="mdx-social__label">Layer 4</span> + <img src="../../assets/screenshots/social-cards-layer-4.png" /> + </div> + </div> + <div class="mdx-social__layer"> + <div class="mdx-social__image"> + <span class="mdx-social__label">Layer 5</span> + <img src="../../assets/screenshots/social-cards-layer-5.png" /> + </div> + </div> +</div> + +Social cards are composed of layers, analogous to how they are represented in +graphic design software such as Adobe Photoshop. As many layers are common +across the cards generated for each page (e.g., backgrounds or logos), the +built-in social plugin can automatically deduplicate layers and render them +just once, substantially accelerating card generation. The generated cards are +cached to ensure they are only regenerated when their contents change. + +Layouts are written in YAML syntax. Before starting to create a custom layout, +it is a good idea to [study the pre-designed layouts], in order to get a better +understanding of how they work. Then, create a new layout and reference it in +`mkdocs.yml`: + +=== ":octicons-file-code-16: `layouts/custom.yml`" + + ``` yaml + size: { width: 1200, height: 630 } + layers: [] + ``` + +=== ":octicons-file-code-16: `mkdocs.yml`" + + ``` yaml + plugins: + - social: + cards_layout_dir: layouts + cards_layout: custom + debug: true + ``` + +Note that the `.yml` file extension should be omitted. Next, run `mkdocs serve`, +and see how the `.cache` directory is populated with the generated cards. Open +any card in your editor, so you can see your changes immediately. Since we +haven't defined any layers, the cards are transparent. + +The following sections explain how to create custom layouts. + + [built-in social plugin]: ../plugins/social.md + [Google Fonts]: https://fonts.google.com/ + [Jinja templates]: https://jinja.palletsprojects.com/en/3.1.x/ + [study the pre-designed layouts]: https://github.com/squidfunk/mkdocs-material/tree/master/src/plugins/social/layouts + +### Size and offset + +Each layer has an associated size and offset, which is defined in pixels. The +`size` is defined by a `width` and `height` property, and the `offset` by `x` +and `y` properties: + +``` yaml +size: { width: 1200, height: 630 } +layers: + - size: { width: 1200, height: 630 } + offset: { x: 0, y: 0 } +``` + +If the `size` is omitted, it defaults to the size of the layout. If the `offset` +is omitted, it defaults to the top left corner, which is the default `origin`. +Saving the layout and reloading renders: + +![Layer size] + +The layer outline and grid are visible because we enabled [`debug`][debug] +mode in `mkdocs.yml`. The top left shows the layer index and offset, which is +useful for alignment and composition. + + [Layer size]: ../assets/screenshots/social-cards-layer-size.png + [debug]: ../plugins/social.md#debugging + +#### Origin + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +The `origin` for the `x` and `y` values can be changed, so that the layer is +aligned to one of the edges or corners of the layout, e.g., to the bottom right +corner of the layout: + +``` yaml hl_lines="5" +size: { width: 1200, height: 630 } +layers: + - size: { width: 1200, height: 630 } + offset: { x: 0, y: 0 } + origin: end bottom +``` + +The following table shows the supported values: + +<figure markdown> + +| Origin | | | +| -------------- | --------------- | ------------ | +| :material-arrow-top-left: `start top` | :material-arrow-up: `center top` | :material-arrow-top-right: `end top` | +| :material-arrow-left: `start center` | :material-circle-small: `center` | :material-arrow-right: `end center` | +| :material-arrow-bottom-left: `start bottom` | :material-arrow-down: `center bottom` | :material-arrow-bottom-right: `end bottom` | + + <figcaption> + Supported values for origin + </figcaption> +</figure> + +### Backgrounds + +Each layer can be assigned a background color and image. If both are given, the +color is rendered on top of the image, allowing for semi-transparent, tinted +backgrounds: + +=== "Background color" + + ``` yaml + size: { width: 1200, height: 630 } + layers: + - background: + color: "#4051b5" + ``` + + ![Layer background color] + +=== "Background image" + + ``` yaml + size: { width: 1200, height: 630 } + layers: + - background: + image: layouts/background.png + ``` + + ![Layer background image] + +=== "Background image, tinted" + + ``` yaml + size: { width: 1200, height: 630 } + layers: + - background: + image: layouts/background.png + color: "#4051b5ee" # (1)! + ``` + + 1. The color value can be set to a [CSS color keyword], or a 3, 4, 6 or 8 + letter HEX color code, allowing for semi-transparent layers. + + ![Layer background] + +Background images are automatically scaled to fit the layer while preserving +aspect-ratio. Notice how we omitted `size` and `offset`, because we want to +fill the entire area of the social card. + +[Layer background color]: ../assets/screenshots/social-cards-layer-background-color.png +[Layer background image]: ../assets/screenshots/social-cards-layer-background-image.png +[Layer background]: ../assets/screenshots/social-cards-layer-background.png + +### Typography + +Now, we can add dynamic typography that is sourced from Markdown files - this is +the actual raison d'être of the [built-in social plugin]. [Jinja templates] are +used to render a text string that is then added to the image: + +``` yaml +size: { width: 1200, height: 630 } +layers: + - size: { width: 832, height: 310 } + offset: { x: 62, y: 160 } + typography: + content: "{{ page.title }}" # (1)! + align: start + color: white + line: + amount: 3 + height: 1.25 + font: + family: Roboto + style: Bold +``` + +1. The following variables can be used in [Jinja templates]: + + - [`config.*`][config variable] + - [`page.*`][page variable] + - [`layout.*`][layout options] + + The author is free in defining `layout.*` options, which can be used to pass + arbitrary data to the layout from `mkdocs.yml`. + +This renders a text layer with the title of the page with a line height of 1.25, +and a maximum number of 3 lines. The plugin automatically computes the font size +from the line height, the number of lines, and font metrics like ascender and +descender.[^2] This renders: + + [^2]: + If the plugin would require the author to specify the font size and line + height manually, it would be impossible to guarantee that the text fits + into the layer. For this reason we implemented a declarative approach, + where the author specifies the desired line height and number of lines, and + the plugin computes the font size automatically. + +![Layer typography] + + [config variable]: https://www.mkdocs.org/dev-guide/themes/#config + [page variable]: https://www.mkdocs.org/dev-guide/themes/#page + [Layer typography]: ../assets/screenshots/social-cards-layer-typography.png + +#### Overflow + +If the text overflows the layer, there are two possible behaviors: either the +text is automatically truncated and shortened with an ellipsis, or the text is +automatically scaled down to fit the layer: + +``` { .markdown .no-copy } +# If we use a very long headline, we can see how the text will be truncated +``` + +=== ":octicons-ellipsis-16: Ellipsis" + + ![Layer typography ellipsis] + +=== ":material-arrow-collapse: Shrink" + + ![Layer typography shrink] + +While truncating with an ellipsis is the default, auto-shrinking can be enabled +by setting `overflow` to `shrink`: + +``` yaml hl_lines="7" +size: { width: 1200, height: 630 } +layers: + - size: { width: 832, height: 310 } + offset: { x: 62, y: 160 } + typography: + content: "{{ page.title }}" + overflow: shrink + align: start + color: white + line: + amount: 3 + height: 1.25 + font: + family: Roboto + style: Bold +``` + + [Layer typography ellipsis]: ../assets/screenshots/social-cards-layer-typography-ellipsis.png + [Layer typography shrink]: ../assets/screenshots/social-cards-layer-typography-shrink.png + +#### Alignment + +Text can be aligned to all corners and edges of the layer. For example, if we +want to align the text to the middle of the layer, we can set `align` to `start center`, which will render as: + +![Layer typography align] + + [Layer typography align]: ../assets/screenshots/social-cards-layer-typography-align.png + +The following table shows the supported values: + +<figure markdown> + +| Alignment | | | +| -------------- | --------------- | ------------ | +| :material-arrow-top-left: `start top` | :material-arrow-up: `center top` | :material-arrow-top-right: `end top` | +| :material-arrow-left: `start center` | :material-circle-small: `center` | :material-arrow-right: `end center` | +| :material-arrow-bottom-left: `start bottom` | :material-arrow-down: `center bottom` | :material-arrow-bottom-right: `end bottom` | + + <figcaption> + Supported values for text alignment + </figcaption> +</figure> + +#### Font + +The [built-in social plugin] integrates with [Google Fonts] and will +automatically download the font files for you. The `font` property accepts a +`family` and `style` property, where the `family` must be set to the name of the +font, and the `style` to one of the supported font styles. For example, setting +`family` to `Roboto` will automatically download the following files: + +``` { .sh .no-copy #example } +.cache/plugins/social/fonts +└─ Roboto/ + ├─ Black.ttf + ├─ Black Italic.ttf + ├─ Bold.ttf + ├─ Bold Italic.ttf + ├─ Italic.ttf + ├─ Light.ttf + ├─ Light Italic.ttf + ├─ Medium.ttf + ├─ Medium Italic.ttf + ├─ Regular.ttf + ├─ Thin.ttf + └─ Thin Italic.ttf +``` + +In that case, the author can use `Bold` or `Medium Italic` as the `style`. If +the font style specified in the layer is not part of the font family, the +font always falls back to `Regular` and prints a warning in [`debug`][debug] +mode, as `Regular` is included with all font families. + +### Icons + +Authors can leverage the full range of icons that are shipped with Material for +MkDocs, or even provide custom icons by using theme extension and going through +the process described in the guide on [additional icons]. Icons can even be +tinted by using the `color` property: + +``` yaml +size: { width: 1200, height: 630 } +layers: + - background: + color: "#4051b5" + - size: { width: 144, height: 144 } + offset: { x: 992, y: 64 } + icon: + value: material/cat + color: white +``` + +This will render the icon in the top right corner of the social card: + +![Layer icon] + +The possibilities are endless. For example, icons can be used to draw shapes +like circles: + +``` yaml +size: { width: 1200, height: 630 } +layers: + - background: + color: "#4051b5" + - size: { width: 2400, height: 2400 } + offset: { x: -1024, y: 64 } + icon: + value: material/circle + color: "#5c6bc0" + - size: { width: 1800, height: 1800 } + offset: { x: 512, y: -1024 } + icon: + value: material/circle + color: "#3949ab" +``` + +This will add two circles to the background: + +![Layer icon circles] + +### Tags + +The new [built-in social plugin] gives full flexibility of the meta tags that +are added to your site, which are necessary to instruct services like X +or Discord how to display your social card. All default layouts use the following +set of tags, which you can copy to your layout and adapt: + +``` yaml +definitions: + + - &page_title_with_site_name >- + {%- if not page.is_homepage -%} + {{ page.meta.get("title", page.title) }} - {{ config.site_name }} + {%- else -%} + {{ page.meta.get("title", page.title) }} + {%- endif -%} + + - &page_description >- + {{ page.meta.get("description", config.site_description) or "" }} + +tags: + + og:type: website + og:title: *page_title_with_site_name + og:description: *page_description + og:image: "{{ image.url }}" + og:image:type: "{{ image.type }}" + og:image:width: "{{ image.width }}" + og:image:height: "{{ image.height }}" + og:url: "{{ page.canonical_url }}" + + twitter:card: summary_large_image + twitter:title: *page_title_with_site_name + twitter:description: *page_description + twitter:image: "{{ image.url }}" +``` + +Note that this example makes use of [YAML anchors] to minify repetition. The + `definitions` property is solely intended for the definition on aliases that + can then be referenced with anchors. + + [YAML anchors]: https://support.atlassian.com/bitbucket-cloud/docs/yaml-anchors/ + +__Are you missing something? Please [open a discussion] and let us know!__ + + [additional icons]: ./changing-the-logo-and-icons.md#additional-icons + [Layer icon]: ../assets/screenshots/social-cards-layer-icon.png + [Layer icon circles]: ../assets/screenshots/social-cards-layer-icon-circles.png + [open a discussion]: https://github.com/squidfunk/mkdocs-material/discussions/new diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-tags.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-tags.md new file mode 100644 index 0000000..ce28e55 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-tags.md @@ -0,0 +1,310 @@ +# Setting up tags + +Material for MkDocs adds first-class support for categorizing pages with tags, +which adds the possibility to group related pages and make them discoverable +via search and a dedicated [tags index]. If your documentation is large, tags +can help to discover relevant information faster. + + [tags index]: #adding-a-tags-index + +## Configuration + +### Built-in tags plugin + +<!-- md:version 8.2.0 --> +<!-- md:plugin --> + +The built-in tags plugin adds the ability to categorize any page with tags +as part of the front matter of the page. In order to add support for tags, add +the following lines to `mkdocs.yml`: + +``` yaml +plugins: + - tags +``` + +For a list of all settings, please consult the [plugin documentation]. + + [plugin documentation]: ../plugins/tags.md + +### Tag icons and identifiers + +<!-- md:version 8.5.0 --> +<!-- md:flag experimental --> +<!-- md:example tags-with-icons --> + +Each tag can be associated with an icon, which is then rendered inside the tag. +Before assigning icons to tags, associate each tag with a unique identifier, +by adding the following to `mkdocs.yml`: + +``` yaml +extra: + tags: + <tag>: <identifier> # (1)! +``` + +1. The identifier can only include alphanumeric characters, as well as dashes + and underscores. For example, if you have a tag `Compatibility`, you can + set `compat` as an identifier: + + ``` yaml + extra: + tags: + Compatibility: compat + ``` + + Identifiers can be reused between tags. Tags which are not explicitly + associated will use the default tag icon which is :material-pound: + +Next, each identifier can be associated with an icon, even a [custom icon], by +adding the following lines to `mkdocs.yml` under the `theme.icon` configuration +setting: + +=== "Tag icon" + + ``` yaml + theme: + icon: + tag: + <identifier>: <icon> # (1)! + ``` + + 1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="tag" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +=== "Tag default icon" + + ``` yaml + theme: + icon: + tag: + default: <icon> + ``` + +??? example "Expand to inspect example" + + ``` yaml + theme: + icon: + tag: + html: fontawesome/brands/html5 + js: fontawesome/brands/js + css: fontawesome/brands/css3 + extra: + tags: + HTML5: html + JavaScript: js + CSS: css + ``` + + [custom icon]: changing-the-logo-and-icons.md#additional-icons + [icon search]: ../reference/icons-emojis.md#search + +## Usage + +### Adding tags + +<!-- md:version 8.2.0 --> +<!-- md:example tags --> + +When the [built-in tags plugin] is enabled, tags can be added for a document +with the front matter `tags` property. Add the following lines at the top of a +Markdown file: + +``` sh +--- +tags: + - HTML5 + - JavaScript + - CSS +--- + +... +``` + +The page will now render with those tags above the main headline and within the +search preview, which now allows to __find pages by tags__. + +??? question "How to set tags for an entire folder?" + + With the help of the [built-in meta plugin], you can ensure that tags are + set for an entire section and all nested pages, by creating a `.meta.yml` + file in the corresponding folder with the following content: + + ``` yaml + tags: + - HTML5 + - JavaScript + - CSS + ``` + + The tags set in `.meta.yml` are merged and deduplicated with the tags + defined for a page, which means you can define common tags in `.meta.yml` + and then add specific tags for each page. The tags in `.meta.yml` are + appended. + + [built-in tags plugin]: ../plugins/tags.md + [built-in meta plugin]: ../plugins/meta.md + +### Adding a tags index + +<!-- md:version 8.2.0 --> +<!-- md:example tags --> + +The [built-in tags plugin] allows to define a file to render a tags index, +which can be any page that is part of the `nav` section. To add a tags index, +create a page, e.g. `tags.md`: + +``` markdown +# Tags + +Following is a list of relevant tags: + +<!-- material/tags --> +``` + +The tags marker specifies the position of the tags index, i.e. it is +replaced with the actual tags index when the page is rendered. You can include +arbitrary content before and after the marker: + +[![Tags index][tags index enabled]][tags index enabled] + + [tags index enabled]: ../assets/screenshots/tags-index.png + +### Advanced features + +#### Configurable listings + +<!-- md:version 9.6.0 --> +<!-- md:flag experimental --> + +Listings can be configured in `mkdocs.yml` or directly at the location of the +marker that you position in a Markdown document. Some examples: + +- __Use [scoped listings]__: limit the tags index to pages that are on the same + level of the subsection of the documentation the page is in: + + ``` html + <!-- material/tags { scope: true } --> + ``` + +- __List only specific tags__: limit the tags index to a single or multiple + selected tags, e.g., `Foo` and `Bar`, excluding all other tags: + + ``` html + <!-- material/tags { include: [Foo, Bar] } --> + ``` + +- __Exclude pages with specific tags__: don't include pages that are tagged + with specific tags, e.g. `Internal`. This can be any tag, including a shadow + tag: + + ``` html + <!-- material/tags { exclude: [Internal] } --> + ``` + +- __Enable or disable tags inside the table of contents__: specify whether the + table of contents lists all tags under the nearest headline: + + ``` html + <!-- material/tags { toc: false } --> + ``` + +See the [listing configuration] for all options. + + [listing configuration]: ../plugins/tags.md#listing-configuration + +#### Scoped listings + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +If your documentation is large, you might want to consider using scoped listings +which will only include pages that are on the same level or below the page +containing the listing. Just use: + +``` html +<!-- material/tags { scope: true } --> +``` + +If you plan to use multiple scoped indexes, it's a good idea to define a +listing configuration in `mkdocs.yml`, which you can then reference by its id: + +``` yaml +plugins: + - tags: + listings_map: + scoped: + scope: true +``` + +You can now use: + +``` html +<!-- material/tags scoped --> +``` + +#### Shadow tags + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +Shadow tags are tags that are solely meant to organization, which can be +included or excluded for rendering with a simple flag. They can be enumerated +in the [`shadow_tags`][config.shadow_tags] setting: + +``` yaml +plugins: + - tags: + shadow_tags: + - Draft + - Internal +``` + +If a document is tagged with `Draft`, the tag will only be rendered if +[`shadow`][config.shadow] setting is enabled, and excluded when it is disabled. +This is an excellent opportunity for using tags for structuring. + + [config.shadow]: ../plugins/tags.md#config.shadow + [config.shadow_tags]: ../plugins/tags.md#config.shadow_tags + +#### Nested tags + +<!-- md:version 9.7.0 --> +<!-- md:flag experimental --> + +The [`tags_hierarchy_separator`][config.tags_hierarchy_separator] allows to +create hierarchies of tags, e.g., `Foo/Bar`. Nested tags will be rendered as +children of the parent tag: + +``` yaml +plugins: + - tags: + tags_hierarchy: true +``` + + [config.tags_hierarchy_separator]: ../plugins/tags.md#config.tags_hierarchy_separator + +### Hiding tags on a page + +While the tags are rendered above the main headline, sometimes, it might be +desirable to hide them for a specific page, which can be achieved with the +front matter `hide` property: + +``` yaml +--- +hide: + - tags +--- + +# Page title +... +``` diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-the-footer.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-the-footer.md new file mode 100644 index 0000000..2d45ae4 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-the-footer.md @@ -0,0 +1,182 @@ +# Setting up the footer + +The footer of your project documentation is a great place to add links to +websites or platforms you or your company are using as additional marketing +channels, e.g. :fontawesome-brands-mastodon:{ style="color: #5A4CE0" } or +:fontawesome-brands-youtube:{ style="color: #EE0F0F" }, which you can easily +configure via `mkdocs.yml`. + +## Configuration + +### Navigation + +<!-- md:version 9.0.0 --> +<!-- md:feature --> + +The footer can include links to the previous and next page of the current page. +If you wish to enable this behavior, add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.footer +``` + +### Social links + +<!-- md:version 1.0.0 --> +<!-- md:default none --> + +Social links are rendered next to the copyright notice as part of the +footer of your project documentation. Add a list of social links in `mkdocs.yml` +with: + +``` yaml +extra: + social: + - icon: fontawesome/brands/mastodon # (1)! + link: https://fosstodon.org/@squidfunk +``` + +1. Enter a few keywords to find the perfect icon using our [icon search] and + click on the shortcode to copy it to your clipboard: + + <div class="mdx-iconsearch" data-mdx-component="iconsearch"> + <input class="md-input md-input--stretch mdx-iconsearch__input" placeholder="Search icon" data-mdx-component="iconsearch-query" value="mastodon" /> + <div class="mdx-iconsearch-result" data-mdx-component="iconsearch-result" data-mdx-mode="file"> + <div class="mdx-iconsearch-result__meta"></div> + <ol class="mdx-iconsearch-result__list"></ol> + </div> + </div> + +The following properties are available for each link: + +<!-- md:option social.icon --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must contain a valid path to any icon bundled with the theme, + or the build will not succeed. Some popular choices: + + * :fontawesome-brands-github: – `fontawesome/brands/github` + * :fontawesome-brands-gitlab: – `fontawesome/brands/gitlab` + * :fontawesome-brands-x-twitter: – `fontawesome/brands/x-twitter` + * :fontawesome-brands-mastodon: – `fontawesome/brands/mastodon` + <small>automatically adds [`rel=me`][rel=me]</small> + * :fontawesome-brands-docker: – `fontawesome/brands/docker` + * :fontawesome-brands-facebook: – `fontawesome/brands/facebook` + * :fontawesome-brands-instagram: – `fontawesome/brands/instagram` + * :fontawesome-brands-linkedin: – `fontawesome/brands/linkedin` + * :fontawesome-brands-slack: – `fontawesome/brands/slack` + * :fontawesome-brands-discord: – `fontawesome/brands/discord` + * :fontawesome-brands-pied-piper-alt: – `fontawesome/brands/pied-piper-alt` + +<!-- md:option social.link --> + +: <!-- md:default none --> <!-- md:flag required --> + This property must be set to a relative or absolute URL including the URI + scheme. All URI schemes are supported, including `mailto` and `bitcoin`: + + === ":fontawesome-brands-mastodon: Mastodon" + + ``` yaml + extra: + social: + - icon: fontawesome/brands/mastodon + link: https://fosstodon.org/@squidfunk + ``` + + === ":octicons-mail-16: Email" + + ``` yaml + extra: + social: + - icon: fontawesome/solid/paper-plane + link: mailto:<email-address> + ``` + +<!-- md:option social.name --> + +: <!-- md:default _domain name from_ `link`_, if available_ --> + This property is used as the link's `title` attribute and can be set to a + discernable name to improve accessibility: + + ``` yaml + extra: + social: + - icon: fontawesome/brands/mastodon + link: https://fosstodon.org/@squidfunk + name: squidfunk on Fosstodon + ``` + + [icon search]: ../reference/icons-emojis.md#search + [rel=me]: https://docs.joinmastodon.org/user/profile/#verification + +### Copyright notice + +<!-- md:version 0.1.0 --> +<!-- md:default none --> + +A custom copyright banner can be rendered as part of the footer, which is +displayed next to the social links. It can be defined as part of `mkdocs.yml`: + +``` yaml +copyright: Copyright © 2016 - 2020 Martin Donath +``` + +### Generator notice + +<!-- md:version 7.3.0 --> +<!-- md:default `true` --> + +The footer displays a _Made with Material for MkDocs_ notice to denote how +the site was generated. The notice can be removed with the following option +via `mkdocs.yml`: + +``` yaml +extra: + generator: false +``` + +!!! info "Please read this before removing the generator notice" + + The subtle __Made with Material for MkDocs__ hint in the footer is one of + the reasons why this project is so popular, as it tells the user how the + site is generated, helping new users to discover this project. Before + removing please consider that you're enjoying the benefits of @squidfunk's + work for free, as this project is Open Source and has a permissive license. + Thousands of hours went into this project, most of them + without any financial return. + +## Usage + +### Hiding prev/next links + +The footer navigation showing links to the previous and next page can be hidden +with the front matter `hide` property. Add the following lines at the top of a +Markdown file: + +``` yaml +--- +hide: + - footer +--- + +# Page title +... +``` + +## Customization + +### Custom copyright + +<!-- md:version 8.0.0 --> +<!-- md:flag customization --> + +In order to customize and override the [copyright notice], [extend the theme] +and [override the `copyright.html` partial][overriding partials], which normally +includes the `copyright` property set in `mkdocs.yml`. + + [copyright notice]: #copyright-notice + [generator notice]: #generator-notice + [extend the theme]: ../customization.md#extending-the-theme + [overriding partials]: ../customization.md#overriding-partials diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-the-header.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-the-header.md new file mode 100644 index 0000000..d9e7d21 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-the-header.md @@ -0,0 +1,68 @@ +# Setting up the header + +Material for MkDocs' header can be customized to show an announcement bar that +disappears upon scrolling, and provides some options for further configuration. +It also includes the [search bar] and a place to display your project's +[git repository], as explained in those dedicated guides. + + [search bar]: setting-up-site-search.md + [git repository]: adding-a-git-repository.md + +## Configuration + +### Automatic hiding + +<!-- md:version 6.2.0 --> +<!-- md:feature --> + +When autohiding is enabled, the header is automatically hidden when the +user scrolls past a certain threshold, leaving more space for content. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - header.autohide +``` + +### Announcement bar + +<!-- md:version 5.0.0 --> +<!-- md:flag customization --> + +Material for MkDocs includes an announcement bar, which is the perfect place to +display project news or other important information to the user. When the user +scrolls past the header, the bar will automatically disappear. In order to add +an announcement bar, [extend the theme] and [override the `announce` +block][overriding blocks], which is empty by default: + +``` html +{% extends "base.html" %} + +{% block announce %} + <!-- Add announcement here, including arbitrary HTML --> +{% endblock %} +``` + + [extend the theme]: ../customization.md#extending-the-theme + [overriding blocks]: ../customization.md#overriding-blocks + +#### Mark as read + +<!-- md:version 8.4.0 --> +<!-- md:feature --> +<!-- md:flag experimental --> + +In order to render temporary announcements that can be marked as read by the +user, a button to dismiss the current announcement can be included. Add the +following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - announce.dismiss +``` + +When the user clicks the button, the current announcement is dismissed and not +displayed again until the content of the announcement changes. This is handled +automatically. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-versioning.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-versioning.md new file mode 100644 index 0000000..7d62a3b --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/setup/setting-up-versioning.md @@ -0,0 +1,189 @@ +# Setting up versioning + +Material for MkDocs makes it easy to deploy multiple versions of your project +documentation by integrating with external utilities that add those capabilities +to MkDocs, i.e. [mike]. When deploying a new version, older versions of your +documentation remain untouched. + + [mike]: https://github.com/jimporter/mike + +## Configuration + +### Versioning + +<!-- md:version 7.0.0 --> +<!-- md:utility [mike] --> +<!-- md:demo example-versioning --> + +[mike] makes it easy to deploy multiple versions of your project documentation. +It integrates natively with Material for MkDocs and can be enabled via +`mkdocs.yml`: + +``` yaml +extra: + version: + provider: mike +``` + +This renders a version selector in the header: + +<figure markdown> + +[![Version selector preview]][Version selector preview] + + <figcaption markdown> + +Check out the versioning example to see it in action – +[mkdocs-material.github.io/example-versioning][version example] + + </figcaption> +</figure> + +!!! quote "[Why use mike?]" + + mike is built around the idea that once you've generated your docs for a + particular version, you should never need to touch that version again. This + means you never have to worry about breaking changes in MkDocs, since your + old docs (built with an old version of MkDocs) are already generated and + sitting in your `gh-pages` branch. + + While mike is flexible, it's optimized around putting your docs in a + `<major>.<minor>` directory, with optional aliases (e.g. `latest` or `dev`) + to particularly notable versions. This makes it easy to make permalinks to + whatever version of the documentation you want to direct people to. + + [Version selector preview]: ../assets/screenshots/versioning.png + [version example]: https://mkdocs-material.github.io/example-versioning/ + [Why use mike?]: https://github.com/jimporter/mike#why-use-mike + +### Stay on the same page when switching versions + +When the user chooses a version in the version selector, they usually want to go +to the page corresponding to the page they were previously viewing. Material for +MkDocs implements this behavior by default, but there are a few caveats: + +- the [`site_url`][mkdocs.site_url] must be set correctly in `mkdocs.yml`. + See the ["Publishing a new version"](#publishing-a-new-version) section for + an example. +- the redirect happens via JavaScript and there is no way to know which page you + will be redirected to ahead of time. + +### Version warning + +<!-- md:version 8.0.0 --> +<!-- md:flag customization --> + +If you're using versioning, you might want to display a warning when the user +visits any other version than the latest version. Using [theme extension], +you can [override the `outdated` block][overriding blocks]: + +``` html +{% extends "base.html" %} + +{% block outdated %} + You're not viewing the latest version. + <a href="{{ '../' ~ base_url }}"> <!-- (1)! --> + <strong>Click here to go to latest.</strong> + </a> +{% endblock %} +``` + +1. Given this value for the `href` attribute, the link will always redirect to + the root of your site, which will then redirect to the latest version. This + ensures that older versions of your site do not depend on a specific alias, + e.g. `latest`, to allow for changing the alias later on without breaking + earlier versions. + +This will render a version warning above the header: + +[![Version warning preview]][Version warning preview] + +The default version is identified by the `latest` alias. If you wish to set +another alias as the latest version, e.g. `stable`, add the following lines +to `mkdocs.yml`: + +``` yaml +extra: + version: + default: stable # (1)! +``` + +1. You can also define multiple aliases as the default version, e.g. `stable` + and `development`. + + ``` yaml + extra: + version: + default: + - stable + - development + ``` + + Now every version that has the `stable` and `development` aliases will not + display the version warning. + +Make sure one alias matches the [default version], as this is where users are +redirected to. + + [theme extension]: ../customization.md#extending-the-theme + [overriding blocks]: ../customization.md#overriding-blocks + [Version warning preview]: ../assets/screenshots/version-warning.png + [default version]: #setting-a-default-version + +### Version alias + +<!-- md:version 9.5.23 --> +<!-- md:default `false` --> + +If you're using aliases for versioning, and want to show the version alias +besides the version number, you can enable this feature by setting the `alias` +option to `true`: + +``` yaml +extra: + version: + alias: true +``` + +## Usage + +While this section outlines the basic workflow for publishing new versions, +it's best to check out [mike's documentation][mike] to make yourself familiar +with its mechanics. + +### Publishing a new version + +If you want to publish a new version of your project documentation, choose a +version identifier and update the alias set as the default version with: + +``` +mike deploy --push --update-aliases 0.1 latest +``` + +Note that every version will be deployed as a subdirectory of your `site_url`, +which you should set explicitly. For example, if your `mkdocs.yml` contains: + +``` yaml +site_url: 'https://docs.example.com/' # Trailing slash is recommended +``` + +the documentation will be published to URLs such as: + +- _docs.example.com/0.1/_ +- _docs.example.com/0.2/_ +- ... + +### Setting a default version + +When starting with [mike], a good idea is to set an alias as a default version, +e.g. `latest`, and when publishing a new version, always update the alias to +point to the latest version: + +``` +mike set-default --push latest +``` + +When publishing a new version, [mike] will create a redirect in the root of +your project documentation to the version associated with the alias: + +_docs.example.com_ :octicons-arrow-right-24: _docs.example.com/0.1_ diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/basic.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/basic.md new file mode 100644 index 0000000..507ff75 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/basic.md @@ -0,0 +1,373 @@ +# Basic blogs + +Blogs are a great way to engage with your audience. Software developers can use +a blog to announce new features, demonstrate their usage and provide background +information. You can demonstrate competence by commenting on the state of the +art or document your own work as best practice. Posts on current topics can help +draw in visitors for your main website and can keep your audience engaged. Of +course, you can blog about any topics close to your heart. + +The [blog plugin] makes running a blog alongside your other content easy but you +can also configure it to run a stand-alone blog if posts are the only kind +of content you need. + +After a brief overview of the basic concepts of a blog, this tutorial guides you +through the process of configuring the [blog plugin], setting up your blog, +creating posts, and defining post metadata. + +[blog plugin]: ../../plugins/blog.md + +__Time required:__ typically 20 minutes + +## Key concepts + +**Post, excerpt**: a blog consists of a number of self-contained _posts_ (often called +articles) and an index page that shows the posts in reverse chronological order, with +the most recent post at the top. The index page usually shows only a short _excerpt_ and a +link that the user can click to navigate to the full post. + +**Metadata**: both the index page and the post itself list information such as +when you published the post, when you updated it, who the author is, and what the +expected reading time is. + +**Slug**: since the blog posts are primarily arranged by time and not into a hierarchy, +their URLs do not reflect such a structure. Instead, each post's URL +contains a shortened description, the _slug_, which is usually derived from +the first heading in the post. + +**Navigation**: the main navigation structure is the timeline, which you can +subdivide into _categories_. The main index page shows the more recent posts +while an _archive_ section allows access to older ones, organized by year. +In addition, posts can be _tagged_ and _tag index pages_ provide an additional +navigation structure based on content. + +You can see all these elements on the [Material for MkDocs blog]. + +[Material for MkDocs blog]: https://squidfunk.github.io/mkdocs-material/blog/ + +## Setting up your blog + +The blog plugin is part of Material for MkDocs but you need to configure it +in the `mkdocs.yml`. + +!!! example "Set up a blog" + + If you have not done so already, create a project for your blog, + then edit the `mkdocs.yml` file to make sure it has the following content: + + ```yaml + site_name: Blog Tutorial + site_description: an example blog set up following the tutorial + site_url: http://www.example.com + + theme: + name: material + + plugins: + - search + - blog + ``` + + The blog plugin will create a directory structure for your blog posts if it + does not exist, so simply run `mkdocs serve` to get: + + ``` + docs + ├── blog + │   ├── index.md + │   └── posts + └── index.md + ``` + +Now create your first blog post in `docs/blog/posts`. You can use any +naming convention and directory structure you like for your posts, as long as +they are inside `docs/blog/posts`. + +Each post _must_ have a page header, which appears at the top of the Markdown +code between lines with three dashes. Within this header, you need to have at +least a `date` entry but you can add other data, as you will see below. +Following the header comes the page content. Note that it is important +to have a level one heading as the plugin uses it to produce the _slug_. Also, +by adding `<!-- more -->` to the page, you can define where the excerpt will end +that the index page shows. + +!!! example "Write your first post" + + Create a file `docs/blog/posts/myfirst.md` with the following contents: + + ``` + --- + date: + created: 2023-12-31 + --- + + # Happy new years eve! + + We hope you are all having fun and wish you all the best for the new year! + <!-- more --> + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. + ``` + + Then, run `mkdocs serve` and point your web browser at + `http://localhost:8000/blog`. + + The blog plugin automatically creates navigation elements for + the blog. The index page shows only the extract. When you select the + "Continue reading" link, you will get to the full blog post. Note how it + has a URL generated from the first-level heading. + +!!! tip "Navigation" + + We also have a [tutorial on navigation] that shows you how to change the + automatically created navigation and integrate the blog into your existing + navigation structure. It shows how to create secondary navigation, produce + author pages, and control pagination. + +[tutorial on navigation]: navigation.md + +## Post metadata + +In addition to the date, you can provide other metadata and give the plugin +instructions, such as to treat a post as a draft or to pin it. + +### Drafts + +You may want to produce a draft of a blog post and work with it locally but +exclude it from the build that you publish. Simply add a field to the page +header to indicate that a post is still in draft form. + +!!! example "Create a draft" + + Create a second blog post in `docs/blogs/posts/draft.md` with the following + contents: + + ```hl_lines="4" + --- + date: + created: 2024-01-01 + draft: true + --- + + # Happy new year! + + Happy 2024 to everyone. Wishing you all the best! + <!-- more --> + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. + ``` + + Now, note how the draft appears on the index page but with a label that + indicates that it is a draft. When you run `mkdocs build`, the draft will + _not_ appear in the output: + + ``` + $ mkdocs build + $ ls site/blog + site/blog + ├── 2023 + │   └── 12 + │   └── 31 + │   └── happy-new-years-eve + │   └── index.html + ... + ``` + + The first blog post for 2024 is not there yet because it is still in draft + stage. Remember to remove the `draft` setting in the header when it is time + to publish it. + +You can also create a folder to keep your drafts in and use the [Meta plugin] +to add the `draft` header setting to all the posts in that folder. This has the +advantage that it is easier to see which posts are still in draft form. We will +cover the Meta plugin later on. + +[Meta plugin]: ../../plugins/meta.md + +### Edits + +Sometimes, bloggers need to update a post. This might happen when you make +a mistake or when something changes that you need to reflect in the post. To +indicate you have edited a post, you can include an `updated` date in the page +header. + +!!! example "Editing a post" + + Make a change to your first blog post, then add an edit date to the header: + + ```hl_lines="3 4" + --- + date: + created: 2023-12-31 + updated: 2024-01-02 + --- + ``` + +The Metadata section of the blog post itself will contain the edit date, +though the index page omits this detail by default. + +### Reading time + +To give the reader some idea of how long it might take them to read a post, +a read time is automatically calculated. If you want to override this, you can +do so in the page header by specifying the number of minutes you estimate +your readers will take the read the post. + +!!! example "Overriding the reading time" + + Add a reading time override to your first blog post: + + ```hl_lines="5" + --- + date: + created: 2023-12-31 + updated: 2024-01-02 + readtime: 15 + --- + ``` + +### Pinning + +Sometimes, blog authors want to 'pin' a specific post so that it will always +appear at the top of the index page, no matter what else gets published. You can +achieve this by adding the `pin` attribute in the page header: + +!!! example "Pin a post" + + Add the `pin` attribute to your first blog post: + + ```hl_lines="6" + --- + date: + created: 2023-12-31 + updated: 2024-01-02 + readtime: 15 + pin: true + --- + ``` + + Observe how this makes the post appear on top of the index page even though + its publication date is prior to other posts. A small pin icon shows that the + post has been pinned. + +### Related links + +When your blog is part of a wider site such as technical documentation, you +will want to provide links from blog posts into your other content. One way you +can do this is to have a related links section. The blog plugin can create one +for you if you provide link targets in your page header: + +!!! example "Add a related links section" + + Add the following to a blog post: + + ``` hl_lines="5-7" + --- + date: + created: 2023-12-31 + ... + links: + - index.md + - blog/index.md + --- + ``` + + The related links appear underneath the Metadata section. + +The nice thing here is that you do not need to provide a page title. The plugin +will deduce the link text by applying the same logic that MkDocs uses for the +main navigation. In fact, the syntax is the same as that of the `nav` section +in the `mkdocs.yml`, so you can override the title if you want and even define +subsections: + +!!! example "Override the page titles" + + Change the link section to override the page titles: + + ```hl_lines="6-9" + --- + date: + created: 2023-12-31 + ... + links: + - Homepage: index.md + - Blog index: blog/index.md + - External links: + - Material documentation: https://squidfunk.github.io/mkdocs-material + --- + ``` + +The plugin renders related links in the left sidebar on screens that are wide +enough and at the bottom of the post on narrow screens. Change the size of your +browser window to see this in action. + +## Meta plugin + +The Meta plugin helps simplify the management of metadata that is common to a +group of files in the same subdirectory. Instead of having to repeat the same +metadata in the page headers of a number of files, you can add a `.meta.yml` +file in the directory and the Meta plugin will merge its contents into the +headers of all the pages contained. Settings from the page header take +precedence, so you can always override settings by adding them to a post's +header. + +For example, you may want to manage drafts by keeping them in a directory +together so that they are not only flagged as drafts but also easier to find. +(Otherwise, you would need to inspect the page headers or trace back from the +output to the files to figure out which posts are drafts.) + +!!! example "Drafts using the Meta plugin" + + You first need to activate the plugin in your `mkdocs.yaml`: + + ```yaml hl_lines="4" + plugins: + - search + - blog + - meta + ``` + + Now create the folder for the drafts: + + === "MacOS/Linux" + + ```bash + $ mkdir docs/blog/posts/drafts + ``` + + === "Windows" + ```powershell + $ mkdir docs\blog\posts\drafts + ``` + + Now, within this folder, crate a file `.meta.yml` that contains: + + ```yaml + draft: true + ``` + + Add another blog post and store it in `docs/blog/posts/drafts`. When you + look at it locally, you will see the label that identifies it as a draft, + while in the version built for publication it does not appear. To move a + post from draft status to published, simply move it outside `drafts/`. + +[meta]: ../../plugins/meta.md + +## What's next? + +You should now have a working blog. However, as it accumulates content, you +may want to make sure that people can find posts they are interested in, so +you may want to add secondary navigation with tags and categories. You may +have more than one author and want to attribute posts to them as well as +generate author pages for them. We have a [tutorial on navigation, pagination, +and authors] that covers these topics. + +[tutorial on navigation, pagination, and authors]: navigation.md + +You may want to increase engagement with your blog by allowing people to +subscribe to an RSS feed or by setting up a comment system. The [engagement +and dissemination tutorial] walks you through setting these up. + +[engagement and dissemination tutorial]: engage.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/engage.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/engage.md new file mode 100644 index 0000000..90b4248 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/engage.md @@ -0,0 +1,369 @@ +# Engagement and dissemination + +You can foster reader engagement and improve the dissemination of content +on your blog by providing an RSS feed that people can subscribe to and by +integrating a discussion system. To learn more about who is or is not reading +your posts, you may want to integrate an analytics system. You may also want +to post on social media when you publish a new blog post. This tutorial gives +you a leg up on all of these topics. + +__Time required:__ typically 30 minutes + +## RSS feeds + +An _RSS feed_ allows users to subscribe to a blog so that they get notified when +you publish new posts. RSS Feed readers are often used to access blogs that a +user follows. They usually support downloading the blog content for offline +consumption. + +An easy way to create an RSS feed for your blog is to use the +[MkDocs RSS Plugin], which is well integrated with Material for MkDocs. +Since it is a third-party plugin, you need to install it before using it. + +[MkDocs RSS Plugin]: https://guts.github.io/mkdocs-rss-plugin + + +!!! example "Add an RSS feed" + + Install the RSS plugin into your project: + + ``` + $ pip install mkdocs-rss-plugin + ``` + + It is important that have the `site_name`, `site_description` and + `site_url` settings configured as [instructed in the basic blog tutorial]. + The RSS plugin makes use of this information to construct the feed, so make + sure you have configured them. + + [instructed in the basic blog tutorial]: basic.md#setting-up-your-blog + + Now, configure the plugin in the `mkdocs.yml`. The options provided restrict + the pages that RSS entries are created for to the blog posts, which is + probably what you want. Also note the configuration of the date fields to + match the format that Material for MkDocs uses to accommodate both a + creation date and a date for updates. + + ```yaml hl_lines="9" + plugins: + - ... + - rss: + match_path: "blog/posts/.*" + date_from_meta: + as_creation: date.created + as_update: date.updated + ``` + + Have a look at http://localhost:8000/feed_rss_created.xml to see the RSS + feed in all its XML glory. You can use a browser like Firefox or Chrome that + can display the raw RSS feed or use `curl` to get the feed and `xmllint` to + format it. (You may need to install these tools.) + + ``` + curl -s http://localhost:8000/feed_rss_created.xml | xmllint --format - + ``` + + You may also want to try your feed with a feed reader. There are various desktop + and mobile apps as well as online services. Of course, to use the latter you + will need to deploy your project somewhere that is accessible to them. + +This minimal configuration should work well if you have not made any changes +to the default configuration of the blog plugin. For more information on adapting +the feed to your needs, see [the RSS plugin's documentation]. + +[the RSS plugin's documentation]: https://guts.github.io/mkdocs-rss-plugin/ + +## Social media buttons + +Social media buttons can serve two purposes: to allow your readers to navigate +to your social media profiles or to share content you have published via their +own accounts. + +### Profile links + +Links to social media profiles a usually provided in the footer of pages and +Material for MkDocs makes this easy. All you need to do is to provide the +necessary links and define the icons to use. + +!!! example "Adding social media profile links" + + Add an `extra` section to your `mkdocs.yml` and, within it, a `social` + section to contain a list of link definitions. These consist of the logo + to use and the link to the profile. + + ```yaml + extra: + social: + - icon: fontawesome/brands/mastodon + name: squidfunk on Mastodon + link: https://fosstodon.org/@squidfunk + ``` + + For the `icon`, you can choose any valid path to an icon bundled with the + theme. The `name` will be used as the title attribute for the icon and + including this improves accessibility. + For popular social media systems, the link needs to be absolute and + needs to include the scheme, most likely `https://`. + + You can also use other schemes. For example, to create an icon that allows + people to create an email, add this: + + ```yaml + extra: + social: + - icon: /fontawesome/regular/envelope + name: send me an email + link: mailto:<email-address> + ``` + + Finally, you can specify a URL within your site, such as to your contact + page. It is possible to specify only the path to the page: + + ```yaml + extra: + social: + - icon: /material/mailbox + name: contact us + link: /contact + ``` + +### Share and like buttons + +Adding buttons that let people share your content on social media is a bit +more involved, which is why there are companies offering components for this. + + +!!! tip "Data Protection" + + "Share" and "Like" buttons that use integrations provided by social media + companies often leave copious data traces even when the user does not + interact with these buttons. If you choose to integrate such feature on + your site please be aware of the data protection implications and your + duties as a provider to ensure that processing occurs only once the user + has granted consent. + +This implementation of share buttons deliberately does not use third party code. +It supports sharing to Twitter/X and Facebook without causing a data flow to +these companies whenever someone views the pages. Only when someone clicks a +share button will there be interactions with those companies' servers. + +!!! example "Add share buttons" + + In order to add the share buttons, you can add a hook that appends buttons + for sharing the current page. + + Create a directory `hooks` in your project root and configure it + in your `mkdocs.yml`: + + ```yaml + hooks: + - hooks/socialmedia.py + ``` + + Add the file `hooks/socialmedia.py` with the following Python code: + + ```python + from textwrap import dedent + import urllib.parse + import re + + x_intent = "https://x.com/intent/tweet" + fb_sharer = "https://www.facebook.com/sharer/sharer.php" + include = re.compile(r"blog/[1-9].*") + + def on_page_markdown(markdown, **kwargs): + page = kwargs['page'] + config = kwargs['config'] + if not include.match(page.url): + return markdown + + page_url = config.site_url+page.url + page_title = urllib.parse.quote(page.title+'\n') + + return markdown + dedent(f""" + [Share on :simple-x:]({x_intent}?text={page_title}&url={page_url}){{ .md-button }} + [Share on :simple-facebook:]({fb_sharer}?u={page_url}){{ .md-button }} + """) + ``` + + The hook first checks if the current page is a blog post and then appends + Markdown code for the share buttons. The buttons use icons, so you also need + to configure the following markdown extensions: + + ```yaml + markdown_extensions: + - attr_list + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + ``` + + +## Add a discussion system + +Allowing your readers to comment on your posts is a great way of receiving +feedback, learning something, as well as giving readers the opportunity to +discuss the content and the topic it is about. + +There are plenty of discussion system out there and you will need to consider +your audience when choosing one appropriate for your blog. Likewise, you will +also need to consider existing commitments to communication channels. If you +are a heavy user Slack, for example, you may have a string preference for this +system. Consider that when you add a communication channel, you will need to +be prepared to use it regularly and to moderate discussions. + +### Giscus integration + +In this tutorial, we will be using [Giscus] because it is free, open source, +and uses [GitHub Discussions] as a backend. Because a lot of users of Material +for MkDocs use GitHub, this seems like an obvious choice. + +[Giscus]: https://giscus.app/ +[GitHub Discussions]: https://docs.github.com/en/discussions + +To add Giscus to your blog you will need to go through a number of steps: + +1. Create a GitHub repository if there is not already one +2. Turn on discussions and install the [Giscus app] +3. Configure the code needed to embed Giscus into your blog +4. Add the code to your MkDocs project + +[Giscus app]: https://github.com/apps/giscus + +You may want to create a test repository for this tutorial that you can +scrap later on. The instructions below assume that you are user "example" +and that you create a repository "giscus-test." The repository will need +to be public for people to be able to use the discussions. + +In the instructions given below, you will need to replace at least the username +but also the repository name if you chose another name such as when you +want to work directly on an existing repository. + +!!! example "Turn on discussions and install the Giscus app" + + Once the repository is set up, go to its settings page and find + `Features` in the `General` section. Tick the checkbox for `Discussions`. + You will see that `Discussions` appears in the top navigation for the + repository. If you are using a live repository then you may want to add some + minimal content to the discussions section at this point and come back to the + tutorial. + + Next, you need to install the [Giscus app] by following the link in this + sentence, and choosing `Install`, then following the instructions to choose + where the Giscus app is to be installed: + + 1. Choose the account or organization for the repository you want to use. + 2. Choose to install only on select repositories and select the one you + want to use. Note that you can choose more than one repository here. + 3. Select `Install` at the end. You may need to authenticate to give + permission for this to happen. + 4. You will end up on the `Applications` page in your settings, where you + can control the Gicsus app and uninstall it if so desired. + +That is all the preparation you will need for the repository. Next, it is time +to generate a piece of code that embeds Giscus in your site. The resulting code +snippet will look something like this: + +```html +<script src="https://giscus.app/client.js" + data-repo="<username>/<repository>" + data-repo-id="..." + data-category="Announcements" + data-category-id="..." + data-mapping="title" + data-strict="1" + data-reactions-enabled="1" + data-emit-metadata="1" + data-input-position="top" + data-theme="preferred_color_scheme" + data-lang="en" + data-loading="lazy" + crossorigin="anonymous" + async> +</script> +``` + +!!! example "Configure the code needed to embed Giscus into your blog" + + Go to the [Giscus homepage] and configure the embedding code. There are a + number of settings: + + 1. Choose the language + 2. Enter the username / organization name and repository name + 3. Choose how the discussions are to be mapped to the page on your blog. + Because for a blog post the title is the basis of the URL, it makes + sense to use the `Discussion title contains page <title>` option. + 4. Under `Discussion Category` choose `Announcements` to limit the creation + of new discussions to Giscus and people with maintainer or admin + permissions. + 5. Under `Features`, select the following: + 1. Enable reactions for the main post + 2. Emit discussion metadata + 3. Place the comment box above the comments + 6. Under `Theme`, select `Preferred color scheme` so that Giscus matches + the color scheme selected by the user for your site. + +[Giscus homepage]: https://giscus.app/ + +With these settings in place, you now need to integrate the code into your +site. There is a partial `partials/comments.html` that exists for this purpose +and is empty be default. It is included by the `content.html` partial, so will +be included for every page on your site. You may or may not want this. In this +tutorial, you will limit the Giscus integration to only blog posts but it is +easy enough to leave out the code that achieves this if you want to have Giscus +discussions active for every page. + +!!! example "Add Giscus integration code" + + First, you need to create an `overrides` directory that will contain the + templates and partials you want to override. + + ``` + mkdir -p overrides/partials + ``` + + You need to declare it in your `mkdocs.yaml`: + + ```yaml hl_lines="3" + theme: + name: material + custom_dir: overrides + ``` + + Now add a file `overrides/partials/comments.html` and paste in the code + snippet you obtained from the Giscus homepage. Look at the result locally + and you will see that the integration is active on all pages of the site. + If you want to restrict it to your blog posts, you need to add a conditional + around the Giscus script that tests if comments should be included. A simple + way of doing this is to test for a metadata flag: + + ```html + {% if page.meta.comments %} + <script>...</script> + {% endif %} + ``` + + The disadvantage is that you now need to manually turn on comments for each + blog post - unless you want to turn them off on some. To get the comments + section on all blog posts, use code like this: + + ```html + {% if page.file.src_uri.startswith('blog/posts') %} + <script>...</script> + {% endif %} + ``` + + You should see now that the Giscus comments are added at the bottom of your + blog posts but not on other pages. + +## What's next? + +This is the end of the blog tutorial. We hope you have enjoyed it and manage to +set up your blog the way you like it. There are numerous other features and +options that we have not been able to cover here. The [blog plugin reference] +provides comprehensive documentation for the plugin. You may also want to +look at the [social plugin tutorial] to generate social cards for your blog +posts that get displayed when you post links to social media systems. + +[blog plugin reference]: https://squidfunk.github.io/mkdocs-material/plugins/blog/ +[social plugin tutorial]: ../social/basic.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/navigation.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/navigation.md new file mode 100644 index 0000000..9d870b8 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/blogs/navigation.md @@ -0,0 +1,524 @@ +# Navigation, authors, and pagination + +The Blog plugin provides blog-style navigation with a reverse-chronological +index page and an archive organized by year by default. This tutorial shows +how you can configure details of the default navigation, configure authors, and +add more navigation options using categories and the [Tags plugin]. + +[Tags plugin]: ../../plugins/tags.md + +__Time required:__ typically 30 minutes + +## Integrating navigation + +So far, you have let the Blog plugin and MkDocs worry about navigation. For some +use cases, this might be enough and it is simply sufficient to not declare a +`nav` section in the `mkdocs.yml`. + +However, you may want to integrate a blog with other content and a navigation +structure that you have defined in the `nav` section of the configuration. +In such cases, you need to provide a place where the Blog plugin should +attach the blog navigation to the rest of the navigation structure. + +!!! example "Integrate with site navigation" + + Add the following to your `mkdocs.yml` to see how the Blog plugin can + integrate the blog navigation with the overall navigation structure. + Note that the only thing you need to specify at this point is the + index page for the blog and its path must match the `blog_dir` setting, + which is `blog` by default: + + ```yaml hl_lines="5 6" + nav: + - Home: index.md + - Install: install.md + - Usage: usage.md + - Blog: + - blog/index.md + ``` + + You will notice that "Blog" is duplicated in the navigation structure. To + avoid this, you can use the `navigation.indexes` feature to make the blog + index the section index page for the blog: + + ```yaml hl_lines="3 4" + theme: + name: material + features: + - navigation.indexes + ``` + +!!! tip "Stand-alone blog" + + If what you need is a stand-alone blog instead of one that is integrated with + a larger site, this can be done by using the `blog_dir` configuration option. + To see how this is done, see [setting up a blog]. + The rest of the tutorial assumes that you are integrating the blog with + a wider site. + +[Setting up a blog]: ../../setup/setting-up-a-blog.md#blog-only + +!!! tip "Adding pages" + + You can add additional pages to the blog section by putting them into + `docs/blog` (and adding them to the navigation). The blog archive will be + added to the navigation after these pages. + +## Configuring the archive + +By default, the blog archive lists posts by year only. If you want to add +listings by month, you can configure the date format for the archive. + +!!! example "Organize posts by month" + + Add the following to your `mkdocs.yml` to get a listing with the month + name (in the language selected in the theme options): + + ```yaml hl_lines="2" + - blog: + archive_date_format: MMMM yyyy + ``` + + If you do not want the full month name, you can make the date + configuration `MM/yyyy`, for example. + + If you want to add the day, you can add a placeholder for them. + For example, to get an American-style output, make it `MM/dd/yyyy`. + For the plugin to sort the blog posts by the full date, you will + also need to set the `archive_url_date_format` to include the month + and day, so make it `MM/dd/yyyy` as well. + +## Using categories + +Categories are a way to make blog posts accessible by topic while retaining +the navigation structure based on chronology within each category listing. +Use them when there is a limited set of non-overlapping categories that +you can sort your posts into. + +Categories appear in the main navigation, so are directly accessible from there. +This implies that there are relatively few categories as otherwise the +`categories` section in your main navigation will become too crowded. + + +!!! example "Add a category" + + Add a category to your first blog post by adding it to the page header: + + ``` hl_lines="4 5"" + --- + date: 2023-12-31 + updated: 2024-01-02 + categories: + - Holidays + --- + ``` + + Now that the blog post has been categorised, `Holidays` appears under + `Categories` in the main navigation and the blog post appears in the + index page for this category. + + +!!! tip "Single or multiple categories?" + + While it is traditionally the case that a blog post would belong to only + one category, Material for MkDocs actually allows you to assign more + than one. While this gives you a degree of freedom, you should + probably not use this too much, not least because you can use tags to + deal with multiple classifications. We will cover them in the next step. + +Material allows you to control which categories blog authors can use. You +declare them in the `mkdocs.yml`. This way you can make sure everyone sticks +to agreed categories and that the plugin detects typos. + +!!! example "Control your categories" + + Add a `categories_allowed` entry to the configuration of the Blog plugin + with the entries "Holidays" and "News": + + ```yaml hl_lines="5-7" + plugins: + - search + - blog: + archive_date_format: MMMM yyyy + categories_allowed: + - Holidays + - News + ``` + + Now, when you add a category to a blog post that does not match one of these + two, you should get a build error. + +## Using tags + +The [Tags plugin] provides another way to classify blog posts and to make +them accessible independently of the main navigation structure. Tags are useful +for making related content easily discoverable even if it is in different parts +of the navigation hierarchy. + +[Tags plugin]: https://squidfunk.github.io/mkdocs-material/plugins/tags/ + +You may have a tutorial like this one as well as a more comprehensive setup guide +and reference documentation. Adding the same tag to all three shows that they +are related. As you will see, it is possible to navigate from a tagged page to +the tag index and, from there, to other pages that carry the same tag. + +!!! example "Enable the plugin and add tags" + + First, you need to add the plugin to your `mkdocs.yml`: + + ```yaml hl_lines="8" + plugins: + - search + - blog: + archive_date_format: MMMM yyyy + categories_allowed: + - Holidays + - News + - tags + ``` + + Once this is done, you can add tags to posts in the page header: + + ``` hl_lines="9-12"" + --- + date: + created: 2023-12-31 + updated: 2024-01-02 + authors: + - material + categories: + - Holidays + tags: + - new year + - hogmanay + - festive season + --- + ``` + +You should see the tags that you defined at the top of the post. However, at the +moment that is it. While the blog plugin automatically creates an index page for +categories, the tags plugin does not do the same for tags. This is because the +tags plugin is not specific for blogs. You can use it for any site content, so +it is not obvious were the tag index should go. + +You can configure a basic tag index using the public version of Material for +MkDocs. The Insider Edition supports this as well, of course, but also provides +an alternative index mechanism that allows for an arbitrary number of tag +indexes, scoped listings, shadow tags, nested tags, and much more. + +!!! example "Adding a tags index" + === "Basic tag index" + + To configure a tag index using the public version, add a `tags_file` entry + to your configuration of the tags plugin and configure it in your `nav` + section. Remember to add a colon at the end of the existing `tags` entry. + + ```yaml hl_lines="8-9 17" + plugins: + - search + - blog: + archive_date_format: MMMM yyyy + categories_allowed: + - Holidays + - News + - tags: + tags_file: blog/tags.md + + nav: + - Home: index.md + - Install: install.md + - Usage: usage.md + - Blog: + - blog/index.md + - Tags: blog/tags.md + ``` + + The tag index will be appended to the configured page, which you should + now create at the location specified. + + Note that you can put the tag index page anywhere in your primary + navigation, so if you are using tags elsewhere instead of just in your + blog then you may want to have the tag index outside the blog section + of the navigation. + + + === "Insider Edition" + + To add a tag index, you add a placeholder in a Markdown file to tell + the plugin to insert an index at that point. This means that you + can add content before and after the index. Crucially, you can add + placeholders in multiple pages, each with a configuration of what + subset of tags should be displayed in the index. + + The simplest index page looks like this. Create it under `docs/tags.md`. + + ```markdown + # Tag index + <!-- material/tags --> + ``` + + Now, you may want to keep the tags for your blog separate from tags + you use in the rest of your page. You can achieve this by assigning + the tag index a scope. Put the following under `docs/blog/tags.md`: + + ```markdown + # Tag index for the blog + <!-- material/tags { scope: true } --> + ``` + + You now have two index pages: one covers the whole site and one + covers only the blog. Add both to the navigation: + + ```yaml + nav: + - Home: index.md + - Tags: tags.md + - Blog: + - blog/index.md + - blog/tags.md + ``` + + The tags plugin in the Insider Edition is an incredibly powerful tool + and we can only scratch the surface of what is possible with it. If you + want to explore more after you have worked for this part of the tutorial, + have a look at the [tags plugin reference]. + +[tags plugin reference]: ../../plugins/tags.md + +## Defining authors + +If your blog has more than one author then you may want to identify the author +for each blog post. The blog plugin allows you to create a file that contains +the author information and to then reference the authors of a particular post in +the page header. + +!!! example "Create author info" + + Create a file `docs/blog/.authors.yml` with this content: + + ```yaml + authors: + team: + name: Team + description: Creator + avatar: https://simpleicons.org/icons/materialformkdocs.svg + squidfunk: + name: Martin Donath + description: Creator + avatar: https://github.com/squidfunk.png + ``` + + and then add a line to the header of the first post: + + + ```hl_lines="5-6" + --- + date: + created: 2023-12-31 + updated: 2024-01-02 + authors: + - team + --- + ``` + + Note that `authors` is a list, so you can specify multiple authors. + +You can create custom author index pages that can highlight the contributions +of an author as well as provide additional information about them. + +!!! example "Add author page" + + First, you need to enable author profiles in the `mkdocs.yml`: + + ```yaml hl_lines="8" + plugins: + - search + - blog: + archive_date_format: MMMM yyyy + categories_allowed: + - Holidays + - News + authors_profiles: true + ``` + + Check your blog to see that there is now an extra entry in the main + navigation next to `archive` and `categories` that lists the authors and + their contributions. + + To customize the author page, you can create a page that overrides the one + generated by default. First, create the `author` directory that the profile + pages will live in: + + ```hl_lines="3" + docs + ├── blog + │   ├── author + │   ├── index.md + │   └── posts + │   ├── draft.md + │   └── myfirst.md + └── index.md + ``` + + Then create a page `docs/blog/author/team.md`: + + ``` + # The Material Team + + A small group of people dedicated to making writing documentation easy, if + not outright fun! Here are some of the things we have blogged about: + ``` + + As you can see, the author index gets appended to the content you have + written in the Markdown file. + +## Pagination + +Once your blog starts growing, you may not want to pay attention to the number +of posts displayed per page. By default, the plugin displays up to 10 posts on +the index pages. You can change this number separately for the main index, +the archive index pages, and the category index pages. + +!!! example "Changing pagination" + + Add five more blog posts, then set the pagination setting to show five per + page only: + + ```yaml hl_lines="7" + - blog: + archive_date_format: MMMM yyyy + categories_allowed: + - Holidays + - News + authors_profiles: true + pagination_per_page: 5 + ``` + + You will see that the pagination setting for archive and category pages + are inherited from the setting you added. If you want to have different + settings for the different index pages, you can specify each setting + separately: + + ```yaml + - blog: + archive_date_format: MMMM yyyy + categories_allowed: + - Holidays + - News + authors_profiles: true + pagination_per_page: 5 + archive_pagination_per_page: 10 + categories_pagination_per_page: 10 + ``` + +## Blog table of contents + +Another thing you may want to do once you have a large enough number of posts +is to turn on the function that produces a table of contents for the blog +index pages, giving your readers the opportunity to quickly scan the content +of each page for something that interests them without having to scroll +(assuming that the number of post per page is not too big). + +!!! example "Turn on the table of contents feature" + + To produce a table of contents for the blog index pages, add the following + to the configuration of the blog plugin: + + ```yaml hl_lines="2" + - blog: + blog_toc: true + archive_date_format: MMMM yyyy + # ... + ``` + +## Custom slugs + +If, for some reason, you are not happy with the way that Material for MkDocs +turns headings into slugs, you can create your own slugify function or you +can manually define a slug for a specific post. + +!!! example "Slugify function" + + To define your own slugify function, you need to write a Python function + that converts text into a slug given additional arguments from the + configuration. You also need to write a function that returns that + function. + + Say you want to define two slugify functions that you can switch between. + The first one returns a slug similar to what the default slugify function + produces. The second one cuts the result of that up into words and returns + a slug based on a maximum of five of them: + + ```python + import re, functools, unicodedata + + RE_HTML_TAGS = re.compile(r'</?[^>]*>', re.UNICODE) + RE_INVALID_SLUG_CHAR = re.compile(r'[^\w\- ]', re.UNICODE) + RE_WHITESPACE = re.compile(r'\s', re.UNICODE) + + def _make_slug(text, sep, **kwargs): + slug = unicodedata.normalize('NFC', text) + slug = RE_HTML_TAGS.sub('', slug) + slug = RE_INVALID_SLUG_CHAR.sub('', slug) + slug = slug.strip().lower() + slug = RE_WHITESPACE.sub(sep, slug) + return slug + + def _make_slug_short(text, sep, **kwargs): + words = _make_slug(text, sep, **kwargs).split(sep) + return sep.join(words[:5]) + + def slugify(**kwargs): + if 'short' in kwargs and kwargs['short']: + return functools.partial(_make_slug_short, **kwargs) + return functools.partial(_make_slug, **kwargs) + ``` + Save this code in `ext/slugs.py` and also add an (empty) `__init__.py` + file to indicate that the directory is a module. Now you can configure + your custom slugify code like this: + + ```yaml hl_lines="4-6" + plugins: + - blog: + # other entries omitted + post_slugify: !!python/object/apply:ext.slugs.slugify + kwds: + short: true + ``` + + Change the heading of a blog post to be longer than five words and observe + how the slugify function shortens the URL. Change the `short` attribute to + `false` and you can turn this off again. + +If you want to influence the slug only for a single blog post, you can define +it manually by specifying it in the header of the post. Note that this is meant +as a last resort option. Specifying a custom slug manually for every post would +be tedious. + +!!! example "Manually define slug" + + If, for example, you wanted the slug to be 'ny-eve' instead of the somewhat + lengthy 'happy-new-years-eve', you could add the following: + + ```hl_lines="7" + --- + date: + created: 2023-12-31 + updated: 2024-01-02 + readtime: 15 + pin: true + slug: ny-eve + --- + ``` + + The URL for this post should now be + `http://localhost:8000/blog/2023/01/31/ny-eve/`. + +## What's next? + +You may want to increase engagement with your blog by allowing people to +subscribe to an RSS feed, by providing links to your social media profiles, by +providing share and like buttons, or by setting up a comment system. +The [engagement and dissemination tutorial] walks you through setting these up. + +[engagement and dissemination tutorial]: engage.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/index.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/index.md new file mode 100644 index 0000000..cebccc2 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/index.md @@ -0,0 +1,47 @@ +# Tutorials + +In addition to the basic getting started guides, we offer tutorials that aim to +show how you can use Material for MkDocs in different use cases. In contrast to +the getting started guides or the reference documentation, the tutorials show +the breadth of features available in Material for MkDocs but also within +the wider MkDocs ecosystem. + +The tutorials guide you through worked examples, so by following them you should +gain not only an understanding of how to use Material for MkDocs, but also +a template for your own projects. For convenience, these templates are also +available as template repositories on GitHub. + +[public version]: ../getting-started.md +[creating your site]: ../creating-your-site.md + +!!! note "Feedback wanted!" + The tutorials are a recent addition to our documentation and we are still + working out what shape they should have in the end. Please [provide any + feedback you might have in this discussion thread]. + + Note, however, that suggestions should be specific and feasible. We want to + focus on creating more content at the moment, instead of developing a + specific styling or behaviour for the tutorials. If there are worthwhile + improvements that we can make through simple customization then we are happy + to consider those. + +[provide any feedback you might have in this discussion thread]: https://github.com/squidfunk/mkdocs-material/discussions/7220 + +## Blogs +* [Basics](blogs/basic.md) (20 min) <br/> + covers the basics of setting up a blog, including post metadata. +* [Navigation, pagination, multiple authors](blogs/navigation.md) (30 min)<br/> + describes how to make it easier for your readers to find content. +* [Engagement and dissemination](blogs/engage.md) (30 min)<br/> + walks you through ways of increasing engagement with your content. + +[:octicons-repo-template-24: Template Repository](https://github.com/mkdocs-material/create-blog) + +## Social cards +* [Basics](social/basic.md) (20 min) <br/> + shows you how to configure Material for MkDocs to create social cards for + your content. +* [Custom cards](social/custom.md) (15 min)<br/> + shows you how to design your own custom social cards. + +[:octicons-repo-template-24: Template Repository](https://github.com/mkdocs-material/create-social-cards) diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/social/basic.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/social/basic.md new file mode 100644 index 0000000..3b416b9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/social/basic.md @@ -0,0 +1,199 @@ +# Basic social cards + +Social cards are images that other systems such as social media can display as +a preview for content linked to. It is easy to get started with the social +plugin, true to the motto of Material with MkDocs: "batteries included." + +## Basics + +Before you start, there are just a couple of [dependencies to install]. These +are libraries for image processing that the plugin needs to produce the social +cards, as well as their Python bindings. + +[dependencies to install]: https://squidfunk.github.io/mkdocs-material/plugins/requirements/image-processing/ + +With those prerequisites met, it is simply a matter of activating the plugin, +which will: + +* produce the social cards as PNG images for each page in your site; +* create meta data in the headers of your site's pages that will provide + social media systems with key information and tell them how to find the + social card image. + +!!! example "Add social cards" + + Simply add the social plugin to your list of plugins: + + ```yaml hl_lines="3" + plugins: + - search + - social + - ... + ``` + +Now, when you run `mkdocs build` and look at the `site` directory, you will +see that it contains subfolders under `assets/images/social` that reflect +the structure of your Markdown files. Each page has a corresponding PNG file +that contains the social card image. + +Have a look at the generated HTML and you will see the metadata produced in +the `head` element, including one entry that points to the image. + +## Background color + +The social plugin has configuration options for changing aspects such as colors, +images, fonts, logos, the title, even the description. You can configure them +for all social cards in the `mkdocs.yml` and, they can be overridden in the page +header for individual pages. + +!!! example "Change the background color" + + To change the background color to an attention-grabbing hot pink, + you might add: + + ```yaml hl_lines="4-5" + plugins: + ... + - social: + cards_layout_options: + background_color: "#ff1493" + ``` + +## Logos + +By default, the plugin uses the logo that you set for the whole site, either +through the `theme.logo` or the `theme.icon.logo` setting. The difference +between the two is that the `theme.icon.logo` version will directly embed the +logo's SVG code into the HTML, allowing it to inherit CSS color settings. When +you use `theme.logo`, the Material includes the logo as an image. + +You can set your own logo specific for the social cards as well. The path used +is relative to your project root and needs to point to an SVG file or a pixel +image. It should be rectangular and have a transparent background. + +!!! example "Set your own logo" + + ```yaml hl_lines="3-4" + plugins: + - social: + cards_layout_options: + logo: docs/assets/images/ourlogo.png + ``` + +## Background images + +In addition to adding your own logo, the most impactful way to personalize your +social cards is to add a background image instead of the default solid color +background. Make sure you choose one that will contrast well with the other +elements of the card. + +Also, the background color gets rendered *on top of* the background image, +allowing you to use a transparent color to tint an image. To use just the image, +use the color value `transparent`. + +!!! example "Add background image" + + ```yaml hl_lines="4 5" + plugins: + - social: + cards_layout_options: + background_image: layouts/background.png + background_color: transparent + ``` + +The path to the background image is resolved from the root of your project, +so this is where you should make the `layouts` directory and place the +background image. The default site of the social cards included with the plugin +is 1200x630 pixels, so choose an image that size or one that scales well to it. + +## Additional layouts and styles + +The social plugin provides additional layouts as well as the option to configure +different styles for different (kinds of) pages. It comes with a number of +additional layouts for the social cards. For example, the `default/variant` +layout adds a page icon to the card. You can use this to distinguish social +cards visually, depending on what kind of page you are sharing. + +For example, imagine you have a set of pages that advertise events and you want +to include a calendar icon as a visual indication that a card advertises an +event. In the following, you will set up a directory for event pages and use +the meta plugin to assign them a calendar icon. + +!!! example "Social cards for event pages" + + First, create a directory in your `docs` directory to hold the event pages: + + ``` + $ mkdir docs/events + ``` + + Then, add a file `.meta.yml` inside this new directory with settings for + the page icon and a hot pink background color that will stand out on + social media. Note that you can override the background image by setting it + to `null` here since it is not visible anyway because of the opaque coloring. + + ```yaml + --- + icon: material/calendar-plus + social: + cards_layout_options: + background_image: null + background_color: "#ff1493" + --- + ``` + + Now add a page within the `docs/events` directoy. It does not need to have + any special content, just a top level header. + + To turn on the `default/variant` layout in `mkdocs.yml`, add the + `cards_layout` option and also add the meta plugin: + + ```yaml + plugins: + - meta + - social: + cards_layout: default/variant + ``` + + After running `mkdocs build`, you can see that the social card at + `site/assets/images/social/events/index.png` features the page icon. + +Note that the icon will also appear next to the navigation element for the +page. If that is not what you want then you will need to modify the social +card template to gets its icons from another source. You can learn how to +do this in the [custom social cards tutorial](custom.md). + +## Per-page settings + +You can customize the card layout for each page by adding settings to the page +header. You have effectively done this in the previous exercise, but using the +meta plugin to affect a whole set of pages. + +Say that in addition to regular events you also have the odd webinar and +for this you want to set a different icon and also set the description to +indicate that the event is part of the webinar series. + +!!! example "Override card style in page header" + + Add the following to the top of the page in `docs/events` or create a new + one: + + ```yaml + --- + icon: material/web + social: + cards_layout_options: + description: Our Webinar Series + --- + ``` + +## What's next? + +You can also define custom layouts if the configuration options introduced above +as not enough to meet your needs. Continue to the +[custom social cards tutorial](custom.md) if you want to find out how to do this. + +Social cards are particularly useful for blog posts. If you have a blog, +you need to do nothing more than to turn on both plugins to create social cards +to advertise your latest blog posts. If you do not have one yet but would like +to, why not check out the [blog tutorials](../index.md#blogs)? diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/social/custom.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/social/custom.md new file mode 100644 index 0000000..f650fb9 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/tutorials/social/custom.md @@ -0,0 +1,142 @@ +# Custom cards + +The social plugin allows you to define custom layouts for your social cards +to suit your specific needs if the configuration options are not enough. +For example, you may want to define a social card to advertise a new release +of your product. It should have an icon indicating a launch announcement as +well as the version number of the release on the card. + +## Setup + +You can either design a custom layout from scratch or use an existing layout +as the basis that you add to or otherwise modify. In this tutorial, you will +use the default layout as the basis. + +!!! example "Copy default layout to customize" + + Copy the default social card layout from your installation of Material + for MkDocs to a new directory `layouts`. The instructions below assume you + are in your project root and have a virtual environment within this. The + path on your machine, of course, may differ. + + ``` + $ mkdir layouts + $ cp venv/lib/python3.12/site-packages/material/plugins/social/templates/default/variant.yml \ + layouts/release.yml + ``` + + Before customizing the social cards, you need to tell the plugin where to + find them as well as tell MkDocs to watch for any changes. Add the following + to the plugin configuration in your `mkdocs.yml`: + + ``` yaml hl_lines="2-6" + plugins: + - social: + cards_layout_dir: layouts + + watch: + - layouts + ``` + +Have a look at the contents of `release.yml`. You will see that there are: + +* a number of definitions of content pulled from the site, +* definitions of tags that end up in the `meta` elements in the page header + of each page, +* a specification that consists of a number of layers that the social plugin + applies on top of each other in the order in which they are defined. + +## Define page metadata + +In the following, you will add a version number to the social card. This +assumes you have a changelog page with information about each release. +Add the version number of the latest version to the page header (so it does +not need to be parsed out of the Markdown content): + +!!! example "Defining the release data" + + Create a page `docs/changelog.md` with the following content: + + ```yaml + --- + icon: material/rocket-launch-outline + social: + cards_layout: release + cards_layout_options: + title: New release! + latest: 1.2.3 + --- + + # Releases + ``` + +## Extract page metadata + +With the data defined in the page header, you can now add code to the layout +that pulls it out and makes it available to render later on. This is to separate +the data manipulation from the actual layout instructions and so make the +layout file easier to read. + +!!! example "Adding data definitions" + + Add the following at the top of the layout file: + + ```yaml hl_lines="2-9" + definitions: + - &latest >- + {%- if 'latest' in page.meta %} + {{ page.meta['latest']}} + {%- else -%} + No release version data defined! + {%- endif -%} + ``` + +The code presented here checks whether the page header contains the necessary +entries and spits out a message to the social card if not. Unfortunately, there +is no straightforward way to raise an exception or log an error, so the messages +merely appear in the social card produced. + +## Add release version layer + +The next step is to use these data definitions in a new layer and add it to the +ones already present. + +!!! example "Render release version" + + Finally, add the following to end of the custom layout: + + ```yaml + - size: { width: 990, height: 50 } + offset: { x: 50, y: 360 } + typography: + content: *latest + align: start + color: *color + ``` + +You should now see the social plugin use the custom layout on the changelog page +you set up. + +## Adjust layout + +Finally, the rocket icon used for the changelog page is not quite in the right +position. Find the please where the `page_icon` variable is used to create the +page icon layer and adjust the horizontal position to 600 instead of 800. + +!!! tip "Debugging layout files" + + Should you find that your layouts are causing your MkDocs build to fail, + there are a number of things you can do: + + 1. Run Mkdocs with the `--verbose` option to get more detailed reporting. + 2. Comment out things you recently added or that you suspect are the cause + 3. Install the `jinja2` command-line tool with `pip install Jinja2` and + run it over your layout file, for example: `jinja2 event.yml`. + +## What's next? + +If you do not have a blog yet, why not check out the +[blog tutorials](../index.md#blogs) and learn how to set one up? The social +plugin will help you draw attention to your posts on social media. + +Check out the [other tutorials](../index.md) we have prepared for you. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/upgrade.md b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/upgrade.md new file mode 100644 index 0000000..bab2d29 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-docs/upgrade.md @@ -0,0 +1,1965 @@ +# How to upgrade + +Upgrade to the latest version with: + +``` +pip install --upgrade --force-reinstall mkdocs-material +``` + +Show the currently installed version with: + +``` +pip show mkdocs-material +``` + +## Upgrading from 8.x to 9.x + +This major release includes a brand new search implementation that is faster +and allows for rich previews, advanced tokenization and better highlighting. +It was available as part of Insiders for over a year, and now that the funding +goal was hit, makes its way into the community edition. + +### Changes to `mkdocs.yml` + +#### `content.code.copy` + +The copy-to-clipboard buttons are now opt-in and can be enabled or disabled +per block. If you wish to enable them for all code blocks, add the following +lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - content.code.copy +``` + +#### `content.action.*` + +A "view source" button can be shown next to the "edit this page" button, both +of which must now be explicitly enabled. Add the following lines to +`mkdocs.yml`: + +``` yaml +theme: + features: + - content.action.edit + - content.action.view +``` + +#### `navigation.footer` + +The _previous_ and _next_ buttons in the footer are now opt-in. If you wish to +keep them for your documentation, add the following lines to `mkdocs.yml`: + +``` yaml +theme: + features: + - navigation.footer +``` + +#### `theme.language` + +The Korean and Norwegian language codes were renamed, as they were non-standard: + +- `kr` to `ko` +- `no` to `nb` + +#### `feedback.ratings` + +The old, nameless placeholders were removed (after being deprecated for several +months). Make sure to switch to the new named placeholders `{title}` and `{url}`: + +``` +https://github.com/.../issues/new/?title=[Feedback]+{title}+-+{url} +``` + +### Changes to `*.html` files + +The templates have undergone a series of changes. If you have customized +Material for MkDocs with theme extension, be sure to incorporate the latest +changes into your templates. A good starting point is to [inspect the diff]. + +!!! warning "Built-in plugins not working after upgrade?" + + If one of the built-in plugins (search or tags) doesn't work anymore without + any apparent error or cause, it is very likely related to custom overrides. + [MkDocs 1.4.1] and above allow themes to namespace built-in plugins, which + Material for MkDocs 9 now does in order to allow authors to use third-party + plugins with the same name as built-in plugins. Search your overrides for + [`"in config.plugins"`][in config.plugins] and add the `material/` namespace. + Affected partials: + + - [`content.html`][content.html] + - [`header.html`][header.html] + + [inspect the diff]: https://github.com/squidfunk/mkdocs-material/pull/4628/files#diff-3ca112736b9164701b599f34780107abf14bb79fe110c478cac410be90899828 + [MkDocs 1.4.1]: https://github.com/mkdocs/mkdocs/releases/tag/1.4.1 + [in config.plugins]: https://github.com/squidfunk/mkdocs-material/search?q=%22in+config.plugins%22 + [content.html]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/partials/content.html + [header.html]: https://github.com/squidfunk/mkdocs-material/blob/master/src/templates/partials/header.html + +## Upgrading from 7.x to 8.x + +### What's new? + +- Added support for code annotations +- Added support for anchor tracking +- Added support for version warning +- Added `copyright` partial for easier override +- Removed deprecated content tabs legacy implementation +- Removed deprecated `seealso` admonition type +- Removed deprecated `site_keywords` setting (unsupported by MkDocs) +- Removed deprecated prebuilt search index support +- Removed deprecated web app manifest – use customization +- Removed `extracopyright` variable – use new `copyright` partial +- Removed Disqus integration – use customization +- Switched to `:is()` selectors for simple selector lists +- Switched autoprefixer from `last 4 years` to `last 2 years` +- Improved CSS overall to match modern standards +- Improved CSS variable semantics for fonts +- Improved extensibility by restructuring partials +- Improved handling of `details` when printing +- Improved keyboard navigation for footnotes +- Fixed #3214: Search highlighting breaks site when empty + +### Changes to `mkdocs.yml` + +#### `pymdownx.tabbed` + +Support for the legacy style of the [Tabbed] extension was dropped in favor +of the new, alternate implementation which has [better behavior on mobile +viewports]: + +=== "8.x" + + ``` yaml + markdown_extensions: + - pymdownx.tabbed: + alternate_style: true + ``` + +=== "7.x" + + ``` yaml + markdown_extensions: + - pymdownx.tabbed + ``` + + [Tabbed]: setup/extensions/python-markdown-extensions.md#tabbed + [better behavior on mobile viewports]: https://x.com/squidfunk/status/1424740370596958214 + +#### `pymdownx.superfences` + +The `*-experimental` suffix must be removed from the [custom fence][SuperFences] +class property, which is used to target code blocks to be rendered as [diagrams] +using [Mermaid.js]: + +=== "8.x" + + ``` yaml + markdown_extensions: + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + ``` + +=== "7.x" + + ``` yaml + markdown_extensions: + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid-experimental + format: !!python/name:pymdownx.superfences.fence_code_format + ``` + + [SuperFences]: setup/extensions/python-markdown-extensions.md#superfences + [diagrams]: reference/diagrams.md + [Mermaid.js]: https://mermaid-js.github.io/mermaid/ + +#### `google_analytics` + +This option was [deprecated in MkDocs 1.2.0], as the implementation of a +JavaScript-based analytics integration is the responsibility of a theme. +The following lines must be changed: + +=== "8.x" + + ``` yaml + extra: + analytics: + provider: google + property: UA-XXXXXXXX-X + ``` + +=== "7.x" + + ``` yaml + google_analytics: + - UA-XXXXXXXX-X + - auto + ``` + + [deprecated in MkDocs 1.2.0]: https://www.mkdocs.org/about/release-notes/#backward-incompatible-changes-in-12 + +### Changes to `*.html` files { data-search-exclude } + +The templates have undergone a set of changes to make them future-proof. If +you've used theme extension to override a block or template, make sure that it +matches the new structure: + +- If you've overridden a __block__, check `base.html` for potential changes +- If you've overridden a __template__, check the respective `*.html` file for + potential changes + +=== ":octicons-file-code-16: `base.html`" + + ``` diff + @@ -13,11 +13,6 @@ + {% elif config.site_description %} + <meta name="description" content="{{ config.site_description }}"> + {% endif %} + - {% if page and page.meta and page.meta.keywords %} + - <meta name="keywords" content="{{ page.meta.keywords }}"> + - {% elif config.site_keywords %} + - <meta name="keywords" content="{{ config.site_keywords }}"> + - {% endif %} + {% if page and page.meta and page.meta.author %} + <meta name="author" content="{{ page.meta.author }}"> + {% elif config.site_author %} + @@ -61,15 +56,13 @@ + font.text | replace(' ', '+') + ':300,400,400i,700%7C' + + font.code | replace(' ', '+') + }}&display=fallback"> + - <style>:root{--md-text-font-family:"{{ font.text }}";--md-code-font-family:"{{ font.code }}"}</style> + + <style>:root{--md-text-font:"{{ font.text }}";--md-code-font:"{{ font.code }}"}</style> + {% endif %} + {% endblock %} + - {% if config.extra.manifest %} + - <link rel="manifest" href="{{ config.extra.manifest | url }}" crossorigin="use-credentials"> + - {% endif %} + {% for path in config["extra_css"] %} + <link rel="stylesheet" href="{{ path | url }}"> + {% endfor %} + + {% include "partials/javascripts/base.html" %} + {% block analytics %} + {% include "partials/integrations/analytics.html" %} + {% endblock %} + @@ -89,7 +82,6 @@ + <body dir="{{ direction }}"> + {% endif %} + {% set features = config.theme.features or [] %} + - {% include "partials/javascripts/base.html" %} + {% if not config.theme.palette is mapping %} + {% include "partials/javascripts/palette.html" %} + {% endif %} + @@ -106,13 +98,25 @@ + </div> + <div data-md-component="announce"> + {% if self.announce() %} + - <aside class="md-banner md-announce"> + - <div class="md-banner__inner md-announce__inner md-grid md-typeset"> + + <aside class="md-banner"> + + <div class="md-banner__inner md-grid md-typeset"> + {% block announce %}{% endblock %} + </div> + </aside> + {% endif %} + </div> + + {% if config.extra.version %} + + <div data-md-component="outdated" hidden> + + <aside class="md-banner md-banner--warning"> + + {% if self.outdated() %} + + <div class="md-banner__inner md-grid md-typeset"> + + {% block outdated %}{% endblock %} + + </div> + + {% include "partials/javascripts/outdated.html" %} + + {% endif %} + + </aside> + + </div> + + {% endif %} + {% block header %} + {% include "partials/header.html" %} + {% endblock %} + @@ -156,25 +160,7 @@ + <div class="md-content" data-md-component="content"> + <article class="md-content__inner md-typeset"> + {% block content %} + - {% if page.edit_url %} + - <a href="{{ page.edit_url }}" title="{{ lang.t('edit.link.title') }}" class="md-content__button md-icon"> + - {% include ".icons/material/pencil.svg" %} + - </a> + - {% endif %} + - {% if not "\x3ch1" in page.content %} + - <h1>{{ page.title | d(config.site_name, true)}}</h1> + - {% endif %} + - {{ page.content }} + - {% if page and page.meta %} + - {% if page.meta.git_revision_date_localized or + - page.meta.revision_date + - %} + - {% include "partials/source-file.html" %} + - {% endif %} + - {% endif %} + - {% endblock %} + - {% block disqus %} + - {% include "partials/integrations/disqus.html" %} + + {% include "partials/content.html" %} + {% endblock %} + </article> + </div> + ``` + + ``` diff + @@ -38,13 +38,6 @@ + <meta name="description" content="{{ config.site_description }}" /> + {% endif %} + + - <!-- Page keywords --> + - {% if page and page.meta and page.meta.keywords %} + - <meta name="keywords" content="{{ page.meta.keywords }}" /> + - {% elif config.site_keywords %} + - <meta name="keywords" content="{{ config.site_keywords }}" /> + - {% endif %} + - + <!-- Page author --> + {% if page and page.meta and page.meta.author %} + <meta name="author" content="{{ page.meta.author }}" /> + @@ -120,27 +113,21 @@ + /> + <style> + :root { + - --md-text-font-family: "{{ font.text }}"; + - --md-code-font-family: "{{ font.code }}"; + + --md-text-font: "{{ font.text }}"; + + --md-code-font: "{{ font.code }}"; + } + </style> + {% endif %} + {% endblock %} + + - <!-- Progressive Web App Manifest --> + - {% if config.extra.manifest %} + - <link + - rel="manifest" + - href="{{ config.extra.manifest | url }}" + - crossorigin="use-credentials" + - /> + - {% endif %} + - + <!-- Custom style sheets --> + {% for path in config["extra_css"] %} + <link rel="stylesheet" href="{{ path | url }}" /> + {% endfor %} + + + <!-- Helper functions for inline scripts --> + + {% include "partials/javascripts/base.html" %} + + + <!-- Analytics --> + {% block analytics %} + {% include "partials/integrations/analytics.html" %} + @@ -172,7 +159,6 @@ + + <!-- Retrieve features from configuration --> + {% set features = config.theme.features or [] %} + - {% include "partials/javascripts/base.html" %} + + <!-- User preference: color palette --> + {% if not config.theme.palette is mapping %} + @@ -214,14 +200,28 @@ + <!-- Announcement bar --> + <div data-md-component="announce"> + {% if self.announce() %} + - <aside class="md-banner md-announce"> + - <div class="md-banner__inner md-announce__inner md-grid md-typeset"> + + <aside class="md-banner"> + + <div class="md-banner__inner md-grid md-typeset"> + {% block announce %}{% endblock %} + </div> + </aside> + {% endif %} + </div> + + + <!-- Version warning --> + + {% if config.extra.version %} + + <div data-md-component="outdated" hidden> + + <aside class="md-banner md-banner--warning"> + + {% if self.outdated() %} + + <div class="md-banner__inner md-grid md-typeset"> + + {% block outdated %}{% endblock %} + + </div> + + {% include "partials/javascripts/outdated.html" %} + + {% endif %} + + </aside> + + </div> + + {% endif %} + + + <!-- Header --> + {% block header %} + {% include "partials/header.html" %} + @@ -295,49 +295,11 @@ + {% block content %} + - + - <!-- Edit button --> + - {% if page.edit_url %} + - <a + - href="{{ page.edit_url }}" + - title="{{ lang.t('edit.link.title') }}" + - class="md-content__button md-icon" + - > + - {% include ".icons/material/pencil.svg" %} + - </a> + - {% endif %} + - + - <!-- + - Hack: check whether the content contains a h1 headline. If it + - doesn't, the page title (or respectively site name) is used + - as the main headline. + - --> + - {% if not "\x3ch1" in page.content %} + - <h1>{{ page.title | d(config.site_name, true)}}</h1> + - {% endif %} + - + - <!-- Markdown content --> + - {{ page.content }} + - + - <!-- Last update of source file --> + - {% if page and page.meta %} + - {% if page.meta.git_revision_date_localized or + - page.meta.revision_date + - %} + - {% include "partials/source-file.html" %} + - {% endif %} + - {% endif %} + - {% endblock %} + - + - <!-- Disqus integration --> + - {% block disqus %} + - {% include "partials/integrations/disqus.html" %} + + {% include "partials/content.html" %} + {% endblock %} + </article> + </div> + ``` + +=== ":octicons-file-code-16: `partials/copyright.html`" + + ``` diff + @@ -0,0 +1,16 @@ + +{#- + + This file was automatically generated - do not edit + +-#} + +<div class="md-copyright"> + + {% if config.copyright %} + + <div class="md-copyright__highlight"> + + {{ config.copyright }} + + </div> + + {% endif %} + + {% if not config.extra.generator == false %} + + Made with + + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> + + Material for MkDocs + + </a> + + {% endif %} + +</div> + ``` + +=== ":octicons-file-code-16: `partials/footer.html`" + + ``` diff + @@ -41,21 +40,10 @@ + {% endif %} + <div class="md-footer-meta md-typeset"> + <div class="md-footer-meta__inner md-grid"> + - <div class="md-footer-copyright"> + - {% if config.copyright %} + - <div class="md-footer-copyright__highlight"> + - {{ config.copyright }} + - </div> + - {% endif %} + - {% if not config.extra.generator == false %} + - Made with + - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> + - Material for MkDocs + - </a> + - {% endif %} + - {{ extracopyright }} + - </div> + - {% include "partials/social.html" %} + + {% include "partials/copyright.html" %} + + {% if config.extra.social %} + + {% include "partials/social.html" %} + + {% endif %} + </div> + </div> + </footer> + ``` + +=== ":octicons-file-code-16: `partials/social.html`" + + ``` diff + @@ -4,17 +4,15 @@ + -{% if config.extra.social %} + - <div class="md-footer-social"> + - {% for social in config.extra.social %} + - {% set title = social.name %} + - {% if not title and "//" in social.link %} + - {% set _,url = social.link.split("//") %} + - {% set title = url.split("/")[0] %} + - {% endif %} + - <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ title | e }}" class="md-footer-social__link"> + - {% include ".icons/" ~ social.icon ~ ".svg" %} + - </a> + - {% endfor %} + - </div> + -{% endif %} + +<div class="md-social"> + + {% for social in config.extra.social %} + + {% set title = social.name %} + + {% if not title and "//" in social.link %} + + {% set _, url = social.link.split("//") %} + + {% set title = url.split("/")[0] %} + + {% endif %} + + <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ title | e }}" class="md-social__link"> + + {% include ".icons/" ~ social.icon ~ ".svg" %} + + </a> + + {% endfor %} + +</div> + ``` + +## Upgrading from 6.x to 7.x + +### What's new? + +- Added support for deploying multiple versions +- Added support for integrating a language selector +- Added support for rendering admonitions as inline blocks +- Rewrite of the underlying reactive architecture +- Removed Webpack in favor of reactive build strategy (–480 dependencies) +- Fixed keyboard navigation for code blocks after content tabs switch + +### Changes to `mkdocs.yml` + +#### `extra.version.method` + +The versioning method configuration was renamed to `extra.version.provider` to +allow for different versioning strategies in the future: + +=== "7.x" + + ``` yaml + extra: + version: + provider: mike + ``` + +=== "6.x" + + ``` yaml + extra: + version: + method: mike + ``` + +### Changes to `*.html` files { data-search-exclude } + +The templates have undergone a set of changes to make them future-proof. If +you've used theme extension to override a block or template, make sure that it +matches the new structure: + +- If you've overridden a __block__, check `base.html` for potential changes +- If you've overridden a __template__, check the respective `*.html` file for + potential changes + +=== ":octicons-file-code-16: `base.html`" + + ``` diff + @@ -61,7 +61,7 @@ + font.text | replace(' ', '+') + ':300,400,400i,700%7C' + + font.code | replace(' ', '+') + }}&display=fallback"> + - <style>body,input{font-family:"{{ font.text }}",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"{{ font.code }}",SFMono-Regular,Consolas,Menlo,monospace}</style> + + <style>:root{--md-text-font-family:"{{ font.text }}";--md-code-font-family:"{{ font.code }}"}</style> + {% endif %} + {% endblock %} + {% if config.extra.manifest %} + @@ -131,7 +131,7 @@ + {% if page and page.meta and page.meta.hide %} + {% set hidden = "hidden" if "navigation" in page.meta.hide %} + {% endif %} + - <div class="md-sidebar md-sidebar--primary" data-md-component="navigation" {{ hidden }}> + + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" {{ hidden }}> + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + {% include "partials/nav.html" %} + @@ -143,7 +143,7 @@ + {% if page and page.meta and page.meta.hide %} + {% set hidden = "hidden" if "toc" in page.meta.hide %} + {% endif %} + - <div class="md-sidebar md-sidebar--secondary" data-md-component="toc" {{ hidden }}> + + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" {{ hidden }}> + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + {% include "partials/toc.html" %} + @@ -152,7 +152,7 @@ + </div> + {% endif %} + {% endblock %} + - <div class="md-content"> + + <div class="md-content" data-md-component="content"> + <article class="md-content__inner md-typeset"> + {% block content %} + {% if page.edit_url %} + @@ -183,10 +183,18 @@ + {% include "partials/footer.html" %} + {% endblock %} + </div> + - {% block scripts %} + - <script src="{{ 'assets/javascripts/vendor.18f0862e.min.js' | url }}"></script> + - <script src="{{ 'assets/javascripts/bundle.994580cf.min.js' | url }}"></script> + - {%- set translations = {} -%} + + <div class="md-dialog" data-md-component="dialog"> + + <div class="md-dialog__inner md-typeset"></div> + + </div> + + {% block config %} + + {%- set app = { + + "base": base_url, + + "features": features, + + "translations": {}, + + "search": "assets/javascripts/workers/search.217ffd95.min.js" | url, + + "version": config.extra.version or None + + } -%} + + {%- set translations = app.translations -%} + {%- for key in [ + "clipboard.copy", + "clipboard.copied", + @@ -204,19 +212,12 @@ + ] -%} + {%- set _ = translations.update({ key: lang.t(key) }) -%} + {%- endfor -%} + - <script id="__lang" type="application/json"> + - {{- translations | tojson -}} + - </script> + - {% block config %}{% endblock %} + - <script> + - app = initialize({ + - base: "{{ base_url }}", + - features: {{ features or [] | tojson }}, + - search: Object.assign({ + - worker: "{{ 'assets/javascripts/worker/search.9c0e82ba.min.js' | url }}" + - }, typeof search !== "undefined" && search) + - }) + + <script id="__config" type="application/json"> + + {{- app | tojson -}} + </script> + + {% endblock %} + + {% block scripts %} + + <script src="{{ 'assets/javascripts/bundle.926459b3.min.js' | url }}"></script> + {% for path in config["extra_javascript"] %} + <script src="{{ path | url }}"></script> + {% endfor %} + ``` + +=== ":octicons-file-code-16: `partials/footer.html`" + + ``` diff + - <div class="md-footer-nav"> + - <nav class="md-footer-nav__inner md-grid" aria-label="{{ lang.t('footer.title') }}"> + - {% if page.previous_page %} + - <a href="{{ page.previous_page.url | url }}" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev"> + - <div class="md-footer-nav__button md-icon"> + - {% include ".icons/material/arrow-left.svg" %} + - </div> + - <div class="md-footer-nav__title"> + - <div class="md-ellipsis"> + - <span class="md-footer-nav__direction"> + - {{ lang.t("footer.previous") }} + - </span> + - {{ page.previous_page.title }} + - </div> + - </div> + - </a> + - {% endif %} + - {% if page.next_page %} + - <a href="{{ page.next_page.url | url }}" class="md-footer-nav__link md-footer-nav__link--next" rel="next"> + - <div class="md-footer-nav__title"> + - <div class="md-ellipsis"> + - <span class="md-footer-nav__direction"> + - {{ lang.t("footer.next") }} + - </span> + - {{ page.next_page.title }} + - </div> + + <nav class="md-footer__inner md-grid" aria-label="{{ lang.t('footer.title') }}"> + + {% if page.previous_page %} + + <a href="{{ page.previous_page.url | url }}" class="md-footer__link md-footer__link--prev" rel="prev"> + + <div class="md-footer__button md-icon"> + + {% include ".icons/material/arrow-left.svg" %} + + </div> + + <div class="md-footer__title"> + + <div class="md-ellipsis"> + + <span class="md-footer__direction"> + + {{ lang.t("footer.previous") }} + + </span> + + {{ page.previous_page.title }} + </div> + - <div class="md-footer-nav__button md-icon"> + - {% include ".icons/material/arrow-right.svg" %} + + </div> + + </a> + + {% endif %} + + {% if page.next_page %} + + <a href="{{ page.next_page.url | url }}" class="md-footer__link md-footer__link--next" rel="next"> + + <div class="md-footer__title"> + + <div class="md-ellipsis"> + + <span class="md-footer__direction"> + + {{ lang.t("footer.next") }} + + </span> + + {{ page.next_page.title }} + </div> + - </a> + - {% endif %} + - </nav> + - </div> + + </div> + + <div class="md-footer__button md-icon"> + + {% include ".icons/material/arrow-right.svg" %} + + </div> + + </a> + + {% endif %} + + </nav> + {% endif %} + <div class="md-footer-meta md-typeset"> + <div class="md-footer-meta__inner md-grid"> + ``` + +=== ":octicons-file-code-16: `partials/header.html`" + + ``` diff + @@ -6,21 +6,21 @@ + {% set site_url = site_url ~ "/index.html" %} + {% endif %} + <header class="md-header" data-md-component="header"> + - <nav class="md-header-nav md-grid" aria-label="{{ lang.t('header.title') }}"> + - <a href="{{ site_url }}" title="{{ config.site_name | e }}" class="md-header-nav__button md-logo" aria-label="{{ config.site_name }}"> + + <nav class="md-header__inner md-grid" aria-label="{{ lang.t('header.title') }}"> + + <a href="{{ site_url }}" title="{{ config.site_name | e }}" class="md-header__button md-logo" aria-label="{{ config.site_name }}"> + {% include "partials/logo.html" %} + </a> + - <label class="md-header-nav__button md-icon" for="__drawer"> + + <label class="md-header__button md-icon" for="__drawer"> + {% include ".icons/material/menu" ~ ".svg" %} + </label> + - <div class="md-header-nav__title" data-md-component="header-title"> + - <div class="md-header-nav__ellipsis"> + - <div class="md-header-nav__topic"> + + <div class="md-header__title" data-md-component="header-title"> + + <div class="md-header__ellipsis"> + + <div class="md-header__topic"> + <span class="md-ellipsis"> + {{ config.site_name }} + </span> + </div> + - <div class="md-header-nav__topic"> + + <div class="md-header__topic" data-md-component="header-topic"> + <span class="md-ellipsis"> + {% if page and page.meta and page.meta.title %} + {{ page.meta.title }} + @@ -31,14 +31,35 @@ + </div> + </div> + </div> + + <div class="md-header__options"> + + {% if config.extra.alternate %} + + <div class="md-select"> + + {% set icon = config.theme.icon.alternate or "material/translate" %} + + <span class="md-header__button md-icon"> + + {% include ".icons/" ~ icon ~ ".svg" %} + + </span> + + <div class="md-select__inner"> + + <ul class="md-select__list"> + + {% for alt in config.extra.alternate %} + + <li class="md-select__item"> + + <a href="{{ alt.link | url }}" class="md-select__link"> + + {{ alt.name }} + + </a> + + </li> + + {% endfor %} + + </ul> + + </div> + + </div> + + {% endif %} + + </div> + {% if "search" in config["plugins"] %} + - <label class="md-header-nav__button md-icon" for="__search"> + + <label class="md-header__button md-icon" for="__search"> + {% include ".icons/material/magnify.svg" %} + </label> + {% include "partials/search.html" %} + {% endif %} + {% if config.repo_url %} + - <div class="md-header-nav__source"> + + <div class="md-header__source"> + {% include "partials/source.html" %} + </div> + {% endif %} + ``` + +=== ":octicons-file-code-16: `partials/source.html`" + + ``` diff + @@ -4,5 +4,5 @@ + {% import "partials/language.html" as lang with context %} + -<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source"> + +<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source" data-md-component="source"> + <div class="md-source__icon md-icon"> + {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %} + {% include ".icons/" ~ icon ~ ".svg" %} + ``` + +=== ":octicons-file-code-16: `partials/toc.html`" + + ``` diff + @@ -12,7 +12,7 @@ + <span class="md-nav__icon md-icon"></span> + {{ lang.t("toc.title") }} + </label> + - <ul class="md-nav__list" data-md-scrollfix> + + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + {% for toc_item in toc %} + {% include "partials/toc-item.html" %} + {% endfor %} + ``` + +## Upgrading from 5.x to 6.x + +### What's new? + +- Improved search result look and feel +- Improved search result stability while typing +- Improved search result grouping (pages + headings) +- Improved search result relevance and scoring +- Added display of missing query terms to search results +- Reduced size of vendor bundle by 25% (84kb → 67kb) +- Reduced size of the Docker image to improve CI build performance +- Removed hero partial in favor of custom implementation +- Removed deprecated front matter features + +### Changes to `mkdocs.yml` + +Following is a list of changes that need to be made to `mkdocs.yml`. Note that +you only have to adjust the value if you defined it, so if your configuration +does not contain the key, you can skip it. + +#### `theme.features` + +All feature flags that can be set from `mkdocs.yml`, like [tabs] and +[instant loading], are now prefixed with the name of the component or +function they apply to, e.g. `navigation.*`: + +=== "6.x" + + ``` yaml + theme: + features: + - navigation.tabs + - navigation.instant + ``` + +=== "5.x" + + ``` yaml + theme: + features: + - tabs + - instant + ``` + + [tabs]: setup/setting-up-navigation.md#navigation-tabs + [instant loading]: setup/setting-up-navigation.md#instant-loading + +### Changes to `*.html` files { data-search-exclude } + +The templates have undergone a set of changes to make them future-proof. If +you've used theme extension to override a block or template, make sure that it +matches the new structure: + +- If you've overridden a __block__, check `base.html` for potential changes +- If you've overridden a __template__, check the respective `*.html` file for + potential changes + +=== ":octicons-file-code-16: `base.html`" + + ``` diff + @@ -22,13 +22,6 @@ + + {% import "partials/language.html" as lang with context %} + + -<!-- Theme options --> + -{% set palette = config.theme.palette %} + -{% if not palette is mapping %} + - {% set palette = palette | first %} + -{% endif %} + -{% set font = config.theme.font %} + - + <!doctype html> + <html lang="{{ lang.t('language') }}" class="no-js"> + <head> + @@ -45,21 +38,8 @@ + <meta name="description" content="{{ config.site_description }}" /> + {% endif %} + + - <!-- Redirect --> + - {% if page and page.meta and page.meta.redirect %} + - <script> + - var anchor = window.location.hash.substr(1) + - location.href = '{{ page.meta.redirect }}' + + - (anchor ? '#' + anchor : '') + - </script> + - + - <!-- Fallback in case JavaScript is not available --> + - <meta http-equiv="refresh" content="0; url={{ page.meta.redirect }}" /> + - <meta name="robots" content="noindex" /> + - <link rel="canonical" href="{{ page.meta.redirect }}" /> + - + <!-- Canonical --> + - {% elif page.canonical_url %} + + {% if page.canonical_url %} + <link rel="canonical" href="{{ page.canonical_url }}" /> + {% endif %} + + @@ -96,20 +76,21 @@ + <link rel="stylesheet" href="{{ 'assets/stylesheets/main.css' | url }}" /> + + <!-- Extra color palette --> + - {% if palette.scheme or palette.primary or palette.accent %} + + {% if config.theme.palette %} + + {% set palette = config.theme.palette %} + <link + rel="stylesheet" + href="{{ 'assets/stylesheets/palette.css' | url }}" + /> + - {% endif %} + + - <!-- Theme-color meta tag for Android --> + - {% if palette.primary %} + - {% import "partials/palette.html" as map %} + - {% set primary = map.primary( + - palette.primary | replace(" ", "-") | lower + - ) %} + - <meta name="theme-color" content="{{ primary }}" /> + + <!-- Theme-color meta tag for Android --> + + {% if palette.primary %} + + {% import "partials/palette.html" as map %} + + {% set primary = map.primary( + + palette.primary | replace(" ", "-") | lower + + ) %} + + <meta name="theme-color" content="{{ primary }}" /> + + {% endif %} + {% endif %} + {% endblock %} + + @@ -120,7 +101,8 @@ + {% block fonts %} + + <!-- Load fonts from Google --> + - {% if font != false %} + + {% if config.theme.font != false %} + + {% set font = config.theme.font %} + <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin /> + <link + rel="stylesheet" + @@ -169,8 +151,12 @@ + + <!-- Text direction and color palette, if defined --> + {% set direction = config.theme.direction or lang.t('direction') %} + - {% if palette.scheme or palette.primary or palette.accent %} + - {% set scheme = palette.scheme | lower %} + + {% if config.theme.palette %} + + {% set palette = config.theme.palette %} + + {% if not palette is mapping %} + + {% set palette = palette | first %} + + {% endif %} + + {% set scheme = palette.scheme | replace(" ", "-") | lower %} + {% set primary = palette.primary | replace(" ", "-") | lower %} + {% set accent = palette.accent | replace(" ", "-") | lower %} + <body + @@ -179,18 +165,19 @@ + data-md-color-primary="{{ primary }}" + data-md-color-accent="{{ accent }}" + > + + + + <!-- Experimental: set color scheme based on preference --> + + {% if "preference" == scheme %} + + <script> + + if (matchMedia("(prefers-color-scheme: dark)").matches) + + document.body.setAttribute("data-md-color-scheme", "slate") + + </script> + + {% endif %} + + + {% else %} + <body dir="{{ direction }}"> + {% endif %} + + - <!-- Experimental: set color scheme based on preference --> + - {% if "preference" == palette.scheme %} + - <script> + - if (matchMedia("(prefers-color-scheme: dark)").matches) + - document.body.setAttribute("data-md-color-scheme", "slate") + - </script> + - {% endif %} + - + <!-- + State toggles - we need to set autocomplete="off" in order to reset the + drawer on back button invocation in some browsers + @@ -243,15 +230,11 @@ + <div class="md-container" data-md-component="container"> + + <!-- Hero teaser --> + - {% block hero %} + - {% if page and page.meta and page.meta.hero %} + - {% include "partials/hero.html" with context %} + - {% endif %} + - {% endblock %} + + {% block hero %}{% endblock %} + + <!-- Tabs navigation --> + {% block tabs %} + - {% if "tabs" in config.theme.features %} + + {% if "navigation.tabs" in config.theme.features %} + {% include "partials/tabs.html" %} + {% endif %} + {% endblock %} + @@ -310,13 +293,6 @@ + </a> + {% endif %} + + - <!-- Link to source file --> + - {% block source %} + - {% if page and page.meta and page.meta.source %} + - {% include "partials/source-link.html" %} + - {% endif %} + - {% endblock %} + - + <!-- + Hack: check whether the content contains a h1 headline. If it + doesn't, the page title (or respectively site name) is used + @@ -370,7 +346,10 @@ + "search.result.placeholder", + "search.result.none", + "search.result.one", + - "search.result.other" + + "search.result.other", + + "search.result.more.one", + + "search.result.more.other", + + "search.result.term.missing" + ] -%} + {%- set _ = translations.update({ key: lang.t(key) }) -%} + {%- endfor -%} + ``` + +=== ":octicons-file-code-16: `partials/hero.html`" + + ``` diff + @@ -1,12 +0,0 @@ + -{#- + - This file was automatically generated - do not edit + --#} + -{% set class = "md-hero" %} + -{% if "tabs" not in config.theme.features %} + - {% set class = "md-hero md-hero--expand" %} + -{% endif %} + -<div class="{{ class }}" data-md-component="hero"> + - <div class="md-hero__inner md-grid"> + - {{ page.meta.hero }} + - </div> + -</div> + ``` + +=== ":octicons-file-code-16: `partials/source-link`" + + ``` diff + @@ -1,14 +0,0 @@ + -{#- + - This file was automatically generated - do not edit + --#} + -{% import "partials/language.html" as lang with context %} + -{% set repo = config.repo_url %} + -{% if repo | last == "/" %} + - {% set repo = repo[:-1] %} + -{% endif %} + -{% set path = page.meta.path | default("") %} + -<a href="{{ [repo, path, page.meta.source] | join('/') }}" title="{{ page.meta.source }}" class="md-content__button md-icon"> + - {{ lang.t("meta.source") }} + - {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %} + - {% include ".icons/" ~ icon ~ ".svg" %} + -</a> + ``` + +## Upgrading from 4.x to 5.x + +### What's new? + +- Reactive architecture – try `#!js app.dialog$.next("Hi!")` in the console +- [Instant loading] – make Material behave like a Single Page Application +- Improved CSS customization with [CSS variables] – set your brand's colors +- Improved CSS resilience, e.g. proper sidebar locking for customized headers +- Improved [icon integration] and configuration – now including over 5k icons +- Added possibility to use any icon for logo, repository and social links +- Search UI does not freeze anymore (moved to web worker) +- Search index built only once when using instant loading +- Improved extensible keyboard handling +- Support for [prebuilt search indexes] +- Support for displaying stars and forks for GitLab repositories +- Support for scroll snapping of sidebars and search results +- Reduced HTML and CSS footprint due to deprecation of Internet Explorer support +- Slight facelifting of some UI elements (admonitions, tables, ...) + + [CSS variables]: setup/changing-the-colors.md#custom-colors + [icon integration]: reference/icons-emojis.md#search + [prebuilt search indexes]: plugins/search.md + +### Changes to `mkdocs.yml` + +Following is a list of changes that need to be made to `mkdocs.yml`. Note that +you only have to adjust the value if you defined it, so if your configuration +does not contain the key, you can skip it. + +#### `theme.feature` + +Optional features like [tabs] and [instant loading] are now implemented as +flags and can be enabled by listing them in `mkdocs.yml` under `theme.features`: + +=== "5.x" + + ``` yaml + theme: + features: + - tabs + - instant + ``` + +=== "4.x" + + ``` yaml + theme: + feature: + tabs: true + ``` + +#### `theme.logo.icon` + +The logo icon configuration was centralized under `theme.icon.logo` and can now +be set to any of the [icons bundled with the theme][icon integration]: + +=== "5.x" + + ``` yaml + theme: + icon: + logo: material/cloud + ``` + +=== "4.x" + + ``` yaml + theme: + logo: + icon: cloud + ``` + +#### `extra.repo_icon` + +The repo icon configuration was centralized under `theme.icon.repo` and can now +be set to any of the [icons bundled with the theme][icon integration]: + +=== "5.x" + + ``` yaml + theme: + icon: + repo: fontawesome/brands/gitlab + ``` + +=== "4.x" + + ``` yaml + extra: + repo_icon: gitlab + ``` + +#### `extra.search.*` + +Search is now configured as part of the [plugin options]. Note that the +search languages must now be listed as an array of strings and the `tokenizer` +was renamed to `separator`: + +=== "5.x" + + ``` yaml + plugins: + - search: + separator: '[\s\-\.]+' + lang: + - en + - de + - ru + ``` + +=== "4.x" + + ``` yaml + extra: + search: + language: en, de, ru + tokenizer: '[\s\-\.]+' + ``` + + [plugin options]: plugins/search.md + +#### `extra.social.*` + +Social links stayed in the same place, but the `type` key was renamed to `icon` +in order to match the new way of specifying which icon to be used: + +=== "5.x" + + ``` yaml + extra: + social: + - icon: fontawesome/brands/github-alt + link: https://github.com/squidfunk + ``` + +=== "4.x" + + ``` yaml + extra: + social: + - type: github + link: https://github.com/squidfunk + ``` + +### Changes to `*.html` files { data-search-exclude } + +The templates have undergone a set of changes to make them future-proof. If +you've used theme extension to override a block or template, make sure that it +matches the new structure: + +- If you've overridden a __block__, check `base.html` for potential changes +- If you've overridden a __template__, check the respective `*.html` file for + potential changes + +=== ":octicons-file-code-16: `base.html`" + + ``` diff + @@ -4,7 +4,6 @@ + {% import "partials/language.html" as lang with context %} + -{% set feature = config.theme.feature %} + {% set palette = config.theme.palette %} + {% set font = config.theme.font %} + <!doctype html> + @@ -30,19 +29,6 @@ + {% elif config.site_author %} + <meta name="author" content="{{ config.site_author }}"> + {% endif %} + - {% for key in [ + - "clipboard.copy", + - "clipboard.copied", + - "search.language", + - "search.pipeline.stopwords", + - "search.pipeline.trimmer", + - "search.result.none", + - "search.result.one", + - "search.result.other", + - "search.tokenizer" + - ] %} + - <meta name="lang:{{ key }}" content="{{ lang.t(key) }}"> + - {% endfor %} + <link rel="shortcut icon" href="{{ config.theme.favicon | url }}"> + <meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-5.0.0"> + {% endblock %} + @@ -56,9 +42,9 @@ + {% endif %} + {% endblock %} + {% block styles %} + - <link rel="stylesheet" href="{{ 'assets/stylesheets/application.********.css' | url }}"> + + <link rel="stylesheet" href="{{ 'assets/stylesheets/main.********.min.css' | url }}"> + {% if palette.primary or palette.accent %} + - <link rel="stylesheet" href="{{ 'assets/stylesheets/application-palette.********.css' | url }}"> + + <link rel="stylesheet" href="{{ 'assets/stylesheets/palette.********.min.css' | url }}"> + {% endif %} + {% if palette.primary %} + {% import "partials/palette.html" as map %} + @@ -69,20 +55,17 @@ + {% endif %} + {% endblock %} + {% block libs %} + - <script src="{{ 'assets/javascripts/modernizr.********.js' | url }}"></script> + {% endblock %} + {% block fonts %} + {% if font != false %} + <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin> + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family={{ + font.text | replace(' ', '+') + ':300,400,400i,700%7C' + + font.code | replace(' ', '+') + }}&display=fallback"> + <style>body,input{font-family:"{{ font.text }}","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"{{ font.code }}","Courier New",Courier,monospace}</style> + {% endif %} + {% endblock %} + - <link rel="stylesheet" href="{{ 'assets/fonts/material-icons.css' | url }}"> + {% if config.extra.manifest %} + <link rel="manifest" href="{{ config.extra.manifest | url }}" crossorigin="use-credentials"> + {% endif %} + @@ -95,47 +77,50 @@ + {% endblock %} + {% block extrahead %}{% endblock %} + </head> + + {% set direction = config.theme.direction | default(lang.t('direction')) %} + {% if palette.primary or palette.accent %} + {% set primary = palette.primary | replace(" ", "-") | lower %} + {% set accent = palette.accent | replace(" ", "-") | lower %} + - <body dir="{{ lang.t('direction') }}" data-md-color-primary="{{ primary }}" data-md-color-accent="{{ accent }}"> + + <body dir="{{ direction }}" data-md-color-primary="{{ primary }}" data-md-color-accent="{{ accent }}"> + {% else %} + - <body dir="{{ lang.t('direction') }}"> + + <body dir="{{ direction }}"> + {% endif %} + - <svg class="md-svg"> + - <defs> + - {% set platform = config.extra.repo_icon or config.repo_url %} + - {% if "github" in platform %} + - {% include "assets/images/icons/github.f0b8504a.svg" %} + - {% elif "gitlab" in platform %} + - {% include "assets/images/icons/gitlab.6dd19c00.svg" %} + - {% elif "bitbucket" in platform %} + - {% include "assets/images/icons/bitbucket.1b09e088.svg" %} + - {% endif %} + - </defs> + - </svg> + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> + - <label class="md-overlay" data-md-component="overlay" for="__drawer"></label> + + <label class="md-overlay" for="__drawer"></label> + + <div data-md-component="skip"> + + {% if page.toc | first is defined %} + + {% set skip = page.toc | first %} + + <a href="{{ skip.url | url }}" class="md-skip"> + + {{ lang.t('skip.link.title') }} + + </a> + + {% endif %} + + </div> + + <div data-md-component="announce"> + + {% if self.announce() %} + + <aside class="md-announce"> + + <div class="md-announce__inner md-grid md-typeset"> + + {% block announce %}{% endblock %} + + </div> + + </aside> + + {% endif %} + + </div> + {% block header %} + {% include "partials/header.html" %} + {% endblock %} + - <div class="md-container"> + + <div class="md-container" data-md-component="container"> + {% block hero %} + {% if page and page.meta and page.meta.hero %} + {% include "partials/hero.html" with context %} + {% endif %} + {% endblock %} + - {% if feature.tabs %} + - {% include "partials/tabs.html" %} + - {% endif %} + + {% block tabs %} + + {% if "tabs" in config.theme.features %} + + {% include "partials/tabs.html" %} + + {% endif %} + + {% endblock %} + - <main class="md-main" role="main"> + - <div class="md-main__inner md-grid" data-md-component="container"> + + <main class="md-main" data-md-component="main"> + + <div class="md-main__inner md-grid"> + {% block site_nav %} + {% if nav %} + <div class="md-sidebar md-sidebar--primary" data-md-component="navigation"> + @@ -160,41 +141,25 @@ + <article class="md-content__inner md-typeset"> + {% block content %} + {% if page.edit_url %} + - <a href="{{ page.edit_url }}" title="{{ lang.t('edit.link.title') }}" class="md-icon md-content__icon"></a> + + <a href="{{ page.edit_url }}" title="{{ lang.t('edit.link.title') }}" class="md-content__button md-icon"> + + {% include ".icons/material/pencil.svg" %} + + </a> + {% endif %} + + {% block source %} + + {% if page and page.meta and page.meta.source %} + + {% include "partials/source-link.html" %} + + {% endif %} + + {% endblock %} + {% if not "\x3ch1" in page.content %} + <h1>{{ page.title | default(config.site_name, true)}}</h1> + {% endif %} + {{ page.content }} + - {% block source %} + - {% if page and page.meta and page.meta.source %} + - <h2 id="__source">{{ lang.t("meta.source") }}</h2> + - {% set repo = config.repo_url %} + - {% if repo | last == "/" %} + - {% set repo = repo[:-1] %} + - {% endif %} + - {% set path = page.meta.path | default([""]) %} + - {% set file = page.meta.source %} + - <a href="{{ [repo, path, file] | join('/') }}" title="{{ file }}" class="md-source-file"> + - {{ file }} + - </a> + - {% endif %} + - {% endblock %} + + {% if page and page.meta %} + + {% if page.meta.git_revision_date_localized or + + page.meta.revision_date + + %} + + {% include "partials/source-date.html" %} + - {% if page and page.meta and ( + - page.meta.git_revision_date_localized or + - page.meta.revision_date + - ) %} + - {% set label = lang.t("source.revision.date") %} + - <hr> + - <div class="md-source-date"> + - <small> + - {% if page.meta.git_revision_date_localized %} + - {{ label }}: {{ page.meta.git_revision_date_localized }} + - {% elif page.meta.revision_date %} + - {{ label }}: {{ page.meta.revision_date }} + - {% endif %} + - </small> + - </div> + {% endif %} + {% endblock %} + {% block disqus %} + @@ -208,29 +174,35 @@ + {% include "partials/footer.html" %} + {% endblock %} + </div> + {% block scripts %} + - <script src="{{ 'assets/javascripts/application.********.js' | url }}"></script> + - {% if lang.t("search.language") != "en" %} + - {% set languages = lang.t("search.language").split(",") %} + - {% if languages | length and languages[0] != "" %} + - {% set path = "assets/javascripts/lunr/" %} + - <script src="{{ (path ~ 'lunr.stemmer.support.js') | url }}"></script> + - {% for language in languages | map("trim") %} + - {% if language != "en" %} + - {% if language == "ja" %} + - <script src="{{ (path ~ 'tinyseg.js') | url }}"></script> + - {% endif %} + - {% if language in ("ar", "da", "de", "es", "fi", "fr", "hu", "it", "ja", "nl", "no", "pt", "ro", "ru", "sv", "th", "tr", "vi") %} + - <script src="{{ (path ~ 'lunr.' ~ language ~ '.js') | url }}"></script> + - {% endif %} + - {% endif %} + - {% endfor %} + - {% if languages | length > 1 %} + - <script src="{{ (path ~ 'lunr.multi.js') | url }}"></script> + - {% endif %} + - {% endif %} + - {% endif %} + - <script>app.initialize({version:"{{ mkdocs_version }}",url:{base:"{{ base_url }}"}})</script> + + <script src="{{ 'assets/javascripts/vendor.********.min.js' | url }}"></script> + + <script src="{{ 'assets/javascripts/bundle.********.min.js' | url }}"></script> + + {%- set translations = {} -%} + + {%- for key in [ + + "clipboard.copy", + + "clipboard.copied", + + "search.config.lang", + + "search.config.pipeline", + + "search.config.separator", + + "search.result.placeholder", + + "search.result.none", + + "search.result.one", + + "search.result.other" + + ] -%} + + {%- set _ = translations.update({ key: lang.t(key) }) -%} + + {%- endfor -%} + + <script id="__lang" type="application/json"> + + {{- translations | tojson -}} + + </script> + + {% block config %}{% endblock %} + + <script> + + app = initialize({ + + base: "{{ base_url }}", + + features: {{ config.theme.features | tojson }}, + + search: Object.assign({ + + worker: "{{ 'assets/javascripts/worker/search.********.min.js' | url }}" + + }, typeof search !== "undefined" && search) + + }) + + </script> + {% for path in config["extra_javascript"] %} + <script src="{{ path | url }}"></script> + {% endfor %} + ``` + +=== ":octicons-file-code-16: `partials/footer.html`" + + ``` diff + @@ -5,34 +5,34 @@ + <div class="md-footer-nav"> + - <nav class="md-footer-nav__inner md-grid"> + + <nav class="md-footer-nav__inner md-grid" aria-label="{{ lang.t('footer.title') }}"> + {% if page.previous_page %} + - <a href="{{ page.previous_page.url | url }}" title="{{ page.previous_page.title | striptags }}" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev"> + - <div class="md-flex__cell md-flex__cell--shrink"> + - <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i> + + <a href="{{ page.previous_page.url | url }}" title="{{ page.previous_page.title | striptags }}" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev"> + + <div class="md-footer-nav__button md-icon"> + + {% include ".icons/material/arrow-left.svg" %} + </div> + - <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"> + - <span class="md-flex__ellipsis"> + + <div class="md-footer-nav__title"> + + <div class="md-ellipsis"> + <span class="md-footer-nav__direction"> + {{ lang.t("footer.previous") }} + </span> + {{ page.previous_page.title }} + - </span> + + </div> + </div> + </a> + {% endif %} + {% if page.next_page %} + - <a href="{{ page.next_page.url | url }}" title="{{ page.next_page.title | striptags }}" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next"> + - <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"> + - <span class="md-flex__ellipsis"> + + <a href="{{ page.next_page.url | url }}" title="{{ page.next_page.title | striptags }}" class="md-footer-nav__link md-footer-nav__link--next" rel="next"> + + <div class="md-footer-nav__title"> + + <div class="md-ellipsis"> + <span class="md-footer-nav__direction"> + {{ lang.t("footer.next") }} + </span> + {{ page.next_page.title }} + - </span> + + </div> + </div> + - <div class="md-flex__cell md-flex__cell--shrink"> + - <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i> + + <div class="md-footer-nav__button md-icon"> + + {% include ".icons/material/arrow-right.svg" %} + </div> + </a> + {% endif %} + ``` + +=== ":octicons-file-code-16: `partials/header.html`" + + ``` diff + @@ -4,51 +4,43 @@ + <header class="md-header" data-md-component="header"> + - <nav class="md-header-nav md-grid"> + - <div class="md-flex"> + - <div class="md-flex__cell md-flex__cell--shrink"> + - <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" aria-label="{{ config.site_name }}" class="md-header-nav__button md-logo"> + - {% if config.theme.logo.icon %} + - <i class="md-icon">{{ config.theme.logo.icon }}</i> + - {% else %} + - <img alt="logo" src="{{ config.theme.logo | url }}" width="24" height="24"> + - {% endif %} + - </a> + - </div> + - <div class="md-flex__cell md-flex__cell--shrink"> + - <label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label> + - </div> + - <div class="md-flex__cell md-flex__cell--stretch"> + - <div class="md-flex__ellipsis md-header-nav__title" data-md-component="title"> + - {% if config.site_name == page.title %} + - {{ config.site_name }} + - {% else %} + - <span class="md-header-nav__topic"> + - {{ config.site_name }} + - </span> + - <span class="md-header-nav__topic"> + - {% if page and page.meta and page.meta.title %} + - {{ page.meta.title }} + - {% else %} + - {{ page.title }} + - {% endif %} + - </span> + - {% endif %} + + <nav class="md-header-nav md-grid" aria-label="{{ lang.t('header.title') }}"> + + <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" class="md-header-nav__button md-logo" aria-label="{{ config.site_name }}"> + + {% include "partials/logo.html" %} + + </a> + + <label class="md-header-nav__button md-icon" for="__drawer"> + + {% include ".icons/material/menu" ~ ".svg" %} + + </label> + + <div class="md-header-nav__title" data-md-component="header-title"> + + {% if config.site_name == page.title %} + + <div class="md-header-nav__ellipsis md-ellipsis"> + + {{ config.site_name }} + </div> + - </div> + - <div class="md-flex__cell md-flex__cell--shrink"> + - {% if "search" in config["plugins"] %} + - <label class="md-icon md-icon--search md-header-nav__button" for="__search"></label> + - {% include "partials/search.html" %} + - {% endif %} + - </div> + - {% if config.repo_url %} + - <div class="md-flex__cell md-flex__cell--shrink"> + - <div class="md-header-nav__source"> + - {% include "partials/source.html" %} + - </div> + + {% else %} + + <div class="md-header-nav__ellipsis"> + + <span class="md-header-nav__topic md-ellipsis"> + + {{ config.site_name }} + + </span> + + <span class="md-header-nav__topic md-ellipsis"> + + {% if page and page.meta and page.meta.title %} + + {{ page.meta.title }} + + {% else %} + + {{ page.title }} + + {% endif %} + + </span> + </div> + {% endif %} + </div> + + {% if "search" in config["plugins"] %} + + <label class="md-header-nav__button md-icon" for="__search"> + + {% include ".icons/material/magnify.svg" %} + + </label> + + {% include "partials/search.html" %} + + {% endif %} + + {% if config.repo_url %} + + <div class="md-header-nav__source"> + + {% include "partials/source.html" %} + + </div> + + {% endif %} + </nav> + </header> + ``` + +=== ":octicons-file-code-16: `partials/hero.html`" + + ``` diff + @@ -4,9 +4,8 @@ + -{% set feature = config.theme.feature %} + {% set class = "md-hero" %} + -{% if not feature.tabs %} + +{% if "tabs" not in config.theme.features %} + {% set class = "md-hero md-hero--expand" %} + {% endif %} + <div class="{{ class }}" data-md-component="hero"> + ``` + +=== ":octicons-file-code-16: `partials/language.html`" + + ``` diff + @@ -4,12 +4,4 @@ + {% import "partials/language/" + config.theme.language + ".html" as lang %} + {% import "partials/language/en.html" as fallback %} + -{% macro t(key) %}{{ { + - "direction": config.theme.direction, + - "search.language": ( + - config.extra.search | default({}) + - ).language, + - "search.tokenizer": ( + - config.extra.search | default({}) + - ).tokenizer | default("", true), + -}[key] or lang.t(key) or fallback.t(key) }}{% endmacro %} + +{% macro t(key) %}{{ lang.t(key) | default(fallback.t(key)) }}{% endmacro %} + ``` + +=== ":octicons-file-code-16: `partials/logo.html`" + + ``` diff + @@ -0,0 +1,9 @@ + +{#- + + This file was automatically generated - do not edit + +-#} + +{% if config.theme.logo %} + + <img src="{{ config.theme.logo | url }}" alt="logo"> + +{% else %} + + {% set icon = config.theme.icon.logo or "material/library" %} + + {% include ".icons/" ~ icon ~ ".svg" %} + +{% endif %} + ``` + +=== ":octicons-file-code-16: `partials/nav-item.html`" + + ``` diff + @@ -14,9 +14,15 @@ + {% endif %} + <label class="md-nav__link" for="{{ path }}"> + {{ nav_item.title }} + + <span class="md-nav__icon md-icon"> + + {% include ".icons/material/chevron-right.svg" %} + + </span> + </label> + - <nav class="md-nav" data-md-component="collapsible" data-md-level="{{ level }}"> + + <nav class="md-nav" aria-label="{{ nav_item.title }}" data-md-level="{{ level }}"> + <label class="md-nav__title" for="{{ path }}"> + + <span class="md-nav__icon md-icon"> + + {% include ".icons/material/arrow-left.svg" %} + + </span> + {{ nav_item.title }} + </label> + <ul class="md-nav__list" data-md-scrollfix> + @@ -39,6 +45,9 @@ + {% if toc | first is defined %} + <label class="md-nav__link md-nav__link--active" for="__toc"> + {{ nav_item.title }} + + <span class="md-nav__icon md-icon"> + + {% include ".icons/material/table-of-contents.svg" %} + + </span> + </label> + {% endif %} + <a href="{{ nav_item.url | url }}" title="{{ nav_item.title | striptags }}" class="md-nav__link md-nav__link--active"> + ``` + +=== ":octicons-file-code-16: `partials/nav.html`" + + ``` diff + @@ -4,14 +4,10 @@ + -<nav class="md-nav md-nav--primary" data-md-level="0"> + - <label class="md-nav__title md-nav__title--site" for="__drawer"> + - <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" class="md-nav__button md-logo"> + - {% if config.theme.logo.icon %} + - <i class="md-icon">{{ config.theme.logo.icon }}</i> + - {% else %} + - <img alt="logo" src="{{ config.theme.logo | url }}" width="48" height="48"> + - {% endif %} + +<nav class="md-nav md-nav--primary" aria-label="{{ lang.t('nav.title') }}" data-md-level="0"> + + <label class="md-nav__title" for="__drawer"> + + <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" class="md-nav__button md-logo" aria-label="{{ config.site_name }}"> + + {% include "partials/logo.html" %} + </a> + {{ config.site_name }} + </label> + ``` + +=== ":octicons-file-code-16: `partials/search.html`" + + ``` diff + @@ -6,15 +6,18 @@ + <label class="md-search__overlay" for="__search"></label> + <div class="md-search__inner" role="search"> + <form class="md-search__form" name="search"> + - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="{{ lang.t('search.placeholder') }}" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active"> + + <input type="text" class="md-search__input" name="query" aria-label="{{ lang.t('search.placeholder') }}" placeholder="{{ lang.t('search.placeholder') }}" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active"> + <label class="md-search__icon md-icon" for="__search"> + + {% include ".icons/material/magnify.svg" %} + + {% include ".icons/material/arrow-left.svg" %} + </label> + - <button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1"> + -  + + <button type="reset" class="md-search__icon md-icon" aria-label="{{ lang.t('search.reset') }}" data-md-component="search-reset" tabindex="-1"> + + {% include ".icons/material/close.svg" %} + </button> + </form> + <div class="md-search__output"> + <div class="md-search__scrollwrap" data-md-scrollfix> + - <div class="md-search-result" data-md-component="result"> + + <div class="md-search-result" data-md-component="search-result"> + <div class="md-search-result__meta"> + {{ lang.t("search.result.placeholder") }} + </div> + ``` + +=== ":octicons-file-code-16: `partials/social.html`" + + ``` diff + @@ -4,9 +4,12 @@ + {% if config.extra.social %} + <div class="md-footer-social"> + - <link rel="stylesheet" href="{{ 'assets/fonts/font-awesome.css' | url }}"> + {% for social in config.extra.social %} + - <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ social.type }}" class="md-footer-social__link fa fa-{{ social.type }}"></a> + + {% set _,rest = social.link.split("//") %} + + {% set domain = rest.split("/")[0] %} + + <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ domain }}" class="md-footer-social__link"> + + {% include ".icons/" ~ social.icon ~ ".svg" %} + + </a> + {% endfor %} + </div> + {% endif %} + ``` + +=== ":octicons-file-code-16: `partials/source-date.html`" + + ``` diff + @@ -0,0 +1,15 @@ + +{#- + + This file was automatically generated - do not edit + +-#} + +{% import "partials/language.html" as lang with context %} + +{% set label = lang.t("source.revision.date") %} + +<hr> + +<div class="md-source-date"> + + <small> + + {% if page.meta.git_revision_date_localized %} + + {{ label }}: {{ page.meta.git_revision_date_localized }} + + {% elif page.meta.revision_date %} + + {{ label }}: {{ page.meta.revision_date }} + + {% endif %} + + </small> + +</div> + ``` + +=== ":octicons-file-code-16: `partials/source-link.html`" + + ``` diff + @@ -0,0 +1,13 @@ + +{#- + + This file was automatically generated - do not edit + +-#} + +{% import "partials/language.html" as lang with context %} + +{% set repo = config.repo_url %} + +{% if repo | last == "/" %} + + {% set repo = repo[:-1] %} + +{% endif %} + +{% set path = page.meta.path | default([""]) %} + +<a href="{{ [repo, path, page.meta.source] | join('/') }}" title="{{ file }}" class="md-content__button md-icon"> + + {{ lang.t("meta.source") }} + + {% include ".icons/" ~ config.theme.icon.repo ~ ".svg" %} + +</a> + ``` + +=== ":octicons-file-code-16: `partials/source.html`" + + ``` diff + @@ -4,24 +4,11 @@ + {% import "partials/language.html" as lang with context %} + -{% set platform = config.extra.repo_icon or config.repo_url %} + -{% if "github" in platform %} + - {% set repo_type = "github" %} + -{% elif "gitlab" in platform %} + - {% set repo_type = "gitlab" %} + -{% elif "bitbucket" in platform %} + - {% set repo_type = "bitbucket" %} + -{% else %} + - {% set repo_type = "" %} + -{% endif %} + -<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source" data-md-source="{{ repo_type }}"> + - {% if repo_type %} + - <div class="md-source__icon"> + - <svg viewBox="0 0 24 24" width="24" height="24"> + - <use xlink:href="#__{{ repo_type }}" width="24" height="24"></use> + - </svg> + - </div> + - {% endif %} + +<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source"> + + <div class="md-source__icon md-icon"> + + {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %} + + {% include ".icons/" ~ icon ~ ".svg" %} + + </div> + <div class="md-source__repository"> + {{ config.repo_name }} + </div> + ``` + +=== ":octicons-file-code-16: `partials/tabs-item.html`" + + ``` diff + @@ -4,7 +4,7 @@ + -{% if nav_item.is_homepage %} + +{% if nav_item.is_homepage or nav_item.url == "index.html" %} + <li class="md-tabs__item"> + {% if not page.ancestors | length and nav | selectattr("url", page.url) %} + <a href="{{ nav_item.url | url }}" class="md-tabs__link md-tabs__link--active"> + ``` + +=== ":octicons-file-code-16: `partials/tabs.html`" + + ``` diff + @@ -5,7 +5,7 @@ + {% if page.ancestors | length > 0 %} + {% set class = "md-tabs md-tabs--active" %} + {% endif %} + -<nav class="{{ class }}" data-md-component="tabs"> + +<nav class="{{ class }}" aria-label="{{ lang.t('tabs.title') }}" data-md-component="tabs"> + <div class="md-tabs__inner md-grid"> + <ul class="md-tabs__list"> + {% for nav_item in nav %} + ``` + +=== ":octicons-file-code-16: `partials/toc-item.html`" + + ``` diff + @@ -6,7 +6,7 @@ + {{ toc_item.title }} + </a> + {% if toc_item.children %} + - <nav class="md-nav"> + + <nav class="md-nav" aria-label="{{ toc_item.title }}"> + <ul class="md-nav__list"> + {% for toc_item in toc_item.children %} + {% include "partials/toc-item.html" %} + ``` + +=== ":octicons-file-code-16: `partials/toc.html`" + + ``` diff + @@ -4,35 +4,22 @@ + {% import "partials/language.html" as lang with context %} + -<nav class="md-nav md-nav--secondary"> + +<nav class="md-nav md-nav--secondary" aria-label="{{ lang.t('toc.title') }}"> + {% endif %} + {% if toc | first is defined %} + <label class="md-nav__title" for="__toc"> + + <span class="md-nav__icon md-icon"> + + {% include ".icons/material/arrow-left.svg" %} + + </span> + {{ lang.t("toc.title") }} + </label> + <ul class="md-nav__list" data-md-scrollfix> + {% for toc_item in toc %} + {% include "partials/toc-item.html" %} + {% endfor %} + - {% if page.meta.source and page.meta.source | length > 0 %} + - <li class="md-nav__item"> + - <a href="#__source" class="md-nav__link md-nav__link--active"> + - {{ lang.t("meta.source") }} + - </a> + - </li> + - {% endif %} + - {% set disqus = config.extra.disqus %} + - {% if page and page.meta and page.meta.disqus is string %} + - {% set disqus = page.meta.disqus %} + - {% endif %} + - {% if not page.is_homepage and disqus %} + - <li class="md-nav__item"> + - <a href="#__comments" class="md-nav__link md-nav__link--active"> + - {{ lang.t("meta.comments") }} + - </a> + - </li> + - {% endif %} + </ul> + {% endif %} + </nav> + ``` + +## Upgrading from 3.x to 4.x + +### What's new? + +Material for MkDocs 4 fixes incorrect layout on Chinese systems. The fix +includes a mandatory change of the base font-size from `10px` to `20px` which +means all `rem` values needed to be updated. Within the theme, `px` to `rem` +calculation is now encapsulated in a new function called `px2rem` which is part +of the SASS code base. + +If you use Material for MkDocs with custom CSS that is based on `rem` values, +note that those values must now be divided by 2. Now, `1.0rem` doesn't map to +`10px`, but `20px`. To learn more about the problem and implications, please +refer to #911 in which the problem was discovered and fixed. + +### Changes to `mkdocs.yml` + +None. + +### Changes to `*.html` files + +None. diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-mkdocs.yml b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-mkdocs.yml new file mode 100755 index 0000000..6350a24 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-mkdocs.yml @@ -0,0 +1,282 @@ +# Copyright (c) 2016-2025 Martin Donath <martin.donath@squidfunk.com> + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# Project information +site_name: Material for MkDocs +site_url: https://squidfunk.github.io/mkdocs-material/ +site_author: Martin Donath +site_description: >- + Write your documentation in Markdown and create a professional static site in + minutes – searchable, customizable, in 60+ languages, for all devices + +# Repository +repo_name: squidfunk/mkdocs-material +repo_url: https://github.com/squidfunk/mkdocs-material + +# Copyright +copyright: Copyright © 2016 - 2025 Martin Donath + +# Configuration +theme: + name: material + custom_dir: material/overrides + features: + - content.action.edit + - content.action.view + - content.code.annotate + - content.code.copy + # - content.code.select + # - content.footnote.tooltips + # - content.tabs.link + - content.tooltips + # - header.autohide + # - navigation.expand + - navigation.footer + - navigation.indexes + # - navigation.instant + # - navigation.instant.prefetch + # - navigation.instant.progress + # - navigation.prune + - navigation.sections + - navigation.tabs + # - navigation.tabs.sticky + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + # - toc.integrate + palette: + - media: "(prefers-color-scheme)" + toggle: + icon: material/link + name: Switch to light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/toggle-switch + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: black + accent: indigo + toggle: + icon: material/toggle-switch-off + name: Switch to system preference + font: + text: Roboto + code: Roboto Mono + favicon: assets/favicon.png + icon: + logo: logo + +# Plugins +plugins: + - blog + - search: + separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' + - minify: + minify_html: true + +# Hooks +hooks: + - material/overrides/hooks/shortcodes.py + - material/overrides/hooks/translations.py + +# Additional configuration +extra: + status: + new: Recently added + deprecated: Deprecated + analytics: + provider: google + property: !ENV GOOGLE_ANALYTICS_KEY + social: + - icon: fontawesome/brands/github + link: https://github.com/squidfunk + - icon: fontawesome/brands/docker + link: https://hub.docker.com/r/squidfunk/mkdocs-material/ + - icon: fontawesome/brands/python + link: https://pypi.org/project/mkdocs-material/ + - icon: fontawesome/brands/bluesky + link: https://bsky.app/profile/squidfunk.bsky.social + - icon: fontawesome/brands/mastodon + link: https://fosstodon.org/@squidfunk + - icon: fontawesome/brands/x-twitter + link: https://x.com/squidfunk + +# Extensions +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - toc: + permalink: true + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_generator: !!python/name:material.extensions.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.magiclink: + normalize_issue_symbols: true + repo_url_shorthand: true + user: squidfunk + repo: mkdocs-material + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.snippets: + auto_append: + - includes/mkdocs.md + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + combine_header_slug: true + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + +not_in_nav: | + /tutorials/**/*.md + +# Page tree +nav: + - Home: index.md + - Getting started: + - Installation: getting-started.md + - Creating your site: creating-your-site.md + - Publishing your site: publishing-your-site.md + - Customization: customization.md + - Conventions: conventions.md + - Browser support: browser-support.md + - Philosophy: philosophy.md + - Alternatives: alternatives.md + - License: license.md + - Tutorials: + - tutorials/index.md + - "Blogs": + - tutorials/blogs/basic.md + - tutorials/blogs/navigation.md + - tutorials/blogs/engage.md + - "Social cards": + - tutorials/social/basic.md + - tutorials/social/custom.md + - Changelog: + - changelog/index.md + - How to upgrade: upgrade.md + - Setup: + - setup/index.md + - Changing the colors: setup/changing-the-colors.md + - Changing the fonts: setup/changing-the-fonts.md + - Changing the language: setup/changing-the-language.md + - Changing the logo and icons: setup/changing-the-logo-and-icons.md + - Ensuring data privacy: setup/ensuring-data-privacy.md + - Setting up navigation: setup/setting-up-navigation.md + - Setting up site search: setup/setting-up-site-search.md + - Setting up site analytics: setup/setting-up-site-analytics.md + - Setting up social cards: setup/setting-up-social-cards.md + - Setting up a blog: setup/setting-up-a-blog.md + - Setting up tags: setup/setting-up-tags.md + - Setting up versioning: setup/setting-up-versioning.md + - Setting up the header: setup/setting-up-the-header.md + - Setting up the footer: setup/setting-up-the-footer.md + - Adding a git repository: setup/adding-a-git-repository.md + - Adding a comment system: setup/adding-a-comment-system.md + - Building an optimized site: setup/building-an-optimized-site.md + - Building for offline usage: setup/building-for-offline-usage.md + - Extensions: + - setup/extensions/index.md + - Python Markdown: setup/extensions/python-markdown.md + - Python Markdown Extensions: setup/extensions/python-markdown-extensions.md + - Plugins: + - plugins/index.md + - Blog: plugins/blog.md + - Group: plugins/group.md + - Info: plugins/info.md + - Meta: plugins/meta.md + - Offline: plugins/offline.md + - Optimize: plugins/optimize.md + - Privacy: plugins/privacy.md + - Projects: plugins/projects.md + - Search: plugins/search.md + - Social: plugins/social.md + - Tags: plugins/tags.md + - Typeset: plugins/typeset.md + - Requirements: + - Image processing: plugins/requirements/image-processing.md + - Caching: plugins/requirements/caching.md + - Reference: + - reference/index.md + - Admonitions: reference/admonitions.md + - Annotations: reference/annotations.md + - Buttons: reference/buttons.md + - Code blocks: reference/code-blocks.md + - Content tabs: reference/content-tabs.md + - Data tables: reference/data-tables.md + - Diagrams: reference/diagrams.md + - Footnotes: reference/footnotes.md + - Formatting: reference/formatting.md + - Grids: reference/grids.md + - Icons, Emojis: reference/icons-emojis.md + - Images: reference/images.md + - Lists: reference/lists.md + - Math: reference/math.md + - Tooltips: reference/tooltips.md + - Insiders: + - insiders/index.md + - Getting started: insiders/getting-started.md + - Changelog: + - insiders/changelog/index.md + - How to upgrade: insiders/upgrade.md + - Community: + - Contributing: + - contributing/index.md + - Reporting a bug: contributing/reporting-a-bug.md + - Reporting a docs issue: contributing/reporting-a-docs-issue.md + - Requesting a change: contributing/requesting-a-change.md + - Adding translations: contributing/adding-translations.md + - Making a pull request: contributing/making-a-pull-request.md + - Asking a question: https://github.com/squidfunk/mkdocs-material/discussions + - Guides: + - Creating a reproduction: guides/creating-a-reproduction.md + - Blog: + - blog/index.md diff --git a/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-schema.json b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-schema.json new file mode 100644 index 0000000..24bef89 --- /dev/null +++ b/.ai/skills/mkdocs/references/upstream/mkdocs-material-9.7.1-schema.json @@ -0,0 +1,188 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Material for MkDocs", + "markdownDescription": "Configuration", + "type": "object", + "properties": { + "INHERIT": { + "title": "Inherit from configuration", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance", + "pattern": "\\.yml$" + }, + "site_name": { + "title": "Site name, used in header, title and drawer", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_name", + "type": "string" + }, + "site_url": { + "title": "Site URL", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_url", + "type": "string" + }, + "site_author": { + "title": "Site author, used in document head", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_author", + "type": "string" + }, + "site_description": { + "title": "Site description, used in document head and in social cards", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_description", + "type": "string" + }, + "repo_name": { + "title": "Repository name, used in header", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository-name", + "type": "string" + }, + "repo_url": { + "title": "Repository URL", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository", + "type": "string" + }, + "edit_uri": { + "title": "Path from repository root to directory containing Markdown", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#edit_uri", + "type": "string" + }, + "edit_uri_template": { + "title": "More flexible variant of edit_uri", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#edit_uri_template", + "type": "string" + }, + "copyright": { + "title": "Copyright, used in footer", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#copyright-notice", + "type": "string" + }, + "docs_dir": { + "title": "Directory containing the Markdown sources", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#docs_dir", + "type": "string", + "default": "docs" + }, + "site_dir": { + "title": "Directory containing the HTML output", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_dir", + "type": "string", + "default": "site" + }, + "use_directory_urls": { + "title": "Pages are located in their own directories", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#use_directory_urls", + "type": "boolean", + "default": false + }, + "extra_templates": { + "title": "Additional HTML files to include", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_css": { + "title": "Additional CSS files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "pattern": "\\.css($|\\?)" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_javascript": { + "title": "Additional JavaScript files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript", + "type": "array", + "items": { + "title": "Path to JavaScript file (may be local or absolute URL to external JS)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript" + }, + "uniqueItems": true, + "minItems": 1 + }, + "hooks": { + "title": "Hooks", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#hooks", + "type": "array", + "items": { + "title": "Path to Python file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#hooks", + "pattern": "\\.py$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "strict": { + "title": "Strict mode", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#strict", + "type": "boolean", + "default": false + }, + "dev_addr": { + "title": "Development IP Address", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#dev_addr", + "type": "string", + "default": "127.0.0.1:8000" + }, + "remote_branch": { + "title": "Remote branch to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_branch", + "type": "string", + "default": "gh-pages" + }, + "remote_name": { + "title": "Remote origin to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_name", + "type": "string", + "default": "origin" + }, + "theme": { + "$ref": "schema/theme.json" + }, + "plugins": { + "$ref": "schema/plugins.json" + }, + "markdown_extensions": { + "$ref": "schema/extensions.json" + }, + "extra": { + "$ref": "schema/extra.json" + }, + "nav": { + "$ref": "schema/nav.json" + }, + "validation": { + "$ref": "schema/validation.json" + }, + "exclude_docs": { + "title": "Pattern to declare files to exclude from build", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#exclude_docs", + "type": "string" + }, + "draft_docs": { + "title": "Pattern to declare draft documents", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#draft_docs", + "type": "string" + }, + "not_in_nav": { + "title": "Pattern to declare pages that do not appear in the navigation", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#not_in_nav", + "type": "string" + }, + "watch": { + "items": { + "title": "Path to watch for changes", + "type": "string" + }, + "type": "array" + } + }, + "additionalProperties": false +} diff --git a/.ai/skills/nonprofit/SKILL.md b/.ai/skills/nonprofit/SKILL.md new file mode 100644 index 0000000..ac00299 --- /dev/null +++ b/.ai/skills/nonprofit/SKILL.md @@ -0,0 +1,80 @@ +--- +name: nonprofit +description: Use this skill for nonprofit corporate governance drafting and review, especially when working on bylaws, board structure, member versus no-member governance, Illinois nonprofit law references, or 501(c)(3)-style organizational language using the local materials in this repository. +--- + +# Nonprofit Governance + +Use this skill when the task is about nonprofit bylaws, governance structure, or adapting governance language from local reference documents. + +## When To Use + +- Use this skill when drafting or revising nonprofit bylaws, articles-adjacent governance language, or internal governance policies. +- Use this skill when reviewing board powers, officer roles, meeting procedures, quorum, vacancies, removal, or amendment provisions for a nonprofit. +- Use this skill when the user wants language grounded in the Illinois not-for-profit framework or in the local sample bylaws stored in this repository. +- Use this skill when deciding whether the organization should be member-governed or board-governed with no statutory members. + +## Scope + +This skill is a local drafting and review aid, not a substitute for legal advice. + +- Prefer the local reference materials over memory when the user wants citation-backed drafting or comparison. +- Treat the Illinois statute excerpt as the controlling local legal reference among the files in this folder. +- Treat the sample bylaws as models to adapt, not boilerplate to copy blindly. + +## References + +- `references/805-ILCS-105.md`: excerpted Illinois General Not For Profit Corporation Act provisions focused on members, meetings, voting, proxies, quorum, records, and related governance mechanics. +- `references/bylaws-of-revolution-working.md`: example Illinois no-member 501(c)(3) bylaws with board-governed structure. +- `references/non-profit-sample.md`: broader sample nonprofit bylaws template with placeholders and optional affiliate/member-style provisions. + +Load only the reference file(s) needed for the current task. + +## Workflow + +1. Identify the governance model the draft is trying to implement: + no members, voting members, non-voting affiliates, or mixed structures. +2. Read the minimum local reference material needed for that model. +3. Separate mandatory governance mechanics from optional drafting choices. +4. Draft or revise language so the document is internally consistent: + membership clauses, board powers, officer provisions, meeting rules, quorum, voting, and amendment rules should not conflict. +5. If borrowing from a sample, normalize terminology and cross-references so the final document reads as one instrument rather than pasted sections. +6. Flag places where legal review is prudent, especially when the draft departs from the statute excerpt or mixes member and no-member concepts. + +## Drafting Rules + +- Decide early whether the corporation has members. Do not mix "no members" language with member voting provisions unless the distinction is explicit and intentional. +- Keep the board article aligned with the membership model. If the corporation has no members, directors typically exercise powers otherwise assigned to members under the statute and bylaws. +- Preserve 501(c)(3)-style limits when the organization is meant to be tax-exempt: + no private inurement, limits on political activity, and appropriate dissolution language. +- Use one consistent term for the governing body and its officers throughout the draft. +- Check meeting, notice, quorum, voting, proxy, and written-consent provisions as a set; these clauses commonly drift out of alignment. +- Treat sample officer and committee structures as optional. Tailor them to the organization instead of inheriting every office or committee by default. +- Remove placeholders, bracketed text, duplicated concepts, and state-law assumptions that do not match the target organization. + +## Illinois-Focused Review Points + +When using the Illinois excerpt, pay particular attention to: + +- whether the bylaws expressly state that the corporation has no members or define member classes and rights; +- who may call meetings and what notice is required; +- whether remote participation, electronic ballots, proxies, or written/electronic consents are allowed; +- quorum thresholds and whether the draft overrides statutory defaults; +- books and records provisions for voting members; and +- whether the draft's voting provisions match the intended governance model. + +## Output Pattern + +For drafting or revision tasks, prefer: + +1. the chosen governance model; +2. the revised language or proposed article structure; +3. short notes on why the language fits the local references; and +4. any issues that should be reviewed by counsel or by the organization before adoption. + +## What Not To Do + +- Do not present local sample language as universally correct for every nonprofit. +- Do not assume a generic sample matches Illinois law without checking the Illinois reference first. +- Do not leave hidden conflicts between membership, board authority, and voting provisions. +- Do not copy placeholder text or organization-specific facts from the samples into the final draft. diff --git a/.ai/skills/nonprofit/references/805-ILCS-105.md b/.ai/skills/nonprofit/references/805-ILCS-105.md new file mode 100644 index 0000000..4934a69 --- /dev/null +++ b/.ai/skills/nonprofit/references/805-ILCS-105.md @@ -0,0 +1,117 @@ +Illinois Compiled Statutes (ILCS) + +Updating the database of the Illinois Compiled Statutes (ILCS) is an ongoing process. Recent laws may not yet be included in the ILCS database, but they are found on this site as [Public Acts](/legislation/publicacts/) soon after they become law. For information concerning the relationship between statutes and Public Acts, refer to the [Guide](/Legislation/ILCS/Guide). + +Because the statute database is maintained primarily for legislative drafting purposes, statutory changes are sometimes included in the statute database before they take effect. If the source note at the end of a Section of the statutes includes a Public Act that has not yet taken effect, the version of the law that is currently in effect may have already been removed from the database and you should refer to that Public Act to see the changes made to the current law. + + +(805 ILCS 105/) General Not For Profit Corporation Act of 1986. + +(805 ILCS 105/Art. 7 heading) + +ARTICLE 7. MEMBERS + +(805 ILCS 105/107.03) (from Ch. 32, par. 107.03) +Sec. 107.03. Members. +(a) A corporation may have one or more classes of members or may have no members. +(b) If the corporation has one or more classes of members, the designation of the class or classes and the qualifications and rights of the members of each class shall be set forth in the articles of incorporation or the bylaws. The articles of incorporation or the bylaws may provide for representatives or delegates of members and may establish their qualifications and rights. +(c) If the corporation is to have no members, that fact shall be set forth in the articles of incorporation or the bylaws. +(d) A corporation may issue certificate evidencing membership therein. +(e) The transfer of a certificate of membership in a not-for-profit corporation in which assets are held for a charitable, religious, eleemosynary, benevolent or educational purpose, shall be without payment of any consideration of money or property of any kind or value to the transferor in respect to such transfer. Any transfer in violation of this Section shall be void. +(f) Where the articles of incorporation or bylaws provide that a corporation shall have no members, or where a corporation has under its articles of incorporation, bylaws or in fact no members entitled to vote on a matter, any provision of this Act requiring notice to, the presence of, or the vote, consent or other action by members of the corporation in connection with such matter shall be satisfied by notice to, the presence of, or the vote, consent or other action of the directors of the corporation. +(g) A residential cooperative not-for-profit corporation containing 50 or more single family units with individual unit legal descriptions based upon a recorded plat of a subdivision and located in a county with a population between 780,000 and 3,000,000 shall specifically set forth the qualifications and rights of its members in the Articles of Incorporation and the bylaws. +(Source: P.A. 91-465, eff. 8-6-99.) + +(805 ILCS 105/107.05) (from Ch. 32, par. 107.05) +Sec. 107.05. Meeting of members. +(a) Meetings of members may be held either within or without this State, as may be provided in the bylaws or in a resolution of the board of directors pursuant to authority granted in the bylaws. In the absence of any such provision, all meetings shall be held at the registered office of the corporation in this State. +(b) An annual meeting of the members entitled to vote may be held at such time as may be provided in the bylaws or in a resolution of the board of directors pursuant to authority granted in the bylaws. Failure to hold the annual meeting at the designated time shall not work a forfeiture or dissolution of the corporation nor affect the validity of corporate action. If an annual meeting has not been held within the earlier of six months after the end of the corporation's fiscal year or fifteen months after its last annual meeting and if, after a request in writing directed to the president of the corporation, a notice of meeting is not delivered to members entitled to vote within 60 days of such request, then any member entitled to vote at an annual meeting may apply to the circuit court of the county in which the registered office or principal place of business of the corporation is located for an order directing that the meeting be held and fixing the time and place of the meeting. The court may issue such additional orders as may be necessary or appropriate for the holding of the meeting. +(c) Special meetings of the members may be called by the president or by the board of directors. Special meetings of the members may also be called by such other officers or persons or number or proportion of members entitled to vote as may be provided in the articles of incorporation or the bylaws. In the absence of a provision fixing the number or proportion of members entitled to vote who are entitled to call a meeting, a special meeting of members entitled to vote may be called by such members having one-twentieth of the votes entitled to be cast at such meeting. +(d) Unless specifically prohibited by the articles of incorporation or bylaws, a corporation may allow members entitled to vote to participate in and act at any meeting through the use of a conference telephone or interactive technology, including but not limited to electronic transmission, Internet usage, or remote communication, by means of which all persons participating in the meeting can communicate with each other. Participation in such meeting shall constitute attendance and presence in person at the meeting of the person or persons so participating. +(e) For meetings of a not-for-profit corporation organized for the purpose of residential cooperative housing, consisting of 50 or more single family dwellings with individual unit legal descriptions based upon a recorded plat of a subdivision, and located in a county containing a population between 780,000 and 3,000,000 inhabitants, any member may record by tape, film, or other means the proceedings at the meetings. The board or the membership may prescribe reasonable rules and regulations to govern the making of the recordings. The portion of any meeting held to discuss violations of rules and regulations of the corporation by a residential shareholder shall be recorded only with the affirmative assent of that shareholder. +(Source: P.A. 91-465, eff. 8-6-99; 92-771, eff. 8-6-02.) + +(805 ILCS 105/107.10) (from Ch. 32, par. 107.10) +Sec. 107.10. Informal action by members entitled to vote. +(a) Unless otherwise provided in the articles of incorporation or the bylaws, except for the dissolution of a not-for-profit corporation organized for the purpose of ownership or administration of residential property on a cooperative basis, any action required by this Act to be taken at any annual or special meeting of the members entitled to vote, or any other action which may be taken at a meeting of the members entitled to vote, may be taken by ballot without a meeting in writing by mail, e-mail, or any other electronic means pursuant to which the members entitled to vote thereon are given the opportunity to vote for or against the proposed action, and the action receives approval by a majority of the members casting votes, or such larger number as may be required by the Act, the articles of incorporation, or the bylaws, provided that the number of members casting votes would constitute a quorum if such action had been taken at a meeting. Voting must remain open for not less than 5 days from the date the ballot is delivered; provided, however, in the case of a removal of one or more directors, a merger, consolidation, dissolution or sale, lease or exchange of assets, the voting must remain open for not less than 20 days from the date the ballot is delivered. +(b) Such informal action by members shall become effective only if, at least 5 days prior to the effective date of such informal action, a notice in writing of the proposed action is delivered to all of the members entitled to vote with respect to the subject matter thereof. +(c) In the event that the action which is approved is such as would have required the filing of a certificate under any other Section of this Act if such action had been voted on by the members at a meeting thereof, the certificate filed under such other Section shall state, in lieu of any statement required by such Section concerning any vote of members, that an informal vote has been conducted in accordance with the provisions of this Section and that written notice has been delivered as provided in this Section. +(d) In addition, unless otherwise provided in the articles of incorporation or the bylaws, any action required by this Act to be taken at any annual or special meeting of the members entitled to vote, or any other action which may be taken at a meeting of members entitled to vote, may also be taken without a meeting and without a vote if a consent in writing, setting forth the action so taken, shall be approved by all the members entitled to vote with respect to the subject matter thereof. +(Source: P.A. 98-302, eff. 1-1-14.) + +(805 ILCS 105/107.15) (from Ch. 32, par. 107.15) +Sec. 107.15. Notice of members' meetings. Written notice stating the place, day, and hour of the meeting and, in the case of a special meeting, the purpose or purposes for which the meeting is called, shall be delivered not less than 5 nor more than 60 days before the date of the meeting, or in the case of a removal of one or more directors, a merger, consolidation, dissolution or sale, lease or exchange of assets not less than 20 nor more than 60 days before the date of the meeting, by or at the direction of the president, or the secretary, or the officer or persons calling the meeting, to each member of record entitled to vote at such meeting. A residential cooperative not-for-profit corporation containing 50 or more single family units with individual unit legal descriptions based upon a recorded plat of a subdivision and located in a county with a population between 780,000 and 3,000,000 shall, in addition to the other requirements of this Section, post notice of member's meetings in conspicuous places in the residential cooperative at least 48 hours prior to the meeting of the members. +(Source: P.A. 91-465, eff. 8-6-99.) + +(805 ILCS 105/107.20) (from Ch. 32, par. 107.20) +Sec. 107.20. Waiver of notice. Whenever any notice whatever is required to be given under the provisions of this Act or under the provisions of the articles of incorporation or bylaws of any corporation, a waiver thereof in writing signed by the person or persons entitled to such notice, whether before or after the time stated therein, shall be deemed equivalent to the giving of such notice. Attendance at any meeting shall constitute waiver of notice thereof unless the person at the meeting objects to the holding of the meeting because proper notice was not given. +(Source: P.A. 84-1423.) + +(805 ILCS 105/107.25) (from Ch. 32, par. 107.25) +Sec. 107.25. Fixing record date for voting. For the purpose of determining members entitled to notice of or to vote at any meeting of members, or in order to make a determination of members for any other proper purpose, the board of directors of a corporation may fix in advance a date as the record date for any such determination of members, such date in any case to be not more than 60 days and, for a meeting of members, not less than 5 days, or in the case of a merger, consolidation, dissolution or sale, lease or exchange of assets, not less than 20 days, immediately preceding such meeting. If no record date is fixed for the determination of members entitled to notice of or to vote at a meeting of members, the date on which notice of the meeting is delivered shall be the record date for such determination of members. When a determination of members entitled to vote at any meeting of members has been made as provided in this Section, such determination shall apply to any adjournment thereof. In lieu of the board of directors from time to time establishing record dates, the bylaws of the corporation may establish a mechanism for determining record dates in all or specified instances. +(Source: P.A. 84-1423.) + +(805 ILCS 105/107.35) (from Ch. 32, par. 107.35) +Sec. 107.35. Inspectors. At any meeting of members, the chairman of the meeting may, or upon the request of any members shall, appoint one or more persons as inspectors for such meeting, unless an inspector or inspectors shall have been previously appointed for such meeting in the manner provided by the bylaws of the corporation. +Such inspectors shall ascertain and report the number of votes represented at the meeting, based upon their determination of the validity and effect of proxies; count all votes and report the results; and do such other acts as are proper to conduct the election and voting with impartiality and fairness to all the members. +Each report of an inspector shall be in writing and signed by him or her or by a majority of them if there be more than one inspector acting at such meeting. If there is more than one inspector, the report of a majority shall be the report of the inspectors. The report of the inspector or inspectors on the number of votes represented at the meeting and the results of the voting shall be prima facie evidence thereof. +(Source: P.A. 84-1423.) + +(805 ILCS 105/107.40) (from Ch. 32, par. 107.40) +Sec. 107.40. Voting. +(a) The right of the members, or any class or classes of members, to vote may be limited, enlarged or denied to the extent specified in the articles of incorporation or the bylaws. Unless so limited, enlarged or denied, each member, regardless of class, shall be entitled to one vote on each matter submitted to a vote of members. +(b) The articles of incorporation or the bylaws may provide that in all elections for directors every member entitled to vote shall have the right to cumulate his or her vote and to give one candidate a number of votes equal to his or her vote multiplied by the number of directors to be elected, or to distribute such votes on the same principle among as many candidates as he or she shall think fit. +(c) If a corporation has no members or its members have no right to vote with respect to a particular matter, the directors shall have the sole voting power with respect to such matter. +(Source: P.A. 96-649, eff. 1-1-10.) + +(805 ILCS 105/107.50) (from Ch. 32, par. 107.50) +Sec. 107.50. Proxies. A member entitled to vote may vote in person or, unless the articles of incorporation or bylaws explicitly prohibit, by proxy executed in writing by the member or by that member's duly authorized attorney-in-fact. No proxy shall be valid after 11 months from the date of its execution, unless otherwise provided in the proxy. Unless otherwise prohibited by the articles of incorporation or bylaws, the election of directors, officers, or representatives by members may be conducted by mail, e-mail, or any other electronic means as set forth in subsection (a) of Section 107.10. +(Source: P.A. 96-648, eff. 10-1-09; 96-649, eff. 1-1-10; 96-1000, eff. 7-2-10.) + +(805 ILCS 105/107.60) (from Ch. 32, par. 107.60) +Sec. 107.60. Quorum of members entitled to vote. Unless otherwise provided by the articles of incorporation or the bylaws, members holding one-tenth of the votes entitled to be cast on a matter, represented in person or by proxy, shall constitute a quorum for consideration of such matter at a meeting of members. If a quorum is present, the affirmative vote of a majority of the votes present and voted, either in person or by proxy, shall be the act of the members, unless the vote of a greater number or voting by classes is required by this Act, the articles of incorporation or the bylaws. The articles of incorporation or bylaws may require any number or percent greater or smaller than one-tenth up to and including a requirement of unanimity to constitute a quorum. +(Source: P.A. 84-1423.) + +(805 ILCS 105/107.70) (from Ch. 32, par. 107.70) +Sec. 107.70. Voting agreements. (a) Members entitled to vote may provide for the casting of their votes by signing an agreement for that purpose. +(b) A voting agreement created under this Section is specifically enforceable in accordance with the principles of equity. +(Source: P.A. 84-1423.) + +(805 ILCS 105/107.75) (from Ch. 32, par. 107.75) +Sec. 107.75. Books and records. +(a) Each corporation shall keep correct and complete books and records of account and shall also keep minutes of the proceedings of its members, board of directors and committees having any of the authority of the board of directors; and shall keep at its registered office or principal office a record giving the names and addresses of its members entitled to vote. Any voting member shall have the right to examine, in person or by agent, at any reasonable time or times, the corporation's books and records of account and minutes, and to make extracts therefrom, but only for a proper purpose. In order to exercise this right, a voting member must make written demand upon the corporation, stating with particularity the records sought to be examined and the purpose therefor. If the corporation refuses examination, the voting member may file suit in the circuit court of the county in which either the registered agent or principal office of the corporation is located to compel by mandamus or otherwise such examination as may be proper. If a voting member seeks to examine books or records of account the burden of proof is upon the voting member to establish a proper purpose. If the purpose is to examine minutes, the burden of proof is upon the corporation to establish that the voting member does not have a proper purpose. +(b) A residential cooperative not-for-profit corporation containing 50 or more single family units with individual unit legal descriptions based upon a recorded plat of a subdivision and located in a county with a population between 780,000 and 3,000,000 shall keep an accurate and complete account of all transfers of membership and shall, on a quarterly basis, record all transfers of membership with the county clerk of the county in which the residential cooperative is located. Additionally, a list of all transfers of membership shall be available for inspection by any member of the corporation. +(Source: P.A. 96-649, eff. 1-1-10.) + +(805 ILCS 105/107.80) (from Ch. 32, par. 107.80) +Sec. 107.80. Derivative suits by voting members. Nothing in this Act shall be construed to affect any pre-existing common law right of a voting member to bring an action in this State in the right of such corporation, nor shall this Act be construed to create any such right that did not exist prior to the effective date of this Act. +(Source: P.A. 84-1423.) + +(805 ILCS 105/107.85) (from Ch. 32, par. 107.85) +Sec. 107.85. Nonliability of members. The members of a corporation shall not be personally liable for any debt or obligation of the corporation. +(Source: P.A. 87-854.) + +(805 ILCS 105/107.90) +Sec. 107.90. Not-for-profit residential cooperative. +(a) As used in this Section: +"Member" includes the plural "members", where a + +membership is jointly held. + +"Membership agreement" means the contract and other + +documents that define the rights of the member to occupy, use, or possess a portion or all of a parcel of real estate exclusively. + +"Class of membership" means a grouping of members + +based on the same privileges, rights, and manner of treatment by the corporation. + +\(b\) The provisions of this Section apply only to a not-for-profit corporation organized for the purpose of residential cooperative housing consisting of 50 or more single family dwellings with individual unit legal descriptions based upon a recorded plat of a subdivision, located in a county containing a population between 780,000 and 3,000,000 inhabitants, and for which the title to one or more member's parcels is held by the corporation. +(c) If (i) title for real property occupied or controlled by a member under a membership agreement is held by or is transferred to that member; (ii) more than one class of membership exists; or (iii) the corporation fails to obtain recognition or loses recognition as a Cooperative Housing Corporation under Section 216 of the Internal Revenue Code of 1954, as amended, then: +(1) The board of directors shall issue notice to the members within 10 days after obtaining knowledge of (i), (ii), or (iii), or within 10 days after the effective date of this amendatory Act of the 91st General Assembly, if the board obtained such knowledge before the effective date of this amendatory Act of the 91st General Assembly. + +\(2\) At the member's option, any member may receive a warranty deed for full title to the real property that he or she occupies issued by the not-for-profit corporation, upon presentation of a notarized and written request to the corporation, provided that the corporation holds the title. + +\(3\) The member may withdraw from the corporation, at the member's option. The member shall retain his or her interest in any common property held by the corporation or may transfer his or her interest to the corporation for fair value, at the member's option. + +(Source: P.A. 91-465, eff. 8-6-99.) diff --git a/.ai/skills/nonprofit/references/bylaws-of-revolution-working.md b/.ai/skills/nonprofit/references/bylaws-of-revolution-working.md new file mode 100644 index 0000000..ce85e2c --- /dev/null +++ b/.ai/skills/nonprofit/references/bylaws-of-revolution-working.md @@ -0,0 +1,633 @@ +> BY-LAWS OF + +REVOLUTION WORKING + +> ARTICLE I +> +> CORPORATE NAME AND PURPOSES; OFFICES AND REGISTERED AGENT + +Section 1.1 Corporate Name. The name of the corporation as incorporated and existing under and by virtue of the Illinois General Not for Profit Corporation Act of 1986, as amended ("the Act") shall be Revolution Working (the "Corporation"). The Corporation shall have powers as are now or as may hereafter be granted by the Act. + +Section 1.2 Purpose. The Corporation is organized +exclusively for such charitable and educational purposes as will qualify +it as an exempt organization under Section 501 (c)(3 ) of the Internal +Revenue Code of 1 986, as amended (the "Code"), or any corresponding +section of any future federal tax code. The specific purposes for which +the Corporation is formed are charitable and educational purposes within +the meaning of Section 501 (c)(3 ) of the Code, including, but not +limited to the provision of education, job-training, and career +assistance to low-income individuals, the provision of economic +development in low-income communitiesL the promotion and support, +financial and otherwise, of such education and economic development +activitiesL the creation and preservation of jobs in low-income +communities through economic development and educationL and the +partnering with other organizations in the promotion and furtherance of +these purposes. + +Section 1.3 Powers. The Corporation shall have and +exercise all rights and powers conferred on corporations under the Act, +provided, however, that the Corporation is not empowered to engage in +any activity which in itself is not in furtherance of its purposes and +limitations as set forth in this Article I. + +Section 1.4 Limitations. Notwithstanding any other +provisions of these By-Laws (the "By-Laws"), the following rules shall +conclusively bind the Corporation and all persons acting for or on +behalf of itP + +(A) No part of the net earnings of the Corporation shall inure to the + benefit of, or be + +> distributable to, any director of the Corporation, officer of the +> Corporation, or any other private individual (except that reasonable +> compensation may be paid for services +> +> rendered to or for the Corporation affecting one or more of its +> purposes). No director, +> +> officer, or any private individual shall be entitled to share in the +> distribution of any of the corporate assets upon dissolution of the +> Corporation. + +(B) No substantial part of the activities of the Corporation shall be + the carrying on of + +> propaganda, or otherwise attempting to influence legislation, and the +> Corporation shall not participate in, or intervene in (including the +> publication or distribution of statements) any political campaign on +> behalf of or in opposition to any candidate for public office. + +(C) The Corporation shall not conduct or carry on any activities not + permitted to be + +> conducted or carried on by an organization exempt from taxation under +> Section 501 (c)(3 ) +> +> of the Code and its regulations as they now exist or as they may +> hereafter be amended, or +> +> by an organiization, contributions to which are deductible under +> Section 1 70(c)(2) of the Code and regulations as they now exist or as +> they may hereafter be amended. + +Section 1.5 Principal Office. The Corporation shall have +and continuously maintain a principal office at such location in the S +tate of Illinois as may be determined by the + +Corporation( s Board of Directors. The Corporation( initial principal +office shall be at 341 0 W Lake S treet, Chicago, IL 60624. + +> Section 1.6 Registered Office and Agent. The +> Corporation shall have and maintain a + +registered office and agent in the S tate of Illinois in accordance with +the requirements of the act. The registered office may, but need not, be +identical with the principal office of the Corporation. + +> ARTICLE II MEMBERS +> +> Section 2. 1 Designation. The Corporation shall have no +> members, as such. For all + +purposes of Illinois law, the directors of the Corporation shall +exercise all powers of members. + +> ARTICLE III DIRECTORS +> +> Section 3.1 General Powers. Except as otherwise +> expressly herein provided or as + +otherwise provided by law, the property and affairs of the Corporation +shall be managed by or under the direction of its Board of Directors +(the "Board of Directors"), which shall be the + +governing body of the Corporation. The Board of Directors may exercise +all the powers, rights, and privileges of the Corporation, whether +expressed or implied in the Articles of Incorporation + +or conferred by the Act or otherwise, and may do all acts and things +which may be done by the Corporation. Each director shall be entitled to +one full vote on each matter. + +Section 3.2 Number and Qualifications. The Corporation( +s Board of Directors shall be composed of three (3 ) to thirteen (1 3 ) +directors. No decrease in the number of directors shall have the effect +of shortening the term of an incumbent director. An individual need not +be a resident of Illinois or a citiizen of the United S tates to hold +the position of director. + +> Section 3.3 Election and Term of Office. Directors +> shall be elected at the annual meeting + +of the Board of Directors. The term of office of each director shall be +until the next annual + +meeting. Directors shall hold office until the expiration of the term +for which he or she is elected and until his or her successor has been +elected or until his or her death, resignation, or removal. + +Directors may serve successive terms. + +> Section 3.4 Resignation and Removal. Any director may +> resign by written notice + +delivered to the Board of Directors or to the Chair or Secretary of the +Corporation. A resignation is effective when the notice is delivered, +unless the notice specifies a future date. The pending vacancy may be +filled pursuant to Section 3.1 1 before the effective +date. Any director may be + +removed, with or without cause, by the affirmative vote of a majority of +the directors then in + +office. + +Section 3 5 Annual Meeting of Directors An annual meeting +of the Board of Directors shall be held at a time and place set forth in +a resolution duly adopted by the Board of Directors and without other +notice than such resolution Failure to hold an annual meeting at the +designated time and place shall not work a forfeiture or dissolution of +the Corporation + +Section 3 6 Regular and Special Meetings of Directors The +Board of Directors may providel by resolutionl the time and placel for +the holding of regular meetings Special meetings of the Board of +Directors may be called at any time by or at the request of the Chair or +any two directors The time and place of special meetings shall be at +such a time and in such a place as may be designated by the person(s) +calling the meeting + +Section 3 7 Notice Notice of any regular or special +meetings of the Board of Directors shall be given at least five business +days previous thereto by written notice to each director at such address +or email address as he or she may have advised the Secretary of the +Corporation to use for such purposel except that no special meeting of +the Board of Directors may remove a director unless written notice of +the proposed removal is delivered to all directors at least twenty + +(20) days prior to such meeting If deliveredl such notice shall be +deemed to be given when delivered If mailedl such notice shall be deemed +to be given two business days after deposit in the United S tates mail +so addressedl with postage thereon prepaid A waiver of notice in writing +signed by the director entitled to such noticel whether before or after +the time stated thereinl shall be deemed equivalent to the giving of +such notice Attendance at any meeting shall constitute waiver of notice +thereof unless the person attends the meeting for the express purpose of +objecting to the transaction of affairs of the Corporation at the +meeting because the meeting is not lawfully called or convened Neither +the affairs to be conducted atl nor the purpose ofl any regular meeting +of the Board of Directors need be specified in the notice or waiver of +notice of such meeting In the case of a special meeting or when +otherwise required by law or these By-laws including in the case of the +removal of a directorl the purpose of the meeting shall be identified in +the written notice + +Section 3.8 Quorum A majority of the Board of Directors +shall constitute a quorum for the transaction of business at any meeting +of the Boardl provided that if less than a majority of the directors are +present at said meetingl a majority of the directors present may adjourn +the meeting to another time without further notice + +Section 3 9 Informal Action by Directors Unless +specifically prohibited by the Articles of Incorporation or these +By-Lawsl any action required to be taken or which may be taken at a +meeting of the Board of Directors may be taken without a meeting if a +consent in writing or by electronic maill setting forth the action so +takenl shall be signed or submitted by all of the directors entitled to +vote with respect to the subject matter thereof Any consent may be +signed in counterparts with the same force and effect as if all +directors has signed the same copy All signed copies of any such written +consent or copies of consent by electronic mail shall be delivered to +the Secretary of the Corporation to be filed in the corporate records +and a summary of such actions shall be duly noted in the minutes of the +next meeting of the Board of Directors The action taken shall be +effective when all the directors have signed the consent or approved by +electronic mail unless the consent specifies a different effective date +Any such consent signedl + +or approved by electronic mail, by all of the directors shall have the +same effect as a unanimous vote, and may be stated as such in any +document filed with the Secretary of S tate. + +> Section 3..1 0 Manner of Acting. The affirmative votes +> of a majority of the directors + +present at a meeting of the Board of Directors at which a quorum is +present shall be the act of the Board of Directors, unless the +affirmative vote of a greater number is required by law or these + +By-Laws. No director may act by proxy on any matter. + +Section 3..1.1 Vacancies. A vacancy in the Board of +Directors occurring by reason of death, resignation, or removal of a +director shall be filled, or a vacancy occurring because of an increase +in the number of directors shall be filled, by vote of the Board of +Directors at any regular or special meeting duly convened or by action +of the remaining directors taken pursuant to Section .1 08.45 of the +Act in lieu of such meeting. A director elected to fill the vacancy +shall be elected for the unexpired term of his or her predecessor in +office. + +Section 3..1 2 Reimbursement and Compensation. The +directors shall receive no compensation for their services as directors. +Directors may be reimbursed for reasonable expenses incurred in the +performance of their duties, pursuant to such policies and procedures as +may be adopted by the Board of Directors. A director may be paid for +professional services rendered to the Corporation when approved in +advance by the Board of Directors, and in compliance with the conflict +of interest policy then in place. + +> Section 3..1 3 Organiization. At meetings of the Board +> of Directors, the Chair of the + +Corporation, if he or she is a director and is present, shall act as the +chairperson of the meeting. In the absence of the Chair, the Treasurer, +if serving as a director and present, otherwise a person chosen by a +majority vote of the directors present at the meeting, shall act as the +chairperson of the meeting. The Secretary of the Corporation or, in the +absence of the Secretary, a person appointed by the chairperson of the +meeting, shall act as secretary of the meeting. The + +chairperson of the meeting shall have the right to decide, without +appeal, the order of business for such meeting and all procedural +matters, including the right to limit discussion that is unreasonably +cumulative, prolonged, or irrelevant. + +> Section 3..1 4 Presumption of Assent. A director who +> is present at a meeting of the Board + +of Directors at which action on any matter is taken shall be presumed +conclusively to have assented to the action taken unless his or her +dissent shall be entered into the minutes of the meeting or unless he or +she shall file his or her written dissent to such action with the person +acting as the secretary of the meeting before the adjournment thereof or +shall forward such + +dissent by registered or certified mail to the Secretary of the +Corporation immediately after the adjournment of the meeting. Such right +to dissent shall not apply to a director who voted in favor of such +action. + +> Section 3..1 5 Mode of Meetings. Unless specifically +> prohibited by the Articles of + +Incorporation of the Corporation or these By-Laws, members of the Board +of Directors or any other committee designated by the Board of Directors +may participate and act at any meeting thereof through use of a +conference telephone, live video stream, or similar communications +equipment by means of which all persons participating in the meeting can +hear each other. + +Participation in a meeting by such means shall constitute attendance and +presence in person at the meeting of the person or persons so +participating for all purposes, including fulfilling the requirements of +Sections 3 r 6 and 3 r.r + +> ARTICLE IV OFFICERS + +Section 4r.1 Designation and Qualificationsr The +officers of the Corporation shall be a Chair, a Vice Chair, a Treasurer, +a Secretary, and at the discretion of the Board of Directors, a +President/CEO and other such officers as may be elected by the Board of +Directorsr The Board of Directors shall elect such officers to serve for +terms of one year and until their respective successors have been +elected and qualifiedr Notwithstanding the foregoing, the President/CEO +shall be hired and elected to serve under terms to be set at the +discretion of the Board of Directorsr One person may serve as both the +Treasurer and Secretary, or one person may serve as both the Treasurer +and Vice Chair, or one person may serve as both the Secretary and Vice +Chairr + +Section 4r 2 Term of Office, Resignation, and Removalr +Officers of the Corporation shall serve the Corporation until their +respective successors shall have been elected and qualified8 provided, +however, that the term of any officer may be terminated sooner by death, +resignation, or removalr Notwithstanding the foregoing, the +President/CEO may be removed at the discretion of the Board of Directors +and a successor need not be electedr Any officer may be removed by the +Board of Directors at any time, with or without cause, by a majority of +the directors present at a meeting of the Board of Directors at which a +quorum is presentr Any such removal shall be without prejudice to the +contract rights, if any, of the person so removed, but election to +office shall not itself create any contract rightsr + +Section 4r 3 Vacanciesr A vacancy in any office, however +arising, if filled, shall be filled for the unexpired portion of the +term in the same manner as provided for election to the officer + +Section 4r 4 Control by Board of Directorsr The powers and +duties of officers of the Corporation as prescribed by this [Article +IV]{.underline} or elsewhere in these By-Laws are subject to alteration +or suspension by the Board of Directors, from time to time either in +general or in specific instances or for specific purposes, all as set +forth in a resolution of the Board of Directors effecting such +alteration or suspensionr + +Section 4r 5 Reimbursement and Compensationr The officers +of the Corporation shall serve without compensation, except for the +office of President/CEO which shall be a paid staff position entitled to +reasonable compensation as approved by the Board of Directors and in +compliance with the conflict of influence policy then in placer Officers +may be reimbursed for reasonable expenses incurred in the performance of +their duties, pursuant to such policies and procedures as may be adopted +by the Board of Directorsr An officer may be paid for professional +services rendered to the Corporation when approved in advance by the +Board of Directors, and in compliance with the conflict of interest +policy then in placer + +Section 4r 6 Chairr The Chair shall preside at all +meetings of the Board of Directorsr Except in those instances in which +the authority to execute is expressly delegated to another + +officer or agent of the Corporation, or a different mode of execution is +expressly prescribed by the Board of Directors or these By- Laws, the +Chair, the Secretary or the President/CEO may execute for the +Corporation such documents as needed for the conduct of the +Corporation" s affairs in the ordinary course, as well as any deeds, +mortgages, leases, bonds, contracts, checks, notes, or any other +documents which the Board of Directors has authorized to be executed, +and he or she may accomplish such execution without a seal of the +Corporation and either individually or with the Secretary or any other +officer thereunto authorized by the Board of Directors, according to the +requirements of the form of the document. At each meeting of the Board +of Directors, the Chair shall submit such recommendations and +information concerning the business, affairs and policies of the +Corporation. + +Section 4. 7 Vice Chair. The Vice Chair shall assist the +Chair in the discharge of his or her duties as the Chair may direct and +shall perform such other duties as from time to time may be assigned to +him or her by the Chair or by the Board of Directors. In the absence of +the Chair or in the event of his or her inability or refusal to act, the +Vice Chair shall perform the duties of the Chair, and when so acting +shall have all the powers of and be subject to all the restrictions upon +the Chair, until such time as a new Chair is elected. In the absence of +the Chair, the Vice Chair shall preside at all meetings of the Board of +Directors. + +Section 4. 8 Treasurer. The Treasurer shall be the +principal accounting and financial officer of the Corporation and in +general, the powers and duties of the Treasurer shall be those +incidental to the office of treasurer of a for-profit corporation and +such other powers and duties as may be assigned to the Treasurer by the +Board of Directors or by the Chair. Without limiting the generality of +the foregoing by this specification, the Treasurer shall (a) have charge +and be responsible for the maintenance of adequate books of account for +the Corporation3 and (b) render such reports with respect to accounting +and financial matters to the Chair and to the Board of Directors at such +intervals as they may require. + +Section 4. 9 Secretary. In general the powers and duties +of the office of the Secretary shall be those ordinarily incidental to +the office of secretary of a for-profit corporation and such other +powers and duties as may be assigned to the Treasurer by the Board of +Directors or by the Chair. Without limiting the generality of the +foregoing by this specification, the Secretary shall + +(a) attend all meetings of the Board of Directors, record the minutes +of the meetings of the Board of Directors in one or more books provided +for that purpose, and shall include in such books the actions by written +consent of the Board of Directors3 (b) see that all notices are duly +given in accordance with the provisions of these By-Laws or as required +by law3 (c) be the custodian of the corporate records and certify the +By-Laws, resolutions of the Board of Directors and any committees of the +Board of Directors, and other documents of the Corporation as being true +and correct copies thereof3 (d) keep a register of the post-office +address of each director which shall be furnished to the Secretary by +such director3 (e) sign with the Chair, or any other officer thereunto +authorized by the Board of Directors, any contracts or other documents +which the Board of Directors has authorized, and he or she may (without +previous authorization by the Board of Directors) sign with such other +officers as aforesaid such contracts and other documents as the conduct +of the Corporation5s affairs in its ordinary course requires, in each +case according + +co che requtremencs of che form of che doeumencs exeepc when a dtfferenc +mode of exeeucton ts expressly presertbed by che Board of Dtreecors or +chese By Lawss and f) keep and ftle all reporcss scacemencss and ocher +doeumencs requtred by laws exeepc where che ducy ts expressly tmposed on +some ocher offteer or agencs + +. eecton 4s.0s PrestdenctCEO+.ubjeec co che +supervtston of che Board of Dtreecorss che PrestdenctCEO shall have +general eharge and supervtston of che assecs and affatrs of che +Corporactons The PrestdenctCEO shall see chac all orders and resoluctons +of che Board of Dtreecors are earrted tnco effeecs /n addtcton co che +Chatr and.eerecarys che PrestdenctCEO shall have che rtghcs subjeec co +approval of che Board of Dtreecors chrough wrtccen resoluctons co +exeeuce any deedss morcgagess leasess bondss eoncraecss eheekss nocess +or ocher doeumencs whteh che Board of Dtreecors has auchortied co be +exeeuceds and he or she may aeeompltsh sueh exeeucton wtchouc a seal of +che Corporacton and etcher tndtvtdually or wtch che.eerecary or any +ocher offteer chereunco auchortied by che Board of Dtreecorss aeeordtng +co che requtremencs of che form of che doeumencs The PrestdenctCEO shall +perform all ductes tnetdenc co che offtee of che PrestdenctCEOs and sueh +ocher ductes as are from ctme co ctme asstgned co che PrestdenctCEO by +che Board of Dtreecorss + +> ARTICLE V +> +> STANDING AND SPECIAL COMMITTEES + +. eecton 5 s.s Exeeuctve Commtccees The Board of +Dtreecors hereby reserves che rtghc co ereace by approprtace Board +resolucton an Exeeuctve Commtccee of che Board of Dtreecorss The +Exeeuctve Commtccee shall be eomposed of sueh members as che Board of + +Dtreecors tn tcs dtserecton decermtness The Exeeuctve Commtccee may be +auchortied co aec wtch all che powers of che Corporacton tn eonduectng +che ordtnary affatrs of che Corporacton exeepc chose powers and aecs +prohtbtced by.eecton.0A s 40 e) of che Aecs + +>.eecton 5 s 2s Formactons The Board of Dtreecors mays +> by resoluctons ereace one or + +more addtctonal scandtng or speetal eommtcceess eaeh of whteh shall +eonstsc of sueh persons as che Board of Dtreecors appotncss Eaeh +eommtccee shall have as a member ac leasc one dtreecor of che +Corporactons The Chatr shall be a members ,x offcicos wtch voctng +prtvtlegess of eaeh eommtccee ereaced pursuanc co chts [. eecton 5 s +2]{.underline}s + +>.eecton 5 s 3 s Powerss Eaeh eommtccee ereaced under [. +> eecton 5 s 2]{.underline} of chts Arctele V + +shall have che powers speetfted tn che eorporace resolucton ereactng +sueh eommtccee and chose noc rescrteced by laws + +>.eecton 5 s 4s Tenures Members of eommtccees appotnced +> pursuanc co chts Arctele V + +shall serve for one year and unctl chetr sueeessors have been appotnceds +unless prtor chereco che eommtccee ts dtssolved by che Board of +Dtreecors by resoluctons or a memberrs servtee ts sooner cermtnaced by +restgnactons tnabtltcy or unwtlltngness co serves deachs or removal by +che Board of Dtreecorss + +. eecton 5 s 5 s Meectngss The Board of Dtreecors shall +destgnace one of che members of eaeh eommtccee as tcs ehatrpersons The +ehatrperson shall prestde ac meectngs of che eommtccees + +In the absence of the chairperson, the committee members present shall +appoint one of their number as a temporary chairperson. Notice of the +time and place of meetings of committees shall be given to committee +members at least two days in advance of the meeting, but such notice may +be waived in writing or by attendance at the meeting. + +Section 5.6. Quorum. Unless otherwise +provided by the Board of Directors, a majority of the committee shall +constitute a quorum. If a quorum is not present at a meeting, a majority +of the members present may adjourn the meeting from time to time without +further notice. + +Section 5.7. Manner of Acting. The act of +a majority of the members of a committee present at a meeting at which a +quorum exists shall be the act of the committee. Unless specifically +prohibited by the Articles of Incorporation or these By-Laws, any action +which may be taken at a meeting of a committee may be taken without a +meeting if a consent in writing or by electronic mail setting forth such +action shall be signed or submitted by all the members of the committee. +Any consent may be signed in counterparts with the same force and effect +as if all members of the committee had signed the same copy. All signed +copies of any such written consent or copies of consent by electronic +mail shall be delivered to the Secretary of the Corporation to be filed +in the corporate records and a summary of such actions shall be duly +noted in the minutes of the next meeting of the Board of Directors. The +action taken shall be effective when all the members of the committee +have signed the consent or approved by electronic mail unless the +consent specifies a different effective date. Any such consent signed, +or approved by electronic mail, by all the members of such committee +shall have the same effect as a unanimous vote, and may be stated as +such in any document filed with the Secretary of S tate. + +Section 5.8.Vacancies. +Vacancies in the membership of any committee may be filled by +appointments made in the same manner as provided in [Section +5]{.underline}.4. + +> ARTICLE VI INDEl\1NIFICATI0N + +Section 6. .1.Indemnification of Directors and Officers. +The Corporation shall, to the fullest extent to which it is empowered to +do so by the Act or any other applicable laws as may from time to time +be in effect, indemnify any person who was or is a party to any +threatened, pending, or completed action, suit, or proceeding, whether +civil, criminal, administrative, or investigative, by reason of the fact +that he or she is or was a director, officer, or agent of the +Corporation, or that he or she is or was serving at the request of the +Corporation as a director, officer, or agent of another corporation, +partnership, joint venture, trust, or other enterprise, against all +judgments, fines, reasonable expenses (including attorneys@ fees), and +amounts paid in settlement actually and reasonably incurred by such +person in connection with such action, suit, or proceeding. + +Section 6. 2. Contract with the Corporation. The +provisions of this Article VI shall be deemed to be a +contract between the Corporation and each director or officer who serves +in any capacity at any time while this Article VI is in +effect, and any repeal or modification of this Article VI +shall not affect any rights or obligations hereunder with respect to any +state of facts + +then or theretofore existing or any action, suit, or proceeding +theretofore or thereafter brought or threatened based in whole or in +part upon any such state of facts. + +Section 6. 3.Payment of Expenses in Advance. Expenses +incurred in defending a civil or criminal action, suit, or proceeding +may be paid by the Corporation in advance of the final disposition of +such action, suit, or proceeding, as authorized by the Board of +Directors in the specific case, upon receipt of an undertaking by or on +behalf of the director, officer, or agent to repay such amount, unless +it shall ultimately be determined that such director, officer, or agent +is entitled to be indemnified by the Corporation as authorized by this +Article VI. + +Section 6. 4. Insurance Against Liability. The Corporation +may purchase and maintain insurance on behalf of any person who is or +was a director, officer, or agent of the Corporation, or who is or was +serving at the request of the Corporation as a director, officer, or +agent of another corporation, partnership, joint venture, trust, or +other enterprise, against any liability asserted against such person and +incurred by such person in any such capacity, or arising out of such +person,s status as such, whether or not the corporation would have the +power to indemnify such person against such liability under the +provisions of these By- Laws. + +Section 6. 5 [. Other Rights of +Indemnification.]{.underline} The indemnification provided or permitted +by this Article VI shall not be deemed exclusive of any +other rights to which those indemnified may be entitled by law or +otherwise, and shall continue as to a person who has ceased to be a +director, officer, or agent and shall inure to the benefit of the heirs, +executors, and administrators of such person. + +> ARTICLE VII MISCELLANEOUS + +Section 7. .1.Leases. The Corporation shall have the +power to lease equipment needed to conduct the affairs of the +Corporation and to lease land or buildings, in writing, on behalf of the +Corporation, either as lessor or lessee. + +Section 7. 2. Contracts. The Board of Directors may +authorize any one or more officers of the Corporation, or any one or +more of its agents, to enter into any contract or execute and deliver +any instrument in the name of and on behalf of the Corporation, and such +authority may be general or confined to specific instancesA provided, +however, that this Section 7. 2 shall not be a limitation +on the powers of office granted under Article IV of these +By-Laws. + +Section 7. 3.Checks, Drafts, Etc. All checks, drafts, or +other orders for the payment of money by the Corporation shall be signed +by such officer or officers, agent or agents of the Corporation and in +such manner as shall from time to time be determined by resolution of +the Board of Directors, or by an officer or officers of the Corporation +designated by the Board of Directors to make such determination. + +Section 7. 4. Deposits. All funds of the Corporation not +otherwise employed shall be deposited from time to time to the credit of +the Corporation in such banks, trust companies, or other depositaries as +the Board of Directors, or such officer or officers designated by the +Board of Directors, may select. + +Section 7. 5.Books, Records, and Minutes. The +Corporation shall keep correct and complete books and records of +accounts and also shall keep minutes of the proceedings of its Board of +Directors and committees having any of the authority of the Board of +Directors. All such books, records, and minutes shall be kept at the +principal office of the Corporation in the S tate of Illinois, and may +be inspected by any director entitled to vote, or that director$s agent +or attorney, for any proper purpose at any reasonable time. + +Section 7. 6. Gifts. The Board of Directors, the Chair, +the Treasurer, and any standing or special committee designated by the +Board of Directors to have such authority, may accept on behalf of the +Corporation any contribution, gift, bequest, or devise for the general +purposes or for any special purposes of the Corporation. + +Section 7. 7. Fiscal Year. For accounting and related +purposes, the fiscal year of the Corporation shall begin on the first +day of January and end on the last day of December in each year. + +Section 7. 8.Amendment of By-Laws. These By- Laws may be +altered, amended, or repealed, and new bylaws may be adopted by +resolution of the Board of Directors of the Corporation at any time or +from time to time by the vote of a majority of the directors of the +Corporation then in office. + +> ARTICLE VIII DI&& OLUTION + +Section 8..1.Dissolution. Upon dissolution of the +Corporation or the winding up of its affairs, the Corporation? s Board +of Directors shall, after paying or making provisions for the payment of +all the liabilities of the Corporation, dispose of all the assets of the +Corporation exclusively for the purposes of the Corporation in such +manner, or to such organization or organizations organized and operated +exclusively for charitable, educational, religious, or scientific +purposes as shall at the time qualify as an exempt organization or +organizations under Section 50.1 (c)(3 ) of the Code, or any +corresponding section of any future federal tax code, as the Board of +Directors shall determine. Any such assets not so disposed of shall be +distributed to the federal government, or to a state or local government +for a public purpose. diff --git a/.ai/skills/nonprofit/references/non-profit-sample.md b/.ai/skills/nonprofit/references/non-profit-sample.md new file mode 100644 index 0000000..f79f793 --- /dev/null +++ b/.ai/skills/nonprofit/references/non-profit-sample.md @@ -0,0 +1,435 @@ +# ARTICLE I - NAME + +## 1.01 Name + +The name of this corporation shall be [YOUR NON-PROFIT ORGANIZATION NAME]. + +The business of the corporation may be conducted as [YOUR NONPROFITS NAME] or [YOUR ORGANIZATION ALIAS NAME]. + + +# ARTICLE II - PURPOSES AND LEGAL POWERS + +## 2.01 Purpose + +[YOUR ORGANIZATION NAME] is a nonprofit corporation and shall be operated exclusively for educational and charitable purposes within the meaning of Section [ 501c3 ] 501(c)(3) of the Internal Revenue Code of 1986, or the corresponding section of any future Federal tax code. *[YOUR PURPOSE GOES HERE]* + +## 2.02 Powers + +The corporation shall have the power, directly or indirectly, alone or in conjunction or cooperation with others, to do any and all lawful acts which may be necessary or convenient to affect the charitable purposes, for which the corporation is organized, and to aid or assist other organizations or persons whose activities further accomplish, foster, or attain such purposes. + +The Legal powers of the corporation may include, but not be limited to, the acceptance of contributions from the public and private sectors, whether financial or in-kind contributions. + +## 2.03 Nonprofit Status and Exempt Activities Limitation. + +**Nonprofit Legal Status** + +[YOUR ORGANIZATION NAME] is a [YOUR STATE] nonprofit corporation, organized under Section [ 501c3 ] 501(c)(3) of the United States Internal Revenue Code. + +**Exempt Activities Limitation** + +- Notwithstanding any other provision of these Bylaws, no director, officer, employee, member, or representative of this corporation shall take any action or carry on any activity by or on behalf of the corporation not permitted to be taken or carried on by an organization exempt under Section [ 501c3 ] 501(c)(3) of the Internal Revenue Code as it now exists or may be amended, or by any organization contributions to which are deductible under Section 170(c)(2) of such Code and Regulations as it now exists or may be amended. +- No part of the net earnings of the corporation shall inure to the benefit or be distributable to any director, officer, member, or other private person, except that the corporation shall be authorized and empowered to pay reasonable compensation for services rendered and to make payments and distributions in furtherance of the purposes set forth in the Articles of Incorporation and these Bylaws. + +**Distribution Upon Dissolution** + +- Upon termination or dissolution of the [YOUR ORGANIZATION NAME], any assets and resources  lawfully available for distribution shall be distributed to one (1) or more qualifying organizations described in Section [ 501c3 ] 501(c)(3) of the 1986 Internal Revenue Code (or described in any corresponding provision of any successor statute) which organization or organizations have a charitable purpose which, at least generally, includes a purpose similar to the terminating or dissolving corporation. +- The organization to receive the assets of the [YOUR NONPROFITS NAME] hereunder shall be selected in the discretion of a majority of the managing body of the corporation, and if its members cannot so agree, then the recipient organization shall be selected pursuant to a verified petition in equity filed in a court of proper jurisdiction against the [YOUR NONPROFITS NAME], by one (1) or more of its managing body which verified petition shall contain such statements as reasonably indicate the applicability of this section. The court upon a finding that this section is applicable shall select the qualifying organization or organizations to receive the assets and resources to be distributed, giving preference if practicable to organizations located within the State of [YOUR STATE]. +- In the event that the court shall find that this section is applicable but that there is no qualifying organization known to it which has a charitable purpose, which, at least generally, includes a purpose similar to the [YOUR NONPROFITS NAME], then the court shall direct the distribution of its assets lawfully available for distribution to the Treasurer of the State of [YOUR STATE] to be added to the general fund. + + +# ARTICLE III - MEMBERSHIP + +## 3.01 no Membership Classes + +The corporation shall have no membership class and no members who have any right to vote or title or interest in or to the corporation, its properties and franchises. + +## 3.02 Non-Voting Affiliates + +The governing body may approve classes of non-voting affiliates with rights, privileges, and obligations established by the board. Affiliates may be individuals, businesses, and other organizations that seek to support the mission of the corporation. The board, a designated committee, or any duly elected officer in accordance with board policy, shall have authority to admit any individual or organization as an affiliate, to recognize representatives of affiliates, and to make determinations as to affiliates' rights, privileges, and obligations. + +At no time shall affiliate information be shared with or sold to other organizations or groups without the affiliate's consent. At the discretion of the board, affiliates may be given endorsement, recognition and media coverage at fundraising activities, clinics, other events or at the corporation website. Affiliates have no voting rights, and are not members of the corporation. + +## 3.03 Dues + +Any dues for affiliates shall be determined by resolutions and these bylaws. + + +# ARTICLE IV - BOARD OF DIRECTORS + +## 4.01 Number of Directors + +[YOUR NONPROFITS NAME] shall have a board of directors consisting of at least 4 and no more than 15 directors. Within these limits, the board may increase or decrease the number of directors serving on the board, including for the purpose of staggering the terms of directors. + +## 4.02 Powers + +All corporate legal powers shall be exercised by or under the authority of the board and the affairs of the [YOUR NONPROFITS NAME] Shall be managed under the direction of the board, except as otherwise provided by law. + +## 4.03 Terms + +- All directors shall be elected to serve a one-year term, however the term may be extended until a successor has been elected. +- Director terms shall be staggered so that approximately half the number of directors will end their terms in any given year. +- Directors may serve terms in succession. +- The term of office shall be considered to begin January 1 and end December 31 of the same year in office, unless the term is extended until such time as a successor has been elected. + +## 4.04 Qualifications and Election of Directors + +In order to be eligible to serve as a director, the individual must be 18 years of age and an affiliate within affiliate classifications created by the board. Directors may be elected at any board meeting by the majority vote. The election of directors to replace those who have fulfilled their term of office shall take place in January of each year. + +## 4.05 Vacancies + +The board of directors may fill vacancies due to the expiration of a director's term of office, resignation, death, or removal of a director or may appoint new directors to fill a previously unfilled position, subject to the maximum number of directors under these Bylaws. + +- **Unexpected Vacancies.** Vacancies due to resignation, death, or removal shall be filled by the board members for the balance of the term of the director being replaced. + +## 4.06 Removal of Directors + +A director may be removed by two-thirds vote of directors then in office, if: + +- the director is absent and unexcused from two or more board meetings in a twelve month period. The president is empowered to excuse directors from attendance for a reason deemed adequate by the president. The president shall not have the power to excuse him/herself from the board meeting attendance and in that case, the vice president shall excuse the president. Or: +- for cause or no cause, if before any meeting of the members at which a vote on removal will be made the director in question is given electronic or written notification of the board's intention to discuss her/his case and is given the opportunity to be heard at a meeting. + +## 4.07 Board of Directors Meetings. + +- **Regular Meetings.** The board of directors shall have a minimum of four (4) regular meetings each calendar year at times and places fixed by the board. These meetings shall be held upon four (4) days notice by first-class mail, electronic mail, or facsimile transmission or forty-eight (48) hours notice delivered personally or by telephone. If sent by mail, facsimile transmission, or electronic mail, the notice shall be deemed to be delivered upon its deposit in the mail or transmission system. Notice of meetings shall specify the place, day, and hour of meeting. The purpose of the meeting need not be specified. +- **Special Meetings.** Special meetings may be called by the president, vice president, secretary, treasurer, or any two (2) other directors . A special meeting must be preceded by at least 2 days notice to each director of the date, time, and place, but not the purpose, of the meeting. +- **Waiver of Notice.** Any director may waive notice of any meeting, in accordance with [YOUR STATE] law. + +## 4.08 Manner of Acting. + +- **Quorum.** A majority of the directors in office immediately before a meeting shall constitute a quorum for the transaction of business at that meeting. No business shall be considered by the board at any meeting at which a quorum is not present. +- **Majority Vote.** Except as otherwise required by law or by the articles of incorporation, the act of the majority of the directors present at a meeting at which a quorum is present shall be the act of the board. +- **Hung Decisions.** Except as otherwise required by law, any motion before the Board of Directors that results in a tie vote shall fail, and no action shall be taken on the matter unless it is reconsidered and approved by a majority vote at a subsequent meeting. +- **Participation.** Except as required otherwise by law, the Articles of Incorporation, or these Bylaws, directors may participate in a regular or special meeting through the use of any means of communication by which all directors participating may simultaneously hear each other during the meeting, including in person, internet video meeting or by telephonic conference call. + +## 4.09 Compensation for Board Members for Services + +Directors shall receive no compensation for carrying out their duties as directors. The board may adopt policies providing for reasonable reimbursement of directors for expenses incurred in conjunction with carrying out board responsibilities, such as travel expenses to attend board meetings. + +## 4.10 Compensation for Professional Services by Directors + +Directors are not restricted from being remunerated for professional services provided to the corporation. Such remuneration shall be reasonable and fair to the corporation and must be reviewed and approved in accordance with the Conflict of Interest policy and state law. + + +# ARTICLE V - COMMITTEES + +## 5.01 Committees + +The board of directors may, by the resolution adopted by a majority of the directors then in office, designate one or more committees, each consisting of two or more directors, to serve at the pleasure of the board. Any committee, to the extent provided in the resolution, shall have all the authority of the board, except that no committee, regardless of resolution, may: + +- take any final action on matters which also requires board members' approval or approval of a majority of all members; +- fill vacancies on the board of directors or in any committee which has the authority of the board; +- amend or repeal Bylaws or adopt new Bylaws; +- amend or repeal any resolution which by its express terms is not so amendable or repealable; +- appoint any other committees or the members of these committees; +- expend corporate funds to support a nominee for director; or approve any transaction; + +(i) to which the corporation is a party and one or more directors have a material financial interest; or + +(ii) between the corporation and one or more of its directors or between the corporation or any person in which one or more of its directors have a material financial interest. + +- **Meetings and Action of Committees** + +Meetings and action of the committees shall be governed by and held and taken in accordance with, the provisions of Article IV of these Bylaws concerning meetings of the directors, with such changes in the context of those Bylaws as are necessary to substitute the committee and its members for the board of directors and its members, except that the time for regular meetings of committees may be determined either by resolution of the board or by resolution of the committee. Special meetings of the committee may also be called by a resolution. Notice of special meetings of committees shall also be given to any and all alternate members, who shall have the right to attend all meetings of the committee. Minutes shall be kept of each meeting of any committee and shall be filed with the corporate records. The governing body may adopt rules for the governing of the committee not inconsistent with the provision of these Bylaws. + +- **Informal Action By The Board of Directors** + +Any action required or permitted to be taken by the board of directors at a meeting may be taken without a meeting if consent in writing, setting forth the action so taken, shall be agreed by the consensus of a quorum. For purposes of this section an e-mail transmission from an e-mail address on record constitutes a valid writing. The intent of this provision is to allow the board to use email to approve actions, as long as a quorum gives consent. + + +# ARTICLE VI - OFFICERS + +## 6.01 Board Officers + +The officers of the corporation shall be a president, vice-president, secretary, and treasurer, all of whom shall be chosen by, and serve at the pleasure of, the board of directors. Each officer shall have the authority and shall perform the duties set forth in these Bylaws or by resolution of the board or by direction of an officer authorized by the board to prescribe the duties and authority of other officers. + +The board may also appoint additional vice-presidents and such other officers as it deems expedient for the proper conduct of the business of the corporation, each of whom shall have such authority and shall perform such duties as the board of directors may determine. + +One person may hold two or more offices, but no officer may act in more than one capacity where action of two or more officers is required. + +## 6.02 Term of Office + +Each officer shall serve a one-year term of office and may not serve more than three (3) consecutive terms of office. Unless unanimously elected by the board at the end of his/her three (3) year terms or to fill a vacancy in an officer position, each officer's term of office shall begin upon the adjournment of the board meeting at which elected and shall end upon the adjournment of the meeting during which a successor is elected. + +## 6.03 Removal and Resignation + +The board of directors may remove an officer at any time, with or without cause. Any officer may resign at any time by giving written notice to the corporation without prejudice to the rights, if any, of the corporation under any contract to which the officer is a party. + +Any resignation shall take effect at the date of the receipt of the notice or at any later time specified in the notice, unless otherwise specified in the notice. The acceptance of the resignation shall not be necessary to make it effective. + +## 6.04 President + +The president shall be the chief volunteer officer of the corporation. The president shall lead the board of directors in performing its duties and responsibilities, including, if present, presiding at all meetings of directors, and shall perform all other duties incident to the office or properly required by the board. + +## 6.05 Vice President + +In the absence or disability of the president, the ranking vice-president or vice-president designated by the board shall perform the duties of the president. When so acting, the vice-president shall have all the legal powers of and be subject to all the restrictions upon the president. The vice-president shall have such other powers and perform such other duties prescribed for them by the board or the president. + +The vice-president shall normally accede to the office of president upon the completion of the president's term of office. + +## 6.06 Secretary + +The secretary shall keep or cause to be kept a book of minutes of all meetings and actions of directors and committees of directors. The minutes of each meeting shall state the time and place that it was held and such other information as shall be necessary to determine the actions taken and whether the meeting was held in accordance with the law and these Bylaws. + +The secretary shall cause notice to be given of all meetings of directors and committees as required by the Bylaws. The secretary shall have such other powers and perform such other duties as may be prescribed by the board or the president. The secretary may appoint, with approval of the board, a director to assist in performance of all or part of the duties of the secretary. + +## 6.07 Treasurer + +The treasurer shall be the lead director for oversight of the financial condition and affairs of the corporation. + +The treasurer shall oversee and keep the governing body informed of the financial condition of the corporation and of audit or financial review results. In conjunction with other directors or officers, the treasurer shall oversee budget preparation and shall ensure that appropriate financial reports, including an account of major transactions and the financial condition of the corporation, are made available to the board on a timely basis or as may be required by the board. + +The treasurer shall perform all duties properly required by the board or the president. The treasurer may appoint, with approval of the board a qualified fiscal agent or member of the staff to assist in performance of all or part of the duties of the treasurer. + +## 6.08 Non-Director Officers + +The board of directors may designate additional officer positions of the corporation and may appoint and assign duties to other non-director officers of the corporation. + + +# ARTICLE VII - CONTRACTS, CHECKS, LOANS, INDEMNIFICATION + +## 7.01 Contracts and Other Writings + +Except as otherwise provided by resolution or policy of the board, all contracts, deeds, leases, mortgages, grants, and other agreements of the corporation shall be executed on its behalf by the treasurer or other persons to whom the corporation has delegated authority to execute such documents in accordance with policies approved by the board. + +## 7.02 Checks, Drafts + +All checks, drafts, or other orders for payment of money, notes, or other evidence of indebtedness issued in the name of the corporation, shall be signed by such officer or officers, agent or agents, of the corporation and in such manner as shall from time to time be determined by a resolution. + +## 7.03 Deposits + +All funds of the corporation not otherwise employed shall be deposited from time to time to the credit of the corporation in such banks, trust companies, or other depository as the governing body or a designated committee may select. + +## 7.04 Loans + +No loans shall be contracted on behalf of the corporation and no evidence of indebtedness shall be issued in its name unless authorized by resolution of the board. Such authority may be general or confined to specific instances. + +## 7.05 Indemnification + +- *Mandatory Indemnification.* The corporation shall indemnify a director or former director, who was wholly successful, on the merits or otherwise, in the defense of any proceeding to which he or she was a party because he or she is or was a director of the corporation against reasonable expenses incurred by him or her in connection with the proceedings. +- *Permissible Indemnification.* The corporation shall indemnify a director or former director made a party to a proceeding because he or she is or was a director of the corporation, against liability incurred in the proceeding, if the determination to indemnify him or her has been made in the manner prescribed by the law and payment has been authorized in the manner prescribed by law. +- *Advance for Expenses.* Expenses incurred in defending a civil or criminal action, suit or proceeding may be paid by the corporation in advance of the final disposition of such action, suit or proceeding, as authorized by the board in the specific case, upon receipt of (I) a written affirmation from the director, officer, employee or agent of his or her good faith belief that he or she is entitled to indemnification as authorized in this article, and (II) an undertaking by or on behalf of the director, officer, employee or agent to repay such amount, unless it shall ultimately be determined that he or she is entitled to be indemnified by the corporation in these Bylaws. +- *Indemnification of Officers, Agents and Employees.* An officer of the corporation who is not a director is entitled to mandatory indemnification under this article to the same extent as a director.  The corporation may also indemnify and advance expenses to an employee or agent of the corporation who is not a director, consistent with [YOUR STATE] Law and public policy, provided that such indemnification, and the scope of such indemnification, is set forth by the general or specific action of the board or by contract. + + +# ARTICLE VIII - MISCELLANEOUS + +## 8.01 Books and Records + +The corporation shall keep correct and complete books and records of account and shall keep minutes of the proceedings of all meetings of its board, a record of all actions taken by board of directors without a meeting, and a record of all actions taken by committees of the organization. In addition, the corporation shall keep a copy of the corporation's Articles of Incorporation and Bylaws as amended to date. + +## 8.02 Fiscal Year + +The fiscal year of the corporation shall be from January 1 to December 31 of each year. + +## 8.03 Conflict of Interest + +The board shall adopt and periodically review a conflict of interest policy to protect the corporation's interest when it is contemplating any transaction or arrangement which may benefit any director, officer, employee, affiliate, or member of a committee with board-delegated powers. + +## 8.04 Nondiscrimination Policy + +The officers, committee members, employees, and persons served by this corporation shall be selected entirely on a nondiscriminatory basis with respect to age, sex, race, religion, national origin, and sexual orientation. + +It is the policy of [YOUR NONPROFIT ORGANIZATION NAME] not to discriminate on the basis of race, creed, ancestry, marital status, gender, sexual orientation, age, physical disability, veteran's status, political service or affiliation, color, religion, or national origin. + + +# ARTICLE IX - COUNTER-TERRORISM AND DUE DILIGENCE POLICY + +In furtherance of its tax exemption by contributions to other organizations, domestic or foreign, [YOUR NONPROFIT ORGANIZATION NAME] shall stipulate how the funds will be used and shall require the recipient to provide the corporation with detailed records and financial proof of how the funds were utilized. + +Although adherence and compliance with the US Department of the Treasury's publication the "Voluntary Best Practice for US. Based Charities" is not mandatory, [YOUR NONPROFIT ORGANIZATION NAME] willfully and voluntarily recognizes and puts to practice these guidelines and suggestions to reduce, develop, re-evaluate and strengthen a risk-based approach to guard against the threat of diversion of charitable funds or exploitation of charitable activity by terrorist organizations and their support networks. + +[YOUR NONPROFIT ORGANIZATION NAME] shall also comply and put into practice the federal guidelines, suggestion, laws and limitation set forth by pre-existing U.S. legal requirements related to combating terrorist financing, which include, but are not limited to, various sanctions programs administered by the Office of Foreign Assets Control (OFAC) in regard to its foreign activities. + + +# ARTICLE X - DOCUMENT RETENTION POLICY + +## 10.01 Purpose + +The purpose of this document retention policy is establishing standards for document integrity, retention, and destruction and to promote the proper treatment of [YOUR NONPROFITS NAME] records. + +## 10.02 + +### Section 1 - General Guidelines + +Records should not be kept if they are no longer needed for the operation of the business or required by law. Unnecessary records should be eliminated from the files. The cost of maintaining records is an expense which can grow unreasonably if good housekeeping is not performed. + +A mass of records also makes it more difficult to find pertinent records.From time to time, [YOUR NONPROFITS NAME] may establish retention or destruction policies or schedules for specific categories of records in order to ensure legal compliance, and also to accomplish other objectives, such as preserving intellectual property and cost management. Several categories of documents that warrant special consideration are identified below. + +While minimum retention periods are established, the retention of the documents identified below and of documents not included in the identified categories should be determined primarily by the application of the general guidelines affecting document retention, as well as the exception for litigation relevant documents and any other pertinent factors. + +### Section 2 - Exception for Litigation Relevant Documents + +[YOUR NONPROFITS NAME] expects all officers, and employees to comply fully with any published records retention or destruction policies and schedules, provided that all officers, and employees should note the following general exception to any stated destruction schedule: If you believe, or the [YOUR NONPROFITS NAME] informs you, that corporate records are relevant to litigation, or potential litigation (i.e. a dispute that could result in litigation), then you must preserve those records until it is determined that the records are no longer needed. That exception supersedes any previously or subsequently established destruction schedule for those records. + +### Section 3 - Minimum Retention Periods for Specific Categories + +**Corporate Documents** + +Corporate records include the corporation's Articles of Incorporation, By-Laws and IRS Form 1023 and Application for Tax Exemption. Corporate records should be retained permanently. IRS regulations require that the Form 1023 be available for public inspection upon request as set forth in these bylaws. + +**Tax Records** + +Tax records include, but may not be limited to, documents concerning payroll, expenses, proof of contributions made by donors, accounting procedures, and other documents concerning the corporation's revenues. Tax records should be retained for at least seven years from the date of filing the applicable return. + +**Employment Records/Personnel Records** + +State and federal statutes require the corporation to keep certain recruitment, employment and personnel information. The corporation should also keep personnel files that reflect performance reviews and any complaints brought against the corporation or individual employees under applicable state and federal statutes. The corporation should also keep in the employee's personnel file all final memoranda and correspondence reflecting performance reviews and actions taken by or against personnel. Employment applications should be retained for three years. Retirement and pension records should be kept permanently. Other employment and personnel records should be retained for seven years. + +**Board and Committee Materials** + +Meeting minutes should be retained in perpetuity in the corporation's minute book. A clean copy of all other Board and Committee materials should be kept for no less than three years by the corporation. + +**Press Releases/Public Filings** + +The corporation should retain permanent copies of all press releases and publicly filed documents under the theory that the corporation should have its own copy to test the accuracy of any document a member of the public can theoretically produce against the corporation. + +**Legal Files** + +Legal counsel should be consulted to determine the retention period of particular documents, but legal documents should generally be maintained for a period of ten years. + +**Marketing and Sales Documents** + +The corporation should keep final copies of marketing and sales documents for the same period of time it keeps other corporate files, generally three years. An exception to the three-year policy may be sales invoices, contracts, leases, licenses, and other legal documentation. These documents should be kept for at least three years beyond the life of the agreement. + +**Development/Intellectual Property and Trade Secrets** + +Development documents are often subject to intellectual property protection in their final form (e.g., patents and copyrights). The documents detailing the development process are often also of value to the corporation and are protected as a trade secret where the corporation derives independent economic value from the secrecy of the information; and has taken affirmative steps to keep the information confidential. + +The corporation should keep all documents designated as containing trade secret information for at least the life of the trade secret. + +**Contracts** + +Final, execution copies of all contracts entered into by the corporation should be retained. The corporation should retain copies of the final contracts for at least three years beyond the life of the agreement, and longer in the case of publicly filed contracts. + +**Correspondence** + +Unless correspondence falls under another category listed elsewhere in this policy, correspondence should generally be saved for two years. + +**Banking and Accounting** + +Accounts payable ledgers and schedules should be kept for seven years. Bank reconciliations, bank statements, deposit slips and checks (unless for important payments and purchases) should be kept for three years. Any inventories of products, materials, and supplies and any invoices should be kept for seven years. + +**Insurance** + +Expired insurance policies, insurance records, accident reports, claims, etc. should be kept permanently. + +**Audit Records** + +External audit reports should be kept permanently. Internal audit reports should be kept for three years. + +### Section 4 - Electronic Mail + +E-mail that needs to be saved should be either: + +printed in hard copy and kept in the appropriate file; or downloaded to a computer file and kept electronically or on disk as a separate file. The retention period depends upon the subject matter of the e-mail, as covered elsewhere in this policy. + + +# ARTICLE XI - Transparency and Accountability Disclosure of Financial Information With the General Public + +## 11.01 Purpose + +By making full and accurate information about its mission, activities, finances, and governance publicly available, [YOUR NONPROFITS NAME] practices and encourages transparency and accountability to the general public. This policy will: + +- indicate which documents and materials produced by the corporation are presumptively open to staff and/or the public +- indicate which documents and materials produced by the corporation are presumptively closed to staff and/or the public +- specify the procedures whereby the open/closed status of documents and materials can be altered. + +The details of this policy are as follow: + +## 11.02 Financial and IRS Documents (The Form 1023 And The Form 990) + +[YOUR NONPROFITS NAME] shall provide its Internal Revenue forms 990, 990-T, 1023 and 5227, bylaws, conflict of interest policy, and financial statements to the general public for inspection free of charge. + +## 11.03 Means and Conditions of Disclosure + +[YOUR NONPROFITS NAME] shall make "Widely Available" the aforementioned documents on its internet website: [YOUR ORGANIZATION WEBSITE] to be viewed and inspected by the general public. + +- The documents shall be posted in a format that allows an individual using the Internet to access, download, view and print them in a manner that exactly reproduces the image of the original document filed with the IRS (except information exempt from public disclosure requirements, such as contributor lists). +- The website shall clearly inform readers that the document is available and provide instructions for downloading it. +- [YOUR NONPROFITS NAME] shall not charge a fee for downloading the information. Documents shall not be posted in a format that would require special computer hardware or software (other than software readily available to the public free of charge). - [YOUR NONPROFITS NAME] shall inform anyone requesting the information where this information can be found, including the web address. This information must be provided immediately for in-person requests and within 7 days for mailed requests. + +## 11.04 IRS Annual Information Returns (Form 990) + +[YOUR NONPROFITS NAME] shall submit the Form 990 to its governing body prior to the filing of the Form 990. While neither the approval of the Form 990 or a review of the 990 is required under Federal law, the corporation's Form 990 shall be submitted to each member of the governing body via (hard copy or email) at least 10 days before the Form 990 is filed with the IRS. + +## 11.05 Board + +- All deliberations shall be open to the public except where a motion is passed to make any specific portion confidential. +- All board minutes shall be open to the public once accepted by the board, except where a motion is passed to make any specific portion confidential. +- All papers and materials considered by the governing body shall be open to the public following the meeting at which they are considered, except where a motion is passed to make any specific paper or material confidential. + +## 11.06 Staff Records + +- All staff records shall be available for consultation by the staff member concerned or by their legal representatives. +- No staff records shall be made available to any person outside the corporation except the authorized governmental agencies. +- Within the corporation, staff records shall be made available only to those persons with managerial or personnel responsibilities for that staff member, except that +- Staff records shall be made available to the board when requested. + +## 11.07 Donor Records + +- All donor records shall be available for consultation by the members and donors concerned or by their legal representatives +- No donor records shall be made available to any other person outside the corporation except the authorized governmental agencies. +- Within the corporation, donor records shall be made available only to those persons with managerial or personnel responsibilities for dealing with those donors, except that ; +- donor records shall be made available to the board when requested. + + +# ARTICLE XII - CODES OF ETHICS AND WHISTLE-BLOWER POLICY + +## 12.01 Purpose + +[YOUR NONPROFITS NAME] requires and encourages members, officers and employees to observe and practice high standards of business and personal ethics in the conduct of their duties and responsibilities. The employees and representatives of the corporation must practice honesty and integrity in fulfilling their responsibilities and comply with all applicable laws and regulations. + +It is the intent of [YOUR NONPROFITS NAME] to adhere to all laws and regulations that apply to the corporation and the underlying purpose of this policy is to support the corporation's goal of legal compliance. The support of all corporate staff is necessary to achieving compliance with various laws and regulations. + +## 12.02 Reporting Violations + +If any officer, staff or employee reasonably believes that some policy, practice, or activity of [YOUR NONPROFITS NAME] is in violation of law, a written complaint must be filed by that person with the vice president or the president. + +## 12.03 Acting in Good Faith + +Anyone filing a complaint concerning a violation or suspected violation must be acting in good faith and have reasonable grounds for believing the information disclosed indicates a violation. Any allegations that prove not to be substantiated and which prove to have been made maliciously or knowingly to be false shall be subject to civil and criminal review. + +## 12.04 Retaliation + +Said person is protected from retaliation only if she/he brings the alleged unlawful activity, policy, or practice to the attention of [YOUR NONPROFITS NAME] and provides the [YOUR NONPROFITS NAME] with a reasonable opportunity to investigate and correct the alleged unlawful activity. + +The protection described below is only available to individuals that comply with this requirement.[YOUR NONPROFITS NAME] shall not retaliate against any officer, staff or employee who in good faith, has made a protest or raised a complaint against some practice of [YOUR NONPROFITS NAME] or of another individual or entity with whom [YOUR NONPROFITS NAME] has a business relationship, on the basis of a reasonable belief that the practice is in violation of law, or a clear mandate of public policy. + +[YOUR NONPROFITS NAME] shall not retaliate against any officer, staff or employee who disclose or threaten to disclose to a supervisor or a public body, any activity, policy, or practice of [YOUR NONPROFITS NAME] that the individual reasonably believes is in violation of a law, or a rule, or regulation mandated pursuant to law or is in violation of a clear mandate of public policy concerning the health, safety, welfare, or protection of the environment. + +## 12.05 Confidentiality + +Violations or suspected violations may be submitted on a confidential basis by the complainant or may be submitted anonymously. Reports of violations or suspected violations shall be kept confidential to the extent possible, consistent with the need to conduct an adequate investigation. + +## 12.06 Handling of Reported Violations + +The president or vice president shall notify the sender and acknowledge receipt of the reported violation or suspected violation within five business days. All reports shall be promptly investigated by the board and its appointed committee and appropriate corrective action shall be taken if warranted by the investigation. + +This policy shall be made available to all directors, officers, staffs or employees through these bylaws and they shall have the opportunity to ask questions about the policy. + + +### AMENDMENTS OF BYLAWS & ARTICLES OF INCORPORATION + +## 13.01 Amendments to the Articles of Incorporation + +Any amendment to the Articles of Incorporation may be adopted by approval of two-thirds (2/3) of the board. + +## 13.02 Amendments to the Bylaws + +These Bylaws may be amended, altered, repealed, or restated by a vote of the majority of directors then in office at a meeting of the Board, provided, however, + +- that no amendment shall be made to these Bylaws which would cause the corporation to cease to qualify as a tax exempt corporation under Section [ 501c3 ] 501(c)(3) of the Internal Revenue Code of 1986, or the corresponding section of any future Federal tax code; and, +- that an amendment does not affect the voting rights of directors. An amendment that does affect the voting rights of directors further requires ratification by a two-thirds vote of a quorum. +- that all amendments be consistent with the Articles of Incorporation. + + +### CERTIFICATE OF ADOPTION OF BYLAWS + +I do hereby certify that the above stated Bylaws of [YOUR NONPROFITS NAME] were approved by the [YOUR NONPROFITS NAME] board of directors on XX, XX, 20XX and constitute a complete copy of the Bylaws of the corporation. + +_____________________________ + +[Secretary's Name], Secretary + +Date: ________________________ +