@webjsdev/ui 0.3.17 → 0.4.0

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 (358) hide show
  1. package/README.md +66 -7
  2. package/THIRD_PARTY_NOTICES.md +349 -0
  3. package/package.json +4 -2
  4. package/packages/registry/blocks/_shared/placeholder.svg +1 -0
  5. package/packages/registry/blocks/charts/chart-area-axes.ts +72 -0
  6. package/packages/registry/blocks/charts/chart-area-default.ts +64 -0
  7. package/packages/registry/blocks/charts/chart-area-gradient.ts +82 -0
  8. package/packages/registry/blocks/charts/chart-area-icons.ts +77 -0
  9. package/packages/registry/blocks/charts/chart-area-interactive.ts +204 -0
  10. package/packages/registry/blocks/charts/chart-area-legend.ts +72 -0
  11. package/packages/registry/blocks/charts/chart-area-linear.ts +64 -0
  12. package/packages/registry/blocks/charts/chart-area-stacked-expand.ts +77 -0
  13. package/packages/registry/blocks/charts/chart-area-stacked.ts +71 -0
  14. package/packages/registry/blocks/charts/chart-area-step.ts +68 -0
  15. package/packages/registry/blocks/charts/chart-bar-active.ts +93 -0
  16. package/packages/registry/blocks/charts/chart-bar-default.ts +60 -0
  17. package/packages/registry/blocks/charts/chart-bar-horizontal.ts +62 -0
  18. package/packages/registry/blocks/charts/chart-bar-interactive.ts +185 -0
  19. package/packages/registry/blocks/charts/chart-bar-label-custom.ts +78 -0
  20. package/packages/registry/blocks/charts/chart-bar-label.ts +66 -0
  21. package/packages/registry/blocks/charts/chart-bar-mixed.ts +87 -0
  22. package/packages/registry/blocks/charts/chart-bar-multiple.ts +67 -0
  23. package/packages/registry/blocks/charts/chart-bar-negative.ts +61 -0
  24. package/packages/registry/blocks/charts/chart-bar-stacked.ts +68 -0
  25. package/packages/registry/blocks/charts/chart-line-default.ts +61 -0
  26. package/packages/registry/blocks/charts/chart-line-dots-colors.ts +86 -0
  27. package/packages/registry/blocks/charts/chart-line-dots-custom.ts +75 -0
  28. package/packages/registry/blocks/charts/chart-line-dots.ts +65 -0
  29. package/packages/registry/blocks/charts/chart-line-interactive.ts +185 -0
  30. package/packages/registry/blocks/charts/chart-line-label-custom.ts +94 -0
  31. package/packages/registry/blocks/charts/chart-line-label.ts +73 -0
  32. package/packages/registry/blocks/charts/chart-line-linear.ts +61 -0
  33. package/packages/registry/blocks/charts/chart-line-multiple.ts +71 -0
  34. package/packages/registry/blocks/charts/chart-line-step.ts +61 -0
  35. package/packages/registry/blocks/charts/chart-pie-donut-active.ts +86 -0
  36. package/packages/registry/blocks/charts/chart-pie-donut-text.ts +89 -0
  37. package/packages/registry/blocks/charts/chart-pie-donut.ts +77 -0
  38. package/packages/registry/blocks/charts/chart-pie-interactive.ts +120 -0
  39. package/packages/registry/blocks/charts/chart-pie-label-custom.ts +82 -0
  40. package/packages/registry/blocks/charts/chart-pie-label-list.ts +86 -0
  41. package/packages/registry/blocks/charts/chart-pie-label.ts +77 -0
  42. package/packages/registry/blocks/charts/chart-pie-legend.ts +79 -0
  43. package/packages/registry/blocks/charts/chart-pie-separator-none.ts +77 -0
  44. package/packages/registry/blocks/charts/chart-pie-simple.ts +77 -0
  45. package/packages/registry/blocks/charts/chart-pie-stacked.ts +99 -0
  46. package/packages/registry/blocks/charts/chart-radar-default.ts +61 -0
  47. package/packages/registry/blocks/charts/chart-radar-dots.ts +61 -0
  48. package/packages/registry/blocks/charts/chart-radar-grid-circle-fill.ts +61 -0
  49. package/packages/registry/blocks/charts/chart-radar-grid-circle-no-lines.ts +61 -0
  50. package/packages/registry/blocks/charts/chart-radar-grid-circle.ts +61 -0
  51. package/packages/registry/blocks/charts/chart-radar-grid-custom.ts +61 -0
  52. package/packages/registry/blocks/charts/chart-radar-grid-fill.ts +61 -0
  53. package/packages/registry/blocks/charts/chart-radar-grid-none.ts +60 -0
  54. package/packages/registry/blocks/charts/chart-radar-icons.ts +76 -0
  55. package/packages/registry/blocks/charts/chart-radar-label-custom.ts +77 -0
  56. package/packages/registry/blocks/charts/chart-radar-legend.ts +70 -0
  57. package/packages/registry/blocks/charts/chart-radar-lines-only.ts +68 -0
  58. package/packages/registry/blocks/charts/chart-radar-multiple.ts +68 -0
  59. package/packages/registry/blocks/charts/chart-radar-radius.ts +68 -0
  60. package/packages/registry/blocks/charts/chart-radial-grid.ts +80 -0
  61. package/packages/registry/blocks/charts/chart-radial-label.ts +85 -0
  62. package/packages/registry/blocks/charts/chart-radial-shape.ts +81 -0
  63. package/packages/registry/blocks/charts/chart-radial-simple.ts +79 -0
  64. package/packages/registry/blocks/charts/chart-radial-stacked.ts +69 -0
  65. package/packages/registry/blocks/charts/chart-radial-text.ts +82 -0
  66. package/packages/registry/blocks/charts/chart-tooltip-advanced.ts +84 -0
  67. package/packages/registry/blocks/charts/chart-tooltip-default.ts +62 -0
  68. package/packages/registry/blocks/charts/chart-tooltip-formatter.ts +75 -0
  69. package/packages/registry/blocks/charts/chart-tooltip-icons.ts +68 -0
  70. package/packages/registry/blocks/charts/chart-tooltip-indicator-line.ts +62 -0
  71. package/packages/registry/blocks/charts/chart-tooltip-indicator-none.ts +62 -0
  72. package/packages/registry/blocks/charts/chart-tooltip-label-custom.ts +65 -0
  73. package/packages/registry/blocks/charts/chart-tooltip-label-formatter.ts +66 -0
  74. package/packages/registry/blocks/charts/chart-tooltip-label-none.ts +62 -0
  75. package/packages/registry/blocks/dashboard-01/components/app-sidebar.ts +108 -0
  76. package/packages/registry/blocks/dashboard-01/components/chart-area-interactive.ts +276 -0
  77. package/packages/registry/blocks/dashboard-01/components/dashboard-data.ts +89 -0
  78. package/packages/registry/blocks/dashboard-01/components/data-table.ts +637 -0
  79. package/packages/registry/blocks/dashboard-01/components/nav-documents.ts +65 -0
  80. package/packages/registry/blocks/dashboard-01/components/nav-main.ts +61 -0
  81. package/packages/registry/blocks/dashboard-01/components/nav-secondary.ts +40 -0
  82. package/packages/registry/blocks/dashboard-01/components/nav-user.ts +66 -0
  83. package/packages/registry/blocks/dashboard-01/components/section-cards.ts +59 -0
  84. package/packages/registry/blocks/dashboard-01/components/site-header.ts +52 -0
  85. package/packages/registry/blocks/dashboard-01/page.ts +39 -0
  86. package/packages/registry/blocks/login-01/components/login-form.ts +70 -0
  87. package/packages/registry/blocks/login-01/page.ts +19 -0
  88. package/packages/registry/blocks/login-02/components/login-form.ts +68 -0
  89. package/packages/registry/blocks/login-02/page.ts +36 -0
  90. package/packages/registry/blocks/login-03/components/login-form.ts +89 -0
  91. package/packages/registry/blocks/login-03/page.ts +28 -0
  92. package/packages/registry/blocks/login-04/components/login-form.ts +91 -0
  93. package/packages/registry/blocks/login-04/page.ts +20 -0
  94. package/packages/registry/blocks/login-05/components/login-form.ts +75 -0
  95. package/packages/registry/blocks/login-05/page.ts +19 -0
  96. package/packages/registry/blocks/preview/cards/activate-agent-dialog.ts +77 -0
  97. package/packages/registry/blocks/preview/cards/analytics-card.ts +64 -0
  98. package/packages/registry/blocks/preview/cards/anomaly-alert.ts +35 -0
  99. package/packages/registry/blocks/preview/cards/bar-chart-card.ts +91 -0
  100. package/packages/registry/blocks/preview/cards/book-appointment.ts +51 -0
  101. package/packages/registry/blocks/preview/cards/codespaces-card.ts +172 -0
  102. package/packages/registry/blocks/preview/cards/contributions-activity.ts +63 -0
  103. package/packages/registry/blocks/preview/cards/contributors.ts +51 -0
  104. package/packages/registry/blocks/preview/cards/environment-variables.ts +47 -0
  105. package/packages/registry/blocks/preview/cards/feedback-form.ts +61 -0
  106. package/packages/registry/blocks/preview/cards/file-upload.ts +51 -0
  107. package/packages/registry/blocks/preview/cards/github-profile.ts +66 -0
  108. package/packages/registry/blocks/preview/cards/icon-preview-grid.ts +47 -0
  109. package/packages/registry/blocks/preview/cards/invite-team.ts +78 -0
  110. package/packages/registry/blocks/preview/cards/invoice.ts +91 -0
  111. package/packages/registry/blocks/preview/cards/live-waveform.ts +330 -0
  112. package/packages/registry/blocks/preview/cards/no-team-members.ts +61 -0
  113. package/packages/registry/blocks/preview/cards/not-found.ts +46 -0
  114. package/packages/registry/blocks/preview/cards/observability-card.ts +44 -0
  115. package/packages/registry/blocks/preview/cards/pie-chart-card.ts +84 -0
  116. package/packages/registry/blocks/preview/cards/report-bug.ts +71 -0
  117. package/packages/registry/blocks/preview/cards/shipping-address.ts +79 -0
  118. package/packages/registry/blocks/preview/cards/shortcuts.ts +57 -0
  119. package/packages/registry/blocks/preview/cards/skeleton-loading.ts +37 -0
  120. package/packages/registry/blocks/preview/cards/sleep-report.ts +85 -0
  121. package/packages/registry/blocks/preview/cards/style-overview.ts +64 -0
  122. package/packages/registry/blocks/preview/cards/typography-specimen.ts +107 -0
  123. package/packages/registry/blocks/preview/cards/ui-elements.ts +164 -0
  124. package/packages/registry/blocks/preview/cards/usage-card.ts +63 -0
  125. package/packages/registry/blocks/preview/cards/visitors.ts +71 -0
  126. package/packages/registry/blocks/preview/cards/weekly-fitness-summary.ts +54 -0
  127. package/packages/registry/blocks/preview/page.ts +103 -0
  128. package/packages/registry/blocks/preview-02/cards/account-access.ts +70 -0
  129. package/packages/registry/blocks/preview-02/cards/card-overview.ts +75 -0
  130. package/packages/registry/blocks/preview-02/cards/claimable-balance.ts +54 -0
  131. package/packages/registry/blocks/preview-02/cards/contribution-history.ts +80 -0
  132. package/packages/registry/blocks/preview-02/cards/cover-art.ts +41 -0
  133. package/packages/registry/blocks/preview-02/cards/dividend-income.ts +76 -0
  134. package/packages/registry/blocks/preview-02/cards/empty-connect-bank.ts +38 -0
  135. package/packages/registry/blocks/preview-02/cards/empty-distribute-track.ts +38 -0
  136. package/packages/registry/blocks/preview-02/cards/empty-explore-catalog.ts +39 -0
  137. package/packages/registry/blocks/preview-02/cards/faq.ts +79 -0
  138. package/packages/registry/blocks/preview-02/cards/front-door.ts +40 -0
  139. package/packages/registry/blocks/preview-02/cards/index-investing.ts +31 -0
  140. package/packages/registry/blocks/preview-02/cards/kitchen-island.ts +90 -0
  141. package/packages/registry/blocks/preview-02/cards/loading-card.ts +34 -0
  142. package/packages/registry/blocks/preview-02/cards/new-milestone.ts +53 -0
  143. package/packages/registry/blocks/preview-02/cards/notification-settings.ts +126 -0
  144. package/packages/registry/blocks/preview-02/cards/payments.ts +88 -0
  145. package/packages/registry/blocks/preview-02/cards/payout-threshold.ts +92 -0
  146. package/packages/registry/blocks/preview-02/cards/power-usage.ts +84 -0
  147. package/packages/registry/blocks/preview-02/cards/preferences.ts +89 -0
  148. package/packages/registry/blocks/preview-02/cards/qr-connect.ts +54 -0
  149. package/packages/registry/blocks/preview-02/cards/receiving-method.ts +89 -0
  150. package/packages/registry/blocks/preview-02/cards/recent-transactions.ts +101 -0
  151. package/packages/registry/blocks/preview-02/cards/release-catalog.ts +73 -0
  152. package/packages/registry/blocks/preview-02/cards/roller-shades.ts +110 -0
  153. package/packages/registry/blocks/preview-02/cards/savings-progress.ts +68 -0
  154. package/packages/registry/blocks/preview-02/cards/savings-targets.ts +132 -0
  155. package/packages/registry/blocks/preview-02/cards/sidebar-nav.ts +88 -0
  156. package/packages/registry/blocks/preview-02/cards/social-links.ts +57 -0
  157. package/packages/registry/blocks/preview-02/cards/stock-performance.ts +106 -0
  158. package/packages/registry/blocks/preview-02/cards/syncing-state.ts +37 -0
  159. package/packages/registry/blocks/preview-02/cards/transfer-funds.ts +111 -0
  160. package/packages/registry/blocks/preview-02/cards/upcoming-payments.ts +69 -0
  161. package/packages/registry/blocks/preview-02/page.ts +111 -0
  162. package/packages/registry/blocks/preview-03/cards/files-chat.ts +75 -0
  163. package/packages/registry/blocks/preview-03/cards/group-chat.ts +114 -0
  164. package/packages/registry/blocks/preview-03/cards/reasoning-chat.ts +88 -0
  165. package/packages/registry/blocks/preview-03/cards/simple-chat.ts +53 -0
  166. package/packages/registry/blocks/preview-03/components/chat-card.ts +126 -0
  167. package/packages/registry/blocks/preview-03/components/chat-player.ts +174 -0
  168. package/packages/registry/blocks/preview-03/components/part-file.ts +77 -0
  169. package/packages/registry/blocks/preview-03/components/part-reasoning.ts +25 -0
  170. package/packages/registry/blocks/preview-03/components/part-source.ts +48 -0
  171. package/packages/registry/blocks/preview-03/components/part-text.ts +69 -0
  172. package/packages/registry/blocks/preview-03/components/part-tool.ts +71 -0
  173. package/packages/registry/blocks/preview-03/components/prompt-input.ts +86 -0
  174. package/packages/registry/blocks/preview-03/page.ts +39 -0
  175. package/packages/registry/blocks/sidebar-01/components/app-sidebar.ts +113 -0
  176. package/packages/registry/blocks/sidebar-01/components/search-form.ts +33 -0
  177. package/packages/registry/blocks/sidebar-01/components/version-switcher.ts +50 -0
  178. package/packages/registry/blocks/sidebar-01/page.ts +58 -0
  179. package/packages/registry/blocks/sidebar-02/components/app-sidebar.ts +131 -0
  180. package/packages/registry/blocks/sidebar-02/components/search-form.ts +33 -0
  181. package/packages/registry/blocks/sidebar-02/components/version-switcher.ts +50 -0
  182. package/packages/registry/blocks/sidebar-02/page.ts +53 -0
  183. package/packages/registry/blocks/sidebar-03/components/app-sidebar.ts +134 -0
  184. package/packages/registry/blocks/sidebar-03/page.ts +60 -0
  185. package/packages/registry/blocks/sidebar-04/components/app-sidebar.ts +136 -0
  186. package/packages/registry/blocks/sidebar-04/page.ts +58 -0
  187. package/packages/registry/blocks/sidebar-05/components/app-sidebar.ts +147 -0
  188. package/packages/registry/blocks/sidebar-05/components/search-form.ts +33 -0
  189. package/packages/registry/blocks/sidebar-05/page.ts +58 -0
  190. package/packages/registry/blocks/sidebar-06/components/app-sidebar.ts +105 -0
  191. package/packages/registry/blocks/sidebar-06/components/nav-main.ts +56 -0
  192. package/packages/registry/blocks/sidebar-06/components/sidebar-opt-in-form.ts +44 -0
  193. package/packages/registry/blocks/sidebar-06/page.ts +57 -0
  194. package/packages/registry/blocks/sidebar-07/components/app-sidebar.ts +108 -0
  195. package/packages/registry/blocks/sidebar-07/components/nav-main.ts +61 -0
  196. package/packages/registry/blocks/sidebar-07/components/nav-projects.ts +65 -0
  197. package/packages/registry/blocks/sidebar-07/components/nav-user.ts +70 -0
  198. package/packages/registry/blocks/sidebar-07/components/team-switcher.ts +66 -0
  199. package/packages/registry/blocks/sidebar-07/page.ts +59 -0
  200. package/packages/registry/blocks/sidebar-08/components/app-sidebar.ts +122 -0
  201. package/packages/registry/blocks/sidebar-08/components/nav-main.ts +68 -0
  202. package/packages/registry/blocks/sidebar-08/components/nav-projects.ts +65 -0
  203. package/packages/registry/blocks/sidebar-08/components/nav-secondary.ts +40 -0
  204. package/packages/registry/blocks/sidebar-08/components/nav-user.ts +70 -0
  205. package/packages/registry/blocks/sidebar-08/page.ts +59 -0
  206. package/packages/registry/blocks/sidebar-09/components/app-sidebar.ts +213 -0
  207. package/packages/registry/blocks/sidebar-09/components/nav-user.ts +70 -0
  208. package/packages/registry/blocks/sidebar-09/page.ts +52 -0
  209. package/packages/registry/blocks/sidebar-10/components/app-sidebar.ts +125 -0
  210. package/packages/registry/blocks/sidebar-10/components/nav-actions.ts +84 -0
  211. package/packages/registry/blocks/sidebar-10/components/nav-favorites.ts +66 -0
  212. package/packages/registry/blocks/sidebar-10/components/nav-main.ts +37 -0
  213. package/packages/registry/blocks/sidebar-10/components/nav-secondary.ts +43 -0
  214. package/packages/registry/blocks/sidebar-10/components/nav-workspaces.ts +78 -0
  215. package/packages/registry/blocks/sidebar-10/components/team-switcher.ts +63 -0
  216. package/packages/registry/blocks/sidebar-10/page.ts +46 -0
  217. package/packages/registry/blocks/sidebar-11/components/app-sidebar.ts +114 -0
  218. package/packages/registry/blocks/sidebar-11/page.ts +63 -0
  219. package/packages/registry/blocks/sidebar-12/components/app-sidebar.ts +63 -0
  220. package/packages/registry/blocks/sidebar-12/components/calendars.ts +53 -0
  221. package/packages/registry/blocks/sidebar-12/components/date-picker.ts +26 -0
  222. package/packages/registry/blocks/sidebar-12/components/nav-user.ts +70 -0
  223. package/packages/registry/blocks/sidebar-12/page.ts +43 -0
  224. package/packages/registry/blocks/sidebar-13/components/settings-dialog.ts +114 -0
  225. package/packages/registry/blocks/sidebar-13/page.ts +21 -0
  226. package/packages/registry/blocks/sidebar-14/components/app-sidebar.ts +120 -0
  227. package/packages/registry/blocks/sidebar-14/page.ts +55 -0
  228. package/packages/registry/blocks/sidebar-15/components/calendars.ts +53 -0
  229. package/packages/registry/blocks/sidebar-15/components/date-picker.ts +26 -0
  230. package/packages/registry/blocks/sidebar-15/components/nav-favorites.ts +66 -0
  231. package/packages/registry/blocks/sidebar-15/components/nav-main.ts +35 -0
  232. package/packages/registry/blocks/sidebar-15/components/nav-secondary.ts +43 -0
  233. package/packages/registry/blocks/sidebar-15/components/nav-user.ts +70 -0
  234. package/packages/registry/blocks/sidebar-15/components/nav-workspaces.ts +75 -0
  235. package/packages/registry/blocks/sidebar-15/components/sidebar-left.ts +126 -0
  236. package/packages/registry/blocks/sidebar-15/components/sidebar-right.ts +62 -0
  237. package/packages/registry/blocks/sidebar-15/components/team-switcher.ts +63 -0
  238. package/packages/registry/blocks/sidebar-15/page.ts +47 -0
  239. package/packages/registry/blocks/sidebar-16/components/app-sidebar.ts +124 -0
  240. package/packages/registry/blocks/sidebar-16/components/nav-main.ts +67 -0
  241. package/packages/registry/blocks/sidebar-16/components/nav-projects.ts +65 -0
  242. package/packages/registry/blocks/sidebar-16/components/nav-secondary.ts +40 -0
  243. package/packages/registry/blocks/sidebar-16/components/nav-user.ts +70 -0
  244. package/packages/registry/blocks/sidebar-16/components/search-form.ts +27 -0
  245. package/packages/registry/blocks/sidebar-16/components/site-header.ts +42 -0
  246. package/packages/registry/blocks/sidebar-16/page.ts +38 -0
  247. package/packages/registry/blocks/signup-01/components/signup-form.ts +78 -0
  248. package/packages/registry/blocks/signup-01/page.ts +19 -0
  249. package/packages/registry/blocks/signup-02/components/signup-form.ts +78 -0
  250. package/packages/registry/blocks/signup-02/page.ts +36 -0
  251. package/packages/registry/blocks/signup-03/components/signup-form.ts +79 -0
  252. package/packages/registry/blocks/signup-03/page.ts +28 -0
  253. package/packages/registry/blocks/signup-04/components/signup-form.ts +100 -0
  254. package/packages/registry/blocks/signup-04/page.ts +20 -0
  255. package/packages/registry/blocks/signup-05/components/signup-form.ts +75 -0
  256. package/packages/registry/blocks/signup-05/page.ts +20 -0
  257. package/packages/registry/components/accordion.ts +20 -7
  258. package/packages/registry/components/alert-dialog.ts +58 -13
  259. package/packages/registry/components/alert.ts +11 -6
  260. package/packages/registry/components/attachment.ts +119 -0
  261. package/packages/registry/components/avatar.ts +17 -8
  262. package/packages/registry/components/badge.ts +16 -9
  263. package/packages/registry/components/breadcrumb.ts +6 -6
  264. package/packages/registry/components/bubble.ts +95 -0
  265. package/packages/registry/components/button-group.ts +73 -0
  266. package/packages/registry/components/button.ts +35 -25
  267. package/packages/registry/components/calendar.ts +566 -0
  268. package/packages/registry/components/card.ts +8 -8
  269. package/packages/registry/components/carousel.ts +352 -0
  270. package/packages/registry/components/chart-element.ts +547 -0
  271. package/packages/registry/components/chart-geometry.ts +457 -0
  272. package/packages/registry/components/chart.ts +932 -0
  273. package/packages/registry/components/checkbox.ts +22 -84
  274. package/packages/registry/components/code-block.ts +191 -0
  275. package/packages/registry/components/collapsible.ts +5 -2
  276. package/packages/registry/components/combobox.ts +802 -0
  277. package/packages/registry/components/command.ts +618 -0
  278. package/packages/registry/components/context-menu.ts +302 -0
  279. package/packages/registry/components/dialog.ts +156 -45
  280. package/packages/registry/components/direction.ts +43 -0
  281. package/packages/registry/components/drawer.ts +226 -0
  282. package/packages/registry/components/dropdown-menu.ts +262 -83
  283. package/packages/registry/components/empty.ts +8 -8
  284. package/packages/registry/components/field.ts +20 -18
  285. package/packages/registry/components/floating.ts +124 -0
  286. package/packages/registry/components/hover-card.ts +19 -8
  287. package/packages/registry/components/input-group.ts +118 -0
  288. package/packages/registry/components/input-otp.ts +365 -0
  289. package/packages/registry/components/input.ts +3 -3
  290. package/packages/registry/components/item.ts +134 -0
  291. package/packages/registry/components/kbd.ts +2 -2
  292. package/packages/registry/components/label.ts +1 -1
  293. package/packages/registry/components/marker.ts +63 -0
  294. package/packages/registry/components/menubar.ts +388 -0
  295. package/packages/registry/components/message-scroller.ts +470 -0
  296. package/packages/registry/components/message.ts +69 -0
  297. package/packages/registry/components/native-select.ts +5 -5
  298. package/packages/registry/components/navigation-menu.ts +564 -0
  299. package/packages/registry/components/pagination.ts +5 -5
  300. package/packages/registry/components/popover.ts +30 -84
  301. package/packages/registry/components/progress.ts +7 -3
  302. package/packages/registry/components/questionnaire.ts +840 -0
  303. package/packages/registry/components/radio-group.ts +18 -73
  304. package/packages/registry/components/resizable.ts +330 -0
  305. package/packages/registry/components/scroll-area.ts +46 -0
  306. package/packages/registry/components/select.ts +650 -0
  307. package/packages/registry/components/separator.ts +1 -1
  308. package/packages/registry/components/sheet.ts +128 -0
  309. package/packages/registry/components/sidebar.ts +457 -0
  310. package/packages/registry/components/skeleton.ts +1 -1
  311. package/packages/registry/components/slider.ts +333 -0
  312. package/packages/registry/components/sonner.ts +74 -7
  313. package/packages/registry/components/spinner.ts +7 -4
  314. package/packages/registry/components/switch.ts +117 -9
  315. package/packages/registry/components/table.ts +11 -9
  316. package/packages/registry/components/tabs.ts +76 -25
  317. package/packages/registry/components/textarea.ts +1 -1
  318. package/packages/registry/components/toggle-group.ts +30 -11
  319. package/packages/registry/components/toggle.ts +20 -13
  320. package/packages/registry/components/tooltip.ts +68 -7
  321. package/packages/registry/components/trace.ts +75 -0
  322. package/packages/registry/lib/icons-hugeicons.ts +955 -0
  323. package/packages/registry/lib/icons-phosphor.ts +955 -0
  324. package/packages/registry/lib/icons-remixicon.ts +955 -0
  325. package/packages/registry/lib/icons-tabler.ts +955 -0
  326. package/packages/registry/lib/icons.ts +768 -0
  327. package/packages/registry/lib/utils.ts +49 -4
  328. package/packages/registry/registry.json +4056 -72
  329. package/packages/registry/styles/shadcn-tailwind.css +654 -0
  330. package/packages/registry/styles/style-luma.css +1987 -0
  331. package/packages/registry/styles/style-lyra.css +1965 -0
  332. package/packages/registry/styles/style-maia.css +1987 -0
  333. package/packages/registry/styles/style-mira.css +1992 -0
  334. package/packages/registry/styles/style-new-york.css +1597 -0
  335. package/packages/registry/styles/style-nova.css +1990 -0
  336. package/packages/registry/styles/style-rhea.css +1987 -0
  337. package/packages/registry/styles/style-sera.css +1977 -0
  338. package/packages/registry/styles/style-vega.css +1990 -0
  339. package/packages/registry/styles/supplement.json +54 -0
  340. package/packages/registry/styles/tw-animate.css +6 -0
  341. package/packages/registry/themes/base-colors.js +8 -2
  342. package/packages/registry/themes/fonts.js +120 -0
  343. package/packages/registry/themes/index.css +2 -0
  344. package/packages/registry/themes/items.js +61 -0
  345. package/packages/registry/themes/preset.js +302 -0
  346. package/packages/registry/themes/themes.js +1193 -0
  347. package/src/commands/add.js +236 -12
  348. package/src/commands/diff.js +34 -20
  349. package/src/commands/info.js +7 -0
  350. package/src/commands/init.js +125 -8
  351. package/src/commands/list.js +43 -11
  352. package/src/commands/view.js +33 -5
  353. package/src/registry/extract.js +192 -2
  354. package/src/registry/icons.js +31 -0
  355. package/src/registry/local.js +15 -1
  356. package/src/registry/schema.js +13 -0
  357. package/src/registry/style-bake.js +506 -0
  358. package/src/utils/theme.js +110 -21
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The signup-02 form: a heading, the name, email, password and confirmation
3
+ * fields with their helper text, and a GitHub button under an "Or continue
4
+ * with" separator, laid straight on the page with no card. A fragment helper
5
+ * (a function returning an `html` template), so it renders on the server and
6
+ * ships no JavaScript. Ported from shadcn/ui's signup-02.
7
+ *
8
+ * The `<form>` has no `action` yet. Bind a server action from a
9
+ * `'use server'` file (`<form action=${signUp}>`) before you ship it: the
10
+ * framework then supplies `method="post"`, and the no-JS post, the 422
11
+ * re-render with `fieldErrors` / `values`, and the 303 redirect all work.
12
+ * Until it is bound, the form submits as a GET back to the page with the
13
+ * typed values in the URL. The GitHub button is a placeholder for your
14
+ * provider's sign-up link.
15
+ */
16
+ import { html } from '@webjsdev/core';
17
+ import { cn } from '../../../lib/utils.ts';
18
+ import { buttonClass } from '../../../components/button.ts';
19
+ import {
20
+ fieldClass,
21
+ fieldDescriptionClass,
22
+ fieldGroupClass,
23
+ fieldLabelClass,
24
+ fieldSeparatorClass,
25
+ fieldSeparatorContentClass,
26
+ } from '../../../components/field.ts';
27
+ import { inputClass } from '../../../components/input.ts';
28
+
29
+ const GITHUB = 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12';
30
+
31
+ export function signupForm(opts: { class?: string } = {}) {
32
+ return html`
33
+ <form class=${cn('flex flex-col gap-6', opts.class)}>
34
+ <div class=${fieldGroupClass()} data-slot="field-group">
35
+ <div class="flex flex-col items-center gap-1 text-center">
36
+ <h1 class="text-2xl font-bold">Create your account</h1>
37
+ <p class="text-sm text-balance text-muted-foreground">Fill in the form below to create your account</p>
38
+ </div>
39
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
40
+ <label class=${fieldLabelClass()} data-slot="field-label" for="name">Full Name</label>
41
+ <input class=${cn(inputClass(), 'bg-background')} data-slot="input" id="name" name="name" type="text" autocomplete="name" placeholder="John Doe" required>
42
+ </div>
43
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
44
+ <label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
45
+ <input class=${cn(inputClass(), 'bg-background')} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" aria-describedby="email-description" required>
46
+ <p class=${fieldDescriptionClass()} data-slot="field-description" id="email-description">
47
+ We'll use this to contact you. We will not share your email with anyone else.
48
+ </p>
49
+ </div>
50
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
51
+ <label class=${fieldLabelClass()} data-slot="field-label" for="password">Password</label>
52
+ <input class=${cn(inputClass(), 'bg-background')} data-slot="input" id="password" name="password" type="password" autocomplete="new-password" minlength="8" aria-describedby="password-description" required>
53
+ <p class=${fieldDescriptionClass()} data-slot="field-description" id="password-description">Must be at least 8 characters long.</p>
54
+ </div>
55
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
56
+ <label class=${fieldLabelClass()} data-slot="field-label" for="confirm-password">Confirm Password</label>
57
+ <input class=${cn(inputClass(), 'bg-background')} data-slot="input" id="confirm-password" name="confirmPassword" type="password" autocomplete="new-password" aria-describedby="confirm-password-description" required>
58
+ <p class=${fieldDescriptionClass()} data-slot="field-description" id="confirm-password-description">Please confirm your password.</p>
59
+ </div>
60
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
61
+ <button class=${buttonClass()} data-slot="button" type="submit">Create Account</button>
62
+ </div>
63
+ <div class=${fieldSeparatorClass()} data-slot="field-separator" role="none">
64
+ <span class=${fieldSeparatorContentClass()} data-slot="field-separator-content">Or continue with</span>
65
+ </div>
66
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
67
+ <button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
68
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${GITHUB} fill="currentColor"></path></svg>
69
+ Sign up with GitHub
70
+ </button>
71
+ <p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
72
+ Already have an account? <a href="/login">Sign in</a>
73
+ </p>
74
+ </div>
75
+ </div>
76
+ </form>
77
+ `;
78
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The signup-02 block's page: a two column signup page, the form on one side
3
+ * and a cover image on the other (hidden below `lg`).
4
+ *
5
+ * Installed by `npx @webjsdev/ui add signup-02` at `app/signup/page.ts`,
6
+ * with the cover at `public/placeholder.svg`. Swap in your own image and
7
+ * brand. Ported from shadcn/ui's signup-02.
8
+ */
9
+ import { html } from '@webjsdev/core';
10
+ import type { Metadata } from '@webjsdev/core';
11
+ import { signupForm } from './components/signup-form.ts';
12
+
13
+ export const metadata: Metadata = { title: 'Sign up' };
14
+
15
+ export default function SignupPage() {
16
+ return html`
17
+ <div class="grid min-h-svh lg:grid-cols-2">
18
+ <div class="flex flex-col gap-4 p-6 md:p-10">
19
+ <div class="flex justify-center gap-2 md:justify-start">
20
+ <a href="/" class="flex items-center gap-2 font-medium">
21
+ <div class="flex size-6 items-center justify-center rounded-md bg-primary text-primary-foreground">
22
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4" aria-hidden="true"><path d="M7 2h10"></path><path d="M5 6h14"></path><rect width="18" height="12" x="3" y="10" rx="2"></rect></svg>
23
+ </div>
24
+ Acme Inc.
25
+ </a>
26
+ </div>
27
+ <div class="flex flex-1 items-center justify-center">
28
+ <div class="w-full max-w-xs">${signupForm()}</div>
29
+ </div>
30
+ </div>
31
+ <div class="relative hidden bg-muted lg:block">
32
+ <img src="/public/placeholder.svg" alt="" class="absolute inset-0 h-full w-full object-cover dark:brightness-[0.2] dark:grayscale">
33
+ </div>
34
+ </div>
35
+ `;
36
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The signup-03 form: a centred card asking for a name, an email, and a
3
+ * password beside its confirmation, and the terms line under the card. A
4
+ * fragment helper (a function returning an `html` template), so it renders
5
+ * on the server and ships no JavaScript. Ported from shadcn/ui's signup-03.
6
+ *
7
+ * The `<form>` has no `action` yet. Bind a server action from a
8
+ * `'use server'` file (`<form action=${signUp}>`) before you ship it: the
9
+ * framework then supplies `method="post"`, and the no-JS post, the 422
10
+ * re-render with `fieldErrors` / `values`, and the 303 redirect all work.
11
+ * Until it is bound, the form submits as a GET back to the page with the
12
+ * typed values in the URL.
13
+ */
14
+ import { html } from '@webjsdev/core';
15
+ import { cn } from '../../../lib/utils.ts';
16
+ import { buttonClass } from '../../../components/button.ts';
17
+ import {
18
+ cardClass,
19
+ cardContentClass,
20
+ cardDescriptionClass,
21
+ cardHeaderClass,
22
+ cardTitleClass,
23
+ } from '../../../components/card.ts';
24
+ import {
25
+ fieldClass,
26
+ fieldDescriptionClass,
27
+ fieldGroupClass,
28
+ fieldLabelClass,
29
+ } from '../../../components/field.ts';
30
+ import { inputClass } from '../../../components/input.ts';
31
+
32
+ export function signupForm(opts: { class?: string } = {}) {
33
+ return html`
34
+ <div class=${cn('flex flex-col gap-6', opts.class)}>
35
+ <div class=${cardClass()} data-slot="card" data-size="default">
36
+ <div class=${cn(cardHeaderClass(), 'text-center')} data-slot="card-header">
37
+ <h1 class=${cn(cardTitleClass(), 'text-xl')} data-slot="card-title">Create your account</h1>
38
+ <p class=${cardDescriptionClass()} data-slot="card-description">Enter your email below to create your account</p>
39
+ </div>
40
+ <div class=${cardContentClass()} data-slot="card-content">
41
+ <form>
42
+ <div class=${fieldGroupClass()} data-slot="field-group">
43
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
44
+ <label class=${fieldLabelClass()} data-slot="field-label" for="name">Full Name</label>
45
+ <input class=${inputClass()} data-slot="input" id="name" name="name" type="text" autocomplete="name" placeholder="John Doe" required>
46
+ </div>
47
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
48
+ <label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
49
+ <input class=${inputClass()} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" required>
50
+ </div>
51
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
52
+ <div class=${cn(fieldClass(), 'grid grid-cols-2 gap-4')} data-slot="field" data-orientation="vertical">
53
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
54
+ <label class=${fieldLabelClass()} data-slot="field-label" for="password">Password</label>
55
+ <input class=${inputClass()} data-slot="input" id="password" name="password" type="password" autocomplete="new-password" minlength="8" aria-describedby="password-description" required>
56
+ </div>
57
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
58
+ <label class=${fieldLabelClass()} data-slot="field-label" for="confirm-password">Confirm Password</label>
59
+ <input class=${inputClass()} data-slot="input" id="confirm-password" name="confirmPassword" type="password" autocomplete="new-password" required>
60
+ </div>
61
+ </div>
62
+ <p class=${fieldDescriptionClass()} data-slot="field-description" id="password-description">Must be at least 8 characters long.</p>
63
+ </div>
64
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
65
+ <button class=${buttonClass()} data-slot="button" type="submit">Create Account</button>
66
+ <p class=${cn(fieldDescriptionClass(), 'text-center')} data-slot="field-description">
67
+ Already have an account? <a href="/login">Sign in</a>
68
+ </p>
69
+ </div>
70
+ </div>
71
+ </form>
72
+ </div>
73
+ </div>
74
+ <p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
75
+ By clicking continue, you agree to our <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>.
76
+ </p>
77
+ </div>
78
+ `;
79
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The signup-03 block's page: the brand above a signup card, on a muted
3
+ * background.
4
+ *
5
+ * Installed by `npx @webjsdev/ui add signup-03` at `app/signup/page.ts`.
6
+ * Ported from shadcn/ui's signup-03.
7
+ */
8
+ import { html } from '@webjsdev/core';
9
+ import type { Metadata } from '@webjsdev/core';
10
+ import { signupForm } from './components/signup-form.ts';
11
+
12
+ export const metadata: Metadata = { title: 'Sign up' };
13
+
14
+ export default function SignupPage() {
15
+ return html`
16
+ <div class="flex min-h-svh flex-col items-center justify-center gap-6 bg-muted p-6 md:p-10">
17
+ <div class="flex w-full max-w-sm flex-col gap-6">
18
+ <a href="/" class="flex items-center gap-2 self-center font-medium">
19
+ <div class="flex size-6 items-center justify-center rounded-md bg-primary text-primary-foreground">
20
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4" aria-hidden="true"><path d="M7 2h10"></path><path d="M5 6h14"></path><rect width="18" height="12" x="3" y="10" rx="2"></rect></svg>
21
+ </div>
22
+ Acme Inc.
23
+ </a>
24
+ ${signupForm()}
25
+ </div>
26
+ </div>
27
+ `;
28
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The signup-04 form: a two column card, the email and password form with
3
+ * icon-only Apple, Google and Meta buttons on one side and an image on the
4
+ * other (hidden below `md`), and the terms line under the card. A fragment
5
+ * helper (a function returning an `html` template), so it renders on the
6
+ * server and ships no JavaScript. Ported from shadcn/ui's signup-04.
7
+ *
8
+ * The `<form>` has no `action` yet. Bind a server action from a
9
+ * `'use server'` file (`<form action=${signUp}>`) before you ship it: the
10
+ * framework then supplies `method="post"`, and the no-JS post, the 422
11
+ * re-render with `fieldErrors` / `values`, and the 303 redirect all work.
12
+ * Until it is bound, the form submits as a GET back to the page with the
13
+ * typed values in the URL. The provider buttons are placeholders for your
14
+ * providers' sign-up links.
15
+ */
16
+ import { html } from '@webjsdev/core';
17
+ import { cn } from '../../../lib/utils.ts';
18
+ import { buttonClass } from '../../../components/button.ts';
19
+ import { cardClass, cardContentClass } from '../../../components/card.ts';
20
+ import {
21
+ fieldClass,
22
+ fieldDescriptionClass,
23
+ fieldGroupClass,
24
+ fieldLabelClass,
25
+ fieldSeparatorClass,
26
+ fieldSeparatorContentClass,
27
+ } from '../../../components/field.ts';
28
+ import { inputClass } from '../../../components/input.ts';
29
+
30
+ const APPLE = 'M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701';
31
+ const GOOGLE = 'M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z';
32
+ const META = 'M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z';
33
+
34
+ export function signupForm(opts: { class?: string } = {}) {
35
+ return html`
36
+ <div class=${cn('flex flex-col gap-6', opts.class)}>
37
+ <div class=${cn(cardClass(), 'overflow-hidden p-0')} data-slot="card" data-size="default">
38
+ <div class=${cn(cardContentClass(), 'grid p-0 md:grid-cols-2')} data-slot="card-content">
39
+ <form class="p-6 md:p-8">
40
+ <div class=${fieldGroupClass()} data-slot="field-group">
41
+ <div class="flex flex-col items-center gap-2 text-center">
42
+ <h1 class="text-2xl font-bold">Create your account</h1>
43
+ <p class="text-sm text-balance text-muted-foreground">Enter your email below to create your account</p>
44
+ </div>
45
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
46
+ <label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
47
+ <input class=${inputClass()} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" aria-describedby="email-description" required>
48
+ <p class=${fieldDescriptionClass()} data-slot="field-description" id="email-description">
49
+ We'll use this to contact you. We will not share your email with anyone else.
50
+ </p>
51
+ </div>
52
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
53
+ <div class=${cn(fieldClass(), 'grid grid-cols-2 gap-4')} data-slot="field" data-orientation="vertical">
54
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
55
+ <label class=${fieldLabelClass()} data-slot="field-label" for="password">Password</label>
56
+ <input class=${inputClass()} data-slot="input" id="password" name="password" type="password" autocomplete="new-password" minlength="8" aria-describedby="password-description" required>
57
+ </div>
58
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
59
+ <label class=${fieldLabelClass()} data-slot="field-label" for="confirm-password">Confirm Password</label>
60
+ <input class=${inputClass()} data-slot="input" id="confirm-password" name="confirmPassword" type="password" autocomplete="new-password" required>
61
+ </div>
62
+ </div>
63
+ <p class=${fieldDescriptionClass()} data-slot="field-description" id="password-description">Must be at least 8 characters long.</p>
64
+ </div>
65
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
66
+ <button class=${buttonClass()} data-slot="button" type="submit">Create Account</button>
67
+ </div>
68
+ <div class=${cn(fieldSeparatorClass(), '*:data-[slot=field-separator-content]:bg-card')} data-slot="field-separator" role="none">
69
+ <span class=${fieldSeparatorContentClass()} data-slot="field-separator-content">Or continue with</span>
70
+ </div>
71
+ <div class=${cn(fieldClass(), 'grid grid-cols-3 gap-4')} data-slot="field" data-orientation="vertical">
72
+ <button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
73
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${APPLE} fill="currentColor"></path></svg>
74
+ <span class="sr-only">Sign up with Apple</span>
75
+ </button>
76
+ <button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
77
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${GOOGLE} fill="currentColor"></path></svg>
78
+ <span class="sr-only">Sign up with Google</span>
79
+ </button>
80
+ <button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
81
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${META} fill="currentColor"></path></svg>
82
+ <span class="sr-only">Sign up with Meta</span>
83
+ </button>
84
+ </div>
85
+ <p class=${cn(fieldDescriptionClass(), 'text-center')} data-slot="field-description">
86
+ Already have an account? <a href="/login">Sign in</a>
87
+ </p>
88
+ </div>
89
+ </form>
90
+ <div class="relative hidden bg-muted md:block">
91
+ <img src="/public/placeholder.svg" alt="" class="absolute inset-0 h-full w-full object-cover dark:brightness-[0.2] dark:grayscale">
92
+ </div>
93
+ </div>
94
+ </div>
95
+ <p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
96
+ By clicking continue, you agree to our <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>.
97
+ </p>
98
+ </div>
99
+ `;
100
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The signup-04 block's page: a wide signup card with the form beside an
3
+ * image, on a muted background.
4
+ *
5
+ * Installed by `npx @webjsdev/ui add signup-04` at `app/signup/page.ts`, with
6
+ * the image at `public/placeholder.svg`. Ported from shadcn/ui's signup-04.
7
+ */
8
+ import { html } from '@webjsdev/core';
9
+ import type { Metadata } from '@webjsdev/core';
10
+ import { signupForm } from './components/signup-form.ts';
11
+
12
+ export const metadata: Metadata = { title: 'Sign up' };
13
+
14
+ export default function SignupPage() {
15
+ return html`
16
+ <div class="flex min-h-svh flex-col items-center justify-center bg-muted p-6 md:p-10">
17
+ <div class="w-full max-w-sm md:max-w-4xl">${signupForm()}</div>
18
+ </div>
19
+ `;
20
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * The signup-05 form: the brand and a sign-in link above an email-only form,
3
+ * Apple and Google buttons under an "Or" separator, and the terms line. A
4
+ * fragment helper (a function returning an `html` template), so it renders
5
+ * on the server and ships no JavaScript. Ported from shadcn/ui's signup-05.
6
+ *
7
+ * The `<form>` has no `action` yet. Bind a server action from a
8
+ * `'use server'` file (`<form action=${signUp}>`) before you ship it: the
9
+ * framework then supplies `method="post"`, and the no-JS post, the 422
10
+ * re-render with `fieldErrors` / `values`, and the 303 redirect all work.
11
+ * Until it is bound, the form submits as a GET back to the page with the
12
+ * typed email in the URL. The provider buttons are placeholders for your
13
+ * providers' sign-up links.
14
+ */
15
+ import { html } from '@webjsdev/core';
16
+ import { cn } from '../../../lib/utils.ts';
17
+ import { buttonClass } from '../../../components/button.ts';
18
+ import {
19
+ fieldClass,
20
+ fieldDescriptionClass,
21
+ fieldGroupClass,
22
+ fieldLabelClass,
23
+ fieldSeparatorClass,
24
+ fieldSeparatorContentClass,
25
+ } from '../../../components/field.ts';
26
+ import { inputClass } from '../../../components/input.ts';
27
+
28
+ const APPLE = 'M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701';
29
+ const GOOGLE = 'M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z';
30
+
31
+ export function signupForm(opts: { class?: string } = {}) {
32
+ return html`
33
+ <div class=${cn('flex flex-col gap-6', opts.class)}>
34
+ <form>
35
+ <div class=${fieldGroupClass()} data-slot="field-group">
36
+ <div class="flex flex-col items-center gap-2 text-center">
37
+ <a href="/" class="flex flex-col items-center gap-2 font-medium">
38
+ <div class="flex size-8 items-center justify-center rounded-md">
39
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6" aria-hidden="true"><path d="M7 2h10"></path><path d="M5 6h14"></path><rect width="18" height="12" x="3" y="10" rx="2"></rect></svg>
40
+ </div>
41
+ <span class="sr-only">Acme Inc.</span>
42
+ </a>
43
+ <h1 class="text-xl font-bold">Welcome to Acme Inc.</h1>
44
+ <p class=${fieldDescriptionClass()} data-slot="field-description">
45
+ Already have an account? <a href="/login">Sign in</a>
46
+ </p>
47
+ </div>
48
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
49
+ <label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
50
+ <input class=${inputClass()} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" required>
51
+ </div>
52
+ <div class=${fieldClass()} data-slot="field" data-orientation="vertical">
53
+ <button class=${buttonClass()} data-slot="button" type="submit">Create Account</button>
54
+ </div>
55
+ <div class=${fieldSeparatorClass()} data-slot="field-separator" role="none">
56
+ <span class=${fieldSeparatorContentClass()} data-slot="field-separator-content">Or</span>
57
+ </div>
58
+ <div class=${cn(fieldClass(), 'grid gap-4 sm:grid-cols-2')} data-slot="field" data-orientation="vertical">
59
+ <button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
60
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${APPLE} fill="currentColor"></path></svg>
61
+ Continue with Apple
62
+ </button>
63
+ <button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
64
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${GOOGLE} fill="currentColor"></path></svg>
65
+ Continue with Google
66
+ </button>
67
+ </div>
68
+ </div>
69
+ </form>
70
+ <p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
71
+ By clicking continue, you agree to our <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>.
72
+ </p>
73
+ </div>
74
+ `;
75
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The signup-05 block's page: a simple signup form with social providers,
3
+ * centred on the page.
4
+ *
5
+ * Installed by `npx @webjsdev/ui add signup-05` at `app/signup/page.ts`.
6
+ * Ported from shadcn/ui's signup-05.
7
+ */
8
+ import { html } from '@webjsdev/core';
9
+ import type { Metadata } from '@webjsdev/core';
10
+ import { signupForm } from './components/signup-form.ts';
11
+
12
+ export const metadata: Metadata = { title: 'Sign up' };
13
+
14
+ export default function SignupPage() {
15
+ return html`
16
+ <div class="flex min-h-svh flex-col items-center justify-center gap-6 bg-background p-6 md:p-10">
17
+ <div class="w-full max-w-sm">${signupForm()}</div>
18
+ </div>
19
+ `;
20
+ }
@@ -13,7 +13,8 @@
13
13
  * <Accordion type="multiple"> → same, omit `name`
14
14
  * <AccordionItem> → <details class=${accordionItemClass()}>
15
15
  * <AccordionTrigger> → <summary class=${accordionTriggerClass()}>
16
- * <AccordionContent> → <div class=${accordionContentClass()}>
16
+ * <AccordionContent> → <div class=${accordionContentClass()}> around
17
+ * <div class=${accordionContentInnerClass()}>
17
18
  *
18
19
  * Initial state: add `open` on the <details> that should render expanded
19
20
  * on first paint. Programmatic toggling: `el.open = true | false`.
@@ -50,28 +51,32 @@
50
51
  * <span>Is it accessible?</span>
51
52
  * <svg class="size-4 shrink-0 transition-transform group-open:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg>
52
53
  * </summary>
53
- * <div class=${accordionContentClass()}>Yes, it uses a native disclosure widget.</div>
54
+ * <div class=${accordionContentClass()}>
55
+ * <div class=${accordionContentInnerClass()}>Yes, it uses a native disclosure widget.</div>
56
+ * </div>
54
57
  * </details>
55
58
  * <details name="faq" class=${accordionItemClass()}>
56
59
  * <summary class=${accordionTriggerClass()}>
57
60
  * <span>Is it styled?</span>
58
61
  * <svg class="size-4 shrink-0 transition-transform group-open:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg>
59
62
  * </summary>
60
- * <div class=${accordionContentClass()}>Yes, with the shadcn design tokens.</div>
63
+ * <div class=${accordionContentClass()}>
64
+ * <div class=${accordionContentInnerClass()}>Yes, with the kit's design tokens.</div>
65
+ * </div>
61
66
  * </details>
62
67
  * </div>
63
68
  * ```
64
69
  */
65
70
 
66
71
  /** Root wrapper. Holds the column-of-items rhythm; no display: rules. */
67
- export const accordionClass = (): string => 'w-full';
72
+ export const accordionClass = (): string => 'cn-accordion flex w-full flex-col';
68
73
 
69
74
  /**
70
75
  * Item: each <details>. The `group` utility lets the trigger's chevron
71
76
  * rotate on open via `group-open:rotate-180`. `last:border-b-0` cleans
72
77
  * the trailing edge.
73
78
  */
74
- export const accordionItemClass = (): string => 'group border-b last:border-b-0';
79
+ export const accordionItemClass = (): string => 'cn-accordion-item group';
75
80
 
76
81
  /**
77
82
  * Trigger: applied to <summary>. Hides the native disclosure triangle so
@@ -85,7 +90,7 @@ export const accordionItemClass = (): string => 'group border-b last:border-b-0'
85
90
  * prop combines both; native HTML has no `disabled` on <details>.
86
91
  */
87
92
  export const accordionTriggerClass = (opts: { disabled?: boolean } = {}): string => {
88
- const base = 'flex w-full cursor-pointer list-none items-center justify-between gap-4 py-4 text-left text-sm font-medium outline-none transition-all hover:underline focus-visible:ring-2 focus-visible:ring-ring/50 marker:hidden [&::-webkit-details-marker]:hidden';
93
+ const base = 'cn-accordion-trigger group/accordion-trigger relative flex justify-between outline-none transition-all disabled:pointer-events-none disabled:opacity-50';
89
94
  if (opts.disabled) return `${base} pointer-events-none cursor-not-allowed opacity-50`;
90
95
  return base;
91
96
  };
@@ -94,4 +99,12 @@ export const accordionTriggerClass = (opts: { disabled?: boolean } = {}): string
94
99
  * Content: <details> hides this entirely when not [open], so all we add
95
100
  * is the typography rhythm matching shadcn (bottom padding, small text).
96
101
  */
97
- export const accordionContentClass = (): string => 'pb-4 text-sm';
102
+ export const accordionContentClass = (): string => 'cn-accordion-content overflow-hidden';
103
+
104
+ /**
105
+ * Content inner: the wrapper shadcn's AccordionContent renders inside the
106
+ * content, around what you write. The styles put the content's padding here,
107
+ * and it underlines links and spaces paragraphs.
108
+ */
109
+ export const accordionContentInnerClass = (): string =>
110
+ 'cn-accordion-content-inner h-(--radix-accordion-content-height) [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4';