@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,111 @@
1
+ import { StatusPill } from "./Status.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/showcase/Roadmap.tsx
4
+ /** What is planned: a featured card for the next big thing, then quiet dashed cards that read like promises. */
5
+ function Roadmap({ items, label, statusLabel }) {
6
+ const featured = items.filter((item) => item.featured);
7
+ const rest = items.filter((item) => !item.featured);
8
+ return /* @__PURE__ */ jsxs("div", {
9
+ "aria-label": label,
10
+ role: "group",
11
+ className: "flex flex-col gap-3",
12
+ children: [featured.map((item) => /* @__PURE__ */ jsx(FeaturedCard, {
13
+ item,
14
+ statusLabel
15
+ }, item.title)), /* @__PURE__ */ jsx("ul", {
16
+ className: "divide-base-300/70 border-base-400/80 bg-base-100/50 dark:bg-base-100/30 grid divide-y rounded-2xl border border-dashed sm:gap-3 sm:divide-y-0 sm:rounded-none sm:border-0 sm:bg-transparent md:grid-cols-2 lg:grid-cols-3 sm:dark:bg-transparent",
17
+ children: rest.map((item) => /* @__PURE__ */ jsxs("li", {
18
+ className: "sm:border-base-400/80 flex gap-3 p-4 sm:gap-4 sm:rounded-2xl sm:border sm:border-dashed sm:p-5",
19
+ children: [/* @__PURE__ */ jsx(RoadmapIcon, { children: item.icon }), /* @__PURE__ */ jsxs("div", {
20
+ className: "flex min-w-0 flex-1 flex-col gap-1",
21
+ children: [/* @__PURE__ */ jsxs("span", {
22
+ className: "flex items-start justify-between gap-3",
23
+ children: [/* @__PURE__ */ jsx("span", {
24
+ className: "text-base-content text-[15px] font-semibold tracking-[-0.01em] text-balance",
25
+ children: item.title
26
+ }), /* @__PURE__ */ jsx("span", {
27
+ className: "shrink-0",
28
+ children: /* @__PURE__ */ jsx(StatusPill, {
29
+ status: "planned",
30
+ children: statusLabel
31
+ })
32
+ })]
33
+ }), /* @__PURE__ */ jsx("span", {
34
+ className: "text-base-700 text-sm leading-6",
35
+ children: item.body
36
+ })]
37
+ })]
38
+ }, item.title))
39
+ })]
40
+ });
41
+ }
42
+ function FeaturedCard({ item, statusLabel }) {
43
+ return /* @__PURE__ */ jsxs("article", {
44
+ style: { "--lar-kind-hue": item.featured?.hue },
45
+ className: "flex flex-col gap-4 rounded-2xl border border-[oklch(0.62_0.1_var(--lar-kind-hue)/0.45)] bg-[radial-gradient(60%_120%_at_85%_50%,oklch(0.62_0.12_var(--lar-kind-hue)/0.14),transparent_70%)] p-5 sm:flex-row sm:p-7",
46
+ children: [
47
+ /* @__PURE__ */ jsxs("span", {
48
+ className: "flex items-center justify-between gap-3 sm:block",
49
+ children: [/* @__PURE__ */ jsx(RoadmapIcon, { children: item.icon }), /* @__PURE__ */ jsx("span", {
50
+ className: "sm:hidden",
51
+ children: /* @__PURE__ */ jsx(StatusPill, {
52
+ status: "planned",
53
+ children: statusLabel
54
+ })
55
+ })]
56
+ }),
57
+ /* @__PURE__ */ jsxs("div", {
58
+ className: "flex min-w-0 flex-1 flex-col gap-2",
59
+ children: [
60
+ /* @__PURE__ */ jsxs("span", {
61
+ className: "flex items-start justify-between gap-3",
62
+ children: [/* @__PURE__ */ jsx("span", {
63
+ className: "text-base-content text-lg font-semibold tracking-[-0.01em] text-balance sm:text-xl",
64
+ children: item.title
65
+ }), /* @__PURE__ */ jsx("span", {
66
+ className: "hidden shrink-0 sm:block",
67
+ children: /* @__PURE__ */ jsx(StatusPill, {
68
+ status: "planned",
69
+ children: statusLabel
70
+ })
71
+ })]
72
+ }),
73
+ /* @__PURE__ */ jsx("span", {
74
+ className: "text-base-700 max-w-[620px] text-[15px] leading-6",
75
+ children: item.body
76
+ }),
77
+ item.featured?.steps ? /* @__PURE__ */ jsx("ol", {
78
+ className: "text-base-800 mt-2 flex flex-col gap-2.5 text-sm",
79
+ children: item.featured.steps.map((step, index) => /* @__PURE__ */ jsxs("li", {
80
+ className: "flex items-center gap-2",
81
+ children: [/* @__PURE__ */ jsx("span", {
82
+ className: "bg-base-200 text-base-800 dark:bg-base-300 inline-flex size-5 shrink-0 items-center justify-center rounded-full text-[11px] font-semibold tabular-nums",
83
+ children: index + 1
84
+ }), step]
85
+ }, step))
86
+ }) : null,
87
+ /* @__PURE__ */ jsx("span", {
88
+ className: "mt-2 hidden flex-wrap gap-2 sm:flex",
89
+ children: item.featured?.highlights.map((highlight) => /* @__PURE__ */ jsx("span", {
90
+ className: "kind-badge inline-flex h-7 items-center rounded-full px-3 text-xs font-medium",
91
+ children: highlight
92
+ }, highlight))
93
+ })
94
+ ]
95
+ }),
96
+ item.featured?.visual ? /* @__PURE__ */ jsx("div", {
97
+ className: "shrink-0 sm:w-[300px] lg:w-[340px]",
98
+ children: item.featured.visual
99
+ }) : null
100
+ ]
101
+ });
102
+ }
103
+ function RoadmapIcon({ children }) {
104
+ return /* @__PURE__ */ jsx("span", {
105
+ className: "bg-base-200 text-base-800 ring-base-300/70 dark:bg-base-300/40 inline-flex size-8 shrink-0 items-center justify-center rounded-[0.6rem] ring-1 ring-inset sm:size-10 sm:rounded-[0.7rem] [&>svg]:size-4 sm:[&>svg]:size-5",
106
+ children
107
+ });
108
+ }
109
+ export { Roadmap };
110
+
111
+ //# sourceMappingURL=Roadmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Roadmap.js","names":[],"sources":["../../src/showcase/Roadmap.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nimport { StatusPill } from './Status';\n\nexport interface RoadmapItem {\n icon: ReactNode;\n title: string;\n body: string;\n /** The next big thing: a card of its own above the list, in an app's hue, with its highlights and an\n * illustration of the idea. */\n featured?: { hue: number; highlights: readonly string[]; visual?: ReactNode; steps?: readonly string[] };\n}\n\n/** What is planned: a featured card for the next big thing, then quiet dashed cards that read like promises. */\nexport function Roadmap({\n items,\n label,\n statusLabel,\n}: {\n items: readonly RoadmapItem[];\n label: string;\n statusLabel: string;\n}) {\n const featured = items.filter((item) => item.featured);\n const rest = items.filter((item) => !item.featured);\n\n return (\n <div aria-label={label} role=\"group\" className=\"flex flex-col gap-3\">\n {featured.map((item) => (\n <FeaturedCard key={item.title} item={item} statusLabel={statusLabel} />\n ))}\n <ul className=\"divide-base-300/70 border-base-400/80 bg-base-100/50 dark:bg-base-100/30 grid divide-y rounded-2xl border border-dashed sm:gap-3 sm:divide-y-0 sm:rounded-none sm:border-0 sm:bg-transparent md:grid-cols-2 lg:grid-cols-3 sm:dark:bg-transparent\">\n {rest.map((item) => (\n <li\n key={item.title}\n className=\"sm:border-base-400/80 flex gap-3 p-4 sm:gap-4 sm:rounded-2xl sm:border sm:border-dashed sm:p-5\"\n >\n <RoadmapIcon>{item.icon}</RoadmapIcon>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"flex items-start justify-between gap-3\">\n <span className=\"text-base-content text-[15px] font-semibold tracking-[-0.01em] text-balance\">\n {item.title}\n </span>\n <span className=\"shrink-0\">\n <StatusPill status=\"planned\">{statusLabel}</StatusPill>\n </span>\n </span>\n <span className=\"text-base-700 text-sm leading-6\">{item.body}</span>\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction FeaturedCard({ item, statusLabel }: { item: RoadmapItem; statusLabel: string }) {\n return (\n <article\n style={{ '--lar-kind-hue': item.featured?.hue } as CSSProperties}\n className=\"flex flex-col gap-4 rounded-2xl border border-[oklch(0.62_0.1_var(--lar-kind-hue)/0.45)] bg-[radial-gradient(60%_120%_at_85%_50%,oklch(0.62_0.12_var(--lar-kind-hue)/0.14),transparent_70%)] p-5 sm:flex-row sm:p-7\"\n >\n <span className=\"flex items-center justify-between gap-3 sm:block\">\n <RoadmapIcon>{item.icon}</RoadmapIcon>\n <span className=\"sm:hidden\">\n <StatusPill status=\"planned\">{statusLabel}</StatusPill>\n </span>\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <span className=\"flex items-start justify-between gap-3\">\n <span className=\"text-base-content text-lg font-semibold tracking-[-0.01em] text-balance sm:text-xl\">\n {item.title}\n </span>\n <span className=\"hidden shrink-0 sm:block\">\n <StatusPill status=\"planned\">{statusLabel}</StatusPill>\n </span>\n </span>\n <span className=\"text-base-700 max-w-[620px] text-[15px] leading-6\">{item.body}</span>\n {item.featured?.steps ? (\n <ol className=\"text-base-800 mt-2 flex flex-col gap-2.5 text-sm\">\n {item.featured.steps.map((step, index) => (\n <li key={step} className=\"flex items-center gap-2\">\n <span className=\"bg-base-200 text-base-800 dark:bg-base-300 inline-flex size-5 shrink-0 items-center justify-center rounded-full text-[11px] font-semibold tabular-nums\">\n {index + 1}\n </span>\n {step}\n </li>\n ))}\n </ol>\n ) : null}\n <span className=\"mt-2 hidden flex-wrap gap-2 sm:flex\">\n {item.featured?.highlights.map((highlight) => (\n <span\n key={highlight}\n className=\"kind-badge inline-flex h-7 items-center rounded-full px-3 text-xs font-medium\"\n >\n {highlight}\n </span>\n ))}\n </span>\n </div>\n {item.featured?.visual ? (\n <div className=\"shrink-0 sm:w-[300px] lg:w-[340px]\">{item.featured.visual}</div>\n ) : null}\n </article>\n );\n}\n\nfunction RoadmapIcon({ children }: { children: ReactNode }) {\n return (\n <span className=\"bg-base-200 text-base-800 ring-base-300/70 dark:bg-base-300/40 inline-flex size-8 shrink-0 items-center justify-center rounded-[0.6rem] ring-1 ring-inset sm:size-10 sm:rounded-[0.7rem] [&>svg]:size-4 sm:[&>svg]:size-5\">\n {children}\n </span>\n );\n}\n"],"mappings":";;;;AAcA,SAAgB,QAAQ,EACpB,OACA,OACA,eAKD;CACC,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK,QAAQ;CACrD,MAAM,OAAO,MAAM,QAAQ,SAAS,CAAC,KAAK,QAAQ;CAElD,OACI,qBAAC,OAAD;EAAK,cAAY;EAAO,MAAK;EAAQ,WAAU;EAA/C,UAAA,CACK,SAAS,KAAK,SACX,oBAAC,cAAD;GAAqC;GAAmB;EAAc,GAAnD,KAAK,KAA8C,CACzE,GACD,oBAAC,MAAD;GAAI,WAAU;GACT,UAAA,KAAK,KAAK,SACP,qBAAC,MAAD;IAEI,WAAU;IAFd,UAAA,CAII,oBAAC,aAAD,EAAA,UAAc,KAAK,KAAkB,CAAA,GACrC,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACI,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACI,oBAAC,QAAD;OAAM,WAAU;OACX,UAAA,KAAK;MACJ,CAAA,GACN,oBAAC,QAAD;OAAM,WAAU;OACZ,UAAA,oBAAC,YAAD;QAAY,QAAO;QAAW,UAAA;OAAwB,CAAA;MACpD,CAAA,CACJ;KACN,CAAA,GAAA,oBAAC,QAAD;MAAM,WAAU;MAAmC,UAAA,KAAK;KAAW,CAAA,CAClE;IACL,CAAA,CAAA;GAfK,GAAA,KAAK,KAeV,CACP;EACD,CAAA,CACH;;AAEb;AAEA,SAAS,aAAa,EAAE,MAAM,eAA2D;CACrF,OACI,qBAAC,WAAD;EACI,OAAO,EAAE,kBAAkB,KAAK,UAAU,IAAI;EAC9C,WAAU;EAFd,UAAA;GAII,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACI,oBAAC,aAAD,EAAA,UAAc,KAAK,KAAkB,CAAA,GACrC,oBAAC,QAAD;KAAM,WAAU;KACZ,UAAA,oBAAC,YAAD;MAAY,QAAO;MAAW,UAAA;KAAwB,CAAA;IACpD,CAAA,CACJ;;GACN,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACI,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACI,oBAAC,QAAD;OAAM,WAAU;OACX,UAAA,KAAK;MACJ,CAAA,GACN,oBAAC,QAAD;OAAM,WAAU;OACZ,UAAA,oBAAC,YAAD;QAAY,QAAO;QAAW,UAAA;OAAwB,CAAA;MACpD,CAAA,CACJ;;KACN,oBAAC,QAAD;MAAM,WAAU;MAAqD,UAAA,KAAK;KAAW,CAAA;KACpF,KAAK,UAAU,QACZ,oBAAC,MAAD;MAAI,WAAU;MACT,UAAA,KAAK,SAAS,MAAM,KAAK,MAAM,UAC5B,qBAAC,MAAD;OAAe,WAAU;OAAzB,UAAA,CACI,oBAAC,QAAD;QAAM,WAAU;QACX,UAAA,QAAQ;OACP,CAAA,GACL,IACD;MALK,GAAA,IAKL,CACP;KACD,CAAA,IACJ;KACJ,oBAAC,QAAD;MAAM,WAAU;MACX,UAAA,KAAK,UAAU,WAAW,KAAK,cAC5B,oBAAC,QAAD;OAEI,WAAU;OAET,UAAA;MACC,GAJG,SAIH,CACT;KACC,CAAA;IACL;;GACJ,KAAK,UAAU,SACZ,oBAAC,OAAD;IAAK,WAAU;IAAsC,UAAA,KAAK,SAAS;GAAY,CAAA,IAC/E;EACC;;AAEjB;AAEA,SAAS,YAAY,EAAE,YAAqC;CACxD,OACI,oBAAC,QAAD;EAAM,WAAU;EACX;CACC,CAAA;AAEd"}
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from "react";
2
+ export interface RouteNode {
3
+ icon: ReactNode;
4
+ title: string;
5
+ detail: string;
6
+ }
7
+ /** One connection from end to end, drawn as a line of travelling light through every node it passes, with
8
+ * what the connection is labelled once above it. */
9
+ export declare function RouteDiagram({ nodes, label, caption }: {
10
+ nodes: readonly RouteNode[];
11
+ label: string;
12
+ caption: ReactNode;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=RouteDiagram.d.ts.map
@@ -0,0 +1,57 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ // src/showcase/RouteDiagram.tsx
3
+ /** One connection from end to end, drawn as a line of travelling light through every node it passes, with
4
+ * what the connection is labelled once above it. */
5
+ function RouteDiagram({ nodes, label, caption }) {
6
+ return /* @__PURE__ */ jsxs("figure", {
7
+ className: "border-base-300 bg-base-100/70 dark:bg-base-100/50 relative isolate overflow-hidden rounded-[1.5rem] border px-6 py-8 sm:px-10 sm:py-12",
8
+ children: [
9
+ /* @__PURE__ */ jsx("div", {
10
+ "aria-hidden": "true",
11
+ className: "absolute inset-0 -z-10 bg-[radial-gradient(60%_70%_at_50%_40%,var(--lar-glow-soft),transparent_70%)]"
12
+ }),
13
+ /* @__PURE__ */ jsx("div", {
14
+ className: "mb-8 flex sm:justify-center",
15
+ children: /* @__PURE__ */ jsxs("span", {
16
+ className: "border-primary/30 bg-primary/8 text-primary dark:bg-primary/16 inline-flex items-center gap-2 rounded-full border px-3 py-1 text-xs font-medium dark:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]",
17
+ children: [/* @__PURE__ */ jsx("span", {
18
+ "aria-hidden": "true",
19
+ className: "size-1.5 rounded-full bg-current"
20
+ }), label]
21
+ })
22
+ }),
23
+ /* @__PURE__ */ jsxs("div", {
24
+ className: "relative",
25
+ children: [/* @__PURE__ */ jsx("span", {
26
+ "aria-hidden": "true",
27
+ className: "lar-route-line absolute top-6 bottom-6 left-[23px] w-[1.5px] sm:top-8 sm:right-[calc(100%/6)] sm:bottom-auto sm:left-[calc(100%/6)] sm:h-[1.5px] sm:w-auto"
28
+ }), /* @__PURE__ */ jsx("ol", {
29
+ className: "relative flex flex-col gap-6 sm:grid sm:grid-cols-3 sm:gap-4",
30
+ children: nodes.map((node) => /* @__PURE__ */ jsxs("li", {
31
+ className: "flex items-center gap-4 sm:flex-col sm:gap-3 sm:text-center",
32
+ children: [/* @__PURE__ */ jsx("span", {
33
+ className: "border-base-300 bg-base-50 text-base-content inline-flex size-12 shrink-0 items-center justify-center rounded-[0.9rem] border shadow-[0_14px_30px_-16px_rgb(0_0_0/50%)] sm:size-16 sm:rounded-[1.1rem] [&>svg]:size-6 sm:[&>svg]:size-7",
34
+ children: node.icon
35
+ }), /* @__PURE__ */ jsxs("span", {
36
+ className: "flex flex-col gap-0.5",
37
+ children: [/* @__PURE__ */ jsx("span", {
38
+ className: "text-base-content text-sm font-semibold",
39
+ children: node.title
40
+ }), /* @__PURE__ */ jsx("span", {
41
+ className: "text-base-700 text-xs",
42
+ children: node.detail
43
+ })]
44
+ })]
45
+ }, node.title))
46
+ })]
47
+ }),
48
+ /* @__PURE__ */ jsx("figcaption", {
49
+ className: "text-base-700 mt-8 text-sm leading-6 text-pretty sm:mt-10 sm:text-center",
50
+ children: caption
51
+ })
52
+ ]
53
+ });
54
+ }
55
+ export { RouteDiagram };
56
+
57
+ //# sourceMappingURL=RouteDiagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteDiagram.js","names":[],"sources":["../../src/showcase/RouteDiagram.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface RouteNode {\n icon: ReactNode;\n title: string;\n detail: string;\n}\n\n/** One connection from end to end, drawn as a line of travelling light through every node it passes, with\n * what the connection is labelled once above it. */\nexport function RouteDiagram({\n nodes,\n label,\n caption,\n}: {\n nodes: readonly RouteNode[];\n label: string;\n caption: ReactNode;\n}) {\n return (\n <figure className=\"border-base-300 bg-base-100/70 dark:bg-base-100/50 relative isolate overflow-hidden rounded-[1.5rem] border px-6 py-8 sm:px-10 sm:py-12\">\n <div\n aria-hidden=\"true\"\n className=\"absolute inset-0 -z-10 bg-[radial-gradient(60%_70%_at_50%_40%,var(--lar-glow-soft),transparent_70%)]\"\n />\n <div className=\"mb-8 flex sm:justify-center\">\n <span className=\"border-primary/30 bg-primary/8 text-primary dark:bg-primary/16 inline-flex items-center gap-2 rounded-full border px-3 py-1 text-xs font-medium dark:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]\">\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current\" />\n {label}\n </span>\n </div>\n <div className=\"relative\">\n <span\n aria-hidden=\"true\"\n className=\"lar-route-line absolute top-6 bottom-6 left-[23px] w-[1.5px] sm:top-8 sm:right-[calc(100%/6)] sm:bottom-auto sm:left-[calc(100%/6)] sm:h-[1.5px] sm:w-auto\"\n />\n <ol className=\"relative flex flex-col gap-6 sm:grid sm:grid-cols-3 sm:gap-4\">\n {nodes.map((node) => (\n <li key={node.title} className=\"flex items-center gap-4 sm:flex-col sm:gap-3 sm:text-center\">\n <span className=\"border-base-300 bg-base-50 text-base-content inline-flex size-12 shrink-0 items-center justify-center rounded-[0.9rem] border shadow-[0_14px_30px_-16px_rgb(0_0_0/50%)] sm:size-16 sm:rounded-[1.1rem] [&>svg]:size-6 sm:[&>svg]:size-7\">\n {node.icon}\n </span>\n <span className=\"flex flex-col gap-0.5\">\n <span className=\"text-base-content text-sm font-semibold\">{node.title}</span>\n <span className=\"text-base-700 text-xs\">{node.detail}</span>\n </span>\n </li>\n ))}\n </ol>\n </div>\n <figcaption className=\"text-base-700 mt-8 text-sm leading-6 text-pretty sm:mt-10 sm:text-center\">\n {caption}\n </figcaption>\n </figure>\n );\n}\n"],"mappings":";;;;AAUA,SAAgB,aAAa,EACzB,OACA,OACA,WAKD;CACC,OACI,qBAAC,UAAD;EAAQ,WAAU;EAAlB,UAAA;GACI,oBAAC,OAAD;IACI,eAAY;IACZ,WAAU;GACb,CAAA;GACD,oBAAC,OAAD;IAAK,WAAU;IACX,UAAA,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACI,oBAAC,QAAD;MAAM,eAAY;MAAO,WAAU;KAAoC,CAAA,GACtE,KACC;;GACL,CAAA;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,oBAAC,QAAD;KACI,eAAY;KACZ,WAAU;IACb,CAAA,GACD,oBAAC,MAAD;KAAI,WAAU;KACT,UAAA,MAAM,KAAK,SACR,qBAAC,MAAD;MAAqB,WAAU;MAA/B,UAAA,CACI,oBAAC,QAAD;OAAM,WAAU;OACX,UAAA,KAAK;MACJ,CAAA,GACN,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACI,oBAAC,QAAD;QAAM,WAAU;QAA2C,UAAA,KAAK;OAAY,CAAA,GAC5E,oBAAC,QAAD;QAAM,WAAU;QAAyB,UAAA,KAAK;OAAa,CAAA,CACzD;MACN,CAAA,CAAA;KARK,GAAA,KAAK,KAQV,CACP;IACD,CAAA,CACH;;GACL,oBAAC,cAAD;IAAY,WAAU;IACjB,UAAA;GACO,CAAA;EACR;;AAEhB"}
@@ -0,0 +1,50 @@
1
+ import { Readiness } from "./Status.js";
2
+ import { ReactNode } from "react";
3
+ export type MediaApp = 'music' | 'video' | 'photos' | 'books';
4
+ export interface ServerBay {
5
+ id: MediaApp;
6
+ name: string;
7
+ status: Readiness;
8
+ statusLabel: string;
9
+ panel: ReactNode;
10
+ }
11
+ interface ServerUnitProps {
12
+ label: string;
13
+ /** The key for the bays' lights, set under the unit. */
14
+ legend?: ReactNode;
15
+ display: {
16
+ name: string;
17
+ state: string;
18
+ };
19
+ bays: readonly ServerBay[];
20
+ }
21
+ /** The server as a four-bay box, one drive sled per media app. Choosing a sled pulls it forward and shows what
22
+ * that app can do today and what is still to come. */
23
+ export declare function ServerUnit({ label, display, bays, legend }: ServerUnitProps): import("react").JSX.Element;
24
+ export interface ReadinessItem {
25
+ label: string;
26
+ status: Readiness;
27
+ statusLabel: string;
28
+ }
29
+ interface ReadinessPanelProps {
30
+ icon: ReactNode;
31
+ title: string;
32
+ status: ReactNode;
33
+ summary: string;
34
+ groups: readonly {
35
+ title: string;
36
+ items: readonly ReadinessItem[];
37
+ wideOnly?: boolean;
38
+ }[];
39
+ }
40
+ /** One app's status: what works, what is being built and what is planned, line by line. */
41
+ export declare function ReadinessPanel({ icon, title, status, summary, groups }: ReadinessPanelProps): import("react").JSX.Element;
42
+ /** The key for the readiness lights. */
43
+ export declare function ReadinessLegend({ items }: {
44
+ items: readonly {
45
+ status: Readiness;
46
+ label: string;
47
+ }[];
48
+ }): import("react").JSX.Element;
49
+ export {};
50
+ //# sourceMappingURL=ServerUnit.d.ts.map
@@ -0,0 +1,175 @@
1
+ import { Heading, Text } from "../typography/Typography.js";
2
+ import { StatusLight, StatusPill } from "./Status.js";
3
+ import { useId, useRef, useState } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/showcase/ServerUnit.tsx
6
+ const MARK_L = "M0 0H27.52V72.48H100V100H3a3 3 0 0 1-3-3z";
7
+ const MARK_S = "M50.68 0H91.97a8.03 8.03 0 0 1 8.03 8.03V49.32a8.03 8.03 0 0 1-8.03 8.03H50.68a8.03 8.03 0 0 1-8.03-8.03V8.03a8.03 8.03 0 0 1 8.03-8.03z";
8
+ /** The server as a four-bay box, one drive sled per media app. Choosing a sled pulls it forward and shows what
9
+ * that app can do today and what is still to come. */
10
+ function ServerUnit({ label, display, bays, legend }) {
11
+ const [selected, setSelected] = useState(bays[0]?.id ?? "music");
12
+ const tabs = useRef([]);
13
+ const baseId = useId();
14
+ const current = bays.find((bay) => bay.id === selected) ?? bays[0];
15
+ function move(event, index) {
16
+ const step = {
17
+ ArrowRight: 1,
18
+ ArrowDown: 1,
19
+ ArrowLeft: -1,
20
+ ArrowUp: -1
21
+ }[event.key];
22
+ let next;
23
+ if (step !== void 0) next = (index + step + bays.length) % bays.length;
24
+ if (event.key === "Home") next = 0;
25
+ if (event.key === "End") next = bays.length - 1;
26
+ if (next === void 0) return;
27
+ event.preventDefault();
28
+ const bay = bays[next];
29
+ if (!bay) return;
30
+ setSelected(bay.id);
31
+ tabs.current[next]?.focus();
32
+ }
33
+ return /* @__PURE__ */ jsxs("div", {
34
+ className: "grid items-start gap-10 lg:grid-cols-[minmax(0,7fr)_minmax(0,5fr)] lg:items-center lg:gap-14",
35
+ children: [/* @__PURE__ */ jsxs("div", {
36
+ className: "flex flex-col gap-8 [perspective:1600px]",
37
+ children: [/* @__PURE__ */ jsxs("div", {
38
+ className: "lar-unit [transform:rotateX(2deg)_rotateY(5deg)] transition-transform duration-700 hover:[transform:rotateX(1deg)_rotateY(3deg)]",
39
+ children: [/* @__PURE__ */ jsxs("div", {
40
+ className: "lar-unit__top",
41
+ "aria-hidden": "true",
42
+ children: [
43
+ /* @__PURE__ */ jsxs("svg", {
44
+ viewBox: "0 0 100 100",
45
+ className: "lar-unit__mark",
46
+ children: [/* @__PURE__ */ jsx("path", {
47
+ d: MARK_L,
48
+ fill: "#f4f4f5"
49
+ }), /* @__PURE__ */ jsx("path", {
50
+ d: MARK_S,
51
+ fill: "#355292"
52
+ })]
53
+ }),
54
+ /* @__PURE__ */ jsxs("div", {
55
+ className: "lar-unit__lcd",
56
+ children: [/* @__PURE__ */ jsx("span", { children: display.name }), /* @__PURE__ */ jsx("b", { children: display.state })]
57
+ }),
58
+ /* @__PURE__ */ jsxs("div", {
59
+ className: "lar-unit__lights",
60
+ children: [/* @__PURE__ */ jsx("i", {}), /* @__PURE__ */ jsx("i", { className: "lar-led-pulse" })]
61
+ })
62
+ ]
63
+ }), /* @__PURE__ */ jsx("div", {
64
+ role: "tablist",
65
+ "aria-label": label,
66
+ className: "lar-unit__bays",
67
+ children: bays.map((bay, index) => /* @__PURE__ */ jsxs("button", {
68
+ ref: (element) => {
69
+ tabs.current[index] = element;
70
+ },
71
+ type: "button",
72
+ role: "tab",
73
+ id: `${baseId}-${bay.id}-tab`,
74
+ "aria-controls": `${baseId}-panel`,
75
+ "aria-selected": bay.id === selected,
76
+ tabIndex: bay.id === selected ? 0 : -1,
77
+ "data-app": bay.id,
78
+ "data-status": bay.status,
79
+ onClick: () => setSelected(bay.id),
80
+ onKeyDown: (event) => move(event, index),
81
+ className: "lar-sled",
82
+ children: [
83
+ /* @__PURE__ */ jsx("i", {
84
+ className: "lar-sled__led lar-led-pulse",
85
+ style: { ["--lar-led-delay"]: `${index * 420}ms` }
86
+ }),
87
+ /* @__PURE__ */ jsx("i", { className: "lar-sled__vents" }),
88
+ /* @__PURE__ */ jsx("span", {
89
+ className: "lar-sled__name",
90
+ children: bay.name
91
+ }),
92
+ /* @__PURE__ */ jsx("span", {
93
+ className: "lar-sled__state",
94
+ children: bay.statusLabel
95
+ }),
96
+ /* @__PURE__ */ jsx("i", { className: "lar-sled__latch" })
97
+ ]
98
+ }, bay.id))
99
+ })]
100
+ }), legend]
101
+ }), current ? /* @__PURE__ */ jsx("div", {
102
+ role: "tabpanel",
103
+ id: `${baseId}-panel`,
104
+ "aria-labelledby": `${baseId}-${current.id}-tab`,
105
+ className: "border-base-300 bg-base-100/70 dark:bg-base-100/50 rounded-[1.25rem] border p-5 sm:min-h-[420px] sm:p-7",
106
+ children: current.panel
107
+ }) : null]
108
+ });
109
+ }
110
+ /** One app's status: what works, what is being built and what is planned, line by line. */
111
+ function ReadinessPanel({ icon, title, status, summary, groups }) {
112
+ return /* @__PURE__ */ jsxs("div", {
113
+ className: "flex flex-col gap-5",
114
+ children: [
115
+ /* @__PURE__ */ jsxs("div", {
116
+ className: "flex items-center gap-3",
117
+ children: [
118
+ icon,
119
+ /* @__PURE__ */ jsx(Heading, {
120
+ as: "h3",
121
+ variant: "feature",
122
+ children: title
123
+ }),
124
+ /* @__PURE__ */ jsx("span", {
125
+ className: "ml-auto",
126
+ children: status
127
+ })
128
+ ]
129
+ }),
130
+ /* @__PURE__ */ jsx(Text, {
131
+ variant: "prose",
132
+ tone: "muted",
133
+ children: summary
134
+ }),
135
+ groups.map((group) => /* @__PURE__ */ jsxs("div", {
136
+ className: `flex-col gap-2 ${group.wideOnly ? "hidden sm:flex" : "flex"}`,
137
+ children: [/* @__PURE__ */ jsx(Text, {
138
+ as: "span",
139
+ variant: "overline",
140
+ tone: "muted",
141
+ children: group.title
142
+ }), /* @__PURE__ */ jsx("ul", {
143
+ className: "divide-base-300/70 flex flex-col divide-y",
144
+ children: group.items.map((item) => /* @__PURE__ */ jsxs("li", {
145
+ className: "text-base-800 flex items-center gap-3 py-1.5 text-sm sm:py-2",
146
+ children: [
147
+ /* @__PURE__ */ jsx(StatusLight, { status: item.status }),
148
+ /* @__PURE__ */ jsx("span", {
149
+ className: "min-w-0 flex-1",
150
+ children: item.label
151
+ }),
152
+ /* @__PURE__ */ jsx("span", {
153
+ className: "text-base-700 shrink-0 text-xs",
154
+ children: item.statusLabel
155
+ })
156
+ ]
157
+ }, item.label))
158
+ })]
159
+ }, group.title))
160
+ ]
161
+ });
162
+ }
163
+ /** The key for the readiness lights. */
164
+ function ReadinessLegend({ items }) {
165
+ return /* @__PURE__ */ jsx("div", {
166
+ className: "flex flex-wrap items-center justify-center gap-2",
167
+ children: items.map((item) => /* @__PURE__ */ jsx(StatusPill, {
168
+ status: item.status,
169
+ children: item.label
170
+ }, item.status))
171
+ });
172
+ }
173
+ export { ReadinessLegend, ReadinessPanel, ServerUnit };
174
+
175
+ //# sourceMappingURL=ServerUnit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerUnit.js","names":[],"sources":["../../src/showcase/ServerUnit.tsx"],"sourcesContent":["import { type KeyboardEvent, type ReactNode, useId, useRef, useState } from 'react';\n\nimport { Heading, Text } from '../typography/Typography';\nimport { type Readiness, StatusLight, StatusPill } from './Status';\n\nexport type MediaApp = 'music' | 'video' | 'photos' | 'books';\n\nexport interface ServerBay {\n id: MediaApp;\n name: string;\n status: Readiness;\n statusLabel: string;\n panel: ReactNode;\n}\n\ninterface ServerUnitProps {\n label: string;\n /** The key for the bays' lights, set under the unit. */\n legend?: ReactNode;\n display: { name: string; state: string };\n bays: readonly ServerBay[];\n}\n\nconst MARK_L = 'M0 0H27.52V72.48H100V100H3a3 3 0 0 1-3-3z';\nconst MARK_S =\n 'M50.68 0H91.97a8.03 8.03 0 0 1 8.03 8.03V49.32a8.03 8.03 0 0 1-8.03 8.03H50.68a8.03 8.03 0 0 1-8.03-8.03V8.03a8.03 8.03 0 0 1 8.03-8.03z';\n\n/** The server as a four-bay box, one drive sled per media app. Choosing a sled pulls it forward and shows what\n * that app can do today and what is still to come. */\nexport function ServerUnit({ label, display, bays, legend }: ServerUnitProps) {\n const [selected, setSelected] = useState<MediaApp>(bays[0]?.id ?? 'music');\n const tabs = useRef<(HTMLButtonElement | null)[]>([]);\n const baseId = useId();\n const current = bays.find((bay) => bay.id === selected) ?? bays[0];\n\n function move(event: KeyboardEvent<HTMLButtonElement>, index: number) {\n const keys: Record<string, number> = {\n ArrowRight: 1,\n ArrowDown: 1,\n ArrowLeft: -1,\n ArrowUp: -1,\n };\n const step = keys[event.key];\n let next: number | undefined;\n\n if (step !== undefined) next = (index + step + bays.length) % bays.length;\n\n if (event.key === 'Home') next = 0;\n\n if (event.key === 'End') next = bays.length - 1;\n\n if (next === undefined) return;\n\n event.preventDefault();\n\n const bay = bays[next];\n\n if (!bay) return;\n\n setSelected(bay.id);\n tabs.current[next]?.focus();\n }\n\n return (\n <div className=\"grid items-start gap-10 lg:grid-cols-[minmax(0,7fr)_minmax(0,5fr)] lg:items-center lg:gap-14\">\n <div className=\"flex flex-col gap-8 [perspective:1600px]\">\n <div className=\"lar-unit [transform:rotateX(2deg)_rotateY(5deg)] transition-transform duration-700 hover:[transform:rotateX(1deg)_rotateY(3deg)]\">\n <div className=\"lar-unit__top\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" className=\"lar-unit__mark\">\n <path d={MARK_L} fill=\"#f4f4f5\" />\n <path d={MARK_S} fill=\"#355292\" />\n </svg>\n <div className=\"lar-unit__lcd\">\n <span>{display.name}</span>\n <b>{display.state}</b>\n </div>\n <div className=\"lar-unit__lights\">\n <i />\n <i className=\"lar-led-pulse\" />\n </div>\n </div>\n <div role=\"tablist\" aria-label={label} className=\"lar-unit__bays\">\n {bays.map((bay, index) => (\n <button\n key={bay.id}\n ref={(element) => {\n tabs.current[index] = element;\n }}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-${bay.id}-tab`}\n aria-controls={`${baseId}-panel`}\n aria-selected={bay.id === selected}\n tabIndex={bay.id === selected ? 0 : -1}\n data-app={bay.id}\n data-status={bay.status}\n onClick={() => setSelected(bay.id)}\n onKeyDown={(event) => move(event, index)}\n className=\"lar-sled\"\n >\n <i\n className=\"lar-sled__led lar-led-pulse\"\n style={{ ['--lar-led-delay' as string]: `${index * 420}ms` }}\n />\n <i className=\"lar-sled__vents\" />\n <span className=\"lar-sled__name\">{bay.name}</span>\n <span className=\"lar-sled__state\">{bay.statusLabel}</span>\n <i className=\"lar-sled__latch\" />\n </button>\n ))}\n </div>\n </div>\n {legend}\n </div>\n {current ? (\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel`}\n aria-labelledby={`${baseId}-${current.id}-tab`}\n className=\"border-base-300 bg-base-100/70 dark:bg-base-100/50 rounded-[1.25rem] border p-5 sm:min-h-[420px] sm:p-7\"\n >\n {current.panel}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport interface ReadinessItem {\n label: string;\n status: Readiness;\n statusLabel: string;\n}\n\ninterface ReadinessPanelProps {\n icon: ReactNode;\n title: string;\n status: ReactNode;\n summary: string;\n groups: readonly { title: string; items: readonly ReadinessItem[]; wideOnly?: boolean }[];\n}\n\n/** One app's status: what works, what is being built and what is planned, line by line. */\nexport function ReadinessPanel({ icon, title, status, summary, groups }: ReadinessPanelProps) {\n return (\n <div className=\"flex flex-col gap-5\">\n <div className=\"flex items-center gap-3\">\n {icon}\n <Heading as=\"h3\" variant=\"feature\">\n {title}\n </Heading>\n <span className=\"ml-auto\">{status}</span>\n </div>\n <Text variant=\"prose\" tone=\"muted\">\n {summary}\n </Text>\n {groups.map((group) => (\n <div key={group.title} className={`flex-col gap-2 ${group.wideOnly ? 'hidden sm:flex' : 'flex'}`}>\n <Text as=\"span\" variant=\"overline\" tone=\"muted\">\n {group.title}\n </Text>\n <ul className=\"divide-base-300/70 flex flex-col divide-y\">\n {group.items.map((item) => (\n <li\n key={item.label}\n className=\"text-base-800 flex items-center gap-3 py-1.5 text-sm sm:py-2\"\n >\n <StatusLight status={item.status} />\n <span className=\"min-w-0 flex-1\">{item.label}</span>\n <span className=\"text-base-700 shrink-0 text-xs\">{item.statusLabel}</span>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n );\n}\n\n/** The key for the readiness lights. */\nexport function ReadinessLegend({ items }: { items: readonly { status: Readiness; label: string }[] }) {\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-2\">\n {items.map((item) => (\n <StatusPill key={item.status} status={item.status}>\n {item.label}\n </StatusPill>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { ReactNode } from "react";
2
+ /** The navy glow and fading grid behind a hero. A hue tints the glow with a product's colour. */
3
+ export declare function Backdrop({ hue }: {
4
+ hue?: number;
5
+ }): import("react").JSX.Element;
6
+ interface DeviceStageProps {
7
+ /** The large device in the middle. */
8
+ main: ReactNode;
9
+ /** A device in front, at the lower right. */
10
+ end?: ReactNode;
11
+ /** A device in front, at the lower left; hidden on narrow screens. */
12
+ start?: ReactNode;
13
+ /** How far the scene leans back, in degrees. */
14
+ pitch?: number;
15
+ /** The start device's width: a tablet or TV at 'wide', a phone at 'narrow'. */
16
+ startSize?: 'wide' | 'narrow';
17
+ /** A close-up that floats in front, across the lower left; hidden on narrow screens. */
18
+ callout?: ReactNode;
19
+ /** How big the end device is: 'small' beside a hero laptop, 'large' when the phone is the point. */
20
+ endSize?: 'small' | 'large';
21
+ /** What a phone-width screen shows, where a laptop's text would be too small to read: the end device or the
22
+ * callout alone, or a readable close-up with the end device overlapping its corner. */
23
+ narrow?: 'stage' | 'end' | 'callout' | 'pair';
24
+ /** The close-up that 'pair' shows on phones. */
25
+ narrowMain?: ReactNode;
26
+ /** Which side a large end device stands on. */
27
+ endSide?: 'left' | 'right';
28
+ }
29
+ /** A group of devices in perspective that leans gently toward the pointer. */
30
+ export declare function DeviceStage({ main, end, start, callout, pitch, startSize, endSize, narrow, narrowMain, endSide }: DeviceStageProps): import("react").JSX.Element;
31
+ /** One device turned in space, for a feature row. */
32
+ export declare function AngledDevice({ children, angle }: {
33
+ children: ReactNode;
34
+ angle?: 'left' | 'right' | 'flat' | 'lean' | 'tilt';
35
+ }): import("react").JSX.Element;
36
+ /** Fades and lifts its content into place as it scrolls into view. */
37
+ export declare function Reveal({ children }: {
38
+ children: ReactNode;
39
+ }): import("react").JSX.Element;
40
+ /** Shows the full composition on wider screens and a readable close-up on phones. */
41
+ export declare function ResponsiveMedia({ wide, narrow }: {
42
+ wide: ReactNode;
43
+ narrow: ReactNode;
44
+ }): import("react").JSX.Element;
45
+ export {};
46
+ //# sourceMappingURL=Stage.d.ts.map
@@ -0,0 +1,106 @@
1
+ import { useRef } from "react";
2
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
3
+ // src/showcase/Stage.tsx
4
+ /** The navy glow and fading grid behind a hero. A hue tints the glow with a product's colour. */
5
+ function Backdrop({ hue }) {
6
+ return /* @__PURE__ */ jsx("div", {
7
+ "aria-hidden": "true",
8
+ className: "lar-backdrop",
9
+ "data-hue": hue === void 0 ? void 0 : "",
10
+ style: hue === void 0 ? void 0 : { "--lar-backdrop-hue": hue }
11
+ });
12
+ }
13
+ const MAX_TILT = 2.5;
14
+ /** A group of devices in perspective that leans gently toward the pointer. */
15
+ function DeviceStage({ main, end, start, callout, pitch = 0, startSize = "wide", endSize = "small", narrow = "stage", narrowMain, endSide = "right" }) {
16
+ const scene = useRef(null);
17
+ function lean(event) {
18
+ const element = scene.current;
19
+ if (!element || event.pointerType !== "mouse" || matchMedia("(prefers-reduced-motion: reduce)").matches) return;
20
+ const bounds = event.currentTarget.getBoundingClientRect();
21
+ const x = (event.clientX - bounds.left) / bounds.width - .5;
22
+ const y = (event.clientY - bounds.top) / bounds.height - .5;
23
+ element.style.setProperty("--lar-tilt-x", `${(-y * MAX_TILT).toFixed(2)}deg`);
24
+ element.style.setProperty("--lar-tilt-y", `${(x * MAX_TILT * 1.6).toFixed(2)}deg`);
25
+ }
26
+ function settle() {
27
+ scene.current?.style.removeProperty("--lar-tilt-x");
28
+ scene.current?.style.removeProperty("--lar-tilt-y");
29
+ }
30
+ const alone = narrow === "end" ? end : narrow === "callout" ? callout : void 0;
31
+ const pair = narrow === "pair" && narrowMain;
32
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
33
+ alone ? /* @__PURE__ */ jsx("div", {
34
+ className: "mx-auto w-[min(60%,220px)] sm:hidden",
35
+ children: alone
36
+ }) : null,
37
+ pair ? /* @__PURE__ */ jsxs("div", {
38
+ className: `relative sm:hidden ${end ? "mr-6 mb-10" : ""}`,
39
+ children: [narrowMain, end ? /* @__PURE__ */ jsx("div", {
40
+ className: "absolute -right-6 -bottom-10 w-[30%] max-w-[120px] rotate-[3deg]",
41
+ children: end
42
+ }) : null]
43
+ }) : null,
44
+ /* @__PURE__ */ jsx("div", {
45
+ className: `lar-stage ${alone || pair ? "hidden sm:block" : ""}`,
46
+ onPointerMove: lean,
47
+ onPointerLeave: settle,
48
+ children: /* @__PURE__ */ jsxs("div", {
49
+ ref: scene,
50
+ className: `lar-stage__scene ${endSize === "large" ? "grid grid-cols-1" : ""}`,
51
+ style: { "--lar-stage-pitch": `${pitch}deg` },
52
+ children: [
53
+ /* @__PURE__ */ jsx("div", {
54
+ className: `lar-stage__slot relative ${endSize === "large" ? `col-start-1 row-start-1 w-[92%] self-start sm:mt-[8%] sm:w-[84%] ${endSide === "left" ? "justify-self-end" : ""}` : ""}`,
55
+ children: main
56
+ }),
57
+ start ? /* @__PURE__ */ jsx("div", {
58
+ className: `lar-stage__slot absolute bottom-[-7%] left-[-2%] hidden [transform:translateZ(60px)_rotateY(9deg)] sm:block ${startSize === "wide" ? "w-[34%]" : "w-[17%]"}`,
59
+ children: start
60
+ }) : null,
61
+ callout ? /* @__PURE__ */ jsx("div", {
62
+ className: "lar-stage__slot absolute bottom-[-5%] left-[1%] hidden w-[30%] [transform:translateZ(120px)_rotateY(6deg)_rotateZ(-1.5deg)] md:block",
63
+ children: callout
64
+ }) : null,
65
+ end ? /* @__PURE__ */ jsx("div", {
66
+ className: `lar-stage__slot ${endSize === "large" ? `relative col-start-1 row-start-1 mt-[24%] w-[36%] self-start sm:mt-0 sm:w-[30%] ${endSide === "left" ? "justify-self-start sm:[transform:translateZ(90px)_rotateY(9deg)_rotateZ(-1deg)]" : "justify-self-end sm:[transform:translateZ(90px)_rotateY(-9deg)_rotateZ(1deg)]"}` : "absolute right-[-1%] bottom-[2%] w-[30%] [transform:translateZ(90px)_rotateY(-11deg)_rotateZ(1deg)] sm:w-[18%]"}`,
67
+ children: end
68
+ }) : null
69
+ ]
70
+ })
71
+ })
72
+ ] });
73
+ }
74
+ /** One device turned in space, for a feature row. */
75
+ function AngledDevice({ children, angle = "left" }) {
76
+ return /* @__PURE__ */ jsx("div", {
77
+ className: `transition-transform duration-700 ${{
78
+ left: "sm:[transform:perspective(2400px)_rotateY(3deg)]",
79
+ right: "sm:[transform:perspective(2400px)_rotateY(-3deg)]",
80
+ lean: "sm:[transform:perspective(2600px)_rotateX(4deg)]",
81
+ tilt: "sm:[transform:perspective(1600px)_rotateY(-6deg)_rotateX(3deg)]",
82
+ flat: ""
83
+ }[angle]}`,
84
+ children
85
+ });
86
+ }
87
+ /** Fades and lifts its content into place as it scrolls into view. */
88
+ function Reveal({ children }) {
89
+ return /* @__PURE__ */ jsx("div", {
90
+ className: "lar-reveal",
91
+ children
92
+ });
93
+ }
94
+ /** Shows the full composition on wider screens and a readable close-up on phones. */
95
+ function ResponsiveMedia({ wide, narrow }) {
96
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
97
+ className: "hidden sm:block",
98
+ children: wide
99
+ }), /* @__PURE__ */ jsx("div", {
100
+ className: "sm:hidden",
101
+ children: narrow
102
+ })] });
103
+ }
104
+ export { AngledDevice, Backdrop, DeviceStage, ResponsiveMedia, Reveal };
105
+
106
+ //# sourceMappingURL=Stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stage.js","names":[],"sources":["../../src/showcase/Stage.tsx"],"sourcesContent":["import { type CSSProperties, type PointerEvent, type ReactNode, useRef } from 'react';\n\n/** The navy glow and fading grid behind a hero. A hue tints the glow with a product's colour. */\nexport function Backdrop({ hue }: { hue?: number }) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"lar-backdrop\"\n data-hue={hue === undefined ? undefined : ''}\n style={hue === undefined ? undefined : ({ '--lar-backdrop-hue': hue } as CSSProperties)}\n />\n );\n}\n\ninterface DeviceStageProps {\n /** The large device in the middle. */\n main: ReactNode;\n /** A device in front, at the lower right. */\n end?: ReactNode;\n /** A device in front, at the lower left; hidden on narrow screens. */\n start?: ReactNode;\n /** How far the scene leans back, in degrees. */\n pitch?: number;\n /** The start device's width: a tablet or TV at 'wide', a phone at 'narrow'. */\n startSize?: 'wide' | 'narrow';\n /** A close-up that floats in front, across the lower left; hidden on narrow screens. */\n callout?: ReactNode;\n /** How big the end device is: 'small' beside a hero laptop, 'large' when the phone is the point. */\n endSize?: 'small' | 'large';\n /** What a phone-width screen shows, where a laptop's text would be too small to read: the end device or the\n * callout alone, or a readable close-up with the end device overlapping its corner. */\n narrow?: 'stage' | 'end' | 'callout' | 'pair';\n /** The close-up that 'pair' shows on phones. */\n narrowMain?: ReactNode;\n /** Which side a large end device stands on. */\n endSide?: 'left' | 'right';\n}\n\nconst MAX_TILT = 2.5;\n\n/** A group of devices in perspective that leans gently toward the pointer. */\nexport function DeviceStage({\n main,\n end,\n start,\n callout,\n pitch = 0,\n startSize = 'wide',\n endSize = 'small',\n narrow = 'stage',\n narrowMain,\n endSide = 'right',\n}: DeviceStageProps) {\n const scene = useRef<HTMLDivElement>(null);\n\n function lean(event: PointerEvent<HTMLDivElement>) {\n const element = scene.current;\n\n if (!element || event.pointerType !== 'mouse' || matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n const bounds = event.currentTarget.getBoundingClientRect();\n const x = (event.clientX - bounds.left) / bounds.width - 0.5;\n const y = (event.clientY - bounds.top) / bounds.height - 0.5;\n\n element.style.setProperty('--lar-tilt-x', `${(-y * MAX_TILT).toFixed(2)}deg`);\n element.style.setProperty('--lar-tilt-y', `${(x * MAX_TILT * 1.6).toFixed(2)}deg`);\n }\n\n function settle() {\n scene.current?.style.removeProperty('--lar-tilt-x');\n scene.current?.style.removeProperty('--lar-tilt-y');\n }\n\n const alone = narrow === 'end' ? end : narrow === 'callout' ? callout : undefined;\n const pair = narrow === 'pair' && narrowMain;\n\n return (\n <>\n {alone ? <div className=\"mx-auto w-[min(60%,220px)] sm:hidden\">{alone}</div> : null}\n {pair ? (\n <div className={`relative sm:hidden ${end ? 'mr-6 mb-10' : ''}`}>\n {narrowMain}\n {end ? (\n <div className=\"absolute -right-6 -bottom-10 w-[30%] max-w-[120px] rotate-[3deg]\">{end}</div>\n ) : null}\n </div>\n ) : null}\n <div\n className={`lar-stage ${alone || pair ? 'hidden sm:block' : ''}`}\n onPointerMove={lean}\n onPointerLeave={settle}\n >\n <div\n ref={scene}\n className={`lar-stage__scene ${endSize === 'large' ? 'grid grid-cols-1' : ''}`}\n style={{ '--lar-stage-pitch': `${pitch}deg` } as CSSProperties}\n >\n <div\n className={`lar-stage__slot relative ${endSize === 'large' ? `col-start-1 row-start-1 w-[92%] self-start sm:mt-[8%] sm:w-[84%] ${endSide === 'left' ? 'justify-self-end' : ''}` : ''}`}\n >\n {main}\n </div>\n {start ? (\n <div\n className={`lar-stage__slot absolute bottom-[-7%] left-[-2%] hidden [transform:translateZ(60px)_rotateY(9deg)] sm:block ${startSize === 'wide' ? 'w-[34%]' : 'w-[17%]'}`}\n >\n {start}\n </div>\n ) : null}\n {callout ? (\n <div className=\"lar-stage__slot absolute bottom-[-5%] left-[1%] hidden w-[30%] [transform:translateZ(120px)_rotateY(6deg)_rotateZ(-1.5deg)] md:block\">\n {callout}\n </div>\n ) : null}\n {end ? (\n <div\n className={`lar-stage__slot ${endSize === 'large' ? `relative col-start-1 row-start-1 mt-[24%] w-[36%] self-start sm:mt-0 sm:w-[30%] ${endSide === 'left' ? 'justify-self-start sm:[transform:translateZ(90px)_rotateY(9deg)_rotateZ(-1deg)]' : 'justify-self-end sm:[transform:translateZ(90px)_rotateY(-9deg)_rotateZ(1deg)]'}` : 'absolute right-[-1%] bottom-[2%] w-[30%] [transform:translateZ(90px)_rotateY(-11deg)_rotateZ(1deg)] sm:w-[18%]'}`}\n >\n {end}\n </div>\n ) : null}\n </div>\n </div>\n </>\n );\n}\n\n/** One device turned in space, for a feature row. */\nexport function AngledDevice({\n children,\n angle = 'left',\n}: {\n children: ReactNode;\n angle?: 'left' | 'right' | 'flat' | 'lean' | 'tilt';\n}) {\n const angles = {\n left: 'sm:[transform:perspective(2400px)_rotateY(3deg)]',\n right: 'sm:[transform:perspective(2400px)_rotateY(-3deg)]',\n lean: 'sm:[transform:perspective(2600px)_rotateX(4deg)]',\n tilt: 'sm:[transform:perspective(1600px)_rotateY(-6deg)_rotateX(3deg)]',\n flat: '',\n } as const;\n\n return <div className={`transition-transform duration-700 ${angles[angle]}`}>{children}</div>;\n}\n\n/** Fades and lifts its content into place as it scrolls into view. */\nexport function Reveal({ children }: { children: ReactNode }) {\n return <div className=\"lar-reveal\">{children}</div>;\n}\n\n/** Shows the full composition on wider screens and a readable close-up on phones. */\nexport function ResponsiveMedia({ wide, narrow }: { wide: ReactNode; narrow: ReactNode }) {\n return (\n <>\n <div className=\"hidden sm:block\">{wide}</div>\n <div className=\"sm:hidden\">{narrow}</div>\n </>\n );\n}\n"],"mappings":"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"}