@lar-works/design-system 0.0.0-stage → 0.1.1

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 +54 -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 +71 -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,56 @@
1
+ import { Stack } from "../layout/Flow.js";
2
+ import { Text } from "../typography/Typography.js";
3
+ import { Code } from "@ninna-ui/primitives";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/display/ChangeList.tsx
6
+ /** Before → after values grouped under the item they belong to. */
7
+ function ChangeList({ items, label }) {
8
+ return /* @__PURE__ */ jsx(Stack, {
9
+ as: "ul",
10
+ space: "group",
11
+ "aria-label": label,
12
+ children: items.map((item) => /* @__PURE__ */ jsx("li", {
13
+ className: "min-w-0",
14
+ children: /* @__PURE__ */ jsxs(Stack, {
15
+ space: "tight",
16
+ children: [/* @__PURE__ */ jsx(Text, {
17
+ truncate: true,
18
+ title: item.title,
19
+ variant: "label",
20
+ children: item.title
21
+ }), /* @__PURE__ */ jsx("ul", {
22
+ className: "space-y-1 pl-4",
23
+ children: item.changes.map((change) => /* @__PURE__ */ jsxs("li", {
24
+ className: "flex min-w-0 flex-wrap items-baseline gap-x-2",
25
+ children: [
26
+ /* @__PURE__ */ jsx(Text, {
27
+ as: "span",
28
+ variant: "caption",
29
+ tone: "muted",
30
+ children: change.label
31
+ }),
32
+ /* @__PURE__ */ jsx(Code, {
33
+ className: "text-xs",
34
+ children: change.from
35
+ }),
36
+ /* @__PURE__ */ jsx(Text, {
37
+ as: "span",
38
+ "aria-hidden": "true",
39
+ variant: "caption",
40
+ tone: "muted",
41
+ children: "→"
42
+ }),
43
+ /* @__PURE__ */ jsx(Code, {
44
+ className: "text-xs",
45
+ children: change.to
46
+ })
47
+ ]
48
+ }, change.key))
49
+ })]
50
+ })
51
+ }, item.key))
52
+ });
53
+ }
54
+ export { ChangeList };
55
+
56
+ //# sourceMappingURL=ChangeList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangeList.js","names":[],"sources":["../../src/display/ChangeList.tsx"],"sourcesContent":["import { Code } from '@ninna-ui/primitives';\n\nimport { Stack } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\nexport interface ChangeListItem {\n changes: readonly { from: string; key: string; label: string; to: string }[];\n key: string;\n title: string;\n}\n\n/** Before → after values grouped under the item they belong to. */\nexport function ChangeList({ items, label }: { items: readonly ChangeListItem[]; label: string }) {\n return (\n <Stack as=\"ul\" space=\"group\" aria-label={label}>\n {items.map((item) => (\n <li key={item.key} className=\"min-w-0\">\n <Stack space=\"tight\">\n <Text truncate title={item.title} variant=\"label\">\n {item.title}\n </Text>\n <ul className=\"space-y-1 pl-4\">\n {item.changes.map((change) => (\n <li key={change.key} className=\"flex min-w-0 flex-wrap items-baseline gap-x-2\">\n <Text as=\"span\" variant=\"caption\" tone=\"muted\">\n {change.label}\n </Text>\n <Code className=\"text-xs\">{change.from}</Code>\n <Text as=\"span\" aria-hidden=\"true\" variant=\"caption\" tone=\"muted\">\n →\n </Text>\n <Code className=\"text-xs\">{change.to}</Code>\n </li>\n ))}\n </ul>\n </Stack>\n </li>\n ))}\n </Stack>\n );\n}\n"],"mappings":";;;;;;AAYA,SAAgB,WAAW,EAAE,OAAO,SAA8D;CAC9F,OACI,oBAAC,OAAD;EAAO,IAAG;EAAK,OAAM;EAAQ,cAAY;EACpC,UAAA,MAAM,KAAK,SACR,oBAAC,MAAD;GAAmB,WAAU;GACzB,UAAA,qBAAC,OAAD;IAAO,OAAM;IAAb,UAAA,CACI,oBAAC,MAAD;KAAM,UAAA;KAAS,OAAO,KAAK;KAAO,SAAQ;KACrC,UAAA,KAAK;IACJ,CAAA,GACN,oBAAC,MAAD;KAAI,WAAU;KACT,UAAA,KAAK,QAAQ,KAAK,WACf,qBAAC,MAAD;MAAqB,WAAU;MAA/B,UAAA;OACI,oBAAC,MAAD;QAAM,IAAG;QAAO,SAAQ;QAAU,MAAK;QAClC,UAAA,OAAO;OACN,CAAA;OACN,oBAAC,MAAD;QAAM,WAAU;QAAW,UAAA,OAAO;OAAW,CAAA;OAC7C,oBAAC,MAAD;QAAM,IAAG;QAAO,eAAY;QAAO,SAAQ;QAAU,MAAK;QAAQ,UAAA;OAE5D,CAAA;OACN,oBAAC,MAAD;QAAM,WAAU;QAAW,UAAA,OAAO;OAAS,CAAA;MAC3C;KATK,GAAA,OAAO,GASZ,CACP;IACD,CAAA,CACD;;EACP,GApBK,KAAK,GAoBV,CACP;CACE,CAAA;AAEf"}
@@ -0,0 +1,10 @@
1
+ export interface CheckListItem {
2
+ key: string;
3
+ text: string;
4
+ }
5
+ /** Short statements of what something does or includes, each with a check mark. */
6
+ export declare function CheckList({ items, label }: {
7
+ items: readonly CheckListItem[];
8
+ label: string;
9
+ }): import("react").JSX.Element;
10
+ //# sourceMappingURL=CheckList.d.ts.map
@@ -0,0 +1,25 @@
1
+ import { Text } from "../typography/Typography.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { CheckIcon } from "lucide-react";
4
+ // src/display/CheckList.tsx
5
+ /** Short statements of what something does or includes, each with a check mark. */
6
+ function CheckList({ items, label }) {
7
+ return /* @__PURE__ */ jsx("ul", {
8
+ "aria-label": label,
9
+ className: "space-y-2",
10
+ children: items.map((item) => /* @__PURE__ */ jsxs("li", {
11
+ className: "flex min-w-0 items-start gap-2",
12
+ children: [/* @__PURE__ */ jsx("span", {
13
+ "aria-hidden": "true",
14
+ className: "text-success mt-0.5 flex size-4 shrink-0 items-center justify-center [&>svg]:size-4",
15
+ children: /* @__PURE__ */ jsx(CheckIcon, {})
16
+ }), /* @__PURE__ */ jsx(Text, {
17
+ as: "span",
18
+ children: item.text
19
+ })]
20
+ }, item.key))
21
+ });
22
+ }
23
+ export { CheckList };
24
+
25
+ //# sourceMappingURL=CheckList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckList.js","names":[],"sources":["../../src/display/CheckList.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\n\nimport { Text } from '../typography/Typography';\n\nexport interface CheckListItem {\n key: string;\n text: string;\n}\n\n/** Short statements of what something does or includes, each with a check mark. */\nexport function CheckList({ items, label }: { items: readonly CheckListItem[]; label: string }) {\n return (\n <ul aria-label={label} className=\"space-y-2\">\n {items.map((item) => (\n <li key={item.key} className=\"flex min-w-0 items-start gap-2\">\n <span\n aria-hidden=\"true\"\n className=\"text-success mt-0.5 flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\"\n >\n <CheckIcon />\n </span>\n <Text as=\"span\">{item.text}</Text>\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;;;AAUA,SAAgB,UAAU,EAAE,OAAO,SAA6D;CAC5F,OACI,oBAAC,MAAD;EAAI,cAAY;EAAO,WAAU;EAC5B,UAAA,MAAM,KAAK,SACR,qBAAC,MAAD;GAAmB,WAAU;GAA7B,UAAA,CACI,oBAAC,QAAD;IACI,eAAY;IACZ,WAAU;IAEV,UAAA,oBAAC,WAAD,CAAY,CAAA;GACV,CAAA,GACN,oBAAC,MAAD;IAAM,IAAG;IAAQ,UAAA,KAAK;GAAW,CAAA,CACjC;EARK,GAAA,KAAK,GAQV,CACP;CACD,CAAA;AAEZ"}
@@ -0,0 +1,6 @@
1
+ /** Readable examples and configuration values, contained even in narrow drawers. */
2
+ export declare function CodeBlock({ value, preserveLines }: {
3
+ value: string;
4
+ preserveLines?: boolean;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=CodeBlock.d.ts.map
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ // src/display/CodeBlock.tsx
3
+ /** Readable examples and configuration values, contained even in narrow drawers. */
4
+ function CodeBlock({ value, preserveLines = false }) {
5
+ return /* @__PURE__ */ jsx("pre", {
6
+ className: `border-base-300 bg-base-100/70 text-base-800 min-w-0 rounded-lg border p-4 font-mono text-xs leading-6 ${preserveLines ? "overflow-x-auto" : "wrap-anywhere whitespace-pre-wrap"}`,
7
+ children: /* @__PURE__ */ jsx("code", { children: value })
8
+ });
9
+ }
10
+ export { CodeBlock };
11
+
12
+ //# sourceMappingURL=CodeBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlock.js","names":[],"sources":["../../src/display/CodeBlock.tsx"],"sourcesContent":["/** Readable examples and configuration values, contained even in narrow drawers. */\nexport function CodeBlock({ value, preserveLines = false }: { value: string; preserveLines?: boolean }) {\n return (\n <pre\n className={`border-base-300 bg-base-100/70 text-base-800 min-w-0 rounded-lg border p-4 font-mono text-xs leading-6 ${\n preserveLines ? 'overflow-x-auto' : 'wrap-anywhere whitespace-pre-wrap'\n }`}\n >\n <code>{value}</code>\n </pre>\n );\n}\n"],"mappings":";;;AACA,SAAgB,UAAU,EAAE,OAAO,gBAAgB,SAAqD;CACpG,OACI,oBAAC,OAAD;EACI,WAAW,0GACP,gBAAgB,oBAAoB;EAGxC,UAAA,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA;CAClB,CAAA;AAEb"}
@@ -0,0 +1,9 @@
1
+ interface CopyButtonProps {
2
+ copiedLabel: string;
3
+ label: string;
4
+ value: string;
5
+ }
6
+ /** The LAN admin also runs over HTTP, where the async clipboard API is unavailable. */
7
+ export declare function CopyButton({ copiedLabel, label, value }: CopyButtonProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=CopyButton.d.ts.map
@@ -0,0 +1,59 @@
1
+ import { IconButton } from "../actions/IconButton.js";
2
+ import { useEffect, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { CheckIcon, CopyIcon } from "lucide-react";
5
+ // src/display/CopyButton.tsx
6
+ const COPIED_FEEDBACK_MS = 1500;
7
+ /** The LAN admin also runs over HTTP, where the async clipboard API is unavailable. */
8
+ function CopyButton({ copiedLabel, label, value }) {
9
+ const [copiedValue, setCopiedValue] = useState(null);
10
+ const [copying, setCopying] = useState(false);
11
+ const copied = copiedValue === value;
12
+ useEffect(() => {
13
+ if (copiedValue === null) return void 0;
14
+ const timer = window.setTimeout(() => setCopiedValue(null), COPIED_FEEDBACK_MS);
15
+ return () => window.clearTimeout(timer);
16
+ }, [copiedValue]);
17
+ return /* @__PURE__ */ jsx(IconButton, {
18
+ icon: copied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {}),
19
+ "aria-label": copied ? copiedLabel : label,
20
+ title: copied ? copiedLabel : label,
21
+ loading: copying,
22
+ onClick: async () => {
23
+ setCopying(true);
24
+ try {
25
+ if (navigator.clipboard) {
26
+ await navigator.clipboard.writeText(value);
27
+ setCopiedValue(value);
28
+ } else setCopiedValue(copySelection(value) ? value : null);
29
+ } catch {
30
+ setCopiedValue(copySelection(value) ? value : null);
31
+ } finally {
32
+ setCopying(false);
33
+ }
34
+ },
35
+ tone: copied ? "success" : "neutral"
36
+ });
37
+ }
38
+ function copySelection(value) {
39
+ if (typeof document.execCommand !== "function") return false;
40
+ const previousFocus = document.activeElement;
41
+ const input = document.createElement("textarea");
42
+ input.value = value;
43
+ input.readOnly = true;
44
+ input.className = "fixed -left-full top-0 opacity-0";
45
+ document.body.append(input);
46
+ input.focus({ preventScroll: true });
47
+ input.select();
48
+ try {
49
+ return document.execCommand("copy");
50
+ } catch {
51
+ return false;
52
+ } finally {
53
+ input.remove();
54
+ if (previousFocus instanceof HTMLElement) previousFocus.focus();
55
+ }
56
+ }
57
+ export { CopyButton };
58
+
59
+ //# sourceMappingURL=CopyButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyButton.js","names":[],"sources":["../../src/display/CopyButton.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport { IconButton } from '../actions/IconButton';\n\nconst COPIED_FEEDBACK_MS = 1500;\n\ninterface CopyButtonProps {\n copiedLabel: string;\n label: string;\n value: string;\n}\n\n/** The LAN admin also runs over HTTP, where the async clipboard API is unavailable. */\nexport function CopyButton({ copiedLabel, label, value }: CopyButtonProps) {\n const [copiedValue, setCopiedValue] = useState<string | null>(null);\n const [copying, setCopying] = useState(false);\n const copied = copiedValue === value;\n\n useEffect(() => {\n if (copiedValue === null) return undefined;\n\n const timer = window.setTimeout(() => setCopiedValue(null), COPIED_FEEDBACK_MS);\n\n return () => window.clearTimeout(timer);\n }, [copiedValue]);\n\n return (\n <IconButton\n icon={copied ? <CheckIcon /> : <CopyIcon />}\n aria-label={copied ? copiedLabel : label}\n title={copied ? copiedLabel : label}\n loading={copying}\n onClick={async () => {\n setCopying(true);\n\n try {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(value);\n setCopiedValue(value);\n } else {\n setCopiedValue(copySelection(value) ? value : null);\n }\n } catch {\n setCopiedValue(copySelection(value) ? value : null);\n } finally {\n setCopying(false);\n }\n }}\n tone={copied ? 'success' : 'neutral'}\n />\n );\n}\n\nfunction copySelection(value: string): boolean {\n if (typeof document.execCommand !== 'function') return false;\n\n const previousFocus = document.activeElement;\n const input = document.createElement('textarea');\n\n input.value = value;\n input.readOnly = true;\n input.className = 'fixed -left-full top-0 opacity-0';\n document.body.append(input);\n input.focus({ preventScroll: true });\n input.select();\n\n try {\n return document.execCommand('copy');\n } catch {\n return false;\n } finally {\n input.remove();\n\n if (previousFocus instanceof HTMLElement) previousFocus.focus();\n }\n}\n"],"mappings":";;;;;AAKA,MAAM,qBAAqB;;AAS3B,SAAgB,WAAW,EAAE,aAAa,OAAO,SAA0B;CACvE,MAAM,CAAC,aAAa,kBAAkB,SAAwB,IAAI;CAClE,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,SAAS,gBAAgB;CAE/B,gBAAgB;EACZ,IAAI,gBAAgB,MAAM,OAAO,KAAA;EAEjC,MAAM,QAAQ,OAAO,iBAAiB,eAAe,IAAI,GAAG,kBAAkB;EAE9E,aAAa,OAAO,aAAa,KAAK;CAC1C,GAAG,CAAC,WAAW,CAAC;CAEhB,OACI,oBAAC,YAAD;EACI,MAAM,SAAS,oBAAC,WAAD,CAAY,CAAA,IAAI,oBAAC,UAAD,CAAW,CAAA;EAC1C,cAAY,SAAS,cAAc;EACnC,OAAO,SAAS,cAAc;EAC9B,SAAS;EACT,SAAS,YAAY;GACjB,WAAW,IAAI;GAEf,IAAI;IACA,IAAI,UAAU,WAAW;KACrB,MAAM,UAAU,UAAU,UAAU,KAAK;KACzC,eAAe,KAAK;IACxB,OACI,eAAe,cAAc,KAAK,IAAI,QAAQ,IAAI;GAE1D,QAAQ;IACJ,eAAe,cAAc,KAAK,IAAI,QAAQ,IAAI;GACtD,UAAU;IACN,WAAW,KAAK;GACpB;EACJ;EACA,MAAM,SAAS,YAAY;CAC9B,CAAA;AAET;AAEA,SAAS,cAAc,OAAwB;CAC3C,IAAI,OAAO,SAAS,gBAAgB,YAAY,OAAO;CAEvD,MAAM,gBAAgB,SAAS;CAC/B,MAAM,QAAQ,SAAS,cAAc,UAAU;CAE/C,MAAM,QAAQ;CACd,MAAM,WAAW;CACjB,MAAM,YAAY;CAClB,SAAS,KAAK,OAAO,KAAK;CAC1B,MAAM,MAAM,EAAE,eAAe,KAAK,CAAC;CACnC,MAAM,OAAO;CAEb,IAAI;EACA,OAAO,SAAS,YAAY,MAAM;CACtC,QAAQ;EACJ,OAAO;CACX,UAAU;EACN,MAAM,OAAO;EAEb,IAAI,yBAAyB,aAAa,cAAc,MAAM;CAClE;AACJ"}
@@ -0,0 +1,35 @@
1
+ declare const tones: {
2
+ readonly default: 'text-base-content';
3
+ readonly muted: 'text-base-700';
4
+ readonly warning: 'text-warning';
5
+ };
6
+ export interface DataTableCell {
7
+ id: string;
8
+ text: string;
9
+ /** A smaller second line under the text. */
10
+ detail?: string;
11
+ /** Shown on hover. */
12
+ title?: string;
13
+ tone?: keyof typeof tones;
14
+ }
15
+ export interface DataTableRow {
16
+ id: string;
17
+ label: string;
18
+ /** One per column, in column order. */
19
+ cells: readonly DataTableCell[];
20
+ }
21
+ interface DataTableProps {
22
+ columns: readonly {
23
+ id: string;
24
+ label: string;
25
+ }[];
26
+ /** Names the table for assistive technology. */
27
+ label: string;
28
+ /** Heads the first column, which labels each row. */
29
+ rowHeader: string;
30
+ rows: readonly DataTableRow[];
31
+ }
32
+ /** A compact read-only grid of values: one labelled row per item and one column per subject. */
33
+ export declare function DataTable({ columns, label, rowHeader, rows }: DataTableProps): import("react").JSX.Element;
34
+ export {};
35
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1,53 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ // src/display/DataTable.tsx
3
+ const cellSpacing = "px-4 py-2.5 sm:first:pl-5 sm:last:pr-5";
4
+ const tones = {
5
+ default: "text-base-content",
6
+ muted: "text-base-700",
7
+ warning: "text-warning"
8
+ };
9
+ /** A compact read-only grid of values: one labelled row per item and one column per subject. */
10
+ function DataTable({ columns, label, rowHeader, rows }) {
11
+ return /* @__PURE__ */ jsx("div", {
12
+ className: "overflow-x-auto",
13
+ children: /* @__PURE__ */ jsxs("table", {
14
+ "aria-label": label,
15
+ className: "w-full text-left text-sm leading-5 tabular-nums",
16
+ children: [/* @__PURE__ */ jsx("thead", {
17
+ className: "text-base-700 text-xs leading-4",
18
+ children: /* @__PURE__ */ jsxs("tr", {
19
+ className: "border-base-300 border-b",
20
+ children: [/* @__PURE__ */ jsx("th", {
21
+ scope: "col",
22
+ className: `${cellSpacing} font-medium`,
23
+ children: rowHeader
24
+ }), columns.map((column) => /* @__PURE__ */ jsx("th", {
25
+ scope: "col",
26
+ className: `${cellSpacing} font-medium`,
27
+ children: column.label
28
+ }, column.id))]
29
+ })
30
+ }), /* @__PURE__ */ jsx("tbody", {
31
+ className: "divide-base-300 divide-y",
32
+ children: rows.map((row) => /* @__PURE__ */ jsxs("tr", { children: [/* @__PURE__ */ jsx("th", {
33
+ scope: "row",
34
+ className: `${cellSpacing} text-base-content font-normal`,
35
+ children: row.label
36
+ }), row.cells.map((cell) => /* @__PURE__ */ jsx("td", {
37
+ title: cell.title,
38
+ className: `${cellSpacing} text-xs leading-4 ${tones[cell.tone ?? "default"]}`,
39
+ children: cell.detail ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
40
+ className: "block",
41
+ children: cell.text
42
+ }), /* @__PURE__ */ jsx("span", {
43
+ className: "text-base-700 mt-0.5 block",
44
+ children: cell.detail
45
+ })] }) : cell.text
46
+ }, cell.id))] }, row.id))
47
+ })]
48
+ })
49
+ });
50
+ }
51
+ export { DataTable };
52
+
53
+ //# sourceMappingURL=DataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","names":[],"sources":["../../src/display/DataTable.tsx"],"sourcesContent":["const cellSpacing = 'px-4 py-2.5 sm:first:pl-5 sm:last:pr-5';\n\nconst tones = {\n default: 'text-base-content',\n muted: 'text-base-700',\n warning: 'text-warning',\n} as const;\n\nexport interface DataTableCell {\n id: string;\n text: string;\n /** A smaller second line under the text. */\n detail?: string;\n /** Shown on hover. */\n title?: string;\n tone?: keyof typeof tones;\n}\n\nexport interface DataTableRow {\n id: string;\n label: string;\n /** One per column, in column order. */\n cells: readonly DataTableCell[];\n}\n\ninterface DataTableProps {\n columns: readonly { id: string; label: string }[];\n /** Names the table for assistive technology. */\n label: string;\n /** Heads the first column, which labels each row. */\n rowHeader: string;\n rows: readonly DataTableRow[];\n}\n\n/** A compact read-only grid of values: one labelled row per item and one column per subject. */\nexport function DataTable({ columns, label, rowHeader, rows }: DataTableProps) {\n return (\n <div className=\"overflow-x-auto\">\n <table aria-label={label} className=\"w-full text-left text-sm leading-5 tabular-nums\">\n <thead className=\"text-base-700 text-xs leading-4\">\n <tr className=\"border-base-300 border-b\">\n <th scope=\"col\" className={`${cellSpacing} font-medium`}>\n {rowHeader}\n </th>\n {columns.map((column) => (\n <th key={column.id} scope=\"col\" className={`${cellSpacing} font-medium`}>\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-base-300 divide-y\">\n {rows.map((row) => (\n <tr key={row.id}>\n <th scope=\"row\" className={`${cellSpacing} text-base-content font-normal`}>\n {row.label}\n </th>\n {row.cells.map((cell) => (\n <td\n key={cell.id}\n title={cell.title}\n className={`${cellSpacing} text-xs leading-4 ${tones[cell.tone ?? 'default']}`}\n >\n {cell.detail ? (\n <>\n <span className=\"block\">{cell.text}</span>\n <span className=\"text-base-700 mt-0.5 block\">{cell.detail}</span>\n </>\n ) : (\n cell.text\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":";;AAAA,MAAM,cAAc;AAEpB,MAAM,QAAQ;CACV,SAAS;CACT,OAAO;CACP,SAAS;AACb;;AA6BA,SAAgB,UAAU,EAAE,SAAS,OAAO,WAAW,QAAwB;CAC3E,OACI,oBAAC,OAAD;EAAK,WAAU;EACX,UAAA,qBAAC,SAAD;GAAO,cAAY;GAAO,WAAU;GAApC,UAAA,CACI,oBAAC,SAAD;IAAO,WAAU;IACb,UAAA,qBAAC,MAAD;KAAI,WAAU;KAAd,UAAA,CACI,oBAAC,MAAD;MAAI,OAAM;MAAM,WAAW,GAAG,YAAY;MACrC,UAAA;KACD,CAAA,GACH,QAAQ,KAAK,WACV,oBAAC,MAAD;MAAoB,OAAM;MAAM,WAAW,GAAG,YAAY;MACrD,UAAA,OAAO;KACR,GAFK,OAAO,EAEZ,CACP,CACD;;GACD,CAAA,GACP,oBAAC,SAAD;IAAO,WAAU;IACZ,UAAA,KAAK,KAAK,QACP,qBAAC,MAAD,EAAA,UAAA,CACI,oBAAC,MAAD;KAAI,OAAM;KAAM,WAAW,GAAG,YAAY;KACrC,UAAA,IAAI;IACL,CAAA,GACH,IAAI,MAAM,KAAK,SACZ,oBAAC,MAAD;KAEI,OAAO,KAAK;KACZ,WAAW,GAAG,YAAY,qBAAqB,MAAM,KAAK,QAAQ;KAEjE,UAAA,KAAK,SACF,qBAAA,UAAA,EAAA,UAAA,CACI,oBAAC,QAAD;MAAM,WAAU;MAAS,UAAA,KAAK;KAAW,CAAA,GACzC,oBAAC,QAAD;MAAM,WAAU;MAA8B,UAAA,KAAK;KAAa,CAAA,CAClE,EAAA,CAAA,IAEF,KAAK;IAET,GAZK,KAAK,EAYV,CACP,CACD,EAAA,GApBK,IAAI,EAoBT,CACP;GACE,CAAA,CACJ;;CACN,CAAA;AAEb"}
@@ -0,0 +1,39 @@
1
+ import { ReactNode } from "react";
2
+ type DetailHeroProps = {
3
+ loading: true;
4
+ loadingLabel: string;
5
+ summary?: boolean;
6
+ description?: boolean;
7
+ details?: number;
8
+ } | {
9
+ loading?: false;
10
+ actions?: ReactNode;
11
+ artwork: ReactNode;
12
+ backgroundSrc?: string;
13
+ children: ReactNode;
14
+ label: string;
15
+ subtitle?: ReactNode;
16
+ summary?: ReactNode;
17
+ title: string;
18
+ titleLevel?: 'h1' | 'h2';
19
+ titleLogoSrc?: string;
20
+ };
21
+ export declare function DetailHero(props: DetailHeroProps): import("react").JSX.Element;
22
+ export declare function DetailHeroDetails({ children }: {
23
+ children: ReactNode;
24
+ }): import("react").JSX.Element;
25
+ type DetailProps = {
26
+ loading: true;
27
+ } | {
28
+ loading?: false;
29
+ label: string;
30
+ value: ReactNode;
31
+ };
32
+ export declare function DetailHeroDetail(props: DetailProps): import("react").JSX.Element;
33
+ export declare function DetailHeroTags({ label, moreLabel, values }: {
34
+ label: string;
35
+ moreLabel: string;
36
+ values: readonly string[];
37
+ }): import("react").JSX.Element | null;
38
+ export {};
39
+ //# sourceMappingURL=DetailHero.d.ts.map
@@ -0,0 +1,146 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
3
+ import { Popover } from "../overlays/Popover.js";
4
+ import { Heading, Text } from "../typography/Typography.js";
5
+ import { Badge } from "./Badge.js";
6
+ import { TextPreview } from "./TextPreview.js";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ // src/display/DetailHero.tsx
9
+ function DetailHero(props) {
10
+ const loading = props.loading === true;
11
+ const background = !props.loading && props.backgroundSrc;
12
+ return /* @__PURE__ */ jsx(SkeletonLoader, {
13
+ loading,
14
+ label: props.loading ? props.loadingLabel : "",
15
+ children: /* @__PURE__ */ jsxs("section", {
16
+ className: "relative isolate min-w-0 pb-4",
17
+ children: [background ? /* @__PURE__ */ jsxs("div", {
18
+ "aria-hidden": "true",
19
+ className: "pointer-events-none absolute inset-x-0 -top-2 bottom-0 -z-10 overflow-hidden rounded-2xl [mask-image:linear-gradient(to_bottom,black_55%,transparent)]",
20
+ children: [/* @__PURE__ */ jsx("img", {
21
+ src: background,
22
+ alt: "",
23
+ className: "size-full object-cover opacity-35"
24
+ }), /* @__PURE__ */ jsx("div", { className: "from-base-50 via-base-50/60 to-base-50/20 absolute inset-0 bg-linear-to-t" })]
25
+ }) : null, /* @__PURE__ */ jsxs("div", {
26
+ className: `grid gap-6 sm:grid-cols-[10rem_minmax(0,1fr)] sm:items-center md:grid-cols-[14rem_minmax(0,1fr)] md:gap-8 ${background ? "p-4 sm:p-5" : ""}`,
27
+ children: [/* @__PURE__ */ jsx("div", {
28
+ className: "ring-base-900/10 w-40 self-start overflow-hidden rounded-lg shadow-md ring-1 md:w-full",
29
+ children: props.loading ? /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "artwork" }) : props.artwork
30
+ }), /* @__PURE__ */ jsxs("div", {
31
+ className: "flex min-w-0 flex-col gap-5 md:gap-6",
32
+ children: [
33
+ /* @__PURE__ */ jsxs("div", {
34
+ className: "min-w-0",
35
+ children: [
36
+ /* @__PURE__ */ jsx(Text, {
37
+ variant: "overline",
38
+ tone: "muted",
39
+ className: `mb-2 ${loading ? "max-w-32" : ""}`,
40
+ loading,
41
+ children: !props.loading && props.label
42
+ }),
43
+ /* @__PURE__ */ jsxs("div", {
44
+ className: "flex min-h-8 min-w-0 flex-wrap items-center gap-5",
45
+ children: [/* @__PURE__ */ jsx(Heading, {
46
+ as: props.loading ? "h2" : props.titleLevel ?? "h2",
47
+ variant: "hero",
48
+ className: `min-w-0 wrap-break-word ${loading ? "w-3/4 max-w-xl" : ""}`,
49
+ loading,
50
+ children: !props.loading && (props.titleLogoSrc ? /* @__PURE__ */ jsx("img", {
51
+ src: props.titleLogoSrc,
52
+ alt: props.title,
53
+ className: "max-h-28 w-auto max-w-full object-contain object-left sm:max-w-sm"
54
+ }) : props.title)
55
+ }), !props.loading && props.actions ? /* @__PURE__ */ jsx("div", {
56
+ className: "flex max-w-full shrink-0 flex-wrap items-center gap-3",
57
+ children: props.actions
58
+ }) : null]
59
+ }),
60
+ props.loading || props.subtitle ? /* @__PURE__ */ jsx(Text, {
61
+ variant: "description",
62
+ tone: "muted",
63
+ className: `mt-2 wrap-break-word ${loading ? "max-w-sm" : ""}`,
64
+ loading,
65
+ children: !props.loading && props.subtitle
66
+ }) : null
67
+ ]
68
+ }),
69
+ props.summary ? /* @__PURE__ */ jsx(Text, {
70
+ tone: "muted",
71
+ className: "max-w-xl",
72
+ loading,
73
+ children: !props.loading && props.summary
74
+ }) : null,
75
+ props.loading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DetailHeroDetails, { children: Array.from({ length: props.details ?? 3 }, (_, index) => /* @__PURE__ */ jsx(DetailHeroDetail, { loading: true }, index)) }), props.description ? /* @__PURE__ */ jsx(TextPreview, { loading: true }) : null] }) : props.children
76
+ ]
77
+ })]
78
+ })]
79
+ })
80
+ });
81
+ }
82
+ function DetailHeroDetails({ children }) {
83
+ return /* @__PURE__ */ jsx("dl", {
84
+ className: "grid grid-cols-2 gap-x-8 gap-y-4 sm:flex sm:flex-wrap",
85
+ children
86
+ });
87
+ }
88
+ function DetailHeroDetail(props) {
89
+ return /* @__PURE__ */ jsxs("div", {
90
+ className: props.loading ? "w-24" : "max-w-full min-w-0",
91
+ children: [/* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsx(Text, {
92
+ as: "span",
93
+ variant: "caption",
94
+ tone: "muted",
95
+ loading: props.loading,
96
+ children: !props.loading && props.label
97
+ }) }), /* @__PURE__ */ jsx("dd", {
98
+ className: "mt-1 min-h-6 wrap-break-word",
99
+ children: /* @__PURE__ */ jsx(Text, {
100
+ as: "div",
101
+ variant: "label",
102
+ loading: props.loading,
103
+ children: !props.loading && props.value
104
+ })
105
+ })]
106
+ });
107
+ }
108
+ function DetailHeroTags({ label, moreLabel, values }) {
109
+ if (!values.length) return null;
110
+ return /* @__PURE__ */ jsx(DetailHeroDetail, {
111
+ label,
112
+ value: /* @__PURE__ */ jsxs("div", {
113
+ className: "flex flex-wrap items-baseline gap-x-2 gap-y-1",
114
+ children: [/* @__PURE__ */ jsx("span", { children: values[0] }), values.length > 1 ? /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsx(Popover.Trigger, {
115
+ asChild: true,
116
+ children: /* @__PURE__ */ jsx(Button, {
117
+ className: "h-5 px-1.5 py-0 text-xs leading-5 before:-inset-y-3 sm:h-5",
118
+ "aria-label": `${label}: ${moreLabel}`,
119
+ variant: "quiet",
120
+ children: moreLabel
121
+ })
122
+ }), /* @__PURE__ */ jsxs(Popover.Content, {
123
+ align: "start",
124
+ width: "sm",
125
+ "aria-label": label,
126
+ children: [/* @__PURE__ */ jsx(Text, {
127
+ variant: "label",
128
+ children: label
129
+ }), /* @__PURE__ */ jsx("ul", {
130
+ className: "mt-3 flex flex-wrap gap-2",
131
+ children: values.map((value) => /* @__PURE__ */ jsx("li", {
132
+ className: "max-w-full min-w-0",
133
+ children: /* @__PURE__ */ jsx(Badge, {
134
+ tone: "neutral",
135
+ className: "max-w-full wrap-break-word whitespace-normal",
136
+ children: value
137
+ })
138
+ }, value))
139
+ })]
140
+ })] }) : null]
141
+ })
142
+ });
143
+ }
144
+ export { DetailHero, DetailHeroDetail, DetailHeroDetails, DetailHeroTags };
145
+
146
+ //# sourceMappingURL=DetailHero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailHero.js","names":[],"sources":["../../src/display/DetailHero.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Popover } from '../overlays/Popover';\nimport { Heading, Text } from '../typography/Typography';\nimport { Badge } from './Badge';\nimport { TextPreview } from './TextPreview';\n\ntype DetailHeroProps =\n | { loading: true; loadingLabel: string; summary?: boolean; description?: boolean; details?: number }\n | {\n loading?: false;\n actions?: ReactNode;\n artwork: ReactNode;\n backgroundSrc?: string;\n children: ReactNode;\n label: string;\n subtitle?: ReactNode;\n summary?: ReactNode;\n title: string;\n titleLevel?: 'h1' | 'h2';\n titleLogoSrc?: string;\n };\n\nexport function DetailHero(props: DetailHeroProps) {\n const loading = props.loading === true;\n const background = !props.loading && props.backgroundSrc;\n\n return (\n <SkeletonLoader loading={loading} label={props.loading ? props.loadingLabel : ''}>\n <section className=\"relative isolate min-w-0 pb-4\">\n {background ? (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 -top-2 bottom-0 -z-10 overflow-hidden rounded-2xl [mask-image:linear-gradient(to_bottom,black_55%,transparent)]\"\n >\n <img src={background} alt=\"\" className=\"size-full object-cover opacity-35\" />\n <div className=\"from-base-50 via-base-50/60 to-base-50/20 absolute inset-0 bg-linear-to-t\" />\n </div>\n ) : null}\n <div\n className={`grid gap-6 sm:grid-cols-[10rem_minmax(0,1fr)] sm:items-center md:grid-cols-[14rem_minmax(0,1fr)] md:gap-8 ${background ? 'p-4 sm:p-5' : ''}`}\n >\n <div className=\"ring-base-900/10 w-40 self-start overflow-hidden rounded-lg shadow-md ring-1 md:w-full\">\n {props.loading ? <SkeletonLoader.Shape presentation=\"artwork\" /> : props.artwork}\n </div>\n <div className=\"flex min-w-0 flex-col gap-5 md:gap-6\">\n <div className=\"min-w-0\">\n <Text\n variant=\"overline\"\n tone=\"muted\"\n className={`mb-2 ${loading ? 'max-w-32' : ''}`}\n loading={loading}\n >\n {!props.loading && props.label}\n </Text>\n <div className=\"flex min-h-8 min-w-0 flex-wrap items-center gap-5\">\n <Heading\n as={props.loading ? 'h2' : (props.titleLevel ?? 'h2')}\n variant=\"hero\"\n className={`min-w-0 wrap-break-word ${loading ? 'w-3/4 max-w-xl' : ''}`}\n loading={loading}\n >\n {!props.loading &&\n (props.titleLogoSrc ? (\n <img\n src={props.titleLogoSrc}\n alt={props.title}\n className=\"max-h-28 w-auto max-w-full object-contain object-left sm:max-w-sm\"\n />\n ) : (\n props.title\n ))}\n </Heading>\n {!props.loading && props.actions ? (\n <div className=\"flex max-w-full shrink-0 flex-wrap items-center gap-3\">\n {props.actions}\n </div>\n ) : null}\n </div>\n {props.loading || props.subtitle ? (\n <Text\n variant=\"description\"\n tone=\"muted\"\n className={`mt-2 wrap-break-word ${loading ? 'max-w-sm' : ''}`}\n loading={loading}\n >\n {!props.loading && props.subtitle}\n </Text>\n ) : null}\n </div>\n {props.summary ? (\n <Text tone=\"muted\" className=\"max-w-xl\" loading={loading}>\n {!props.loading && props.summary}\n </Text>\n ) : null}\n {props.loading ? (\n <>\n <DetailHeroDetails>\n {Array.from({ length: props.details ?? 3 }, (_, index) => (\n <DetailHeroDetail key={index} loading />\n ))}\n </DetailHeroDetails>\n {props.description ? <TextPreview loading /> : null}\n </>\n ) : (\n props.children\n )}\n </div>\n </div>\n </section>\n </SkeletonLoader>\n );\n}\n\nexport function DetailHeroDetails({ children }: { children: ReactNode }) {\n return <dl className=\"grid grid-cols-2 gap-x-8 gap-y-4 sm:flex sm:flex-wrap\">{children}</dl>;\n}\n\ntype DetailProps = { loading: true } | { loading?: false; label: string; value: ReactNode };\n\nexport function DetailHeroDetail(props: DetailProps) {\n return (\n <div className={props.loading ? 'w-24' : 'max-w-full min-w-0'}>\n <dt>\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" loading={props.loading}>\n {!props.loading && props.label}\n </Text>\n </dt>\n <dd className=\"mt-1 min-h-6 wrap-break-word\">\n <Text as=\"div\" variant=\"label\" loading={props.loading}>\n {!props.loading && props.value}\n </Text>\n </dd>\n </div>\n );\n}\n\nexport function DetailHeroTags({\n label,\n moreLabel,\n values,\n}: {\n label: string;\n moreLabel: string;\n values: readonly string[];\n}) {\n if (!values.length) return null;\n\n return (\n <DetailHeroDetail\n label={label}\n value={\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span>{values[0]}</span>\n {values.length > 1 ? (\n <Popover>\n <Popover.Trigger asChild>\n {/* One line of the label's height at every width, so the row matches the others;\n the hit area extends past it instead. */}\n <Button\n className=\"h-5 px-1.5 py-0 text-xs leading-5 before:-inset-y-3 sm:h-5\"\n aria-label={`${label}: ${moreLabel}`}\n variant=\"quiet\"\n >\n {moreLabel}\n </Button>\n </Popover.Trigger>\n <Popover.Content align=\"start\" width=\"sm\" aria-label={label}>\n <Text variant=\"label\">{label}</Text>\n <ul className=\"mt-3 flex flex-wrap gap-2\">\n {values.map((value) => (\n <li key={value} className=\"max-w-full min-w-0\">\n <Badge\n tone=\"neutral\"\n className=\"max-w-full wrap-break-word whitespace-normal\"\n >\n {value}\n </Badge>\n </li>\n ))}\n </ul>\n </Popover.Content>\n </Popover>\n ) : null}\n </div>\n }\n />\n );\n}\n"],"mappings":";;;;;;;;AAyBA,SAAgB,WAAW,OAAwB;CAC/C,MAAM,UAAU,MAAM,YAAY;CAClC,MAAM,aAAa,CAAC,MAAM,WAAW,MAAM;CAE3C,OACI,oBAAC,gBAAD;EAAyB;EAAS,OAAO,MAAM,UAAU,MAAM,eAAe;EAC1E,UAAA,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACK,aACG,qBAAC,OAAD;IACI,eAAY;IACZ,WAAU;IAFd,UAAA,CAII,oBAAC,OAAD;KAAK,KAAK;KAAY,KAAI;KAAG,WAAU;IAAqC,CAAA,GAC5E,oBAAC,OAAD,EAAK,WAAU,4EAA6E,CAAA,CAC3F;GACL,CAAA,IAAA,MACJ,qBAAC,OAAD;IACI,WAAW,6GAA6G,aAAa,eAAe;IADxJ,UAAA,CAGI,oBAAC,OAAD;KAAK,WAAU;KACV,UAAA,MAAM,UAAU,oBAAC,eAAe,OAAhB,EAAsB,cAAa,UAAW,CAAA,IAAI,MAAM;IACxE,CAAA,GACL,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACI,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACI,oBAAC,MAAD;SACI,SAAQ;SACR,MAAK;SACL,WAAW,QAAQ,UAAU,aAAa;SACjC;SAER,UAAA,CAAC,MAAM,WAAW,MAAM;QACvB,CAAA;QACN,qBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACI,oBAAC,SAAD;UACI,IAAI,MAAM,UAAU,OAAQ,MAAM,cAAc;UAChD,SAAQ;UACR,WAAW,2BAA2B,UAAU,mBAAmB;UAC1D;UAER,UAAA,CAAC,MAAM,YACH,MAAM,eACH,oBAAC,OAAD;WACI,KAAK,MAAM;WACX,KAAK,MAAM;WACX,WAAU;UACb,CAAA,IAED,MAAM;SAET,CAAA,GACR,CAAC,MAAM,WAAW,MAAM,UACrB,oBAAC,OAAD;UAAK,WAAU;UACV,UAAA,MAAM;SACN,CAAA,IACL,IACH;;QACJ,MAAM,WAAW,MAAM,WACpB,oBAAC,MAAD;SACI,SAAQ;SACR,MAAK;SACL,WAAW,wBAAwB,UAAU,aAAa;SACjD;SAER,UAAA,CAAC,MAAM,WAAW,MAAM;QACvB,CAAA,IACN;OACH;;MACJ,MAAM,UACH,oBAAC,MAAD;OAAM,MAAK;OAAQ,WAAU;OAAoB;OAC5C,UAAA,CAAC,MAAM,WAAW,MAAM;MACvB,CAAA,IACN;MACH,MAAM,UACH,qBAAA,UAAA,EAAA,UAAA,CACI,oBAAC,mBAAD,EAAA,UACK,MAAM,KAAK,EAAE,QAAQ,MAAM,WAAW,EAAE,IAAI,GAAG,UAC5C,oBAAC,kBAAD,EAA8B,SAAA,KAAS,GAAhB,KAAgB,CAC1C,EACc,CAAA,GAClB,MAAM,cAAc,oBAAC,aAAD,EAAa,SAAA,KAAS,CAAA,IAAI,IACjD,EAAA,CAAA,IAEF,MAAM;KAET;IACJ,CAAA,CAAA;GACA,CAAA,CAAA;;CACG,CAAA;AAExB;AAEA,SAAgB,kBAAkB,EAAE,YAAqC;CACrE,OAAO,oBAAC,MAAD;EAAI,WAAU;EAAyD;CAAa,CAAA;AAC/F;AAIA,SAAgB,iBAAiB,OAAoB;CACjD,OACI,qBAAC,OAAD;EAAK,WAAW,MAAM,UAAU,SAAS;EAAzC,UAAA,CACI,oBAAC,MAAD,EAAA,UACI,oBAAC,MAAD;GAAM,IAAG;GAAO,SAAQ;GAAU,MAAK;GAAQ,SAAS,MAAM;GACzD,UAAA,CAAC,MAAM,WAAW,MAAM;EACvB,CAAA,EACN,CAAA,GACJ,oBAAC,MAAD;GAAI,WAAU;GACV,UAAA,oBAAC,MAAD;IAAM,IAAG;IAAM,SAAQ;IAAQ,SAAS,MAAM;IACzC,UAAA,CAAC,MAAM,WAAW,MAAM;GACvB,CAAA;EACN,CAAA,CACH;;AAEb;AAEA,SAAgB,eAAe,EAC3B,OACA,WACA,UAKD;CACC,IAAI,CAAC,OAAO,QAAQ,OAAO;CAE3B,OACI,oBAAC,kBAAD;EACW;EACP,OACI,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,oBAAC,QAAD,EAAA,UAAO,OAAO,GAAS,CAAA,GACtB,OAAO,SAAS,IACb,qBAAC,SAAD,EAAA,UAAA,CACI,oBAAC,QAAQ,SAAT;IAAiB,SAAA;IAGb,UAAA,oBAAC,QAAD;KACI,WAAU;KACV,cAAY,GAAG,MAAM,IAAI;KACzB,SAAQ;KAEP,UAAA;IACG,CAAA;GACK,CAAA,GACjB,qBAAC,QAAQ,SAAT;IAAiB,OAAM;IAAQ,OAAM;IAAK,cAAY;IAAtD,UAAA,CACI,oBAAC,MAAD;KAAM,SAAQ;KAAS,UAAA;IAAY,CAAA,GACnC,oBAAC,MAAD;KAAI,WAAU;KACT,UAAA,OAAO,KAAK,UACT,oBAAC,MAAD;MAAgB,WAAU;MACtB,UAAA,oBAAC,OAAD;OACI,MAAK;OACL,WAAU;OAET,UAAA;MACE,CAAA;KACP,GAPK,KAOL,CACP;IACD,CAAA,CACS;GACZ,CAAA,CAAA,EAAA,CAAA,IACT,IACH;;CAEZ,CAAA;AAET"}
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from "react";
2
+ interface DetailListItem {
3
+ actions?: ReactNode;
4
+ key?: string;
5
+ label: string;
6
+ value: string;
7
+ }
8
+ interface DetailListProps {
9
+ compact?: boolean;
10
+ items: readonly DetailListItem[];
11
+ title: string;
12
+ }
13
+ export declare function DetailList({ compact, items, title }: DetailListProps): import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=DetailList.d.ts.map
@@ -0,0 +1,53 @@
1
+ import { Stack as Stack$1 } from "../layout/Flow.js";
2
+ import { Text } from "../typography/Typography.js";
3
+ import { Code } from "@ninna-ui/primitives";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Box } from "@ninna-ui/layout";
6
+ // src/display/DetailList.tsx
7
+ function DetailList({ compact = false, items, title }) {
8
+ return /* @__PURE__ */ jsxs(Box, {
9
+ className: compact ? "min-w-0" : "border-base-300 mt-1 border-t px-2 pt-3 pb-1",
10
+ children: [!compact ? /* @__PURE__ */ jsx(Text, {
11
+ as: "span",
12
+ variant: "overline",
13
+ tone: "muted",
14
+ children: title
15
+ }) : null, /* @__PURE__ */ jsx(Stack$1, {
16
+ as: "dl",
17
+ "aria-label": title,
18
+ space: compact ? "none" : "related",
19
+ className: compact ? "min-w-0" : "mt-2",
20
+ children: items.map((item) => /* @__PURE__ */ jsxs("div", {
21
+ className: compact ? "grid min-w-0 grid-cols-[minmax(0,5rem)_minmax(0,1fr)] items-center gap-2" : "flex min-w-0 items-center justify-between gap-3",
22
+ children: [/* @__PURE__ */ jsx("dt", {
23
+ className: compact ? "min-w-0" : "shrink-0",
24
+ children: /* @__PURE__ */ jsx(Text, {
25
+ as: "span",
26
+ className: compact ? "block" : void 0,
27
+ variant: "caption",
28
+ tone: "muted",
29
+ truncate: compact,
30
+ title: item.label,
31
+ children: item.label
32
+ })
33
+ }), /* @__PURE__ */ jsx("dd", {
34
+ className: "min-w-0",
35
+ children: /* @__PURE__ */ jsxs("div", {
36
+ className: "flex min-w-0 items-center gap-1",
37
+ children: [/* @__PURE__ */ jsx(Code, {
38
+ title: item.value,
39
+ className: "block max-w-full min-w-0 flex-1 truncate px-1.5 py-0.5 text-xs",
40
+ children: item.value
41
+ }), item.actions ? /* @__PURE__ */ jsx("span", {
42
+ className: "flex shrink-0 items-center",
43
+ children: item.actions
44
+ }) : null]
45
+ })
46
+ })]
47
+ }, item.key ?? item.label))
48
+ })]
49
+ });
50
+ }
51
+ export { DetailList };
52
+
53
+ //# sourceMappingURL=DetailList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailList.js","names":["Stack"],"sources":["../../src/display/DetailList.tsx"],"sourcesContent":["import { Box } from '@ninna-ui/layout';\nimport { Code } from '@ninna-ui/primitives';\nimport type { ReactNode } from 'react';\n\nimport { Stack } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\ninterface DetailListItem {\n actions?: ReactNode;\n key?: string;\n label: string;\n value: string;\n}\n\ninterface DetailListProps {\n compact?: boolean;\n items: readonly DetailListItem[];\n title: string;\n}\n\nexport function DetailList({ compact = false, items, title }: DetailListProps) {\n return (\n <Box className={compact ? 'min-w-0' : 'border-base-300 mt-1 border-t px-2 pt-3 pb-1'}>\n {!compact ? (\n <Text as=\"span\" variant=\"overline\" tone=\"muted\">\n {title}\n </Text>\n ) : null}\n <Stack\n as=\"dl\"\n aria-label={title}\n space={compact ? 'none' : 'related'}\n className={compact ? 'min-w-0' : 'mt-2'}\n >\n {items.map((item) => (\n <div\n key={item.key ?? item.label}\n className={\n compact\n ? 'grid min-w-0 grid-cols-[minmax(0,5rem)_minmax(0,1fr)] items-center gap-2'\n : 'flex min-w-0 items-center justify-between gap-3'\n }\n >\n <dt className={compact ? 'min-w-0' : 'shrink-0'}>\n <Text\n as=\"span\"\n className={compact ? 'block' : undefined}\n variant=\"caption\"\n tone=\"muted\"\n truncate={compact}\n title={item.label}\n >\n {item.label}\n </Text>\n </dt>\n <dd className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <Code\n title={item.value}\n className=\"block max-w-full min-w-0 flex-1 truncate px-1.5 py-0.5 text-xs\"\n >\n {item.value}\n </Code>\n {item.actions ? (\n <span className=\"flex shrink-0 items-center\">{item.actions}</span>\n ) : null}\n </div>\n </dd>\n </div>\n ))}\n </Stack>\n </Box>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,WAAW,EAAE,UAAU,OAAO,OAAO,SAA0B;CAC3E,OACI,qBAAC,KAAD;EAAK,WAAW,UAAU,YAAY;EAAtC,UAAA,CACK,CAAC,UACE,oBAAC,MAAD;GAAM,IAAG;GAAO,SAAQ;GAAW,MAAK;GACnC,UAAA;EACC,CAAA,IACN,MACJ,oBAACA,SAAD;GACI,IAAG;GACH,cAAY;GACZ,OAAO,UAAU,SAAS;GAC1B,WAAW,UAAU,YAAY;GAEhC,UAAA,MAAM,KAAK,SACR,qBAAC,OAAD;IAEI,WACI,UACM,6EACA;IALd,UAAA,CAQI,oBAAC,MAAD;KAAI,WAAW,UAAU,YAAY;KACjC,UAAA,oBAAC,MAAD;MACI,IAAG;MACH,WAAW,UAAU,UAAU,KAAA;MAC/B,SAAQ;MACR,MAAK;MACL,UAAU;MACV,OAAO,KAAK;MAEX,UAAA,KAAK;KACJ,CAAA;IACN,CAAA,GACJ,oBAAC,MAAD;KAAI,WAAU;KACV,UAAA,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACI,oBAAC,MAAD;OACI,OAAO,KAAK;OACZ,WAAU;OAET,UAAA,KAAK;MACJ,CAAA,GACL,KAAK,UACF,oBAAC,QAAD;OAAM,WAAU;OAA8B,UAAA,KAAK;MAAc,CAAA,IACjE,IACH;;IACL,CAAA,CACH;GAhCI,GAAA,KAAK,OAAO,KAAK,KAgCrB,CACR;EACE,CAAA,CACN;;AAEb"}
@@ -0,0 +1,18 @@
1
+ import { ReactNode } from "react";
2
+ interface DeviceCardProps {
3
+ /** A control in the top corner, for example a limit select. */
4
+ action?: ReactNode;
5
+ /** Beside the name, for example a status badge. */
6
+ badge?: ReactNode;
7
+ children: ReactNode;
8
+ detail?: string;
9
+ /** Below the content, past a divider, for example the device's encoder. */
10
+ footer?: ReactNode;
11
+ /** Dashed, for a device that is detected but cannot be used. */
12
+ unavailable?: boolean;
13
+ name: string;
14
+ }
15
+ /** One piece of hardware: its name and detail, a corner control and its content. */
16
+ export declare function DeviceCard({ action, badge, children, detail, footer, name, unavailable }: DeviceCardProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=DeviceCard.d.ts.map