rizzo-css 0.0.17 → 0.0.18

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 (260) hide show
  1. package/README.md +4 -4
  2. package/bin/rizzo-css.js +151 -103
  3. package/package.json +7 -3
  4. package/scaffold/astro-minimal/.env.example +3 -0
  5. package/scaffold/astro-minimal/README.md +36 -0
  6. package/scaffold/astro-minimal/package.json +13 -0
  7. package/scaffold/astro-minimal/src/layouts/Layout.astro +28 -0
  8. package/scaffold/astro-minimal/src/pages/index.astro +10 -0
  9. package/scaffold/svelte-minimal/.env.example +3 -0
  10. package/scaffold/svelte-minimal/README.md +37 -0
  11. package/scaffold/svelte-minimal/package.json +20 -0
  12. package/scaffold/svelte-minimal/src/app.d.ts +11 -0
  13. package/scaffold/svelte-minimal/src/app.html +15 -0
  14. package/scaffold/svelte-minimal/src/routes/+layout.svelte +1 -0
  15. package/scaffold/svelte-minimal/src/routes/+page.svelte +5 -0
  16. package/scaffold/svelte-minimal/svelte.config.js +10 -0
  17. package/scaffold/svelte-minimal/tsconfig.json +11 -0
  18. package/scaffold/vanilla/README.md +4 -4
  19. package/scaffold/vanilla/components/accordion.html +8 -0
  20. package/scaffold/vanilla/components/alert.html +8 -0
  21. package/scaffold/vanilla/components/avatar.html +8 -0
  22. package/scaffold/vanilla/components/badge.html +8 -0
  23. package/scaffold/vanilla/components/breadcrumb.html +8 -0
  24. package/scaffold/vanilla/components/button.html +8 -0
  25. package/scaffold/vanilla/components/cards.html +8 -0
  26. package/scaffold/vanilla/components/copy-to-clipboard.html +8 -0
  27. package/scaffold/vanilla/components/divider.html +8 -0
  28. package/scaffold/vanilla/components/dropdown.html +8 -0
  29. package/scaffold/vanilla/components/forms.html +8 -0
  30. package/scaffold/vanilla/components/icons.html +8 -0
  31. package/scaffold/vanilla/components/index.html +8 -0
  32. package/scaffold/vanilla/components/modal.html +8 -0
  33. package/scaffold/vanilla/components/navbar.html +8 -0
  34. package/scaffold/vanilla/components/pagination.html +8 -0
  35. package/scaffold/vanilla/components/progress-bar.html +8 -0
  36. package/scaffold/vanilla/components/search.html +8 -0
  37. package/scaffold/vanilla/components/settings.html +8 -0
  38. package/scaffold/vanilla/components/spinner.html +8 -0
  39. package/scaffold/vanilla/components/table.html +8 -0
  40. package/scaffold/vanilla/components/tabs.html +8 -0
  41. package/scaffold/vanilla/components/theme-switcher.html +8 -0
  42. package/scaffold/vanilla/components/toast.html +8 -0
  43. package/scaffold/vanilla/components/tooltip.html +8 -0
  44. package/scaffold/vanilla/index.html +8 -0
  45. package/scaffold/astro-app/README.md +0 -43
  46. package/scaffold/astro-app/package.json +0 -1
  47. package/scaffold/astro-app/src/components/Accordion.astro +0 -178
  48. package/scaffold/astro-app/src/components/Alert.astro +0 -131
  49. package/scaffold/astro-app/src/components/Avatar.astro +0 -59
  50. package/scaffold/astro-app/src/components/Badge.astro +0 -24
  51. package/scaffold/astro-app/src/components/Breadcrumb.astro +0 -61
  52. package/scaffold/astro-app/src/components/Button.astro +0 -3
  53. package/scaffold/astro-app/src/components/Card.astro +0 -18
  54. package/scaffold/astro-app/src/components/Checkbox.astro +0 -38
  55. package/scaffold/astro-app/src/components/CliCommandTabs.astro +0 -90
  56. package/scaffold/astro-app/src/components/CodeBlock.astro +0 -393
  57. package/scaffold/astro-app/src/components/CopyToClipboard.astro +0 -219
  58. package/scaffold/astro-app/src/components/Divider.astro +0 -37
  59. package/scaffold/astro-app/src/components/DocsSidebar.astro +0 -51
  60. package/scaffold/astro-app/src/components/Dropdown.astro +0 -807
  61. package/scaffold/astro-app/src/components/FormGroup.astro +0 -59
  62. package/scaffold/astro-app/src/components/FrameworkSwitcher.astro +0 -72
  63. package/scaffold/astro-app/src/components/Input.astro +0 -59
  64. package/scaffold/astro-app/src/components/Modal.astro +0 -212
  65. package/scaffold/astro-app/src/components/Navbar.astro +0 -623
  66. package/scaffold/astro-app/src/components/PackageInstallTabs.astro +0 -87
  67. package/scaffold/astro-app/src/components/Pagination.astro +0 -240
  68. package/scaffold/astro-app/src/components/ProgressBar.astro +0 -65
  69. package/scaffold/astro-app/src/components/Radio.astro +0 -38
  70. package/scaffold/astro-app/src/components/Search.astro +0 -1259
  71. package/scaffold/astro-app/src/components/Select.astro +0 -49
  72. package/scaffold/astro-app/src/components/Settings.astro +0 -382
  73. package/scaffold/astro-app/src/components/Spinner.astro +0 -30
  74. package/scaffold/astro-app/src/components/Table.astro +0 -181
  75. package/scaffold/astro-app/src/components/Tabs.astro +0 -223
  76. package/scaffold/astro-app/src/components/Textarea.astro +0 -58
  77. package/scaffold/astro-app/src/components/ThemeIcon.astro +0 -50
  78. package/scaffold/astro-app/src/components/ThemeSwitcher.astro +0 -504
  79. package/scaffold/astro-app/src/components/Toast.astro +0 -30
  80. package/scaffold/astro-app/src/components/Tooltip.astro +0 -32
  81. package/scaffold/astro-app/src/components/icons/Brush.astro +0 -10
  82. package/scaffold/astro-app/src/components/icons/Cake.astro +0 -11
  83. package/scaffold/astro-app/src/components/icons/Check.astro +0 -29
  84. package/scaffold/astro-app/src/components/icons/Cherry.astro +0 -11
  85. package/scaffold/astro-app/src/components/icons/ChevronDown.astro +0 -29
  86. package/scaffold/astro-app/src/components/icons/Circle.astro +0 -29
  87. package/scaffold/astro-app/src/components/icons/Close.astro +0 -30
  88. package/scaffold/astro-app/src/components/icons/Cmd.astro +0 -26
  89. package/scaffold/astro-app/src/components/icons/Copy.astro +0 -30
  90. package/scaffold/astro-app/src/components/icons/Eye.astro +0 -30
  91. package/scaffold/astro-app/src/components/icons/Filter.astro +0 -29
  92. package/scaffold/astro-app/src/components/icons/Flame.astro +0 -28
  93. package/scaffold/astro-app/src/components/icons/Flower.astro +0 -11
  94. package/scaffold/astro-app/src/components/icons/Gear.astro +0 -30
  95. package/scaffold/astro-app/src/components/icons/Heart.astro +0 -28
  96. package/scaffold/astro-app/src/components/icons/IceCream.astro +0 -31
  97. package/scaffold/astro-app/src/components/icons/Leaf.astro +0 -29
  98. package/scaffold/astro-app/src/components/icons/Lemon.astro +0 -11
  99. package/scaffold/astro-app/src/components/icons/Moon.astro +0 -29
  100. package/scaffold/astro-app/src/components/icons/Owl.astro +0 -34
  101. package/scaffold/astro-app/src/components/icons/Palette.astro +0 -33
  102. package/scaffold/astro-app/src/components/icons/Rainbow.astro +0 -31
  103. package/scaffold/astro-app/src/components/icons/Search.astro +0 -30
  104. package/scaffold/astro-app/src/components/icons/Shield.astro +0 -28
  105. package/scaffold/astro-app/src/components/icons/Snowflake.astro +0 -34
  106. package/scaffold/astro-app/src/components/icons/Sort.astro +0 -30
  107. package/scaffold/astro-app/src/components/icons/Sun.astro +0 -29
  108. package/scaffold/astro-app/src/components/icons/Sunset.astro +0 -10
  109. package/scaffold/astro-app/src/components/icons/Zap.astro +0 -9
  110. package/scaffold/astro-app/src/components/icons/devicons/Astro.astro +0 -53
  111. package/scaffold/astro-app/src/components/icons/devicons/Bash.astro +0 -34
  112. package/scaffold/astro-app/src/components/icons/devicons/Css3.astro +0 -29
  113. package/scaffold/astro-app/src/components/icons/devicons/Git.astro +0 -24
  114. package/scaffold/astro-app/src/components/icons/devicons/Html5.astro +0 -27
  115. package/scaffold/astro-app/src/components/icons/devicons/Javascript.astro +0 -25
  116. package/scaffold/astro-app/src/components/icons/devicons/Nodejs.astro +0 -47
  117. package/scaffold/astro-app/src/components/icons/devicons/Plaintext.astro +0 -33
  118. package/scaffold/astro-app/src/components/icons/devicons/React.astro +0 -27
  119. package/scaffold/astro-app/src/components/icons/devicons/Svelte.astro +0 -25
  120. package/scaffold/astro-app/src/components/icons/devicons/Vue.astro +0 -26
  121. package/scaffold/astro-app/src/config/frameworks.ts +0 -26
  122. package/scaffold/astro-app/src/config/themes.ts +0 -54
  123. package/scaffold/astro-app/src/layouts/DocsLayout.astro +0 -263
  124. package/scaffold/astro-app/src/layouts/Layout.astro +0 -41
  125. package/scaffold/astro-app/src/pages/components/accordion.astro +0 -172
  126. package/scaffold/astro-app/src/pages/components/alert.astro +0 -250
  127. package/scaffold/astro-app/src/pages/components/avatar.astro +0 -102
  128. package/scaffold/astro-app/src/pages/components/badge.astro +0 -119
  129. package/scaffold/astro-app/src/pages/components/breadcrumb.astro +0 -124
  130. package/scaffold/astro-app/src/pages/components/button.astro +0 -74
  131. package/scaffold/astro-app/src/pages/components/cards.astro +0 -247
  132. package/scaffold/astro-app/src/pages/components/copy-to-clipboard.astro +0 -49
  133. package/scaffold/astro-app/src/pages/components/divider.astro +0 -74
  134. package/scaffold/astro-app/src/pages/components/dropdown.astro +0 -394
  135. package/scaffold/astro-app/src/pages/components/forms.astro +0 -367
  136. package/scaffold/astro-app/src/pages/components/icons.astro +0 -246
  137. package/scaffold/astro-app/src/pages/components/modal.astro +0 -152
  138. package/scaffold/astro-app/src/pages/components/navbar.astro +0 -80
  139. package/scaffold/astro-app/src/pages/components/pagination.astro +0 -126
  140. package/scaffold/astro-app/src/pages/components/progress-bar.astro +0 -94
  141. package/scaffold/astro-app/src/pages/components/search.astro +0 -155
  142. package/scaffold/astro-app/src/pages/components/settings.astro +0 -78
  143. package/scaffold/astro-app/src/pages/components/spinner.astro +0 -81
  144. package/scaffold/astro-app/src/pages/components/table.astro +0 -144
  145. package/scaffold/astro-app/src/pages/components/tabs.astro +0 -220
  146. package/scaffold/astro-app/src/pages/components/theme-switcher.astro +0 -69
  147. package/scaffold/astro-app/src/pages/components/toast.astro +0 -157
  148. package/scaffold/astro-app/src/pages/components/tooltip.astro +0 -209
  149. package/scaffold/astro-app/src/pages/components.astro +0 -290
  150. package/scaffold/astro-app/src/pages/docs/accessibility.astro +0 -9
  151. package/scaffold/astro-app/src/pages/docs/colors.astro +0 -9
  152. package/scaffold/astro-app/src/pages/docs/design-system.astro +0 -9
  153. package/scaffold/astro-app/src/pages/docs/getting-started.astro +0 -9
  154. package/scaffold/astro-app/src/pages/docs/index.astro +0 -15
  155. package/scaffold/astro-app/src/pages/docs/themes/[theme].astro +0 -14
  156. package/scaffold/astro-app/src/pages/docs/theming.astro +0 -10
  157. package/scaffold/astro-app/src/pages/index.astro +0 -24
  158. package/scaffold/svelte-app/README.md +0 -39
  159. package/scaffold/svelte-app/package.json +0 -22
  160. package/scaffold/svelte-app/src/app.d.ts +0 -28
  161. package/scaffold/svelte-app/src/app.html +0 -21
  162. package/scaffold/svelte-app/src/lib/assets/favicon.svg +0 -1
  163. package/scaffold/svelte-app/src/lib/rizzo/Accordion.svelte +0 -128
  164. package/scaffold/svelte-app/src/lib/rizzo/Alert.svelte +0 -85
  165. package/scaffold/svelte-app/src/lib/rizzo/Avatar.svelte +0 -39
  166. package/scaffold/svelte-app/src/lib/rizzo/Badge.svelte +0 -31
  167. package/scaffold/svelte-app/src/lib/rizzo/Breadcrumb.svelte +0 -49
  168. package/scaffold/svelte-app/src/lib/rizzo/Button.svelte +0 -27
  169. package/scaffold/svelte-app/src/lib/rizzo/Card.svelte +0 -17
  170. package/scaffold/svelte-app/src/lib/rizzo/Checkbox.svelte +0 -37
  171. package/scaffold/svelte-app/src/lib/rizzo/CopyToClipboard.svelte +0 -79
  172. package/scaffold/svelte-app/src/lib/rizzo/Divider.svelte +0 -28
  173. package/scaffold/svelte-app/src/lib/rizzo/Dropdown.svelte +0 -254
  174. package/scaffold/svelte-app/src/lib/rizzo/FormGroup.svelte +0 -51
  175. package/scaffold/svelte-app/src/lib/rizzo/Input.svelte +0 -59
  176. package/scaffold/svelte-app/src/lib/rizzo/Modal.svelte +0 -157
  177. package/scaffold/svelte-app/src/lib/rizzo/Pagination.svelte +0 -93
  178. package/scaffold/svelte-app/src/lib/rizzo/ProgressBar.svelte +0 -58
  179. package/scaffold/svelte-app/src/lib/rizzo/Radio.svelte +0 -38
  180. package/scaffold/svelte-app/src/lib/rizzo/Select.svelte +0 -51
  181. package/scaffold/svelte-app/src/lib/rizzo/Spinner.svelte +0 -14
  182. package/scaffold/svelte-app/src/lib/rizzo/Table.svelte +0 -158
  183. package/scaffold/svelte-app/src/lib/rizzo/Tabs.svelte +0 -117
  184. package/scaffold/svelte-app/src/lib/rizzo/Textarea.svelte +0 -59
  185. package/scaffold/svelte-app/src/lib/rizzo/ThemeIcon.svelte +0 -54
  186. package/scaffold/svelte-app/src/lib/rizzo/ThemeSwitcher.svelte +0 -315
  187. package/scaffold/svelte-app/src/lib/rizzo/Toast.svelte +0 -33
  188. package/scaffold/svelte-app/src/lib/rizzo/Tooltip.svelte +0 -19
  189. package/scaffold/svelte-app/src/lib/rizzo/icons/Check.svelte +0 -29
  190. package/scaffold/svelte-app/src/lib/rizzo/icons/ChevronDown.svelte +0 -29
  191. package/scaffold/svelte-app/src/lib/rizzo/icons/Circle.svelte +0 -29
  192. package/scaffold/svelte-app/src/lib/rizzo/icons/Close.svelte +0 -30
  193. package/scaffold/svelte-app/src/lib/rizzo/icons/Cmd.svelte +0 -27
  194. package/scaffold/svelte-app/src/lib/rizzo/icons/Copy.svelte +0 -30
  195. package/scaffold/svelte-app/src/lib/rizzo/icons/Eye.svelte +0 -30
  196. package/scaffold/svelte-app/src/lib/rizzo/icons/Filter.svelte +0 -29
  197. package/scaffold/svelte-app/src/lib/rizzo/icons/Gear.svelte +0 -30
  198. package/scaffold/svelte-app/src/lib/rizzo/icons/IceCream.svelte +0 -31
  199. package/scaffold/svelte-app/src/lib/rizzo/icons/Moon.svelte +0 -29
  200. package/scaffold/svelte-app/src/lib/rizzo/icons/Owl.svelte +0 -34
  201. package/scaffold/svelte-app/src/lib/rizzo/icons/Palette.svelte +0 -33
  202. package/scaffold/svelte-app/src/lib/rizzo/icons/Rainbow.svelte +0 -31
  203. package/scaffold/svelte-app/src/lib/rizzo/icons/Search.svelte +0 -30
  204. package/scaffold/svelte-app/src/lib/rizzo/icons/Snowflake.svelte +0 -34
  205. package/scaffold/svelte-app/src/lib/rizzo/icons/Sort.svelte +0 -30
  206. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Astro.svelte +0 -45
  207. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Bash.svelte +0 -28
  208. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Css3.svelte +0 -23
  209. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Git.svelte +0 -18
  210. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Html5.svelte +0 -21
  211. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Javascript.svelte +0 -19
  212. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Nodejs.svelte +0 -44
  213. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Plaintext.svelte +0 -24
  214. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/React.svelte +0 -21
  215. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/SvelteIcon.svelte +0 -19
  216. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Vue.svelte +0 -20
  217. package/scaffold/svelte-app/src/lib/rizzo/index.ts +0 -35
  218. package/scaffold/svelte-app/src/lib/rizzo-docs/CodeBlock.svelte +0 -239
  219. package/scaffold/svelte-app/src/lib/rizzo-docs/SvelteDocPage.svelte +0 -99
  220. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AccordionDoc.svelte +0 -53
  221. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AlertDoc.svelte +0 -114
  222. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AvatarDoc.svelte +0 -92
  223. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BadgeDoc.svelte +0 -60
  224. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BreadcrumbDoc.svelte +0 -55
  225. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ButtonDoc.svelte +0 -55
  226. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CardsDoc.svelte +0 -173
  227. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComingSoon.svelte +0 -12
  228. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComponentsOverview.svelte +0 -92
  229. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CopyToClipboardDoc.svelte +0 -26
  230. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DividerDoc.svelte +0 -105
  231. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DropdownDoc.svelte +0 -161
  232. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/FormsDoc.svelte +0 -375
  233. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/IconsDoc.svelte +0 -246
  234. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Index.svelte +0 -8
  235. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ModalDoc.svelte +0 -50
  236. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/NavbarDoc.svelte +0 -79
  237. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/PaginationDoc.svelte +0 -44
  238. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ProgressBarDoc.svelte +0 -95
  239. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SearchDoc.svelte +0 -147
  240. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SettingsDoc.svelte +0 -158
  241. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SpinnerDoc.svelte +0 -41
  242. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TableDoc.svelte +0 -116
  243. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TabsDoc.svelte +0 -152
  244. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ThemeSwitcherDoc.svelte +0 -189
  245. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Theming.svelte +0 -6
  246. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ToastDoc.svelte +0 -136
  247. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TooltipDoc.svelte +0 -57
  248. package/scaffold/svelte-app/src/routes/+layout.svelte +0 -10
  249. package/scaffold/svelte-app/src/routes/+page.svelte +0 -31
  250. package/scaffold/svelte-app/src/routes/components/+page.svelte +0 -4
  251. package/scaffold/svelte-app/src/routes/components/[slug]/+page.svelte +0 -7
  252. package/scaffold/svelte-app/static/robots.txt +0 -3
  253. package/scaffold/svelte-app/svelte.config.js +0 -13
  254. package/scaffold/svelte-app/tsconfig.json +0 -21
  255. package/scaffold/svelte-app/vite.config.ts +0 -6
  256. /package/scaffold/{astro-app → astro-minimal}/astro.config.mjs +0 -0
  257. /package/scaffold/{astro-app → astro-minimal}/public/.gitkeep +0 -0
  258. /package/scaffold/{astro-app → astro-minimal}/public/favicon.svg +0 -0
  259. /package/scaffold/{astro-app → astro-minimal}/tsconfig.json +0 -0
  260. /package/scaffold/{svelte-app → svelte-minimal}/static/.gitkeep +0 -0
