@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,48 @@
1
+ import { Inline, Stack } from "../layout/Flow.js";
2
+ import { Text } from "../typography/Typography.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ // src/display/DeviceCard.tsx
5
+ /** One piece of hardware: its name and detail, a corner control and its content. */
6
+ function DeviceCard({ action, badge, children, detail, footer, name, unavailable = false }) {
7
+ return /* @__PURE__ */ jsxs("article", {
8
+ "aria-label": name,
9
+ className: `flex min-w-0 flex-col gap-4 rounded-lg p-4 ${unavailable ? "border-base-300 border border-dashed" : "border-base-300 bg-base-100 border shadow-xs"}`,
10
+ children: [
11
+ /* @__PURE__ */ jsxs("div", {
12
+ className: "flex min-w-0 items-start justify-between gap-3",
13
+ children: [/* @__PURE__ */ jsxs(Stack, {
14
+ space: "none",
15
+ className: "min-w-0",
16
+ children: [/* @__PURE__ */ jsxs(Inline, {
17
+ align: "center",
18
+ space: "related",
19
+ className: "min-w-0",
20
+ children: [/* @__PURE__ */ jsx(Text, {
21
+ as: "span",
22
+ variant: "label",
23
+ truncate: true,
24
+ title: name,
25
+ children: name
26
+ }), badge]
27
+ }), detail ? /* @__PURE__ */ jsx(Text, {
28
+ as: "span",
29
+ variant: "caption",
30
+ tone: "muted",
31
+ children: detail
32
+ }) : null]
33
+ }), action ? /* @__PURE__ */ jsx("div", {
34
+ className: "w-28 shrink-0",
35
+ children: action
36
+ }) : null]
37
+ }),
38
+ children,
39
+ footer ? /* @__PURE__ */ jsx("div", {
40
+ className: "border-base-300 border-t pt-3",
41
+ children: footer
42
+ }) : null
43
+ ]
44
+ });
45
+ }
46
+ export { DeviceCard };
47
+
48
+ //# sourceMappingURL=DeviceCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceCard.js","names":[],"sources":["../../src/display/DeviceCard.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Inline, Stack } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\ninterface DeviceCardProps {\n /** A control in the top corner, for example a limit select. */\n action?: ReactNode;\n /** Beside the name, for example a status badge. */\n badge?: ReactNode;\n children: ReactNode;\n detail?: string;\n /** Below the content, past a divider, for example the device's encoder. */\n footer?: ReactNode;\n /** Dashed, for a device that is detected but cannot be used. */\n unavailable?: boolean;\n name: string;\n}\n\n/** One piece of hardware: its name and detail, a corner control and its content. */\nexport function DeviceCard({ action, badge, children, detail, footer, name, unavailable = false }: DeviceCardProps) {\n return (\n <article\n aria-label={name}\n className={`flex min-w-0 flex-col gap-4 rounded-lg p-4 ${\n unavailable ? 'border-base-300 border border-dashed' : 'border-base-300 bg-base-100 border shadow-xs'\n }`}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <Stack space=\"none\" className=\"min-w-0\">\n <Inline align=\"center\" space=\"related\" className=\"min-w-0\">\n <Text as=\"span\" variant=\"label\" truncate title={name}>\n {name}\n </Text>\n {badge}\n </Inline>\n {detail ? (\n <Text as=\"span\" variant=\"caption\" tone=\"muted\">\n {detail}\n </Text>\n ) : null}\n </Stack>\n {action ? <div className=\"w-28 shrink-0\">{action}</div> : null}\n </div>\n {children}\n {footer ? <div className=\"border-base-300 border-t pt-3\">{footer}</div> : null}\n </article>\n );\n}\n"],"mappings":";;;;;AAoBA,SAAgB,WAAW,EAAE,QAAQ,OAAO,UAAU,QAAQ,QAAQ,MAAM,cAAc,SAA0B;CAChH,OACI,qBAAC,WAAD;EACI,cAAY;EACZ,WAAW,8CACP,cAAc,yCAAyC;EAH/D,UAAA;GAMI,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,qBAAC,OAAD;KAAO,OAAM;KAAO,WAAU;KAA9B,UAAA,CACI,qBAAC,QAAD;MAAQ,OAAM;MAAS,OAAM;MAAU,WAAU;MAAjD,UAAA,CACI,oBAAC,MAAD;OAAM,IAAG;OAAO,SAAQ;OAAQ,UAAA;OAAS,OAAO;OAC3C,UAAA;MACC,CAAA,GACL,KACG;KACP,CAAA,GAAA,SACG,oBAAC,MAAD;MAAM,IAAG;MAAO,SAAQ;MAAU,MAAK;MAClC,UAAA;KACC,CAAA,IACN,IACD;IACN,CAAA,GAAA,SAAS,oBAAC,OAAD;KAAK,WAAU;KAAiB,UAAA;IAAY,CAAA,IAAI,IACzD;;GACJ;GACA,SAAS,oBAAC,OAAD;IAAK,WAAU;IAAiC,UAAA;GAAY,CAAA,IAAI;EACrE;;AAEjB"}
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from "react";
2
+ interface IdentityProps {
3
+ artwork: ReactNode;
4
+ detail?: string;
5
+ tag?: string;
6
+ title?: ReactNode;
7
+ presentation?: 'square' | 'poster';
8
+ /** Heads its page: a larger poster, an overline naming what it belongs to, and the title as the page's h1. */
9
+ overline?: string;
10
+ }
11
+ /** A compact "what is this" strip: small framed artwork beside a title, one line of facts, and an optional tag. */
12
+ export declare function Identity({ artwork, detail, tag, title, overline, presentation }: IdentityProps): import("react").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=Identity.d.ts.map
@@ -0,0 +1,54 @@
1
+ import { Stack } from "../layout/Flow.js";
2
+ import { Heading, Text } from "../typography/Typography.js";
3
+ import { Badge } from "./Badge.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/display/Identity.tsx
6
+ /** A compact "what is this" strip: small framed artwork beside a title, one line of facts, and an optional tag. */
7
+ function Identity({ artwork, detail, tag, title, overline, presentation = "square" }) {
8
+ const heading = overline !== void 0;
9
+ return /* @__PURE__ */ jsxs("div", {
10
+ className: `flex min-w-0 items-center ${heading ? "gap-6" : "gap-4"}`,
11
+ children: [/* @__PURE__ */ jsx("div", {
12
+ className: `${presentation === "poster" ? `${heading ? "w-24" : "w-16"} aspect-[2/3]` : "size-16"} ring-base-900/10 shrink-0 overflow-hidden rounded-lg shadow-sm ring-1`,
13
+ children: artwork
14
+ }), /* @__PURE__ */ jsxs(Stack, {
15
+ space: "tight",
16
+ className: "min-w-0 flex-1",
17
+ children: [
18
+ heading ? /* @__PURE__ */ jsx(Text, {
19
+ variant: "overline",
20
+ tone: "muted",
21
+ truncate: true,
22
+ children: overline
23
+ }) : null,
24
+ title && heading ? /* @__PURE__ */ jsx(Heading, {
25
+ as: "h1",
26
+ variant: "page",
27
+ children: title
28
+ }) : title ? /* @__PURE__ */ jsx(Text, {
29
+ as: "span",
30
+ truncate: true,
31
+ variant: "label",
32
+ children: title
33
+ }) : null,
34
+ detail ? /* @__PURE__ */ jsx(Text, {
35
+ as: "span",
36
+ truncate: true,
37
+ title: detail,
38
+ tone: "muted",
39
+ children: detail
40
+ }) : null,
41
+ tag ? /* @__PURE__ */ jsx("div", {
42
+ className: "mt-1 flex",
43
+ children: /* @__PURE__ */ jsx(Badge, {
44
+ tone: "neutral",
45
+ children: tag
46
+ })
47
+ }) : null
48
+ ]
49
+ })]
50
+ });
51
+ }
52
+ export { Identity };
53
+
54
+ //# sourceMappingURL=Identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Identity.js","names":[],"sources":["../../src/display/Identity.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Stack } from '../layout/Flow';\nimport { Heading, Text } from '../typography/Typography';\nimport { Badge } from './Badge';\n\ninterface IdentityProps {\n artwork: ReactNode;\n detail?: string;\n tag?: string;\n title?: ReactNode;\n presentation?: 'square' | 'poster';\n /** Heads its page: a larger poster, an overline naming what it belongs to, and the title as the page's h1. */\n overline?: string;\n}\n\n/** A compact \"what is this\" strip: small framed artwork beside a title, one line of facts, and an optional tag. */\nexport function Identity({ artwork, detail, tag, title, overline, presentation = 'square' }: IdentityProps) {\n const heading = overline !== undefined;\n\n return (\n <div className={`flex min-w-0 items-center ${heading ? 'gap-6' : 'gap-4'}`}>\n <div\n className={`${presentation === 'poster' ? `${heading ? 'w-24' : 'w-16'} aspect-[2/3]` : 'size-16'} ring-base-900/10 shrink-0 overflow-hidden rounded-lg shadow-sm ring-1`}\n >\n {artwork}\n </div>\n <Stack space=\"tight\" className=\"min-w-0 flex-1\">\n {heading ? (\n <Text variant=\"overline\" tone=\"muted\" truncate>\n {overline}\n </Text>\n ) : null}\n {title && heading ? (\n <Heading as=\"h1\" variant=\"page\">\n {title}\n </Heading>\n ) : title ? (\n <Text as=\"span\" truncate variant=\"label\">\n {title}\n </Text>\n ) : null}\n {detail ? (\n <Text as=\"span\" truncate title={detail} tone=\"muted\">\n {detail}\n </Text>\n ) : null}\n {tag ? (\n <div className=\"mt-1 flex\">\n <Badge tone=\"neutral\">{tag}</Badge>\n </div>\n ) : null}\n </Stack>\n </div>\n );\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,SAAS,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,eAAe,YAA2B;CACxG,MAAM,UAAU,aAAa,KAAA;CAE7B,OACI,qBAAC,OAAD;EAAK,WAAW,6BAA6B,UAAU,UAAU;EAAjE,UAAA,CACI,oBAAC,OAAD;GACI,WAAW,GAAG,iBAAiB,WAAW,GAAG,UAAU,SAAS,OAAO,iBAAiB,UAAU;GAEjG,UAAA;EACA,CAAA,GACL,qBAAC,OAAD;GAAO,OAAM;GAAQ,WAAU;GAA/B,UAAA;IACK,UACG,oBAAC,MAAD;KAAM,SAAQ;KAAW,MAAK;KAAQ,UAAA;KACjC,UAAA;IACC,CAAA,IACN;IACH,SAAS,UACN,oBAAC,SAAD;KAAS,IAAG;KAAK,SAAQ;KACpB,UAAA;IACI,CAAA,IACT,QACA,oBAAC,MAAD;KAAM,IAAG;KAAO,UAAA;KAAS,SAAQ;KAC5B,UAAA;IACC,CAAA,IACN;IACH,SACG,oBAAC,MAAD;KAAM,IAAG;KAAO,UAAA;KAAS,OAAO;KAAQ,MAAK;KACxC,UAAA;IACC,CAAA,IACN;IACH,MACG,oBAAC,OAAD;KAAK,WAAU;KACX,UAAA,oBAAC,OAAD;MAAO,MAAK;MAAW,UAAA;KAAW,CAAA;IACjC,CAAA,IACL;GACD;EACN,CAAA,CAAA;;AAEb"}
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from "react";
2
+ type ImageCardProps = {
3
+ loading: true;
4
+ textRows?: 1 | 2 | 3;
5
+ aspect?: 'square' | 'poster';
6
+ } | {
7
+ loading?: false;
8
+ artwork: ReactNode;
9
+ onClick?: () => void;
10
+ href?: string;
11
+ onNavigate?: (href: string) => void;
12
+ subtitle?: ReactNode;
13
+ label?: string;
14
+ detail?: string;
15
+ title: string;
16
+ presentation?: 'person' | 'poster';
17
+ /** A short qualifier shown muted after the title on the same line, such as an edition. */
18
+ titleDetail?: string;
19
+ };
20
+ export declare function ImageCard(props: ImageCardProps): import("react").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=ImageCard.d.ts.map
@@ -0,0 +1,63 @@
1
+ import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
2
+ import { tabbable } from "../foundations/KeyboardFocus.js";
3
+ import { Stack } from "../layout/Flow.js";
4
+ import { LinkBox, LinkOverlay } from "../typography/Link.js";
5
+ import { Text } from "../typography/Typography.js";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ // src/display/ImageCard.tsx
8
+ function ImageCard(props) {
9
+ const lines = props.loading ? Array.from({ length: props.textRows ?? 2 }, () => void 0) : [
10
+ props.titleDetail ? /* @__PURE__ */ jsxs(Fragment, { children: [props.title, /* @__PURE__ */ jsxs("span", {
11
+ className: "text-base-700 font-normal",
12
+ children: [" · ", props.titleDetail]
13
+ })] }) : props.title,
14
+ ...props.subtitle || props.detail ? [props.subtitle || "\xA0"] : [],
15
+ ...props.detail ? [props.detail] : []
16
+ ];
17
+ const label = props.loading ? void 0 : props.label ?? [
18
+ props.title,
19
+ props.titleDetail,
20
+ typeof props.subtitle === "string" ? props.subtitle : void 0,
21
+ props.detail
22
+ ].filter(Boolean).join(", ");
23
+ const content = /* @__PURE__ */ jsxs(Stack, {
24
+ space: "related",
25
+ className: "min-w-0 text-left",
26
+ children: [props.loading ? /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: props.aspect === "poster" ? "poster" : "artwork" }) : props.presentation === "person" ? /* @__PURE__ */ jsx("span", {
27
+ className: "block size-16 overflow-hidden rounded-full [&>div]:size-full",
28
+ children: props.artwork
29
+ }) : props.artwork, /* @__PURE__ */ jsx(Stack, {
30
+ space: "none",
31
+ className: "min-w-0",
32
+ children: lines.map((line, index) => /* @__PURE__ */ jsx(Text, {
33
+ as: "span",
34
+ variant: index === 0 ? "label" : "caption",
35
+ tone: index === 0 ? "default" : "muted",
36
+ truncate: props.loading || !props.presentation,
37
+ className: !props.loading && props.presentation ? "wrap-anywhere" : void 0,
38
+ loading: props.loading,
39
+ children: !props.loading && props.href && index === 0 ? /* @__PURE__ */ jsx(LinkOverlay, {
40
+ href: props.href,
41
+ onNavigate: props.onNavigate,
42
+ "aria-label": label,
43
+ children: line
44
+ }) : line
45
+ }, index))
46
+ })]
47
+ });
48
+ if (props.loading || !props.href && !props.onClick) return content;
49
+ return /* @__PURE__ */ jsxs(LinkBox, {
50
+ className: "group/media-item rounded-lg",
51
+ children: [content, !props.href && props.onClick ? /* @__PURE__ */ jsx("button", {
52
+ ...tabbable,
53
+ type: "button",
54
+ "data-slot": "action-overlay",
55
+ "aria-label": label,
56
+ className: "focus-visible:outline-primary absolute inset-0 z-1 w-full cursor-pointer rounded-lg focus-visible:outline-2 focus-visible:outline-offset-2",
57
+ onClick: props.onClick
58
+ }) : null]
59
+ });
60
+ }
61
+ export { ImageCard };
62
+
63
+ //# sourceMappingURL=ImageCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageCard.js","names":[],"sources":["../../src/display/ImageCard.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { Stack } from '../layout/Flow';\nimport { LinkBox, LinkOverlay } from '../typography/Link';\nimport { Text } from '../typography/Typography';\n\ntype ImageCardProps =\n | { loading: true; textRows?: 1 | 2 | 3; aspect?: 'square' | 'poster' }\n | {\n loading?: false;\n artwork: ReactNode;\n onClick?: () => void;\n href?: string;\n onNavigate?: (href: string) => void;\n subtitle?: ReactNode;\n label?: string;\n detail?: string;\n title: string;\n presentation?: 'person' | 'poster';\n /** A short qualifier shown muted after the title on the same line, such as an edition. */\n titleDetail?: string;\n };\n\nexport function ImageCard(props: ImageCardProps) {\n const lines = props.loading\n ? Array.from<unknown, ReactNode>({ length: props.textRows ?? 2 }, () => undefined)\n : [\n props.titleDetail ? (\n <>\n {props.title}\n <span className=\"text-base-700 font-normal\"> · {props.titleDetail}</span>\n </>\n ) : (\n props.title\n ),\n ...(props.subtitle || props.detail ? [props.subtitle || '\\u00a0'] : []),\n ...(props.detail ? [props.detail] : []),\n ];\n const label = props.loading\n ? undefined\n : (props.label ??\n [\n props.title,\n props.titleDetail,\n typeof props.subtitle === 'string' ? props.subtitle : undefined,\n props.detail,\n ]\n .filter(Boolean)\n .join(', '));\n const content = (\n <Stack space=\"related\" className=\"min-w-0 text-left\">\n {props.loading ? (\n <SkeletonLoader.Shape presentation={props.aspect === 'poster' ? 'poster' : 'artwork'} />\n ) : props.presentation === 'person' ? (\n <span className=\"block size-16 overflow-hidden rounded-full [&>div]:size-full\">{props.artwork}</span>\n ) : (\n props.artwork\n )}\n <Stack space=\"none\" className=\"min-w-0\">\n {lines.map((line, index) => (\n <Text\n key={index}\n as=\"span\"\n variant={index === 0 ? 'label' : 'caption'}\n tone={index === 0 ? 'default' : 'muted'}\n truncate={props.loading || !props.presentation}\n className={!props.loading && props.presentation ? 'wrap-anywhere' : undefined}\n loading={props.loading}\n >\n {!props.loading && props.href && index === 0 ? (\n <LinkOverlay href={props.href} onNavigate={props.onNavigate} aria-label={label}>\n {line}\n </LinkOverlay>\n ) : (\n line\n )}\n </Text>\n ))}\n </Stack>\n </Stack>\n );\n\n if (props.loading || (!props.href && !props.onClick)) return content;\n\n return (\n <LinkBox className=\"group/media-item rounded-lg\">\n {content}\n {!props.href && props.onClick ? (\n <button\n {...tabbable}\n type=\"button\"\n data-slot=\"action-overlay\"\n aria-label={label}\n className=\"focus-visible:outline-primary absolute inset-0 z-1 w-full cursor-pointer rounded-lg focus-visible:outline-2 focus-visible:outline-offset-2\"\n onClick={props.onClick}\n />\n ) : null}\n </LinkBox>\n );\n}\n"],"mappings":";;;;;;;AAyBA,SAAgB,UAAU,OAAuB;CAC7C,MAAM,QAAQ,MAAM,UACd,MAAM,KAAyB,EAAE,QAAQ,MAAM,YAAY,EAAE,SAAS,KAAA,CAAS,IAC/E;EACI,MAAM,cACF,qBAAA,UAAA,EAAA,UAAA,CACK,MAAM,OACP,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CAA4C,OAAI,MAAM,WAAkB;EAC1E,CAAA,CAAA,EAAA,CAAA,IAEF,MAAM;EAEV,GAAI,MAAM,YAAY,MAAM,SAAS,CAAC,MAAM,YAAY,MAAQ,IAAI,CAAC;EACrE,GAAI,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI,CAAC;CACzC;CACN,MAAM,QAAQ,MAAM,UACd,KAAA,IACC,MAAM,SACP;EACI,MAAM;EACN,MAAM;EACN,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW,KAAA;EACtD,MAAM;CACV,CAAC,CACI,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;CACpB,MAAM,UACF,qBAAC,OAAD;EAAO,OAAM;EAAU,WAAU;EAAjC,UAAA,CACK,MAAM,UACH,oBAAC,eAAe,OAAhB,EAAsB,cAAc,MAAM,WAAW,WAAW,WAAW,UAAY,CAAA,IACvF,MAAM,iBAAiB,WACvB,oBAAC,QAAD;GAAM,WAAU;GAAgE,UAAA,MAAM;EAAc,CAAA,IAEpG,MAAM,SAEV,oBAAC,OAAD;GAAO,OAAM;GAAO,WAAU;GACzB,UAAA,MAAM,KAAK,MAAM,UACd,oBAAC,MAAD;IAEI,IAAG;IACH,SAAS,UAAU,IAAI,UAAU;IACjC,MAAM,UAAU,IAAI,YAAY;IAChC,UAAU,MAAM,WAAW,CAAC,MAAM;IAClC,WAAW,CAAC,MAAM,WAAW,MAAM,eAAe,kBAAkB,KAAA;IACpE,SAAS,MAAM;IAEd,UAAA,CAAC,MAAM,WAAW,MAAM,QAAQ,UAAU,IACvC,oBAAC,aAAD;KAAa,MAAM,MAAM;KAAM,YAAY,MAAM;KAAY,cAAY;KACpE,UAAA;IACQ,CAAA,IAEb;GAEF,GAfG,KAeH,CACT;EACE,CAAA,CACJ;;CAGX,IAAI,MAAM,WAAY,CAAC,MAAM,QAAQ,CAAC,MAAM,SAAU,OAAO;CAE7D,OACI,qBAAC,SAAD;EAAS,WAAU;EAAnB,UAAA,CACK,SACA,CAAC,MAAM,QAAQ,MAAM,UAClB,oBAAC,UAAD;GACI,GAAI;GACJ,MAAK;GACL,aAAU;GACV,cAAY;GACZ,WAAU;GACV,SAAS,MAAM;EAClB,CAAA,IACD,IACC;;AAEjB"}
@@ -0,0 +1,30 @@
1
+ import { ReactNode } from "react";
2
+ export declare function ImagePicker({ label, header, children }: {
3
+ label: string;
4
+ header: ReactNode;
5
+ children: ReactNode;
6
+ }): import("react").JSX.Element;
7
+ export declare function ImagePickerGrid({ children, label }: {
8
+ children: ReactNode;
9
+ label: string;
10
+ }): import("react").JSX.Element;
11
+ export declare function ImagePickerOption({ src, pending, error, label, detail, errorLabel, selected, disabled, landscape, aspect, onSelect }: {
12
+ src?: string;
13
+ pending?: boolean;
14
+ error?: boolean;
15
+ label: string;
16
+ detail?: string;
17
+ errorLabel: string;
18
+ selected: boolean;
19
+ disabled?: boolean;
20
+ landscape?: boolean;
21
+ aspect?: 'square' | 'video' | 'poster' | 'logo';
22
+ onSelect: () => void;
23
+ }): import("react").JSX.Element;
24
+ export declare function ImageUpload({ label, hint, disabled, onFile }: {
25
+ label: string;
26
+ hint: string;
27
+ disabled?: boolean;
28
+ onFile: (file: File) => void;
29
+ }): import("react").JSX.Element;
30
+ //# sourceMappingURL=ImagePicker.d.ts.map
@@ -0,0 +1,108 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { tabbable } from "../foundations/KeyboardFocus.js";
3
+ import { Artwork } from "./Artwork.js";
4
+ import { useRef, useState } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { CheckIcon, Disc3Icon } from "lucide-react";
7
+ // src/display/ImagePicker.tsx
8
+ function ImagePicker({ label, header, children }) {
9
+ return /* @__PURE__ */ jsxs("section", {
10
+ "aria-label": label,
11
+ className: "flex min-h-0 flex-1 flex-col gap-3",
12
+ children: [/* @__PURE__ */ jsx("div", {
13
+ className: "shrink-0",
14
+ children: header
15
+ }), /* @__PURE__ */ jsx("div", {
16
+ className: "-mx-1 min-h-0 flex-1 overflow-y-auto overscroll-contain p-1",
17
+ children
18
+ })]
19
+ });
20
+ }
21
+ function ImagePickerGrid({ children, label }) {
22
+ return /* @__PURE__ */ jsx("div", {
23
+ role: "group",
24
+ "aria-label": label,
25
+ className: "grid grid-cols-2 gap-3 sm:grid-cols-[repeat(auto-fill,minmax(9rem,1fr))]",
26
+ children
27
+ });
28
+ }
29
+ function ImagePickerOption({ src, pending, error, label, detail, errorLabel, selected, disabled, landscape = false, aspect, onSelect }) {
30
+ return /* @__PURE__ */ jsxs("button", {
31
+ ...tabbable,
32
+ type: "button",
33
+ "aria-label": label,
34
+ "aria-pressed": selected,
35
+ disabled,
36
+ onClick: onSelect,
37
+ className: `group bg-base-100 focus-visible:outline-primary relative overflow-hidden rounded-lg border text-left transition-all focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-default disabled:opacity-50 ${selected ? "border-primary ring-primary/20 ring-2" : "border-base-300 hover:border-primary/50 hover:shadow-md"}`,
38
+ children: [
39
+ /* @__PURE__ */ jsx(Artwork, {
40
+ alt: "",
41
+ aspect: aspect ?? (landscape ? "video" : "square"),
42
+ error,
43
+ errorLabel,
44
+ fallback: /* @__PURE__ */ jsx(Disc3Icon, {}),
45
+ pending,
46
+ referrerPolicy: "no-referrer",
47
+ showLoadingIndicator: false,
48
+ src
49
+ }),
50
+ selected ? /* @__PURE__ */ jsx("span", {
51
+ "aria-hidden": "true",
52
+ className: "bg-primary text-primary-content absolute top-2 right-2 rounded-full p-1 shadow [&>svg]:size-4",
53
+ children: /* @__PURE__ */ jsx(CheckIcon, {})
54
+ }) : null,
55
+ /* @__PURE__ */ jsx("span", {
56
+ className: "block truncate px-3 pt-2 text-xs font-medium",
57
+ children: label
58
+ }),
59
+ /* @__PURE__ */ jsx("span", {
60
+ className: "text-base-600 block truncate px-3 pb-2 text-xs",
61
+ children: detail ?? "\xA0"
62
+ })
63
+ ]
64
+ });
65
+ }
66
+ function ImageUpload({ label, hint, disabled, onFile }) {
67
+ const [dragging, setDragging] = useState(false);
68
+ const input = useRef(null);
69
+ return /* @__PURE__ */ jsxs("span", {
70
+ className: `inline-flex shrink-0 rounded-md whitespace-nowrap ${dragging ? "ring-primary ring-2" : ""}`,
71
+ onDragOver: (event) => {
72
+ event.preventDefault();
73
+ if (!disabled) setDragging(true);
74
+ },
75
+ onDragLeave: () => setDragging(false),
76
+ onDrop: (event) => {
77
+ event.preventDefault();
78
+ setDragging(false);
79
+ const file = event.dataTransfer.files[0];
80
+ if (file && !disabled) onFile(file);
81
+ },
82
+ children: [/* @__PURE__ */ jsx("input", {
83
+ ref: input,
84
+ type: "file",
85
+ hidden: true,
86
+ accept: "image/jpeg,image/png,image/webp,image/gif",
87
+ "aria-label": label,
88
+ disabled,
89
+ onChange: (event) => {
90
+ const file = event.target.files?.[0];
91
+ if (file) onFile(file);
92
+ event.target.value = "";
93
+ }
94
+ }), /* @__PURE__ */ jsx(Button, {
95
+ type: "button",
96
+ disabled,
97
+ title: hint,
98
+ "aria-description": hint,
99
+ leftIcon: /* @__PURE__ */ jsx(Disc3Icon, {}),
100
+ onClick: () => input.current?.click(),
101
+ variant: "secondary",
102
+ children: label
103
+ })]
104
+ });
105
+ }
106
+ export { ImagePicker, ImagePickerGrid, ImagePickerOption, ImageUpload };
107
+
108
+ //# sourceMappingURL=ImagePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImagePicker.js","names":[],"sources":["../../src/display/ImagePicker.tsx"],"sourcesContent":["import { CheckIcon, Disc3Icon } from 'lucide-react';\nimport { type ReactNode, useRef, useState } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { Artwork } from './Artwork';\n\nexport function ImagePicker({ label, header, children }: { label: string; header: ReactNode; children: ReactNode }) {\n return (\n <section aria-label={label} className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <div className=\"shrink-0\">{header}</div>\n <div className=\"-mx-1 min-h-0 flex-1 overflow-y-auto overscroll-contain p-1\">{children}</div>\n </section>\n );\n}\n\nexport function ImagePickerGrid({ children, label }: { children: ReactNode; label: string }) {\n return (\n <div\n role=\"group\"\n aria-label={label}\n className=\"grid grid-cols-2 gap-3 sm:grid-cols-[repeat(auto-fill,minmax(9rem,1fr))]\"\n >\n {children}\n </div>\n );\n}\n\nexport function ImagePickerOption({\n src,\n pending,\n error,\n label,\n detail,\n errorLabel,\n selected,\n disabled,\n landscape = false,\n aspect,\n onSelect,\n}: {\n src?: string;\n pending?: boolean;\n error?: boolean;\n label: string;\n detail?: string;\n errorLabel: string;\n selected: boolean;\n disabled?: boolean;\n landscape?: boolean;\n aspect?: 'square' | 'video' | 'poster' | 'logo';\n onSelect: () => void;\n}) {\n return (\n <button\n {...tabbable}\n type=\"button\"\n aria-label={label}\n aria-pressed={selected}\n disabled={disabled}\n onClick={onSelect}\n className={`group bg-base-100 focus-visible:outline-primary relative overflow-hidden rounded-lg border text-left transition-all focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-default disabled:opacity-50 ${selected ? 'border-primary ring-primary/20 ring-2' : 'border-base-300 hover:border-primary/50 hover:shadow-md'}`}\n >\n <Artwork\n alt=\"\"\n aspect={aspect ?? (landscape ? 'video' : 'square')}\n error={error}\n errorLabel={errorLabel}\n fallback={<Disc3Icon />}\n pending={pending}\n referrerPolicy=\"no-referrer\"\n showLoadingIndicator={false}\n src={src}\n />\n {selected ? (\n <span\n aria-hidden=\"true\"\n className=\"bg-primary text-primary-content absolute top-2 right-2 rounded-full p-1 shadow [&>svg]:size-4\"\n >\n <CheckIcon />\n </span>\n ) : null}\n <span className=\"block truncate px-3 pt-2 text-xs font-medium\">{label}</span>\n <span className=\"text-base-600 block truncate px-3 pb-2 text-xs\">{detail ?? '\\u00a0'}</span>\n </button>\n );\n}\n\nexport function ImageUpload({\n label,\n hint,\n disabled,\n onFile,\n}: {\n label: string;\n hint: string;\n disabled?: boolean;\n onFile: (file: File) => void;\n}) {\n const [dragging, setDragging] = useState(false);\n const input = useRef<HTMLInputElement>(null);\n\n return (\n <span\n className={`inline-flex shrink-0 rounded-md whitespace-nowrap ${dragging ? 'ring-primary ring-2' : ''}`}\n onDragOver={(event) => {\n event.preventDefault();\n\n if (!disabled) setDragging(true);\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(event) => {\n event.preventDefault();\n setDragging(false);\n\n const file = event.dataTransfer.files[0];\n\n if (file && !disabled) onFile(file);\n }}\n >\n <input\n ref={input}\n type=\"file\"\n hidden\n accept=\"image/jpeg,image/png,image/webp,image/gif\"\n aria-label={label}\n disabled={disabled}\n onChange={(event) => {\n const file = event.target.files?.[0];\n\n if (file) onFile(file);\n\n event.target.value = '';\n }}\n />\n <Button\n type=\"button\"\n disabled={disabled}\n title={hint}\n aria-description={hint}\n leftIcon={<Disc3Icon />}\n onClick={() => input.current?.click()}\n variant=\"secondary\"\n >\n {label}\n </Button>\n </span>\n );\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,YAAY,EAAE,OAAO,QAAQ,YAAuE;CAChH,OACI,qBAAC,WAAD;EAAS,cAAY;EAAO,WAAU;EAAtC,UAAA,CACI,oBAAC,OAAD;GAAK,WAAU;GAAY,UAAA;EAAY,CAAA,GACvC,oBAAC,OAAD;GAAK,WAAU;GAA+D;EAAc,CAAA,CACvF;;AAEjB;AAEA,SAAgB,gBAAgB,EAAE,UAAU,SAAiD;CACzF,OACI,oBAAC,OAAD;EACI,MAAK;EACL,cAAY;EACZ,WAAU;EAET;CACA,CAAA;AAEb;AAEA,SAAgB,kBAAkB,EAC9B,KACA,SACA,OACA,OACA,QACA,YACA,UACA,UACA,YAAY,OACZ,QACA,YAaD;CACC,OACI,qBAAC,UAAD;EACI,GAAI;EACJ,MAAK;EACL,cAAY;EACZ,gBAAc;EACJ;EACV,SAAS;EACT,WAAW,0NAA0N,WAAW,0CAA0C;EAP9R,UAAA;GASI,oBAAC,SAAD;IACI,KAAI;IACJ,QAAQ,WAAW,YAAY,UAAU;IAClC;IACK;IACZ,UAAU,oBAAC,WAAD,CAAY,CAAA;IACb;IACT,gBAAe;IACf,sBAAsB;IACjB;GACR,CAAA;GACA,WACG,oBAAC,QAAD;IACI,eAAY;IACZ,WAAU;IAEV,UAAA,oBAAC,WAAD,CAAY,CAAA;GACV,CAAA,IACN;GACJ,oBAAC,QAAD;IAAM,WAAU;IAAgD,UAAA;GAAY,CAAA;GAC5E,oBAAC,QAAD;IAAM,WAAU;IAAkD,UAAA,UAAU;GAAe,CAAA;EACvF;;AAEhB;AAEA,SAAgB,YAAY,EACxB,OACA,MACA,UACA,UAMD;CACC,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,QAAQ,OAAyB,IAAI;CAE3C,OACI,qBAAC,QAAD;EACI,WAAW,qDAAqD,WAAW,wBAAwB;EACnG,aAAa,UAAU;GACnB,MAAM,eAAe;GAErB,IAAI,CAAC,UAAU,YAAY,IAAI;EACnC;EACA,mBAAmB,YAAY,KAAK;EACpC,SAAS,UAAU;GACf,MAAM,eAAe;GACrB,YAAY,KAAK;GAEjB,MAAM,OAAO,MAAM,aAAa,MAAM;GAEtC,IAAI,QAAQ,CAAC,UAAU,OAAO,IAAI;EACtC;EAfJ,UAAA,CAiBI,oBAAC,SAAD;GACI,KAAK;GACL,MAAK;GACL,QAAA;GACA,QAAO;GACP,cAAY;GACF;GACV,WAAW,UAAU;IACjB,MAAM,OAAO,MAAM,OAAO,QAAQ;IAElC,IAAI,MAAM,OAAO,IAAI;IAErB,MAAM,OAAO,QAAQ;GACzB;EACH,CAAA,GACD,oBAAC,QAAD;GACI,MAAK;GACK;GACV,OAAO;GACP,oBAAkB;GAClB,UAAU,oBAAC,WAAD,CAAY,CAAA;GACtB,eAAe,MAAM,SAAS,MAAM;GACpC,SAAQ;GAEP,UAAA;EACG,CAAA,CACN;;AAEd"}
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from "react";
2
+ interface InfoBoxProps {
3
+ description: string;
4
+ icon: ReactNode;
5
+ onClick: () => void;
6
+ title: string;
7
+ }
8
+ /**
9
+ * A prominent, actionable introduction that opens optional guidance.
10
+ * Use for a short teaser leading to a guide or other explanatory surface. Use Alert for current
11
+ * status, NoticeCard for content that needs examination or a decision, and InsetPanel for grouping.
12
+ */
13
+ export declare function InfoBox({ description, icon, onClick, title }: InfoBoxProps): import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=InfoBox.d.ts.map
@@ -0,0 +1,41 @@
1
+ import { Heading, Text } from "../typography/Typography.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { ChevronRightIcon } from "lucide-react";
4
+ import { Alert } from "@ninna-ui/feedback";
5
+ // src/display/InfoBox.tsx
6
+ /**
7
+ * A prominent, actionable introduction that opens optional guidance.
8
+ * Use for a short teaser leading to a guide or other explanatory surface. Use Alert for current
9
+ * status, NoticeCard for content that needs examination or a decision, and InsetPanel for grouping.
10
+ */
11
+ function InfoBox({ description, icon, onClick, title }) {
12
+ return /* @__PURE__ */ jsxs("button", {
13
+ type: "button",
14
+ onClick,
15
+ className: "group border-primary/40 border-l-primary bg-primary/10 hover:bg-primary/15 focus-visible:outline-primary relative w-full cursor-pointer rounded-lg border border-l-4 text-left transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 motion-reduce:transition-none",
16
+ children: [/* @__PURE__ */ jsx(Alert, {
17
+ role: "presentation",
18
+ "aria-live": "off",
19
+ color: "primary",
20
+ size: "md",
21
+ icon,
22
+ title: /* @__PURE__ */ jsx(Heading, {
23
+ as: "h3",
24
+ variant: "label",
25
+ children: title
26
+ }),
27
+ description: /* @__PURE__ */ jsx(Text, {
28
+ tone: "muted",
29
+ children: description
30
+ }),
31
+ className: "text-primary [&_[data-slot=icon]]:bg-primary/15 bg-transparent pr-12 [&_[data-slot=icon]]:mt-0 [&_[data-slot=icon]]:flex [&_[data-slot=icon]]:size-9 [&_[data-slot=icon]]:items-center [&_[data-slot=icon]]:justify-center [&_[data-slot=icon]]:rounded-lg [&_[data-slot=icon]>svg]:size-5"
32
+ }), /* @__PURE__ */ jsx("span", {
33
+ "aria-hidden": "true",
34
+ className: "text-primary absolute inset-y-0 right-4 flex items-center transition-transform group-hover:translate-x-0.5 motion-reduce:transition-none [&>svg]:size-5",
35
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
36
+ })]
37
+ });
38
+ }
39
+ export { InfoBox };
40
+
41
+ //# sourceMappingURL=InfoBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InfoBox.js","names":[],"sources":["../../src/display/InfoBox.tsx"],"sourcesContent":["import { Alert } from '@ninna-ui/feedback';\nimport { ChevronRightIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Heading, Text } from '../typography/Typography';\n\ninterface InfoBoxProps {\n description: string;\n icon: ReactNode;\n onClick: () => void;\n title: string;\n}\n\n/**\n * A prominent, actionable introduction that opens optional guidance.\n * Use for a short teaser leading to a guide or other explanatory surface. Use Alert for current\n * status, NoticeCard for content that needs examination or a decision, and InsetPanel for grouping.\n */\nexport function InfoBox({ description, icon, onClick, title }: InfoBoxProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group border-primary/40 border-l-primary bg-primary/10 hover:bg-primary/15 focus-visible:outline-primary relative w-full cursor-pointer rounded-lg border border-l-4 text-left transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 motion-reduce:transition-none\"\n >\n <Alert\n role=\"presentation\"\n aria-live=\"off\"\n color=\"primary\"\n size=\"md\"\n icon={icon}\n title={\n <Heading as=\"h3\" variant=\"label\">\n {title}\n </Heading>\n }\n description={<Text tone=\"muted\">{description}</Text>}\n className=\"text-primary [&_[data-slot=icon]]:bg-primary/15 bg-transparent pr-12 [&_[data-slot=icon]]:mt-0 [&_[data-slot=icon]]:flex [&_[data-slot=icon]]:size-9 [&_[data-slot=icon]]:items-center [&_[data-slot=icon]]:justify-center [&_[data-slot=icon]]:rounded-lg [&_[data-slot=icon]>svg]:size-5\"\n />\n <span\n aria-hidden=\"true\"\n className=\"text-primary absolute inset-y-0 right-4 flex items-center transition-transform group-hover:translate-x-0.5 motion-reduce:transition-none [&>svg]:size-5\"\n >\n <ChevronRightIcon />\n </span>\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAgB,QAAQ,EAAE,aAAa,MAAM,SAAS,SAAuB;CACzE,OACI,qBAAC,UAAD;EACI,MAAK;EACI;EACT,WAAU;EAHd,UAAA,CAKI,oBAAC,OAAD;GACI,MAAK;GACL,aAAU;GACV,OAAM;GACN,MAAK;GACC;GACN,OACI,oBAAC,SAAD;IAAS,IAAG;IAAK,SAAQ;IACpB,UAAA;GACI,CAAA;GAEb,aAAa,oBAAC,MAAD;IAAM,MAAK;IAAS,UAAA;GAAkB,CAAA;GACnD,WAAU;EACb,CAAA,GACD,oBAAC,QAAD;GACI,eAAY;GACZ,WAAU;GAEV,UAAA,oBAAC,kBAAD,CAAmB,CAAA;EACjB,CAAA,CACF;;AAEhB"}
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from "react";
2
+ interface InsetPanelProps {
3
+ children: ReactNode;
4
+ onClick?: () => void;
5
+ presentation?: 'default' | 'settings';
6
+ }
7
+ /**
8
+ * A neutral surface that groups related content without adding message or status meaning.
9
+ * Use Alert for current status, InfoBox for optional guidance, and NoticeCard for a decision item.
10
+ */
11
+ export declare function InsetPanel({ children, onClick, presentation }: InsetPanelProps): import("react").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=InsetPanel.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { tabbable } from "../foundations/KeyboardFocus.js";
2
+ import { Stack } from "../layout/Flow.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ // src/display/InsetPanel.tsx
5
+ /**
6
+ * A neutral surface that groups related content without adding message or status meaning.
7
+ * Use Alert for current status, InfoBox for optional guidance, and NoticeCard for a decision item.
8
+ */
9
+ function InsetPanel({ children, onClick, presentation = "default" }) {
10
+ if (presentation === "settings") return /* @__PURE__ */ jsx("div", {
11
+ className: "divide-base-300 border-base-300 bg-base-100 divide-y overflow-hidden rounded-lg border shadow-xs/5",
12
+ children
13
+ });
14
+ return /* @__PURE__ */ jsx(Stack, {
15
+ as: onClick ? "button" : "div",
16
+ type: onClick ? "button" : void 0,
17
+ tabIndex: onClick ? tabbable.tabIndex : void 0,
18
+ onClick,
19
+ space: "related",
20
+ className: `border-base-300 bg-base-100 rounded-lg border p-5 ${onClick ? "focus-visible:outline-primary w-full cursor-pointer text-left focus-visible:outline-2 focus-visible:outline-offset-2" : ""}`,
21
+ children
22
+ });
23
+ }
24
+ export { InsetPanel };
25
+
26
+ //# sourceMappingURL=InsetPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsetPanel.js","names":[],"sources":["../../src/display/InsetPanel.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { Stack } from '../layout/Flow';\n\ninterface InsetPanelProps {\n children: ReactNode;\n onClick?: () => void;\n presentation?: 'default' | 'settings';\n}\n\n/**\n * A neutral surface that groups related content without adding message or status meaning.\n * Use Alert for current status, InfoBox for optional guidance, and NoticeCard for a decision item.\n */\nexport function InsetPanel({ children, onClick, presentation = 'default' }: InsetPanelProps) {\n if (presentation === 'settings') {\n return (\n <div className=\"divide-base-300 border-base-300 bg-base-100 divide-y overflow-hidden rounded-lg border shadow-xs/5\">\n {children}\n </div>\n );\n }\n\n return (\n <Stack\n as={onClick ? 'button' : 'div'}\n type={onClick ? 'button' : undefined}\n tabIndex={onClick ? tabbable.tabIndex : undefined}\n onClick={onClick}\n space=\"related\"\n className={`border-base-300 bg-base-100 rounded-lg border p-5 ${onClick ? 'focus-visible:outline-primary w-full cursor-pointer text-left focus-visible:outline-2 focus-visible:outline-offset-2' : ''}`}\n >\n {children}\n </Stack>\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAgB,WAAW,EAAE,UAAU,SAAS,eAAe,aAA8B;CACzF,IAAI,iBAAiB,YACjB,OACI,oBAAC,OAAD;EAAK,WAAU;EACV;CACA,CAAA;CAIb,OACI,oBAAC,OAAD;EACI,IAAI,UAAU,WAAW;EACzB,MAAM,UAAU,WAAW,KAAA;EAC3B,UAAU,UAAU,SAAS,WAAW,KAAA;EAC/B;EACT,OAAM;EACN,WAAW,qDAAqD,UAAU,yHAAyH;EAElM;CACE,CAAA;AAEf"}
@@ -0,0 +1,10 @@
1
+ export interface ItemActionProps {
2
+ label: string;
3
+ onClick?: () => void;
4
+ }
5
+ export declare function ItemAction({ action, loading, loadingLabel }: {
6
+ action?: ItemActionProps;
7
+ loading?: boolean;
8
+ loadingLabel?: string;
9
+ }): import("react").JSX.Element | null;
10
+ //# sourceMappingURL=ItemAction.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { PencilIcon } from "lucide-react";
3
+ import { Loading } from "@ninna-ui/feedback";
4
+ // src/display/ItemAction.tsx
5
+ function ItemAction({ action, loading = false, loadingLabel }) {
6
+ const disabled = loading || !action?.onClick;
7
+ if (!loading && !action) return null;
8
+ return /* @__PURE__ */ jsx("button", {
9
+ type: "button",
10
+ "aria-label": loading ? loadingLabel : action?.label,
11
+ "aria-hidden": loading && !loadingLabel ? true : void 0,
12
+ "aria-disabled": disabled,
13
+ tabIndex: disabled ? -1 : 0,
14
+ title: loading ? loadingLabel : action?.label,
15
+ className: `bg-base-50/90 text-base-content focus-visible:outline-primary pointer-events-auto flex size-6 items-center justify-center rounded-full shadow-sm backdrop-blur-sm transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-2 motion-reduce:transition-none ${loading ? "" : "opacity-0 group-hover/media-item:opacity-100 group-has-focus-visible/media-item:opacity-100 [@media(hover:none)]:opacity-100"} ${disabled ? "cursor-default" : "hover:bg-base-50 hover:text-primary cursor-pointer"}`,
16
+ onClick: (event) => {
17
+ event.stopPropagation();
18
+ if (!disabled) action?.onClick?.();
19
+ },
20
+ children: loading ? /* @__PURE__ */ jsx(Loading, {
21
+ "aria-hidden": !loadingLabel,
22
+ className: "motion-reduce:animate-none",
23
+ color: "primary",
24
+ label: loadingLabel ?? "",
25
+ size: "sm",
26
+ variant: "spin"
27
+ }) : /* @__PURE__ */ jsx("span", {
28
+ className: `size-3.5 [&>svg]:size-full ${disabled ? "opacity-40" : ""}`,
29
+ children: /* @__PURE__ */ jsx(PencilIcon, {})
30
+ })
31
+ });
32
+ }
33
+ export { ItemAction };
34
+
35
+ //# sourceMappingURL=ItemAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemAction.js","names":[],"sources":["../../src/display/ItemAction.tsx"],"sourcesContent":["import { Loading } from '@ninna-ui/feedback';\nimport { PencilIcon } from 'lucide-react';\n\nexport interface ItemActionProps {\n label: string;\n onClick?: () => void;\n}\n\nexport function ItemAction({\n action,\n loading = false,\n loadingLabel,\n}: {\n action?: ItemActionProps;\n loading?: boolean;\n loadingLabel?: string;\n}) {\n const disabled = loading || !action?.onClick;\n\n if (!loading && !action) return null;\n\n return (\n <button\n type=\"button\"\n aria-label={loading ? loadingLabel : action?.label}\n aria-hidden={loading && !loadingLabel ? true : undefined}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n title={loading ? loadingLabel : action?.label}\n className={`bg-base-50/90 text-base-content focus-visible:outline-primary pointer-events-auto flex size-6 items-center justify-center rounded-full shadow-sm backdrop-blur-sm transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-2 motion-reduce:transition-none ${loading ? '' : 'opacity-0 group-hover/media-item:opacity-100 group-has-focus-visible/media-item:opacity-100 [@media(hover:none)]:opacity-100'} ${disabled ? 'cursor-default' : 'hover:bg-base-50 hover:text-primary cursor-pointer'}`}\n onClick={(event) => {\n event.stopPropagation();\n\n if (!disabled) action?.onClick?.();\n }}\n >\n {loading ? (\n <Loading\n aria-hidden={!loadingLabel}\n className=\"motion-reduce:animate-none\"\n color=\"primary\"\n label={loadingLabel ?? ''}\n size=\"sm\"\n variant=\"spin\"\n />\n ) : (\n <span className={`size-3.5 [&>svg]:size-full ${disabled ? 'opacity-40' : ''}`}>\n <PencilIcon />\n </span>\n )}\n </button>\n );\n}\n"],"mappings":";;;;AAQA,SAAgB,WAAW,EACvB,QACA,UAAU,OACV,gBAKD;CACC,MAAM,WAAW,WAAW,CAAC,QAAQ;CAErC,IAAI,CAAC,WAAW,CAAC,QAAQ,OAAO;CAEhC,OACI,oBAAC,UAAD;EACI,MAAK;EACL,cAAY,UAAU,eAAe,QAAQ;EAC7C,eAAa,WAAW,CAAC,eAAe,OAAO,KAAA;EAC/C,iBAAe;EACf,UAAU,WAAW,KAAK;EAC1B,OAAO,UAAU,eAAe,QAAQ;EACxC,WAAW,yRAAyR,UAAU,KAAK,+HAA+H,GAAG,WAAW,mBAAmB;EACnd,UAAU,UAAU;GAChB,MAAM,gBAAgB;GAEtB,IAAI,CAAC,UAAU,QAAQ,UAAU;EACrC;EAEC,UAAA,UACG,oBAAC,SAAD;GACI,eAAa,CAAC;GACd,WAAU;GACV,OAAM;GACN,OAAO,gBAAgB;GACvB,MAAK;GACL,SAAQ;EACX,CAAA,IAED,oBAAC,QAAD;GAAM,WAAW,8BAA8B,WAAW,eAAe;GACrE,UAAA,oBAAC,YAAD,CAAa,CAAA;EACX,CAAA;CAEN,CAAA;AAEhB"}
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from "react";
2
+ /** A keyboard key or shortcut, as quiet small text, such as ⌘K beside the search field. */
3
+ export declare function Kbd({ children }: {
4
+ children?: ReactNode;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=Kbd.d.ts.map
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ // src/display/Kbd.tsx
3
+ /** A keyboard key or shortcut, as quiet small text, such as ⌘K beside the search field. */
4
+ function Kbd({ children }) {
5
+ return /* @__PURE__ */ jsx("kbd", {
6
+ className: "text-base-500 font-sans text-[11px] font-medium",
7
+ children
8
+ });
9
+ }
10
+ export { Kbd };
11
+
12
+ //# sourceMappingURL=Kbd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kbd.js","names":[],"sources":["../../src/display/Kbd.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\n/** A keyboard key or shortcut, as quiet small text, such as ⌘K beside the search field. */\nexport function Kbd({ children }: { children?: ReactNode }) {\n return <kbd className=\"text-base-500 font-sans text-[11px] font-medium\">{children}</kbd>;\n}\n"],"mappings":";;;AAGA,SAAgB,IAAI,EAAE,YAAsC;CACxD,OAAO,oBAAC,OAAD;EAAK,WAAU;EAAmD;CAAc,CAAA;AAC3F"}
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from "react";
2
+ /** Colours the icon inside it in a muted version of a lar-brand app hue, such as a catalog's kind; neutral without one. Its
3
+ * container sizes the icon. */
4
+ export declare function KindIcon({ hue, children }: {
5
+ hue?: number;
6
+ children: ReactNode;
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=KindIcon.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ // src/display/KindIcon.tsx
3
+ /** Colours the icon inside it in a muted version of a lar-brand app hue, such as a catalog's kind; neutral without one. Its
4
+ * container sizes the icon. */
5
+ function KindIcon({ hue, children }) {
6
+ return /* @__PURE__ */ jsx("span", {
7
+ "aria-hidden": "true",
8
+ className: `contents ${hue === void 0 ? "text-base-500 dark:text-base-600" : "kind-icon"}`,
9
+ style: hue === void 0 ? void 0 : { "--lar-kind-hue": hue },
10
+ children
11
+ });
12
+ }
13
+ export { KindIcon };
14
+
15
+ //# sourceMappingURL=KindIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KindIcon.js","names":[],"sources":["../../src/display/KindIcon.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\n/** Colours the icon inside it in a muted version of a lar-brand app hue, such as a catalog's kind; neutral without one. Its\n * container sizes the icon. */\nexport function KindIcon({ hue, children }: { hue?: number; children: ReactNode }) {\n return (\n <span\n aria-hidden=\"true\"\n className={`contents ${hue === undefined ? 'text-base-500 dark:text-base-600' : 'kind-icon'}`}\n style={hue === undefined ? undefined : ({ '--lar-kind-hue': hue } as CSSProperties)}\n >\n {children}\n </span>\n );\n}\n"],"mappings":";;;;AAIA,SAAgB,SAAS,EAAE,KAAK,YAAmD;CAC/E,OACI,oBAAC,QAAD;EACI,eAAY;EACZ,WAAW,YAAY,QAAQ,KAAA,IAAY,qCAAqC;EAChF,OAAO,QAAQ,KAAA,IAAY,KAAA,IAAa,EAAE,kBAAkB,IAAI;EAE/D;CACC,CAAA;AAEd"}