@pokle/basecoat 0.3.10-beta2.pokle

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/.eleventy.js +47 -0
  2. package/.gitattributes +1 -0
  3. package/.gitignore +12 -0
  4. package/AGENTS.md +112 -0
  5. package/CONTRIBUTING.md +15 -0
  6. package/LICENSE.md +21 -0
  7. package/README.md +29 -0
  8. package/ROADMAP.md +20 -0
  9. package/docs/css/custom.css +92 -0
  10. package/docs/css/highlight.css +151 -0
  11. package/docs/css/styles.css +8 -0
  12. package/docs/css/themes/claude.css +95 -0
  13. package/docs/css/themes/doom-64.css +95 -0
  14. package/docs/css/themes/supabase.css +100 -0
  15. package/docs/src/_data/site.js +10 -0
  16. package/docs/src/_includes/layouts/base.njk +112 -0
  17. package/docs/src/_includes/layouts/layout.njk +15 -0
  18. package/docs/src/_includes/layouts/page.njk +21 -0
  19. package/docs/src/_includes/macros/code_block.njk +23 -0
  20. package/docs/src/_includes/macros/code_preview.njk +26 -0
  21. package/docs/src/_includes/macros/toc.njk +20 -0
  22. package/docs/src/_includes/partials/header.njk +64 -0
  23. package/docs/src/_includes/partials/kitchen-sink/accordion.njk +89 -0
  24. package/docs/src/_includes/partials/kitchen-sink/alert-dialog.njk +26 -0
  25. package/docs/src/_includes/partials/kitchen-sink/alert.njk +72 -0
  26. package/docs/src/_includes/partials/kitchen-sink/avatar.njk +37 -0
  27. package/docs/src/_includes/partials/kitchen-sink/badge.njk +47 -0
  28. package/docs/src/_includes/partials/kitchen-sink/breadcrumb.njk +42 -0
  29. package/docs/src/_includes/partials/kitchen-sink/button.njk +101 -0
  30. package/docs/src/_includes/partials/kitchen-sink/card.njk +147 -0
  31. package/docs/src/_includes/partials/kitchen-sink/checkbox.njk +34 -0
  32. package/docs/src/_includes/partials/kitchen-sink/combobox.njk +83 -0
  33. package/docs/src/_includes/partials/kitchen-sink/dialog.njk +65 -0
  34. package/docs/src/_includes/partials/kitchen-sink/dropdown-menu.njk +294 -0
  35. package/docs/src/_includes/partials/kitchen-sink/form.njk +106 -0
  36. package/docs/src/_includes/partials/kitchen-sink/input.njk +27 -0
  37. package/docs/src/_includes/partials/kitchen-sink/label.njk +30 -0
  38. package/docs/src/_includes/partials/kitchen-sink/pagination.njk +34 -0
  39. package/docs/src/_includes/partials/kitchen-sink/popover.njk +43 -0
  40. package/docs/src/_includes/partials/kitchen-sink/radio-group.njk +33 -0
  41. package/docs/src/_includes/partials/kitchen-sink/select.njk +99 -0
  42. package/docs/src/_includes/partials/kitchen-sink/skeleton.njk +40 -0
  43. package/docs/src/_includes/partials/kitchen-sink/slider.njk +38 -0
  44. package/docs/src/_includes/partials/kitchen-sink/switch.njk +27 -0
  45. package/docs/src/_includes/partials/kitchen-sink/table.njk +74 -0
  46. package/docs/src/_includes/partials/kitchen-sink/tabs.njk +105 -0
  47. package/docs/src/_includes/partials/kitchen-sink/textarea.njk +27 -0
  48. package/docs/src/_includes/partials/kitchen-sink/toast.njk +25 -0
  49. package/docs/src/_includes/partials/kitchen-sink/tooltip.njk +24 -0
  50. package/docs/src/_includes/partials/sidebar.njk +139 -0
  51. package/docs/src/assets/apple-touch-icon.png +0 -0
  52. package/docs/src/assets/favicon.svg +12 -0
  53. package/docs/src/assets/images/avatar-1.png +0 -0
  54. package/docs/src/assets/images/avatar-2.png +0 -0
  55. package/docs/src/assets/images/avatar-3.png +0 -0
  56. package/docs/src/assets/images/screenshot.png +0 -0
  57. package/docs/src/assets/social-screenshot.png +0 -0
  58. package/docs/src/assets/social.png +0 -0
  59. package/docs/src/assets/styles.css +6309 -0
  60. package/docs/src/components/accordion.njk +75 -0
  61. package/docs/src/components/alert-dialog.njk +119 -0
  62. package/docs/src/components/alert.njk +108 -0
  63. package/docs/src/components/avatar.njk +40 -0
  64. package/docs/src/components/badge.njk +93 -0
  65. package/docs/src/components/breadcrumb.njk +71 -0
  66. package/docs/src/components/button-group.njk +290 -0
  67. package/docs/src/components/button.njk +141 -0
  68. package/docs/src/components/card.njk +156 -0
  69. package/docs/src/components/carousel.njk +102 -0
  70. package/docs/src/components/chart.njk +814 -0
  71. package/docs/src/components/checkbox.njk +101 -0
  72. package/docs/src/components/combobox.njk +293 -0
  73. package/docs/src/components/command.njk +288 -0
  74. package/docs/src/components/dialog.njk +177 -0
  75. package/docs/src/components/dropdown-menu.njk +403 -0
  76. package/docs/src/components/empty.njk +157 -0
  77. package/docs/src/components/field.njk +459 -0
  78. package/docs/src/components/form.njk +79 -0
  79. package/docs/src/components/input-group.njk +372 -0
  80. package/docs/src/components/input.njk +90 -0
  81. package/docs/src/components/item.njk +320 -0
  82. package/docs/src/components/kbd.njk +76 -0
  83. package/docs/src/components/label.njk +41 -0
  84. package/docs/src/components/pagination.njk +48 -0
  85. package/docs/src/components/popover.njk +174 -0
  86. package/docs/src/components/progress.njk +44 -0
  87. package/docs/src/components/radio-group.njk +48 -0
  88. package/docs/src/components/select.njk +457 -0
  89. package/docs/src/components/sidebar.njk +219 -0
  90. package/docs/src/components/skeleton.njk +51 -0
  91. package/docs/src/components/slider.njk +47 -0
  92. package/docs/src/components/spinner.njk +214 -0
  93. package/docs/src/components/switch.njk +54 -0
  94. package/docs/src/components/table.njk +87 -0
  95. package/docs/src/components/tabs.njk +232 -0
  96. package/docs/src/components/textarea.njk +90 -0
  97. package/docs/src/components/theme-switcher.njk +111 -0
  98. package/docs/src/components/toast.njk +279 -0
  99. package/docs/src/components/tooltip.njk +53 -0
  100. package/docs/src/fragments/toast/error.njk +6 -0
  101. package/docs/src/fragments/toast/info.njk +5 -0
  102. package/docs/src/fragments/toast/success.njk +7 -0
  103. package/docs/src/fragments/toast/warning.njk +5 -0
  104. package/docs/src/index.njk +336 -0
  105. package/docs/src/installation.njk +275 -0
  106. package/docs/src/introduction.njk +63 -0
  107. package/docs/src/kitchen-sink.njk +52 -0
  108. package/docs/src/llms.txt +506 -0
  109. package/docs/src/robots.njk +7 -0
  110. package/docs/src/sitemap.njk +15 -0
  111. package/docs/src/test.njk +39 -0
  112. package/package.json +51 -0
  113. package/packages/cli/README.md +55 -0
  114. package/packages/cli/index.js +193 -0
  115. package/packages/cli/package.json +44 -0
  116. package/packages/css/README.md +63 -0
  117. package/packages/css/package.json +63 -0
  118. package/scripts/build.js +170 -0
  119. package/src/css/basecoat.cdn.css +2 -0
  120. package/src/css/basecoat.css +1310 -0
  121. package/src/jinja/command.html.jinja +206 -0
  122. package/src/jinja/dialog.html.jinja +94 -0
  123. package/src/jinja/dropdown-menu.html.jinja +124 -0
  124. package/src/jinja/popover.html.jinja +48 -0
  125. package/src/jinja/select.html.jinja +196 -0
  126. package/src/jinja/sidebar.html.jinja +144 -0
  127. package/src/jinja/tabs.html.jinja +78 -0
  128. package/src/jinja/toast.html.jinja +117 -0
  129. package/src/js/basecoat.js +99 -0
  130. package/src/js/command.js +175 -0
  131. package/src/js/dropdown-menu.js +171 -0
  132. package/src/js/popover.js +73 -0
  133. package/src/js/select.js +432 -0
  134. package/src/js/sidebar.js +104 -0
  135. package/src/js/tabs.js +63 -0
  136. package/src/js/toast.js +181 -0
  137. package/src/nunjucks/command.njk +206 -0
  138. package/src/nunjucks/dialog.njk +92 -0
  139. package/src/nunjucks/dropdown-menu.njk +124 -0
  140. package/src/nunjucks/popover.njk +48 -0
  141. package/src/nunjucks/select.njk +196 -0
  142. package/src/nunjucks/sidebar.njk +144 -0
  143. package/src/nunjucks/tabs.njk +78 -0
  144. package/src/nunjucks/toast.njk +117 -0
  145. package/wrangler.jsonc +7 -0
