@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
@@ -0,0 +1,80 @@
1
+ import { Link } from "../typography/Link.js";
2
+ import { Text } from "../typography/Typography.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { CheckIcon } from "lucide-react";
5
+ // src/display/RatingLink.tsx
6
+ /** The sources' own marks and colors, as the Apple apps draw them. Anything else reads by its name. */
7
+ function ratingMark(source) {
8
+ switch (source.trim().toLowerCase()) {
9
+ case "trakt": return {
10
+ name: "Trakt",
11
+ label: "Trakt",
12
+ mark: /* @__PURE__ */ jsx("span", {
13
+ className: "inline-flex size-5 items-center justify-center rounded-full bg-[#ed1c24] text-white [&>svg]:size-3 [&>svg]:stroke-[3]",
14
+ children: /* @__PURE__ */ jsx(CheckIcon, {})
15
+ })
16
+ };
17
+ case "imdb": return {
18
+ name: "IMDb",
19
+ mark: /* @__PURE__ */ jsx("span", {
20
+ className: "inline-flex h-5 items-center rounded-sm bg-[#f5c518] px-1 text-xs font-black text-black",
21
+ children: "IMDb"
22
+ })
23
+ };
24
+ case "rotten tomatoes critics": return {
25
+ name: "Tomatometer",
26
+ mark: /* @__PURE__ */ jsx("span", { children: "🍅" })
27
+ };
28
+ case "rotten tomatoes audience": return {
29
+ name: "Popcornmeter",
30
+ mark: /* @__PURE__ */ jsx("span", { children: "🍿" })
31
+ };
32
+ default: return {
33
+ name: source,
34
+ label: source,
35
+ mark: null
36
+ };
37
+ }
38
+ }
39
+ /** A provider's mark and its score, linked to the original rating. */
40
+ function RatingLink({ source, value, scale, href }) {
41
+ const { name, label, mark } = ratingMark(source);
42
+ return /* @__PURE__ */ jsxs(Link, {
43
+ href,
44
+ external: true,
45
+ "aria-label": [
46
+ name,
47
+ value,
48
+ scale
49
+ ].filter(Boolean).join(" "),
50
+ className: "max-w-full gap-1.5",
51
+ children: [
52
+ mark ? /* @__PURE__ */ jsx("span", {
53
+ "aria-hidden": "true",
54
+ children: mark
55
+ }) : null,
56
+ label ? /* @__PURE__ */ jsx(Text, {
57
+ as: "span",
58
+ variant: "caption",
59
+ "aria-hidden": "true",
60
+ children: label
61
+ }) : null,
62
+ /* @__PURE__ */ jsx(Text, {
63
+ as: "span",
64
+ variant: "label",
65
+ className: "tabular-nums",
66
+ children: value
67
+ }),
68
+ scale ? /* @__PURE__ */ jsx(Text, {
69
+ as: "span",
70
+ variant: "caption",
71
+ tone: "muted",
72
+ className: "tabular-nums",
73
+ children: scale
74
+ }) : null
75
+ ]
76
+ });
77
+ }
78
+ export { RatingLink };
79
+
80
+ //# sourceMappingURL=RatingLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RatingLink.js","names":[],"sources":["../../src/display/RatingLink.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\n\nimport { Link } from '../typography/Link';\nimport { Text } from '../typography/Typography';\n\n/** The sources' own marks and colors, as the Apple apps draw them. Anything else reads by its name. */\nfunction ratingMark(source: string) {\n switch (source.trim().toLowerCase()) {\n case 'trakt':\n return {\n name: 'Trakt',\n label: 'Trakt',\n mark: (\n <span className=\"inline-flex size-5 items-center justify-center rounded-full bg-[#ed1c24] text-white [&>svg]:size-3 [&>svg]:stroke-[3]\">\n <CheckIcon />\n </span>\n ),\n };\n case 'imdb':\n return {\n name: 'IMDb',\n mark: (\n <span className=\"inline-flex h-5 items-center rounded-sm bg-[#f5c518] px-1 text-xs font-black text-black\">\n IMDb\n </span>\n ),\n };\n case 'rotten tomatoes critics':\n return { name: 'Tomatometer', mark: <span>🍅</span> };\n case 'rotten tomatoes audience':\n return { name: 'Popcornmeter', mark: <span>🍿</span> };\n default:\n return { name: source, label: source, mark: null };\n }\n}\n\n/** A provider's mark and its score, linked to the original rating. */\nexport function RatingLink({\n source,\n value,\n scale,\n href,\n}: {\n source: string;\n /** The score as it reads, such as \"6.5\" or \"57%\". */\n value: string;\n /** The scale shown after the score, such as \"/ 10\"; none for percentages. */\n scale?: string;\n href: string;\n}) {\n const { name, label, mark } = ratingMark(source);\n\n return (\n <Link\n href={href}\n external\n aria-label={[name, value, scale].filter(Boolean).join(' ')}\n className=\"max-w-full gap-1.5\"\n >\n {mark ? <span aria-hidden=\"true\">{mark}</span> : null}\n {label ? (\n <Text as=\"span\" variant=\"caption\" aria-hidden=\"true\">\n {label}\n </Text>\n ) : null}\n <Text as=\"span\" variant=\"label\" className=\"tabular-nums\">\n {value}\n </Text>\n {scale ? (\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" className=\"tabular-nums\">\n {scale}\n </Text>\n ) : null}\n </Link>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAS,WAAW,QAAgB;CAChC,QAAQ,OAAO,KAAK,CAAC,CAAC,YAAY,GAAlC;EACI,KAAK,SACD,OAAO;GACH,MAAM;GACN,OAAO;GACP,MACI,oBAAC,QAAD;IAAM,WAAU;IACZ,UAAA,oBAAC,WAAD,CAAY,CAAA;GACV,CAAA;EAEd;EACJ,KAAK,QACD,OAAO;GACH,MAAM;GACN,MACI,oBAAC,QAAD;IAAM,WAAU;IAA0F,UAAA;GAEpG,CAAA;EAEd;EACJ,KAAK,2BACD,OAAO;GAAE,MAAM;GAAe,MAAM,oBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA;EAAE;EACxD,KAAK,4BACD,OAAO;GAAE,MAAM;GAAgB,MAAM,oBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA;EAAE;EACzD,SACI,OAAO;GAAE,MAAM;GAAQ,OAAO;GAAQ,MAAM;EAAK;CACzD;AACJ;;AAGA,SAAgB,WAAW,EACvB,QACA,OACA,OACA,QAQD;CACC,MAAM,EAAE,MAAM,OAAO,SAAS,WAAW,MAAM;CAE/C,OACI,qBAAC,MAAD;EACU;EACN,UAAA;EACA,cAAY;GAAC;GAAM;GAAO;EAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACzD,WAAU;EAJd,UAAA;GAMK,OAAO,oBAAC,QAAD;IAAM,eAAY;IAAQ,UAAA;GAAW,CAAA,IAAI;GAChD,QACG,oBAAC,MAAD;IAAM,IAAG;IAAO,SAAQ;IAAU,eAAY;IACzC,UAAA;GACC,CAAA,IACN;GACJ,oBAAC,MAAD;IAAM,IAAG;IAAO,SAAQ;IAAQ,WAAU;IACrC,UAAA;GACC,CAAA;GACL,QACG,oBAAC,MAAD;IAAM,IAAG;IAAO,SAAQ;IAAU,MAAK;IAAQ,WAAU;IACpD,UAAA;GACC,CAAA,IACN;EACF;;AAEd"}
@@ -0,0 +1,20 @@
1
+ import { ReactNode } from "react";
2
+ interface ResourceCardProps {
3
+ presentation?: 'default' | 'overview' | 'scan';
4
+ metrics?: readonly {
5
+ label: ReactNode;
6
+ value: ReactNode;
7
+ }[];
8
+ metricsLabel?: string;
9
+ actions: ReactNode;
10
+ compact?: boolean;
11
+ details: ReactNode;
12
+ leading?: ReactNode;
13
+ panel?: ReactNode;
14
+ status: ReactNode;
15
+ trailing?: ReactNode;
16
+ }
17
+ export declare function ResourceCard({ actions, compact, presentation, metrics, metricsLabel, details, leading, panel, status, trailing }: ResourceCardProps): import("react").JSX.Element;
18
+ export declare function ResourceCardSkeleton({ presentation }: Pick<ResourceCardProps, 'presentation'>): import("react").JSX.Element;
19
+ export {};
20
+ //# sourceMappingURL=ResourceCard.d.ts.map
@@ -0,0 +1,200 @@
1
+ import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
2
+ import { Stack } from "../layout/Flow.js";
3
+ import { Text } from "../typography/Typography.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/display/ResourceCard.tsx
6
+ function ResourceCard({ actions, compact = false, presentation = "default", metrics, metricsLabel, details, leading, panel, status, trailing }) {
7
+ if (presentation === "scan") return /* @__PURE__ */ jsx("article", {
8
+ className: "border-base-300 @container border-b last:border-0",
9
+ children: /* @__PURE__ */ jsxs("div", {
10
+ className: "grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 px-3 py-1 @min-[40rem]:grid-cols-[minmax(5rem,7rem)_minmax(0,1fr)_auto]",
11
+ children: [
12
+ /* @__PURE__ */ jsxs("div", {
13
+ className: "flex min-w-0 items-center gap-2 pt-1 @min-[40rem]:pt-0",
14
+ children: [/* @__PURE__ */ jsx("span", {
15
+ "aria-hidden": "true",
16
+ className: "text-base-700 shrink-0 [&_svg]:size-4",
17
+ children: leading
18
+ }), /* @__PURE__ */ jsx("div", {
19
+ className: "min-w-0 flex-1",
20
+ children: details
21
+ })]
22
+ }),
23
+ /* @__PURE__ */ jsx("div", {
24
+ className: "col-span-full row-start-3 min-w-0 @min-[28rem]:col-span-1 @min-[28rem]:row-start-2 @min-[40rem]:col-start-2 @min-[40rem]:row-start-1",
25
+ children: status
26
+ }),
27
+ /* @__PURE__ */ jsx("div", {
28
+ className: "col-span-full row-start-2 flex flex-wrap items-center gap-2 @min-[28rem]:col-span-1 @min-[28rem]:col-start-2 @min-[28rem]:row-span-2 @min-[28rem]:row-start-1 @min-[40rem]:col-start-3",
29
+ children: actions
30
+ })
31
+ ]
32
+ })
33
+ });
34
+ if (presentation === "overview") return /* @__PURE__ */ jsxs("article", {
35
+ className: "group border-base-300 from-base-100/70 to-base-50 hover:border-primary/30 flex min-w-0 flex-col overflow-hidden rounded-xl border bg-linear-to-br shadow-xs/5 transition-colors",
36
+ children: [
37
+ /* @__PURE__ */ jsxs("div", {
38
+ className: "flex min-w-0 items-center gap-3 p-3 pb-2",
39
+ children: [
40
+ leading ? /* @__PURE__ */ jsx("span", {
41
+ "aria-hidden": "true",
42
+ className: "text-base-500 flex shrink-0 self-start pt-0.5 [&_svg]:size-5",
43
+ children: leading
44
+ }) : null,
45
+ /* @__PURE__ */ jsx("div", {
46
+ className: "min-h-10 min-w-0 flex-1 [&_a]:block [&_a]:truncate",
47
+ children: details
48
+ }),
49
+ /* @__PURE__ */ jsx("div", {
50
+ className: "shrink-0 self-start [&>[data-slot=skeleton]]:size-8",
51
+ children: actions
52
+ })
53
+ ]
54
+ }),
55
+ /* @__PURE__ */ jsx("dl", {
56
+ "aria-label": metricsLabel,
57
+ className: "flex flex-1 flex-wrap gap-x-5 gap-y-1 px-3 pb-2",
58
+ children: metrics?.map((metric, index) => /* @__PURE__ */ jsxs("div", {
59
+ className: "flex min-w-16 items-center gap-1.5",
60
+ children: [/* @__PURE__ */ jsx("dt", {
61
+ className: "min-h-4 min-w-10",
62
+ children: /* @__PURE__ */ jsx(Text, {
63
+ as: "span",
64
+ variant: "caption",
65
+ tone: "muted",
66
+ className: "block",
67
+ children: metric.label
68
+ })
69
+ }), /* @__PURE__ */ jsx("dd", {
70
+ className: "order-first min-h-8 min-w-6",
71
+ children: /* @__PURE__ */ jsx(Text, {
72
+ as: "span",
73
+ variant: "metric",
74
+ className: "block tabular-nums",
75
+ children: metric.value
76
+ })
77
+ })]
78
+ }, index))
79
+ }),
80
+ /* @__PURE__ */ jsx("div", {
81
+ className: "border-base-300 bg-base-100/40 flex min-h-8 min-w-0 items-center border-t px-3 py-1",
82
+ children: status
83
+ })
84
+ ]
85
+ });
86
+ if (compact) return /* @__PURE__ */ jsxs("article", {
87
+ className: "@container",
88
+ children: [/* @__PURE__ */ jsxs("div", {
89
+ className: `grid min-w-0 items-center gap-3 px-3 sm:px-4 ${trailing ? "min-h-18 py-3" : "min-h-12 py-2"} ${trailing ? leading ? "grid-cols-1 @min-[36rem]:grid-cols-[auto_minmax(0,1fr)_auto]" : "grid-cols-1 @min-[36rem]:grid-cols-[minmax(0,1fr)_auto]" : leading ? "grid-cols-[auto_minmax(0,1fr)_auto]" : "grid-cols-[minmax(0,1fr)_auto]"}`,
90
+ children: [
91
+ leading ? /* @__PURE__ */ jsx("span", {
92
+ "aria-hidden": "true",
93
+ className: `${trailing ? "hidden @min-[36rem]:flex" : "flex"} text-base-500 size-8 items-center justify-center [&_svg]:size-5 [&>[data-slot=skeleton]]:size-full`,
94
+ children: leading
95
+ }) : null,
96
+ trailing ? /* @__PURE__ */ jsxs(Stack, {
97
+ space: "tight",
98
+ className: "min-w-0",
99
+ children: [/* @__PURE__ */ jsx("div", {
100
+ className: "min-w-0 truncate",
101
+ children: details
102
+ }), /* @__PURE__ */ jsx("div", {
103
+ className: "flex min-w-0",
104
+ children: status
105
+ })]
106
+ }) : /* @__PURE__ */ jsxs("div", {
107
+ className: "grid min-w-0 items-center gap-x-4 gap-y-1 @min-[40rem]:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]",
108
+ children: [/* @__PURE__ */ jsx("div", {
109
+ className: "min-w-0 [&_a]:max-w-full [&_a]:min-w-0 [&_a]:truncate",
110
+ children: details
111
+ }), /* @__PURE__ */ jsx("div", {
112
+ className: "flex min-w-0 @min-[40rem]:justify-end",
113
+ children: status
114
+ })]
115
+ }),
116
+ /* @__PURE__ */ jsxs("div", {
117
+ className: `flex min-w-0 shrink-0 flex-wrap items-center gap-2 ${trailing ? "border-base-300 bg-base-100/40 col-span-full -mx-3 -mb-3 justify-between border-t px-3 py-2 sm:-mx-4 sm:px-4 @min-[36rem]:col-span-1 @min-[36rem]:m-0 @min-[36rem]:justify-end @min-[36rem]:border-0 @min-[36rem]:bg-transparent @min-[36rem]:p-0 [&>button]:min-h-10 @min-[36rem]:[&>button]:min-h-8 [&>label]:min-h-10 @min-[36rem]:[&>label]:min-h-8" : ""}`,
118
+ children: [actions, trailing]
119
+ })
120
+ ]
121
+ }), panel ? /* @__PURE__ */ jsx("div", {
122
+ className: "border-base-300 bg-base-100/40 border-t p-4 sm:p-5",
123
+ children: panel
124
+ }) : null]
125
+ });
126
+ return /* @__PURE__ */ jsxs("article", {
127
+ className: "border-base-300 bg-base-100 hover:border-base-300 overflow-hidden rounded-xl border shadow-xs/5 transition-colors",
128
+ children: [
129
+ /* @__PURE__ */ jsxs("div", {
130
+ className: "grid min-w-0 gap-4 p-4 sm:p-5 md:grid-cols-[minmax(0,1fr)_auto] md:items-start",
131
+ children: [/* @__PURE__ */ jsxs("div", {
132
+ className: "flex min-w-0 items-start gap-3",
133
+ children: [leading ? /* @__PURE__ */ jsx("div", {
134
+ "aria-hidden": "true",
135
+ className: "bg-base-100 text-base-600 flex size-9 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5",
136
+ children: leading
137
+ }) : null, /* @__PURE__ */ jsx("div", {
138
+ className: "min-w-0 flex-1",
139
+ children: details
140
+ })]
141
+ }), /* @__PURE__ */ jsx("div", {
142
+ className: "flex min-h-11 min-w-0 flex-col items-start gap-1 md:max-w-72 md:items-end md:text-right",
143
+ children: status
144
+ })]
145
+ }),
146
+ /* @__PURE__ */ jsxs("div", {
147
+ className: "border-base-300 bg-base-100/60 flex flex-col gap-3 border-t px-3 py-3 sm:flex-row sm:items-center sm:justify-between sm:px-4",
148
+ children: [/* @__PURE__ */ jsx("div", {
149
+ className: "-ml-1 flex min-w-0 flex-wrap items-center gap-1",
150
+ children: actions
151
+ }), /* @__PURE__ */ jsx("div", {
152
+ className: "flex min-w-0 flex-wrap items-center gap-3 sm:justify-end",
153
+ children: trailing
154
+ })]
155
+ }),
156
+ panel ? /* @__PURE__ */ jsx("div", {
157
+ className: "border-base-300 bg-base-100 border-t",
158
+ children: panel
159
+ }) : null
160
+ ]
161
+ });
162
+ }
163
+ function ResourceCardSkeleton({ presentation = "default" }) {
164
+ if (presentation === "overview") return /* @__PURE__ */ jsx(ResourceCard, {
165
+ presentation: "overview",
166
+ details: /* @__PURE__ */ jsxs(Stack, {
167
+ space: "tight",
168
+ children: [/* @__PURE__ */ jsx(SkeletonLoader.Shape, {
169
+ presentation: "heading",
170
+ width: "wide"
171
+ }), /* @__PURE__ */ jsx(SkeletonLoader.Shape, { width: "short" })]
172
+ }),
173
+ actions: /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "circle" }),
174
+ metrics: [0, 1].map(() => ({
175
+ value: /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "metric" }),
176
+ label: /* @__PURE__ */ jsx(SkeletonLoader.Shape, {})
177
+ })),
178
+ status: /* @__PURE__ */ jsx(SkeletonLoader.Shape, { width: "wide" })
179
+ });
180
+ return /* @__PURE__ */ jsx(ResourceCard, {
181
+ compact: true,
182
+ actions: null,
183
+ leading: /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "circle" }),
184
+ details: /* @__PURE__ */ jsx(SkeletonLoader.Shape, { width: "medium" }),
185
+ status: /* @__PURE__ */ jsx(SkeletonLoader.Shape, { width: "short" }),
186
+ trailing: /* @__PURE__ */ jsxs("div", {
187
+ className: "flex w-56 max-w-full items-center gap-3 py-1",
188
+ children: [/* @__PURE__ */ jsx(SkeletonLoader.Shape, {
189
+ presentation: "control",
190
+ width: "medium"
191
+ }), /* @__PURE__ */ jsx(SkeletonLoader.Shape, {
192
+ presentation: "control",
193
+ width: "medium"
194
+ })]
195
+ })
196
+ });
197
+ }
198
+ export { ResourceCard, ResourceCardSkeleton };
199
+
200
+ //# sourceMappingURL=ResourceCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceCard.js","names":[],"sources":["../../src/display/ResourceCard.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Stack } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\ninterface ResourceCardProps {\n presentation?: 'default' | 'overview' | 'scan';\n metrics?: readonly { label: ReactNode; value: ReactNode }[];\n metricsLabel?: string;\n actions: ReactNode;\n compact?: boolean;\n details: ReactNode;\n leading?: ReactNode;\n panel?: ReactNode;\n status: ReactNode;\n trailing?: ReactNode;\n}\n\nexport function ResourceCard({\n actions,\n compact = false,\n presentation = 'default',\n metrics,\n metricsLabel,\n details,\n leading,\n panel,\n status,\n trailing,\n}: ResourceCardProps) {\n if (presentation === 'scan')\n return (\n <article className=\"border-base-300 @container border-b last:border-0\">\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 px-3 py-1 @min-[40rem]:grid-cols-[minmax(5rem,7rem)_minmax(0,1fr)_auto]\">\n <div className=\"flex min-w-0 items-center gap-2 pt-1 @min-[40rem]:pt-0\">\n <span aria-hidden=\"true\" className=\"text-base-700 shrink-0 [&_svg]:size-4\">\n {leading}\n </span>\n <div className=\"min-w-0 flex-1\">{details}</div>\n </div>\n <div className=\"col-span-full row-start-3 min-w-0 @min-[28rem]:col-span-1 @min-[28rem]:row-start-2 @min-[40rem]:col-start-2 @min-[40rem]:row-start-1\">\n {status}\n </div>\n <div className=\"col-span-full row-start-2 flex flex-wrap items-center gap-2 @min-[28rem]:col-span-1 @min-[28rem]:col-start-2 @min-[28rem]:row-span-2 @min-[28rem]:row-start-1 @min-[40rem]:col-start-3\">\n {actions}\n </div>\n </div>\n </article>\n );\n\n if (presentation === 'overview') {\n return (\n <article className=\"group border-base-300 from-base-100/70 to-base-50 hover:border-primary/30 flex min-w-0 flex-col overflow-hidden rounded-xl border bg-linear-to-br shadow-xs/5 transition-colors\">\n <div className=\"flex min-w-0 items-center gap-3 p-3 pb-2\">\n {leading ? (\n <span\n aria-hidden=\"true\"\n className=\"text-base-500 flex shrink-0 self-start pt-0.5 [&_svg]:size-5\"\n >\n {leading}\n </span>\n ) : null}\n <div className=\"min-h-10 min-w-0 flex-1 [&_a]:block [&_a]:truncate\">{details}</div>\n <div className=\"shrink-0 self-start [&>[data-slot=skeleton]]:size-8\">{actions}</div>\n </div>\n <dl aria-label={metricsLabel} className=\"flex flex-1 flex-wrap gap-x-5 gap-y-1 px-3 pb-2\">\n {metrics?.map((metric, index) => (\n <div key={index} className=\"flex min-w-16 items-center gap-1.5\">\n <dt className=\"min-h-4 min-w-10\">\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" className=\"block\">\n {metric.label}\n </Text>\n </dt>\n <dd className=\"order-first min-h-8 min-w-6\">\n <Text as=\"span\" variant=\"metric\" className=\"block tabular-nums\">\n {metric.value}\n </Text>\n </dd>\n </div>\n ))}\n </dl>\n <div className=\"border-base-300 bg-base-100/40 flex min-h-8 min-w-0 items-center border-t px-3 py-1\">\n {status}\n </div>\n </article>\n );\n }\n\n if (compact) {\n return (\n <article className=\"@container\">\n <div\n className={`grid min-w-0 items-center gap-3 px-3 sm:px-4 ${trailing ? 'min-h-18 py-3' : 'min-h-12 py-2'} ${\n trailing\n ? leading\n ? 'grid-cols-1 @min-[36rem]:grid-cols-[auto_minmax(0,1fr)_auto]'\n : 'grid-cols-1 @min-[36rem]:grid-cols-[minmax(0,1fr)_auto]'\n : leading\n ? 'grid-cols-[auto_minmax(0,1fr)_auto]'\n : 'grid-cols-[minmax(0,1fr)_auto]'\n }`}\n >\n {leading ? (\n <span\n aria-hidden=\"true\"\n className={`${trailing ? 'hidden @min-[36rem]:flex' : 'flex'} text-base-500 size-8 items-center justify-center [&_svg]:size-5 [&>[data-slot=skeleton]]:size-full`}\n >\n {leading}\n </span>\n ) : null}\n {trailing ? (\n <Stack space=\"tight\" className=\"min-w-0\">\n <div className=\"min-w-0 truncate\">{details}</div>\n <div className=\"flex min-w-0\">{status}</div>\n </Stack>\n ) : (\n <div className=\"grid min-w-0 items-center gap-x-4 gap-y-1 @min-[40rem]:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"min-w-0 [&_a]:max-w-full [&_a]:min-w-0 [&_a]:truncate\">{details}</div>\n <div className=\"flex min-w-0 @min-[40rem]:justify-end\">{status}</div>\n </div>\n )}\n <div\n className={`flex min-w-0 shrink-0 flex-wrap items-center gap-2 ${\n trailing\n ? 'border-base-300 bg-base-100/40 col-span-full -mx-3 -mb-3 justify-between border-t px-3 py-2 sm:-mx-4 sm:px-4 @min-[36rem]:col-span-1 @min-[36rem]:m-0 @min-[36rem]:justify-end @min-[36rem]:border-0 @min-[36rem]:bg-transparent @min-[36rem]:p-0 [&>button]:min-h-10 @min-[36rem]:[&>button]:min-h-8 [&>label]:min-h-10 @min-[36rem]:[&>label]:min-h-8'\n : ''\n }`}\n >\n {actions}\n {trailing}\n </div>\n </div>\n {panel ? <div className=\"border-base-300 bg-base-100/40 border-t p-4 sm:p-5\">{panel}</div> : null}\n </article>\n );\n }\n\n return (\n <article className=\"border-base-300 bg-base-100 hover:border-base-300 overflow-hidden rounded-xl border shadow-xs/5 transition-colors\">\n <div className=\"grid min-w-0 gap-4 p-4 sm:p-5 md:grid-cols-[minmax(0,1fr)_auto] md:items-start\">\n <div className=\"flex min-w-0 items-start gap-3\">\n {leading ? (\n <div\n aria-hidden=\"true\"\n className=\"bg-base-100 text-base-600 flex size-9 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5\"\n >\n {leading}\n </div>\n ) : null}\n <div className=\"min-w-0 flex-1\">{details}</div>\n </div>\n <div className=\"flex min-h-11 min-w-0 flex-col items-start gap-1 md:max-w-72 md:items-end md:text-right\">\n {status}\n </div>\n </div>\n <div className=\"border-base-300 bg-base-100/60 flex flex-col gap-3 border-t px-3 py-3 sm:flex-row sm:items-center sm:justify-between sm:px-4\">\n <div className=\"-ml-1 flex min-w-0 flex-wrap items-center gap-1\">{actions}</div>\n <div className=\"flex min-w-0 flex-wrap items-center gap-3 sm:justify-end\">{trailing}</div>\n </div>\n {panel ? <div className=\"border-base-300 bg-base-100 border-t\">{panel}</div> : null}\n </article>\n );\n}\n\nexport function ResourceCardSkeleton({ presentation = 'default' }: Pick<ResourceCardProps, 'presentation'>) {\n if (presentation === 'overview')\n return (\n <ResourceCard\n presentation=\"overview\"\n details={\n <Stack space=\"tight\">\n <SkeletonLoader.Shape presentation=\"heading\" width=\"wide\" />\n <SkeletonLoader.Shape width=\"short\" />\n </Stack>\n }\n actions={<SkeletonLoader.Shape presentation=\"circle\" />}\n metrics={[0, 1].map(() => ({\n value: <SkeletonLoader.Shape presentation=\"metric\" />,\n label: <SkeletonLoader.Shape />,\n }))}\n status={<SkeletonLoader.Shape width=\"wide\" />}\n />\n );\n\n return (\n <ResourceCard\n compact\n actions={null}\n leading={<SkeletonLoader.Shape presentation=\"circle\" />}\n details={<SkeletonLoader.Shape width=\"medium\" />}\n status={<SkeletonLoader.Shape width=\"short\" />}\n trailing={\n <div className=\"flex w-56 max-w-full items-center gap-3 py-1\">\n <SkeletonLoader.Shape presentation=\"control\" width=\"medium\" />\n <SkeletonLoader.Shape presentation=\"control\" width=\"medium\" />\n </div>\n }\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { StatusTone } from "../feedback/StatusIndicator.js";
2
+ import { ReactNode } from "react";
3
+ /** Rows of one list inside a single bordered panel, separated by rules; or ruled rows in two columns on wide screens. */
4
+ export declare function RowList({ children, label, layout }: {
5
+ children: ReactNode;
6
+ label: string;
7
+ layout?: 'panel' | 'columns';
8
+ }): import("react").JSX.Element;
9
+ interface RowListItemProps {
10
+ /** Independent controls at the end of the row. */
11
+ actions?: ReactNode;
12
+ /** Short labels such as "lar can fix", shown before the actions or chevron. */
13
+ badges?: ReactNode;
14
+ detail?: string;
15
+ icon: ReactNode;
16
+ /** A round portrait instead of the tinted square tile. */
17
+ avatar?: boolean;
18
+ /** Makes the whole row a link, with actions remaining independently usable. */
19
+ href?: string;
20
+ onNavigate?: (href: string) => void;
21
+ subtitle?: string;
22
+ title: string;
23
+ tone?: StatusTone;
24
+ }
25
+ /** One row: a tinted icon, what the user recognises, one line about it, and muted facts. */
26
+ export declare function RowListItem({ actions, badges, detail, icon, avatar, href, onNavigate, subtitle, title, tone }: RowListItemProps): import("react").JSX.Element;
27
+ export {};
28
+ //# sourceMappingURL=RowList.d.ts.map
@@ -0,0 +1,76 @@
1
+ import { LinkBox, LinkOverlay } from "../typography/Link.js";
2
+ import { Text } from "../typography/Typography.js";
3
+ import { toneTileClasses } from "./ToneTile.js";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { ChevronRightIcon } from "lucide-react";
6
+ // src/display/RowList.tsx
7
+ /** Rows of one list inside a single bordered panel, separated by rules; or ruled rows in two columns on wide screens. */
8
+ function RowList({ children, label, layout = "panel" }) {
9
+ return /* @__PURE__ */ jsx("ul", {
10
+ "aria-label": label,
11
+ className: layout === "columns" ? "[&>li]:border-base-300 grid gap-x-8 md:grid-cols-2 [&>li]:border-b" : "divide-base-300 border-base-300 bg-base-100 divide-y overflow-hidden rounded-lg border",
12
+ children
13
+ });
14
+ }
15
+ /** One row: a tinted icon, what the user recognises, one line about it, and muted facts. */
16
+ function RowListItem({ actions, badges, detail, icon, avatar = false, href, onNavigate, subtitle, title, tone = "neutral" }) {
17
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
18
+ /* @__PURE__ */ jsx("span", {
19
+ "aria-hidden": "true",
20
+ className: `flex shrink-0 items-center justify-center [&>div]:w-full [&>svg]:size-5 ${avatar ? "size-10 overflow-hidden rounded-full" : "size-9 rounded-lg"} ${toneTileClasses[tone]}`,
21
+ children: icon
22
+ }),
23
+ /* @__PURE__ */ jsxs("span", {
24
+ className: "flex min-w-0 flex-1 flex-col",
25
+ children: [
26
+ /* @__PURE__ */ jsx(Text, {
27
+ as: "span",
28
+ variant: "label",
29
+ truncate: true,
30
+ title,
31
+ children: href ? /* @__PURE__ */ jsx(LinkOverlay, {
32
+ href,
33
+ onNavigate,
34
+ children: title
35
+ }) : title
36
+ }),
37
+ subtitle ? /* @__PURE__ */ jsx(Text, {
38
+ as: "span",
39
+ truncate: true,
40
+ title: subtitle,
41
+ children: subtitle
42
+ }) : null,
43
+ detail ? /* @__PURE__ */ jsx(Text, {
44
+ as: "span",
45
+ variant: "caption",
46
+ tone: "muted",
47
+ truncate: true,
48
+ title: detail,
49
+ children: detail
50
+ }) : null
51
+ ]
52
+ }),
53
+ badges ? /* @__PURE__ */ jsx("span", {
54
+ className: "hidden shrink-0 items-center gap-2 sm:flex",
55
+ children: badges
56
+ }) : null
57
+ ] });
58
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(LinkBox, {
59
+ className: `flex w-full min-w-0 items-center gap-3 px-4 py-3 ${href ? "hover:bg-base-100 focus-within:bg-base-100 transition-colors" : ""}`,
60
+ children: [
61
+ content,
62
+ actions ? /* @__PURE__ */ jsx("span", {
63
+ className: "flex shrink-0 items-center gap-1",
64
+ children: actions
65
+ }) : null,
66
+ href ? /* @__PURE__ */ jsx("span", {
67
+ "aria-hidden": "true",
68
+ className: "text-base-500 flex shrink-0 [&>svg]:size-4",
69
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
70
+ }) : null
71
+ ]
72
+ }) });
73
+ }
74
+ export { RowList, RowListItem };
75
+
76
+ //# sourceMappingURL=RowList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowList.js","names":[],"sources":["../../src/display/RowList.tsx"],"sourcesContent":["import { ChevronRightIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport type { StatusTone } from '../feedback/StatusIndicator';\nimport { LinkBox, LinkOverlay } from '../typography/Link';\nimport { Text } from '../typography/Typography';\nimport { toneTileClasses } from './ToneTile';\n\n/** Rows of one list inside a single bordered panel, separated by rules; or ruled rows in two columns on wide screens. */\nexport function RowList({\n children,\n label,\n layout = 'panel',\n}: {\n children: ReactNode;\n label: string;\n layout?: 'panel' | 'columns';\n}) {\n return (\n <ul\n aria-label={label}\n className={\n layout === 'columns'\n ? '[&>li]:border-base-300 grid gap-x-8 md:grid-cols-2 [&>li]:border-b'\n : 'divide-base-300 border-base-300 bg-base-100 divide-y overflow-hidden rounded-lg border'\n }\n >\n {children}\n </ul>\n );\n}\n\ninterface RowListItemProps {\n /** Independent controls at the end of the row. */\n actions?: ReactNode;\n /** Short labels such as \"lar can fix\", shown before the actions or chevron. */\n badges?: ReactNode;\n detail?: string;\n icon: ReactNode;\n /** A round portrait instead of the tinted square tile. */\n avatar?: boolean;\n /** Makes the whole row a link, with actions remaining independently usable. */\n href?: string;\n onNavigate?: (href: string) => void;\n subtitle?: string;\n title: string;\n tone?: StatusTone;\n}\n\n/** One row: a tinted icon, what the user recognises, one line about it, and muted facts. */\nexport function RowListItem({\n actions,\n badges,\n detail,\n icon,\n avatar = false,\n href,\n onNavigate,\n subtitle,\n title,\n tone = 'neutral',\n}: RowListItemProps) {\n const content = (\n <>\n <span\n aria-hidden=\"true\"\n className={`flex shrink-0 items-center justify-center [&>div]:w-full [&>svg]:size-5 ${avatar ? 'size-10 overflow-hidden rounded-full' : 'size-9 rounded-lg'} ${toneTileClasses[tone]}`}\n >\n {icon}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <Text as=\"span\" variant=\"label\" truncate title={title}>\n {href ? (\n <LinkOverlay href={href} onNavigate={onNavigate}>\n {title}\n </LinkOverlay>\n ) : (\n title\n )}\n </Text>\n {subtitle ? (\n <Text as=\"span\" truncate title={subtitle}>\n {subtitle}\n </Text>\n ) : null}\n {detail ? (\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" truncate title={detail}>\n {detail}\n </Text>\n ) : null}\n </span>\n {badges ? <span className=\"hidden shrink-0 items-center gap-2 sm:flex\">{badges}</span> : null}\n </>\n );\n const row = 'flex w-full min-w-0 items-center gap-3 px-4 py-3';\n\n return (\n <li>\n <LinkBox className={`${row} ${href ? 'hover:bg-base-100 focus-within:bg-base-100 transition-colors' : ''}`}>\n {content}\n {actions ? <span className=\"flex shrink-0 items-center gap-1\">{actions}</span> : null}\n {href ? (\n <span aria-hidden=\"true\" className=\"text-base-500 flex shrink-0 [&>svg]:size-4\">\n <ChevronRightIcon />\n </span>\n ) : null}\n </LinkBox>\n </li>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,QAAQ,EACpB,UACA,OACA,SAAS,WAKV;CACC,OACI,oBAAC,MAAD;EACI,cAAY;EACZ,WACI,WAAW,YACL,uEACA;EAGT;CACD,CAAA;AAEZ;;AAoBA,SAAgB,YAAY,EACxB,SACA,QACA,QACA,MACA,SAAS,OACT,MACA,YACA,UACA,OACA,OAAO,aACU;CACjB,MAAM,UACF,qBAAA,UAAA,EAAA,UAAA;EACI,oBAAC,QAAD;GACI,eAAY;GACZ,WAAW,2EAA2E,SAAS,yCAAyC,oBAAoB,GAAG,gBAAgB;GAE9K,UAAA;EACC,CAAA;EACN,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IACI,oBAAC,MAAD;KAAM,IAAG;KAAO,SAAQ;KAAQ,UAAA;KAAgB;KAC3C,UAAA,OACG,oBAAC,aAAD;MAAmB;MAAkB;MAChC,UAAA;KACQ,CAAA,IAEb;IAEF,CAAA;IACL,WACG,oBAAC,MAAD;KAAM,IAAG;KAAO,UAAA;KAAS,OAAO;KAC3B,UAAA;IACC,CAAA,IACN;IACH,SACG,oBAAC,MAAD;KAAM,IAAG;KAAO,SAAQ;KAAU,MAAK;KAAQ,UAAA;KAAS,OAAO;KAC1D,UAAA;IACC,CAAA,IACN;GACF;;EACL,SAAS,oBAAC,QAAD;GAAM,WAAU;GAA8C,UAAA;EAAa,CAAA,IAAI;CAC3F,EAAA,CAAA;CAIN,OACI,oBAAC,MAAD,EAAA,UACI,qBAAC,SAAD;EAAS,WAAW,oDAAU,OAAO,iEAAiE;EAAtG,UAAA;GACK;GACA,UAAU,oBAAC,QAAD;IAAM,WAAU;IAAoC,UAAA;GAAc,CAAA,IAAI;GAChF,OACG,oBAAC,QAAD;IAAM,eAAY;IAAO,WAAU;IAC/B,UAAA,oBAAC,kBAAD,CAAmB,CAAA;GACjB,CAAA,IACN;EACC;CACT,CAAA,EAAA,CAAA;AAEZ"}
@@ -0,0 +1,28 @@
1
+ export type MeterTone = 'primary' | 'info' | 'success' | 'warning';
2
+ export interface MeterSegment {
3
+ id: string;
4
+ /** Shown on hover, for example "Playback 50%". */
5
+ label: string;
6
+ tone: MeterTone;
7
+ /** The share of the whole meter, from 0 to 1. */
8
+ value: number;
9
+ }
10
+ interface StackedMeterProps {
11
+ /** Summarizes the meter for assistive technology. */
12
+ label: string;
13
+ /** A dashed line at a share of the whole, for example a limit. */
14
+ marker?: {
15
+ label: string;
16
+ value: number;
17
+ };
18
+ segments: readonly MeterSegment[];
19
+ }
20
+ /** One bar split into toned segments, with an optional dashed marker. */
21
+ export declare function StackedMeter({ label, marker, segments }: StackedMeterProps): import("react").JSX.Element;
22
+ /** The key to the tones of one or more stacked meters. */
23
+ export declare function MeterLegend({ items, label }: {
24
+ items: readonly Omit<MeterSegment, 'value'>[];
25
+ label: string;
26
+ }): import("react").JSX.Element;
27
+ export {};
28
+ //# sourceMappingURL=StackedMeter.d.ts.map
@@ -0,0 +1,48 @@
1
+ import { Text } from "../typography/Typography.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/display/StackedMeter.tsx
4
+ const toneClasses = {
5
+ primary: "bg-primary",
6
+ info: "bg-info",
7
+ success: "bg-success",
8
+ warning: "bg-warning"
9
+ };
10
+ /** One bar split into toned segments, with an optional dashed marker. */
11
+ function StackedMeter({ label, marker, segments }) {
12
+ return /* @__PURE__ */ jsxs("div", {
13
+ role: "img",
14
+ "aria-label": label,
15
+ className: "bg-base-200 relative flex h-4 w-full overflow-hidden rounded-full",
16
+ children: [segments.filter((segment) => segment.value > 0).map((segment) => /* @__PURE__ */ jsx("span", {
17
+ title: segment.label,
18
+ className: `border-base-50 h-full border-r last:border-r-0 ${toneClasses[segment.tone]}`,
19
+ style: { width: `${Math.min(segment.value, 1) * 100}%` }
20
+ }, segment.id)), marker ? /* @__PURE__ */ jsx("span", {
21
+ title: marker.label,
22
+ className: "border-base-content absolute inset-y-0 border-l-2 border-dashed",
23
+ style: { left: `${Math.min(Math.max(marker.value, 0), 1) * 100}%` }
24
+ }) : null]
25
+ });
26
+ }
27
+ /** The key to the tones of one or more stacked meters. */
28
+ function MeterLegend({ items, label }) {
29
+ return /* @__PURE__ */ jsx("ul", {
30
+ "aria-label": label,
31
+ className: "flex flex-wrap gap-x-4 gap-y-1",
32
+ children: items.map((item) => /* @__PURE__ */ jsxs("li", {
33
+ className: "flex items-center gap-1.5",
34
+ children: [/* @__PURE__ */ jsx("span", {
35
+ "aria-hidden": "true",
36
+ className: `size-2 shrink-0 rounded-full ${toneClasses[item.tone]}`
37
+ }), /* @__PURE__ */ jsx(Text, {
38
+ as: "span",
39
+ variant: "caption",
40
+ tone: "muted",
41
+ children: item.label
42
+ })]
43
+ }, item.id))
44
+ });
45
+ }
46
+ export { MeterLegend, StackedMeter };
47
+
48
+ //# sourceMappingURL=StackedMeter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackedMeter.js","names":[],"sources":["../../src/display/StackedMeter.tsx"],"sourcesContent":["import { Text } from '../typography/Typography';\n\nexport type MeterTone = 'primary' | 'info' | 'success' | 'warning';\n\nconst toneClasses: Record<MeterTone, string> = {\n primary: 'bg-primary',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n};\n\nexport interface MeterSegment {\n id: string;\n /** Shown on hover, for example \"Playback 50%\". */\n label: string;\n tone: MeterTone;\n /** The share of the whole meter, from 0 to 1. */\n value: number;\n}\n\ninterface StackedMeterProps {\n /** Summarizes the meter for assistive technology. */\n label: string;\n /** A dashed line at a share of the whole, for example a limit. */\n marker?: { label: string; value: number };\n segments: readonly MeterSegment[];\n}\n\n/** One bar split into toned segments, with an optional dashed marker. */\nexport function StackedMeter({ label, marker, segments }: StackedMeterProps) {\n return (\n <div\n role=\"img\"\n aria-label={label}\n className=\"bg-base-200 relative flex h-4 w-full overflow-hidden rounded-full\"\n >\n {segments\n .filter((segment) => segment.value > 0)\n .map((segment) => (\n <span\n key={segment.id}\n title={segment.label}\n className={`border-base-50 h-full border-r last:border-r-0 ${toneClasses[segment.tone]}`}\n style={{ width: `${Math.min(segment.value, 1) * 100}%` }}\n />\n ))}\n {marker ? (\n <span\n title={marker.label}\n className=\"border-base-content absolute inset-y-0 border-l-2 border-dashed\"\n style={{ left: `${Math.min(Math.max(marker.value, 0), 1) * 100}%` }}\n />\n ) : null}\n </div>\n );\n}\n\n/** The key to the tones of one or more stacked meters. */\nexport function MeterLegend({ items, label }: { items: readonly Omit<MeterSegment, 'value'>[]; label: string }) {\n return (\n <ul aria-label={label} className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {items.map((item) => (\n <li key={item.id} className=\"flex items-center gap-1.5\">\n <span aria-hidden=\"true\" className={`size-2 shrink-0 rounded-full ${toneClasses[item.tone]}`} />\n <Text as=\"span\" variant=\"caption\" tone=\"muted\">\n {item.label}\n </Text>\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;AAIA,MAAM,cAAyC;CAC3C,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;AACb;;AAoBA,SAAgB,aAAa,EAAE,OAAO,QAAQ,YAA+B;CACzE,OACI,qBAAC,OAAD;EACI,MAAK;EACL,cAAY;EACZ,WAAU;EAHd,UAAA,CAKK,SACI,QAAQ,YAAY,QAAQ,QAAQ,CAAC,CAAC,CACtC,KAAK,YACF,oBAAC,QAAD;GAEI,OAAO,QAAQ;GACf,WAAW,kDAAkD,YAAY,QAAQ;GACjF,OAAO,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,OAAO,CAAC,IAAI,IAAI,GAAG;EAC1D,GAJQ,QAAQ,EAIhB,CACJ,GACJ,SACG,oBAAC,QAAD;GACI,OAAO,OAAO;GACd,WAAU;GACV,OAAO,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG;EACrE,CAAA,IACD,IACH;;AAEb;;AAGA,SAAgB,YAAY,EAAE,OAAO,SAA2E;CAC5G,OACI,oBAAC,MAAD;EAAI,cAAY;EAAO,WAAU;EAC5B,UAAA,MAAM,KAAK,SACR,qBAAC,MAAD;GAAkB,WAAU;GAA5B,UAAA,CACI,oBAAC,QAAD;IAAM,eAAY;IAAO,WAAW,gCAAgC,YAAY,KAAK;GAAU,CAAA,GAC/F,oBAAC,MAAD;IAAM,IAAG;IAAO,SAAQ;IAAU,MAAK;IAClC,UAAA,KAAK;GACJ,CAAA,CACN;EALK,GAAA,KAAK,EAKV,CACP;CACD,CAAA;AAEZ"}
@@ -0,0 +1,13 @@
1
+ import { StatusTone } from "../feedback/StatusIndicator.js";
2
+ import { ReactNode } from "react";
3
+ interface StatTileProps {
4
+ label: string;
5
+ onClick: () => void;
6
+ selected: boolean;
7
+ tone: StatusTone;
8
+ value: ReactNode;
9
+ }
10
+ /** A count with a label that doubles as a toggle filter. */
11
+ export declare function StatTile({ label, onClick, selected, tone, value }: StatTileProps): import("react").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=StatTile.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { StatusIndicator } from "../feedback/StatusIndicator.js";
2
+ import { tabbable } from "../foundations/KeyboardFocus.js";
3
+ import { Inline } from "../layout/Flow.js";
4
+ import { Text } from "../typography/Typography.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ // src/display/StatTile.tsx
7
+ /** A count with a label that doubles as a toggle filter. */
8
+ function StatTile({ label, onClick, selected, tone, value }) {
9
+ return /* @__PURE__ */ jsxs("button", {
10
+ ...tabbable,
11
+ type: "button",
12
+ "aria-pressed": selected,
13
+ className: `focus-visible:outline-primary flex flex-col items-start gap-2 rounded-lg border p-4 text-left transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 ${selected ? "border-primary bg-primary/5" : "border-base-300 bg-base-100/60 hover:border-base-300"}`,
14
+ onClick,
15
+ children: [/* @__PURE__ */ jsxs(Inline, {
16
+ align: "center",
17
+ space: "related",
18
+ children: [/* @__PURE__ */ jsx(StatusIndicator, {
19
+ size: "sm",
20
+ tone
21
+ }), /* @__PURE__ */ jsx(Text, {
22
+ as: "span",
23
+ variant: "label",
24
+ children: label
25
+ })]
26
+ }), /* @__PURE__ */ jsx(Text, {
27
+ as: "span",
28
+ variant: "metric",
29
+ children: value
30
+ })]
31
+ });
32
+ }
33
+ export { StatTile };
34
+
35
+ //# sourceMappingURL=StatTile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatTile.js","names":[],"sources":["../../src/display/StatTile.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { StatusIndicator, type StatusTone } from '../feedback/StatusIndicator';\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { Inline } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\ninterface StatTileProps {\n label: string;\n onClick: () => void;\n selected: boolean;\n tone: StatusTone;\n value: ReactNode;\n}\n\n/** A count with a label that doubles as a toggle filter. */\nexport function StatTile({ label, onClick, selected, tone, value }: StatTileProps) {\n return (\n <button\n {...tabbable}\n type=\"button\"\n aria-pressed={selected}\n className={`focus-visible:outline-primary flex flex-col items-start gap-2 rounded-lg border p-4 text-left transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 ${\n selected ? 'border-primary bg-primary/5' : 'border-base-300 bg-base-100/60 hover:border-base-300'\n }`}\n onClick={onClick}\n >\n <Inline align=\"center\" space=\"related\">\n <StatusIndicator size=\"sm\" tone={tone} />\n <Text as=\"span\" variant=\"label\">\n {label}\n </Text>\n </Inline>\n <Text as=\"span\" variant=\"metric\">\n {value}\n </Text>\n </button>\n );\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,SAAS,EAAE,OAAO,SAAS,UAAU,MAAM,SAAwB;CAC/E,OACI,qBAAC,UAAD;EACI,GAAI;EACJ,MAAK;EACL,gBAAc;EACd,WAAW,0KACP,WAAW,gCAAgC;EAEtC;EAPb,UAAA,CASI,qBAAC,QAAD;GAAQ,OAAM;GAAS,OAAM;GAA7B,UAAA,CACI,oBAAC,iBAAD;IAAiB,MAAK;IAAW;GAAO,CAAA,GACxC,oBAAC,MAAD;IAAM,IAAG;IAAO,SAAQ;IACnB,UAAA;GACC,CAAA,CACF;EACR,CAAA,GAAA,oBAAC,MAAD;GAAM,IAAG;GAAO,SAAQ;GACnB,UAAA;EACC,CAAA,CACF;;AAEhB"}
@@ -0,0 +1,5 @@
1
+ /** Numbered instructions in reading order. */
2
+ export declare function StepList({ steps }: {
3
+ steps: readonly string[];
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=StepList.d.ts.map
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ // src/display/StepList.tsx
3
+ /** Numbered instructions in reading order. */
4
+ function StepList({ steps }) {
5
+ return /* @__PURE__ */ jsx("ol", {
6
+ className: "text-base-800 list-decimal space-y-1 pl-5 text-sm",
7
+ children: steps.map((step) => /* @__PURE__ */ jsx("li", { children: step }, step))
8
+ });
9
+ }
10
+ export { StepList };
11
+
12
+ //# sourceMappingURL=StepList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepList.js","names":[],"sources":["../../src/display/StepList.tsx"],"sourcesContent":["/** Numbered instructions in reading order. */\nexport function StepList({ steps }: { steps: readonly string[] }) {\n return (\n <ol className=\"text-base-800 list-decimal space-y-1 pl-5 text-sm\">\n {steps.map((step) => (\n <li key={step}>{step}</li>\n ))}\n </ol>\n );\n}\n"],"mappings":";;;AACA,SAAgB,SAAS,EAAE,SAAuC;CAC9D,OACI,oBAAC,MAAD;EAAI,WAAU;EACT,UAAA,MAAM,KAAK,SACR,oBAAC,MAAD,EAAA,UAAgB,KAAS,GAAhB,IAAgB,CAC5B;CACD,CAAA;AAEZ"}