@webjsdev/ui 0.3.16 → 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 +71 -10
  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 +88 -0
  284. package/packages/registry/components/field.ts +165 -0
  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 +66 -0
  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 +4092 -60
  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,89 @@
1
+ /**
2
+ * The preview-02 Receiving Method card: the payout account holder, a choice
3
+ * between bank transfer and PayPal, and the account number. A fragment
4
+ * helper. Installed by `npx @webjsdev/ui add preview-02` at
5
+ * `components/preview-02/receiving-method.ts`. Ported from shadcn/ui's
6
+ * preview-02.
7
+ *
8
+ * The `<form>` has no `action` yet. Bind a server action from a
9
+ * `'use server'` file (`<form action=${savePayoutSettings}>`) and enable the
10
+ * submit button once the form is valid.
11
+ */
12
+ import { html } from '@webjsdev/core';
13
+ import { buttonClass } from '../../../components/button.ts';
14
+ import {
15
+ cardActionClass,
16
+ cardClass,
17
+ cardContentClass,
18
+ cardDescriptionClass,
19
+ cardFooterClass,
20
+ cardHeaderClass,
21
+ cardTitleClass,
22
+ } from '../../../components/card.ts';
23
+ import {
24
+ fieldClass,
25
+ fieldContentClass,
26
+ fieldDescriptionClass,
27
+ fieldGroupClass,
28
+ fieldLabelClass,
29
+ fieldLegendClass,
30
+ fieldSetClass,
31
+ fieldTitleClass,
32
+ } from '../../../components/field.ts';
33
+ import { inputClass } from '../../../components/input.ts';
34
+ import { radioClass, radioGroupClass } from '../../../components/radio-group.ts';
35
+ import { cn } from '../../../lib/utils.ts';
36
+ import { XIcon } from '../../../lib/icons.ts';
37
+
38
+ const METHODS = [
39
+ { value: 'bank', id: 'method-bank', title: 'Bank Transfer', description: 'SWIFT / IBAN', descriptionClass: '' },
40
+ { value: 'paypal', id: 'method-paypal', title: 'PayPal', description: 'Instant Payout', descriptionClass: 'line-clamp-1' },
41
+ ];
42
+
43
+ export function receivingMethod() {
44
+ return html`
45
+ <form data-slot="card" data-size="default" class=${cardClass()}>
46
+ <div data-slot="card-header" class=${cardHeaderClass()}>
47
+ <div data-slot="card-description" class=${cardDescriptionClass()}>Payout Preferences</div>
48
+ <div data-slot="card-title" class=${cardTitleClass()}>Receiving Method</div>
49
+ <div data-slot="card-action" class=${cardActionClass()}>
50
+ <button type="button" data-slot="button" data-variant="ghost" data-size="icon-sm" class=${cn(buttonClass({ variant: 'ghost', size: 'icon-sm' }), 'bg-muted')}>
51
+ ${XIcon()}
52
+ <span class="sr-only">Close</span>
53
+ </button>
54
+ </div>
55
+ </div>
56
+ <div data-slot="card-content" class=${cardContentClass()}>
57
+ <div data-slot="field-group" class=${fieldGroupClass()}>
58
+ <div role="group" data-slot="field" data-orientation="vertical" class=${fieldClass()}>
59
+ <label data-slot="field-label" for="account-holder" class=${fieldLabelClass()}>Account Holder Name</label>
60
+ <input data-slot="input" id="account-holder" name="account-holder" value="Synthetic Horizons Music LLC" class=${inputClass()}>
61
+ </div>
62
+ <fieldset data-slot="field-set" class=${fieldSetClass()}>
63
+ <legend data-slot="field-legend" data-variant="label" class=${fieldLegendClass({ variant: 'label' })}>Receiving Method</legend>
64
+ <div role="radiogroup" aria-label="Receiving method" data-slot="radio-group" class=${cn(radioGroupClass(), 'grid grid-cols-1 items-start gap-3 md:grid-cols-2 style-sera:grid-cols-1')}>
65
+ ${METHODS.map((m) => html`
66
+ <label data-slot="field-label" for=${m.id} class=${fieldLabelClass()}>
67
+ <div role="group" data-slot="field" data-orientation="horizontal" class=${cn(fieldClass({ orientation: 'horizontal' }), 'pb-2.5')}>
68
+ <input type="radio" data-slot="radio" name="method" value=${m.value} id=${m.id} ?checked=${m.value === 'bank'} class=${radioClass()}>
69
+ <div data-slot="field-content" class=${fieldContentClass()}>
70
+ <div data-slot="field-label" class=${fieldTitleClass()}>${m.title}</div>
71
+ <p data-slot="field-description" class=${cn(fieldDescriptionClass(), m.descriptionClass)}>${m.description}</p>
72
+ </div>
73
+ </div>
74
+ </label>
75
+ `)}
76
+ </div>
77
+ </fieldset>
78
+ <div role="group" data-slot="field" data-orientation="vertical" class=${fieldClass()}>
79
+ <label data-slot="field-label" for="iban" class=${fieldLabelClass()}>IBAN / Account Number</label>
80
+ <input data-slot="input" id="iban" name="iban" placeholder="DE89 3704 0044 ...." class=${inputClass()}>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ <div data-slot="card-footer" class=${cardFooterClass()}>
85
+ <button type="submit" data-slot="button" data-variant="default" data-size="default" disabled class=${cn(buttonClass(), 'w-full')}>Save Payout Settings</button>
86
+ </div>
87
+ </form>
88
+ `;
89
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The preview-02 "Recent Transactions" card: a table of the latest account
3
+ * activity, each row with an actions menu. A fragment helper; the menus are
4
+ * the kit's `<ui-dropdown-menu>`. Installed at
5
+ * `components/preview-02/recent-transactions.ts`. Ported from shadcn/ui's
6
+ * preview-02.
7
+ *
8
+ * The transactions are sample data. Replace them with your own and make each
9
+ * menu item a link or a form posting to the matching action.
10
+ */
11
+ import { html } from '@webjsdev/core';
12
+ import type { TemplateResult } from '@webjsdev/core';
13
+ import { cn } from '../../../lib/utils.ts';
14
+ import { buttonClass } from '../../../components/button.ts';
15
+ import {
16
+ cardActionClass,
17
+ cardClass,
18
+ cardContentClass,
19
+ cardDescriptionClass,
20
+ cardHeaderClass,
21
+ cardTitleClass,
22
+ } from '../../../components/card.ts';
23
+ import {
24
+ tableBodyClass,
25
+ tableCellClass,
26
+ tableClass,
27
+ tableContainerClass,
28
+ tableRowClass,
29
+ } from '../../../components/table.ts';
30
+ import '../../../components/dropdown-menu.ts';
31
+ import { CarIcon, CoffeeIcon, MoreHorizontalIcon, ShoppingCartIcon, TvIcon, WalletIcon } from '../../../lib/icons.ts';
32
+
33
+ interface Transaction {
34
+ icon: (cls?: string) => TemplateResult;
35
+ name: string;
36
+ category: string;
37
+ date: string;
38
+ amount: string;
39
+ income?: boolean;
40
+ }
41
+
42
+ const TRANSACTIONS: Transaction[] = [
43
+ { icon: CoffeeIcon, name: 'Blue Bottle Coffee', category: 'Food & Drink', date: 'Today, 10:24 AM', amount: '-$6.50' },
44
+ { icon: ShoppingCartIcon, name: 'Whole Foods Market', category: 'Groceries', date: 'Yesterday', amount: '-$142.30' },
45
+ { icon: WalletIcon, name: 'Stripe Payout', category: 'Income', date: 'Oct 12', amount: '+$4,200.00', income: true },
46
+ { icon: CarIcon, name: 'Uber Technologies', category: 'Transport', date: 'Oct 11', amount: '-$24.10' },
47
+ { icon: TvIcon, name: 'Netflix Subscription', category: 'Entertainment', date: 'Oct 10', amount: '-$19.99' },
48
+ ];
49
+
50
+ export function recentTransactions() {
51
+ return html`
52
+ <div data-slot="card" data-size="default" class=${cardClass()}>
53
+ <div data-slot="card-header" class=${cardHeaderClass()}>
54
+ <div data-slot="card-title" class=${cardTitleClass()}>Recent Transactions</div>
55
+ <div data-slot="card-description" class=${cardDescriptionClass()}>Your latest account activity.</div>
56
+ <div data-slot="card-action" class=${cardActionClass()}>
57
+ <a href="#" data-slot="button" data-variant="outline" data-size="sm" class=${buttonClass({ variant: 'outline', size: 'sm' })}>View All</a>
58
+ </div>
59
+ </div>
60
+ <div data-slot="card-content" class=${cardContentClass()}>
61
+ <div data-slot="table-container" class=${tableContainerClass()}>
62
+ <table data-slot="table" class=${tableClass()}>
63
+ <tbody data-slot="table-body" class=${tableBodyClass()}>
64
+ ${TRANSACTIONS.map((t) => html`
65
+ <tr data-slot="table-row" class=${tableRowClass()}>
66
+ <td data-slot="table-cell" class=${cn(tableCellClass(), 'w-10')}>
67
+ <div class="flex size-10 items-center justify-center rounded-lg bg-muted">${t.icon('size-4 shrink-0')}</div>
68
+ </td>
69
+ <td data-slot="table-cell" class=${tableCellClass()}>
70
+ <div class="flex flex-col">
71
+ <span class="font-medium">${t.name}</span>
72
+ <span class="text-sm text-muted-foreground">${t.category}</span>
73
+ </div>
74
+ </td>
75
+ <td data-slot="table-cell" class=${cn(tableCellClass(), 'text-sm text-muted-foreground')}>${t.date}</td>
76
+ <td data-slot="table-cell" class=${cn(tableCellClass(), 'text-right')}>
77
+ <span class=${cn('text-sm font-semibold tabular-nums', t.income && 'text-emerald-500')}>${t.amount}</span>
78
+ </td>
79
+ <td data-slot="table-cell" class=${cn(tableCellClass(), 'w-8')}>
80
+ <ui-dropdown-menu>
81
+ <ui-dropdown-menu-trigger>
82
+ <button type="button" data-slot="button" data-variant="ghost" data-size="icon-sm" aria-label=${`Actions for ${t.name}`} class=${buttonClass({ variant: 'ghost', size: 'icon-sm' })}>${MoreHorizontalIcon()}</button>
83
+ </ui-dropdown-menu-trigger>
84
+ <ui-dropdown-menu-content align="end">
85
+ <ui-dropdown-menu-item>View details</ui-dropdown-menu-item>
86
+ <ui-dropdown-menu-item>Add note</ui-dropdown-menu-item>
87
+ <ui-dropdown-menu-item>Categorize</ui-dropdown-menu-item>
88
+ <ui-dropdown-menu-separator></ui-dropdown-menu-separator>
89
+ <ui-dropdown-menu-item>Dispute</ui-dropdown-menu-item>
90
+ </ui-dropdown-menu-content>
91
+ </ui-dropdown-menu>
92
+ </td>
93
+ </tr>
94
+ `)}
95
+ </tbody>
96
+ </table>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ `;
101
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The preview-02 holdings catalog card: a search field and an asset-type
3
+ * filter over a list of holdings. A fragment helper. Installed by
4
+ * `npx @webjsdev/ui add preview-02` at `components/preview-02/release-catalog.ts`.
5
+ * Ported from shadcn/ui's preview-02.
6
+ *
7
+ * The search field and the filter show their initial state. Make the search a
8
+ * GET form to your holdings route and filter the list on the server.
9
+ */
10
+ import { html } from '@webjsdev/core';
11
+ import { badgeClass } from '../../../components/badge.ts';
12
+ import { cardClass, cardContentClass, cardHeaderClass } from '../../../components/card.ts';
13
+ import { inputGroupAddonClass, inputGroupClass, inputGroupInputClass } from '../../../components/input-group.ts';
14
+ import {
15
+ itemClass,
16
+ itemContentClass,
17
+ itemDescriptionClass,
18
+ itemGroupClass,
19
+ itemMediaClass,
20
+ itemTitleClass,
21
+ } from '../../../components/item.ts';
22
+ import { cn } from '../../../lib/utils.ts';
23
+ import '../../../components/toggle-group.ts';
24
+ import { SearchIcon } from '../../../lib/icons.ts';
25
+
26
+ const HOLDINGS = [
27
+ { ticker: 'VOO', name: 'Vanguard S&P 500 ETF', type: 'ETF', added: 'Jan 2021', shares: '112', value: '$48,230.40' },
28
+ { ticker: 'VIG', name: 'Vanguard Dividend Appreciation', type: 'ETF', added: 'Mar 2022', shares: '450', value: '$26,033.79' },
29
+ { ticker: 'AAPL', name: 'Apple Inc.', type: 'Stock', added: 'Nov 2020', shares: '85', value: '$18,488.90' },
30
+ { ticker: 'O', name: 'Realty Income Corp', type: 'REIT', added: 'Jun 2023', shares: '320', value: '$15,136.59' },
31
+ ];
32
+
33
+ export function releaseCatalog() {
34
+ return html`
35
+ <div data-slot="card" data-size="default" class=${cardClass()}>
36
+ <div data-slot="card-header" class=${cardHeaderClass()}>
37
+ <div class="flex items-center justify-between gap-3">
38
+ <div data-slot="input-group" role="group" class=${cn(inputGroupClass(), 'max-w-sm')}>
39
+ <input data-slot="input-group-control" id="release-catalog-search" placeholder="Search holdings or tickers..." aria-label="Search holdings or tickers" class=${inputGroupInputClass()}>
40
+ <label data-slot="input-group-addon" data-align="inline-start" for="release-catalog-search" class=${inputGroupAddonClass()}>${SearchIcon()}</label>
41
+ </div>
42
+ <ui-toggle-group type="single" value="etfs" variant="outline" spacing="1" aria-label="Asset type">
43
+ <ui-toggle-group-item value="stocks">Stocks</ui-toggle-group-item>
44
+ <ui-toggle-group-item value="etfs">ETFs</ui-toggle-group-item>
45
+ <ui-toggle-group-item value="reits">REITs</ui-toggle-group-item>
46
+ </ui-toggle-group>
47
+ </div>
48
+ </div>
49
+ <div data-slot="card-content" class=${cardContentClass()}>
50
+ <div role="list" data-slot="item-group" class=${itemGroupClass()}>
51
+ ${HOLDINGS.map((holding) => html`
52
+ <div role="listitem" data-slot="item" data-variant="muted" data-size="default" class=${itemClass({ variant: 'muted' })}>
53
+ <div data-slot="item-media" data-variant="default" class=${itemMediaClass()}>
54
+ <div class="flex size-12 items-center justify-center rounded-lg border text-sm font-semibold">${holding.ticker}</div>
55
+ </div>
56
+ <div data-slot="item-content" class=${itemContentClass()}>
57
+ <div data-slot="item-title" class=${itemTitleClass()}>${holding.name}</div>
58
+ <p data-slot="item-description" class=${cn(itemDescriptionClass(), 'text-xs tracking-wider uppercase')}>${holding.shares} Shares · ${holding.added}</p>
59
+ </div>
60
+ <div class="flex shrink-0 items-center gap-6">
61
+ <span data-slot="badge" data-variant="outline" class=${badgeClass({ variant: 'outline' })}>${holding.type}</span>
62
+ <div class="flex flex-col items-end gap-0.5">
63
+ <span class="text-xs tracking-wider text-muted-foreground uppercase">Value</span>
64
+ <span class="font-medium tabular-nums">${holding.value}</span>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ `)}
69
+ </div>
70
+ </div>
71
+ </div>
72
+ `;
73
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The preview-02 Roller Shades card: a shade drawn at its position, a slider
3
+ * that moves it, and Open / Half / Closed presets. Installed by
4
+ * `npx @webjsdev/ui add preview-02` at `components/preview-02/roller-shades.ts`.
5
+ * Ported from shadcn/ui's preview-02.
6
+ *
7
+ * The markup is a fragment the server renders at the half-closed position.
8
+ * `<preview-02-roller-shades>` adds the behaviour shadcn keeps in React state:
9
+ * the slider redraws the shade and picks the matching preset, and a preset
10
+ * moves the slider. Wire `ui-value-commit` from the slider to an action that
11
+ * drives the real shade.
12
+ */
13
+ import { WebComponent, html } from '@webjsdev/core';
14
+ import {
15
+ cardClass,
16
+ cardContentClass,
17
+ cardDescriptionClass,
18
+ cardFooterClass,
19
+ cardHeaderClass,
20
+ cardTitleClass,
21
+ } from '../../../components/card.ts';
22
+ import { sliderClass } from '../../../components/slider.ts';
23
+ import { cn } from '../../../lib/utils.ts';
24
+ import '../../../components/slider.ts';
25
+ import '../../../components/toggle-group.ts';
26
+
27
+ const PRESETS: Record<string, number> = { open: 0, half: 50, closed: 100 };
28
+
29
+ function presetFor(position: number): string {
30
+ return position <= 10 ? 'open' : position >= 90 ? 'closed' : 'half';
31
+ }
32
+
33
+ /** Keeps the shade, the slider and the presets in step. */
34
+ export class Preview02RollerShades extends WebComponent {
35
+ connectedCallback() {
36
+ super.connectedCallback();
37
+ this.addEventListener('input', this._onInput);
38
+ this.addEventListener('ui-value-change', this._onPreset);
39
+ }
40
+
41
+ disconnectedCallback() {
42
+ this.removeEventListener('input', this._onInput);
43
+ this.removeEventListener('ui-value-change', this._onPreset);
44
+ super.disconnectedCallback();
45
+ }
46
+
47
+ _draw(position: number): void {
48
+ const shade = this.querySelector<HTMLElement>('[data-shade]');
49
+ if (shade) shade.style.height = `${position}%`;
50
+ }
51
+
52
+ _onInput = (e: Event): void => {
53
+ const input = e.target as HTMLInputElement;
54
+ if (input.type !== 'range') return;
55
+ const position = Number(input.value);
56
+ this._draw(position);
57
+ const group = this.querySelector<HTMLElement & { value: string }>('ui-toggle-group');
58
+ if (group && group.value !== presetFor(position)) group.value = presetFor(position);
59
+ };
60
+
61
+ _onPreset = (e: Event): void => {
62
+ const target = e.target as HTMLElement;
63
+ if (target.localName !== 'ui-toggle-group') return;
64
+ const position = PRESETS[(e as CustomEvent<{ value: string }>).detail?.value];
65
+ if (position === undefined) return;
66
+ const input = this.querySelector<HTMLInputElement>('input[type="range"]');
67
+ if (input) {
68
+ input.value = String(position);
69
+ input.dispatchEvent(new Event('input', { bubbles: true }));
70
+ }
71
+ };
72
+
73
+ render() {
74
+ return html`<slot></slot>`;
75
+ }
76
+ }
77
+ Preview02RollerShades.register('preview-02-roller-shades');
78
+
79
+ export function rollerShades(opts: { position?: number } = {}) {
80
+ const position = opts.position ?? 50;
81
+ return html`
82
+ <preview-02-roller-shades>
83
+ <div data-slot="card" data-size="default" class=${cardClass()}>
84
+ <div data-slot="card-header" class=${cardHeaderClass()}>
85
+ <div data-slot="card-title" class=${cardTitleClass()}>Living Room</div>
86
+ <div data-slot="card-description" class=${cardDescriptionClass()}>Roller Shades</div>
87
+ </div>
88
+ <div data-slot="card-content" class=${cn(cardContentClass(), 'flex flex-col gap-4')}>
89
+ <div class="flex h-32 flex-col overflow-hidden rounded-lg border bg-muted">
90
+ <div data-shade class="bg-muted-foreground transition-all duration-300 motion-reduce:transition-none" style=${`height: ${position}%`}></div>
91
+ </div>
92
+ <div class="flex items-center gap-3">
93
+ <span class="text-xs font-medium tracking-wider text-muted-foreground uppercase">Open</span>
94
+ <ui-slider class="flex-1">
95
+ <input type="range" min="0" max="100" step="1" value=${String(position)} name="shade-position" aria-label="Shade position" class=${sliderClass()}>
96
+ </ui-slider>
97
+ <span class="text-xs font-medium tracking-wider text-muted-foreground uppercase">Close</span>
98
+ </div>
99
+ </div>
100
+ <div data-slot="card-footer" class=${cardFooterClass()}>
101
+ <ui-toggle-group type="single" value=${presetFor(position)} variant="outline" spacing="1" aria-label="Shade preset" class="w-full">
102
+ <ui-toggle-group-item value="open" class="flex-1">Open</ui-toggle-group-item>
103
+ <ui-toggle-group-item value="half" class="flex-1">Half</ui-toggle-group-item>
104
+ <ui-toggle-group-item value="closed" class="flex-1">Closed</ui-toggle-group-item>
105
+ </ui-toggle-group>
106
+ </div>
107
+ </div>
108
+ </preview-02-roller-shades>
109
+ `;
110
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The preview-02 savings progress card: a donut chart of saved against
3
+ * remaining with the total in its centre, over three summary rows. A
4
+ * fragment helper; the chart is the kit's `<ui-chart>`, drawn by the server.
5
+ * Installed at `components/preview-02/savings-progress.ts`. Ported from
6
+ * shadcn/ui's preview-02.
7
+ */
8
+ import { html, svg } from '@webjsdev/core';
9
+ import { cn } from '../../../lib/utils.ts';
10
+ import { cardClass, cardContentClass, cardFooterClass } from '../../../components/card.ts';
11
+ import { pieChart, type ChartConfig } from '../../../components/chart.ts';
12
+ import { separatorClass } from '../../../components/separator.ts';
13
+
14
+ const chartData = [
15
+ { name: 'saved', value: 24000, fill: 'var(--color-saved)' },
16
+ { name: 'remaining', value: 6000, fill: 'var(--color-remaining)' },
17
+ ];
18
+
19
+ const chartConfig: ChartConfig = {
20
+ saved: { label: 'Saved', color: 'var(--chart-2)' },
21
+ remaining: { label: 'Remaining', color: 'var(--chart-1)' },
22
+ };
23
+
24
+ const separator = () => html`<div role="none" data-slot="separator" data-orientation="horizontal" class=${separatorClass()}></div>`;
25
+
26
+ function row(label: string, value: string, numeric = false) {
27
+ return html`<div class="flex w-full items-center justify-between py-3">
28
+ <span class="text-sm text-muted-foreground">${label}</span>
29
+ <span class=${numeric ? 'text-sm font-semibold tabular-nums' : 'text-sm font-semibold'}>${value}</span>
30
+ </div>`;
31
+ }
32
+
33
+ export function savingsProgress() {
34
+ return html`
35
+ <div data-slot="card" data-size="default" class=${cardClass()}>
36
+ <div data-slot="card-content" class=${cardContentClass()}>
37
+ ${pieChart({
38
+ config: chartConfig,
39
+ data: chartData,
40
+ title: 'Savings progress: $24,000 saved, 80% of $30,000',
41
+ class: 'mx-auto aspect-square max-h-[220px]',
42
+ tooltip: { cursor: false, hideLabel: true },
43
+ pies: [{
44
+ dataKey: 'value',
45
+ nameKey: 'name',
46
+ innerRadius: 70,
47
+ outerRadius: 95,
48
+ strokeWidth: 0,
49
+ startAngle: 90,
50
+ endAngle: -270,
51
+ center: ({ cx, cy }) => svg`
52
+ <text x=${cx} y=${cy} text-anchor="middle" dominant-baseline="middle">
53
+ <tspan x=${cx} y=${cy - 12} class="fill-foreground text-2xl font-bold">$24,000</tspan>
54
+ <tspan x=${cx} y=${cy + 12} class="fill-muted-foreground text-xs">80% of $30,000</tspan>
55
+ </text>`,
56
+ }],
57
+ })}
58
+ </div>
59
+ <div data-slot="card-footer" class=${cn(cardFooterClass(), 'flex-col gap-0')}>
60
+ ${row('Projected Finish', 'October 2024')}
61
+ ${separator()}
62
+ ${row('Monthly Average', '$1,250', true)}
63
+ ${separator()}
64
+ ${row('Top Contributor', 'Auto-Transfer')}
65
+ </div>
66
+ </div>
67
+ `;
68
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * The preview-02 savings pair: a "Savings Targets" card with two progress
3
+ * goals beside a "Buy Investment" order form. A fragment helper. Installed at
4
+ * `components/preview-02/savings-targets.ts`. Ported from shadcn/ui's
5
+ * preview-02.
6
+ *
7
+ * The order form has no action yet. Bind a server action from a
8
+ * `'use server'` file (`<form action=${placeOrder}>`) before you ship it.
9
+ */
10
+ import { html } from '@webjsdev/core';
11
+ import { cn } from '../../../lib/utils.ts';
12
+ import { buttonClass } from '../../../components/button.ts';
13
+ import {
14
+ cardActionClass,
15
+ cardClass,
16
+ cardContentClass,
17
+ cardDescriptionClass,
18
+ cardFooterClass,
19
+ cardHeaderClass,
20
+ cardTitleClass,
21
+ } from '../../../components/card.ts';
22
+ import {
23
+ fieldClass,
24
+ fieldDescriptionClass,
25
+ fieldGroupClass,
26
+ fieldLabelClass,
27
+ } from '../../../components/field.ts';
28
+ import {
29
+ inputGroupAddonClass,
30
+ inputGroupClass,
31
+ inputGroupInputClass,
32
+ inputGroupTextClass,
33
+ } from '../../../components/input-group.ts';
34
+ import {
35
+ itemClass,
36
+ itemContentClass,
37
+ itemDescriptionClass,
38
+ itemFooterClass,
39
+ itemGroupClass,
40
+ } from '../../../components/item.ts';
41
+ import {
42
+ nativeSelectClass,
43
+ nativeSelectIconClass,
44
+ nativeSelectOptionClass,
45
+ nativeSelectWrapperClass,
46
+ } from '../../../components/native-select.ts';
47
+ import { progressClass } from '../../../components/progress.ts';
48
+ import { ChevronDownIcon } from '../../../lib/icons.ts';
49
+
50
+ function target(label: string, amount: string, pct: number, saved: string) {
51
+ return html`<div role="listitem" data-slot="item" data-variant="muted" data-size="default" class=${cn(itemClass({ variant: 'muted' }), 'flex-col items-stretch')}>
52
+ <div data-slot="item-content" class=${cn(itemContentClass(), 'gap-3')}>
53
+ <p data-slot="item-description" class=${cn(itemDescriptionClass(), 'font-heading text-xs font-medium tracking-wider text-muted-foreground uppercase')}>${label}</p>
54
+ <span class="text-3xl font-semibold tabular-nums">${amount}</span>
55
+ <progress data-slot="progress" value=${pct} max="100" aria-label=${`${label} savings progress`} class=${progressClass()}></progress>
56
+ </div>
57
+ <div data-slot="item-footer" class=${itemFooterClass()}>
58
+ <span class="text-sm text-muted-foreground">${pct}% achieved</span>
59
+ <span class="text-sm font-medium tabular-nums">${saved}</span>
60
+ </div>
61
+ </div>`;
62
+ }
63
+
64
+ function stat(label: string, value: string) {
65
+ return html`<div class="flex items-center justify-between">
66
+ <span class="text-sm text-muted-foreground">${label}</span>
67
+ <span class="text-sm font-semibold tabular-nums">${value}</span>
68
+ </div>`;
69
+ }
70
+
71
+ export function savingsTargets() {
72
+ return html`
73
+ <div class="grid grid-cols-2 gap-(--gap)">
74
+ <div data-slot="card" data-size="default" class=${cardClass()}>
75
+ <div data-slot="card-header" class=${cardHeaderClass()}>
76
+ <div data-slot="card-title" class=${cardTitleClass()}>Savings Targets</div>
77
+ <div data-slot="card-description" class=${cardDescriptionClass()}>Active milestones for 2024</div>
78
+ <div data-slot="card-action" class=${cardActionClass()}>
79
+ <button type="button" data-slot="button" data-variant="outline" data-size="sm" class=${buttonClass({ variant: 'outline', size: 'sm' })}>New Goal</button>
80
+ </div>
81
+ </div>
82
+ <div data-slot="card-content" class=${cardContentClass()}>
83
+ <div role="list" data-slot="item-group" class=${cn(itemGroupClass(), 'gap-3')}>
84
+ ${target('Retirement', '$420,000', 65, '$273,000')}
85
+ ${target('Real Estate', '$85,000', 32, '$27,200')}
86
+ </div>
87
+ </div>
88
+ <div data-slot="card-footer" class=${cardFooterClass()}>
89
+ <div data-slot="card-description" class=${cn(cardDescriptionClass(), 'text-center')}>You have not met your targets for this year.</div>
90
+ </div>
91
+ </div>
92
+ <form data-slot="card" data-size="default" class=${cardClass()}>
93
+ <div data-slot="card-header" class=${cardHeaderClass()}>
94
+ <div data-slot="card-title" class=${cardTitleClass()}>Buy Investment</div>
95
+ </div>
96
+ <div data-slot="card-content" class=${cn(cardContentClass(), 'flex flex-1 flex-col gap-3')}>
97
+ <div data-slot="field-group" class=${cn(fieldGroupClass(), 'flex-1')}>
98
+ <div role="group" data-slot="field" data-orientation="vertical" class=${fieldClass()}>
99
+ <label data-slot="field-label" for="invest-amount" class=${fieldLabelClass()}>Amount to Invest</label>
100
+ <div data-slot="input-group" role="group" class=${inputGroupClass()}>
101
+ <div role="group" data-slot="input-group-addon" data-align="inline-start" class=${inputGroupAddonClass()}>
102
+ <span class=${inputGroupTextClass()}>$</span>
103
+ </div>
104
+ <input data-slot="input-group-control" id="invest-amount" name="amount" value="1,000.00" class=${inputGroupInputClass()}>
105
+ </div>
106
+ </div>
107
+ <div role="group" data-slot="field" data-orientation="vertical" class=${fieldClass()}>
108
+ <label data-slot="field-label" for="invest-type" class=${fieldLabelClass()}>Order Type</label>
109
+ <div data-slot="native-select-wrapper" data-size="default" class=${nativeSelectWrapperClass()}>
110
+ <select data-slot="native-select" data-size="default" id="invest-type" name="type" class=${nativeSelectClass()}>
111
+ <option value="market" selected class=${nativeSelectOptionClass()}>Market Order</option>
112
+ <option value="limit" class=${nativeSelectOptionClass()}>Limit Order</option>
113
+ <option value="stop" class=${nativeSelectOptionClass()}>Stop Order</option>
114
+ </select>
115
+ ${ChevronDownIcon(nativeSelectIconClass())}
116
+ </div>
117
+ <p data-slot="field-description" class=${fieldDescriptionClass()}>Market orders execute at the current price.</p>
118
+ </div>
119
+ <div class="flex flex-col gap-2">
120
+ ${stat('Estimated Shares', '1.95')}
121
+ ${stat('Buying Power', '$12,450.00')}
122
+ </div>
123
+ </div>
124
+ </div>
125
+ <div data-slot="card-footer" class=${cn(cardFooterClass(), 'flex-col gap-3')}>
126
+ <button type="submit" data-slot="button" data-variant="default" data-size="default" class=${cn(buttonClass(), 'w-full')}>Review Order</button>
127
+ <div data-slot="card-description" class=${cn(cardDescriptionClass(), 'text-center')}>Trades are typically executed within minutes during market hours.</div>
128
+ </div>
129
+ </form>
130
+ </div>
131
+ `;
132
+ }