@lar-works/design-system 0.0.0-stage → 0.1.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 (555) hide show
  1. package/README.md +24 -2
  2. package/dist/actions/Button.d.ts +25 -0
  3. package/dist/actions/Button.js +55 -0
  4. package/dist/actions/Button.js.map +1 -0
  5. package/dist/actions/ButtonLink.d.ts +21 -0
  6. package/dist/actions/ButtonLink.js +40 -0
  7. package/dist/actions/ButtonLink.js.map +1 -0
  8. package/dist/actions/IconButton.d.ts +14 -0
  9. package/dist/actions/IconButton.js +29 -0
  10. package/dist/actions/IconButton.js.map +1 -0
  11. package/dist/actions/ThemeSwitch.d.ts +7 -0
  12. package/dist/actions/ThemeSwitch.js +42 -0
  13. package/dist/actions/ThemeSwitch.js.map +1 -0
  14. package/dist/actions/index.d.ts +5 -0
  15. package/dist/collections/CollectionSectionHeader.d.ts +5 -0
  16. package/dist/collections/CollectionSectionHeader.js +18 -0
  17. package/dist/collections/CollectionSectionHeader.js.map +1 -0
  18. package/dist/collections/CollectionState.d.ts +37 -0
  19. package/dist/collections/CollectionState.js +69 -0
  20. package/dist/collections/CollectionState.js.map +1 -0
  21. package/dist/collections/CollectionTokens.d.ts +16 -0
  22. package/dist/collections/CollectionTokens.js +19 -0
  23. package/dist/collections/CollectionTokens.js.map +1 -0
  24. package/dist/collections/CollectionViewport.js +36 -0
  25. package/dist/collections/CollectionViewport.js.map +1 -0
  26. package/dist/collections/DataRow.d.ts +23 -0
  27. package/dist/collections/DataRow.js +57 -0
  28. package/dist/collections/DataRow.js.map +1 -0
  29. package/dist/collections/ResultList.d.ts +29 -0
  30. package/dist/collections/ResultList.js +128 -0
  31. package/dist/collections/ResultList.js.map +1 -0
  32. package/dist/collections/ScrollRow.d.ts +23 -0
  33. package/dist/collections/ScrollRow.js +59 -0
  34. package/dist/collections/ScrollRow.js.map +1 -0
  35. package/dist/collections/VirtualGrid.d.ts +14 -0
  36. package/dist/collections/VirtualGrid.js +71 -0
  37. package/dist/collections/VirtualGrid.js.map +1 -0
  38. package/dist/collections/VirtualList.d.ts +34 -0
  39. package/dist/collections/VirtualList.js +128 -0
  40. package/dist/collections/VirtualList.js.map +1 -0
  41. package/dist/collections/index.d.ts +10 -0
  42. package/dist/collections/useCollectionMotion.d.ts +3 -0
  43. package/dist/collections/useCollectionMotion.js +34 -0
  44. package/dist/collections/useCollectionMotion.js.map +1 -0
  45. package/dist/collections/useScrollRow.d.ts +17 -0
  46. package/dist/collections/useScrollRow.js +63 -0
  47. package/dist/collections/useScrollRow.js.map +1 -0
  48. package/dist/display/ActivityCard.d.ts +17 -0
  49. package/dist/display/ActivityCard.js +58 -0
  50. package/dist/display/ActivityCard.js.map +1 -0
  51. package/dist/display/Artwork.d.ts +25 -0
  52. package/dist/display/Artwork.js +97 -0
  53. package/dist/display/Artwork.js.map +1 -0
  54. package/dist/display/Avatar.d.ts +5 -0
  55. package/dist/display/Avatar.js +13 -0
  56. package/dist/display/Avatar.js.map +1 -0
  57. package/dist/display/Badge.d.ts +10 -0
  58. package/dist/display/Badge.js +28 -0
  59. package/dist/display/Badge.js.map +1 -0
  60. package/dist/display/BadgeList.d.ts +11 -0
  61. package/dist/display/BadgeList.js +20 -0
  62. package/dist/display/BadgeList.js.map +1 -0
  63. package/dist/display/BrandMark.d.ts +21 -0
  64. package/dist/display/BrandMark.js +60 -0
  65. package/dist/display/BrandMark.js.map +1 -0
  66. package/dist/display/ChangeList.d.ts +16 -0
  67. package/dist/display/ChangeList.js +56 -0
  68. package/dist/display/ChangeList.js.map +1 -0
  69. package/dist/display/CheckList.d.ts +10 -0
  70. package/dist/display/CheckList.js +25 -0
  71. package/dist/display/CheckList.js.map +1 -0
  72. package/dist/display/CodeBlock.d.ts +6 -0
  73. package/dist/display/CodeBlock.js +12 -0
  74. package/dist/display/CodeBlock.js.map +1 -0
  75. package/dist/display/CopyButton.d.ts +9 -0
  76. package/dist/display/CopyButton.js +59 -0
  77. package/dist/display/CopyButton.js.map +1 -0
  78. package/dist/display/DataTable.d.ts +35 -0
  79. package/dist/display/DataTable.js +53 -0
  80. package/dist/display/DataTable.js.map +1 -0
  81. package/dist/display/DetailHero.d.ts +39 -0
  82. package/dist/display/DetailHero.js +146 -0
  83. package/dist/display/DetailHero.js.map +1 -0
  84. package/dist/display/DetailList.d.ts +15 -0
  85. package/dist/display/DetailList.js +53 -0
  86. package/dist/display/DetailList.js.map +1 -0
  87. package/dist/display/DeviceCard.d.ts +18 -0
  88. package/dist/display/DeviceCard.js +48 -0
  89. package/dist/display/DeviceCard.js.map +1 -0
  90. package/dist/display/Identity.d.ts +14 -0
  91. package/dist/display/Identity.js +54 -0
  92. package/dist/display/Identity.js.map +1 -0
  93. package/dist/display/ImageCard.d.ts +22 -0
  94. package/dist/display/ImageCard.js +63 -0
  95. package/dist/display/ImageCard.js.map +1 -0
  96. package/dist/display/ImagePicker.d.ts +30 -0
  97. package/dist/display/ImagePicker.js +108 -0
  98. package/dist/display/ImagePicker.js.map +1 -0
  99. package/dist/display/InfoBox.d.ts +15 -0
  100. package/dist/display/InfoBox.js +41 -0
  101. package/dist/display/InfoBox.js.map +1 -0
  102. package/dist/display/InsetPanel.d.ts +13 -0
  103. package/dist/display/InsetPanel.js +26 -0
  104. package/dist/display/InsetPanel.js.map +1 -0
  105. package/dist/display/ItemAction.d.ts +10 -0
  106. package/dist/display/ItemAction.js +35 -0
  107. package/dist/display/ItemAction.js.map +1 -0
  108. package/dist/display/Kbd.d.ts +6 -0
  109. package/dist/display/Kbd.js +12 -0
  110. package/dist/display/Kbd.js.map +1 -0
  111. package/dist/display/KindIcon.d.ts +8 -0
  112. package/dist/display/KindIcon.js +15 -0
  113. package/dist/display/KindIcon.js.map +1 -0
  114. package/dist/display/NoticeCard.d.ts +24 -0
  115. package/dist/display/NoticeCard.js +59 -0
  116. package/dist/display/NoticeCard.js.map +1 -0
  117. package/dist/display/PairingList.d.ts +19 -0
  118. package/dist/display/PairingList.js +53 -0
  119. package/dist/display/PairingList.js.map +1 -0
  120. package/dist/display/PathList.d.ts +9 -0
  121. package/dist/display/PathList.js +21 -0
  122. package/dist/display/PathList.js.map +1 -0
  123. package/dist/display/PeoplePreview.d.ts +16 -0
  124. package/dist/display/PeoplePreview.js +41 -0
  125. package/dist/display/PeoplePreview.js.map +1 -0
  126. package/dist/display/PropertySheet.d.ts +56 -0
  127. package/dist/display/PropertySheet.js +150 -0
  128. package/dist/display/PropertySheet.js.map +1 -0
  129. package/dist/display/QrCode.d.ts +6 -0
  130. package/dist/display/QrCode.js +47 -0
  131. package/dist/display/QrCode.js.map +1 -0
  132. package/dist/display/RadioChoice.d.ts +9 -0
  133. package/dist/display/RadioChoice.js +28 -0
  134. package/dist/display/RadioChoice.js.map +1 -0
  135. package/dist/display/RatingLink.d.ts +10 -0
  136. package/dist/display/RatingLink.js +80 -0
  137. package/dist/display/RatingLink.js.map +1 -0
  138. package/dist/display/ResourceCard.d.ts +20 -0
  139. package/dist/display/ResourceCard.js +200 -0
  140. package/dist/display/ResourceCard.js.map +1 -0
  141. package/dist/display/RowList.d.ts +28 -0
  142. package/dist/display/RowList.js +76 -0
  143. package/dist/display/RowList.js.map +1 -0
  144. package/dist/display/StackedMeter.d.ts +28 -0
  145. package/dist/display/StackedMeter.js +48 -0
  146. package/dist/display/StackedMeter.js.map +1 -0
  147. package/dist/display/StatTile.d.ts +13 -0
  148. package/dist/display/StatTile.js +35 -0
  149. package/dist/display/StatTile.js.map +1 -0
  150. package/dist/display/StepList.d.ts +5 -0
  151. package/dist/display/StepList.js +12 -0
  152. package/dist/display/StepList.js.map +1 -0
  153. package/dist/display/TextPreview.d.ts +14 -0
  154. package/dist/display/TextPreview.js +46 -0
  155. package/dist/display/TextPreview.js.map +1 -0
  156. package/dist/display/TimeSeriesChart.d.ts +19 -0
  157. package/dist/display/TimeSeriesChart.js +163 -0
  158. package/dist/display/TimeSeriesChart.js.map +1 -0
  159. package/dist/display/ToneTile.js +12 -0
  160. package/dist/display/ToneTile.js.map +1 -0
  161. package/dist/display/index.d.ts +38 -0
  162. package/dist/feedback/Alert.d.ts +15 -0
  163. package/dist/feedback/Alert.js +19 -0
  164. package/dist/feedback/Alert.js.map +1 -0
  165. package/dist/feedback/AsyncState.d.ts +16 -0
  166. package/dist/feedback/AsyncState.js +29 -0
  167. package/dist/feedback/AsyncState.js.map +1 -0
  168. package/dist/feedback/ErrorNotification.d.ts +8 -0
  169. package/dist/feedback/ErrorNotification.js +20 -0
  170. package/dist/feedback/ErrorNotification.js.map +1 -0
  171. package/dist/feedback/Notifications.d.ts +2 -0
  172. package/dist/feedback/Notifications.js +9 -0
  173. package/dist/feedback/Notifications.js.map +1 -0
  174. package/dist/feedback/ProgressStatusRow.d.ts +23 -0
  175. package/dist/feedback/ProgressStatusRow.js +74 -0
  176. package/dist/feedback/ProgressStatusRow.js.map +1 -0
  177. package/dist/feedback/SkeletonLoader.d.ts +19 -0
  178. package/dist/feedback/SkeletonLoader.js +59 -0
  179. package/dist/feedback/SkeletonLoader.js.map +1 -0
  180. package/dist/feedback/StatusIndicator.d.ts +9 -0
  181. package/dist/feedback/StatusIndicator.js +28 -0
  182. package/dist/feedback/StatusIndicator.js.map +1 -0
  183. package/dist/feedback/StatusPopoverContent.d.ts +13 -0
  184. package/dist/feedback/StatusPopoverContent.js +50 -0
  185. package/dist/feedback/StatusPopoverContent.js.map +1 -0
  186. package/dist/feedback/StatusRow.d.ts +16 -0
  187. package/dist/feedback/StatusRow.js +60 -0
  188. package/dist/feedback/StatusRow.js.map +1 -0
  189. package/dist/feedback/index.d.ts +11 -0
  190. package/dist/feedback/index.js +11 -0
  191. package/dist/forms/Checkbox.d.ts +10 -0
  192. package/dist/forms/Checkbox.js +48 -0
  193. package/dist/forms/Checkbox.js.map +1 -0
  194. package/dist/forms/Field.d.ts +5 -0
  195. package/dist/forms/Field.js +15 -0
  196. package/dist/forms/Field.js.map +1 -0
  197. package/dist/forms/FormControlStyles.js +14 -0
  198. package/dist/forms/FormControlStyles.js.map +1 -0
  199. package/dist/forms/FormSection.d.ts +48 -0
  200. package/dist/forms/FormSection.js +142 -0
  201. package/dist/forms/FormSection.js.map +1 -0
  202. package/dist/forms/InlineFields.d.ts +13 -0
  203. package/dist/forms/InlineFields.js +24 -0
  204. package/dist/forms/InlineFields.js.map +1 -0
  205. package/dist/forms/Input.d.ts +5 -0
  206. package/dist/forms/Input.js +18 -0
  207. package/dist/forms/Input.js.map +1 -0
  208. package/dist/forms/OptionSelect.d.ts +21 -0
  209. package/dist/forms/OptionSelect.js +28 -0
  210. package/dist/forms/OptionSelect.js.map +1 -0
  211. package/dist/forms/RadioGroup.d.ts +5 -0
  212. package/dist/forms/RadioGroup.js +35 -0
  213. package/dist/forms/RadioGroup.js.map +1 -0
  214. package/dist/forms/Select.d.ts +6 -0
  215. package/dist/forms/Select.js +36 -0
  216. package/dist/forms/Select.js.map +1 -0
  217. package/dist/forms/Switch.d.ts +4 -0
  218. package/dist/forms/Switch.js +16 -0
  219. package/dist/forms/Switch.js.map +1 -0
  220. package/dist/forms/TagInput.d.ts +19 -0
  221. package/dist/forms/TagInput.js +60 -0
  222. package/dist/forms/TagInput.js.map +1 -0
  223. package/dist/forms/Textarea.d.ts +4 -0
  224. package/dist/forms/Textarea.js +15 -0
  225. package/dist/forms/Textarea.js.map +1 -0
  226. package/dist/forms/index.d.ts +12 -0
  227. package/dist/foundations/DesignSystemProvider.d.ts +64 -0
  228. package/dist/foundations/DesignSystemProvider.js +66 -0
  229. package/dist/foundations/DesignSystemProvider.js.map +1 -0
  230. package/dist/foundations/KeyboardFocus.d.ts +9 -0
  231. package/dist/foundations/KeyboardFocus.js +10 -0
  232. package/dist/foundations/KeyboardFocus.js.map +1 -0
  233. package/dist/foundations/KeyboardShortcut.d.ts +5 -0
  234. package/dist/foundations/KeyboardShortcut.js +10 -0
  235. package/dist/foundations/KeyboardShortcut.js.map +1 -0
  236. package/dist/foundations/Theme.d.ts +14 -0
  237. package/dist/foundations/Theme.js +56 -0
  238. package/dist/foundations/Theme.js.map +1 -0
  239. package/dist/foundations/index.d.ts +5 -0
  240. package/dist/icons/BrandIcons.d.ts +3 -0
  241. package/dist/icons/BrandIcons.js +14 -0
  242. package/dist/icons/BrandIcons.js.map +1 -0
  243. package/dist/icons/index.d.ts +3 -0
  244. package/dist/icons/index.js +2 -0
  245. package/dist/icons.d.ts +4 -0
  246. package/dist/icons.js +2 -0
  247. package/dist/index.d.ts +133 -0
  248. package/dist/index.js +125 -0
  249. package/dist/layout/AppShell.d.ts +11 -0
  250. package/dist/layout/AppShell.js +46 -0
  251. package/dist/layout/AppShell.js.map +1 -0
  252. package/dist/layout/AuthLayout.d.ts +11 -0
  253. package/dist/layout/AuthLayout.js +48 -0
  254. package/dist/layout/AuthLayout.js.map +1 -0
  255. package/dist/layout/ContentContainer.d.ts +9 -0
  256. package/dist/layout/ContentContainer.js +15 -0
  257. package/dist/layout/ContentContainer.js.map +1 -0
  258. package/dist/layout/Flow.d.ts +26 -0
  259. package/dist/layout/Flow.js +65 -0
  260. package/dist/layout/Flow.js.map +1 -0
  261. package/dist/layout/PageLayout.d.ts +12 -0
  262. package/dist/layout/PageLayout.js +31 -0
  263. package/dist/layout/PageLayout.js.map +1 -0
  264. package/dist/layout/PageSection.d.ts +43 -0
  265. package/dist/layout/PageSection.js +63 -0
  266. package/dist/layout/PageSection.js.map +1 -0
  267. package/dist/layout/ScrollArea.d.ts +4 -0
  268. package/dist/layout/ScrollArea.js +11 -0
  269. package/dist/layout/ScrollArea.js.map +1 -0
  270. package/dist/layout/Section.d.ts +12 -0
  271. package/dist/layout/Section.js +36 -0
  272. package/dist/layout/Section.js.map +1 -0
  273. package/dist/layout/Site.d.ts +41 -0
  274. package/dist/layout/Site.js +157 -0
  275. package/dist/layout/Site.js.map +1 -0
  276. package/dist/layout/TitleBar.d.ts +28 -0
  277. package/dist/layout/TitleBar.js +83 -0
  278. package/dist/layout/TitleBar.js.map +1 -0
  279. package/dist/layout/WorkspaceActionsHeader.d.ts +8 -0
  280. package/dist/layout/WorkspaceActionsHeader.js +18 -0
  281. package/dist/layout/WorkspaceActionsHeader.js.map +1 -0
  282. package/dist/layout/index.d.ts +19 -0
  283. package/dist/layout/index.js +19 -0
  284. package/dist/layout/sidebar/SidebarNavigationItem.d.ts +10 -0
  285. package/dist/layout/sidebar/SidebarNavigationItem.js +36 -0
  286. package/dist/layout/sidebar/SidebarNavigationItem.js.map +1 -0
  287. package/dist/layout/sidebar/SidebarPane.d.ts +13 -0
  288. package/dist/layout/sidebar/SidebarPane.js +30 -0
  289. package/dist/layout/sidebar/SidebarPane.js.map +1 -0
  290. package/dist/layout/toolbar/CommandPaletteTrigger.d.ts +11 -0
  291. package/dist/layout/toolbar/CommandPaletteTrigger.js +46 -0
  292. package/dist/layout/toolbar/CommandPaletteTrigger.js.map +1 -0
  293. package/dist/layout/toolbar/ToolbarStatusGroup.d.ts +5 -0
  294. package/dist/layout/toolbar/ToolbarStatusGroup.js +14 -0
  295. package/dist/layout/toolbar/ToolbarStatusGroup.js.map +1 -0
  296. package/dist/layout/toolbar/ToolbarStatusItem.d.ts +9 -0
  297. package/dist/layout/toolbar/ToolbarStatusItem.js +18 -0
  298. package/dist/layout/toolbar/ToolbarStatusItem.js.map +1 -0
  299. package/dist/navigation/ArtworkTabs.d.ts +18 -0
  300. package/dist/navigation/ArtworkTabs.js +72 -0
  301. package/dist/navigation/ArtworkTabs.js.map +1 -0
  302. package/dist/navigation/Breadcrumbs.d.ts +13 -0
  303. package/dist/navigation/Breadcrumbs.js +32 -0
  304. package/dist/navigation/Breadcrumbs.js.map +1 -0
  305. package/dist/navigation/CollectionBrowseSelector.d.ts +22 -0
  306. package/dist/navigation/CollectionBrowseSelector.js +70 -0
  307. package/dist/navigation/CollectionBrowseSelector.js.map +1 -0
  308. package/dist/navigation/CollectionViewToggle.d.ts +12 -0
  309. package/dist/navigation/CollectionViewToggle.js +36 -0
  310. package/dist/navigation/CollectionViewToggle.js.map +1 -0
  311. package/dist/navigation/DrilldownBrowseSelector.d.ts +31 -0
  312. package/dist/navigation/DrilldownBrowseSelector.js +174 -0
  313. package/dist/navigation/DrilldownBrowseSelector.js.map +1 -0
  314. package/dist/navigation/FolderSelector.d.ts +24 -0
  315. package/dist/navigation/FolderSelector.js +142 -0
  316. package/dist/navigation/FolderSelector.js.map +1 -0
  317. package/dist/navigation/TabKeys.js +13 -0
  318. package/dist/navigation/TabKeys.js.map +1 -0
  319. package/dist/navigation/ViewTabs.d.ts +19 -0
  320. package/dist/navigation/ViewTabs.js +48 -0
  321. package/dist/navigation/ViewTabs.js.map +1 -0
  322. package/dist/navigation/index.d.ts +8 -0
  323. package/dist/overlays/ActionModal.d.ts +21 -0
  324. package/dist/overlays/ActionModal.js +48 -0
  325. package/dist/overlays/ActionModal.js.map +1 -0
  326. package/dist/overlays/CommandPalette.d.ts +43 -0
  327. package/dist/overlays/CommandPalette.js +163 -0
  328. package/dist/overlays/CommandPalette.js.map +1 -0
  329. package/dist/overlays/Drawer.d.ts +19 -0
  330. package/dist/overlays/Drawer.js +83 -0
  331. package/dist/overlays/Drawer.js.map +1 -0
  332. package/dist/overlays/DropdownMenu.d.ts +47 -0
  333. package/dist/overlays/DropdownMenu.js +58 -0
  334. package/dist/overlays/DropdownMenu.js.map +1 -0
  335. package/dist/overlays/ImageViewer.d.ts +21 -0
  336. package/dist/overlays/ImageViewer.js +82 -0
  337. package/dist/overlays/ImageViewer.js.map +1 -0
  338. package/dist/overlays/Modal.d.ts +36 -0
  339. package/dist/overlays/Modal.js +149 -0
  340. package/dist/overlays/Modal.js.map +1 -0
  341. package/dist/overlays/Popover.d.ts +19 -0
  342. package/dist/overlays/Popover.js +26 -0
  343. package/dist/overlays/Popover.js.map +1 -0
  344. package/dist/overlays/Tooltip.d.ts +12 -0
  345. package/dist/overlays/Tooltip.js +54 -0
  346. package/dist/overlays/Tooltip.js.map +1 -0
  347. package/dist/overlays/index.d.ts +9 -0
  348. package/dist/overlays/useModalAutoFocus.js +84 -0
  349. package/dist/overlays/useModalAutoFocus.js.map +1 -0
  350. package/dist/overlays/useScrollFade.js +43 -0
  351. package/dist/overlays/useScrollFade.js.map +1 -0
  352. package/dist/showcase/CallToAction.d.ts +11 -0
  353. package/dist/showcase/CallToAction.js +54 -0
  354. package/dist/showcase/CallToAction.js.map +1 -0
  355. package/dist/showcase/Cards.d.ts +34 -0
  356. package/dist/showcase/Cards.js +122 -0
  357. package/dist/showcase/Cards.js.map +1 -0
  358. package/dist/showcase/Devices.d.ts +72 -0
  359. package/dist/showcase/Devices.js +249 -0
  360. package/dist/showcase/Devices.js.map +1 -0
  361. package/dist/showcase/FeatureRow.d.ts +30 -0
  362. package/dist/showcase/FeatureRow.js +91 -0
  363. package/dist/showcase/FeatureRow.js.map +1 -0
  364. package/dist/showcase/Hero.d.ts +15 -0
  365. package/dist/showcase/Hero.js +73 -0
  366. package/dist/showcase/Hero.js.map +1 -0
  367. package/dist/showcase/PhotoSearchConcept.d.ts +14 -0
  368. package/dist/showcase/PhotoSearchConcept.js +43 -0
  369. package/dist/showcase/PhotoSearchConcept.js.map +1 -0
  370. package/dist/showcase/Platforms.d.ts +15 -0
  371. package/dist/showcase/Platforms.js +48 -0
  372. package/dist/showcase/Platforms.js.map +1 -0
  373. package/dist/showcase/ProductBand.d.ts +38 -0
  374. package/dist/showcase/ProductBand.js +120 -0
  375. package/dist/showcase/ProductBand.js.map +1 -0
  376. package/dist/showcase/Roadmap.d.ts +21 -0
  377. package/dist/showcase/Roadmap.js +111 -0
  378. package/dist/showcase/Roadmap.js.map +1 -0
  379. package/dist/showcase/RouteDiagram.d.ts +14 -0
  380. package/dist/showcase/RouteDiagram.js +57 -0
  381. package/dist/showcase/RouteDiagram.js.map +1 -0
  382. package/dist/showcase/ServerUnit.d.ts +50 -0
  383. package/dist/showcase/ServerUnit.js +175 -0
  384. package/dist/showcase/ServerUnit.js.map +1 -0
  385. package/dist/showcase/Stage.d.ts +46 -0
  386. package/dist/showcase/Stage.js +106 -0
  387. package/dist/showcase/Stage.js.map +1 -0
  388. package/dist/showcase/Status.d.ts +30 -0
  389. package/dist/showcase/Status.js +84 -0
  390. package/dist/showcase/Status.js.map +1 -0
  391. package/dist/showcase/StepFlow.d.ts +13 -0
  392. package/dist/showcase/StepFlow.js +47 -0
  393. package/dist/showcase/StepFlow.js.map +1 -0
  394. package/dist/showcase/index.d.ts +15 -0
  395. package/dist/testing.d.ts +5 -0
  396. package/dist/testing.js +43 -0
  397. package/dist/testing.js.map +1 -0
  398. package/dist/typography/Link.d.ts +21 -0
  399. package/dist/typography/Link.js +60 -0
  400. package/dist/typography/Link.js.map +1 -0
  401. package/dist/typography/Typography.d.ts +53 -0
  402. package/dist/typography/Typography.js +67 -0
  403. package/dist/typography/Typography.js.map +1 -0
  404. package/dist/typography/index.d.ts +4 -0
  405. package/dist/typography/index.js +4 -0
  406. package/package.json +80 -3
  407. package/src/actions/Button.tsx +68 -0
  408. package/src/actions/ButtonLink.tsx +75 -0
  409. package/src/actions/IconButton.tsx +55 -0
  410. package/src/actions/ThemeSwitch.tsx +46 -0
  411. package/src/actions/index.ts +4 -0
  412. package/src/collections/CollectionSectionHeader.tsx +13 -0
  413. package/src/collections/CollectionState.tsx +76 -0
  414. package/src/collections/CollectionTokens.ts +12 -0
  415. package/src/collections/CollectionViewport.ts +40 -0
  416. package/src/collections/DataRow.tsx +79 -0
  417. package/src/collections/ResultList.tsx +164 -0
  418. package/src/collections/ScrollRow.tsx +90 -0
  419. package/src/collections/VirtualGrid.tsx +92 -0
  420. package/src/collections/VirtualList.tsx +224 -0
  421. package/src/collections/index.ts +10 -0
  422. package/src/collections/useCollectionMotion.ts +42 -0
  423. package/src/collections/useScrollRow.ts +64 -0
  424. package/src/display/ActivityCard.tsx +76 -0
  425. package/src/display/Artwork.tsx +140 -0
  426. package/src/display/Avatar.tsx +7 -0
  427. package/src/display/Badge.tsx +33 -0
  428. package/src/display/BadgeList.tsx +25 -0
  429. package/src/display/BrandMark.tsx +72 -0
  430. package/src/display/ChangeList.tsx +41 -0
  431. package/src/display/CheckList.tsx +27 -0
  432. package/src/display/CodeBlock.tsx +12 -0
  433. package/src/display/CopyButton.tsx +77 -0
  434. package/src/display/DataTable.tsx +80 -0
  435. package/src/display/DetailHero.tsx +191 -0
  436. package/src/display/DetailList.tsx +74 -0
  437. package/src/display/DeviceCard.tsx +49 -0
  438. package/src/display/Identity.tsx +56 -0
  439. package/src/display/ImageCard.tsx +102 -0
  440. package/src/display/ImagePicker.tsx +149 -0
  441. package/src/display/InfoBox.tsx +48 -0
  442. package/src/display/InsetPanel.tsx +37 -0
  443. package/src/display/ItemAction.tsx +53 -0
  444. package/src/display/Kbd.tsx +6 -0
  445. package/src/display/KindIcon.tsx +15 -0
  446. package/src/display/NoticeCard.tsx +77 -0
  447. package/src/display/PairingList.tsx +55 -0
  448. package/src/display/PathList.tsx +16 -0
  449. package/src/display/PeoplePreview.tsx +66 -0
  450. package/src/display/PropertySheet.tsx +180 -0
  451. package/src/display/QrCode.tsx +47 -0
  452. package/src/display/RadioChoice.tsx +34 -0
  453. package/src/display/RatingLink.tsx +76 -0
  454. package/src/display/ResourceCard.tsx +201 -0
  455. package/src/display/RowList.tsx +110 -0
  456. package/src/display/StackedMeter.tsx +72 -0
  457. package/src/display/StatTile.tsx +39 -0
  458. package/src/display/StepList.tsx +10 -0
  459. package/src/display/TextPreview.tsx +66 -0
  460. package/src/display/TimeSeriesChart.tsx +191 -0
  461. package/src/display/ToneTile.ts +10 -0
  462. package/src/display/index.ts +37 -0
  463. package/src/feedback/Alert.tsx +35 -0
  464. package/src/feedback/AsyncState.tsx +56 -0
  465. package/src/feedback/ErrorNotification.ts +24 -0
  466. package/src/feedback/Notifications.tsx +5 -0
  467. package/src/feedback/ProgressStatusRow.tsx +104 -0
  468. package/src/feedback/SkeletonLoader.tsx +88 -0
  469. package/src/feedback/StatusIndicator.tsx +28 -0
  470. package/src/feedback/StatusPopoverContent.tsx +54 -0
  471. package/src/feedback/StatusRow.tsx +70 -0
  472. package/src/feedback/index.ts +15 -0
  473. package/src/forms/Checkbox.tsx +61 -0
  474. package/src/forms/Field.tsx +17 -0
  475. package/src/forms/FormControlStyles.ts +9 -0
  476. package/src/forms/FormSection.tsx +175 -0
  477. package/src/forms/InlineFields.tsx +22 -0
  478. package/src/forms/Input.tsx +22 -0
  479. package/src/forms/OptionSelect.tsx +49 -0
  480. package/src/forms/RadioGroup.tsx +48 -0
  481. package/src/forms/Select.tsx +46 -0
  482. package/src/forms/Switch.tsx +10 -0
  483. package/src/forms/TagInput.tsx +76 -0
  484. package/src/forms/Textarea.tsx +14 -0
  485. package/src/forms/index.ts +11 -0
  486. package/src/foundations/DesignSystemProvider.tsx +79 -0
  487. package/src/foundations/KeyboardFocus.ts +6 -0
  488. package/src/foundations/KeyboardShortcut.ts +12 -0
  489. package/src/foundations/Theme.ts +75 -0
  490. package/src/foundations/index.ts +10 -0
  491. package/src/foundations/theme.css +425 -0
  492. package/src/icons/BrandIcons.tsx +8 -0
  493. package/src/icons/index.ts +4 -0
  494. package/src/icons.ts +1 -0
  495. package/src/index.ts +13 -0
  496. package/src/layout/AppShell.tsx +63 -0
  497. package/src/layout/AuthLayout.tsx +40 -0
  498. package/src/layout/ContentContainer.tsx +16 -0
  499. package/src/layout/Flow.tsx +56 -0
  500. package/src/layout/PageLayout.tsx +35 -0
  501. package/src/layout/PageSection.tsx +103 -0
  502. package/src/layout/ScrollArea.tsx +7 -0
  503. package/src/layout/Section.tsx +36 -0
  504. package/src/layout/Site.tsx +205 -0
  505. package/src/layout/TitleBar.tsx +97 -0
  506. package/src/layout/WorkspaceActionsHeader.tsx +17 -0
  507. package/src/layout/index.ts +18 -0
  508. package/src/layout/sidebar/SidebarNavigationItem.tsx +45 -0
  509. package/src/layout/sidebar/SidebarPane.tsx +37 -0
  510. package/src/layout/toolbar/CommandPaletteTrigger.tsx +53 -0
  511. package/src/layout/toolbar/ToolbarStatusGroup.tsx +9 -0
  512. package/src/layout/toolbar/ToolbarStatusItem.tsx +18 -0
  513. package/src/navigation/ArtworkTabs.tsx +107 -0
  514. package/src/navigation/Breadcrumbs.tsx +31 -0
  515. package/src/navigation/CollectionBrowseSelector.tsx +90 -0
  516. package/src/navigation/CollectionViewToggle.tsx +52 -0
  517. package/src/navigation/DrilldownBrowseSelector.tsx +229 -0
  518. package/src/navigation/FolderSelector.tsx +172 -0
  519. package/src/navigation/TabKeys.ts +21 -0
  520. package/src/navigation/ViewTabs.tsx +85 -0
  521. package/src/navigation/index.ts +15 -0
  522. package/src/overlays/ActionModal.tsx +81 -0
  523. package/src/overlays/CommandPalette.tsx +199 -0
  524. package/src/overlays/Drawer.tsx +107 -0
  525. package/src/overlays/DropdownMenu.tsx +122 -0
  526. package/src/overlays/ImageViewer.tsx +96 -0
  527. package/src/overlays/Modal.tsx +234 -0
  528. package/src/overlays/Popover.tsx +40 -0
  529. package/src/overlays/Tooltip.tsx +56 -0
  530. package/src/overlays/index.ts +8 -0
  531. package/src/overlays/useModalAutoFocus.ts +119 -0
  532. package/src/overlays/useScrollFade.ts +49 -0
  533. package/src/showcase/CallToAction.tsx +46 -0
  534. package/src/showcase/Cards.tsx +133 -0
  535. package/src/showcase/Devices.tsx +259 -0
  536. package/src/showcase/FeatureRow.tsx +107 -0
  537. package/src/showcase/Hero.tsx +70 -0
  538. package/src/showcase/PhotoSearchConcept.tsx +50 -0
  539. package/src/showcase/Platforms.tsx +49 -0
  540. package/src/showcase/ProductBand.tsx +148 -0
  541. package/src/showcase/Roadmap.tsx +115 -0
  542. package/src/showcase/RouteDiagram.tsx +56 -0
  543. package/src/showcase/ServerUnit.tsx +191 -0
  544. package/src/showcase/Stage.tsx +160 -0
  545. package/src/showcase/Status.tsx +107 -0
  546. package/src/showcase/StepFlow.tsx +48 -0
  547. package/src/showcase/devices.css +441 -0
  548. package/src/showcase/index.ts +34 -0
  549. package/src/showcase/server-unit.css +258 -0
  550. package/src/showcase/stage.css +175 -0
  551. package/src/styles.css +5 -0
  552. package/src/testing.ts +34 -0
  553. package/src/typography/Link.tsx +105 -0
  554. package/src/typography/Typography.tsx +113 -0
  555. package/src/typography/index.ts +3 -0
