rizzo-css 0.0.17 → 0.0.19

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 (261) hide show
  1. package/README.md +4 -4
  2. package/bin/rizzo-css.js +329 -118
  3. package/dist/rizzo.min.css +3 -3
  4. package/package.json +7 -3
  5. package/scaffold/astro-minimal/.env.example +3 -0
  6. package/scaffold/astro-minimal/README.md +36 -0
  7. package/scaffold/astro-minimal/package.json +13 -0
  8. package/scaffold/astro-minimal/src/layouts/Layout.astro +28 -0
  9. package/scaffold/astro-minimal/src/pages/index.astro +10 -0
  10. package/scaffold/svelte-minimal/.env.example +3 -0
  11. package/scaffold/svelte-minimal/README.md +37 -0
  12. package/scaffold/svelte-minimal/package.json +20 -0
  13. package/scaffold/svelte-minimal/src/app.d.ts +11 -0
  14. package/scaffold/svelte-minimal/src/app.html +15 -0
  15. package/scaffold/svelte-minimal/src/routes/+layout.svelte +1 -0
  16. package/scaffold/svelte-minimal/src/routes/+page.svelte +5 -0
  17. package/scaffold/svelte-minimal/svelte.config.js +10 -0
  18. package/scaffold/svelte-minimal/tsconfig.json +11 -0
  19. package/scaffold/vanilla/README.md +4 -4
  20. package/scaffold/vanilla/components/accordion.html +18 -0
  21. package/scaffold/vanilla/components/alert.html +18 -0
  22. package/scaffold/vanilla/components/avatar.html +18 -0
  23. package/scaffold/vanilla/components/badge.html +18 -0
  24. package/scaffold/vanilla/components/breadcrumb.html +18 -0
  25. package/scaffold/vanilla/components/button.html +18 -0
  26. package/scaffold/vanilla/components/cards.html +18 -0
  27. package/scaffold/vanilla/components/copy-to-clipboard.html +18 -0
  28. package/scaffold/vanilla/components/divider.html +18 -0
  29. package/scaffold/vanilla/components/dropdown.html +18 -0
  30. package/scaffold/vanilla/components/forms.html +18 -0
  31. package/scaffold/vanilla/components/icons.html +18 -0
  32. package/scaffold/vanilla/components/index.html +18 -0
  33. package/scaffold/vanilla/components/modal.html +18 -0
  34. package/scaffold/vanilla/components/navbar.html +18 -0
  35. package/scaffold/vanilla/components/pagination.html +18 -0
  36. package/scaffold/vanilla/components/progress-bar.html +18 -0
  37. package/scaffold/vanilla/components/search.html +18 -0
  38. package/scaffold/vanilla/components/settings.html +18 -0
  39. package/scaffold/vanilla/components/spinner.html +18 -0
  40. package/scaffold/vanilla/components/table.html +18 -0
  41. package/scaffold/vanilla/components/tabs.html +18 -0
  42. package/scaffold/vanilla/components/theme-switcher.html +18 -0
  43. package/scaffold/vanilla/components/toast.html +18 -0
  44. package/scaffold/vanilla/components/tooltip.html +18 -0
  45. package/scaffold/vanilla/index.html +18 -0
  46. package/scaffold/astro-app/README.md +0 -43
  47. package/scaffold/astro-app/package.json +0 -1
  48. package/scaffold/astro-app/src/components/Accordion.astro +0 -178
  49. package/scaffold/astro-app/src/components/Alert.astro +0 -131
  50. package/scaffold/astro-app/src/components/Avatar.astro +0 -59
  51. package/scaffold/astro-app/src/components/Badge.astro +0 -24
  52. package/scaffold/astro-app/src/components/Breadcrumb.astro +0 -61
  53. package/scaffold/astro-app/src/components/Button.astro +0 -3
  54. package/scaffold/astro-app/src/components/Card.astro +0 -18
  55. package/scaffold/astro-app/src/components/Checkbox.astro +0 -38
  56. package/scaffold/astro-app/src/components/CliCommandTabs.astro +0 -90
  57. package/scaffold/astro-app/src/components/CodeBlock.astro +0 -393
  58. package/scaffold/astro-app/src/components/CopyToClipboard.astro +0 -219
  59. package/scaffold/astro-app/src/components/Divider.astro +0 -37
  60. package/scaffold/astro-app/src/components/DocsSidebar.astro +0 -51
  61. package/scaffold/astro-app/src/components/Dropdown.astro +0 -807
  62. package/scaffold/astro-app/src/components/FormGroup.astro +0 -59
  63. package/scaffold/astro-app/src/components/FrameworkSwitcher.astro +0 -72
  64. package/scaffold/astro-app/src/components/Input.astro +0 -59
  65. package/scaffold/astro-app/src/components/Modal.astro +0 -212
  66. package/scaffold/astro-app/src/components/Navbar.astro +0 -623
  67. package/scaffold/astro-app/src/components/PackageInstallTabs.astro +0 -87
  68. package/scaffold/astro-app/src/components/Pagination.astro +0 -240
  69. package/scaffold/astro-app/src/components/ProgressBar.astro +0 -65
  70. package/scaffold/astro-app/src/components/Radio.astro +0 -38
  71. package/scaffold/astro-app/src/components/Search.astro +0 -1259
  72. package/scaffold/astro-app/src/components/Select.astro +0 -49
  73. package/scaffold/astro-app/src/components/Settings.astro +0 -382
  74. package/scaffold/astro-app/src/components/Spinner.astro +0 -30
  75. package/scaffold/astro-app/src/components/Table.astro +0 -181
  76. package/scaffold/astro-app/src/components/Tabs.astro +0 -223
  77. package/scaffold/astro-app/src/components/Textarea.astro +0 -58
  78. package/scaffold/astro-app/src/components/ThemeIcon.astro +0 -50
  79. package/scaffold/astro-app/src/components/ThemeSwitcher.astro +0 -504
  80. package/scaffold/astro-app/src/components/Toast.astro +0 -30
  81. package/scaffold/astro-app/src/components/Tooltip.astro +0 -32
  82. package/scaffold/astro-app/src/components/icons/Brush.astro +0 -10
  83. package/scaffold/astro-app/src/components/icons/Cake.astro +0 -11
  84. package/scaffold/astro-app/src/components/icons/Check.astro +0 -29
  85. package/scaffold/astro-app/src/components/icons/Cherry.astro +0 -11
  86. package/scaffold/astro-app/src/components/icons/ChevronDown.astro +0 -29
  87. package/scaffold/astro-app/src/components/icons/Circle.astro +0 -29
  88. package/scaffold/astro-app/src/components/icons/Close.astro +0 -30
  89. package/scaffold/astro-app/src/components/icons/Cmd.astro +0 -26
  90. package/scaffold/astro-app/src/components/icons/Copy.astro +0 -30
  91. package/scaffold/astro-app/src/components/icons/Eye.astro +0 -30
  92. package/scaffold/astro-app/src/components/icons/Filter.astro +0 -29
  93. package/scaffold/astro-app/src/components/icons/Flame.astro +0 -28
  94. package/scaffold/astro-app/src/components/icons/Flower.astro +0 -11
  95. package/scaffold/astro-app/src/components/icons/Gear.astro +0 -30
  96. package/scaffold/astro-app/src/components/icons/Heart.astro +0 -28
  97. package/scaffold/astro-app/src/components/icons/IceCream.astro +0 -31
  98. package/scaffold/astro-app/src/components/icons/Leaf.astro +0 -29
  99. package/scaffold/astro-app/src/components/icons/Lemon.astro +0 -11
  100. package/scaffold/astro-app/src/components/icons/Moon.astro +0 -29
  101. package/scaffold/astro-app/src/components/icons/Owl.astro +0 -34
  102. package/scaffold/astro-app/src/components/icons/Palette.astro +0 -33
  103. package/scaffold/astro-app/src/components/icons/Rainbow.astro +0 -31
  104. package/scaffold/astro-app/src/components/icons/Search.astro +0 -30
  105. package/scaffold/astro-app/src/components/icons/Shield.astro +0 -28
  106. package/scaffold/astro-app/src/components/icons/Snowflake.astro +0 -34
  107. package/scaffold/astro-app/src/components/icons/Sort.astro +0 -30
  108. package/scaffold/astro-app/src/components/icons/Sun.astro +0 -29
  109. package/scaffold/astro-app/src/components/icons/Sunset.astro +0 -10
  110. package/scaffold/astro-app/src/components/icons/Zap.astro +0 -9
  111. package/scaffold/astro-app/src/components/icons/devicons/Astro.astro +0 -53
  112. package/scaffold/astro-app/src/components/icons/devicons/Bash.astro +0 -34
  113. package/scaffold/astro-app/src/components/icons/devicons/Css3.astro +0 -29
  114. package/scaffold/astro-app/src/components/icons/devicons/Git.astro +0 -24
  115. package/scaffold/astro-app/src/components/icons/devicons/Html5.astro +0 -27
  116. package/scaffold/astro-app/src/components/icons/devicons/Javascript.astro +0 -25
  117. package/scaffold/astro-app/src/components/icons/devicons/Nodejs.astro +0 -47
  118. package/scaffold/astro-app/src/components/icons/devicons/Plaintext.astro +0 -33
  119. package/scaffold/astro-app/src/components/icons/devicons/React.astro +0 -27
  120. package/scaffold/astro-app/src/components/icons/devicons/Svelte.astro +0 -25
  121. package/scaffold/astro-app/src/components/icons/devicons/Vue.astro +0 -26
  122. package/scaffold/astro-app/src/config/frameworks.ts +0 -26
  123. package/scaffold/astro-app/src/config/themes.ts +0 -54
  124. package/scaffold/astro-app/src/layouts/DocsLayout.astro +0 -263
  125. package/scaffold/astro-app/src/layouts/Layout.astro +0 -41
  126. package/scaffold/astro-app/src/pages/components/accordion.astro +0 -172
  127. package/scaffold/astro-app/src/pages/components/alert.astro +0 -250
  128. package/scaffold/astro-app/src/pages/components/avatar.astro +0 -102
  129. package/scaffold/astro-app/src/pages/components/badge.astro +0 -119
  130. package/scaffold/astro-app/src/pages/components/breadcrumb.astro +0 -124
  131. package/scaffold/astro-app/src/pages/components/button.astro +0 -74
  132. package/scaffold/astro-app/src/pages/components/cards.astro +0 -247
  133. package/scaffold/astro-app/src/pages/components/copy-to-clipboard.astro +0 -49
  134. package/scaffold/astro-app/src/pages/components/divider.astro +0 -74
  135. package/scaffold/astro-app/src/pages/components/dropdown.astro +0 -394
  136. package/scaffold/astro-app/src/pages/components/forms.astro +0 -367
  137. package/scaffold/astro-app/src/pages/components/icons.astro +0 -246
  138. package/scaffold/astro-app/src/pages/components/modal.astro +0 -152
  139. package/scaffold/astro-app/src/pages/components/navbar.astro +0 -80
  140. package/scaffold/astro-app/src/pages/components/pagination.astro +0 -126
  141. package/scaffold/astro-app/src/pages/components/progress-bar.astro +0 -94
  142. package/scaffold/astro-app/src/pages/components/search.astro +0 -155
  143. package/scaffold/astro-app/src/pages/components/settings.astro +0 -78
  144. package/scaffold/astro-app/src/pages/components/spinner.astro +0 -81
  145. package/scaffold/astro-app/src/pages/components/table.astro +0 -144
  146. package/scaffold/astro-app/src/pages/components/tabs.astro +0 -220
  147. package/scaffold/astro-app/src/pages/components/theme-switcher.astro +0 -69
  148. package/scaffold/astro-app/src/pages/components/toast.astro +0 -157
  149. package/scaffold/astro-app/src/pages/components/tooltip.astro +0 -209
  150. package/scaffold/astro-app/src/pages/components.astro +0 -290
  151. package/scaffold/astro-app/src/pages/docs/accessibility.astro +0 -9
  152. package/scaffold/astro-app/src/pages/docs/colors.astro +0 -9
  153. package/scaffold/astro-app/src/pages/docs/design-system.astro +0 -9
  154. package/scaffold/astro-app/src/pages/docs/getting-started.astro +0 -9
  155. package/scaffold/astro-app/src/pages/docs/index.astro +0 -15
  156. package/scaffold/astro-app/src/pages/docs/themes/[theme].astro +0 -14
  157. package/scaffold/astro-app/src/pages/docs/theming.astro +0 -10
  158. package/scaffold/astro-app/src/pages/index.astro +0 -24
  159. package/scaffold/svelte-app/README.md +0 -39
  160. package/scaffold/svelte-app/package.json +0 -22
  161. package/scaffold/svelte-app/src/app.d.ts +0 -28
  162. package/scaffold/svelte-app/src/app.html +0 -21
  163. package/scaffold/svelte-app/src/lib/assets/favicon.svg +0 -1
  164. package/scaffold/svelte-app/src/lib/rizzo/Accordion.svelte +0 -128
  165. package/scaffold/svelte-app/src/lib/rizzo/Alert.svelte +0 -85
  166. package/scaffold/svelte-app/src/lib/rizzo/Avatar.svelte +0 -39
  167. package/scaffold/svelte-app/src/lib/rizzo/Badge.svelte +0 -31
  168. package/scaffold/svelte-app/src/lib/rizzo/Breadcrumb.svelte +0 -49
  169. package/scaffold/svelte-app/src/lib/rizzo/Button.svelte +0 -27
  170. package/scaffold/svelte-app/src/lib/rizzo/Card.svelte +0 -17
  171. package/scaffold/svelte-app/src/lib/rizzo/Checkbox.svelte +0 -37
  172. package/scaffold/svelte-app/src/lib/rizzo/CopyToClipboard.svelte +0 -79
  173. package/scaffold/svelte-app/src/lib/rizzo/Divider.svelte +0 -28
  174. package/scaffold/svelte-app/src/lib/rizzo/Dropdown.svelte +0 -254
  175. package/scaffold/svelte-app/src/lib/rizzo/FormGroup.svelte +0 -51
  176. package/scaffold/svelte-app/src/lib/rizzo/Input.svelte +0 -59
  177. package/scaffold/svelte-app/src/lib/rizzo/Modal.svelte +0 -157
  178. package/scaffold/svelte-app/src/lib/rizzo/Pagination.svelte +0 -93
  179. package/scaffold/svelte-app/src/lib/rizzo/ProgressBar.svelte +0 -58
  180. package/scaffold/svelte-app/src/lib/rizzo/Radio.svelte +0 -38
  181. package/scaffold/svelte-app/src/lib/rizzo/Select.svelte +0 -51
  182. package/scaffold/svelte-app/src/lib/rizzo/Spinner.svelte +0 -14
  183. package/scaffold/svelte-app/src/lib/rizzo/Table.svelte +0 -158
  184. package/scaffold/svelte-app/src/lib/rizzo/Tabs.svelte +0 -117
  185. package/scaffold/svelte-app/src/lib/rizzo/Textarea.svelte +0 -59
  186. package/scaffold/svelte-app/src/lib/rizzo/ThemeIcon.svelte +0 -54
  187. package/scaffold/svelte-app/src/lib/rizzo/ThemeSwitcher.svelte +0 -315
  188. package/scaffold/svelte-app/src/lib/rizzo/Toast.svelte +0 -33
  189. package/scaffold/svelte-app/src/lib/rizzo/Tooltip.svelte +0 -19
  190. package/scaffold/svelte-app/src/lib/rizzo/icons/Check.svelte +0 -29
  191. package/scaffold/svelte-app/src/lib/rizzo/icons/ChevronDown.svelte +0 -29
  192. package/scaffold/svelte-app/src/lib/rizzo/icons/Circle.svelte +0 -29
  193. package/scaffold/svelte-app/src/lib/rizzo/icons/Close.svelte +0 -30
  194. package/scaffold/svelte-app/src/lib/rizzo/icons/Cmd.svelte +0 -27
  195. package/scaffold/svelte-app/src/lib/rizzo/icons/Copy.svelte +0 -30
  196. package/scaffold/svelte-app/src/lib/rizzo/icons/Eye.svelte +0 -30
  197. package/scaffold/svelte-app/src/lib/rizzo/icons/Filter.svelte +0 -29
  198. package/scaffold/svelte-app/src/lib/rizzo/icons/Gear.svelte +0 -30
  199. package/scaffold/svelte-app/src/lib/rizzo/icons/IceCream.svelte +0 -31
  200. package/scaffold/svelte-app/src/lib/rizzo/icons/Moon.svelte +0 -29
  201. package/scaffold/svelte-app/src/lib/rizzo/icons/Owl.svelte +0 -34
  202. package/scaffold/svelte-app/src/lib/rizzo/icons/Palette.svelte +0 -33
  203. package/scaffold/svelte-app/src/lib/rizzo/icons/Rainbow.svelte +0 -31
  204. package/scaffold/svelte-app/src/lib/rizzo/icons/Search.svelte +0 -30
  205. package/scaffold/svelte-app/src/lib/rizzo/icons/Snowflake.svelte +0 -34
  206. package/scaffold/svelte-app/src/lib/rizzo/icons/Sort.svelte +0 -30
  207. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Astro.svelte +0 -45
  208. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Bash.svelte +0 -28
  209. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Css3.svelte +0 -23
  210. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Git.svelte +0 -18
  211. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Html5.svelte +0 -21
  212. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Javascript.svelte +0 -19
  213. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Nodejs.svelte +0 -44
  214. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Plaintext.svelte +0 -24
  215. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/React.svelte +0 -21
  216. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/SvelteIcon.svelte +0 -19
  217. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Vue.svelte +0 -20
  218. package/scaffold/svelte-app/src/lib/rizzo/index.ts +0 -35
  219. package/scaffold/svelte-app/src/lib/rizzo-docs/CodeBlock.svelte +0 -239
  220. package/scaffold/svelte-app/src/lib/rizzo-docs/SvelteDocPage.svelte +0 -99
  221. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AccordionDoc.svelte +0 -53
  222. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AlertDoc.svelte +0 -114
  223. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AvatarDoc.svelte +0 -92
  224. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BadgeDoc.svelte +0 -60
  225. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BreadcrumbDoc.svelte +0 -55
  226. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ButtonDoc.svelte +0 -55
  227. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CardsDoc.svelte +0 -173
  228. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComingSoon.svelte +0 -12
  229. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComponentsOverview.svelte +0 -92
  230. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CopyToClipboardDoc.svelte +0 -26
  231. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DividerDoc.svelte +0 -105
  232. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DropdownDoc.svelte +0 -161
  233. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/FormsDoc.svelte +0 -375
  234. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/IconsDoc.svelte +0 -246
  235. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Index.svelte +0 -8
  236. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ModalDoc.svelte +0 -50
  237. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/NavbarDoc.svelte +0 -79
  238. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/PaginationDoc.svelte +0 -44
  239. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ProgressBarDoc.svelte +0 -95
  240. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SearchDoc.svelte +0 -147
  241. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SettingsDoc.svelte +0 -158
  242. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SpinnerDoc.svelte +0 -41
  243. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TableDoc.svelte +0 -116
  244. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TabsDoc.svelte +0 -152
  245. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ThemeSwitcherDoc.svelte +0 -189
  246. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Theming.svelte +0 -6
  247. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ToastDoc.svelte +0 -136
  248. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TooltipDoc.svelte +0 -57
  249. package/scaffold/svelte-app/src/routes/+layout.svelte +0 -10
  250. package/scaffold/svelte-app/src/routes/+page.svelte +0 -31
  251. package/scaffold/svelte-app/src/routes/components/+page.svelte +0 -4
  252. package/scaffold/svelte-app/src/routes/components/[slug]/+page.svelte +0 -7
  253. package/scaffold/svelte-app/static/robots.txt +0 -3
  254. package/scaffold/svelte-app/svelte.config.js +0 -13
  255. package/scaffold/svelte-app/tsconfig.json +0 -21
  256. package/scaffold/svelte-app/vite.config.ts +0 -6
  257. /package/scaffold/{astro-app → astro-minimal}/astro.config.mjs +0 -0
  258. /package/scaffold/{astro-app → astro-minimal}/public/.gitkeep +0 -0
  259. /package/scaffold/{astro-app → astro-minimal}/public/favicon.svg +0 -0
  260. /package/scaffold/{astro-app → astro-minimal}/tsconfig.json +0 -0
  261. /package/scaffold/{svelte-app → svelte-minimal}/static/.gitkeep +0 -0
