@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,57 @@
1
+ import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
2
+ import { LinkBox } from "../typography/Link.js";
3
+ import { Text } from "../typography/Typography.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/collections/DataRow.tsx
6
+ function DataRowRoot({ children, interactive, rowIndex }) {
7
+ return /* @__PURE__ */ jsx(LinkBox, {
8
+ role: "row",
9
+ "aria-rowindex": rowIndex,
10
+ className: `group group/media-item border-base-300/60 grid h-full min-w-0 grid-cols-(--lar-list-columns) items-center gap-4 border-b px-3 transition-colors motion-reduce:transition-none ${interactive ? "hover:bg-base-100 focus-within:bg-base-100" : ""}`,
11
+ children
12
+ });
13
+ }
14
+ function DataRowPrimary(props) {
15
+ const artwork = props.loading ? props.artwork !== false && /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "artwork" }) : props.artwork;
16
+ const subtitle = props.loading ? props.subtitle !== false : Boolean(props.subtitle);
17
+ return /* @__PURE__ */ jsxs("span", {
18
+ className: "flex min-w-0 items-center gap-3",
19
+ children: [
20
+ artwork ? /* @__PURE__ */ jsx("span", {
21
+ className: "size-10 shrink-0",
22
+ children: artwork
23
+ }) : null,
24
+ /* @__PURE__ */ jsxs("span", {
25
+ className: "min-w-0 flex-1",
26
+ children: [/* @__PURE__ */ jsx(Text, {
27
+ as: "span",
28
+ className: "block",
29
+ truncate: true,
30
+ variant: "label",
31
+ loading: props.loading,
32
+ title: props.loading ? void 0 : props.title,
33
+ children: !props.loading && props.title
34
+ }), subtitle ? /* @__PURE__ */ jsx(Text, {
35
+ as: "span",
36
+ className: "block",
37
+ truncate: true,
38
+ variant: "caption",
39
+ tone: "muted",
40
+ loading: props.loading,
41
+ children: !props.loading && props.subtitle
42
+ }) : null]
43
+ }),
44
+ !props.loading && props.detail ? /* @__PURE__ */ jsx(Text, {
45
+ as: "span",
46
+ className: "ml-auto shrink-0",
47
+ variant: "caption",
48
+ tone: "muted",
49
+ children: props.detail
50
+ }) : null
51
+ ]
52
+ });
53
+ }
54
+ const DataRow = Object.assign(DataRowRoot, { Primary: DataRowPrimary });
55
+ export { DataRow };
56
+
57
+ //# sourceMappingURL=DataRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataRow.js","names":[],"sources":["../../src/collections/DataRow.tsx"],"sourcesContent":["/* oxlint-disable react/only-export-components -- Compound members are exported through DataRow. */\nimport type { ReactNode } from 'react';\n\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { LinkBox } from '../typography/Link';\nimport { Text } from '../typography/Typography';\n\nfunction DataRowRoot({\n children,\n interactive,\n rowIndex,\n}: {\n children: ReactNode;\n interactive?: boolean;\n rowIndex: number;\n}) {\n return (\n <LinkBox\n role=\"row\"\n aria-rowindex={rowIndex}\n className={`group group/media-item border-base-300/60 grid h-full min-w-0 grid-cols-(--lar-list-columns) items-center gap-4 border-b px-3 transition-colors motion-reduce:transition-none ${interactive ? 'hover:bg-base-100 focus-within:bg-base-100' : ''}`}\n >\n {children}\n </LinkBox>\n );\n}\n\ntype DataRowPrimaryProps =\n | {\n artwork?: ReactNode;\n detail?: ReactNode;\n loading?: false;\n subtitle?: ReactNode;\n title: string;\n }\n | {\n artwork?: boolean;\n loading: true;\n subtitle?: boolean;\n };\n\nfunction DataRowPrimary(props: DataRowPrimaryProps) {\n const artwork = props.loading\n ? props.artwork !== false && <SkeletonLoader.Shape presentation=\"artwork\" />\n : props.artwork;\n const subtitle = props.loading ? props.subtitle !== false : Boolean(props.subtitle);\n\n return (\n <span className=\"flex min-w-0 items-center gap-3\">\n {artwork ? <span className=\"size-10 shrink-0\">{artwork}</span> : null}\n <span className=\"min-w-0 flex-1\">\n <Text\n as=\"span\"\n className=\"block\"\n truncate\n variant=\"label\"\n loading={props.loading}\n title={props.loading ? undefined : props.title}\n >\n {!props.loading && props.title}\n </Text>\n {subtitle ? (\n <Text as=\"span\" className=\"block\" truncate variant=\"caption\" tone=\"muted\" loading={props.loading}>\n {!props.loading && props.subtitle}\n </Text>\n ) : null}\n </span>\n {!props.loading && props.detail ? (\n <Text as=\"span\" className=\"ml-auto shrink-0\" variant=\"caption\" tone=\"muted\">\n {props.detail}\n </Text>\n ) : null}\n </span>\n );\n}\n\nexport const DataRow = Object.assign(DataRowRoot, {\n Primary: DataRowPrimary,\n});\n"],"mappings":";;;;;AAOA,SAAS,YAAY,EACjB,UACA,aACA,YAKD;CACC,OACI,oBAAC,SAAD;EACI,MAAK;EACL,iBAAe;EACf,WAAW,iLAAiL,cAAc,+CAA+C;EAExP;CACI,CAAA;AAEjB;AAgBA,SAAS,eAAe,OAA4B;CAChD,MAAM,UAAU,MAAM,UAChB,MAAM,YAAY,SAAS,oBAAC,eAAe,OAAhB,EAAsB,cAAa,UAAW,CAAA,IACzE,MAAM;CACZ,MAAM,WAAW,MAAM,UAAU,MAAM,aAAa,QAAQ,QAAQ,MAAM,QAAQ;CAElF,OACI,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA;GACK,UAAU,oBAAC,QAAD;IAAM,WAAU;IAAoB,UAAA;GAAc,CAAA,IAAI;GACjE,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACI,oBAAC,MAAD;KACI,IAAG;KACH,WAAU;KACV,UAAA;KACA,SAAQ;KACR,SAAS,MAAM;KACf,OAAO,MAAM,UAAU,KAAA,IAAY,MAAM;KAExC,UAAA,CAAC,MAAM,WAAW,MAAM;IACvB,CAAA,GACL,WACG,oBAAC,MAAD;KAAM,IAAG;KAAO,WAAU;KAAQ,UAAA;KAAS,SAAQ;KAAU,MAAK;KAAQ,SAAS,MAAM;KACpF,UAAA,CAAC,MAAM,WAAW,MAAM;IACvB,CAAA,IACN,IACF;;GACL,CAAC,MAAM,WAAW,MAAM,SACrB,oBAAC,MAAD;IAAM,IAAG;IAAO,WAAU;IAAmB,SAAQ;IAAU,MAAK;IAC/D,UAAA,MAAM;GACL,CAAA,IACN;EACF;;AAEd;AAEA,MAAa,UAAU,OAAO,OAAO,aAAa,EAC9C,SAAS,eACb,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ interface ResultListProps extends Omit<ComponentPropsWithoutRef<'div'>, 'className' | 'style'> {
3
+ label: string;
4
+ loading?: boolean;
5
+ loadingLabel?: string;
6
+ density?: 'compact' | 'comfortable';
7
+ }
8
+ export declare function ResultList({ children, label, loading, loadingLabel, density, role, ...props }: ResultListProps): import("react").JSX.Element;
9
+ export interface ResultRowProps extends Pick<ComponentPropsWithoutRef<'button'>, 'disabled' | 'id' | 'onPointerMove' | 'tabIndex'> {
10
+ artwork: ReactNode;
11
+ kind: string;
12
+ onSelect: () => void;
13
+ href?: string;
14
+ selected?: boolean;
15
+ /** `icon` sets a small glyph in a narrow column; `default` shows artwork. */
16
+ presentation?: 'default' | 'icon' | 'poster' | 'video';
17
+ current?: boolean;
18
+ subtitle?: string;
19
+ detail?: string;
20
+ title: string;
21
+ }
22
+ export declare function ResultRow(props: ResultRowProps | {
23
+ loading: true;
24
+ }): import("react").JSX.Element;
25
+ export declare function ResultEmpty({ children }: {
26
+ children: ReactNode;
27
+ }): import("react").JSX.Element;
28
+ export {};
29
+ //# sourceMappingURL=ResultList.d.ts.map
@@ -0,0 +1,128 @@
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 { createContext, useContext } from "react";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ import { ChevronRightIcon } from "lucide-react";
9
+ // src/collections/ResultList.tsx
10
+ const ResultListContext = createContext({
11
+ compact: false,
12
+ listbox: true
13
+ });
14
+ function ResultList({ children, label, loading = false, loadingLabel = label, density = "comfortable", role = "listbox", ...props }) {
15
+ return /* @__PURE__ */ jsx(ResultListContext.Provider, {
16
+ value: {
17
+ compact: density === "compact",
18
+ listbox: role === "listbox"
19
+ },
20
+ children: /* @__PURE__ */ jsx(SkeletonLoader, {
21
+ loading,
22
+ label: loadingLabel,
23
+ children: /* @__PURE__ */ jsx("div", {
24
+ ...props,
25
+ role,
26
+ "aria-label": label,
27
+ "aria-busy": loading || props["aria-busy"],
28
+ className: "flex flex-col gap-1",
29
+ children: loading ? Array.from({ length: 8 }, (_, index) => /* @__PURE__ */ jsx(ResultRow, { loading: true }, index)) : children
30
+ })
31
+ })
32
+ });
33
+ }
34
+ function ResultRow(props) {
35
+ const { compact, listbox } = useContext(ResultListContext);
36
+ const loading = "loading" in props;
37
+ const presentation = loading ? "default" : props.presentation;
38
+ const classes = `grid w-full items-center rounded-md px-2 text-left ${presentation === "poster" ? "grid-cols-[4rem_minmax(0,1fr)_auto] gap-4 py-3" : presentation === "video" ? "grid-cols-[5rem_minmax(0,1fr)_auto] gap-4 py-3 sm:grid-cols-[10rem_minmax(0,1fr)_auto]" : presentation === "icon" ? "grid-cols-[1rem_minmax(0,1fr)] gap-3 py-2" : compact ? "grid-cols-[2rem_minmax(0,1fr)] gap-2 py-1" : "grid-cols-[2.75rem_minmax(0,1fr)] gap-3 py-2"}`;
39
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
40
+ loading ? /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "artwork" }) : presentation === "icon" ? /* @__PURE__ */ jsx("span", {
41
+ "aria-hidden": "true",
42
+ className: "text-base-600 flex size-4 [&_svg]:size-4",
43
+ children: props.artwork
44
+ }) : props.artwork,
45
+ /* @__PURE__ */ jsxs(Stack, {
46
+ space: "none",
47
+ className: "min-w-0",
48
+ children: [
49
+ /* @__PURE__ */ jsx(Text, {
50
+ as: "span",
51
+ variant: "label",
52
+ truncate: true,
53
+ loading,
54
+ children: !loading && (props.href && !listbox ? /* @__PURE__ */ jsx(LinkOverlay, {
55
+ href: props.href,
56
+ onNavigate: props.onSelect,
57
+ "aria-label": resultLabel(props),
58
+ "aria-current": props.current ? "page" : void 0,
59
+ children: props.title
60
+ }) : props.title)
61
+ }),
62
+ /* @__PURE__ */ jsx(Text, {
63
+ as: "span",
64
+ variant: "caption",
65
+ tone: "muted",
66
+ truncate: true,
67
+ loading,
68
+ children: !loading && (props.subtitle ?? props.kind)
69
+ }),
70
+ !loading && props.detail ? /* @__PURE__ */ jsx(Text, {
71
+ as: "span",
72
+ variant: "caption",
73
+ tone: "muted",
74
+ className: "line-clamp-2 wrap-break-word",
75
+ children: props.detail
76
+ }) : null
77
+ ]
78
+ }),
79
+ presentation === "poster" || presentation === "video" ? /* @__PURE__ */ jsx("span", {
80
+ "aria-hidden": "true",
81
+ className: "text-base-500 flex [&>svg]:size-4",
82
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
83
+ }) : null
84
+ ] });
85
+ if (loading) return /* @__PURE__ */ jsx("div", {
86
+ className: classes,
87
+ children: content
88
+ });
89
+ const { artwork: _artwork, href, kind: _kind, onSelect, selected = false, presentation: _presentation, current = false, subtitle: _subtitle, detail: _detail, title: _title, ...buttonProps } = props;
90
+ const row = href && !listbox ? /* @__PURE__ */ jsx(LinkBox, {
91
+ className: `${classes} hover:bg-base-100 focus-within:bg-base-100 has-[[aria-current=page]]:bg-base-100 has-[[aria-current=page]]:ring-base-300 has-[[aria-current=page]]:ring-1`,
92
+ children: content
93
+ }) : /* @__PURE__ */ jsx("button", {
94
+ ...tabbable,
95
+ ...buttonProps,
96
+ type: "button",
97
+ role: listbox ? "option" : void 0,
98
+ "aria-label": resultLabel(props),
99
+ "aria-selected": listbox ? selected : void 0,
100
+ "aria-current": current ? "page" : void 0,
101
+ className: `${classes} hover:bg-base-100 aria-selected:bg-primary/10 aria-selected:ring-primary/30 focus-visible:outline-primary focus-visible:outline-2 disabled:pointer-events-none disabled:opacity-60 aria-selected:ring-1 aria-selected:ring-inset`,
102
+ onClick: onSelect,
103
+ children: content
104
+ });
105
+ return listbox ? row : /* @__PURE__ */ jsx("div", {
106
+ role: "listitem",
107
+ children: row
108
+ });
109
+ }
110
+ /** The row's accessible name: what it shows, then its kind, so two rows with one title still differ. */
111
+ function resultLabel({ title, subtitle, kind }) {
112
+ return [
113
+ title,
114
+ subtitle,
115
+ kind
116
+ ].filter(Boolean).join(", ");
117
+ }
118
+ function ResultEmpty({ children }) {
119
+ return /* @__PURE__ */ jsx(Text, {
120
+ as: "span",
121
+ tone: "muted",
122
+ className: "px-3 py-4 text-center",
123
+ children
124
+ });
125
+ }
126
+ export { ResultEmpty, ResultList, ResultRow };
127
+
128
+ //# sourceMappingURL=ResultList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultList.js","names":[],"sources":["../../src/collections/ResultList.tsx"],"sourcesContent":["import { ChevronRightIcon } from 'lucide-react';\nimport { type ComponentPropsWithoutRef, createContext, type ReactNode, useContext } 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\nconst ResultListContext = createContext({ compact: false, listbox: true });\n\ninterface ResultListProps extends Omit<ComponentPropsWithoutRef<'div'>, 'className' | 'style'> {\n label: string;\n loading?: boolean;\n loadingLabel?: string;\n density?: 'compact' | 'comfortable';\n}\n\nexport function ResultList({\n children,\n label,\n loading = false,\n loadingLabel = label,\n density = 'comfortable',\n role = 'listbox',\n ...props\n}: ResultListProps) {\n return (\n <ResultListContext.Provider value={{ compact: density === 'compact', listbox: role === 'listbox' }}>\n <SkeletonLoader loading={loading} label={loadingLabel}>\n <div\n {...props}\n role={role}\n aria-label={label}\n aria-busy={loading || props['aria-busy']}\n className=\"flex flex-col gap-1\"\n >\n {loading ? Array.from({ length: 8 }, (_, index) => <ResultRow key={index} loading />) : children}\n </div>\n </SkeletonLoader>\n </ResultListContext.Provider>\n );\n}\n\nexport interface ResultRowProps extends Pick<\n ComponentPropsWithoutRef<'button'>,\n 'disabled' | 'id' | 'onPointerMove' | 'tabIndex'\n> {\n artwork: ReactNode;\n kind: string;\n onSelect: () => void;\n href?: string;\n selected?: boolean;\n /** `icon` sets a small glyph in a narrow column; `default` shows artwork. */\n presentation?: 'default' | 'icon' | 'poster' | 'video';\n current?: boolean;\n subtitle?: string;\n detail?: string;\n title: string;\n}\n\nexport function ResultRow(props: ResultRowProps | { loading: true }) {\n const { compact, listbox } = useContext(ResultListContext);\n const loading = 'loading' in props;\n const presentation = loading ? 'default' : props.presentation;\n const classes = `grid w-full items-center rounded-md px-2 text-left ${presentation === 'poster' ? 'grid-cols-[4rem_minmax(0,1fr)_auto] gap-4 py-3' : presentation === 'video' ? 'grid-cols-[5rem_minmax(0,1fr)_auto] gap-4 py-3 sm:grid-cols-[10rem_minmax(0,1fr)_auto]' : presentation === 'icon' ? 'grid-cols-[1rem_minmax(0,1fr)] gap-3 py-2' : compact ? 'grid-cols-[2rem_minmax(0,1fr)] gap-2 py-1' : 'grid-cols-[2.75rem_minmax(0,1fr)] gap-3 py-2'}`;\n const content = (\n <>\n {loading ? (\n <SkeletonLoader.Shape presentation=\"artwork\" />\n ) : presentation === 'icon' ? (\n <span aria-hidden=\"true\" className=\"text-base-600 flex size-4 [&_svg]:size-4\">\n {props.artwork}\n </span>\n ) : (\n props.artwork\n )}\n <Stack space=\"none\" className=\"min-w-0\">\n <Text as=\"span\" variant=\"label\" truncate loading={loading}>\n {!loading &&\n (props.href && !listbox ? (\n <LinkOverlay\n href={props.href}\n onNavigate={props.onSelect}\n aria-label={resultLabel(props)}\n aria-current={props.current ? 'page' : undefined}\n >\n {props.title}\n </LinkOverlay>\n ) : (\n props.title\n ))}\n </Text>\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" truncate loading={loading}>\n {!loading && (props.subtitle ?? props.kind)}\n </Text>\n {!loading && props.detail ? (\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" className=\"line-clamp-2 wrap-break-word\">\n {props.detail}\n </Text>\n ) : null}\n </Stack>\n {presentation === 'poster' || presentation === 'video' ? (\n <span aria-hidden=\"true\" className=\"text-base-500 flex [&>svg]:size-4\">\n <ChevronRightIcon />\n </span>\n ) : null}\n </>\n );\n\n if (loading) return <div className={classes}>{content}</div>;\n\n const {\n artwork: _artwork,\n href,\n kind: _kind,\n onSelect,\n selected = false,\n presentation: _presentation,\n current = false,\n subtitle: _subtitle,\n detail: _detail,\n title: _title,\n ...buttonProps\n } = props;\n\n const row =\n href && !listbox ? (\n <LinkBox\n className={`${classes} hover:bg-base-100 focus-within:bg-base-100 has-[[aria-current=page]]:bg-base-100 has-[[aria-current=page]]:ring-base-300 has-[[aria-current=page]]:ring-1`}\n >\n {content}\n </LinkBox>\n ) : (\n <button\n {...tabbable}\n {...buttonProps}\n type=\"button\"\n role={listbox ? 'option' : undefined}\n aria-label={resultLabel(props)}\n aria-selected={listbox ? selected : undefined}\n aria-current={current ? 'page' : undefined}\n className={`${classes} hover:bg-base-100 aria-selected:bg-primary/10 aria-selected:ring-primary/30 focus-visible:outline-primary focus-visible:outline-2 disabled:pointer-events-none disabled:opacity-60 aria-selected:ring-1 aria-selected:ring-inset`}\n onClick={onSelect}\n >\n {content}\n </button>\n );\n\n return listbox ? row : <div role=\"listitem\">{row}</div>;\n}\n\n/** The row's accessible name: what it shows, then its kind, so two rows with one title still differ. */\nfunction resultLabel({ title, subtitle, kind }: ResultRowProps): string {\n return [title, subtitle, kind].filter(Boolean).join(', ');\n}\n\nexport function ResultEmpty({ children }: { children: ReactNode }) {\n return (\n <Text as=\"span\" tone=\"muted\" className=\"px-3 py-4 text-center\">\n {children}\n </Text>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ReactNode, Ref } from "react";
2
+ /** One row of wide cards, such as video stills, that scrolls sideways instead of wrapping. */
3
+ export declare function ScrollRow({ ref, label, loading, loadingLabel, children }: {
4
+ ref: Ref<HTMLUListElement>;
5
+ label: string;
6
+ loading?: boolean;
7
+ loadingLabel?: string;
8
+ children?: ReactNode;
9
+ }): import("react").JSX.Element;
10
+ /** `value` identifies the item, so its row can scroll to it. */
11
+ export declare function ScrollRowItem({ value, children }: {
12
+ value?: string;
13
+ children: ReactNode;
14
+ }): import("react").JSX.Element;
15
+ /** Each arrow is disabled at its end of the row, so both are while the row fits. */
16
+ export declare function ScrollRowArrows({ onScroll, canScrollBack, canScrollForward, backLabel, forwardLabel }: {
17
+ onScroll: (direction: 1 | -1) => void;
18
+ canScrollBack: boolean;
19
+ canScrollForward: boolean;
20
+ backLabel: string;
21
+ forwardLabel: string;
22
+ }): import("react").JSX.Element;
23
+ //# sourceMappingURL=ScrollRow.d.ts.map
@@ -0,0 +1,59 @@
1
+ import { IconButton } from "../actions/IconButton.js";
2
+ import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
3
+ import { Inline } from "../layout/Flow.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { ChevronRightIcon } from "lucide-react";
6
+ // src/collections/ScrollRow.tsx
7
+ const row = "-mx-1 flex snap-x scroll-px-1 gap-4 overflow-x-auto px-1 pt-1 pb-3";
8
+ /** One row of wide cards, such as video stills, that scrolls sideways instead of wrapping. */
9
+ function ScrollRow({ ref, label, loading = false, loadingLabel = label, children }) {
10
+ if (loading) return /* @__PURE__ */ jsx(SkeletonLoader, {
11
+ label: loadingLabel,
12
+ children: /* @__PURE__ */ jsx("div", {
13
+ className: row,
14
+ children: Array.from({ length: 4 }, (_, index) => /* @__PURE__ */ jsxs("div", {
15
+ className: "flex w-64 shrink-0 flex-col gap-2",
16
+ children: [/* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "video" }), /* @__PURE__ */ jsx(SkeletonLoader.Shape, { width: "wide" })]
17
+ }, index))
18
+ })
19
+ });
20
+ return /* @__PURE__ */ jsx("ul", {
21
+ ref,
22
+ "aria-label": label,
23
+ className: row,
24
+ children
25
+ });
26
+ }
27
+ /** `value` identifies the item, so its row can scroll to it. */
28
+ function ScrollRowItem({ value, children }) {
29
+ return /* @__PURE__ */ jsx("li", {
30
+ "data-value": value,
31
+ className: "w-64 shrink-0 snap-start",
32
+ children
33
+ });
34
+ }
35
+ /** Each arrow is disabled at its end of the row, so both are while the row fits. */
36
+ function ScrollRowArrows({ onScroll, canScrollBack, canScrollForward, backLabel, forwardLabel }) {
37
+ return /* @__PURE__ */ jsxs(Inline, {
38
+ space: "tight",
39
+ children: [/* @__PURE__ */ jsx(IconButton, {
40
+ "aria-label": backLabel,
41
+ title: backLabel,
42
+ disabled: !canScrollBack,
43
+ icon: /* @__PURE__ */ jsx("span", {
44
+ className: "flex rotate-180",
45
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
46
+ }),
47
+ onClick: () => onScroll(-1)
48
+ }), /* @__PURE__ */ jsx(IconButton, {
49
+ "aria-label": forwardLabel,
50
+ title: forwardLabel,
51
+ disabled: !canScrollForward,
52
+ icon: /* @__PURE__ */ jsx(ChevronRightIcon, {}),
53
+ onClick: () => onScroll(1)
54
+ })]
55
+ });
56
+ }
57
+ export { ScrollRow, ScrollRowArrows, ScrollRowItem };
58
+
59
+ //# sourceMappingURL=ScrollRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollRow.js","names":[],"sources":["../../src/collections/ScrollRow.tsx"],"sourcesContent":["import { ChevronRightIcon } from 'lucide-react';\nimport type { ReactNode, Ref } from 'react';\n\nimport { IconButton } from '../actions/IconButton';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Inline } from '../layout/Flow';\n\nconst row = '-mx-1 flex snap-x scroll-px-1 gap-4 overflow-x-auto px-1 pt-1 pb-3';\n\n/** One row of wide cards, such as video stills, that scrolls sideways instead of wrapping. */\nexport function ScrollRow({\n ref,\n label,\n loading = false,\n loadingLabel = label,\n children,\n}: {\n ref: Ref<HTMLUListElement>;\n label: string;\n loading?: boolean;\n loadingLabel?: string;\n children?: ReactNode;\n}) {\n if (loading)\n return (\n <SkeletonLoader label={loadingLabel}>\n <div className={row}>\n {Array.from({ length: 4 }, (_, index) => (\n <div key={index} className=\"flex w-64 shrink-0 flex-col gap-2\">\n <SkeletonLoader.Shape presentation=\"video\" />\n <SkeletonLoader.Shape width=\"wide\" />\n </div>\n ))}\n </div>\n </SkeletonLoader>\n );\n\n return (\n <ul ref={ref} aria-label={label} className={row}>\n {children}\n </ul>\n );\n}\n\n/** `value` identifies the item, so its row can scroll to it. */\nexport function ScrollRowItem({ value, children }: { value?: string; children: ReactNode }) {\n return (\n <li data-value={value} className=\"w-64 shrink-0 snap-start\">\n {children}\n </li>\n );\n}\n\n/** Each arrow is disabled at its end of the row, so both are while the row fits. */\nexport function ScrollRowArrows({\n onScroll,\n canScrollBack,\n canScrollForward,\n backLabel,\n forwardLabel,\n}: {\n onScroll: (direction: 1 | -1) => void;\n canScrollBack: boolean;\n canScrollForward: boolean;\n backLabel: string;\n forwardLabel: string;\n}) {\n return (\n <Inline space=\"tight\">\n <IconButton\n aria-label={backLabel}\n title={backLabel}\n disabled={!canScrollBack}\n icon={\n <span className=\"flex rotate-180\">\n <ChevronRightIcon />\n </span>\n }\n onClick={() => onScroll(-1)}\n />\n <IconButton\n aria-label={forwardLabel}\n title={forwardLabel}\n disabled={!canScrollForward}\n icon={<ChevronRightIcon />}\n onClick={() => onScroll(1)}\n />\n </Inline>\n );\n}\n"],"mappings":";;;;;;AAOA,MAAM,MAAM;;AAGZ,SAAgB,UAAU,EACtB,KACA,OACA,UAAU,OACV,eAAe,OACf,YAOD;CACC,IAAI,SACA,OACI,oBAAC,gBAAD;EAAgB,OAAO;EACnB,UAAA,oBAAC,OAAD;GAAK,WAAW;GACX,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,UAC3B,qBAAC,OAAD;IAAiB,WAAU;IAA3B,UAAA,CACI,oBAAC,eAAe,OAAhB,EAAsB,cAAa,QAAS,CAAA,GAC5C,oBAAC,eAAe,OAAhB,EAAsB,OAAM,OAAQ,CAAA,CACnC;GAHK,GAAA,KAGL,CACR;EACA,CAAA;CACO,CAAA;CAGxB,OACI,oBAAC,MAAD;EAAS;EAAK,cAAY;EAAO,WAAW;EACvC;CACD,CAAA;AAEZ;;AAGA,SAAgB,cAAc,EAAE,OAAO,YAAqD;CACxF,OACI,oBAAC,MAAD;EAAI,cAAY;EAAO,WAAU;EAC5B;CACD,CAAA;AAEZ;;AAGA,SAAgB,gBAAgB,EAC5B,UACA,eACA,kBACA,WACA,gBAOD;CACC,OACI,qBAAC,QAAD;EAAQ,OAAM;EAAd,UAAA,CACI,oBAAC,YAAD;GACI,cAAY;GACZ,OAAO;GACP,UAAU,CAAC;GACX,MACI,oBAAC,QAAD;IAAM,WAAU;IACZ,UAAA,oBAAC,kBAAD,CAAmB,CAAA;GACjB,CAAA;GAEV,eAAe,SAAS,EAAE;EAC7B,CAAA,GACD,oBAAC,YAAD;GACI,cAAY;GACZ,OAAO;GACP,UAAU,CAAC;GACX,MAAM,oBAAC,kBAAD,CAAmB,CAAA;GACzB,eAAe,SAAS,CAAC;EAC5B,CAAA,CACG;;AAEhB"}
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from "react";
2
+ interface VirtualGridProps {
3
+ count: number;
4
+ label: string;
5
+ onRangeChange: (startIndex: number, endIndex: number) => void;
6
+ renderItem: (index: number) => ReactNode;
7
+ textRows?: 1 | 2 | 3;
8
+ aspect?: 'square' | 'poster';
9
+ itemKey: (index: number) => string;
10
+ loading?: boolean;
11
+ }
12
+ export declare function VirtualGrid({ count, label, onRangeChange, renderItem, itemKey, loading, textRows, aspect }: VirtualGridProps): import("react").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=VirtualGrid.d.ts.map
@@ -0,0 +1,71 @@
1
+ import { useCollectionViewport } from "./CollectionViewport.js";
2
+ import { useCollectionMotion } from "./useCollectionMotion.js";
3
+ import { useEffect, useRef } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { useWindowVirtualizer } from "@tanstack/react-virtual";
6
+ // src/collections/VirtualGrid.tsx
7
+ function VirtualGrid({ count, label, onRangeChange, renderItem, itemKey, loading, textRows = 2, aspect = "square" }) {
8
+ const { scrollMargin, setCollectionElement, width } = useCollectionViewport();
9
+ const root = useRef(null);
10
+ useCollectionMotion(root);
11
+ const gap = 16;
12
+ const maxItemWidth = 170;
13
+ const layoutWidth = width || 356;
14
+ const columns = Math.max(2, Math.round((layoutWidth + gap) / 186));
15
+ const itemWidth = Math.min(maxItemWidth, Math.max(0, (layoutWidth - gap * (columns - 1)) / columns));
16
+ const rowHeight = itemWidth * (aspect === "poster" ? 1.5 : 1) + 64 + (textRows - 2) * 16;
17
+ const rowCount = Math.ceil(count / columns);
18
+ const virtualizer = useWindowVirtualizer({
19
+ count: rowCount,
20
+ estimateSize: () => rowHeight,
21
+ overscan: 2,
22
+ scrollMargin
23
+ });
24
+ const rows = virtualizer.getVirtualItems();
25
+ const startIndex = (rows[0]?.index ?? 0) * columns;
26
+ const endIndex = Math.min(count - 1, ((rows.at(-1)?.index ?? 0) + 1) * columns - 1);
27
+ useEffect(() => {
28
+ virtualizer.measure();
29
+ }, [
30
+ columns,
31
+ rowHeight,
32
+ virtualizer
33
+ ]);
34
+ useEffect(() => {
35
+ if (count > 0) onRangeChange(startIndex, endIndex);
36
+ }, [
37
+ count,
38
+ endIndex,
39
+ onRangeChange,
40
+ startIndex
41
+ ]);
42
+ return /* @__PURE__ */ jsx("div", {
43
+ ref: setCollectionElement,
44
+ role: "region",
45
+ "aria-label": label,
46
+ children: /* @__PURE__ */ jsx("div", {
47
+ ref: root,
48
+ className: "relative w-full",
49
+ "aria-busy": loading,
50
+ style: { height: virtualizer.getTotalSize() },
51
+ children: rows.flatMap((row) => Array.from({ length: columns }, (_, column) => {
52
+ const index = row.index * columns + column;
53
+ const key = itemKey(index);
54
+ return index < count ? /* @__PURE__ */ jsx("div", {
55
+ "data-collection-key": key,
56
+ "data-index": index,
57
+ className: "absolute",
58
+ style: {
59
+ left: column * (itemWidth + (layoutWidth - columns * itemWidth) / (columns - 1)),
60
+ top: row.start - scrollMargin,
61
+ width: itemWidth
62
+ },
63
+ children: renderItem(index)
64
+ }, key) : null;
65
+ }))
66
+ })
67
+ });
68
+ }
69
+ export { VirtualGrid };
70
+
71
+ //# sourceMappingURL=VirtualGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualGrid.js","names":[],"sources":["../../src/collections/VirtualGrid.tsx"],"sourcesContent":["import { useWindowVirtualizer } from '@tanstack/react-virtual';\nimport { type ReactNode, useEffect, useRef } from 'react';\n\nimport { useCollectionViewport } from './CollectionViewport';\nimport { useCollectionMotion } from './useCollectionMotion';\n\ninterface VirtualGridProps {\n count: number;\n label: string;\n onRangeChange: (startIndex: number, endIndex: number) => void;\n renderItem: (index: number) => ReactNode;\n textRows?: 1 | 2 | 3;\n aspect?: 'square' | 'poster';\n itemKey: (index: number) => string;\n loading?: boolean;\n}\n\nexport function VirtualGrid({\n count,\n label,\n onRangeChange,\n renderItem,\n itemKey,\n loading,\n textRows = 2,\n aspect = 'square',\n}: VirtualGridProps) {\n const { scrollMargin, setCollectionElement, width } = useCollectionViewport();\n const root = useRef<HTMLDivElement>(null);\n\n useCollectionMotion(root);\n\n const gap = 16;\n const maxItemWidth = 170;\n // Reserve the tallest grid until measured so history restoration is not clipped.\n const layoutWidth = width || maxItemWidth * 2 + gap;\n const columns = Math.max(2, Math.round((layoutWidth + gap) / (maxItemWidth + gap)));\n const itemWidth = Math.min(maxItemWidth, Math.max(0, (layoutWidth - gap * (columns - 1)) / columns));\n const rowHeight = itemWidth * (aspect === 'poster' ? 1.5 : 1) + 64 + (textRows - 2) * 16;\n const rowCount = Math.ceil(count / columns);\n const virtualizer = useWindowVirtualizer({\n count: rowCount,\n estimateSize: () => rowHeight,\n overscan: 2,\n scrollMargin,\n });\n const rows = virtualizer.getVirtualItems();\n const startIndex = (rows[0]?.index ?? 0) * columns;\n const endIndex = Math.min(count - 1, ((rows.at(-1)?.index ?? 0) + 1) * columns - 1);\n\n useEffect(() => {\n virtualizer.measure();\n }, [columns, rowHeight, virtualizer]);\n\n useEffect(() => {\n if (count > 0) onRangeChange(startIndex, endIndex);\n }, [count, endIndex, onRangeChange, startIndex]);\n\n return (\n <div ref={setCollectionElement} role=\"region\" aria-label={label}>\n <div\n ref={root}\n className=\"relative w-full\"\n aria-busy={loading}\n style={{ height: virtualizer.getTotalSize() }}\n >\n {rows.flatMap((row) =>\n Array.from({ length: columns }, (_, column) => {\n const index = row.index * columns + column;\n const key = itemKey(index);\n\n return index < count ? (\n <div\n key={key}\n data-collection-key={key}\n data-index={index}\n className=\"absolute\"\n style={{\n left: column * (itemWidth + (layoutWidth - columns * itemWidth) / (columns - 1)),\n top: row.start - scrollMargin,\n width: itemWidth,\n }}\n >\n {renderItem(index)}\n </div>\n ) : null;\n }),\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,YAAY,EACxB,OACA,OACA,eACA,YACA,SACA,SACA,WAAW,GACX,SAAS,YACQ;CACjB,MAAM,EAAE,cAAc,sBAAsB,UAAU,sBAAsB;CAC5E,MAAM,OAAO,OAAuB,IAAI;CAExC,oBAAoB,IAAI;CAExB,MAAM,MAAM;CACZ,MAAM,eAAe;CAErB,MAAM,cAAc,SAAS;CAC7B,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,OAAO,cAAc,OAAQ,GAAmB,CAAC;CAClF,MAAM,YAAY,KAAK,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,OAAO,UAAU,MAAM,OAAO,CAAC;CACnG,MAAM,YAAY,aAAa,WAAW,WAAW,MAAM,KAAK,MAAM,WAAW,KAAK;CACtF,MAAM,WAAW,KAAK,KAAK,QAAQ,OAAO;CAC1C,MAAM,cAAc,qBAAqB;EACrC,OAAO;EACP,oBAAoB;EACpB,UAAU;EACV;CACJ,CAAC;CACD,MAAM,OAAO,YAAY,gBAAgB;CACzC,MAAM,cAAc,KAAK,EAAE,EAAE,SAAS,KAAK;CAC3C,MAAM,WAAW,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG,EAAE,CAAC,EAAE,SAAS,KAAK,KAAK,UAAU,CAAC;CAElF,gBAAgB;EACZ,YAAY,QAAQ;CACxB,GAAG;EAAC;EAAS;EAAW;CAAW,CAAC;CAEpC,gBAAgB;EACZ,IAAI,QAAQ,GAAG,cAAc,YAAY,QAAQ;CACrD,GAAG;EAAC;EAAO;EAAU;EAAe;CAAU,CAAC;CAE/C,OACI,oBAAC,OAAD;EAAK,KAAK;EAAsB,MAAK;EAAS,cAAY;EACtD,UAAA,oBAAC,OAAD;GACI,KAAK;GACL,WAAU;GACV,aAAW;GACX,OAAO,EAAE,QAAQ,YAAY,aAAa,EAAE;GAE3C,UAAA,KAAK,SAAS,QACX,MAAM,KAAK,EAAE,QAAQ,QAAQ,IAAI,GAAG,WAAW;IAC3C,MAAM,QAAQ,IAAI,QAAQ,UAAU;IACpC,MAAM,MAAM,QAAQ,KAAK;IAEzB,OAAO,QAAQ,QACX,oBAAC,OAAD;KAEI,uBAAqB;KACrB,cAAY;KACZ,WAAU;KACV,OAAO;MACH,MAAM,UAAU,aAAa,cAAc,UAAU,cAAc,UAAU;MAC7E,KAAK,IAAI,QAAQ;MACjB,OAAO;KACX;KAEC,UAAA,WAAW,KAAK;IAChB,GAXI,GAWJ,IACL;GACR,CAAC,CACL;EACC,CAAA;CACJ,CAAA;AAEb"}
@@ -0,0 +1,34 @@
1
+ import { columnBreakpoints, columnWidths } from "./CollectionTokens.js";
2
+ import { ReactNode } from "react";
3
+ export interface ListColumn<TItem> {
4
+ id: string;
5
+ label: string;
6
+ hideLabel?: boolean;
7
+ render: (item: TItem, visibleColumns: readonly string[], index: number) => ReactNode;
8
+ size: keyof typeof columnWidths;
9
+ priority?: keyof typeof columnBreakpoints;
10
+ placeholder?: (visibleColumns: readonly string[]) => ReactNode;
11
+ align?: 'right';
12
+ }
13
+ export interface VirtualListProps<TItem> {
14
+ columns: readonly ListColumn<TItem>[];
15
+ count: number;
16
+ itemAt: (index: number) => TItem | undefined;
17
+ itemLabel: (item: TItem) => string;
18
+ label: string;
19
+ onRangeChange: (startIndex: number, endIndex: number) => void;
20
+ onSelect?: (item: TItem) => void;
21
+ itemHref?: (item: TItem) => string | undefined;
22
+ onNavigate?: (href: string) => void;
23
+ placeholderAt?: (index: number) => ReactNode;
24
+ itemKey: (index: number) => string;
25
+ loading?: boolean;
26
+ section?: {
27
+ isStart: (item: TItem, index: number, previous: TItem | undefined) => boolean;
28
+ render: (item: TItem) => ReactNode;
29
+ };
30
+ sort?: string;
31
+ direction?: 'asc' | 'desc';
32
+ }
33
+ export declare function VirtualList<TItem>({ columns, count, itemAt, itemLabel, label, onRangeChange, onSelect, itemHref, onNavigate, placeholderAt, itemKey, loading, section, sort, direction }: VirtualListProps<TItem>): import("react").JSX.Element;
34
+ //# sourceMappingURL=VirtualList.d.ts.map
@@ -0,0 +1,128 @@
1
+ import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
2
+ import { tabbable } from "../foundations/KeyboardFocus.js";
3
+ import { LinkOverlay } from "../typography/Link.js";
4
+ import { columnBreakpoints, columnWidths } from "./CollectionTokens.js";
5
+ import { useCollectionViewport } from "./CollectionViewport.js";
6
+ import { DataRow } from "./DataRow.js";
7
+ import { useCollectionMotion } from "./useCollectionMotion.js";
8
+ import { useCallback, useEffect, useRef } from "react";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
+ import { ChevronDownIcon } from "lucide-react";
11
+ import { useWindowVirtualizer } from "@tanstack/react-virtual";
12
+ // src/collections/VirtualList.tsx
13
+ function VirtualList({ columns, count, itemAt, itemLabel, label, onRangeChange, onSelect, itemHref, onNavigate, placeholderAt, itemKey, loading, section, sort, direction = "asc" }) {
14
+ const { scrollMargin, setCollectionElement, width } = useCollectionViewport();
15
+ const root = useRef(null);
16
+ const attachRoot = useCallback((element) => {
17
+ root.current = element;
18
+ setCollectionElement(element);
19
+ }, [setCollectionElement]);
20
+ useCollectionMotion(root);
21
+ const visibleColumns = columns.filter((column) => column.id === sort || width >= columnBreakpoints[column.priority ?? "primary"]);
22
+ const visibleColumnIds = visibleColumns.map((column) => column.id);
23
+ const virtualizer = useWindowVirtualizer({
24
+ count,
25
+ estimateSize: () => 64,
26
+ overscan: 8,
27
+ scrollMargin
28
+ });
29
+ const virtualItems = virtualizer.getVirtualItems();
30
+ const startIndex = Math.max(0, virtualItems[0]?.index ?? 0);
31
+ const endIndex = Math.min(count - 1, virtualItems.at(-1)?.index ?? 0);
32
+ useEffect(() => {
33
+ if (endIndex >= startIndex) onRangeChange(startIndex, endIndex);
34
+ }, [
35
+ endIndex,
36
+ onRangeChange,
37
+ startIndex
38
+ ]);
39
+ return /* @__PURE__ */ jsxs("div", {
40
+ role: "table",
41
+ "aria-label": label,
42
+ "aria-busy": loading,
43
+ "aria-rowcount": count + 1,
44
+ "aria-colcount": visibleColumns.length,
45
+ className: "border-base-300 bg-base-100 @container min-w-0 rounded-b-xl border-x border-b",
46
+ style: { "--lar-list-columns": visibleColumns.map((column) => columnWidths[column.size]).join(" ") },
47
+ children: [/* @__PURE__ */ jsx("div", {
48
+ role: "rowgroup",
49
+ className: "bg-base-50 sticky top-(--lar-header-height,0px) z-20 -mx-px -mt-(--lar-page-gutter,0px) pt-(--lar-page-gutter,0px)",
50
+ children: /* @__PURE__ */ jsx("div", {
51
+ role: "row",
52
+ "aria-rowindex": 1,
53
+ className: "border-base-300 bg-base-100 box-content grid h-10 grid-cols-(--lar-list-columns) items-center gap-4 rounded-t-xl border px-3",
54
+ children: visibleColumns.map((column) => /* @__PURE__ */ jsxs("div", {
55
+ role: "columnheader",
56
+ "aria-sort": column.id === sort ? direction === "asc" ? "ascending" : "descending" : void 0,
57
+ className: `flex min-w-0 items-center gap-1 text-xs font-medium ${column.align === "right" ? "justify-end" : ""} ${column.id === sort ? "text-base-content" : "text-base-content/50"}`,
58
+ children: [/* @__PURE__ */ jsx("span", {
59
+ className: column.hideLabel ? "sr-only" : "truncate",
60
+ children: column.label
61
+ }), column.id === sort ? /* @__PURE__ */ jsx("span", {
62
+ className: `size-3 shrink-0 ${direction === "asc" ? "rotate-180" : ""}`,
63
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, {})
64
+ }) : null]
65
+ }, column.id))
66
+ })
67
+ }), /* @__PURE__ */ jsx("div", {
68
+ ref: attachRoot,
69
+ role: "rowgroup",
70
+ className: "relative w-full",
71
+ style: { height: virtualizer.getTotalSize() },
72
+ children: virtualItems.map((item) => {
73
+ const index = item.index;
74
+ const key = itemKey(index);
75
+ const value = itemAt(index);
76
+ const href = value ? itemHref?.(value) : void 0;
77
+ const placeholder = placeholderAt?.(index);
78
+ const sectionStart = value && section?.isStart(value, index, itemAt(index - 1));
79
+ return /* @__PURE__ */ jsxs("div", {
80
+ "data-collection-key": key,
81
+ role: "presentation",
82
+ ref: virtualizer.measureElement,
83
+ "data-index": item.index,
84
+ className: "absolute top-0 left-0 w-full",
85
+ style: { top: item.start - scrollMargin },
86
+ children: [sectionStart ? section?.render(value) : null, /* @__PURE__ */ jsx("div", {
87
+ className: "h-16",
88
+ children: /* @__PURE__ */ jsx(DataRow, {
89
+ rowIndex: item.index + 2,
90
+ interactive: Boolean(value && (href || onSelect)),
91
+ children: placeholder ? /* @__PURE__ */ jsx("div", {
92
+ role: "cell",
93
+ "aria-colspan": visibleColumns.length,
94
+ className: "col-span-full min-w-0",
95
+ children: placeholder
96
+ }) : visibleColumns.map((column, columnIndex) => {
97
+ const content = value ? column.render(value, visibleColumnIds, index) : void 0;
98
+ return /* @__PURE__ */ jsx("div", {
99
+ role: "cell",
100
+ title: typeof content === "string" ? content : void 0,
101
+ className: `min-w-0 truncate text-sm ${column.align === "right" ? "text-right tabular-nums" : ""} ${column.id === sort || columnIndex === 0 ? "text-base-content" : "text-base-content/55"}`,
102
+ children: !value ? column.placeholder?.(visibleColumnIds) ?? /* @__PURE__ */ jsx(SkeletonLoader.Shape, { width: "wide" }) : columnIndex === 0 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [href ? /* @__PURE__ */ jsx(LinkOverlay, {
103
+ href,
104
+ onNavigate,
105
+ "aria-label": itemLabel(value)
106
+ }) : onSelect ? /* @__PURE__ */ jsx("button", {
107
+ ...tabbable,
108
+ type: "button",
109
+ "data-slot": "action-overlay",
110
+ "aria-label": itemLabel(value),
111
+ onClick: () => onSelect(value),
112
+ className: "focus-visible:outline-primary absolute inset-0 z-1 block w-full cursor-pointer rounded-md focus-visible:outline-2 focus-visible:-outline-offset-2"
113
+ }) : null, /* @__PURE__ */ jsx("div", {
114
+ className: "py-2",
115
+ children: content
116
+ })] }) : content
117
+ }, column.id);
118
+ })
119
+ })
120
+ })]
121
+ }, key);
122
+ })
123
+ })]
124
+ });
125
+ }
126
+ export { VirtualList };
127
+
128
+ //# sourceMappingURL=VirtualList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualList.js","names":[],"sources":["../../src/collections/VirtualList.tsx"],"sourcesContent":["import { useWindowVirtualizer } from '@tanstack/react-virtual';\nimport { ChevronDownIcon } from 'lucide-react';\nimport { type CSSProperties, type ReactNode, useCallback, useEffect, useRef } from 'react';\n\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { LinkOverlay } from '../typography/Link';\nimport { columnBreakpoints, columnWidths } from './CollectionTokens';\nimport { useCollectionViewport } from './CollectionViewport';\nimport { DataRow } from './DataRow';\nimport { useCollectionMotion } from './useCollectionMotion';\n\nexport interface ListColumn<TItem> {\n id: string;\n label: string;\n hideLabel?: boolean;\n render: (item: TItem, visibleColumns: readonly string[], index: number) => ReactNode;\n size: keyof typeof columnWidths;\n priority?: keyof typeof columnBreakpoints;\n placeholder?: (visibleColumns: readonly string[]) => ReactNode;\n align?: 'right';\n}\n\nexport interface VirtualListProps<TItem> {\n columns: readonly ListColumn<TItem>[];\n count: number;\n itemAt: (index: number) => TItem | undefined;\n itemLabel: (item: TItem) => string;\n label: string;\n onRangeChange: (startIndex: number, endIndex: number) => void;\n onSelect?: (item: TItem) => void;\n itemHref?: (item: TItem) => string | undefined;\n onNavigate?: (href: string) => void;\n placeholderAt?: (index: number) => ReactNode;\n itemKey: (index: number) => string;\n loading?: boolean;\n section?: {\n isStart: (item: TItem, index: number, previous: TItem | undefined) => boolean;\n render: (item: TItem) => ReactNode;\n };\n sort?: string;\n direction?: 'asc' | 'desc';\n}\n\nexport function VirtualList<TItem>({\n columns,\n count,\n itemAt,\n itemLabel,\n label,\n onRangeChange,\n onSelect,\n itemHref,\n onNavigate,\n placeholderAt,\n itemKey,\n loading,\n section,\n sort,\n direction = 'asc',\n}: VirtualListProps<TItem>) {\n const { scrollMargin, setCollectionElement, width } = useCollectionViewport();\n const root = useRef<HTMLDivElement>(null);\n const attachRoot = useCallback(\n (element: HTMLDivElement | null) => {\n root.current = element;\n setCollectionElement(element);\n },\n [setCollectionElement],\n );\n\n useCollectionMotion(root);\n\n const visibleColumns = columns.filter(\n (column) => column.id === sort || width >= columnBreakpoints[column.priority ?? 'primary'],\n );\n const visibleColumnIds = visibleColumns.map((column) => column.id);\n const virtualizer = useWindowVirtualizer({\n count,\n // Layout belongs to stable catalog slots. Domain keys still identify\n // mounted rows below; changing page data must not remeasure every slot.\n // Section headers are measured with their mounted row wrappers.\n estimateSize: () => 64,\n overscan: 8,\n scrollMargin,\n });\n const virtualItems = virtualizer.getVirtualItems();\n const startIndex = Math.max(0, virtualItems[0]?.index ?? 0);\n const endIndex = Math.min(count - 1, virtualItems.at(-1)?.index ?? 0);\n\n useEffect(() => {\n if (endIndex >= startIndex) onRangeChange(startIndex, endIndex);\n }, [endIndex, onRangeChange, startIndex]);\n\n return (\n <div\n role=\"table\"\n aria-label={label}\n aria-busy={loading}\n aria-rowcount={count + 1}\n aria-colcount={visibleColumns.length}\n className=\"border-base-300 bg-base-100 @container min-w-0 rounded-b-xl border-x border-b\"\n style={\n {\n '--lar-list-columns': visibleColumns.map((column) => columnWidths[column.size]).join(' '),\n } as CSSProperties\n }\n >\n <div\n role=\"rowgroup\"\n className=\"bg-base-50 sticky top-(--lar-header-height,0px) z-20 -mx-px -mt-(--lar-page-gutter,0px) pt-(--lar-page-gutter,0px)\"\n >\n <div\n role=\"row\"\n aria-rowindex={1}\n className=\"border-base-300 bg-base-100 box-content grid h-10 grid-cols-(--lar-list-columns) items-center gap-4 rounded-t-xl border px-3\"\n >\n {visibleColumns.map((column) => (\n <div\n key={column.id}\n role=\"columnheader\"\n aria-sort={\n column.id === sort ? (direction === 'asc' ? 'ascending' : 'descending') : undefined\n }\n className={`flex min-w-0 items-center gap-1 text-xs font-medium ${column.align === 'right' ? 'justify-end' : ''} ${column.id === sort ? 'text-base-content' : 'text-base-content/50'}`}\n >\n <span className={column.hideLabel ? 'sr-only' : 'truncate'}>{column.label}</span>\n {column.id === sort ? (\n <span className={`size-3 shrink-0 ${direction === 'asc' ? 'rotate-180' : ''}`}>\n <ChevronDownIcon />\n </span>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n <div\n ref={attachRoot}\n role=\"rowgroup\"\n className=\"relative w-full\"\n style={{ height: virtualizer.getTotalSize() }}\n >\n {virtualItems.map((item) => {\n const index = item.index;\n const key = itemKey(index);\n const value = itemAt(index);\n const href = value ? itemHref?.(value) : undefined;\n const placeholder = placeholderAt?.(index);\n const sectionStart = value && section?.isStart(value, index, itemAt(index - 1));\n\n return (\n <div\n key={key}\n data-collection-key={key}\n role=\"presentation\"\n ref={virtualizer.measureElement}\n data-index={item.index}\n className=\"absolute top-0 left-0 w-full\"\n style={{ top: item.start - scrollMargin }}\n >\n {sectionStart ? section?.render(value) : null}\n <div className=\"h-16\">\n <DataRow rowIndex={item.index + 2} interactive={Boolean(value && (href || onSelect))}>\n {placeholder ? (\n <div\n role=\"cell\"\n aria-colspan={visibleColumns.length}\n className=\"col-span-full min-w-0\"\n >\n {placeholder}\n </div>\n ) : (\n visibleColumns.map((column, columnIndex) => {\n const content = value\n ? column.render(value, visibleColumnIds, index)\n : undefined;\n\n return (\n <div\n key={column.id}\n role=\"cell\"\n title={typeof content === 'string' ? content : undefined}\n className={`min-w-0 truncate text-sm ${column.align === 'right' ? 'text-right tabular-nums' : ''} ${column.id === sort || columnIndex === 0 ? 'text-base-content' : 'text-base-content/55'}`}\n >\n {!value ? (\n (column.placeholder?.(visibleColumnIds) ?? (\n <SkeletonLoader.Shape width=\"wide\" />\n ))\n ) : columnIndex === 0 ? (\n <>\n {href ? (\n <LinkOverlay\n href={href}\n onNavigate={onNavigate}\n aria-label={itemLabel(value)}\n />\n ) : onSelect ? (\n <button\n {...tabbable}\n type=\"button\"\n data-slot=\"action-overlay\"\n aria-label={itemLabel(value)}\n onClick={() => onSelect(value)}\n className=\"focus-visible:outline-primary absolute inset-0 z-1 block w-full cursor-pointer rounded-md focus-visible:outline-2 focus-visible:-outline-offset-2\"\n />\n ) : null}\n <div className=\"py-2\">{content}</div>\n </>\n ) : (\n content\n )}\n </div>\n );\n })\n )}\n </DataRow>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}