package/README.md CHANGED
@@ -1,3 +1,25 @@
1
- # Temporary Holding Version
1
+ # @lar-works/design-system
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Lar's design system: tokens, base styles and every visual component the Lar web apps use, built on React 19,
4
+ Tailwind CSS 4 and ninna-ui, with lucide icons. Browse it in [Storybook](https://maddec01.github.io/lar-web/).
5
+
6
+ ```sh
7
+ pnpm add @lar-works/design-system
8
+ ```
9
+
10
+ ```css
11
+ /* the app's CSS entry */
12
+ @import '@lar-works/design-system/styles.css';
13
+ ```
14
+
15
+ ```tsx
16
+ import { Button, DesignSystemProvider } from '@lar-works/design-system';
17
+ import { PlusIcon } from '@lar-works/design-system/icons';
18
+
19
+ <DesignSystemProvider labels={translatedLabels}>
20
+ <Button leftIcon={<PlusIcon />}>Add library</Button>
21
+ </DesignSystemProvider>;
22
+ ```
23
+
24
+ Apps compose these components and never style anything themselves; `@lar-works/config`'s lint rules enforce it.
25
+ `@lar-works/design-system/testing` has helpers for apps' jsdom test setup.
@@ -0,0 +1,25 @@
1
+ import { ButtonProps } from "@ninna-ui/primitives";
2
+ declare const recipes: {
3
+ readonly primary: 'border-primary bg-primary text-primary-content shadow-xs shadow-primary/24 inset-shadow-[0_1px_rgb(255_255_255/16%)] hover:bg-primary/90 active:shadow-none active:inset-shadow-[0_1px_rgb(0_0_0/8%)]';
4
+ readonly secondary: "border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-400/30 dark:hover:bg-base-400/60 [&_[data-slot=icon]]:text-base-700";
5
+ readonly quiet: "border-transparent text-base-content hover:bg-base-200 data-[state=open]:bg-base-200 [&_[data-slot=icon]]:text-base-700";
6
+ readonly row: "border-transparent text-base-content hover:bg-base-200 data-[state=open]:bg-base-200 [&_[data-slot=icon]]:text-base-700 h-auto min-h-8 min-w-0 max-w-full justify-start whitespace-normal px-0 py-1 text-left text-xs font-normal text-base-700 hover:bg-transparent hover:text-base-content sm:h-auto active:scale-100";
7
+ readonly subtle: 'border-transparent bg-base-200 text-base-content hover:bg-base-300/70 dark:bg-base-300 dark:hover:bg-base-400';
8
+ readonly destructive: 'border-danger bg-danger text-white shadow-xs shadow-danger/24 inset-shadow-[0_1px_rgb(255_255_255/16%)] hover:bg-danger/90 active:shadow-none';
9
+ readonly 'destructive-quiet': 'border-transparent text-(--lar-danger-text) hover:bg-danger/8 dark:hover:bg-danger/16 [&_[data-slot=icon]]:text-current';
10
+ readonly choice: "border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-400/30 dark:hover:bg-base-400/60 [&_[data-slot=icon]]:text-base-700";
11
+ readonly context: "border-transparent text-base-content hover:bg-base-200 data-[state=open]:bg-base-200 [&_[data-slot=icon]]:text-base-700 h-11 min-w-0 gap-1.5 px-2 lg:max-w-48 lg:pointer-fine:h-8";
12
+ readonly summary: "border-transparent text-base-content hover:bg-base-200 data-[state=open]:bg-base-200 [&_[data-slot=icon]]:text-base-700 h-7 min-w-0 px-1.5 sm:h-7";
13
+ readonly avatar: 'size-7 rounded-full border-transparent p-0 hover:bg-transparent sm:h-7 [&>*]:size-7';
14
+ readonly status: 'h-4 min-w-0 max-w-full justify-start gap-1.5 rounded-sm border-transparent px-0 text-xs font-normal text-base-700 hover:bg-transparent hover:text-base-content sm:h-4 active:scale-100 [&>svg]:size-3 [&>svg]:shrink-0';
15
+ };
16
+ type ButtonProps$1 = Omit<ButtonProps, 'color' | 'radius' | 'size' | 'variant'> & {
17
+ variant?: keyof typeof recipes;
18
+ selected?: boolean;
19
+ };
20
+ declare const Button$1: import("react").ForwardRefExoticComponent<Omit<ButtonProps, "color" | "radius" | "size" | "variant"> & {
21
+ variant?: keyof typeof recipes;
22
+ selected?: boolean;
23
+ } & import("react").RefAttributes<HTMLButtonElement>>;
24
+ export { Button$1 as Button, ButtonProps$1 as ButtonProps };
25
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1,55 @@
1
+ import { tabbable } from "../foundations/KeyboardFocus.js";
2
+ import { Button } from "@ninna-ui/primitives";
3
+ import { forwardRef } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ // src/actions/Button.tsx
6
+ /** T3 Code's button (coss ui): an 8px-radius control, 36px on touch and 32px with a pointer, that dips to
7
+ * 97% while pressed. Every recipe sets its own colours, so ninna-ui only supplies behaviour. */
8
+ const base = "h-9 gap-2 rounded-md border px-[11px] text-sm font-medium whitespace-nowrap transition-[background-color,box-shadow,scale,color] duration-150 active:scale-[0.97] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary focus-visible:ring-offset-0 disabled:opacity-64 sm:h-8 [&_[data-slot=icon]>svg]:size-4";
9
+ const outline = "border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-400/30 dark:hover:bg-base-400/60 [&_[data-slot=icon]]:text-base-700";
10
+ const ghost = "border-transparent text-base-content hover:bg-base-200 data-[state=open]:bg-base-200 [&_[data-slot=icon]]:text-base-700";
11
+ const recipes = {
12
+ primary: "border-primary bg-primary text-primary-content shadow-xs shadow-primary/24 inset-shadow-[0_1px_rgb(255_255_255/16%)] hover:bg-primary/90 active:shadow-none active:inset-shadow-[0_1px_rgb(0_0_0/8%)]",
13
+ secondary: outline,
14
+ quiet: ghost,
15
+ row: `${ghost} h-auto min-h-8 min-w-0 max-w-full justify-start whitespace-normal px-0 py-1 text-left text-xs font-normal text-base-700 hover:bg-transparent hover:text-base-content sm:h-auto active:scale-100`,
16
+ subtle: "border-transparent bg-base-200 text-base-content hover:bg-base-300/70 dark:bg-base-300 dark:hover:bg-base-400",
17
+ destructive: "border-danger bg-danger text-white shadow-xs shadow-danger/24 inset-shadow-[0_1px_rgb(255_255_255/16%)] hover:bg-danger/90 active:shadow-none",
18
+ "destructive-quiet": "border-transparent text-(--lar-danger-text) hover:bg-danger/8 dark:hover:bg-danger/16 [&_[data-slot=icon]]:text-current",
19
+ choice: outline,
20
+ context: `${ghost} h-11 min-w-0 gap-1.5 px-2 lg:max-w-48 lg:pointer-fine:h-8`,
21
+ summary: `${ghost} h-7 min-w-0 px-1.5 sm:h-7`,
22
+ avatar: "size-7 rounded-full border-transparent p-0 hover:bg-transparent sm:h-7 [&>*]:size-7",
23
+ status: "h-4 min-w-0 max-w-full justify-start gap-1.5 rounded-sm border-transparent px-0 text-xs font-normal text-base-700 hover:bg-transparent hover:text-base-content sm:h-4 active:scale-100 [&>svg]:size-3 [&>svg]:shrink-0"
24
+ };
25
+ const selectedChoice = "border-primary/60 bg-primary/8 text-base-content ring-1 ring-inset ring-primary/40 hover:bg-primary/12 dark:border-primary/60 dark:bg-primary/16 dark:hover:bg-primary/20";
26
+ const Button$1 = forwardRef(({ variant = "primary", selected, className = "", children, leftIcon, rightIcon, ...props }, ref) => {
27
+ const context = variant === "context";
28
+ return /* @__PURE__ */ jsx(Button, {
29
+ ref,
30
+ ...tabbable,
31
+ ...props,
32
+ size: "sm",
33
+ radius: "lg",
34
+ variant: "ghost",
35
+ color: "neutral",
36
+ "aria-pressed": selected ?? props["aria-pressed"],
37
+ className: `${base} ${variant === "choice" && selected ? selectedChoice : recipes[variant]} ${selected && variant !== "choice" ? "bg-base-200" : ""} ${className}`,
38
+ leftIcon: context ? /* @__PURE__ */ jsx("span", {
39
+ className: "text-(--color-header-icon) [&>svg]:size-4",
40
+ children: leftIcon
41
+ }) : leftIcon,
42
+ rightIcon: context ? /* @__PURE__ */ jsx("span", {
43
+ className: "text-base-700 [&>svg]:size-3.5",
44
+ children: rightIcon
45
+ }) : rightIcon,
46
+ children: context ? /* @__PURE__ */ jsx("span", {
47
+ className: "truncate",
48
+ children
49
+ }) : children
50
+ });
51
+ });
52
+ Button$1.displayName = "Button";
53
+ export { Button$1 as Button };
54
+
55
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","names":["Button","NinnaButton"],"sources":["../../src/actions/Button.tsx"],"sourcesContent":["import { Button as NinnaButton, type ButtonProps as NinnaButtonProps } from '@ninna-ui/primitives';\nimport { forwardRef } from 'react';\n\nimport { tabbable } from '../foundations/KeyboardFocus';\n\n/** T3 Code's button (coss ui): an 8px-radius control, 36px on touch and 32px with a pointer, that dips to\n * 97% while pressed. Every recipe sets its own colours, so ninna-ui only supplies behaviour. */\nconst base =\n 'h-9 gap-2 rounded-md border px-[11px] text-sm font-medium whitespace-nowrap transition-[background-color,box-shadow,scale,color] duration-150 active:scale-[0.97] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary focus-visible:ring-offset-0 disabled:opacity-64 sm:h-8 [&_[data-slot=icon]>svg]:size-4';\n\nconst outline =\n 'border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-400/30 dark:hover:bg-base-400/60 [&_[data-slot=icon]]:text-base-700';\nconst ghost =\n 'border-transparent text-base-content hover:bg-base-200 data-[state=open]:bg-base-200 [&_[data-slot=icon]]:text-base-700';\n\nconst recipes = {\n primary:\n 'border-primary bg-primary text-primary-content shadow-xs shadow-primary/24 inset-shadow-[0_1px_rgb(255_255_255/16%)] hover:bg-primary/90 active:shadow-none active:inset-shadow-[0_1px_rgb(0_0_0/8%)]',\n secondary: outline,\n quiet: ghost,\n row: `${ghost} h-auto min-h-8 min-w-0 max-w-full justify-start whitespace-normal px-0 py-1 text-left text-xs font-normal text-base-700 hover:bg-transparent hover:text-base-content sm:h-auto active:scale-100`,\n subtle: 'border-transparent bg-base-200 text-base-content hover:bg-base-300/70 dark:bg-base-300 dark:hover:bg-base-400',\n destructive:\n 'border-danger bg-danger text-white shadow-xs shadow-danger/24 inset-shadow-[0_1px_rgb(255_255_255/16%)] hover:bg-danger/90 active:shadow-none',\n 'destructive-quiet':\n 'border-transparent text-(--lar-danger-text) hover:bg-danger/8 dark:hover:bg-danger/16 [&_[data-slot=icon]]:text-current',\n choice: outline,\n context: `${ghost} h-11 min-w-0 gap-1.5 px-2 lg:max-w-48 lg:pointer-fine:h-8`,\n summary: `${ghost} h-7 min-w-0 px-1.5 sm:h-7`,\n avatar: 'size-7 rounded-full border-transparent p-0 hover:bg-transparent sm:h-7 [&>*]:size-7',\n status: 'h-4 min-w-0 max-w-full justify-start gap-1.5 rounded-sm border-transparent px-0 text-xs font-normal text-base-700 hover:bg-transparent hover:text-base-content sm:h-4 active:scale-100 [&>svg]:size-3 [&>svg]:shrink-0',\n} as const;\n\nconst selectedChoice =\n 'border-primary/60 bg-primary/8 text-base-content ring-1 ring-inset ring-primary/40 hover:bg-primary/12 dark:border-primary/60 dark:bg-primary/16 dark:hover:bg-primary/20';\n\nexport type ButtonProps = Omit<NinnaButtonProps, 'color' | 'radius' | 'size' | 'variant'> & {\n variant?: keyof typeof recipes;\n selected?: boolean;\n};\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ variant = 'primary', selected, className = '', children, leftIcon, rightIcon, ...props }, ref) => {\n const context = variant === 'context';\n\n return (\n <NinnaButton\n ref={ref}\n {...tabbable}\n {...props}\n size=\"sm\"\n radius=\"lg\"\n variant=\"ghost\"\n color=\"neutral\"\n aria-pressed={selected ?? props['aria-pressed']}\n className={`${base} ${variant === 'choice' && selected ? selectedChoice : recipes[variant]} ${selected && variant !== 'choice' ? 'bg-base-200' : ''} ${className}`}\n leftIcon={\n context ? <span className=\"text-(--color-header-icon) [&>svg]:size-4\">{leftIcon}</span> : leftIcon\n }\n rightIcon={context ? <span className=\"text-base-700 [&>svg]:size-3.5\">{rightIcon}</span> : rightIcon}\n >\n {context ? <span className=\"truncate\">{children}</span> : children}\n </NinnaButton>\n );\n },\n);\n\nButton.displayName = 'Button';\n"],"mappings":";;;;;;;AAOA,MAAM,OACF;AAEJ,MAAM,UACF;AACJ,MAAM,QACF;AAEJ,MAAM,UAAU;CACZ,SACI;CACJ,WAAW;CACX,OAAO;CACP,KAAK,GAAG,MAAM;CACd,QAAQ;CACR,aACI;CACJ,qBACI;CACJ,QAAQ;CACR,SAAS,GAAG,MAAM;CAClB,SAAS,GAAG,MAAM;CAClB,QAAQ;CACR,QAAQ;AACZ;AAEA,MAAM,iBACF;AAOJ,MAAaA,WAAS,YACjB,EAAE,UAAU,WAAW,UAAU,YAAY,IAAI,UAAU,UAAU,WAAW,GAAG,SAAS,QAAQ;CACjG,MAAM,UAAU,YAAY;CAE5B,OACI,oBAACC,QAAD;EACS;EACL,GAAI;EACJ,GAAI;EACJ,MAAK;EACL,QAAO;EACP,SAAQ;EACR,OAAM;EACN,gBAAc,YAAY,MAAM;EAChC,WAAW,GAAG,KAAK,GAAG,YAAY,YAAY,WAAW,iBAAiB,QAAQ,SAAS,GAAG,YAAY,YAAY,WAAW,gBAAgB,GAAG,GAAG;EACvJ,UACI,UAAU,oBAAC,QAAD;GAAM,WAAU;GAA6C,UAAA;EAAe,CAAA,IAAI;EAE9F,WAAW,UAAU,oBAAC,QAAD;GAAM,WAAU;GAAkC,UAAA;EAAgB,CAAA,IAAI;EAE1F,UAAA,UAAU,oBAAC,QAAD;GAAM,WAAU;GAAY;EAAe,CAAA,IAAI;CACjD,CAAA;AAErB,CACJ;AAEA,SAAO,cAAc"}
@@ -0,0 +1,21 @@
1
+ import { AnchorHTMLAttributes, ReactNode } from "react";
2
+ /** The marketing pages' calls to action: the Button recipes at a roomier 44px, as links. */
3
+ declare const recipes: {
4
+ readonly primary: 'border-primary bg-primary text-primary-content shadow-sm shadow-primary/30 inset-shadow-[0_1px_rgb(255_255_255/18%)] hover:bg-[color-mix(in_srgb,var(--color-primary)_88%,white)] active:shadow-none';
5
+ readonly secondary: 'border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-300/40 dark:hover:bg-base-400/50';
6
+ readonly inverse: 'border-transparent bg-base-content text-base-50 shadow-sm hover:bg-[color-mix(in_srgb,var(--color-base-content)_86%,transparent)]';
7
+ readonly quiet: 'border-transparent text-base-content hover:text-primary dark:hover:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]';
8
+ };
9
+ export interface ButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className' | 'style'> {
10
+ href: string;
11
+ variant?: keyof typeof recipes;
12
+ size?: 'md' | 'lg';
13
+ icon?: ReactNode;
14
+ /** Shows an arrow that nudges forward on hover. */
15
+ arrow?: boolean;
16
+ external?: boolean;
17
+ onNavigate?: (href: string) => void;
18
+ }
19
+ export declare function ButtonLink({ variant, size, icon, arrow, external, onNavigate, onClick, children, href, ...props }: ButtonLinkProps): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=ButtonLink.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { tabbable } from "../foundations/KeyboardFocus.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { ArrowRightIcon } from "lucide-react";
4
+ // src/actions/ButtonLink.tsx
5
+ /** The marketing pages' calls to action: the Button recipes at a roomier 44px, as links. */
6
+ const recipes = {
7
+ primary: "border-primary bg-primary text-primary-content shadow-sm shadow-primary/30 inset-shadow-[0_1px_rgb(255_255_255/18%)] hover:bg-[color-mix(in_srgb,var(--color-primary)_88%,white)] active:shadow-none",
8
+ secondary: "border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-300/40 dark:hover:bg-base-400/50",
9
+ inverse: "border-transparent bg-base-content text-base-50 shadow-sm hover:bg-[color-mix(in_srgb,var(--color-base-content)_86%,transparent)]",
10
+ quiet: "border-transparent text-base-content hover:text-primary dark:hover:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]"
11
+ };
12
+ function ButtonLink({ variant = "primary", size = "lg", icon, arrow, external, onNavigate, onClick, children, href, ...props }) {
13
+ return /* @__PURE__ */ jsxs("a", {
14
+ ...tabbable,
15
+ ...props,
16
+ href,
17
+ ...external ? {
18
+ target: "_blank",
19
+ rel: "noreferrer"
20
+ } : {},
21
+ onClick: (event) => {
22
+ onClick?.(event);
23
+ if (!onNavigate || external || event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
24
+ event.preventDefault();
25
+ onNavigate(href);
26
+ },
27
+ className: `group/button focus-visible:outline-primary inline-flex shrink-0 items-center justify-center gap-2 rounded-[0.625rem] border font-medium whitespace-nowrap transition-[background-color,box-shadow,scale,color] duration-150 select-none focus-visible:outline-2 focus-visible:outline-offset-2 active:scale-[0.97] [&_svg]:size-4 [&_svg]:shrink-0 ${size === "lg" ? "h-11 text-[15px]" : "h-9 text-sm"} ${variant === "quiet" ? "px-0" : size === "lg" ? "px-[1.125rem]" : "px-3.5"} ${recipes[variant]}`,
28
+ children: [
29
+ icon,
30
+ children,
31
+ arrow ? /* @__PURE__ */ jsx("span", {
32
+ className: "-mr-0.5 inline-flex transition-transform duration-200 group-hover/button:translate-x-0.5",
33
+ children: /* @__PURE__ */ jsx(ArrowRightIcon, {})
34
+ }) : null
35
+ ]
36
+ });
37
+ }
38
+ export { ButtonLink };
39
+
40
+ //# sourceMappingURL=ButtonLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonLink.js","names":[],"sources":["../../src/actions/ButtonLink.tsx"],"sourcesContent":["import { ArrowRightIcon } from 'lucide-react';\nimport type { AnchorHTMLAttributes, ReactNode } from 'react';\n\nimport { tabbable } from '../foundations/KeyboardFocus';\n\n/** The marketing pages' calls to action: the Button recipes at a roomier 44px, as links. */\nconst recipes = {\n primary:\n 'border-primary bg-primary text-primary-content shadow-sm shadow-primary/30 inset-shadow-[0_1px_rgb(255_255_255/18%)] hover:bg-[color-mix(in_srgb,var(--color-primary)_88%,white)] active:shadow-none',\n secondary:\n 'border-base-400/90 bg-base-100 text-base-content shadow-xs/5 hover:bg-base-200/70 dark:border-base-400 dark:bg-base-300/40 dark:hover:bg-base-400/50',\n inverse:\n 'border-transparent bg-base-content text-base-50 shadow-sm hover:bg-[color-mix(in_srgb,var(--color-base-content)_86%,transparent)]',\n quiet: 'border-transparent text-base-content hover:text-primary dark:hover:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]',\n} as const;\n\nexport interface ButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className' | 'style'> {\n href: string;\n variant?: keyof typeof recipes;\n size?: 'md' | 'lg';\n icon?: ReactNode;\n /** Shows an arrow that nudges forward on hover. */\n arrow?: boolean;\n external?: boolean;\n onNavigate?: (href: string) => void;\n}\n\nexport function ButtonLink({\n variant = 'primary',\n size = 'lg',\n icon,\n arrow,\n external,\n onNavigate,\n onClick,\n children,\n href,\n ...props\n}: ButtonLinkProps) {\n return (\n <a\n {...tabbable}\n {...props}\n href={href}\n {...(external ? { target: '_blank', rel: 'noreferrer' } : {})}\n onClick={(event) => {\n onClick?.(event);\n\n if (\n !onNavigate ||\n external ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n )\n return;\n\n event.preventDefault();\n onNavigate(href);\n }}\n className={`group/button focus-visible:outline-primary inline-flex shrink-0 items-center justify-center gap-2 rounded-[0.625rem] border font-medium whitespace-nowrap transition-[background-color,box-shadow,scale,color] duration-150 select-none focus-visible:outline-2 focus-visible:outline-offset-2 active:scale-[0.97] [&_svg]:size-4 [&_svg]:shrink-0 ${size === 'lg' ? 'h-11 text-[15px]' : 'h-9 text-sm'} ${variant === 'quiet' ? 'px-0' : size === 'lg' ? 'px-[1.125rem]' : 'px-3.5'} ${recipes[variant]}`}\n >\n {icon}\n {children}\n {arrow ? (\n <span className=\"-mr-0.5 inline-flex transition-transform duration-200 group-hover/button:translate-x-0.5\">\n <ArrowRightIcon />\n </span>\n ) : null}\n </a>\n );\n}\n"],"mappings":";;;;;AAMA,MAAM,UAAU;CACZ,SACI;CACJ,WACI;CACJ,SACI;CACJ,OAAO;AACX;AAaA,SAAgB,WAAW,EACvB,UAAU,WACV,OAAO,MACP,MACA,OACA,UACA,YACA,SACA,UACA,MACA,GAAG,SACa;CAChB,OACI,qBAAC,KAAD;EACI,GAAI;EACJ,GAAI;EACE;EACN,GAAK,WAAW;GAAE,QAAQ;GAAU,KAAK;EAAa,IAAI,CAAC;EAC3D,UAAU,UAAU;GAChB,UAAU,KAAK;GAEf,IACI,CAAC,cACD,YACA,MAAM,oBACN,MAAM,WAAW,KACjB,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,QAEN;GAEJ,MAAM,eAAe;GACrB,WAAW,IAAI;EACnB;EACA,WAAW,sVAAsV,SAAS,OAAO,qBAAqB,cAAc,GAAG,YAAY,UAAU,SAAS,SAAS,OAAO,kBAAkB,SAAS,GAAG,QAAQ;EAvBhf,UAAA;GAyBK;GACA;GACA,QACG,oBAAC,QAAD;IAAM,WAAU;IACZ,UAAA,oBAAC,gBAAD,CAAiB,CAAA;GACf,CAAA,IACN;EACL;;AAEX"}
@@ -0,0 +1,14 @@
1
+ import { StatusTone } from "../feedback/StatusIndicator.js";
2
+ import { IconButtonProps } from "@ninna-ui/primitives";
3
+ type IconButtonProps$1 = Omit<IconButtonProps, 'color' | 'radius' | 'size' | 'variant'> & {
4
+ variant?: 'header' | 'quiet' | 'title-bar';
5
+ tone?: StatusTone | 'accent';
6
+ notification?: string;
7
+ };
8
+ declare const IconButton$1: import("react").ForwardRefExoticComponent<Omit<IconButtonProps, "color" | "radius" | "size" | "variant"> & {
9
+ variant?: 'header' | 'quiet' | 'title-bar';
10
+ tone?: StatusTone | 'accent';
11
+ notification?: string;
12
+ } & import("react").RefAttributes<HTMLButtonElement>>;
13
+ export { IconButton$1 as IconButton, IconButtonProps$1 as IconButtonProps };
14
+ //# sourceMappingURL=IconButton.d.ts.map
@@ -0,0 +1,29 @@
1
+ import { StatusIndicator } from "../feedback/StatusIndicator.js";
2
+ import { tabbable } from "../foundations/KeyboardFocus.js";
3
+ import { IconButton } from "@ninna-ui/primitives";
4
+ import { forwardRef } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ // src/actions/IconButton.tsx
7
+ const IconButton$1 = forwardRef(({ variant = "quiet", tone = "neutral", className = "", notification, icon, ...props }, ref) => /* @__PURE__ */ jsx(IconButton, {
8
+ ref,
9
+ ...tabbable,
10
+ "aria-description": notification,
11
+ ...props,
12
+ icon: notification ? /* @__PURE__ */ jsxs("span", {
13
+ className: "relative block size-full",
14
+ children: [icon, /* @__PURE__ */ jsx(StatusIndicator, {
15
+ tone: "warning",
16
+ size: "sm",
17
+ className: "ring-base-100 absolute -top-0.5 -right-0.5 ring-2"
18
+ })]
19
+ }) : icon,
20
+ variant: "ghost",
21
+ color: tone === "accent" ? "primary" : tone,
22
+ size: "sm",
23
+ radius: "lg",
24
+ className: (variant === "header" ? "text-base-700 hover:bg-base-200 hover:text-base-content data-[state=open]:bg-base-200 data-[state=open]:text-base-content size-8 rounded-md p-0 before:-inset-1 **:data-[slot=icon]:size-[18px] " : variant === "title-bar" ? "text-base-700 hover:bg-base-200 hover:text-base-content data-[state=open]:bg-base-200 data-[state=open]:text-base-content size-7 rounded-md p-0 before:-inset-1.5 **:data-[slot=icon]:size-4 " : tone === "neutral" ? "text-base-700 hover:bg-base-200 hover:text-base-content data-[state=open]:bg-base-200 rounded-md " : "rounded-md ") + "transition-[background-color,color,scale] active:scale-[0.94] [&_svg]:size-full " + className
25
+ }));
26
+ IconButton$1.displayName = "IconButton";
27
+ export { IconButton$1 as IconButton };
28
+
29
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","names":["IconButton","NinnaIconButton"],"sources":["../../src/actions/IconButton.tsx"],"sourcesContent":["import { IconButton as NinnaIconButton, type IconButtonProps as NinnaIconButtonProps } from '@ninna-ui/primitives';\nimport { forwardRef } from 'react';\n\nimport { StatusIndicator, type StatusTone } from '../feedback/StatusIndicator';\nimport { tabbable } from '../foundations/KeyboardFocus';\n\nexport type IconButtonProps = Omit<NinnaIconButtonProps, 'color' | 'radius' | 'size' | 'variant'> & {\n variant?: 'header' | 'quiet' | 'title-bar';\n tone?: StatusTone | 'accent';\n notification?: string;\n};\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ variant = 'quiet', tone = 'neutral', className = '', notification, icon, ...props }, ref) => (\n <NinnaIconButton\n ref={ref}\n {...tabbable}\n aria-description={notification}\n {...props}\n icon={\n notification ? (\n <span className=\"relative block size-full\">\n {icon}\n <StatusIndicator\n tone=\"warning\"\n size=\"sm\"\n className=\"ring-base-100 absolute -top-0.5 -right-0.5 ring-2\"\n />\n </span>\n ) : (\n icon\n )\n }\n variant=\"ghost\"\n color={tone === 'accent' ? 'primary' : tone}\n size=\"sm\"\n radius=\"lg\"\n className={\n // T3 Code's ghost icon button: muted until hovered, on an accent fill.\n (variant === 'header'\n ? 'text-base-700 hover:bg-base-200 hover:text-base-content data-[state=open]:bg-base-200 data-[state=open]:text-base-content size-8 rounded-md p-0 before:-inset-1 **:data-[slot=icon]:size-[18px] '\n : variant === 'title-bar'\n ? // The title bar's 28px row of controls, with 16px icons.\n 'text-base-700 hover:bg-base-200 hover:text-base-content data-[state=open]:bg-base-200 data-[state=open]:text-base-content size-7 rounded-md p-0 before:-inset-1.5 **:data-[slot=icon]:size-4 '\n : tone === 'neutral'\n ? 'text-base-700 hover:bg-base-200 hover:text-base-content data-[state=open]:bg-base-200 rounded-md '\n : 'rounded-md ') +\n 'transition-[background-color,color,scale] active:scale-[0.94] [&_svg]:size-full ' +\n className\n }\n />\n ),\n);\n\nIconButton.displayName = 'IconButton';\n"],"mappings":";;;;;;AAYA,MAAaA,eAAa,YACrB,EAAE,UAAU,SAAS,OAAO,WAAW,YAAY,IAAI,cAAc,MAAM,GAAG,SAAS,QACpF,oBAACC,YAAD;CACS;CACL,GAAI;CACJ,oBAAkB;CAClB,GAAI;CACJ,MACI,eACI,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACK,MACD,oBAAC,iBAAD;GACI,MAAK;GACL,MAAK;GACL,WAAU;EACb,CAAA,CACC;CAEN,CAAA,IAAA;CAGR,SAAQ;CACR,OAAO,SAAS,WAAW,YAAY;CACvC,MAAK;CACL,QAAO;CACP,YAEK,YAAY,WACP,qMACA,YAAY,cAEV,kMACA,SAAS,YACP,sGACA,iBACV,qFACA;AAEP,CAAA,CAET;AAEA,aAAW,cAAc"}
@@ -0,0 +1,7 @@
1
+ import { ThemePreference } from "../foundations/Theme.js";
2
+ /** Three small segments for the colour scheme: follow the system, light or dark. */
3
+ export declare function ThemeSwitch({ value, onChange }: {
4
+ value: ThemePreference;
5
+ onChange: (value: ThemePreference) => void;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=ThemeSwitch.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { useDesignSystemLabels } from "../foundations/DesignSystemProvider.js";
2
+ import { tabbable } from "../foundations/KeyboardFocus.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { MonitorIcon, MoonIcon, SunIcon } from "lucide-react";
5
+ // src/actions/ThemeSwitch.tsx
6
+ const choices = [
7
+ {
8
+ value: "system",
9
+ Icon: MonitorIcon
10
+ },
11
+ {
12
+ value: "light",
13
+ Icon: SunIcon
14
+ },
15
+ {
16
+ value: "dark",
17
+ Icon: MoonIcon
18
+ }
19
+ ];
20
+ /** Three small segments for the colour scheme: follow the system, light or dark. */
21
+ function ThemeSwitch({ value, onChange }) {
22
+ const labels = useDesignSystemLabels().theme;
23
+ return /* @__PURE__ */ jsx("div", {
24
+ role: "radiogroup",
25
+ "aria-label": labels.label,
26
+ className: "border-base-300 bg-base-100/70 dark:bg-base-200/60 inline-flex h-8 items-center gap-0.5 rounded-full border p-0.5",
27
+ children: choices.map(({ value: choice, Icon }) => /* @__PURE__ */ jsx("button", {
28
+ ...tabbable,
29
+ type: "button",
30
+ role: "radio",
31
+ "aria-checked": value === choice,
32
+ "aria-label": labels[choice],
33
+ title: labels[choice],
34
+ onClick: () => onChange(choice),
35
+ className: "text-base-600 hover:text-base-content aria-checked:bg-base-200 aria-checked:text-base-content focus-visible:outline-primary dark:aria-checked:bg-base-400/70 inline-flex size-7 items-center justify-center rounded-full transition-colors focus-visible:outline-2 aria-checked:shadow-xs/10 [&_svg]:size-[15px]",
36
+ children: /* @__PURE__ */ jsx(Icon, {})
37
+ }, choice))
38
+ });
39
+ }
40
+ export { ThemeSwitch };
41
+
42
+ //# sourceMappingURL=ThemeSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeSwitch.js","names":[],"sources":["../../src/actions/ThemeSwitch.tsx"],"sourcesContent":["import { MonitorIcon, MoonIcon, SunIcon } from 'lucide-react';\n\nimport { useDesignSystemLabels } from '../foundations/DesignSystemProvider';\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport type { ThemePreference } from '../foundations/Theme';\n\nconst choices = [\n { value: 'system', Icon: MonitorIcon },\n { value: 'light', Icon: SunIcon },\n { value: 'dark', Icon: MoonIcon },\n] as const;\n\n/** Three small segments for the colour scheme: follow the system, light or dark. */\nexport function ThemeSwitch({\n value,\n onChange,\n}: {\n value: ThemePreference;\n onChange: (value: ThemePreference) => void;\n}) {\n const labels = useDesignSystemLabels().theme;\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={labels.label}\n className=\"border-base-300 bg-base-100/70 dark:bg-base-200/60 inline-flex h-8 items-center gap-0.5 rounded-full border p-0.5\"\n >\n {choices.map(({ value: choice, Icon }) => (\n <button\n key={choice}\n {...tabbable}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === choice}\n aria-label={labels[choice]}\n title={labels[choice]}\n onClick={() => onChange(choice)}\n className=\"text-base-600 hover:text-base-content aria-checked:bg-base-200 aria-checked:text-base-content focus-visible:outline-primary dark:aria-checked:bg-base-400/70 inline-flex size-7 items-center justify-center rounded-full transition-colors focus-visible:outline-2 aria-checked:shadow-xs/10 [&_svg]:size-[15px]\"\n >\n <Icon />\n </button>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;AAMA,MAAM,UAAU;CACZ;EAAE,OAAO;EAAU,MAAM;CAAY;CACrC;EAAE,OAAO;EAAS,MAAM;CAAQ;CAChC;EAAE,OAAO;EAAQ,MAAM;CAAS;AACpC;;AAGA,SAAgB,YAAY,EACxB,OACA,YAID;CACC,MAAM,SAAS,sBAAsB,CAAC,CAAC;CAEvC,OACI,oBAAC,OAAD;EACI,MAAK;EACL,cAAY,OAAO;EACnB,WAAU;EAET,UAAA,QAAQ,KAAK,EAAE,OAAO,QAAQ,WAC3B,oBAAC,UAAD;GAEI,GAAI;GACJ,MAAK;GACL,MAAK;GACL,gBAAc,UAAU;GACxB,cAAY,OAAO;GACnB,OAAO,OAAO;GACd,eAAe,SAAS,MAAM;GAC9B,WAAU;GAEV,UAAA,oBAAC,MAAD,CAAO,CAAA;EACH,GAXC,MAWD,CACX;CACA,CAAA;AAEb"}
@@ -0,0 +1,5 @@
1
+ import { Button, ButtonProps } from "./Button.js";
2
+ import { IconButton, IconButtonProps } from "./IconButton.js";
3
+ import { ButtonLink, ButtonLinkProps } from "./ButtonLink.js";
4
+ import { ThemeSwitch } from "./ThemeSwitch.js";
5
+ export { Button, ButtonLink, type ButtonLinkProps, type ButtonProps, IconButton, type IconButtonProps, ThemeSwitch };
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from "react";
2
+ export declare function CollectionSectionHeader({ children }: {
3
+ children: ReactNode;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=CollectionSectionHeader.d.ts.map
@@ -0,0 +1,18 @@
1
+ import { Text } from "../typography/Typography.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ // src/collections/CollectionSectionHeader.tsx
4
+ function CollectionSectionHeader({ children }) {
5
+ return /* @__PURE__ */ jsx("div", {
6
+ className: "border-base-300 bg-base-100/65 flex h-10 items-center border-b px-3",
7
+ role: "presentation",
8
+ children: /* @__PURE__ */ jsx(Text, {
9
+ as: "span",
10
+ className: "shrink-0 tracking-[0.12em]",
11
+ variant: "overline",
12
+ children
13
+ })
14
+ });
15
+ }
16
+ export { CollectionSectionHeader };
17
+
18
+ //# sourceMappingURL=CollectionSectionHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionSectionHeader.js","names":[],"sources":["../../src/collections/CollectionSectionHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Text } from '../typography/Typography';\n\nexport function CollectionSectionHeader({ children }: { children: ReactNode }) {\n return (\n <div className=\"border-base-300 bg-base-100/65 flex h-10 items-center border-b px-3\" role=\"presentation\">\n <Text as=\"span\" className=\"shrink-0 tracking-[0.12em]\" variant=\"overline\">\n {children}\n </Text>\n </div>\n );\n}\n"],"mappings":";;;AAIA,SAAgB,wBAAwB,EAAE,YAAqC;CAC3E,OACI,oBAAC,OAAD;EAAK,WAAU;EAAsE,MAAK;EACtF,UAAA,oBAAC,MAAD;GAAM,IAAG;GAAO,WAAU;GAA6B,SAAQ;GAC1D;EACC,CAAA;CACL,CAAA;AAEb"}
@@ -0,0 +1,37 @@
1
+ import { ReactNode } from "react";
2
+ declare const variants: {
3
+ readonly page: {
4
+ readonly layout: 'max-w-lg px-6 py-16';
5
+ readonly icon: '[&>svg]:size-8';
6
+ readonly space: 'group';
7
+ };
8
+ /** A placeholder outlining the content that will fill the region. */
9
+ readonly framed: {
10
+ readonly layout: 'max-w-lg px-6 py-16';
11
+ readonly icon: '[&>svg]:size-8';
12
+ readonly space: 'group';
13
+ };
14
+ /** Fits inside a panel or popover instead of owning a page region. */
15
+ readonly compact: {
16
+ readonly layout: 'max-w-64 px-3 py-6';
17
+ readonly icon: '[&>svg]:size-6';
18
+ readonly space: 'related';
19
+ };
20
+ /** A quiet empty state with the same surface as dashboard content. */
21
+ readonly panel: {
22
+ readonly layout: 'max-w-md px-4 py-5';
23
+ readonly icon: '[&>svg]:size-6';
24
+ readonly space: 'related';
25
+ };
26
+ };
27
+ interface CollectionStateProps {
28
+ actionLabel?: string;
29
+ description: string;
30
+ icon?: ReactNode;
31
+ onAction?: () => void;
32
+ title: string;
33
+ variant?: keyof typeof variants;
34
+ }
35
+ export declare function CollectionState({ actionLabel, description, icon, onAction, title, variant }: CollectionStateProps): import("react").JSX.Element;
36
+ export {};
37
+ //# sourceMappingURL=CollectionState.d.ts.map
@@ -0,0 +1,69 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { Stack } from "../layout/Flow.js";
3
+ import { Heading, Text } from "../typography/Typography.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/collections/CollectionState.tsx
6
+ const page = {
7
+ layout: "max-w-lg px-6 py-16",
8
+ icon: "[&>svg]:size-8",
9
+ space: "group"
10
+ };
11
+ const variants = {
12
+ page,
13
+ /** A placeholder outlining the content that will fill the region. */
14
+ framed: page,
15
+ /** Fits inside a panel or popover instead of owning a page region. */
16
+ compact: {
17
+ layout: "max-w-64 px-3 py-6",
18
+ icon: "[&>svg]:size-6",
19
+ space: "related"
20
+ },
21
+ /** A quiet empty state with the same surface as dashboard content. */
22
+ panel: {
23
+ layout: "max-w-md px-4 py-5",
24
+ icon: "[&>svg]:size-6",
25
+ space: "related"
26
+ }
27
+ };
28
+ function CollectionState({ actionLabel, description, icon, onAction, title, variant = "page" }) {
29
+ const compact = variant === "compact" || variant === "panel";
30
+ const state = /* @__PURE__ */ jsxs(Stack, {
31
+ align: "center",
32
+ space: variants[variant].space,
33
+ className: `mx-auto text-center ${variants[variant].layout}`,
34
+ children: [
35
+ icon ? /* @__PURE__ */ jsx("span", {
36
+ className: `text-base-500 ${variants[variant].icon}`,
37
+ children: icon
38
+ }) : null,
39
+ /* @__PURE__ */ jsxs(Stack, {
40
+ space: "tight",
41
+ children: [compact ? /* @__PURE__ */ jsx(Text, {
42
+ variant: "label",
43
+ children: title
44
+ }) : /* @__PURE__ */ jsx(Heading, {
45
+ as: "h2",
46
+ variant: "subsection",
47
+ children: title
48
+ }), /* @__PURE__ */ jsx(Text, {
49
+ variant: compact ? "caption" : "description",
50
+ tone: "muted",
51
+ children: description
52
+ })]
53
+ }),
54
+ actionLabel && onAction ? /* @__PURE__ */ jsx(Button, {
55
+ type: "button",
56
+ onClick: onAction,
57
+ variant: "secondary",
58
+ children: actionLabel
59
+ }) : null
60
+ ]
61
+ });
62
+ return variant === "framed" || variant === "panel" ? /* @__PURE__ */ jsx("div", {
63
+ className: variant === "panel" ? "border-base-300 bg-base-100 rounded-xl border" : "border-base-300 rounded-xl border border-dashed",
64
+ children: state
65
+ }) : state;
66
+ }
67
+ export { CollectionState };
68
+
69
+ //# sourceMappingURL=CollectionState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionState.js","names":[],"sources":["../../src/collections/CollectionState.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { Stack } from '../layout/Flow';\nimport { Heading, Text } from '../typography/Typography';\n\nconst page = { layout: 'max-w-lg px-6 py-16', icon: '[&>svg]:size-8', space: 'group' } as const;\nconst variants = {\n page,\n /** A placeholder outlining the content that will fill the region. */\n framed: page,\n /** Fits inside a panel or popover instead of owning a page region. */\n compact: { layout: 'max-w-64 px-3 py-6', icon: '[&>svg]:size-6', space: 'related' },\n /** A quiet empty state with the same surface as dashboard content. */\n panel: { layout: 'max-w-md px-4 py-5', icon: '[&>svg]:size-6', space: 'related' },\n} as const;\n\ninterface CollectionStateProps {\n actionLabel?: string;\n description: string;\n icon?: ReactNode;\n onAction?: () => void;\n title: string;\n variant?: keyof typeof variants;\n}\n\nexport function CollectionState({\n actionLabel,\n description,\n icon,\n onAction,\n title,\n variant = 'page',\n}: CollectionStateProps) {\n const compact = variant === 'compact' || variant === 'panel';\n const state = (\n <Stack\n align=\"center\"\n space={variants[variant].space}\n className={`mx-auto text-center ${variants[variant].layout}`}\n >\n {icon ? <span className={`text-base-500 ${variants[variant].icon}`}>{icon}</span> : null}\n <Stack space=\"tight\">\n {compact ? (\n <Text variant=\"label\">{title}</Text>\n ) : (\n <Heading as=\"h2\" variant=\"subsection\">\n {title}\n </Heading>\n )}\n <Text variant={compact ? 'caption' : 'description'} tone=\"muted\">\n {description}\n </Text>\n </Stack>\n {actionLabel && onAction ? (\n <Button type=\"button\" onClick={onAction} variant=\"secondary\">\n {actionLabel}\n </Button>\n ) : null}\n </Stack>\n );\n\n return variant === 'framed' || variant === 'panel' ? (\n <div\n className={\n variant === 'panel'\n ? 'border-base-300 bg-base-100 rounded-xl border'\n : 'border-base-300 rounded-xl border border-dashed'\n }\n >\n {state}\n </div>\n ) : (\n state\n );\n}\n"],"mappings":";;;;;AAMA,MAAM,OAAO;CAAE,QAAQ;CAAuB,MAAM;CAAkB,OAAO;AAAQ;AACrF,MAAM,WAAW;CACb;;CAEA,QAAQ;;CAER,SAAS;EAAE,QAAQ;EAAsB,MAAM;EAAkB,OAAO;CAAU;;CAElF,OAAO;EAAE,QAAQ;EAAsB,MAAM;EAAkB,OAAO;CAAU;AACpF;AAWA,SAAgB,gBAAgB,EAC5B,aACA,aACA,MACA,UACA,OACA,UAAU,UACW;CACrB,MAAM,UAAU,YAAY,aAAa,YAAY;CACrD,MAAM,QACF,qBAAC,OAAD;EACI,OAAM;EACN,OAAO,SAAS,QAAQ,CAAC;EACzB,WAAW,uBAAuB,SAAS,QAAQ,CAAC;EAHxD,UAAA;GAKK,OAAO,oBAAC,QAAD;IAAM,WAAW,iBAAiB,SAAS,QAAQ,CAAC;IAAS,UAAA;GAAW,CAAA,IAAI;GACpF,qBAAC,OAAD;IAAO,OAAM;IAAb,UAAA,CACK,UACG,oBAAC,MAAD;KAAM,SAAQ;KAAS,UAAA;IAAY,CAAA,IAEnC,oBAAC,SAAD;KAAS,IAAG;KAAK,SAAQ;KACpB,UAAA;IACI,CAAA,GAEb,oBAAC,MAAD;KAAM,SAAS,UAAU,YAAY;KAAe,MAAK;KACpD,UAAA;IACC,CAAA,CACH;;GACN,eAAe,WACZ,oBAAC,QAAD;IAAQ,MAAK;IAAS,SAAS;IAAU,SAAQ;IAC5C,UAAA;GACG,CAAA,IACR;EACD;;CAGX,OAAO,YAAY,YAAY,YAAY,UACvC,oBAAC,OAAD;EACI,WACI,YAAY,UACN,kDACA;EAGT,UAAA;CACA,CAAA,IAEL;AAER"}
@@ -0,0 +1,16 @@
1
+ export declare const columnWidths: {
2
+ readonly primary: 'minmax(0, 2.5fr)';
3
+ readonly secondary: 'minmax(0, 1.5fr)';
4
+ readonly value: 'minmax(0, 1fr)';
5
+ readonly compact: '4rem';
6
+ readonly numeric: '5rem';
7
+ readonly index: '2.5rem';
8
+ readonly action: '1.5rem';
9
+ readonly wide: '14rem';
10
+ };
11
+ export declare const columnBreakpoints: {
12
+ readonly primary: 0;
13
+ readonly secondary: 640;
14
+ readonly tertiary: 900;
15
+ };
16
+ //# sourceMappingURL=CollectionTokens.d.ts.map
@@ -0,0 +1,19 @@
1
+ // src/collections/CollectionTokens.ts
2
+ const columnWidths = {
3
+ primary: "minmax(0, 2.5fr)",
4
+ secondary: "minmax(0, 1.5fr)",
5
+ value: "minmax(0, 1fr)",
6
+ compact: "4rem",
7
+ numeric: "5rem",
8
+ index: "2.5rem",
9
+ action: "1.5rem",
10
+ wide: "14rem"
11
+ };
12
+ const columnBreakpoints = {
13
+ primary: 0,
14
+ secondary: 640,
15
+ tertiary: 900
16
+ };
17
+ export { columnBreakpoints, columnWidths };
18
+
19
+ //# sourceMappingURL=CollectionTokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionTokens.js","names":[],"sources":["../../src/collections/CollectionTokens.ts"],"sourcesContent":["export const columnWidths = {\n primary: 'minmax(0, 2.5fr)',\n secondary: 'minmax(0, 1.5fr)',\n value: 'minmax(0, 1fr)',\n compact: '4rem',\n numeric: '5rem',\n index: '2.5rem',\n action: '1.5rem',\n wide: '14rem',\n} as const;\n\nexport const columnBreakpoints = { primary: 0, secondary: 640, tertiary: 900 } as const;\n"],"mappings":";AAAA,MAAa,eAAe;CACxB,SAAS;CACT,WAAW;CACX,OAAO;CACP,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;AACV;AAEA,MAAa,oBAAoB;CAAE,SAAS;CAAG,WAAW;CAAK,UAAU;AAAI"}
@@ -0,0 +1,36 @@
1
+ import { useLayoutEffect, useState } from "react";
2
+ // src/collections/CollectionViewport.ts
3
+ function useCollectionViewport() {
4
+ const [collectionElement, setCollectionElement] = useState(null);
5
+ const [geometry, setGeometry] = useState({
6
+ scrollMargin: 0,
7
+ width: 0
8
+ });
9
+ useLayoutEffect(() => {
10
+ if (!collectionElement) return;
11
+ const measure = () => {
12
+ const collection = collectionElement.getBoundingClientRect();
13
+ const next = {
14
+ scrollMargin: collection.top + window.scrollY,
15
+ width: collection.width
16
+ };
17
+ setGeometry((current) => current.width === next.width && current.scrollMargin === next.scrollMargin ? current : next);
18
+ };
19
+ const observer = new ResizeObserver(measure);
20
+ observer.observe(collectionElement);
21
+ for (let ancestor = collectionElement.parentElement; ancestor; ancestor = ancestor.parentElement) observer.observe(ancestor);
22
+ window.addEventListener("resize", measure);
23
+ measure();
24
+ return () => {
25
+ observer.disconnect();
26
+ window.removeEventListener("resize", measure);
27
+ };
28
+ }, [collectionElement]);
29
+ return {
30
+ ...geometry,
31
+ setCollectionElement
32
+ };
33
+ }
34
+ export { useCollectionViewport };
35
+
36
+ //# sourceMappingURL=CollectionViewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionViewport.js","names":[],"sources":["../../src/collections/CollectionViewport.ts"],"sourcesContent":["import { useLayoutEffect, useState } from 'react';\n\nexport function useCollectionViewport() {\n const [collectionElement, setCollectionElement] = useState<HTMLDivElement | null>(null);\n const [geometry, setGeometry] = useState({ scrollMargin: 0, width: 0 });\n\n useLayoutEffect(() => {\n if (!collectionElement) return;\n\n const measure = () => {\n const collection = collectionElement.getBoundingClientRect();\n const next = {\n scrollMargin: collection.top + window.scrollY,\n width: collection.width,\n };\n\n setGeometry((current) =>\n current.width === next.width && current.scrollMargin === next.scrollMargin ? current : next,\n );\n };\n const observer = new ResizeObserver(measure);\n\n observer.observe(collectionElement);\n\n // Ancestor sizes can move the collection without changing its own size.\n for (let ancestor = collectionElement.parentElement; ancestor; ancestor = ancestor.parentElement) {\n observer.observe(ancestor);\n }\n\n window.addEventListener('resize', measure);\n measure();\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', measure);\n };\n }, [collectionElement]);\n\n return { ...geometry, setCollectionElement };\n}\n"],"mappings":";;AAEA,SAAgB,wBAAwB;CACpC,MAAM,CAAC,mBAAmB,wBAAwB,SAAgC,IAAI;CACtF,MAAM,CAAC,UAAU,eAAe,SAAS;EAAE,cAAc;EAAG,OAAO;CAAE,CAAC;CAEtE,sBAAsB;EAClB,IAAI,CAAC,mBAAmB;EAExB,MAAM,gBAAgB;GAClB,MAAM,aAAa,kBAAkB,sBAAsB;GAC3D,MAAM,OAAO;IACT,cAAc,WAAW,MAAM,OAAO;IACtC,OAAO,WAAW;GACtB;GAEA,aAAa,YACT,QAAQ,UAAU,KAAK,SAAS,QAAQ,iBAAiB,KAAK,eAAe,UAAU,IAC3F;EACJ;EACA,MAAM,WAAW,IAAI,eAAe,OAAO;EAE3C,SAAS,QAAQ,iBAAiB;EAGlC,KAAK,IAAI,WAAW,kBAAkB,eAAe,UAAU,WAAW,SAAS,eAC/E,SAAS,QAAQ,QAAQ;EAG7B,OAAO,iBAAiB,UAAU,OAAO;EACzC,QAAQ;EAER,aAAa;GACT,SAAS,WAAW;GACpB,OAAO,oBAAoB,UAAU,OAAO;EAChD;CACJ,GAAG,CAAC,iBAAiB,CAAC;CAEtB,OAAO;EAAE,GAAG;EAAU;CAAqB;AAC/C"}
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from "react";
2
+ declare function DataRowRoot({ children, interactive, rowIndex }: {
3
+ children: ReactNode;
4
+ interactive?: boolean;
5
+ rowIndex: number;
6
+ }): import("react").JSX.Element;
7
+ type DataRowPrimaryProps = {
8
+ artwork?: ReactNode;
9
+ detail?: ReactNode;
10
+ loading?: false;
11
+ subtitle?: ReactNode;
12
+ title: string;
13
+ } | {
14
+ artwork?: boolean;
15
+ loading: true;
16
+ subtitle?: boolean;
17
+ };
18
+ declare function DataRowPrimary(props: DataRowPrimaryProps): import("react").JSX.Element;
19
+ export declare const DataRow: typeof DataRowRoot & {
20
+ Primary: typeof DataRowPrimary;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=DataRow.d.ts.map