package/bin/rizzo-css.js CHANGED
@@ -10,21 +10,61 @@ const RIZZO_CONFIG_FILE = 'rizzo-css.json';
10
10
  const COMMANDS = ['init', 'add', 'theme', 'help'];
11
11
  const FRAMEWORKS = ['vanilla', 'astro', 'svelte'];
12
12
 
13
- /** Template options per framework for "create new". full-app = full Astro/Svelte app scaffold; full = vanilla with theme switcher + js; minimal = CSS + single HTML only. */
13
+ /** Full = everything we ship. Minimal = recommended starting set. Manual = you choose. */
14
14
  const TEMPLATES = {
15
15
  vanilla: [
16
- { value: 'full', label: 'Full — index.html + theme switcher, js/main.js, icons, README' },
17
- { value: 'minimal', label: 'Minimal — index.html + CSS link only' },
16
+ { value: 'full', label: 'Full — index.html + theme switcher, js/main.js, icons, component showcase, README' },
17
+ { value: 'minimal', label: 'Minimal — index.html + CSS + js/main.js (recommended starter; no showcase)' },
18
+ { value: 'manual', label: 'Manual — index.html + CSS; pick components to add their pages + js/main.js' },
18
19
  ],
19
20
  astro: [
20
- { value: 'full-app', label: 'Full app complete Astro project with Rizzo CSS' },
21
- { value: 'minimal', label: 'Minimal — public/css + index.html with CSS link' },
21
+ { value: 'full', label: 'Full — Astro app + all 25 components (config, one page, README, LICENSE, .env.example)' },
22
+ { value: 'minimal', label: 'Minimal — Astro app + recommended components (Button, Badge, Card, Modal, Tabs, ThemeSwitcher, FormGroup, Alert, Toast, Dropdown)' },
23
+ { value: 'manual', label: 'Manual — minimal base + pick the components you want' },
22
24
  ],
23
25
  svelte: [
24
- { value: 'full-app', label: 'Full app complete SvelteKit project with Rizzo CSS' },
25
- { value: 'minimal', label: 'Minimal — static/css + index.html with CSS link' },
26
+ { value: 'full', label: 'Full — SvelteKit app + all 25 components (config, one page, README, LICENSE, .env.example)' },
27
+ { value: 'minimal', label: 'Minimal — SvelteKit app + recommended components (Button, Badge, Card, Modal, Tabs, ThemeSwitcher, FormGroup, Alert, Toast, Dropdown)' },
28
+ { value: 'manual', label: 'Manual — minimal base + pick the components you want' },
26
29
  ],
27
30
  };
