-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathindex.qmd
More file actions
180 lines (156 loc) · 41.7 KB
/
Copy pathindex.qmd
File metadata and controls
180 lines (156 loc) · 41.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# Great Docs
Give your Python package the documentation site it deserves. Great Docs turns your docstrings, README, and CLI into a polished documentation site. When you're ready to go further, there's a world of features waiting. Start simple, go deep.
## Three Commands. One Beautiful Site.
{{< termshow file="assets/landing-demo" autoplay="true" loop="true" >}}
That's it. Your API reference, CLI docs, and landing page are ready to go. Push to GitHub and you're live.
## Your Docstrings, Finally Doing Their Job
Every class, function, method, and attribute in your public API gets its own structured page with parameter tables, return types, source links, and rendered examples. Numpy, Google, and Sphinx docstring styles all work out of the box.
If your package has a Click CLI, that's documented as well (complete with terminal-style help output and subcommand trees).
Want to *show* your CLI in action? Termshow lets you record terminal sessions, edit them visually in a browser-based editor, and embed the results as animated SVG players directly in your documentation. No screen recordings, no GIFs, no JavaScript... just lightweight, theme-aware terminal playback that lives alongside your reference pages.
## Looks Good Without Trying
Dark mode with a persistent toggle. Responsive on every screen. Sidebar search for large APIs. GitHub star counts in the corner. Screenshots and diagrams expand into a full-screen lightbox with zoom, galleries, annotations, and before/after comparison.
With a line or two of configuration you can add animated gradient navbars, announcement banners, custom logos, and more.
Your package gets a site that matches the quality of the code behind it.
## AI-Native from Day One
Great Docs generates `llms.txt` and `llms-full.txt` so AI coding agents can understand your library without scraping HTML. It also produces Agent Skills files: structured metadata that tells tools like Copilot, Cursor, and Claude Code *how* to use your package (not just what it exports).
If your package ships an MCP server, Great Docs auto-generates reference pages for every tool, resource, and prompt it exposes, giving agents structured documentation they can discover through the [Model Context Protocol](https://modelcontextprotocol.io/).
You can also write your own custom skills and publish them with your site. Your users install them with a single command.
## Deploy in One Step
```bash
great-docs setup-github-pages
```
Creates a GitHub Actions workflow. Every push to `main` rebuilds and publishes your site automatically.
## Go Further
```{=html}
<div class="gd-cta-grid">
<a href="user-guide/installation.html" class="gd-cta-card">
<span class="gd-cta-icon">📖</span>
<span class="gd-cta-title">User Guide</span>
<span class="gd-cta-desc">Installation, configuration, theming, multi-version docs, and deployment.</span>
<span class="gd-cta-arrow">→</span>
</a>
<a href="recipes/hide-internal-symbols.html" class="gd-cta-card">
<span class="gd-cta-icon">🍳</span>
<span class="gd-cta-title">Recipes</span>
<span class="gd-cta-desc">Bite-sized guides for specific tasks: copy, paste, done.</span>
<span class="gd-cta-arrow">→</span>
</a>
<a href="reference/index.html" class="gd-cta-card">
<span class="gd-cta-icon">⚙️</span>
<span class="gd-cta-title">API Reference</span>
<span class="gd-cta-desc">Great Docs documenting itself (every class, function, and option).</span>
<span class="gd-cta-arrow">→</span>
</a>
</div>
```
```{=html}
<style>
/* Feature wall — interactive items */
.gd-fw-link{
display:inline; color:inherit; cursor:pointer; text-decoration:none; border-radius:2px;
background-image:linear-gradient(transparent 60%, rgba(99,102,241,.18) 0);
background-size:0% 100%; background-repeat:no-repeat;
transition:background-size .25s ease, color .2s ease;
}
.gd-fw-link:hover, .gd-fw-link:focus-visible{
background-size:100% 100%; color:var(--bs-link-color,#6366f1); outline:none;
}
.gd-fw-link.gd-fw-b{ font-weight:650; }
body.quarto-dark .gd-fw-link:hover, body.quarto-dark .gd-fw-link:focus-visible{
color:#a5b4fc; background-image:linear-gradient(transparent 60%, rgba(165,180,252,.22) 0);
}
/* Feature modal */
.gd-feat-modal{ position:fixed; inset:0; z-index:1080; display:flex; align-items:center; justify-content:center; padding:1.25rem; }
.gd-feat-modal[hidden]{ display:none; }
.gd-feat-backdrop{ position:absolute; inset:0; background:rgba(15,17,28,.55); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); opacity:0; transition:opacity .22s ease; }
.gd-feat-modal.is-open .gd-feat-backdrop{ opacity:1; }
.gd-feat-dialog{ position:relative; width:min(440px,100%); background:var(--bs-body-bg,#fff); border-radius:18px; overflow:hidden; box-shadow:0 24px 60px -12px rgba(15,17,28,.45); transform:translateY(14px) scale(.96); opacity:0; transition:transform .26s cubic-bezier(.2,.8,.25,1), opacity .22s ease; }
.gd-feat-modal.is-open .gd-feat-dialog{ transform:none; opacity:1; }
.gd-feat-banner{ position:relative; height:118px; display:flex; align-items:center; justify-content:center; background:linear-gradient(135deg,#6366f1,#8b5cf6 45%,#ec4899); overflow:hidden; }
.gd-feat-banner::before{ content:""; position:absolute; inset:-60%; background:radial-gradient(circle at 30% 30%, rgba(255,255,255,.38), transparent 45%); animation:gd-feat-spin 7s linear infinite; }
@keyframes gd-feat-spin{ to{ transform:rotate(360deg); } }
.gd-feat-iconwrap{ position:relative; display:flex; align-items:center; justify-content:center; width:64px; height:64px; border-radius:16px; background:rgba(255,255,255,.18); border:1px solid rgba(255,255,255,.3); color:#fff; }
.gd-feat-iconwrap .gd-feat-ic{ width:32px; height:32px; }
.gd-feat-x{ position:absolute; top:10px; right:10px; z-index:2; width:32px; height:32px; border:0; border-radius:50%; background:rgba(255,255,255,.2); color:#fff; font-size:1.3rem; line-height:1; cursor:pointer; transition:background .15s ease; }
.gd-feat-x:hover{ background:rgba(255,255,255,.4); }
.gd-feat-body{ padding:1.25rem 1.4rem 1.5rem; }
.gd-feat-title{ margin:0 0 .5rem; font-size:1.25rem; font-weight:700; letter-spacing:-.01em; color:#1b1e2b; }
.gd-feat-desc{ margin:0 0 1.1rem; color:var(--bs-secondary-color,#5b6170); line-height:1.55; }
.gd-feat-cta{ display:inline-flex; align-items:center; gap:.4rem; font-weight:600; text-decoration:none; color:#fff; background:linear-gradient(135deg,#6366f1,#8b5cf6); padding:.5rem .95rem; border-radius:999px; transition:transform .15s ease, box-shadow .15s ease; }
.gd-feat-cta:hover{ transform:translateY(-1px); box-shadow:0 8px 20px -6px rgba(99,102,241,.6); color:#fff; }
.gd-feat-arrow{ transition:transform .18s ease; }
.gd-feat-cta:hover .gd-feat-arrow{ transform:translateX(3px); }
body.quarto-dark .gd-feat-dialog{ background:#1b1e2b; }
body.quarto-dark .gd-feat-title{ color:#f3f4f8; }
body.quarto-dark .gd-feat-desc{ color:#aab1c4; }
@media (prefers-reduced-motion: reduce){ .gd-feat-banner::before{ animation:none; } .gd-feat-dialog,.gd-feat-backdrop{ transition:none; } }
</style>
<div class="gd-feature-wall">
<h2 class="gd-fw-heading">There's Always More to Explore.</h2>
<p class="gd-fw-large"><a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="book-open" data-h="api-documentation" data-d="Every public class, function, method, and attribute becomes a structured page with parameter tables, return types, and source links.">Auto-Generated API Ref­er­ence</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="moon" data-h="theming" data-d="A persistent, flash-free dark mode toggle that remembers each visitor's preference.">Dark Mode Toggle</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="sparkles" data-h="llms-txt" data-d="Auto-generated llms.txt, llms-full.txt, and Agent Skills so AI tools can understand and use your package.">llms.txt & Agent Skills</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="layers" data-h="multi-version-docs" data-d="Publish docs for every release with a built-in version selector and floating aliases.">Multi-Version Docu­men­ta­tion</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="rocket" data-h="deployment" data-d="One command writes a GitHub Actions workflow that builds and publishes on every push.">GitHub Pages in One Com­mand</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="terminal" data-h="cli-documentation" data-d="Click-based CLIs get sectioned reference pages with usage signatures, typed options, and help output.">Click CLI Docu­men­ta­tion</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="terminal" data-h="terminal-recordings" data-d="Record terminal sessions and embed them as lightweight, theme-aware animated SVG players — no screen recordings, no GIFs, no JavaScript.">Animated Term­show Re­cord­ings</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="app-window" data-h="terminal-recordings" data-d="Edit recordings visually in a browser-based non-linear editor — trim, annotate, and restyle without re-recording.">Term­show Visual Editor</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="palette" data-h="theming" data-d="Choose gradient presets or solid colors for navbars, content areas, and announcement banners.">Animated Gradient Nav­bars & Ban­ners</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="zap" data-h="quickstart" data-d="init, build, preview: auto-detect, generate, and view your site in under a minute.">Three Com­mands to Launch</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="history" data-h="changelog" data-d="Generate a polished changelog page straight from your GitHub Releases.">Change­log from GitHub Re­leases</a> • Hero Section Support • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="table" data-h="table-previews" data-d="Render styled HTML table previews from any tabular data source with tbl_preview().">Rich Table Pre­views for Pandas, Polars & Arrow</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="maximize" data-h="lightbox" data-d="Expand any image into a full-screen viewer with zoom, panning, galleries, and captions.">Full-Screen Light­box with Zoom & Gal­ler­ies</a></p>
<p class="gd-fw-medium"><a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="file-text" data-h="writing-docstrings" data-d="All three major docstring styles are detected and rendered out of the box.">Numpy, Google & Sphinx Doc­strings</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="chevrons-up-down" data-h="multi-version-docs" data-d="A dropdown lets readers jump between documented versions of your package.">Version Selector Widget</a> • <b>Side­bar Search & Fil­ter­ing</b> • <a class="gd-fw-link" role="button" tabindex="0" data-i="tag" data-h="page-tags" data-d="Categorize pages with tags and tag-index pages, and mark lifecycle status.">Page Tags & Status Badges</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="workflow" data-h="diagrams" data-d="Mermaid diagrams are pre-rendered with matching light and dark variants.">Mer­maid Dia­gram Ren­der­ing</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="grid-2x2" data-h="table-explorer" data-d="Drop in sortable, filterable interactive data tables with tbl_explorer().">Inter­active Table Ex­plor­er</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="scan-line" data-h="linting" data-d="Catch missing docstrings, broken cross-references, and style issues before you ship.">Docu­men­ta­tion Linter</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="spell-check" data-h="proofreading" data-d="Proofread your documentation for spelling and grammar problems from the command line.">Spelling & Grammar Check­ing</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="languages" data-h="internationalization" data-d="Translate interface strings into 23+ languages with a single setting.">Twenty-Three Lan­guages</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="keyboard" data-h="keyboard-keys" data-d="Navigate the site by keyboard, with a shortcut overlay and styled key hints.">Key­board Navi­ga­tion</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="layout-list" data-h="custom-sections" data-d="Add recipes, tutorials, or any custom section with its own navbar placement.">Custom Sections & Recipes</a> • Respon­sive on Every Screen • <b>GitHub Star Count Widget</b> • <a class="gd-fw-link" role="button" tabindex="0" data-i="search" data-h="seo" data-d="Audit SEO health and generate sitemaps, robots.txt, canonical URLs, and structured data.">SEO Audit & Site­map Gen­er­a­tion</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="megaphone" data-h="theming" data-d="Add dismissible, styled site-wide notices for releases and important news.">Announce­ment Ban­ners</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="image" data-h="theming" data-d="Brand your site with logos and favicons, including dark-mode variants.">Auto-Detected Logos with Dark-Mode Vari­ants</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="git-compare" data-h="api-evolution" data-d="See exactly what changed in your public API between any two versions.">API Diff Between Ver­sions</a> • Tool­tips & Pop­overs • <b>Rich Meta­data Side­bar with De­vel­oper Links</b> • <a class="gd-fw-link" role="button" tabindex="0" data-i="link" data-h="cross-referencing" data-d="Type names in docstrings automatically link to their reference pages.">Code Auto­links in Doc­strings</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="package" data-h="api-documentation" data-d="Great Docs walks submodules to discover your package's full public surface.">Sub­mod­ule Intro­spec­tion</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="file-down" data-h="llms-txt" data-d="Every page offers a copy-as-Markdown view for easy LLM and clipboard use.">Copy & View Page as Mark­down</a> </p>
<p class="gd-fw-small"><b>APCA Contrast Algo­rithm</b> • Fav­icon Auto-Gen­er­a­tion • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="scaling" data-h="scale-to-fit" data-d="Wide HTML output auto-shrinks to fit the content column instead of overflowing.">Scale-to-Fit Wide Tables</a> • Copy Code Buttons • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="code" data-h="authoring-qmd-files" data-d="Author pages in Quarto Markdown with highlighted, executable code cells.">Syn­tax High­light­ing & Exe­cut­able Code Blocks</a> • In­line Icons • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="flag" data-h="api-evolution" data-d="Annotate version-specific content with fences and inline version badges.">Version Fences & Badges</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="git-compare" data-h="api-evolution" data-d="Surface breaking changes automatically when comparing API versions.">Breaking Change Detec­tion</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="history" data-h="api-evolution" data-d="Track how your public API surface evolves release over release.">API Sur­face Time­line</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="file-text" data-h="api-evolution" data-d="Show when parameters were added, changed, or deprecated across versions.">Param­eter Evo­lu­tion Tables</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="file-json" data-h="seo" data-d="Emit JSON-LD structured data so search engines understand your pages.">JSON-LD Struc­tured Data</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="link-2" data-h="seo" data-d="Set canonical URLs to keep multi-version and mirrored content SEO-friendly.">Canon­ical URLs</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="share-2" data-h="social-cards" data-d="Generate Open Graph and Twitter cards so shared links unfurl beautifully.">Social Cards & Open Graph</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="code" data-h="api-documentation" data-d="Every documented item links back to its exact source on GitHub.">Source Links to GitHub</a> • <b>1,941 Bundled Lucide Icons</b> • <a class="gd-fw-link" role="button" tabindex="0" data-i="users" data-h="community-files" data-d="Contributing guides, code of conduct, and other community files get dedicated pages.">Commu­nity File Pages</a> • <b>SPDX License Data­base</b> • <a class="gd-fw-link" role="button" tabindex="0" data-i="rocket" data-h="deployment" data-d="Spin up preview builds for pull requests so changes can be reviewed live.">PR Pre­view Deploy­ments</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="droplet" data-h="theming" data-d="Override any style with your own SCSS for full control over appearance.">Custom SCSS Theming</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="newspaper" data-h="blog" data-d="Add a blog section with dated posts, listing pages, and author metadata.">Blog Sup­port</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="link" data-h="cross-referencing" data-d="Link between documented objects with cross-references and see-also blocks.">Cross-Refs, %see­also & In­line Inter­links</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="video" data-h="videos" data-d="Embed YouTube, Vimeo, and local video files directly in your pages.">Video Embeds</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="droplet" data-h="color-swatches" data-d="Show inline color chips and swatch grids for design and palette docs.">Color Swatches</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="image" data-h="lightbox" data-d="Annotate lightbox images and add interactive before/after comparisons.">Image Anno­ta­tions & Before/After Com­pare</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="server" data-h="mcp-documentation" data-d="Standard MCP and FastMCP servers are detected automatically for reference pages.">FastMCP Server Detec­tion</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="layout-list" data-h="authoring-qmd-files" data-d="Organize content with tabbed panels and styled callout admonitions.">Tab­sets & Cal­louts</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="link-2" data-h="link-checker" data-d="Validate every internal and external link in your built site.">Link Checker</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="settings" data-h="configuration" data-d="Generate a fully-documented great-docs.yml template to customize everything.">Config Gen­er­a­tion</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="search" data-h="seo" data-d="Control crawler access with generated robots.txt and crawl rules.">Robots.txt & Crawl Rules</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="refresh-cw" data-h="building" data-d="Rebuild changed pages without tearing down the whole site.">Non-Breaking Re­build Mode</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="file-json" data-h="api-evolution" data-d="Capture a JSON snapshot of your public API for diffing and tracking.">API Snap­shots to JSON</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="app-window" data-h="custom-pages" data-d="Drop in custom HTML pages with passthrough or raw layouts.">Custom Static Pages</a> • Object-Type Label Colors • <b>Styled Sig­na­tures & Type Anno­ta­tions</b> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="package" data-h="api-documentation" data-d="Choose exactly which members appear on class pages with include and exclude lists.">Meth­od Mem­ber Con­trol & Ex­clude Lists</a> • <a class="gd-fw-link" role="button" tabindex="0" data-i="palette" data-h="theming" data-d="Add Lucide icons to navbar and sidebar entries for visual wayfinding.">Nav­bar & Side­bar Icons</a> • <a class="gd-fw-link gd-fw-b" role="button" tabindex="0" data-i="terminal" data-h="building" data-d="Get detailed, step-by-step build output to debug site generation.">Verbose Build Log­ging</a> • Custom Head In­jec­tion for Scripts & Meta • <b>Back-to-Top Button</b> • ...and Yes, It Builds <em>Fast</em></p>
</div>
<div id="gd-feat-modal" class="gd-feat-modal" hidden>
<div class="gd-feat-backdrop" data-close></div>
<div class="gd-feat-dialog" role="dialog" aria-modal="true" aria-labelledby="gd-feat-title">
<button type="button" class="gd-feat-x" data-close aria-label="Close">×</button>
<div class="gd-feat-banner"><span class="gd-feat-iconwrap" id="gd-feat-icon"></span></div>
<div class="gd-feat-body">
<h3 id="gd-feat-title" class="gd-feat-title"></h3>
<p id="gd-feat-desc" class="gd-feat-desc"></p>
<a id="gd-feat-link" class="gd-feat-cta" href="#">Learn more <span class="gd-feat-arrow">→</span></a>
</div>
</div>
</div>
<script>
(function(){
var ICONS = {"book-open": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 7v14\"/><path d=\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>", "moon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"/></svg>", "sparkles": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\"/><path d=\"M20 2v4\"/><path d=\"M22 4h-4\"/><circle cx=\"4\" cy=\"20\" r=\"2\"/></svg>", "layers": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\"/><path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\"/><path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\"/></svg>", "rocket": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"/><path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\"/><path d=\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\"/><path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"/></svg>", "terminal": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 19h8\"/><path d=\"m4 17 6-6-6-6\"/></svg>", "palette": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z\"/><circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/></svg>", "zap": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"/></svg>", "history": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/><path d=\"M3 3v5h5\"/><path d=\"M12 7v5l4 2\"/></svg>", "table": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 3v18\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/></svg>", "maximize": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M8 3H5a2 2 0 0 0-2 2v3\"/><path d=\"M21 8V5a2 2 0 0 0-2-2h-3\"/><path d=\"M3 16v3a2 2 0 0 0 2 2h3\"/><path d=\"M16 21h3a2 2 0 0 0 2-2v-3\"/></svg>", "file-text": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"/><path d=\"M14 2v5a1 1 0 0 0 1 1h5\"/><path d=\"M10 9H8\"/><path d=\"M16 13H8\"/><path d=\"M16 17H8\"/></svg>", "chevrons-up-down": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"m7 15 5 5 5-5\"/><path d=\"m7 9 5-5 5 5\"/></svg>", "tag": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\"/><circle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/></svg>", "workflow": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><rect width=\"8\" height=\"8\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M7 11v4a2 2 0 0 0 2 2h4\"/><rect width=\"8\" height=\"8\" x=\"13\" y=\"13\" rx=\"2\"/></svg>", "grid-2x2": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 3v18\"/><path d=\"M3 12h18\"/><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/></svg>", "scan-line": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M3 7V5a2 2 0 0 1 2-2h2\"/><path d=\"M17 3h2a2 2 0 0 1 2 2v2\"/><path d=\"M21 17v2a2 2 0 0 1-2 2h-2\"/><path d=\"M7 21H5a2 2 0 0 1-2-2v-2\"/><path d=\"M7 12h10\"/></svg>", "spell-check": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"m6 16 6-12 6 12\"/><path d=\"M8 12h8\"/><path d=\"m16 20 2 2 4-4\"/></svg>", "languages": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"m5 8 6 6\"/><path d=\"m4 14 6-6 2-3\"/><path d=\"M2 5h12\"/><path d=\"M7 2h1\"/><path d=\"m22 22-5-10-5 10\"/><path d=\"M14 18h6\"/></svg>", "keyboard": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M10 8h.01\"/><path d=\"M12 12h.01\"/><path d=\"M14 8h.01\"/><path d=\"M16 12h.01\"/><path d=\"M18 8h.01\"/><path d=\"M6 8h.01\"/><path d=\"M7 16h10\"/><path d=\"M8 12h.01\"/><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/></svg>", "layout-list": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"/><path d=\"M14 4h7\"/><path d=\"M14 9h7\"/><path d=\"M14 15h7\"/><path d=\"M14 20h7\"/></svg>", "search": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>", "megaphone": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z\"/><path d=\"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14\"/><path d=\"M8 6v8\"/></svg>", "image": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>", "git-compare": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><circle cx=\"18\" cy=\"18\" r=\"3\"/><circle cx=\"6\" cy=\"6\" r=\"3\"/><path d=\"M13 6h3a2 2 0 0 1 2 2v7\"/><path d=\"M11 18H8a2 2 0 0 1-2-2V9\"/></svg>", "link": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>", "package": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\"/><path d=\"M12 22V12\"/><polyline points=\"3.29 7 12 12 20.71 7\"/><path d=\"m7.5 4.27 9 5.15\"/></svg>", "file-down": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"/><path d=\"M14 2v5a1 1 0 0 0 1 1h5\"/><path d=\"M12 18v-6\"/><path d=\"m9 15 3 3 3-3\"/></svg>", "scaling": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M14 15H9v-5\"/><path d=\"M16 3h5v5\"/><path d=\"M21 3 9 15\"/></svg>", "code": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"m16 18 6-6-6-6\"/><path d=\"m8 6-6 6 6 6\"/></svg>", "flag": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\"/></svg>", "file-json": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"/><path d=\"M14 2v5a1 1 0 0 0 1 1h5\"/><path d=\"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\"/><path d=\"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\"/></svg>", "link-2": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M9 17H7A5 5 0 0 1 7 7h2\"/><path d=\"M15 7h2a5 5 0 1 1 0 10h-2\"/><line x1=\"8\" x2=\"16\" y1=\"12\" y2=\"12\"/></svg>", "share-2": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><circle cx=\"18\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"12\" r=\"3\"/><circle cx=\"18\" cy=\"19\" r=\"3\"/><line x1=\"8.59\" x2=\"15.42\" y1=\"13.51\" y2=\"17.49\"/><line x1=\"15.41\" x2=\"8.59\" y1=\"6.51\" y2=\"10.49\"/></svg>", "users": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><path d=\"M16 3.128a4 4 0 0 1 0 7.744\"/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/></svg>", "newspaper": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M15 18h-5\"/><path d=\"M18 14h-8\"/><path d=\"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9a2 2 0 0 1 2-2h2\"/><rect width=\"8\" height=\"4\" x=\"10\" y=\"6\" rx=\"1\"/></svg>", "video": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\"/><rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\"/></svg>", "droplet": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z\"/></svg>", "server": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><rect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\"/><rect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\"/><line x1=\"6\" x2=\"6.01\" y1=\"6\" y2=\"6\"/><line x1=\"6\" x2=\"6.01\" y1=\"18\" y2=\"18\"/></svg>", "settings": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>", "refresh-cw": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M8 16H3v5\"/></svg>", "app-window": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"gd-feat-ic\" aria-hidden=\"true\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/><path d=\"M10 4v4\"/><path d=\"M2 8h20\"/><path d=\"M6 4v4\"/></svg>"};
var modal = document.getElementById('gd-feat-modal');
if(!modal) return;
var titleEl = document.getElementById('gd-feat-title');
var descEl = document.getElementById('gd-feat-desc');
var linkEl = document.getElementById('gd-feat-link');
var iconEl = document.getElementById('gd-feat-icon');
var xBtn = modal.querySelector('.gd-feat-x');
var lastFocus = null;
function open(el){
lastFocus = el;
iconEl.innerHTML = ICONS[el.getAttribute('data-i')] || '';
titleEl.textContent = (el.textContent || '').replace(/\u00AD/g,'');
descEl.textContent = el.getAttribute('data-d') || '';
var h = el.getAttribute('data-h');
if(h){ linkEl.href = 'user-guide/' + h + '.html'; linkEl.style.display=''; }
else { linkEl.style.display='none'; }
modal.hidden = false;
requestAnimationFrame(function(){ modal.classList.add('is-open'); });
document.body.style.overflow = 'hidden';
xBtn.focus();
}
function close(){
modal.classList.remove('is-open');
document.body.style.overflow = '';
setTimeout(function(){ modal.hidden = true; }, 240);
if(lastFocus){ lastFocus.focus(); }
}
Array.prototype.forEach.call(document.querySelectorAll('.gd-fw-link'), function(el){
el.addEventListener('click', function(){ open(el); });
el.addEventListener('keydown', function(e){
if(e.key === 'Enter' || e.key === ' '){ e.preventDefault(); open(el); }
});
});
Array.prototype.forEach.call(modal.querySelectorAll('[data-close]'), function(b){
b.addEventListener('click', close);
});
document.addEventListener('keydown', function(e){
if(e.key === 'Escape' && !modal.hidden){ close(); }
});
})();
</script>
```
```{=html}
<hr class="gd-fw-rule">
<div class="gd-fw-closing">
<p>Something missing? <a href="https://github.com/posit-dev/great-docs/issues">Open an issue</a>.</p>
</div>
```