@@ -0,0 +1,75 @@
1
+ ---
2
+ layout: layouts/page.njk
3
+ title: Accordion
4
+ description: A vertically stacked set of interactive headings that each reveal a section of content.
5
+ toc:
6
+ - label: Usage
7
+ id: usage
8
+ ---
9
+
10
+ {% from "macros/code_preview.njk" import code_preview %}
11
+
12
+ <div class="alert mb-6">
13
+ {% lucide "circle-alert" %}
14
+ <h2>There is no dedicated Accordion component in Basecoat.</h2>
15
+ </div>
16
+
17
+ {% set code %}<section class="accordion">
18
+ <details class="group border-b last:border-b-0 ">
19
+ <summary class="w-full focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] transition-all outline-none rounded-md">
20
+ <h2 class="flex flex-1 items-start justify-between gap-4 py-4 text-left text-sm font-medium hover:underline ">
21
+ Is it accessible?
22
+ {% lucide "chevron-down", { "class": "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200 group-open:rotate-180" } %}
23
+ </h2>
24
+ </summary>
25
+ <section class="pb-4">
26
+ <p class="text-sm">Yes. It adheres to the WAI-ARIA design pattern.</p>
27
+ </section>
28
+ </details>
29
+ <details class="group border-b last:border-b-0">
30
+ <summary class="w-full focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] transition-all outline-none rounded-md">
31
+ <h2 class="flex flex-1 items-start justify-between gap-4 py-4 text-left text-sm font-medium hover:underline ">
32
+ Is it styled?
33
+ {% lucide "chevron-down", { "class": "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200 group-open:rotate-180" } %}
34
+ </h2>
35
+ </summary>
36
+ <section class="pb-4">
37
+ <p class="text-sm">Yes. It comes with default styles that matches the other components' aesthetic.</p>
38
+ </section>
39
+ </details>
40
+ <details class="group border-b last:border-b-0">
41
+ <summary class="w-full focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] transition-all outline-none rounded-md">
42
+ <h2 class="flex flex-1 items-start justify-between gap-4 py-4 text-left text-sm font-medium hover:underline ">
43
+ Is it animated?
44
+ {% lucide "chevron-down", { "class": "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200 group-open:rotate-180" } %}
45
+ </h2>
46
+ </summary>
47
+ <section>
48
+ <p class="text-sm whitespace-pre-wrap">Yes. It's animated by default, but you can disable it if you prefer.</p>
49
+ </section>
50
+ </details>
51
+ </section>
52
+ <script>
53
+ (() => {
54
+ const accordions = document.querySelectorAll('.accordion');
55
+ accordions.forEach(accordion => {
56
+ accordion.addEventListener('click', (event) => {
57
+ const summary = event.target.closest('summary');
58
+ if (!summary) return;
59
+ const details = summary.closest('details');
60
+ if (!details) return;
61
+ accordion.querySelectorAll('details').forEach(detailsEl => {
62
+ if (detailsEl !== details) {
63
+ detailsEl.removeAttribute('open');
64
+ }
65
+ });
66
+ });
67
+ });
68
+ })();
69
+ </script>
70
+ {% endset %}
71
+ {{ code_preview("accordion", code | prettyHtml, "w-full max-w-md") }}
72
+
73
+ <h2 id="usage"><a href="#usage">Usage</a></h2>
74
+
75
+ <p class="prose">Basecoat already animates <code>&lt;details&gt;</code> elements by default. The example add some Tailwind CSS utility classes for style and a bit of vanilla JavaScript to handle the open/close state.</p>
@@ -0,0 +1,119 @@
1
+ ---
2
+ layout: layouts/page.njk
3
+ title: Alert Dialog
4
+ description: A modal dialog that interrupts the user with important content and expects a response.
5
+ toc:
6
+ - label: Usage
7
+ id: usage
8
+ children:
9
+ - label: HTML
10
+ id: usage-html
11
+ - label: Jinja and Nunjucks
12
+ id: usage-macro
13
+ ---
14
+
15
+ {% from "macros/code_preview.njk" import code_preview %}
16
+ {% from "macros/code_block.njk" import code_block %}
17
+ {% from "dialog.njk" import dialog %}
18
+
19
+ {% set code_html %}
20
+ {% set footer %}
21
+ <button class="btn-outline" onclick="document.getElementById('alert-dialog').close()">Cancel</button>
22
+ <button class="btn-primary" onclick="document.getElementById('alert-dialog').close()">Continue</button>
23
+ {% endset %}
24
+ {{ dialog(
25
+ id="alert-dialog",
26
+ title="Are you absolutely sure?",
27
+ description="This action cannot be undone. This will permanently delete your account and remove your data from our servers.",
28
+ trigger="Open alert dialog",
29
+ trigger_attrs={"class": "btn-outline"},
30
+ footer=footer,
31
+ close_button=false,
32
+ close_on_overlay_click=false
33
+ ) }}
34
+ {% endset %}
35
+
36
+ {{ code_preview("alert-dialog", code_html | prettyHtml) }}
37
+
38
+ <h2 id="usage"><a href="#usage">Usage</a></h2>
39
+
40
+ <h3 id="usage-default"><a href="#usage-html">HTML</a></h3>
41
+
42
+ <section class="prose">
43
+ <p>The Alert Dialog component is identical to <a href="/components/dialog" class="font-medium underline underline-offset-4">Dialog</a> except for two small differences: we do not display a close button and we do not let the user close the dialog when clicking on the backdrop (no <code>onclick</code> attribute on the <code>&lt;dialog&gt;</code> or the <code>&lt;article&gt;</code> elements).</p>
44
+ </section>
45
+
46
+ {{ code_block(code_html | prettyHtml) }}
47
+
48
+ <section class="prose">
49
+ <p>The component has the following HTML structure:</p>
50
+ <dl>
51
+ <dt><code class="highlight language-html">&lt;button type="button"&gt;</code> <span class="badge-secondary">Optional</span></dt>
52
+ <dd>The trigger button to open the alert dialog (using <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal" target="_blank">the native <code>showModal()</code> method</a>).</dd>
53
+ <dt><code class="highlight language-html">&lt;dialog class="dialog" id="{ DIALOG_ID }"&gt;</code></dt>
54
+ <dd>Wraps the whole component and acts as the backdrop. It can also have the following attributes:
55
+ <ul>
56
+ <li><code>aria-labelledby="{ TITLE_ID }"</code>: linked to by the <code>aria-labelledby</code> attribute of the dialog.</li>
57
+ <li><code>aria-describedby="{ DESCRIPTION_ID }"</code>: linked to by the <code>aria-describedby</code> attribute of the <code>&lt;dialog&gt;</code>.</li>
58
+ </ul>
59
+ <dl>
60
+ <dt><code class="highlight language-html">&lt;article&gt;</code></dt>
61
+ <dd>Wraps the content of the alert dialog.
62
+ <dl>
63
+ <dt><code class="highlight language-html">&lt;header&gt;</code></dt>
64
+ <dd>Contains the header for the alert dialog:
65
+ <dl>
66
+ <dt><code class="highlight language-html">&lt;h2&gt;</code></dt>
67
+ <dd>The title of the alert dialog, must have an <code>id</code> if you use the <code>aria-labelledby</code> attribute on the <code>&lt;dialog&gt;</code>.</dd>
68
+ <dt><code class="highlight language-html">&lt;p&gt;</code> <span class="badge-secondary">Optional</span></dt>
69
+ <dd>The description of the alert dialog, must have an <code>id</code> if you use the <code>aria-describedby</code> attribute on the <code>&lt;dialog&gt;</code>.</dd>
70
+ </dl>
71
+ </dd>
72
+ <dt><code class="highlight language-html">&lt;section&gt;</code> <span class="badge-secondary">Optional</span></dt>
73
+ <dd>For the content.</dd>
74
+ <dt><code class="highlight language-html">&lt;footer&gt;</code> <span class="badge-secondary">Optional</span></dt>
75
+ <dd>Usually contains actions.</dd>
76
+ </dl>
77
+ </dd>
78
+ </dl>
79
+ </dd>
80
+ </dl>
81
+ </section>
82
+
83
+ <h3 id="usage-macro"><a href="#usage-macro">Jinja and Nunjucks</a></h3>
84
+
85
+ <div class="prose">
86
+ <p>You can use the <code class="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-xs">dialog()</code> Nunjucks or Jinja macro for this component. Make sure to set <code>close_on_overlay_click</code> and <code>close_button</code> to <code>False</code> (or <code>false</code> for Nunjucks).</p>
87
+ </div>
88
+
89
+ <div class="flex flex-wrap gap-2 my-6">
90
+ <a class="badge-outline" href="/installation/#install-macros" target="_blank">
91
+ Use Nunjucks or Jinja macros
92
+ {% lucide "arrow-right" %}
93
+ </a>
94
+ <a class="badge-outline" href="https://github.com/hunvreus/basecoat/blob/main/src/jinja/dialog.html.jinja" target="_blank">
95
+ Jinja macro
96
+ {% lucide "arrow-right" %}
97
+ </a>
98
+ <a class="badge-outline" href="https://github.com/hunvreus/basecoat/blob/main/src/nunjucks/dialog.njk" target="_blank">
99
+ Nunjucks macro
100
+ {% lucide "arrow-right" %}
101
+ </a>
102
+ </div>
103
+
104
+ {% set raw_code %}{% raw %}{% set footer %}
105
+ <button class="btn-outline" onclick="document.getElementById('demo-alert-dialog').close()">Cancel</button>
106
+ <button class="btn-primary" onclick="document.getElementById('demo-alert-dialog').close()">Continue</button>
107
+ {% endset %}
108
+ {{ dialog(
109
+ id="demo-alert-dialog",
110
+ title="Are you absolutely sure?",
111
+ description="This action cannot be undone. This will permanently delete your account and remove your data from our servers.",
112
+ trigger="Open Alert Dialog",
113
+ trigger_attrs={"class": "btn-outline"},
114
+ footer=footer,
115
+ close_button=False,
116
+ close_on_overlay_click=False
117
+ ) }}{% endraw %}
118
+ {% endset%}
119
+ {{ code_block(raw_code, "jinja") }}
@@ -0,0 +1,108 @@
1
+ ---
2
+ layout: layouts/page.njk
3
+ title: Alert
4
+ description: Displays a callout for user attention.
5
+ toc:
6
+ - label: Usage
7
+ id: usage
8
+ - label: Examples
9
+ id: examples
10
+ children:
11
+ - label: Destructive
12
+ id: example-destructive
13
+ - label: No description
14
+ id: example-no-description
15
+ - label: No icon
16
+ id: example-no-icon
17
+ ---
18
+
19
+ {% from "macros/code_preview.njk" import code_preview %}
20
+ {% from "macros/code_block.njk" import code_block %}
21
+
22
+ {% set code %}
23
+ <div class="grid w-full max-w-xl items-start gap-4">
24
+ <div class="alert">
25
+ {% lucide "circle-check" %}
26
+ <h2>Success! Your changes have been saved</h2>
27
+ <section>This is an alert with icon, title and description.</section>
28
+ </div>
29
+ <div class="alert">
30
+ {% lucide "popcorn" %}
31
+ <h2>This Alert has a title and an icon. No description.</h2>
32
+ <section>This is an alert with icon, title and description.</section>
33
+ </div>
34
+ <div class="alert-destructive">
35
+ {% lucide "circle-check" %}
36
+ <h2>Unable to process your payment.</h2>
37
+ <section>
38
+ <p>Please verify your billing information and try again.</p>
39
+ <ul class="list-inside list-disc text-sm">
40
+ <li>Check your card details</li>
41
+ <li>Ensure sufficient funds</li>
42
+ <li>Verify billing address</li>
43
+ </ul>
44
+ </section>
45
+ </div>
46
+ </div>
47
+ {% endset %}
48
+ {{ code_preview("alert", code | prettyHtml) }}
49
+
50
+ <h2 id="usage">Usage</h2>
51
+
52
+ <section class="prose">
53
+ <p>Use the <code>alert</code> or <code>alert-destructive</code>.</p>
54
+ </section>
55
+
56
+ {% set code_simple %}
57
+ <div class="alert">
58
+ {% lucide "circle-check" %}
59
+ <h2>Success! Your changes have been saved</h2>
60
+ <section>This is an alert with icon, title and description.</section>
61
+ </div>
62
+ {% endset %}
63
+ {{ code_block(code_simple | prettyHtml) }}
64
+
65
+ <section class="prose">
66
+ <p>The component has the following HTML structure:</p>
67
+ <dl>
68
+ <dt><code class="highlight language-html">&lt;div class="alert"&gt;</code></dt>
69
+ <dd>Main container. Use <code>alert</code> for default styling or <code>alert-destructive</code> for error states.
70
+ <dl>
71
+ <dt><code class="highlight language-html">&lt;svg&gt;</code> <span class="badge-secondary">Optional</span></dt>
72
+ <dd>The icon.</dd>
73
+ <dt><code class="highlight language-html">&lt;h2&gt;</code></dt>
74
+ <dd>The title.</dd>
75
+ <dt><code class="highlight language-html">&lt;section&gt;</code> <span class="badge-secondary">Optional</span></dt>
76
+ <dd>The description.</dd>
77
+ </dl>
78
+ </dd>
79
+ </dl>
80
+ </section>
81
+
82
+ <h2 id="examples"><a href="#examples">Examples</a></h2>
83
+
84
+ <h3 id="example-destructive"><a href="#example-destructive">Destructive</a></h3>
85
+
86
+ {% set code %}<div class="alert-destructive">
87
+ {% lucide "circle-alert" %}
88
+ <h2>Something went wrong!</h2>
89
+ <section>Your session has expired. Please log in again.</section>
90
+ </div>{% endset %}
91
+ {{ code_preview("alert-destructive", code) }}
92
+
93
+ <h3 id="example-no-description"><a href="#example-no-description">No description</a></h3>
94
+
95
+ {% set code %}
96
+ <div class="alert">
97
+ {% lucide "shield-alert" %}
98
+ <h2>This is a very long alert title that demonstrates how the component handles extended text content and potentially wraps across multiple lines</h2>
99
+ </div>{% endset %}
100
+ {{ code_preview("alert-no-description", code) }}
101
+
102
+ <h3 id="example-no-icon"><a href="#example-no-icon">No icon</a></h3>
103
+
104
+ {% set code %}<div class="alert">
105
+ <h2>Success! Your changes have been saved</h2>
106
+ <section>This is an alert with title and description only.</section>
107
+ </div>{% endset %}
108
+ {{ code_preview("alert-no-icon", code) }}
@@ -0,0 +1,40 @@
1
+ ---
2
+ layout: layouts/page.njk
3
+ title: Avatar
4
+ description: An image element with a fallback for representing the user.
5
+ toc:
6
+ - label: Usage
7
+ id: usage
8
+ ---
9
+
10
+ {% from "macros/code_preview.njk" import code_preview %}
11
+ {% from "macros/code_block.njk" import code_block %}
12
+
13
+ <div class="alert mb-6">
14
+ {% lucide "circle-alert" %}
15
+ <h2>There is no dedicated Avatar component in Basecoat.</h2>
16
+ </div>
17
+
18
+ {% set code %}
19
+ <div class="flex flex-row flex-wrap items-center gap-12">
20
+ <img class="size-8 shrink-0 object-cover rounded-full" alt="@hunvreus" src="https://github.com/hunvreus.png">
21
+ <img class="size-8 shrink-0 object-cover rounded-lg" alt="@shadcn" src="https://github.com/shadcn.png">
22
+ <div class="flex -space-x-2 [&_img]:ring-background [&_img]:ring-2 [&_img]:grayscale [&_img]:size-8 [&_img]:shrink-0 [&_img]:object-cover [&_img]:rounded-full">
23
+ <img alt="@hunvreus" src="https://github.com/hunvreus.png">
24
+ <img alt="@shadcn" src="https://github.com/shadcn.png">
25
+ <img alt="@adamwathan" src="https://github.com/adamwathan.png">
26
+ </div>
27
+ </div>
28
+ {% endset %}
29
+ {{ code_preview("avatar", code | prettyHtml, "w-full max-w-md") }}
30
+
31
+ <h2 id="usage"><a href="#usage">Usage</a></h2>
32
+
33
+ <section class="prose">
34
+ <p>Avatars are just <code>&lt;img&gt;</code> elements styled with Tailwind utility classes.</p>
35
+ </section>
36
+
37
+ {% set code_simple %}
38
+ <img class="size-8 shrink-0 object-cover rounded-full" alt="@hunvreus" src="https://github.com/hunvreus.png">
39
+ {% endset %}
40
+ {{ code_block(code_simple | prettyHtml, "html") }}
@@ -0,0 +1,93 @@
1
+ ---
2
+ layout: layouts/page.njk
3
+ title: Badge
4
+ description: Displays a badge or a component that looks like a badge.
5
+ toc:
6
+ - label: Usage
7
+ id: usage
8
+ - label: Examples
9
+ id: examples
10
+ children:
11
+ - label: Primary
12
+ id: example-primary
13
+ - label: Secondary
14
+ id: example-secondary
15
+ - label: Destructive
16
+ id: example-destructive
17
+ - label: Outline
18
+ id: example-outline
19
+ - label: With icon
20
+ id: example-with-icon
21
+ - label: Link
22
+ id: example-link
23
+ ---
24
+
25
+ {% from "macros/code_preview.njk" import code_preview %}
26
+ {% from "macros/code_block.njk" import code_block %}
27
+
28
+ {% set code %}
29
+ <div class="flex flex-col items-center gap-2">
30
+ <div class="flex w-full flex-wrap gap-2">
31
+ <span class="badge">Badge</span>
32
+ <span class="badge-secondary">Secondary</span>
33
+ <span class="badge-destructive">Destructive</span>
34
+ <span class="badge-outline">Outline</span>
35
+ </div>
36
+ <div class="flex w-full flex-wrap gap-2">
37
+ <span class="badge-secondary bg-blue-500 text-white dark:bg-blue-600">
38
+ {% lucide "badge-check" %}
39
+ Verified
40
+ </span>
41
+ <span class="badge rounded-full h-5 min-w-5 px-1 font-mono tabular-nums">8</span>
42
+ <span class="badge-destructive rounded-full h-5 min-w-5 px-1 font-mono tabular-nums">99</span>
43
+ <span class="badge-outline rounded-full h-5 min-w-5 px-1 font-mono tabular-nums">20+</span>
44
+ </div>
45
+ </div>
46
+ {% endset %}
47
+ {{ code_preview("badge", code) }}
48
+
49
+ <h2 id="usage"><a href="#usage">Usage</a></h2>
50
+
51
+ <section class="prose">
52
+ <p>Use one of the badge classes: <code>badge</code>, <code>badge-primary</code>, <code>badge-secondary</code>, <code>badge-destructive</code> or <code>badge-outline</code>.
53
+ </section>
54
+
55
+ {{ code_block(code) }}
56
+
57
+ <h2 id="examples"><a href="#examples">Examples</a></h2>
58
+
59
+ <h3 id="example-primary"><a href="#example-primary">Primary</a></h3>
60
+
61
+ {% set code %}<span class="badge">Primary</span>{% endset %}
62
+ {{ code_preview("badge-primary", code) }}
63
+
64
+ <h3 id="example-secondary"><a href="#example-secondary">Secondary</a></h3>
65
+
66
+ {% set code %}<span class="badge-secondary">Secondary</span>{% endset %}
67
+ {{ code_preview("badge-secondary", code) }}
68
+
69
+ <h3 id="example-destructive"><a href="#example-destructive">Destructive</a></h3>
70
+
71
+ {% set code %}<span class="badge-destructive">Destructive</span>{% endset %}
72
+ {{ code_preview("badge-destructive", code) }}
73
+
74
+ <h3 id="example-outline"><a href="#example-outline">Outline</a></h3>
75
+
76
+ {% set code %}<span class="badge-outline">Outline</span>{% endset %}
77
+ {{ code_preview("badge-outline", code) }}
78
+
79
+ <h3 id="example-with-icon"><a href="#example-with-icon">With icon</a></h3>
80
+
81
+ {% set code %}<span class="badge-destructive">
82
+ {% lucide "circle-alert" %}
83
+ With icon
84
+ </span>{% endset %}
85
+ {{ code_preview("badge-with-icon", code) }}
86
+
87
+ <h3 id="example-link"><a href="#example-link">Link</a></h3>
88
+
89
+ {% set code %}<a href="#" class="badge-outline">
90
+ Link
91
+ {% lucide "arrow-right" %}
92
+ </a>{% endset %}
93
+ {{ code_preview("badge-link", code) }}
@@ -0,0 +1,71 @@
1
+ ---
2
+ layout: layouts/page.njk
3
+ title: Breadcrumb
4
+ description: Displays the path to the current resource using a hierarchy of links.
5
+ toc:
6
+ - label: Usage
7
+ id: usage
8
+ ---
9
+
10
+ {% from "macros/code_preview.njk" import code_preview %}
11
+ {% from "macros/code_block.njk" import code_block %}
12
+ {% from "dropdown-menu.njk" import dropdown_menu %}
13
+
14
+ <div class="alert mb-6">
15
+ {% lucide "circle-alert" %}
16
+ <h2>There is no dedicated Breadcrumb component in Basecoat.</h2>
17
+ </div>
18
+
19
+ {% set code_html %}
20
+ <ol class="text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5">
21
+ <li class="inline-flex items-center gap-1.5">
22
+ <a href="#" class="hover:text-foreground transition-colors">Home</a>
23
+ </li>
24
+ <li>{% lucide "chevron-right", { "class": "size-3.5" } %}</li>
25
+ <li class="inline-flex items-center gap-1.5">
26
+ {% set trigger %}
27
+ {% lucide "ellipsis" %}
28
+ {% endset %}
29
+ {% call dropdown_menu(
30
+ id="demo-breadcrumb-menu",
31
+ trigger=trigger,
32
+ trigger_attrs={"class": "flex size-9 items-center justify-center h-4 w-4 hover:text-foreground cursor-pointer"}
33
+ ) %}
34
+ <nav role="menu">
35
+ <button type="button" role="menuitem">Documentation</button>
36
+ <button type="button" role="menuitem">Themes</button>
37
+ <button type="button" role="menuitem">GitHub</button>
38
+ </nav>
39
+ {% endcall %}
40
+ </li>
41
+ <li>{% lucide "chevron-right", { "class": "size-3.5" } %}</li>
42
+ <li class="inline-flex items-center gap-1.5">
43
+ <a href="#" class="hover:text-foreground transition-colors">Components</a>
44
+ </li>
45
+ <li>{% lucide "chevron-right", { "class": "size-3.5" } %}</li>
46
+ <li class="inline-flex items-center gap-1.5">
47
+ <span class="text-foreground font-normal">Breadcrumb</span>
48
+ </li>
49
+ </ol>
50
+ {% endset %}
51
+
52
+ {{ code_preview("dropdown-menu", code_html | prettyHtml) }}
53
+
54
+ <h2 id="usage"><a href="#usage">Usage</a></h2>
55
+
56
+ <section class="prose">
57
+ <p>You can style an ordered list of links combined with chevron icons as show below. The example above demonstrates a more complex use case using the <a href="/components/dropdown-menu">Dropdown Menu</a> component.</p>
58
+ </section>
59
+
60
+ {% set code_simple %}
61
+ <ol class="text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5">
62
+ <li class="inline-flex items-center gap-1.5">
63
+ <a href="#" class="hover:text-foreground transition-colors">Home</a>
64
+ </li>
65
+ <li>{% lucide "chevron-right", { "class": "size-3.5" } %}</li>
66
+ <li class="inline-flex items-center gap-1.5">
67
+ <a href="#" class="hover:text-foreground transition-colors">Components</a>
68
+ </li>
69
+ </ol>
70
+ {% endset %}
71
+ {{ code_block(code_simple | prettyHtml, "html") }}