31
+
32
+ const VANILLA_MINIMAL_README = `# Vanilla + Rizzo CSS (minimal)
33
+
34
+ Minimal starter: HTML + CSS + js/main.js + recommended component pages. Scaffolded with \`npx rizzo-css init --framework vanilla --template minimal\`.
35
+
36
+ - Open \`index.html\` in a browser or serve the folder. Edit \`index.html\` and add your content. CSS: \`css/rizzo.min.css\`. Script: \`js/main.js\` (already linked).
37
+ - \`components/\` contains HTML pages for the recommended set (Button, Badge, Card, Modal, Tabs, ThemeSwitcher, FormGroup, Alert, Toast, Dropdown). Open \`components/index.html\` to browse them.
38
+ - Set a theme: \`<html data-theme="github-dark-classic">\` (see \`npx rizzo-css theme\` for all themes).
39
+ - For the full component showcase and icons, use template **Full** or copy from a Full scaffold.
40
+
41
+ Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
42
+ `;
43
+
44
+ const VANILLA_MANUAL_README = `# Vanilla + Rizzo CSS (manual)
45
+
46
+ Manual setup: HTML + CSS, plus any component pages you chose. Scaffolded with \`npx rizzo-css init --framework vanilla --template manual\`.
47
+
48
+ - Open \`index.html\` in a browser or serve the folder with any static server.
49
+ - Edit \`index.html\` and add your content. CSS: \`css/rizzo.min.css\`.
50
+ - If you picked components, \`components/\` has their HTML pages and \`js/main.js\` is included (open \`components/index.html\` to browse).
51
+ - Set a theme: \`<html data-theme="github-dark-classic">\` (see \`npx rizzo-css theme\` for all themes).
52
+
53
+ **If you chose no components:** To add component JavaScript (modal, dropdown, tabs, toast, theme switcher, etc.), use the [Vanilla component docs](https://rizzo-css.vercel.app/docs/vanilla/components) or run \`npx rizzo-css init\` with Vanilla → **Full** in a temp folder and copy \`js/main.js\` and \`icons/\` into this project.
54
+
55
+ Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
56
+ `;
57
+
58
+ const FALLBACK_MINIMAL_README = `# Rizzo CSS (minimal)
59
+
60
+ Minimal project with Rizzo CSS. Add a proper framework (e.g. \`npm create astro@latest\` or \`npm create svelte@latest\`), then run \`npx rizzo-css add\` in the project.
61
+
62
+ - This folder has a single HTML file and \`css/rizzo.min.css\`.
63
+ - For a full app with config and tooling, use the framework's create command and \`rizzo-css add\`.
64
+
65
+ Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
66
+ `;
67
+
28
68
  // Dark and light themes (order matches scaffold optgroups and config/themes.ts)