@@ -1,90 +0,0 @@
1
- ---
2
- import Tabs from './Tabs.astro';
3
- import CodeBlock from './CodeBlock.astro';
4
-
5
- interface Props {
6
- /** CLI command suffix, e.g. "init", "add", "theme" (will be "rizzo-css <command>") */
7
- command: string;
8
- /** Optional default tab id (npm, pnpm, yarn, bun) */
9
- defaultTab?: string;
10
- /** Optional class for the wrapper */
11
- class?: string;
12
- }
13
-
14
- const { command, defaultTab = 'npm', class: className = '' } = Astro.props;
15
-
16
- const fullCommand = `rizzo-css ${command}`;
17
- const commands = {
18
- npm: `npx ${fullCommand}`,
19
- pnpm: `pnpm dlx ${fullCommand}`,
20
- yarn: `yarn dlx ${fullCommand}`,
21
- bun: `bunx ${fullCommand}`,
22
- };
23
-
24
- const tabs = [
25
- { id: 'npm', label: 'npm' },
26
- { id: 'pnpm', label: 'pnpm' },
27
- { id: 'yarn', label: 'yarn' },
28
- { id: 'bun', label: 'bun' },
29
- ];
30
- ---
31
-
32
- <div class={`cli-command-tabs ${className}`.trim()} data-cli-command={command}>
33
- <p class="cli-command-tabs__hint">Choose your package manager — click a tab to select, then copy the command.</p>
34
- <Tabs tabs={tabs} defaultTab={defaultTab} id={`cli-tabs-${command.replace(/\s+/g, '-')}`} class="cli-command-tabs__tabs">
35
- <div class="cli-command-tabs__panel">
36
- <CodeBlock code={commands.npm} language="bash" />
37
- </div>
38
- <div class="cli-command-tabs__panel">
39
- <CodeBlock code={commands.pnpm} language="bash" />
40
- </div>
41
- <div class="cli-command-tabs__panel">
42
- <CodeBlock code={commands.yarn} language="bash" />
43
- </div>
44
- <div class="cli-command-tabs__panel">
45
- <CodeBlock code={commands.bun} language="bash" />
46
- </div>
47
- </Tabs>
48
- </div>
49
-
50
- <style>
51
- .cli-command-tabs {
52
- margin: var(--spacing-2) 0;
53
- }
54
- .cli-command-tabs__hint {
55
- font-size: var(--font-size-sm);
56
- color: var(--text-dim);
57
- margin-bottom: var(--spacing-1);
58
- }
59
- .cli-command-tabs__tabs {
60
- margin-top: 0;
61
- }
62
- /* Tabs list: no scroll, all tabs visible (global so it overrides .tabs__list in components.css) */
63
- .cli-command-tabs :global(.tabs__list) {
64
- overflow-x: visible;
65
- overflow-y: visible;
66
- flex-wrap: nowrap;
67
- scrollbar-width: none;
68
- margin-bottom: var(--spacing-2);
69
- }
70
- .cli-command-tabs :global(.tabs__list)::-webkit-scrollbar {
71
- display: none;
72
- }
73
- /* Remove default panel padding so code block sits tight */
74
- .cli-command-tabs :global(.tabs__panel) {
75
- padding: 0;
76
- min-height: 0;
77
- }
78
- .cli-command-tabs__panel {
79
- padding-top: var(--spacing-1);
80
- }
81
- .cli-command-tabs__panel :global(.code-block) {
82
- margin: 0;
83
- }
84
- .cli-command-tabs__panel :global(.code-block__header) {
85
- padding: var(--spacing-1) var(--spacing-2);
86
- }
87
- .cli-command-tabs__panel :global(.code-block pre) {
88
- padding: var(--spacing-2);
89
- }
90
- </style>
@@ -1,393 +0,0 @@
1
- ---
2
- import Copy from './icons/Copy.astro';
3
- import Check from './icons/Check.astro';
4
- import Css3 from './icons/devicons/Css3.astro';
5
- import Html5 from './icons/devicons/Html5.astro';
6
- import Javascript from './icons/devicons/Javascript.astro';
7
- import Nodejs from './icons/devicons/Nodejs.astro';
8
- import AstroIcon from './icons/devicons/Astro.astro';
9
- import Plaintext from './icons/devicons/Plaintext.astro';
10
- import Git from './icons/devicons/Git.astro';
11
- import Bash from './icons/devicons/Bash.astro';
12
- import Svelte from './icons/devicons/Svelte.astro';
13
- import React from './icons/devicons/React.astro';
14
- import Vue from './icons/devicons/Vue.astro';
15
-
16
- interface Props {
17
- code: string;
18
- language?: string;
19
- class?: string;
20
- }
21
-
22
- const {
23
- code,
24
- language = '',
25
- class: className = '',
26
- } = Astro.props;
27
-
28
- const languageLabel = language || '';
29
- const languageLower = language.toLowerCase();
30
-
31
- const codeId = `code-${Math.random().toString(36).substr(2, 9)}`;
32
- const copyButtonId = `copy-btn-${Math.random().toString(36).substr(2, 9)}`;
33
- ---
34
-
35
- <div class={`code-block ${className}`.trim()}>
36
- <div class="code-block__header">
37
- {language && (
38
- <span class="code-block__language" aria-label={languageLabel}>
39
- {languageLower === 'css' && (
40
- <>
41
- <Css3 width={20} height={20} class="code-block__language-icon" />
42
- <span class="code-block__language-text">{languageLabel}</span>
43
- </>
44
- )}
45
- {languageLower === 'html' && (
46
- <>
47
- <Html5 width={20} height={20} class="code-block__language-icon" />
48
- <span class="code-block__language-text">{languageLabel}</span>
49
- </>
50
- )}
51
- {languageLower === 'javascript' && (
52
- <>
53
- <Javascript width={20} height={20} class="code-block__language-icon" />
54
- <span class="code-block__language-text">{languageLabel}</span>
55
- </>
56
- )}
57
- {languageLower === 'nodejs' && (
58
- <>
59
- <Nodejs width={20} height={20} class="code-block__language-icon" />
60
- <span class="code-block__language-text">{languageLabel}</span>
61
- </>
62
- )}
63
- {languageLower === 'astro' && (
64
- <>
65
- <AstroIcon width={20} height={20} class="code-block__language-icon" />
66
- <span class="code-block__language-text">{languageLabel}</span>
67
- </>
68
- )}
69
- {languageLower === 'plaintext' && (
70
- <>
71
- <Plaintext width={20} height={20} class="code-block__language-icon" />
72
- <span class="code-block__language-text">{languageLabel}</span>
73
- </>
74
- )}
75
- {languageLower === 'git' && (
76
- <>
77
- <Git width={20} height={20} class="code-block__language-icon" />
78
- <span class="code-block__language-text">{languageLabel}</span>
79
- </>
80
- )}
81
- {languageLower === 'svelte' && (
82
- <>
83
- <Svelte width={20} height={20} class="code-block__language-icon" />
84
- <span class="code-block__language-text">{languageLabel}</span>
85
- </>
86
- )}
87
- {(languageLower === 'react' || languageLower === 'jsx' || languageLower === 'tsx') && (
88
- <>
89
- <React width={20} height={20} class="code-block__language-icon" />
90
- <span class="code-block__language-text">{languageLabel}</span>
91
- </>
92
- )}
93
- {languageLower === 'vue' && (
94
- <>
95
- <Vue width={20} height={20} class="code-block__language-icon" />
96
- <span class="code-block__language-text">{languageLabel}</span>
97
- </>
98
- )}
99
- {(languageLower === 'bash' || languageLower === 'shell' || languageLower === 'sh') && (
100
- <>
101
- <Bash width={20} height={20} class="code-block__language-icon" />
102
- <span class="code-block__language-text">{languageLabel}</span>
103
- </>
104
- )}
105
- {!['css', 'html', 'javascript', 'nodejs', 'astro', 'plaintext', 'git', 'svelte', 'react', 'jsx', 'tsx', 'vue', 'bash', 'shell', 'sh'].includes(languageLower) && (
106
- <span class="code-block__language-text">{language}</span>
107
- )}
108
- <span class="sr-only">{languageLabel}</span>
109
- </span>
110
- )}
111
- <span class="tooltip-host" data-tooltip="Copy code to clipboard">
112
- <button
113
- type="button"
114
- class="code-block__copy-btn"
115
- aria-label="Copy code to clipboard"
116
- data-code-id={codeId}
117
- id={copyButtonId}
118
- >
119
- <span class="code-block__copy-icon code-block__copy-icon--copy" aria-hidden="true">
120
- <Copy width={20} height={20} />
121
- </span>
122
- <span class="code-block__copy-icon code-block__copy-icon--check" aria-hidden="true">
123
- <Check width={20} height={20} />
124
- </span>
125
- <span class="sr-only">Copy code</span>
126
- </button>
127
- </span>
128
- </div>
129
- <pre><code id={codeId}>{code}</code></pre>
130
- </div>
131
-
132
- <script is:inline>
133
- (function initCodeBlockCopy() {
134
- const init = () => {
135
- const copyButtons = document.querySelectorAll('.code-block__copy-btn');
136
-
137
- copyButtons.forEach((button) => {
138
- if (button.hasAttribute('data-copy-initialized')) return;
139
- button.setAttribute('data-copy-initialized', 'true');
140
-
141
- const codeId = button.getAttribute('data-code-id');
142
- if (!codeId) return;
143
-
144
- const codeElement = document.getElementById(codeId);
145
- if (!codeElement) return;
146
-
147
- const copyIcon = button.querySelector('.code-block__copy-icon--copy');
148
- const checkIcon = button.querySelector('.code-block__copy-icon--check');
149
-
150
- // Remove title elements from SVG icons to prevent tooltip conflicts
151
- const copyIconSvg = copyIcon?.querySelector('svg');
152
- const checkIconSvg = checkIcon?.querySelector('svg');
153
- if (copyIconSvg) {
154
- const copyTitle = copyIconSvg.querySelector('title');
155
- if (copyTitle) copyTitle.remove();
156
- }
157
- if (checkIconSvg) {
158
- const checkTitle = checkIconSvg.querySelector('title');
159
- if (checkTitle) checkTitle.remove();
160
- }
161
-
162
- const copyToClipboard = async () => {
163
- const codeText = codeElement.textContent || '';
164
-
165
- if (!codeText) return;
166
-
167
- try {
168
- await navigator.clipboard.writeText(codeText);
169
-
170
- // Show success state
171
- if (copyIcon) copyIcon.classList.add('code-block__copy-icon--hidden');
172
- if (checkIcon) checkIcon.classList.remove('code-block__copy-icon--hidden');
173
- button.setAttribute('aria-label', 'Code copied!');
174
- const tooltipHost = button.closest('.tooltip-host');
175
- if (tooltipHost) tooltipHost.setAttribute('data-tooltip', 'Code copied!');
176
-
177
- // Reset after 2 seconds
178
- setTimeout(() => {
179
- if (copyIcon) copyIcon.classList.remove('code-block__copy-icon--hidden');
180
- if (checkIcon) checkIcon.classList.add('code-block__copy-icon--hidden');
181
- button.setAttribute('aria-label', 'Copy code to clipboard');
182
- if (tooltipHost) tooltipHost.setAttribute('data-tooltip', 'Copy code to clipboard');
183
- }, 2000);
184
- } catch (err) {
185
- // Fallback for older browsers
186
- const textArea = document.createElement('textarea');
187
- textArea.value = codeText;
188
- textArea.style.position = 'fixed';
189
- textArea.style.left = '-999999px';
190
- document.body.appendChild(textArea);
191
- textArea.focus();
192
- textArea.select();
193
-
194
- try {
195
- document.execCommand('copy');
196
- if (copyIcon) copyIcon.classList.add('code-block__copy-icon--hidden');
197
- if (checkIcon) checkIcon.classList.remove('code-block__copy-icon--hidden');
198
- button.setAttribute('aria-label', 'Code copied!');
199
- const tooltipHostFallback = button.closest('.tooltip-host');
200
- if (tooltipHostFallback) tooltipHostFallback.setAttribute('data-tooltip', 'Code copied!');
201
-
202
- setTimeout(() => {
203
- if (copyIcon) copyIcon.classList.remove('code-block__copy-icon--hidden');
204
- if (checkIcon) checkIcon.classList.add('code-block__copy-icon--hidden');
205
- button.setAttribute('aria-label', 'Copy code to clipboard');
206
- if (tooltipHostFallback) tooltipHostFallback.setAttribute('data-tooltip', 'Copy code to clipboard');
207
- }, 2000);
208
- } catch (fallbackErr) {
209
- console.error('Failed to copy:', fallbackErr);
210
- }
211
-
212
- document.body.removeChild(textArea);
213
- }
214
- };
215
-
216
- button.addEventListener('click', copyToClipboard);
217
-
218
- // Keyboard support
219
- button.addEventListener('keydown', (e) => {
220
- if (e && 'key' in e) {
221
- const keyEvent = e;
222
- if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {
223
- keyEvent.preventDefault();
224
- copyToClipboard();
225
- }
226
- }
227
- });
228
- });
229
- };
230
-
231
- if (document.readyState === 'loading') {
232
- document.addEventListener('DOMContentLoaded', init);
233
- } else {
234
- init();
235
- }
236
- })();
237
- </script>
238
-
239
- <style>
240
- .code-block {
241
- position: relative;
242
- margin: var(--spacing-4) 0;
243
- border-radius: var(--radius-lg);
244
- overflow: visible;
245
- background-color: var(--background-alt);
246
- border: 1px solid var(--border);
247
- }
248
-
249
- .code-block__header {
250
- display: flex;
251
- align-items: center;
252
- justify-content: space-between;
253
- padding: var(--spacing-2) var(--spacing-3);
254
- background-color: var(--background);
255
- border-bottom: 1px solid var(--border);
256
- border-radius: var(--radius-lg) var(--radius-lg) 0 0;
257
- overflow: visible;
258
- position: relative;
259
- z-index: 1;
260
- }
261
-
262
- .code-block__language {
263
- display: flex;
264
- align-items: center;
265
- gap: var(--spacing-2);
266
- font-size: var(--font-size-xs);
267
- color: var(--text-dim);
268
- text-transform: uppercase;
269
- letter-spacing: var(--letter-spacing-wider);
270
- font-weight: var(--font-weight-medium);
271
- }
272
-
273
- .code-block__language-icon {
274
- display: block;
275
- flex-shrink: 0;
276
- color: var(--text-dim);
277
- width: var(--spacing-5); /* 20px - larger for better visibility */
278
- height: var(--spacing-5);
279
- }
280
-
281
- .code-block__language-icon svg {
282
- width: 100%;
283
- height: 100%;
284
- }
285
-
286
- .code-block__language-text {
287
- display: none;
288
- }
289
-
290
- /* Show text next to icon on large screens */
291
- @media (width >= 768px) {
292
- .code-block__language-text {
293
- display: inline;
294
- }
295
- }
296
-
297
- .code-block__copy-btn {
298
- display: flex;
299
- align-items: center;
300
- justify-content: center;
301
- padding: var(--spacing-2);
302
- min-width: var(--spacing-8);
303
- height: var(--spacing-8);
304
- margin-left: auto;
305
- background-color: var(--background-alt);
306
- border: 1px solid var(--border);
307
- border-radius: var(--radius-md);
308
- color: var(--text);
309
- cursor: pointer;
310
- transition: background-color var(--transition-base), border-color var(--transition-base), color var(--transition-base);
311
- position: relative;
312
- }
313
-
314
- .code-block__copy-btn:hover {
315
- background-color: var(--background);
316
- border-color: var(--accent);
317
- color: var(--accent);
318
- }
319
-
320
- .code-block__copy-btn:focus-visible {
321
- outline: var(--outline-width) solid var(--accent);
322
- outline-offset: var(--outline-offset);
323
- }
324
-
325
- .code-block__copy-icon {
326
- position: absolute;
327
- display: flex;
328
- align-items: center;
329
- justify-content: center;
330
- width: var(--spacing-5); /* 20px - larger for better visibility */
331
- height: var(--spacing-5);
332
- transition: opacity var(--transition-base), transform var(--transition-base);
333
- }
334
-
335
- .code-block__copy-icon svg {
336
- width: 100%;
337
- height: 100%;
338
- }
339
-
340
- .code-block__copy-icon--copy {
341
- opacity: 1;
342
- transform: scale(1);
343
- }
344
-
345
- .code-block__copy-icon--check {
346
- opacity: 0;
347
- transform: scale(0.8);
348
- }
349
-
350
- .code-block__copy-icon--check:not(.code-block__copy-icon--hidden) {
351
- opacity: 1;
352
- transform: scale(1);
353
- }
354
-
355
- .code-block__copy-icon--copy.code-block__copy-icon--hidden {
356
- opacity: 0;
357
- transform: scale(0.8);
358
- }
359
-
360
- .code-block pre {
361
- margin: 0;
362
- padding: var(--spacing-4);
363
- overflow-x: auto;
364
- background-color: var(--background-alt);
365
- border-radius: 0 0 var(--radius-lg) var(--radius-lg);
366
- }
367
-
368
- .code-block code {
369
- font-family: var(--font-family-mono);
370
- font-size: var(--font-size-sm);
371
- line-height: var(--line-height-relaxed);
372
- color: var(--text);
373
- white-space: pre;
374
- word-wrap: normal;
375
- }
376
-
377
- @media (width <= 640px) {
378
- .code-block__header {
379
- flex-direction: row; /* Keep horizontal layout on mobile */
380
- align-items: center; /* Vertically center all items */
381
- gap: var(--spacing-2);
382
- }
383
-
384
- .code-block__language {
385
- align-items: center; /* Ensure language icon is vertically centered */
386
- }
387
-
388
- .code-block__copy-btn {
389
- margin-left: auto; /* Push copy button to the right */
390
- flex-shrink: 0; /* Prevent copy button from shrinking */
391
- }
392
- }
393
- </style>
@@ -1,219 +0,0 @@
1
- ---
2
- import Copy from './icons/Copy.astro';
3
- import Check from './icons/Check.astro';
4
-
5
- interface Props {
6
- value: string;
7
- label?: string;
8
- format?: string;
9
- class?: string;
10
- id?: string;
11
- }
12
-
13
- const {
14
- value,
15
- label,
16
- format,
17
- class: className = '',
18
- id,
19
- } = Astro.props;
20
-
21
- const buttonId = id || `copy-btn-${Math.random().toString(36).substr(2, 9)}`;
22
- const defaultTooltip = label || 'Copy to clipboard';
23
- ---
24
-
25
- <span class="tooltip-host" data-tooltip={defaultTooltip}>
26
- <button
27
- type="button"
28
- class={`copy-to-clipboard ${className}`.trim()}
29
- data-copy-value={value}
30
- data-copy-format={format}
31
- aria-label={label || `Copy ${value} to clipboard`}
32
- id={buttonId}
33
- >
34
- <span class="copy-to-clipboard__text">{value}</span>
35
- <span class="copy-to-clipboard__icon copy-to-clipboard__icon--copy" aria-hidden="true">
36
- <Copy width={16} height={16} />
37
- </span>
38
- <span class="copy-to-clipboard__icon copy-to-clipboard__icon--check" aria-hidden="true">
39
- <Check width={16} height={16} />
40
- </span>
41
- <span class="copy-to-clipboard__feedback" aria-live="polite"></span>
42
- </button>
43
- </span>
44
-
45
- <script>
46
- (function initCopyToClipboard() {
47
- // Wait for DOM to be ready
48
- const init = () => {
49
- const buttons = document.querySelectorAll('.copy-to-clipboard');
50
-
51
- buttons.forEach((button) => {
52
- // Skip if already initialized
53
- if (button.hasAttribute('data-copy-initialized')) return;
54
- button.setAttribute('data-copy-initialized', 'true');
55
-
56
- const tooltipHost = button.closest('.tooltip-host');
57
- const defaultTooltip = tooltipHost ? (tooltipHost.getAttribute('data-tooltip') || 'Copy to clipboard') : 'Copy to clipboard';
58
- const defaultAriaLabel = button.getAttribute('aria-label') || 'Copy to clipboard';
59
- if (tooltipHost) tooltipHost.setAttribute('data-tooltip', defaultTooltip);
60
- button.setAttribute('data-copy-aria-label', defaultAriaLabel);
61
- if (tooltipHost) tooltipHost.setAttribute('data-copy-default-tooltip', defaultTooltip);
62
-
63
- const getValue = () => button.getAttribute('data-copy-value') || '';
64
- const getFormat = () => button.getAttribute('data-copy-format') || '';
65
- const feedback = button.querySelector('.copy-to-clipboard__feedback');
66
- const copyIcon = button.querySelector('.copy-to-clipboard__icon--copy');
67
- const checkIcon = button.querySelector('.copy-to-clipboard__icon--check');
68
- const textSpan = button.querySelector('.copy-to-clipboard__text');
69
-
70
- // Update text span with current value
71
- const updateDisplay = () => {
72
- const value = getValue();
73
- if (textSpan) {
74
- textSpan.textContent = value || '';
75
- }
76
- };
77
-
78
- // Initial display update
79
- updateDisplay();
80
-
81
- // Watch for attribute changes (for dynamic updates)
82
- const observer = new MutationObserver((mutations) => {
83
- let shouldUpdate = false;
84
- mutations.forEach((mutation) => {
85
- if (mutation.type === 'attributes') {
86
- if (mutation.attributeName === 'data-copy-value' || mutation.attributeName === 'data-copy-format') {
87
- shouldUpdate = true;
88
- }
89
- }
90
- });
91
- if (shouldUpdate) {
92
- // Use requestAnimationFrame to ensure DOM is ready
93
- requestAnimationFrame(() => {
94
- updateDisplay();
95
- });
96
- }
97
- });
98
- observer.observe(button, {
99
- attributes: true,
100
- attributeFilter: ['data-copy-value', 'data-copy-format'],
101
- attributeOldValue: false
102
- });
103
-
104
- // Listen for custom value-updated event
105
- button.addEventListener('value-updated', (event) => {
106
- if (event && event.detail && event.detail.value) {
107
- updateDisplay();
108
- }
109
- });
110
-
111
- // Fallback: Periodically check for value changes (in case MutationObserver misses something)
112
- let lastValue = getValue();
113
- const intervalId = setInterval(() => {
114
- const currentValue = getValue();
115
- if (currentValue !== lastValue) {
116
- lastValue = currentValue;
117
- updateDisplay();
118
- }
119
- }, 300);
120
-
121
- // Store interval ID for potential cleanup (though we don't need to clean it up in this case)
122
- button.setAttribute('data-copy-interval-id', intervalId.toString());
123
-
124
- const copyToClipboard = async () => {
125
- // Always read fresh value on click (in case it was updated dynamically)
126
- let value = getValue();
127
- const format = getFormat();
128
-
129
- // If value is still empty, try reading from text span as fallback
130
- if (!value && textSpan) {
131
- value = textSpan.textContent || '';
132
- }
133
-
134
- if (!value) {
135
- return;
136
- }
137
-
138
- try {
139
- await navigator.clipboard.writeText(value);
140
-
141
- // Show success state
142
- if (copyIcon) copyIcon.classList.add('copy-to-clipboard__icon--hidden');
143
- if (checkIcon) checkIcon.classList.remove('copy-to-clipboard__icon--hidden');
144
- if (feedback) {
145
- feedback.textContent = format ? `Copied ${format}!` : 'Copied!';
146
- }
147
- const tooltipHost = button.closest('.tooltip-host');
148
- if (tooltipHost) tooltipHost.setAttribute('data-tooltip', format ? `Copied ${format}!` : 'Copied!');
149
- button.setAttribute('aria-label', format ? `Copied ${format}!` : 'Copied!');
150
-
151
- // Reset after 2 seconds
152
- setTimeout(() => {
153
- if (copyIcon) copyIcon.classList.remove('copy-to-clipboard__icon--hidden');
154
- if (checkIcon) checkIcon.classList.add('copy-to-clipboard__icon--hidden');
155
- if (feedback) {
156
- feedback.textContent = '';
157
- }
158
- if (tooltipHost) tooltipHost.setAttribute('data-tooltip', tooltipHost.getAttribute('data-copy-default-tooltip') || defaultTooltip);
159
- button.setAttribute('aria-label', defaultAriaLabel);
160
- }, 2000);
161
- } catch (err) {
162
- // Fallback for older browsers
163
- const textArea = document.createElement('textarea');
164
- textArea.value = value;
165
- textArea.style.position = 'fixed';
166
- textArea.style.left = '-999999px';
167
- document.body.appendChild(textArea);
168
- textArea.focus();
169
- textArea.select();
170
-
171
- try {
172
- document.execCommand('copy');
173
- if (copyIcon) copyIcon.classList.add('copy-to-clipboard__icon--hidden');
174
- if (checkIcon) checkIcon.classList.remove('copy-to-clipboard__icon--hidden');
175
- if (feedback) {
176
- feedback.textContent = format ? `Copied ${format}!` : 'Copied!';
177
- }
178
- const tooltipHostFb = button.closest('.tooltip-host');
179
- if (tooltipHostFb) tooltipHostFb.setAttribute('data-tooltip', format ? `Copied ${format}!` : 'Copied!');
180
- button.setAttribute('aria-label', format ? `Copied ${format}!` : 'Copied!');
181
-
182
- setTimeout(() => {
183
- if (copyIcon) copyIcon.classList.remove('copy-to-clipboard__icon--hidden');
184
- if (checkIcon) checkIcon.classList.add('copy-to-clipboard__icon--hidden');
185
- if (feedback) {
186
- feedback.textContent = '';
187
- }
188
- if (tooltipHostFb) tooltipHostFb.setAttribute('data-tooltip', tooltipHostFb.getAttribute('data-copy-default-tooltip') || defaultTooltip);
189
- button.setAttribute('aria-label', defaultAriaLabel);
190
- }, 2000);
191
- } catch (fallbackErr) {
192
- if (feedback) {
193
- feedback.textContent = 'Failed to copy';
194
- }
195
- }
196
-
197
- document.body.removeChild(textArea);
198
- }
199
- };
200
-
201
- button.addEventListener('click', copyToClipboard);
202
-
203
- // Keyboard support
204
- button.addEventListener('keydown', (e) => {
205
- if (e.key === 'Enter' || e.key === ' ') {
206
- e.preventDefault();
207
- copyToClipboard();
208
- }
209
- });
210
- });
211
- };
212
-
213
- if (document.readyState === 'loading') {
214
- document.addEventListener('DOMContentLoaded', init);
215
- } else {
216
- init();
217
- }
218
- })();
219
- </script>