29
69
  const DARK_THEMES = [
30
70
  'github-dark-classic',
@@ -59,11 +99,20 @@ const ASTRO_COMPONENTS = [
59
99
  'Modal', 'Toast', 'Table', 'ThemeSwitcher',
60
100
  ];
61
101
 
62
- // Recommended subset for "Recommended set" option (keeps CLI simple; power users can pick)
102
+ // Recommended subset for Full/Minimal (same for Astro, Svelte, Vanilla)
63
103
  const RECOMMENDED_COMPONENTS = [
64
104
  'Button', 'Badge', 'Card', 'Modal', 'Tabs', 'ThemeSwitcher', 'FormGroup', 'Alert', 'Toast', 'Dropdown',
65
105
  ];
66
106
 
107
+ // Vanilla scaffold: component name (same as ASTRO_COMPONENTS) -> components/*.html slug
108
+ const VANILLA_COMPONENT_SLUGS = {
109
+ Button: 'button', Badge: 'badge', Card: 'cards', Divider: 'divider', Spinner: 'spinner', ProgressBar: 'progress-bar',
110
+ Avatar: 'avatar', Alert: 'alert', Breadcrumb: 'breadcrumb', FormGroup: 'forms', Input: 'forms', Checkbox: 'forms',
111
+ Textarea: 'forms', Select: 'forms', Radio: 'forms', CopyToClipboard: 'copy-to-clipboard', Tooltip: 'tooltip',
112
+ Pagination: 'pagination', Tabs: 'tabs', Accordion: 'accordion', Dropdown: 'dropdown', Modal: 'modal',
113
+ Toast: 'toast', Table: 'table', ThemeSwitcher: 'theme-switcher',
114
+ };
115
+
67
116
  // ANSI colors for CLI (framework logo colors)
68
117
  const C = {
69
118
  reset: '\u001b[0m',
@@ -86,6 +135,14 @@ function getCssPath() {
86
135
  return join(getPackageRoot(), 'dist', 'rizzo.min.css');
87
136
  }
88
137
 
138
+ /** Copy the package LICENSE into the project dir. Call after every scaffold so every install includes a license. */
139
+ function copyPackageLicense(projectDir) {
140
+ const licensePath = join(getPackageRoot(), 'LICENSE');
141
+ if (existsSync(licensePath)) {
142
+ copyFileSync(licensePath, join(projectDir, 'LICENSE'));
143
+ }
144
+ }
145
+
89
146
  /** Read rizzo-css.json from cwd. Returns { targetDir?, framework?, packageManager? } or null. */
90
147
  function readRizzoConfig(cwd) {
91
148
  if (!cwd || !existsSync(cwd)) return null;
@@ -127,6 +184,19 @@ function getFlagValue(argv, flag) {
127
184
  return i !== -1 && argv[i + 1] != null ? argv[i + 1] : null;
128
185
  }
129
186
 
187
+ /** Get positional args for a command (excludes --flag and --flag value). Used for e.g. add Button ThemeSwitcher. */
188
+ function getPositionalArgs(argv) {
189
+ const positionals = [];
190
+ for (let i = 1; i < argv.length; i++) {
191
+ if (argv[i].startsWith('--')) {
192
+ if (!argv[i].includes('=')) i++;
193
+ continue;
194
+ }
195
+ positionals.push(argv[i]);
196
+ }
197
+ return positionals;
198
+ }
199
+
130
200
  /** Package manager detection (manual: lockfiles + packageManager field). Returns { agent, command } or null if none found. */
131
201
  function detectPackageManager(cwd) {
132
202
  if (!cwd || !existsSync(cwd)) return null;
@@ -189,10 +259,10 @@ async function promptPackageManager(projectDir) {
189
259
  return selectMenu(options, '? Package manager (for install and run commands)');
190
260
  }
191
261
 
192
- /** Prompt user to select template for the chosen framework. Returns template value (full-app, full, or minimal). */
262
+ /** Prompt user to select Full or Manual for the chosen framework. Returns 'full' or 'manual'. */
193
263
  async function promptTemplate(framework) {
194
264
  const options = TEMPLATES[framework] || TEMPLATES.vanilla;
195
- return selectMenu(options, '? Template');
265
+ return selectMenu(options, '? Full or Manual?');
196
266
  }
197
267
 
198
268
  function question(prompt) {
@@ -476,16 +546,16 @@ Usage (use your package manager):
476
546
  bunx rizzo-css <command> [options]
477
547
 
478
548
  Commands:
479
- init Add Rizzo to existing project or scaffold new one (framework existing vs new → themes/components/PM)
480
- add Copy Rizzo CSS into the current project (auto-detects Vanilla/Astro/Svelte; use rizzo-css.json if present)
549
+ init New project = Full (everything) | Minimal (recommended set) | Manual (pick what you want). Existing = drop in CSS + hand-pick. First: framework, then existing vs new.
550
+ add Same as init existing: drop in CSS + hand-pick components (framework detected or from rizzo-css.json)
481
551
  theme List all available themes (use in init or set data-theme on <html>)
482
552
  help Show this help
483
553
 
484
554
  Options (init):
485
- --yes Non-interactive: scaffold new in cwd with defaults (framework: astro, template: full-app, no components)
555
+ --yes Non-interactive: scaffold new in cwd with defaults (framework: astro, template: full)
486
556
  --framework <fw> vanilla | astro | svelte (with --yes; otherwise first prompt)
487
- --template <t> full-app (Astro/Svelte) or full | minimal (Vanilla); with --yes defaults to full-app or full
488
- --install After scaffolding, run package manager install (full-app only)
557
+ --template <t> full | minimal | manual (all frameworks); with --yes defaults to full
558
+ --install After scaffolding, run package manager install (new project)
489
559
  --no-install Do not run install
490
560
  --write-config Write rizzo-css.json (targetDir, framework, packageManager) in the project
491
561
 
@@ -514,10 +584,11 @@ Examples:
514
584
  npx rizzo-css init
515
585
  npx rizzo-css init --yes --framework astro --install --write-config
516
586
  npx rizzo-css init --yes --framework vanilla
517
- npx rizzo-css init --yes --framework svelte --template minimal
587
+ npx rizzo-css init --yes --framework svelte --template full
518
588
  npx rizzo-css add
589
+ npx rizzo-css add Button
590
+ npx rizzo-css add Button ThemeSwitcher --path public/css --framework svelte
519
591
  npx rizzo-css add --install-package
520
- npx rizzo-css add --path public/css --framework svelte
521
592
  npx rizzo-css theme
522
593
 
523
594
  Docs: https://rizzo-css.vercel.app
@@ -618,67 +689,33 @@ function getLinkHrefForTargetDir(framework, targetDir) {
618
689
  return base ? base + '/' + file : file;
619
690
  }
620
691
 
621
- function cmdAdd(argv) {
692
+ async function cmdAdd(argv) {
622
693
  const customPath = getFlagValue(argv, '--path');
623
694
  const explicitFrameworkRaw = getFlagValue(argv, '--framework');
624
695
  const explicitFramework = explicitFrameworkRaw && FRAMEWORKS.includes(explicitFrameworkRaw.toLowerCase()) ? explicitFrameworkRaw.toLowerCase() : null;
625
696
  const installPackage = hasFlag(argv, '--install-package');
626
697
  const noInstall = hasFlag(argv, '--no-install');
698
+ const positionals = getPositionalArgs(argv);
627
699
 
628
700
  const cwd = process.cwd();
629
701
  const config = readRizzoConfig(cwd);
630
- let framework = explicitFramework || (config && config.framework) || detectFramework(cwd);
631
- const paths = getFrameworkCssPaths(framework);
632
- const targetDir = customPath || (config && config.targetDir) || paths.targetDir;
633
- const targetFile = join(cwd, targetDir, 'rizzo.min.css');
634
- const cssSource = getCssPath();
635
-
636
- if (!existsSync(cssSource)) {
637
- console.error('Error: Rizzo CSS build not found. Run from repo root: pnpm build:css');
638
- process.exit(1);
639
- }
640
-
641
- const pm = (config && config.packageManager)
642
- ? getPackageManagerCommands({ agent: config.packageManager, command: config.packageManager })
643
- : resolvePackageManager(cwd);
644
- const addPkg = pm.add('rizzo-css');
645
- const linkHref = customPath ? getLinkHrefForTargetDir(framework, targetDir) : paths.linkHref;
646
- const cliExample = pm.dlx('rizzo-css theme');
647
- const initExample = pm.dlx('rizzo-css init');
648
-
649
- mkdirSync(join(cwd, targetDir), { recursive: true });
650
- copyFileSync(cssSource, targetFile);
651
- console.log('\n✓ Rizzo CSS copied to ' + targetFile);
652
-
702
+ const options = {
703
+ config,
704
+ targetDir: customPath || (config && config.targetDir) || undefined,
705
+ preselectedComponents: positionals.length > 0 ? positionals : undefined,
706
+ };
707
+ await runAddToExisting(explicitFramework, options);
653
708
  if (installPackage && !noInstall) {
709
+ const pm = (config && config.packageManager)
710
+ ? getPackageManagerCommands({ agent: config.packageManager, command: config.packageManager })
711
+ : resolvePackageManager(cwd);
712
+ const addPkg = pm.add('rizzo-css');
654
713
  console.log('\nRunning: ' + addPkg);
655
714
  const code = runInDir(cwd, addPkg);
656
715
  if (code !== 0) {
657
716
  console.error('\nInstall failed (exit ' + code + '). You can run manually: ' + addPkg);
658
717
  }
659
718
  }
660
-
661
- if (framework === 'svelte') {
662
- console.log('\nDetected Svelte/SvelteKit. Add to your root layout (e.g. src/app.html):\n');
663
- console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
664
- console.log('\nSet a theme on <html>: data-theme="github-dark-classic" (see: ' + cliExample + ')');
665
- console.log('\nTo add Rizzo Svelte components later: copy from this package\'s scaffold or run ' + initExample + ' and pick Svelte + components in an empty folder, then copy the generated files.\n');
666
- } else if (framework === 'astro') {
667
- console.log('\nDetected Astro. Add to your layout (e.g. src/layouts/Layout.astro):\n');
668
- console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
669
- console.log('\nSet a theme on <html>: data-theme="github-dark-classic" (see: ' + cliExample + ')\n');
670
- } else {
671
- console.log('\nAdd to your HTML or layout:\n');
672
- console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
673
- if (framework === 'vanilla') {
674
- console.log('\nVanilla JS: same CSS and component classes as Astro/Svelte. Use the same BEM markup from the docs.');
675
- }
676
- console.log('\nSet a theme on <html>: data-theme="github-dark-classic" (see: ' + cliExample + ')');
677
- }
678
- if (!installPackage || noInstall) {
679
- console.log('\nTo install the package (CLI + components): ' + addPkg);
680
- }
681
- console.log('\nDocs: https://rizzo-css.vercel.app\n');
682
719
  }
683
720
 
684
721
  function getScaffoldSvelteDir() {
@@ -697,6 +734,61 @@ function getScaffoldVanillaIconsDir() {
697
734
  return join(getPackageRoot(), 'scaffold', 'vanilla', 'icons');
698
735
  }
699
736
 
737
+ function getScaffoldVanillaComponentsDir() {
738
+ return join(getPackageRoot(), 'scaffold', 'vanilla', 'components');
739
+ }
740
+
741
+ /** Copy selected Vanilla component HTML files into projectDir/components/, with replacements. Writes a simple components/index.html. */
742
+ function copyVanillaComponents(projectDir, selectedNames, replacements) {
743
+ const srcDir = getScaffoldVanillaComponentsDir();
744
+ if (!existsSync(srcDir)) return;
745
+ const linkHref = replacements['{{LINK_HREF}}'] || 'css/rizzo.min.css';
746
+ const slugsToCopy = [];
747
+ const seen = new Set();
748
+ for (const name of selectedNames) {
749
+ const slug = VANILLA_COMPONENT_SLUGS[name];
750
+ if (slug && !seen.has(slug)) {
751
+ seen.add(slug);
752
+ slugsToCopy.push(slug);
753
+ }
754
+ }
755
+ if (slugsToCopy.length === 0) return;
756
+ const destDir = join(projectDir, 'components');
757
+ mkdirSync(destDir, { recursive: true });
758
+ for (const slug of slugsToCopy) {
759
+ const src = join(srcDir, slug + '.html');
760
+ if (existsSync(src)) {
761
+ let content = readFileSync(src, 'utf8');
762
+ for (const [key, value] of Object.entries(replacements)) {
763
+ content = content.split(key).join(value);
764
+ }
765
+ writeFileSync(join(destDir, slug + '.html'), content, 'utf8');
766
+ }
767
+ }
768
+ const indexLinks = slugsToCopy.map((s) => ' <li><a href="' + s + '.html">' + s + '</a></li>').join('\n');
769
+ const indexHtml = `<!DOCTYPE html>
770
+ <html lang="en" data-theme="${replacements['{{DATA_THEME}}'] || 'github-dark-classic'}">
771
+ <head>
772
+ <meta charset="UTF-8" />
773
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
774
+ <title>Components</title>
775
+ <link rel="stylesheet" href="../${linkHref}" />
776
+ </head>
777
+ <body>
778
+ <main style="padding: var(--spacing-6); max-width: 60ch;">
779
+ <h1>Components</h1>
780
+ <ul>
781
+ ${indexLinks}
782
+ </ul>
783
+ <p><a href="../index.html">Back to index</a></p>
784
+ </main>
785
+ <script src="../js/main.js"></script>
786
+ </body>
787
+ </html>
788
+ `;
789
+ writeFileSync(join(destDir, 'index.html'), indexHtml, 'utf8');
790
+ }
791
+
700
792
  /** Copy Rizzo icons into the project for the given framework. */
701
793
  function copyRizzoIcons(projectDir, framework) {
702
794
  if (framework === 'astro') {
@@ -720,12 +812,12 @@ function copyRizzoIcons(projectDir, framework) {
720
812
  }
721
813
  }
722
814
 
723
- function getScaffoldAstroAppDir() {
724
- return join(getPackageRoot(), 'scaffold', 'astro-app');
815
+ function getScaffoldAstroMinimalDir() {
816
+ return join(getPackageRoot(), 'scaffold', 'astro-minimal');
725
817
  }
726
818
 
727
- function getScaffoldSvelteAppDir() {
728
- return join(getPackageRoot(), 'scaffold', 'svelte-app');
819
+ function getScaffoldSvelteMinimalDir() {
820
+ return join(getPackageRoot(), 'scaffold', 'svelte-minimal');
729
821
  }
730
822
 
731
823
  function copyDirRecursive(src, dest) {
@@ -847,7 +939,7 @@ function copyAstroComponents(projectDir, selectedNames) {
847
939
  }
848
940
  }
849
941
 
850
- /** Add Rizzo CSS (and optional components) to an existing project in cwd. frameworkOverride: when set (from init), skip framework prompt. options: { config? }. */
942
+ /** Add Rizzo CSS and hand-picked components to an existing project in cwd. frameworkOverride: when set (from init), skip framework prompt. options: { config?, targetDir? }. */
851
943
  async function runAddToExisting(frameworkOverride, options) {
852
944
  const cwd = process.cwd();
853
945
  const config = (options && options.config) || readRizzoConfig(cwd);
@@ -866,14 +958,31 @@ async function runAddToExisting(frameworkOverride, options) {
866
958
  framework = await selectMenu(frameworkOptions, frameworkPrompt);
867
959
  }
868
960
 
869
- const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : [];
870
- const selectedComponents = componentList.length > 0
871
- ? await promptComponentChoice(componentList, framework)
872
- : [];
961
+ const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : framework === 'vanilla' ? Object.keys(VANILLA_COMPONENT_SLUGS) : [];
962
+ const preselected = options.preselectedComponents && options.preselectedComponents.length > 0 ? options.preselectedComponents : null;
963
+ let selectedComponents;
964
+ if (preselected && componentList.length > 0) {
965
+ const valid = preselected.filter((c) => componentList.includes(c));
966
+ const invalid = preselected.filter((c) => !componentList.includes(c));
967
+ if (invalid.length > 0) {
968
+ console.log('Unknown or unsupported component name(s) (skipped): ' + invalid.join(', '));
969
+ }
970
+ selectedComponents = valid;
971
+ if (selectedComponents.length > 0) {
972
+ const n = selectedComponents.length;
973
+ console.log('Adding ' + n + ' component' + (n === 1 ? '' : 's') + ': ' + selectedComponents.join(', '));
974
+ }
975
+ } else if (preselected && componentList.length === 0) {
976
+ selectedComponents = [];
977
+ } else {
978
+ selectedComponents = componentList.length > 0
979
+ ? await promptComponentChoice(componentList, framework)
980
+ : [];
981
+ }
873
982
 
874
983
  let theme, defaultDark, defaultLight;
875
984
  const wantsThemeSwitcher = selectedComponents.includes('ThemeSwitcher');
876
- if (wantsThemeSwitcher) {
985
+ if (wantsThemeSwitcher && !preselected) {
877
986
  const setDefaults = await selectMenu(
878
987
  [
879
988
  { value: true, label: 'Yes — choose default dark, default light, and initial theme' },
@@ -904,7 +1013,8 @@ async function runAddToExisting(frameworkOverride, options) {
904
1013
  }
905
1014
 
906
1015
  const paths = getFrameworkCssPaths(framework);
907
- const targetDir = join(cwd, paths.targetDir);
1016
+ const targetDirRaw = (options && options.targetDir) || (config && config.targetDir) || paths.targetDir;
1017
+ const targetDir = join(cwd, targetDirRaw);
908
1018
  const cssTarget = join(targetDir, 'rizzo.min.css');
909
1019
  mkdirSync(targetDir, { recursive: true });
910
1020
  copyFileSync(cssSource, cssTarget);
@@ -914,9 +1024,13 @@ async function runAddToExisting(frameworkOverride, options) {
914
1024
  copySvelteComponents(cwd, selectedComponents);
915
1025
  } else if (framework === 'astro' && selectedComponents.length > 0) {
916
1026
  copyAstroComponents(cwd, selectedComponents);
1027
+ } else if (framework === 'vanilla' && selectedComponents.length > 0) {
1028
+ const linkHrefForVanilla = (options && options.targetDir) ? getLinkHrefForTargetDir(framework, options.targetDir) : paths.linkHref;
1029
+ const vanillaRepl = { '{{LINK_HREF}}': linkHrefForVanilla, '{{DATA_THEME}}': theme };
1030
+ copyVanillaComponents(cwd, selectedComponents, vanillaRepl);
917
1031
  }
918
1032
 
919
- const linkHref = paths.linkHref;
1033
+ const linkHref = (options && options.targetDir) ? getLinkHrefForTargetDir(framework, options.targetDir) : paths.linkHref;
920
1034
  const pm = (config && config.packageManager)
921
1035
  ? getPackageManagerCommands({ agent: config.packageManager, command: config.packageManager })
922
1036
  : resolvePackageManager(cwd);
@@ -945,6 +1059,9 @@ async function runAddToExisting(frameworkOverride, options) {
945
1059
  console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
946
1060
  console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: ' + cliExample + ')');
947
1061
  console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
1062
+ if (selectedComponents.length > 0) {
1063
+ console.log(' Component HTML files are in components/.');
1064
+ }
948
1065
  }
949
1066
  console.log('\nTo install the package (CLI + components): ' + pm.add('rizzo-css'));
950
1067
  console.log('\nDocs: https://rizzo-css.vercel.app\n');
@@ -963,17 +1080,22 @@ async function cmdInit(argv) {
963
1080
  let initMode;
964
1081
  let name = '';
965
1082
  let theme, defaultDark, defaultLight;
966
- let selectedComponents = [];
967
1083
  let selectedPm;
968
1084
  let selectedTemplate;
1085
+ let selectedComponents = [];
969
1086
 
970
1087
  if (yes) {
971
1088
  const frameworkArg = getFlagValue(argv, '--framework');
972
1089
  framework = (frameworkArg && FRAMEWORKS.includes(frameworkArg.toLowerCase())) ? frameworkArg.toLowerCase() : (config && config.framework) || 'astro';
973
1090
  initMode = 'new';
974
1091
  const templateArg = getFlagValue(argv, '--template');
975
- selectedTemplate = (templateArg && (templateArg === 'full-app' || templateArg === 'full' || templateArg === 'minimal')) ? templateArg : (framework === 'vanilla' ? 'full' : 'full-app');
976
- if (framework === 'vanilla' && selectedTemplate === 'full-app') selectedTemplate = 'full';
1092
+ selectedTemplate = (templateArg && (templateArg === 'full' || templateArg === 'minimal' || templateArg === 'manual')) ? templateArg : 'full';
1093
+ if (selectedTemplate === 'full' && (framework === 'astro' || framework === 'svelte')) {
1094
+ selectedComponents = framework === 'svelte' ? [...SVELTE_COMPONENTS] : [...ASTRO_COMPONENTS];
1095
+ } else if (selectedTemplate === 'minimal' && (framework === 'astro' || framework === 'svelte')) {
1096
+ const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : ASTRO_COMPONENTS;
1097
+ selectedComponents = RECOMMENDED_COMPONENTS.filter((c) => componentList.includes(c));
1098
+ }
977
1099
  const projectDir = cwd;
978
1100
  const resolved = resolvePackageManager(projectDir, cwd);
979
1101
  selectedPm = (config && config.packageManager) || resolved.agent || 'npm';
@@ -1012,17 +1134,29 @@ async function cmdInit(argv) {
1012
1134
  );
1013
1135
  name = projectChoice === 'name' ? await question('Project name (folder name): ') : '';
1014
1136
 
1015
- selectedTemplate = await promptTemplate(framework);
1137
+ selectedTemplate = await selectMenu(TEMPLATES[framework] || TEMPLATES.vanilla, '? Full, Minimal, or Manual?');
1016
1138
 
1017
- const themeOut = await promptThemes();
1018
- theme = themeOut.theme;
1019
- defaultDark = themeOut.defaultDark;
1020
- defaultLight = themeOut.defaultLight;
1139
+ if (selectedTemplate === 'full' && (framework === 'astro' || framework === 'svelte')) {
1140
+ selectedComponents = framework === 'svelte' ? [...SVELTE_COMPONENTS] : [...ASTRO_COMPONENTS];
1141
+ } else if (selectedTemplate === 'minimal' && (framework === 'astro' || framework === 'svelte')) {
1142
+ const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : ASTRO_COMPONENTS;
1143
+ selectedComponents = RECOMMENDED_COMPONENTS.filter((c) => componentList.includes(c));
1144
+ } else if (selectedTemplate === 'manual') {
1145
+ const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : ASTRO_COMPONENTS;
1146
+ selectedComponents = await promptComponentChoice(componentList, framework);
1147
+ }
1021
1148
 
1022
- const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : [];
1023
- selectedComponents = componentList.length > 0
1024
- ? await promptComponentChoice(componentList, framework)
1025
- : [];
1149
+ const wantsThemeSwitcher = (framework === 'vanilla' && (selectedTemplate === 'full' || selectedTemplate === 'minimal')) || selectedComponents.includes('ThemeSwitcher');
1150
+ if (wantsThemeSwitcher) {
1151
+ const themeOut = await promptThemes();
1152
+ theme = themeOut.theme;
1153
+ defaultDark = themeOut.defaultDark;
1154
+ defaultLight = themeOut.defaultLight;
1155
+ } else {
1156
+ theme = 'system';
1157
+ defaultDark = DARK_THEMES[0];
1158
+ defaultLight = LIGHT_THEMES[0];
1159
+ }
1026
1160
 
1027
1161
  const projectDirForPm = name ? join(cwd, name) : cwd;
1028
1162
  selectedPm = await promptPackageManager(projectDirForPm);
@@ -1049,12 +1183,15 @@ async function cmdInit(argv) {
1049
1183
  '{{PROJECT_NAME}}': projectNamePkg,
1050
1184
  };
1051
1185
 
1052
- const astroAppDir = getScaffoldAstroAppDir();
1053
- const svelteAppDir = getScaffoldSvelteAppDir();
1186
+ const astroMinimalDir = getScaffoldAstroMinimalDir();
1187
+ const svelteMinimalDir = getScaffoldSvelteMinimalDir();
1054
1188
  const pathsForScaffold = getFrameworkCssPaths(framework);
1055
- const useAstroApp = framework === 'astro' && selectedTemplate === 'full-app' && existsSync(astroAppDir);
1056
- const useSvelteApp = framework === 'svelte' && selectedTemplate === 'full-app' && existsSync(svelteAppDir);
1057
- const useVanillaFull = framework === 'vanilla' && selectedTemplate === 'full' && existsSync(getScaffoldVanillaIndex());
1189
+ const useHandpickAstro = selectedTemplate === 'manual' && framework === 'astro' && existsSync(astroMinimalDir);
1190
+ const useHandpickSvelte = selectedTemplate === 'manual' && framework === 'svelte' && existsSync(svelteMinimalDir);
1191
+ const useAstroBase = (selectedTemplate === 'full' || selectedTemplate === 'minimal') && framework === 'astro' && existsSync(astroMinimalDir);
1192
+ const useSvelteBase = (selectedTemplate === 'full' || selectedTemplate === 'minimal') && framework === 'svelte' && existsSync(svelteMinimalDir);
1193
+ const useVanillaFull = selectedTemplate === 'full' && framework === 'vanilla' && existsSync(getScaffoldVanillaIndex());
1194
+ const useVanillaMinimal = selectedTemplate === 'minimal' && framework === 'vanilla';
1058
1195
 
1059
1196
  let cssTarget;
1060
1197
  let indexPath;
@@ -1074,30 +1211,60 @@ async function cmdInit(argv) {
1074
1211
  </html>
1075
1212
  `;
1076
1213
 
1077
- if (useAstroApp) {
1214
+ if (useHandpickAstro) {
1215
+ mkdirSync(projectDir, { recursive: true });
1216
+ copyDirRecursiveWithReplacements(astroMinimalDir, projectDir, replacements);
1217
+ mkdirSync(join(projectDir, 'public', 'css'), { recursive: true });
1218
+ cssTarget = join(projectDir, 'public', 'css', 'rizzo.min.css');
1219
+ copyFileSync(cssSource, cssTarget);
1220
+ if (statSync(cssTarget).size < 5000) {
1221
+ console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
1222
+ }
1223
+ copyPackageLicense(projectDir);
1224
+ if (selectedComponents.length > 0) {
1225
+ copyRizzoIcons(projectDir, 'astro');
1226
+ copyAstroComponents(projectDir, selectedComponents);
1227
+ }
1228
+ } else if (useAstroBase) {
1078
1229
  mkdirSync(projectDir, { recursive: true });
1079
- copyDirRecursiveWithReplacements(astroAppDir, projectDir, replacements);
1230
+ copyDirRecursiveWithReplacements(astroMinimalDir, projectDir, replacements);
1080
1231
  mkdirSync(join(projectDir, 'public', 'css'), { recursive: true });
1081
1232
  cssTarget = join(projectDir, 'public', 'css', 'rizzo.min.css');
1082
1233
  copyFileSync(cssSource, cssTarget);
1083
1234
  if (statSync(cssTarget).size < 5000) {
1084
1235
  console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
1085
1236
  }
1086
- copyRizzoIcons(projectDir, 'astro');
1237
+ copyPackageLicense(projectDir);
1087
1238
  if (selectedComponents.length > 0) {
1239
+ copyRizzoIcons(projectDir, 'astro');
1088
1240
  copyAstroComponents(projectDir, selectedComponents);
1089
1241
  }
1090
- } else if (useSvelteApp) {
1242
+ } else if (useHandpickSvelte) {
1091
1243
  mkdirSync(projectDir, { recursive: true });
1092
- copyDirRecursiveWithReplacements(svelteAppDir, projectDir, replacements);
1244
+ copyDirRecursiveWithReplacements(svelteMinimalDir, projectDir, replacements);
1093
1245
  mkdirSync(join(projectDir, 'static', 'css'), { recursive: true });
1094
1246
  cssTarget = join(projectDir, 'static', 'css', 'rizzo.min.css');
1095
1247
  copyFileSync(cssSource, cssTarget);
1096
1248
  if (statSync(cssTarget).size < 5000) {
1097
1249
  console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
1098
1250
  }
1099
- copyRizzoIcons(projectDir, 'svelte');
1251
+ copyPackageLicense(projectDir);
1100
1252
  if (selectedComponents.length > 0) {
1253
+ copyRizzoIcons(projectDir, 'svelte');
1254
+ copySvelteComponents(projectDir, selectedComponents);
1255
+ }
1256
+ } else if (useSvelteBase) {
1257
+ mkdirSync(projectDir, { recursive: true });
1258
+ copyDirRecursiveWithReplacements(svelteMinimalDir, projectDir, replacements);
1259
+ mkdirSync(join(projectDir, 'static', 'css'), { recursive: true });
1260
+ cssTarget = join(projectDir, 'static', 'css', 'rizzo.min.css');
1261
+ copyFileSync(cssSource, cssTarget);
1262
+ if (statSync(cssTarget).size < 5000) {
1263
+ console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
1264
+ }
1265
+ copyPackageLicense(projectDir);
1266
+ if (selectedComponents.length > 0) {
1267
+ copyRizzoIcons(projectDir, 'svelte');
1101
1268
  copySvelteComponents(projectDir, selectedComponents);
1102
1269
  }
1103
1270
  } else if (useVanillaFull) {
@@ -1132,6 +1299,30 @@ async function cmdInit(argv) {
1132
1299
  mainJs = mainJs.replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark).replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight);
1133
1300
  writeFileSync(join(projectDir, 'js', 'main.js'), mainJs, 'utf8');
1134
1301
  }
1302
+ copyPackageLicense(projectDir);
1303
+ } else if (useVanillaMinimal) {
1304
+ const cssDir = join(projectDir, pathsForScaffold.targetDir);
1305
+ cssTarget = join(cssDir, 'rizzo.min.css');
1306
+ mkdirSync(cssDir, { recursive: true });
1307
+ copyFileSync(cssSource, cssTarget);
1308
+ if (statSync(cssTarget).size < 5000) {
1309
+ console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
1310
+ }
1311
+ mkdirSync(join(projectDir, 'js'), { recursive: true });
1312
+ const vanillaJs = join(getPackageRoot(), 'scaffold', 'vanilla', 'js', 'main.js');
1313
+ if (existsSync(vanillaJs)) {
1314
+ let mainJs = readFileSync(vanillaJs, 'utf8');
1315
+ mainJs = mainJs.replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark).replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight);
1316
+ writeFileSync(join(projectDir, 'js', 'main.js'), mainJs, 'utf8');
1317
+ }
1318
+ const vanillaRepl = { ...replacements, '{{LINK_HREF}}': 'css/rizzo.min.css' };
1319
+ copyVanillaComponents(projectDir, RECOMMENDED_COMPONENTS, vanillaRepl);
1320
+ copyRizzoIcons(projectDir, 'vanilla');
1321
+ const minimalIndexWithScript = minimalHtml.replace('</body>', ' <script src="js/main.js"></script>\n</body>');
1322
+ indexPath = join(projectDir, 'index.html');
1323
+ writeFileSync(indexPath, minimalIndexWithScript, 'utf8');
1324
+ writeFileSync(join(projectDir, 'README.md'), VANILLA_MINIMAL_README, 'utf8');
1325
+ copyPackageLicense(projectDir);
1135
1326
  } else {
1136
1327
  const cssDir = join(projectDir, pathsForScaffold.targetDir);
1137
1328
  cssTarget = join(cssDir, 'rizzo.min.css');
@@ -1140,25 +1331,36 @@ async function cmdInit(argv) {
1140
1331
  if (statSync(cssTarget).size < 5000) {
1141
1332
  console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
1142
1333
  }
1143
- if (framework === 'vanilla') {
1334
+ if (framework === 'vanilla' && selectedTemplate === 'manual') {
1144
1335
  indexPath = join(projectDir, 'index.html');
1145
- writeFileSync(indexPath, minimalHtml, 'utf8');
1336
+ let indexContent = minimalHtml;
1337
+ if (selectedComponents.length > 0) {
1338
+ mkdirSync(join(projectDir, 'js'), { recursive: true });
1339
+ const vanillaJs = join(getPackageRoot(), 'scaffold', 'vanilla', 'js', 'main.js');
1340
+ if (existsSync(vanillaJs)) {
1341
+ let mainJs = readFileSync(vanillaJs, 'utf8');
1342
+ mainJs = mainJs.replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark).replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight);
1343
+ writeFileSync(join(projectDir, 'js', 'main.js'), mainJs, 'utf8');
1344
+ }
1345
+ const vanillaRepl = { ...replacements, '{{LINK_HREF}}': 'css/rizzo.min.css' };
1346
+ copyVanillaComponents(projectDir, selectedComponents, vanillaRepl);
1347
+ copyRizzoIcons(projectDir, 'vanilla');
1348
+ indexContent = minimalHtml.replace('</body>', ' <script src="js/main.js"></script>\n</body>');
1349
+ }
1350
+ writeFileSync(indexPath, indexContent, 'utf8');
1351
+ writeFileSync(join(projectDir, 'README.md'), VANILLA_MANUAL_README, 'utf8');
1146
1352
  } else if (framework === 'astro') {
1147
1353
  indexPath = join(projectDir, 'public', 'index.html');
1148
1354
  mkdirSync(join(projectDir, 'public'), { recursive: true });
1149
1355
  writeFileSync(indexPath, minimalHtml, 'utf8');
1356
+ writeFileSync(join(projectDir, 'README.md'), FALLBACK_MINIMAL_README, 'utf8');
1150
1357
  } else {
1151
1358
  indexPath = join(projectDir, 'static', 'index.html');
1152
1359
  mkdirSync(join(projectDir, 'static'), { recursive: true });
1153
1360
  writeFileSync(indexPath, minimalHtml, 'utf8');
1361
+ writeFileSync(join(projectDir, 'README.md'), FALLBACK_MINIMAL_README, 'utf8');
1154
1362
  }
1155
- if (framework === 'svelte' && selectedComponents.length > 0) {
1156
- copyRizzoIcons(projectDir, 'svelte');
1157
- copySvelteComponents(projectDir, selectedComponents);
1158
- } else if (framework === 'astro' && selectedComponents.length > 0) {
1159
- copyRizzoIcons(projectDir, 'astro');
1160
- copyAstroComponents(projectDir, selectedComponents);
1161
- }
1363
+ copyPackageLicense(projectDir);
1162
1364
  }
1163
1365
 
1164
1366
  console.log('\n✓ Project ready at ' + projectDir);
@@ -1166,16 +1368,18 @@ async function cmdInit(argv) {
1166
1368
  if (indexPath) console.log(' - ' + indexPath);
1167
1369
  if (framework === 'vanilla') {
1168
1370
  if (useVanillaFull) {
1169
- console.log(' - Vanilla JS (full): theme switcher, js/main.js, icons, README.');
1371
+ console.log(' - Vanilla JS (full): theme switcher, js/main.js, icons, component showcase, README.');
1372
+ } else if (useVanillaMinimal) {
1373
+ console.log(' - Vanilla JS (minimal): index.html + CSS + js/main.js. Add components from docs or use Full for showcase.');
1170
1374
  } else {
1171
- console.log(' - Vanilla JS (minimal): index.html + CSS link. Open index.html in a browser or add your own app.');
1375
+ console.log(' - Vanilla JS (manual): index.html + CSS only. Add JS from docs or copy from Full.');
1172
1376
  }
1173
1377
  }
1174
1378
  const pm = getPackageManagerCommands({ agent: selectedPm, command: selectedPm });
1175
1379
  const nextStep = pm.install + ' && ' + pm.run('dev');
1176
1380
  const runPrefix = name ? 'cd ' + name + ' && ' : '';
1177
1381
 
1178
- if (runInstallAfterScaffold && !noInstall && (useAstroApp || useSvelteApp)) {
1382
+ if (runInstallAfterScaffold && !noInstall && (useHandpickAstro || useHandpickSvelte || useAstroBase || useSvelteBase)) {
1179
1383
  console.log('\nRunning: ' + pm.install);
1180
1384
  const code = runInDir(projectDir, pm.install);
1181
1385
  if (code !== 0) {
@@ -1189,15 +1393,19 @@ async function cmdInit(argv) {
1189
1393
  console.log('\n - Wrote ' + RIZZO_CONFIG_FILE);
1190
1394
  }
1191
1395
 
1192
- if (useAstroApp) {
1193
- console.log(' - Full Astro project with Rizzo CSS. Run: ' + runPrefix + nextStep);
1194
- console.log(' - Icons: src/components/rizzo/icons/ (Astro components)');
1396
+ if (useHandpickAstro || useHandpickSvelte) {
1397
+ const fw = useHandpickAstro ? 'Astro' : 'SvelteKit';
1398
+ console.log(' - ' + fw + ' (manual): base + ' + selectedComponents.length + ' component(s). Run: ' + runPrefix + nextStep);
1195
1399
  }
1196
- if (useSvelteApp) {
1197
- console.log(' - Full SvelteKit project with Rizzo CSS. Run: ' + runPrefix + nextStep);
1198
- console.log(' - Install dependencies first (required before dev). Icons: src/lib/rizzo/icons/ (Svelte components)');
1400
+ if (useAstroBase) {
1401
+ const label = selectedTemplate === 'full' ? 'Full' : 'Minimal';
1402
+ console.log(' - Astro (' + label.toLowerCase() + '): app + ' + selectedComponents.length + ' component(s). Run: ' + runPrefix + nextStep);
1199
1403
  }
1200
- if ((framework === 'astro' || framework === 'svelte') && !useAstroApp && !useSvelteApp) {
1404
+ if (useSvelteBase) {
1405
+ const label = selectedTemplate === 'full' ? 'Full' : 'Minimal';
1406
+ console.log(' - SvelteKit (' + label.toLowerCase() + '): app + ' + selectedComponents.length + ' component(s). Run: ' + runPrefix + nextStep);
1407
+ }
1408
+ if ((framework === 'astro' || framework === 'svelte') && !useAstroBase && !useSvelteBase && !useHandpickAstro && !useHandpickSvelte) {
1201
1409
  const fw = framework === 'svelte' ? 'Svelte' : 'Astro';
1202
1410
  const createExample = getCreateProjectExample(pm, framework);
1203
1411
  console.log('\n - Minimal template (CSS + index). To get a full app: ' + createExample + ', then cd into the project and run ' + pm.dlx('rizzo-css add') + '.');
@@ -1223,7 +1431,10 @@ function main() {
1223
1431
  }
1224
1432
 
1225
1433
  if (command === 'add') {
1226
- cmdAdd(argv);
1434
+ cmdAdd(argv).catch((err) => {
1435
+ console.error(err);
1436
+ process.exit(1);
1437
+ });
1227
1438
  return;
1228
1439
  }
1229
1440