@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,11 @@
1
+ import { ReactNode } from "react";
2
+ interface CallToActionProps {
3
+ title: ReactNode;
4
+ lead: ReactNode;
5
+ actions: ReactNode;
6
+ note?: ReactNode;
7
+ }
8
+ /** The closing panel of a page: the Lar mark drawn large and faint behind one last invitation. */
9
+ export declare function CallToAction({ title, lead, actions, note }: CallToActionProps): import("react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=CallToAction.d.ts.map
@@ -0,0 +1,54 @@
1
+ import { Heading, Text } from "../typography/Typography.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/showcase/CallToAction.tsx
4
+ const MARK_L = "M0 0H27.52V72.48H100V100H3a3 3 0 0 1-3-3z";
5
+ 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";
6
+ /** The closing panel of a page: the Lar mark drawn large and faint behind one last invitation. */
7
+ function CallToAction({ title, lead, actions, note }) {
8
+ return /* @__PURE__ */ jsxs("div", {
9
+ className: "border-base-300 bg-base-100 dark:bg-base-100/70 relative isolate overflow-hidden rounded-[1.75rem] border px-6 py-16 text-center sm:px-12 sm:py-20",
10
+ children: [/* @__PURE__ */ jsx("div", {
11
+ "aria-hidden": "true",
12
+ className: "absolute inset-0 -z-10 bg-[radial-gradient(60%_80%_at_50%_0%,var(--lar-glow),transparent_70%)]"
13
+ }), /* @__PURE__ */ jsxs("div", {
14
+ className: "mx-auto flex max-w-[640px] flex-col items-center gap-5",
15
+ children: [
16
+ /* @__PURE__ */ jsxs("svg", {
17
+ "aria-hidden": "true",
18
+ viewBox: "0 0 100 100",
19
+ className: "mb-1 size-9 text-(--color-brand-ink)",
20
+ children: [/* @__PURE__ */ jsx("path", {
21
+ d: MARK_L,
22
+ fill: "currentColor"
23
+ }), /* @__PURE__ */ jsx("path", {
24
+ d: MARK_S,
25
+ fill: "#355292"
26
+ })]
27
+ }),
28
+ /* @__PURE__ */ jsx(Heading, {
29
+ as: "h2",
30
+ variant: "headline",
31
+ children: title
32
+ }),
33
+ /* @__PURE__ */ jsx(Text, {
34
+ variant: "lead",
35
+ tone: "muted",
36
+ children: lead
37
+ }),
38
+ /* @__PURE__ */ jsx("div", {
39
+ className: "mt-3 flex w-full flex-col items-center justify-center gap-3 sm:w-auto sm:flex-row sm:flex-wrap max-sm:[&>a]:w-full max-sm:[&>a]:max-w-[320px]",
40
+ children: actions
41
+ }),
42
+ note ? /* @__PURE__ */ jsx(Text, {
43
+ variant: "caption",
44
+ tone: "muted",
45
+ className: "text-balance dark:text-[#96969f]",
46
+ children: note
47
+ }) : null
48
+ ]
49
+ })]
50
+ });
51
+ }
52
+ export { CallToAction };
53
+
54
+ //# sourceMappingURL=CallToAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallToAction.js","names":[],"sources":["../../src/showcase/CallToAction.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Heading, Text } from '../typography/Typography';\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\ninterface CallToActionProps {\n title: ReactNode;\n lead: ReactNode;\n actions: ReactNode;\n note?: ReactNode;\n}\n\n/** The closing panel of a page: the Lar mark drawn large and faint behind one last invitation. */\nexport function CallToAction({ title, lead, actions, note }: CallToActionProps) {\n return (\n <div className=\"border-base-300 bg-base-100 dark:bg-base-100/70 relative isolate overflow-hidden rounded-[1.75rem] border px-6 py-16 text-center sm:px-12 sm:py-20\">\n <div\n aria-hidden=\"true\"\n className=\"absolute inset-0 -z-10 bg-[radial-gradient(60%_80%_at_50%_0%,var(--lar-glow),transparent_70%)]\"\n />\n <div className=\"mx-auto flex max-w-[640px] flex-col items-center gap-5\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 100 100\" className=\"mb-1 size-9 text-(--color-brand-ink)\">\n <path d={MARK_L} fill=\"currentColor\" />\n <path d={MARK_S} fill=\"#355292\" />\n </svg>\n <Heading as=\"h2\" variant=\"headline\">\n {title}\n </Heading>\n <Text variant=\"lead\" tone=\"muted\">\n {lead}\n </Text>\n <div className=\"mt-3 flex w-full flex-col items-center justify-center gap-3 sm:w-auto sm:flex-row sm:flex-wrap max-sm:[&>a]:w-full max-sm:[&>a]:max-w-[320px]\">\n {actions}\n </div>\n {note ? (\n <Text variant=\"caption\" tone=\"muted\" className=\"text-balance dark:text-[#96969f]\">\n {note}\n </Text>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":";;;AAIA,MAAM,SAAS;AACf,MAAM,SACF;;AAUJ,SAAgB,aAAa,EAAE,OAAO,MAAM,SAAS,QAA2B;CAC5E,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,oBAAC,OAAD;GACI,eAAY;GACZ,WAAU;EACb,CAAA,GACD,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACI,qBAAC,OAAD;KAAK,eAAY;KAAO,SAAQ;KAAc,WAAU;KAAxD,UAAA,CACI,oBAAC,QAAD;MAAM,GAAG;MAAQ,MAAK;KAAgB,CAAA,GACtC,oBAAC,QAAD;MAAM,GAAG;MAAQ,MAAK;KAAW,CAAA,CAChC;;IACL,oBAAC,SAAD;KAAS,IAAG;KAAK,SAAQ;KACpB,UAAA;IACI,CAAA;IACT,oBAAC,MAAD;KAAM,SAAQ;KAAO,MAAK;KACrB,UAAA;IACC,CAAA;IACN,oBAAC,OAAD;KAAK,WAAU;KACV,UAAA;IACA,CAAA;IACJ,OACG,oBAAC,MAAD;KAAM,SAAQ;KAAU,MAAK;KAAQ,WAAU;KAC1C,UAAA;IACC,CAAA,IACN;GACH;EACJ,CAAA,CAAA;;AAEb"}
@@ -0,0 +1,34 @@
1
+ import { ReactNode } from "react";
2
+ interface ProductCardProps {
3
+ /** A lar-brand app hue; omit for Factory's neutral graphite. */
4
+ hue?: number;
5
+ icon: ReactNode;
6
+ name: string;
7
+ status: ReactNode;
8
+ title: string;
9
+ description: string;
10
+ linkLabel: string;
11
+ href: string;
12
+ onNavigate: (href: string) => void;
13
+ media: ReactNode;
14
+ }
15
+ /** A product on the home page: its name and promise above a screenshot that runs off the card's edge. */
16
+ export declare function ProductCard({ hue, icon, name, status, title, description, linkLabel, href, onNavigate, media }: ProductCardProps): import("react").JSX.Element;
17
+ /** Two or three product cards side by side. */
18
+ export declare function ProductGrid({ children }: {
19
+ children: ReactNode;
20
+ }): import("react").JSX.Element;
21
+ interface FeatureTileProps {
22
+ icon: ReactNode;
23
+ title: string;
24
+ children: ReactNode;
25
+ hue?: number;
26
+ }
27
+ /** A short benefit: an icon in a tinted square, a title and a sentence or two. */
28
+ export declare function FeatureTile({ icon, title, children, hue }: FeatureTileProps): import("react").JSX.Element;
29
+ export declare function FeatureGrid({ children, columns }: {
30
+ children: ReactNode;
31
+ columns?: 2 | 3 | 4;
32
+ }): import("react").JSX.Element;
33
+ export {};
34
+ //# sourceMappingURL=Cards.d.ts.map
@@ -0,0 +1,122 @@
1
+ import { tabbable } from "../foundations/KeyboardFocus.js";
2
+ import { Heading, Text } from "../typography/Typography.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { ArrowRightIcon } from "lucide-react";
5
+ // src/showcase/Cards.tsx
6
+ /** A product on the home page: its name and promise above a screenshot that runs off the card's edge. */
7
+ function ProductCard({ hue, icon, name, status, title, description, linkLabel, href, onNavigate, media }) {
8
+ return /* @__PURE__ */ jsxs("article", {
9
+ className: "group/product border-base-300 bg-base-100 hover:border-base-400 dark:bg-base-100/80 relative isolate flex flex-col overflow-hidden rounded-[1.5rem] border shadow-[0_1px_0_rgb(255_255_255/4%)_inset] transition-[border-color,box-shadow] duration-300 hover:shadow-[0_30px_80px_-40px_rgb(0_0_0/45%)]",
10
+ style: {
11
+ "--lar-card-hue": hue ?? 264,
12
+ "--lar-card-chroma": hue === void 0 ? .01 : .12
13
+ },
14
+ children: [
15
+ /* @__PURE__ */ jsx("div", {
16
+ "aria-hidden": "true",
17
+ className: "absolute inset-0 -z-10 bg-[radial-gradient(80%_60%_at_100%_0%,oklch(0.6_var(--lar-card-chroma)_var(--lar-card-hue)/0.16),transparent_70%)] transition-opacity duration-500 group-hover/product:opacity-150 dark:bg-[radial-gradient(80%_60%_at_100%_0%,oklch(0.5_var(--lar-card-chroma)_var(--lar-card-hue)/0.3),transparent_70%)]"
18
+ }),
19
+ /* @__PURE__ */ jsxs("div", {
20
+ className: "flex flex-col gap-5 p-7 pb-8 sm:p-9 sm:pb-10",
21
+ children: [
22
+ /* @__PURE__ */ jsxs("div", {
23
+ className: "flex items-center gap-3",
24
+ children: [
25
+ icon,
26
+ /* @__PURE__ */ jsx("div", {
27
+ className: "flex min-w-0 flex-col",
28
+ children: /* @__PURE__ */ jsx(Text, {
29
+ as: "span",
30
+ variant: "label",
31
+ children: name
32
+ })
33
+ }),
34
+ /* @__PURE__ */ jsx("span", {
35
+ className: "ml-auto",
36
+ children: status
37
+ })
38
+ ]
39
+ }),
40
+ /* @__PURE__ */ jsx(Heading, {
41
+ as: "h3",
42
+ variant: "feature",
43
+ className: "max-w-[440px]",
44
+ children: title
45
+ }),
46
+ /* @__PURE__ */ jsx(Text, {
47
+ variant: "prose",
48
+ tone: "muted",
49
+ className: "max-w-[460px]",
50
+ children: description
51
+ }),
52
+ /* @__PURE__ */ jsxs("a", {
53
+ ...tabbable,
54
+ href,
55
+ onClick: (event) => {
56
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;
57
+ event.preventDefault();
58
+ onNavigate(href);
59
+ },
60
+ className: "text-base-content focus-visible:before:outline-primary inline-flex w-fit items-center gap-1.5 text-[15px] font-medium before:absolute before:inset-0 before:z-10 before:rounded-[inherit] focus-visible:outline-none focus-visible:before:outline-2 focus-visible:before:outline-offset-[-2px] [&_svg]:size-4",
61
+ children: [linkLabel, /* @__PURE__ */ jsx("span", {
62
+ className: "inline-flex transition-transform duration-200 group-hover/product:translate-x-1",
63
+ children: /* @__PURE__ */ jsx(ArrowRightIcon, {})
64
+ })]
65
+ })
66
+ ]
67
+ }),
68
+ /* @__PURE__ */ jsx("div", {
69
+ className: "relative h-[240px] overflow-hidden [mask-image:linear-gradient(to_bottom,#000_calc(100%-56px),transparent)] pl-7 sm:h-[320px] sm:pl-9",
70
+ children: /* @__PURE__ */ jsx("div", {
71
+ className: "transition-transform duration-700 ease-[cubic-bezier(0.16,1,0.3,1)] group-hover/product:-translate-y-2",
72
+ children: media
73
+ })
74
+ })
75
+ ]
76
+ });
77
+ }
78
+ /** Two or three product cards side by side. */
79
+ function ProductGrid({ children }) {
80
+ return /* @__PURE__ */ jsx("div", {
81
+ className: "grid gap-5 lg:grid-cols-2",
82
+ children
83
+ });
84
+ }
85
+ /** A short benefit: an icon in a tinted square, a title and a sentence or two. */
86
+ function FeatureTile({ icon, title, children, hue }) {
87
+ return /* @__PURE__ */ jsxs("div", {
88
+ className: "sm:border-base-300/80 sm:bg-base-100/60 sm:dark:bg-base-100/40 grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 p-4 sm:flex sm:flex-col sm:gap-3 sm:rounded-[1.125rem] sm:border sm:p-6",
89
+ children: [
90
+ /* @__PURE__ */ jsx("span", {
91
+ className: `row-span-2 inline-flex size-8 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 ${hue === void 0 ? "bg-primary/10 text-primary ring-primary/15 dark:bg-primary/20 dark:ring-primary/30 dark:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]" : "kind-badge ring-current/10"}`,
92
+ style: hue === void 0 ? void 0 : { "--lar-kind-hue": hue },
93
+ children: icon
94
+ }),
95
+ /* @__PURE__ */ jsx(Heading, {
96
+ as: "h3",
97
+ variant: "subsection",
98
+ className: "self-center sm:mt-1 sm:self-auto",
99
+ children: title
100
+ }),
101
+ /* @__PURE__ */ jsx(Text, {
102
+ variant: "prose",
103
+ tone: "muted",
104
+ className: "col-start-2",
105
+ children
106
+ })
107
+ ]
108
+ });
109
+ }
110
+ function FeatureGrid({ children, columns = 3 }) {
111
+ return /* @__PURE__ */ jsx("div", {
112
+ className: `divide-base-300/70 border-base-300/80 bg-base-100/60 dark:bg-base-100/40 grid divide-y rounded-2xl border sm:gap-4 sm:divide-y-0 sm:rounded-none sm:border-0 sm:bg-transparent sm:dark:bg-transparent ${{
113
+ 2: "sm:grid-cols-2",
114
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
115
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
116
+ }[columns]}`,
117
+ children
118
+ });
119
+ }
120
+ export { FeatureGrid, FeatureTile, ProductCard, ProductGrid };
121
+
122
+ //# sourceMappingURL=Cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cards.js","names":[],"sources":["../../src/showcase/Cards.tsx"],"sourcesContent":["import { ArrowRightIcon } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { Heading, Text } from '../typography/Typography';\n\ninterface ProductCardProps {\n /** A lar-brand app hue; omit for Factory's neutral graphite. */\n hue?: number;\n icon: ReactNode;\n name: string;\n status: ReactNode;\n title: string;\n description: string;\n linkLabel: string;\n href: string;\n onNavigate: (href: string) => void;\n media: ReactNode;\n}\n\n/** A product on the home page: its name and promise above a screenshot that runs off the card's edge. */\nexport function ProductCard({\n hue,\n icon,\n name,\n status,\n title,\n description,\n linkLabel,\n href,\n onNavigate,\n media,\n}: ProductCardProps) {\n return (\n <article\n className=\"group/product border-base-300 bg-base-100 hover:border-base-400 dark:bg-base-100/80 relative isolate flex flex-col overflow-hidden rounded-[1.5rem] border shadow-[0_1px_0_rgb(255_255_255/4%)_inset] transition-[border-color,box-shadow] duration-300 hover:shadow-[0_30px_80px_-40px_rgb(0_0_0/45%)]\"\n style={\n { '--lar-card-hue': hue ?? 264, '--lar-card-chroma': hue === undefined ? 0.01 : 0.12 } as CSSProperties\n }\n >\n <div\n aria-hidden=\"true\"\n className=\"absolute inset-0 -z-10 bg-[radial-gradient(80%_60%_at_100%_0%,oklch(0.6_var(--lar-card-chroma)_var(--lar-card-hue)/0.16),transparent_70%)] transition-opacity duration-500 group-hover/product:opacity-150 dark:bg-[radial-gradient(80%_60%_at_100%_0%,oklch(0.5_var(--lar-card-chroma)_var(--lar-card-hue)/0.3),transparent_70%)]\"\n />\n <div className=\"flex flex-col gap-5 p-7 pb-8 sm:p-9 sm:pb-10\">\n <div className=\"flex items-center gap-3\">\n {icon}\n <div className=\"flex min-w-0 flex-col\">\n <Text as=\"span\" variant=\"label\">\n {name}\n </Text>\n </div>\n <span className=\"ml-auto\">{status}</span>\n </div>\n <Heading as=\"h3\" variant=\"feature\" className=\"max-w-[440px]\">\n {title}\n </Heading>\n <Text variant=\"prose\" tone=\"muted\" className=\"max-w-[460px]\">\n {description}\n </Text>\n <a\n {...tabbable}\n href={href}\n onClick={(event) => {\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;\n\n event.preventDefault();\n onNavigate(href);\n }}\n className=\"text-base-content focus-visible:before:outline-primary inline-flex w-fit items-center gap-1.5 text-[15px] font-medium before:absolute before:inset-0 before:z-10 before:rounded-[inherit] focus-visible:outline-none focus-visible:before:outline-2 focus-visible:before:outline-offset-[-2px] [&_svg]:size-4\"\n >\n {linkLabel}\n <span className=\"inline-flex transition-transform duration-200 group-hover/product:translate-x-1\">\n <ArrowRightIcon />\n </span>\n </a>\n </div>\n <div className=\"relative h-[240px] overflow-hidden [mask-image:linear-gradient(to_bottom,#000_calc(100%-56px),transparent)] pl-7 sm:h-[320px] sm:pl-9\">\n <div className=\"transition-transform duration-700 ease-[cubic-bezier(0.16,1,0.3,1)] group-hover/product:-translate-y-2\">\n {media}\n </div>\n </div>\n </article>\n );\n}\n\n/** Two or three product cards side by side. */\nexport function ProductGrid({ children }: { children: ReactNode }) {\n return <div className=\"grid gap-5 lg:grid-cols-2\">{children}</div>;\n}\n\ninterface FeatureTileProps {\n icon: ReactNode;\n title: string;\n children: ReactNode;\n hue?: number;\n}\n\n/** A short benefit: an icon in a tinted square, a title and a sentence or two. */\nexport function FeatureTile({ icon, title, children, hue }: FeatureTileProps) {\n return (\n <div className=\"sm:border-base-300/80 sm:bg-base-100/60 sm:dark:bg-base-100/40 grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 p-4 sm:flex sm:flex-col sm:gap-3 sm:rounded-[1.125rem] sm:border sm:p-6\">\n <span\n className={`row-span-2 inline-flex size-8 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 ${hue === undefined ? 'bg-primary/10 text-primary ring-primary/15 dark:bg-primary/20 dark:ring-primary/30 dark:text-[color-mix(in_srgb,var(--color-primary)_45%,white)]' : 'kind-badge ring-current/10'}`}\n style={hue === undefined ? undefined : ({ '--lar-kind-hue': hue } as CSSProperties)}\n >\n {icon}\n </span>\n <Heading as=\"h3\" variant=\"subsection\" className=\"self-center sm:mt-1 sm:self-auto\">\n {title}\n </Heading>\n <Text variant=\"prose\" tone=\"muted\" className=\"col-start-2\">\n {children}\n </Text>\n </div>\n );\n}\n\nexport function FeatureGrid({ children, columns = 3 }: { children: ReactNode; columns?: 2 | 3 | 4 }) {\n const layouts = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n };\n\n return (\n <div\n className={`divide-base-300/70 border-base-300/80 bg-base-100/60 dark:bg-base-100/40 grid divide-y rounded-2xl border sm:gap-4 sm:divide-y-0 sm:rounded-none sm:border-0 sm:bg-transparent sm:dark:bg-transparent ${layouts[columns]}`}\n >\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;AAqBA,SAAgB,YAAY,EACxB,KACA,MACA,MACA,QACA,OACA,aACA,WACA,MACA,YACA,SACiB;CACjB,OACI,qBAAC,WAAD;EACI,WAAU;EACV,OACI;GAAE,kBAAkB,OAAO;GAAK,qBAAqB,QAAQ,KAAA,IAAY,MAAO;EAAK;EAH7F,UAAA;GAMI,oBAAC,OAAD;IACI,eAAY;IACZ,WAAU;GACb,CAAA;GACD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACI,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACK;OACD,oBAAC,OAAD;QAAK,WAAU;QACX,UAAA,oBAAC,MAAD;SAAM,IAAG;SAAO,SAAQ;SACnB,UAAA;QACC,CAAA;OACL,CAAA;OACL,oBAAC,QAAD;QAAM,WAAU;QAAW,UAAA;OAAa,CAAA;MACvC;;KACL,oBAAC,SAAD;MAAS,IAAG;MAAK,SAAQ;MAAU,WAAU;MACxC,UAAA;KACI,CAAA;KACT,oBAAC,MAAD;MAAM,SAAQ;MAAQ,MAAK;MAAQ,WAAU;MACxC,UAAA;KACC,CAAA;KACN,qBAAC,KAAD;MACI,GAAI;MACE;MACN,UAAU,UAAU;OAChB,IAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,WAAW,GAAG;OAE5E,MAAM,eAAe;OACrB,WAAW,IAAI;MACnB;MACA,WAAU;MATd,UAAA,CAWK,WACD,oBAAC,QAAD;OAAM,WAAU;OACZ,UAAA,oBAAC,gBAAD,CAAiB,CAAA;MACf,CAAA,CACP;;IACF;;GACL,oBAAC,OAAD;IAAK,WAAU;IACX,UAAA,oBAAC,OAAD;KAAK,WAAU;KACV,UAAA;IACA,CAAA;GACJ,CAAA;EACA;;AAEjB;;AAGA,SAAgB,YAAY,EAAE,YAAqC;CAC/D,OAAO,oBAAC,OAAD;EAAK,WAAU;EAA6B;CAAc,CAAA;AACrE;;AAUA,SAAgB,YAAY,EAAE,MAAM,OAAO,UAAU,OAAyB;CAC1E,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACI,oBAAC,QAAD;IACI,WAAW,gKAAgK,QAAQ,KAAA,IAAY,qJAAqJ;IACpV,OAAO,QAAQ,KAAA,IAAY,KAAA,IAAa,EAAE,kBAAkB,IAAI;IAE/D,UAAA;GACC,CAAA;GACN,oBAAC,SAAD;IAAS,IAAG;IAAK,SAAQ;IAAa,WAAU;IAC3C,UAAA;GACI,CAAA;GACT,oBAAC,MAAD;IAAM,SAAQ;IAAQ,MAAK;IAAQ,WAAU;IACxC;GACC,CAAA;EACL;;AAEb;AAEA,SAAgB,YAAY,EAAE,UAAU,UAAU,KAAmD;CAOjG,OACI,oBAAC,OAAD;EACI,WAAW,yMAAyM;GAPxN,GAAG;GACH,GAAG;GACH,GAAG;EAK2N,EAAE;EAE3N;CACA,CAAA;AAEb"}
@@ -0,0 +1,72 @@
1
+ import { ReactNode } from "react";
2
+ export interface ScreenshotProps {
3
+ /** The screenshot shown with the dark theme, and with both when there is no light one. */
4
+ dark: string;
5
+ light?: string;
6
+ alt: string;
7
+ /** Loads at once, for the first screen of a page. */
8
+ eager?: boolean;
9
+ /** Natural pixel size, so the browser can reserve the space before the image arrives. */
10
+ width?: number;
11
+ height?: number;
12
+ }
13
+ /** A product screenshot that follows the page's theme when it has a light and a dark capture. */
14
+ export declare function Screenshot({ dark, light, alt, eager, width, height }: ScreenshotProps): import("react").JSX.Element;
15
+ interface FrameProps {
16
+ children: ReactNode;
17
+ /** A soft contact shadow under the device. */
18
+ shadow?: boolean;
19
+ }
20
+ /** A MacBook Pro: a notched display with the macOS menu bar, on an aluminium base that follows the theme. */
21
+ export declare function LaptopFrame({ children, shadow, app, menu, time }: FrameProps & {
22
+ app: string;
23
+ menu?: readonly string[];
24
+ time?: string;
25
+ }): import("react").JSX.Element;
26
+ /** An iPhone Pro with its Dynamic Island and side buttons, for an iOS screenshot at 1206 × 2622. */
27
+ export declare function PhoneFrame({ children, shadow }: FrameProps): import("react").JSX.Element;
28
+ /** An iPad Pro with even, thin bezels; the screenshot sets the aspect ratio. */
29
+ export declare function TabletFrame({ children, shadow, aspect }: FrameProps & {
30
+ aspect?: string;
31
+ }): import("react").JSX.Element;
32
+ /** A slim television on a pedestal, for a 16:9 capture. */
33
+ export declare function TvFrame({ children, shadow, stand }: FrameProps & {
34
+ stand?: boolean;
35
+ }): import("react").JSX.Element;
36
+ /** A Safari-style window with traffic lights and an address field. */
37
+ export declare function BrowserFrame({ children, shadow, address, aspect, fade, tone }: FrameProps & {
38
+ address: string;
39
+ aspect?: string;
40
+ fade?: 'right' | 'bottom' | 'both' | 'under' | 'tail';
41
+ tone?: 'dark';
42
+ }): import("react").JSX.Element;
43
+ /** A Mac app window whose screenshot already carries its own title bar: corners, a hairline and depth only.
44
+ * A bezel sets a dark-only capture in a dark display edge, so it reads as a deliberate dark shot on a light page;
45
+ * a fade dissolves an edge where the capture is cropped. */
46
+ export declare function AppWindow({ children, shadow, bezel, fade }: FrameProps & {
47
+ bezel?: boolean;
48
+ fade?: 'right' | 'bottom' | 'both';
49
+ }): import("react").JSX.Element;
50
+ /** A close-up cut from a screenshot, raised on glass above a device to point at one detail. */
51
+ export declare function Callout({ children, compact, fade }: {
52
+ children: ReactNode;
53
+ compact?: boolean;
54
+ fade?: boolean;
55
+ }): import("react").JSX.Element;
56
+ /** A close-up with a smaller detail card overlapping its lower corner. */
57
+ export declare function CalloutPair({ base, detail }: {
58
+ base: ReactNode;
59
+ detail: ReactNode;
60
+ }): import("react").JSX.Element;
61
+ /** Close-ups one under another, for a phone-width column. */
62
+ export declare function CalloutStack({ children }: {
63
+ children: ReactNode;
64
+ }): import("react").JSX.Element;
65
+ /** Media with a short, numbered reading guide floating over a quiet corner of it, on wide screens. */
66
+ export declare function GuidedMedia({ children, guide, label }: {
67
+ children: ReactNode;
68
+ guide: readonly string[];
69
+ label: string;
70
+ }): import("react").JSX.Element;
71
+ export {};
72
+ //# sourceMappingURL=Devices.d.ts.map
@@ -0,0 +1,249 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ // src/showcase/Devices.tsx
3
+ /** A product screenshot that follows the page's theme when it has a light and a dark capture. */
4
+ function Screenshot({ dark, light, alt, eager, width, height }) {
5
+ const loading = eager ? "eager" : "lazy";
6
+ const priority = eager ? "high" : "auto";
7
+ if (!light) return /* @__PURE__ */ jsx("img", {
8
+ src: dark,
9
+ alt,
10
+ loading,
11
+ fetchPriority: priority,
12
+ width,
13
+ height,
14
+ decoding: "async"
15
+ });
16
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("img", {
17
+ src: light,
18
+ alt,
19
+ loading,
20
+ fetchPriority: priority,
21
+ width,
22
+ height,
23
+ decoding: "async",
24
+ className: "dark:hidden!"
25
+ }), /* @__PURE__ */ jsx("img", {
26
+ src: dark,
27
+ alt,
28
+ loading,
29
+ width,
30
+ height,
31
+ decoding: "async",
32
+ className: "hidden! dark:block!"
33
+ })] });
34
+ }
35
+ /** A MacBook Pro: a notched display with the macOS menu bar, on an aluminium base that follows the theme. */
36
+ function LaptopFrame({ children, shadow = true, app, menu = [], time }) {
37
+ return /* @__PURE__ */ jsxs("div", {
38
+ className: "lar-device lar-laptop",
39
+ "data-shadow": shadow ? "float" : void 0,
40
+ children: [/* @__PURE__ */ jsx("div", {
41
+ className: "lar-laptop__lid",
42
+ children: /* @__PURE__ */ jsxs("div", {
43
+ className: "lar-laptop__screen",
44
+ children: [
45
+ /* @__PURE__ */ jsxs("div", {
46
+ className: "lar-laptop__menubar",
47
+ "aria-hidden": "true",
48
+ children: [
49
+ /* @__PURE__ */ jsx(LarMenuMark, {}),
50
+ /* @__PURE__ */ jsx("span", { children: app }),
51
+ menu.map((item) => /* @__PURE__ */ jsx("span", { children: item }, item)),
52
+ time ? /* @__PURE__ */ jsx("time", { children: time }) : null
53
+ ]
54
+ }),
55
+ /* @__PURE__ */ jsx("div", {
56
+ className: "lar-laptop__notch",
57
+ "aria-hidden": "true"
58
+ }),
59
+ /* @__PURE__ */ jsx("div", {
60
+ className: "lar-laptop__app",
61
+ children
62
+ })
63
+ ]
64
+ })
65
+ }), /* @__PURE__ */ jsx("div", {
66
+ className: "lar-laptop__base",
67
+ "aria-hidden": "true"
68
+ })]
69
+ });
70
+ }
71
+ /** The menu bar's leading glyph: the Lar mark stands in for the Apple menu, so the frame claims no one's logo. */
72
+ function LarMenuMark() {
73
+ return /* @__PURE__ */ jsxs("svg", {
74
+ viewBox: "0 0 100 100",
75
+ className: "size-[1.3cqi] shrink-0",
76
+ "aria-hidden": "true",
77
+ children: [/* @__PURE__ */ jsx("path", {
78
+ d: "M0 0H27.52V72.48H100V100H3a3 3 0 0 1-3-3z",
79
+ fill: "currentColor"
80
+ }), /* @__PURE__ */ jsx("path", {
81
+ d: "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",
82
+ fill: "currentColor"
83
+ })]
84
+ });
85
+ }
86
+ /** An iPhone Pro with its Dynamic Island and side buttons, for an iOS screenshot at 1206 × 2622. */
87
+ function PhoneFrame({ children, shadow = true }) {
88
+ return /* @__PURE__ */ jsx("div", {
89
+ className: "lar-device",
90
+ "data-shadow": shadow ? "float" : void 0,
91
+ children: /* @__PURE__ */ jsxs("div", {
92
+ className: "lar-phone",
93
+ children: [
94
+ /* @__PURE__ */ jsx("i", {
95
+ className: "lar-phone__button lar-phone__button--action",
96
+ "aria-hidden": "true"
97
+ }),
98
+ /* @__PURE__ */ jsx("i", {
99
+ className: "lar-phone__button lar-phone__button--volume-up",
100
+ "aria-hidden": "true"
101
+ }),
102
+ /* @__PURE__ */ jsx("i", {
103
+ className: "lar-phone__button lar-phone__button--volume-down",
104
+ "aria-hidden": "true"
105
+ }),
106
+ /* @__PURE__ */ jsx("i", {
107
+ className: "lar-phone__button lar-phone__button--side",
108
+ "aria-hidden": "true"
109
+ }),
110
+ /* @__PURE__ */ jsxs("div", {
111
+ className: "lar-phone__screen",
112
+ children: [/* @__PURE__ */ jsx("div", {
113
+ className: "lar-phone__island",
114
+ "aria-hidden": "true"
115
+ }), children]
116
+ })
117
+ ]
118
+ })
119
+ });
120
+ }
121
+ /** An iPad Pro with even, thin bezels; the screenshot sets the aspect ratio. */
122
+ function TabletFrame({ children, shadow = true, aspect = "4 / 3" }) {
123
+ return /* @__PURE__ */ jsx("div", {
124
+ className: "lar-device",
125
+ "data-shadow": shadow ? "float" : void 0,
126
+ children: /* @__PURE__ */ jsx("div", {
127
+ className: "lar-tablet",
128
+ children: /* @__PURE__ */ jsx("div", {
129
+ className: "lar-tablet__screen",
130
+ style: { aspectRatio: aspect },
131
+ children
132
+ })
133
+ })
134
+ });
135
+ }
136
+ /** A slim television on a pedestal, for a 16:9 capture. */
137
+ function TvFrame({ children, shadow = true, stand = true }) {
138
+ return /* @__PURE__ */ jsxs("div", {
139
+ className: "lar-device lar-tv",
140
+ "data-shadow": shadow ? "float" : void 0,
141
+ children: [/* @__PURE__ */ jsx("div", {
142
+ className: "lar-tv__panel",
143
+ children: /* @__PURE__ */ jsx("div", {
144
+ className: "lar-tv__screen",
145
+ children
146
+ })
147
+ }), stand ? /* @__PURE__ */ jsx("div", {
148
+ className: "lar-tv__stand",
149
+ "aria-hidden": "true"
150
+ }) : null]
151
+ });
152
+ }
153
+ /** A Safari-style window with traffic lights and an address field. */
154
+ function BrowserFrame({ children, shadow = true, address, aspect = "16 / 10", fade, tone }) {
155
+ return /* @__PURE__ */ jsx("div", {
156
+ className: `lar-device ${tone === "dark" ? "dark lar-dark-palette" : ""}`,
157
+ "data-shadow": shadow ? "float" : void 0,
158
+ children: /* @__PURE__ */ jsxs("div", {
159
+ className: "lar-window",
160
+ "data-fade": fade === "bottom" || fade === "tail" ? fade : void 0,
161
+ children: [/* @__PURE__ */ jsxs("div", {
162
+ className: "lar-window__bar",
163
+ "aria-hidden": "true",
164
+ children: [/* @__PURE__ */ jsxs("span", {
165
+ className: "lar-window__lights",
166
+ children: [
167
+ /* @__PURE__ */ jsx("i", {}),
168
+ /* @__PURE__ */ jsx("i", {}),
169
+ /* @__PURE__ */ jsx("i", {})
170
+ ]
171
+ }), /* @__PURE__ */ jsx("span", {
172
+ className: "lar-window__address",
173
+ children: address
174
+ })]
175
+ }), /* @__PURE__ */ jsx("div", {
176
+ className: "lar-window__screen",
177
+ "data-fade": fade === "bottom" || fade === "tail" ? void 0 : fade,
178
+ style: { aspectRatio: aspect },
179
+ children
180
+ })]
181
+ })
182
+ });
183
+ }
184
+ /** A Mac app window whose screenshot already carries its own title bar: corners, a hairline and depth only.
185
+ * A bezel sets a dark-only capture in a dark display edge, so it reads as a deliberate dark shot on a light page;
186
+ * a fade dissolves an edge where the capture is cropped. */
187
+ function AppWindow({ children, shadow = true, bezel, fade }) {
188
+ return /* @__PURE__ */ jsx("div", {
189
+ className: "lar-device",
190
+ "data-shadow": shadow ? "float" : void 0,
191
+ children: /* @__PURE__ */ jsx("div", {
192
+ className: "lar-app-window",
193
+ "data-bezel": bezel || void 0,
194
+ "data-fade": fade,
195
+ children: /* @__PURE__ */ jsx("div", {
196
+ className: "lar-app-window__fade",
197
+ children
198
+ })
199
+ })
200
+ });
201
+ }
202
+ /** A close-up cut from a screenshot, raised on glass above a device to point at one detail. */
203
+ function Callout({ children, compact, fade }) {
204
+ return /* @__PURE__ */ jsx("div", {
205
+ className: `lar-callout ${compact ? "mx-auto max-w-[240px]" : ""}`,
206
+ "data-fade": fade || void 0,
207
+ children: /* @__PURE__ */ jsx("div", {
208
+ className: "lar-callout__fade",
209
+ children
210
+ })
211
+ });
212
+ }
213
+ /** A close-up with a smaller detail card overlapping its lower corner. */
214
+ function CalloutPair({ base, detail }) {
215
+ return /* @__PURE__ */ jsxs("div", {
216
+ className: "relative pb-[18%]",
217
+ children: [base, /* @__PURE__ */ jsx("div", {
218
+ className: "absolute right-[-2%] bottom-0 w-[62%] rotate-[1.5deg]",
219
+ children: detail
220
+ })]
221
+ });
222
+ }
223
+ /** Close-ups one under another, for a phone-width column. */
224
+ function CalloutStack({ children }) {
225
+ return /* @__PURE__ */ jsx("div", {
226
+ className: "mx-auto flex max-w-[330px] flex-col gap-3",
227
+ children
228
+ });
229
+ }
230
+ /** Media with a short, numbered reading guide floating over a quiet corner of it, on wide screens. */
231
+ function GuidedMedia({ children, guide, label }) {
232
+ return /* @__PURE__ */ jsxs("div", {
233
+ className: "relative flex flex-col gap-4",
234
+ children: [children, /* @__PURE__ */ jsx("ol", {
235
+ "aria-label": label,
236
+ className: "text-base-content md:glass-menu flex flex-col gap-2 text-sm leading-5 md:absolute md:top-[8%] md:right-[4%] md:max-w-[260px] md:rounded-xl md:p-4",
237
+ children: guide.map((step, index) => /* @__PURE__ */ jsxs("li", {
238
+ className: "flex gap-2.5",
239
+ children: [/* @__PURE__ */ jsx("span", {
240
+ className: "bg-primary text-primary-content inline-flex size-5 shrink-0 items-center justify-center rounded-full text-[11px] font-semibold tabular-nums",
241
+ children: index + 1
242
+ }), step]
243
+ }, step))
244
+ })]
245
+ });
246
+ }
247
+ export { AppWindow, BrowserFrame, Callout, CalloutPair, CalloutStack, GuidedMedia, LaptopFrame, PhoneFrame, Screenshot, TabletFrame, TvFrame };
248
+
249
+ //# sourceMappingURL=Devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Devices.js","names":[],"sources":["../../src/showcase/Devices.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface ScreenshotProps {\n /** The screenshot shown with the dark theme, and with both when there is no light one. */\n dark: string;\n light?: string;\n alt: string;\n /** Loads at once, for the first screen of a page. */\n eager?: boolean;\n /** Natural pixel size, so the browser can reserve the space before the image arrives. */\n width?: number;\n height?: number;\n}\n\n/** A product screenshot that follows the page's theme when it has a light and a dark capture. */\nexport function Screenshot({ dark, light, alt, eager, width, height }: ScreenshotProps) {\n const loading = eager ? 'eager' : 'lazy';\n const priority = eager ? 'high' : 'auto';\n\n if (!light)\n return (\n <img\n src={dark}\n alt={alt}\n loading={loading}\n fetchPriority={priority}\n width={width}\n height={height}\n decoding=\"async\"\n />\n );\n\n return (\n <>\n <img\n src={light}\n alt={alt}\n loading={loading}\n fetchPriority={priority}\n width={width}\n height={height}\n decoding=\"async\"\n className=\"dark:hidden!\"\n />\n <img\n src={dark}\n alt={alt}\n loading={loading}\n width={width}\n height={height}\n decoding=\"async\"\n className=\"hidden! dark:block!\"\n />\n </>\n );\n}\n\ninterface FrameProps {\n children: ReactNode;\n /** A soft contact shadow under the device. */\n shadow?: boolean;\n}\n\n/** A MacBook Pro: a notched display with the macOS menu bar, on an aluminium base that follows the theme. */\nexport function LaptopFrame({\n children,\n shadow = true,\n app,\n menu = [],\n time,\n}: FrameProps & { app: string; menu?: readonly string[]; time?: string }) {\n return (\n <div className=\"lar-device lar-laptop\" data-shadow={shadow ? 'float' : undefined}>\n <div className=\"lar-laptop__lid\">\n <div className=\"lar-laptop__screen\">\n <div className=\"lar-laptop__menubar\" aria-hidden=\"true\">\n <LarMenuMark />\n <span>{app}</span>\n {menu.map((item) => (\n <span key={item}>{item}</span>\n ))}\n {time ? <time>{time}</time> : null}\n </div>\n <div className=\"lar-laptop__notch\" aria-hidden=\"true\" />\n <div className=\"lar-laptop__app\">{children}</div>\n </div>\n </div>\n <div className=\"lar-laptop__base\" aria-hidden=\"true\" />\n </div>\n );\n}\n\n/** The menu bar's leading glyph: the Lar mark stands in for the Apple menu, so the frame claims no one's logo. */\nfunction LarMenuMark() {\n return (\n <svg viewBox=\"0 0 100 100\" className=\"size-[1.3cqi] shrink-0\" aria-hidden=\"true\">\n <path d=\"M0 0H27.52V72.48H100V100H3a3 3 0 0 1-3-3z\" fill=\"currentColor\" />\n <path\n d=\"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 fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** An iPhone Pro with its Dynamic Island and side buttons, for an iOS screenshot at 1206 × 2622. */\nexport function PhoneFrame({ children, shadow = true }: FrameProps) {\n return (\n <div className=\"lar-device\" data-shadow={shadow ? 'float' : undefined}>\n <div className=\"lar-phone\">\n <i className=\"lar-phone__button lar-phone__button--action\" aria-hidden=\"true\" />\n <i className=\"lar-phone__button lar-phone__button--volume-up\" aria-hidden=\"true\" />\n <i className=\"lar-phone__button lar-phone__button--volume-down\" aria-hidden=\"true\" />\n <i className=\"lar-phone__button lar-phone__button--side\" aria-hidden=\"true\" />\n <div className=\"lar-phone__screen\">\n <div className=\"lar-phone__island\" aria-hidden=\"true\" />\n {children}\n </div>\n </div>\n </div>\n );\n}\n\n/** An iPad Pro with even, thin bezels; the screenshot sets the aspect ratio. */\nexport function TabletFrame({ children, shadow = true, aspect = '4 / 3' }: FrameProps & { aspect?: string }) {\n return (\n <div className=\"lar-device\" data-shadow={shadow ? 'float' : undefined}>\n <div className=\"lar-tablet\">\n <div className=\"lar-tablet__screen\" style={{ aspectRatio: aspect }}>\n {children}\n </div>\n </div>\n </div>\n );\n}\n\n/** A slim television on a pedestal, for a 16:9 capture. */\nexport function TvFrame({ children, shadow = true, stand = true }: FrameProps & { stand?: boolean }) {\n return (\n <div className=\"lar-device lar-tv\" data-shadow={shadow ? 'float' : undefined}>\n <div className=\"lar-tv__panel\">\n <div className=\"lar-tv__screen\">{children}</div>\n </div>\n {stand ? <div className=\"lar-tv__stand\" aria-hidden=\"true\" /> : null}\n </div>\n );\n}\n\n/** A Safari-style window with traffic lights and an address field. */\nexport function BrowserFrame({\n children,\n shadow = true,\n address,\n aspect = '16 / 10',\n fade,\n tone,\n}: FrameProps & {\n address: string;\n aspect?: string;\n fade?: 'right' | 'bottom' | 'both' | 'under' | 'tail';\n tone?: 'dark';\n}) {\n return (\n <div\n className={`lar-device ${tone === 'dark' ? 'dark lar-dark-palette' : ''}`}\n data-shadow={shadow ? 'float' : undefined}\n >\n <div className=\"lar-window\" data-fade={fade === 'bottom' || fade === 'tail' ? fade : undefined}>\n <div className=\"lar-window__bar\" aria-hidden=\"true\">\n <span className=\"lar-window__lights\">\n <i />\n <i />\n <i />\n </span>\n <span className=\"lar-window__address\">{address}</span>\n </div>\n <div\n className=\"lar-window__screen\"\n data-fade={fade === 'bottom' || fade === 'tail' ? undefined : fade}\n style={{ aspectRatio: aspect }}\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\n/** A Mac app window whose screenshot already carries its own title bar: corners, a hairline and depth only.\n * A bezel sets a dark-only capture in a dark display edge, so it reads as a deliberate dark shot on a light page;\n * a fade dissolves an edge where the capture is cropped. */\nexport function AppWindow({\n children,\n shadow = true,\n bezel,\n fade,\n}: FrameProps & { bezel?: boolean; fade?: 'right' | 'bottom' | 'both' }) {\n return (\n <div className=\"lar-device\" data-shadow={shadow ? 'float' : undefined}>\n <div className=\"lar-app-window\" data-bezel={bezel || undefined} data-fade={fade}>\n <div className=\"lar-app-window__fade\">{children}</div>\n </div>\n </div>\n );\n}\n\n/** A close-up cut from a screenshot, raised on glass above a device to point at one detail. */\nexport function Callout({ children, compact, fade }: { children: ReactNode; compact?: boolean; fade?: boolean }) {\n return (\n <div className={`lar-callout ${compact ? 'mx-auto max-w-[240px]' : ''}`} data-fade={fade || undefined}>\n <div className=\"lar-callout__fade\">{children}</div>\n </div>\n );\n}\n\n/** A close-up with a smaller detail card overlapping its lower corner. */\nexport function CalloutPair({ base, detail }: { base: ReactNode; detail: ReactNode }) {\n return (\n <div className=\"relative pb-[18%]\">\n {base}\n <div className=\"absolute right-[-2%] bottom-0 w-[62%] rotate-[1.5deg]\">{detail}</div>\n </div>\n );\n}\n\n/** Close-ups one under another, for a phone-width column. */\nexport function CalloutStack({ children }: { children: ReactNode }) {\n return <div className=\"mx-auto flex max-w-[330px] flex-col gap-3\">{children}</div>;\n}\n\n/** Media with a short, numbered reading guide floating over a quiet corner of it, on wide screens. */\nexport function GuidedMedia({\n children,\n guide,\n label,\n}: {\n children: ReactNode;\n guide: readonly string[];\n label: string;\n}) {\n return (\n <div className=\"relative flex flex-col gap-4\">\n {children}\n <ol\n aria-label={label}\n className=\"text-base-content md:glass-menu flex flex-col gap-2 text-sm leading-5 md:absolute md:top-[8%] md:right-[4%] md:max-w-[260px] md:rounded-xl md:p-4\"\n >\n {guide.map((step, index) => (\n <li key={step} className=\"flex gap-2.5\">\n <span className=\"bg-primary text-primary-content 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 </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { ReactNode } from "react";
2
+ interface FeatureRowProps {
3
+ eyebrow?: string;
4
+ title: string;
5
+ children: ReactNode;
6
+ points?: readonly string[];
7
+ media: ReactNode;
8
+ /** Puts the media on the left. */
9
+ reverse?: boolean;
10
+ /** Copy in two columns above media that spans the full width, for detailed screenshots. */
11
+ wide?: boolean;
12
+ /** A status chip beside the eyebrow. */
13
+ badge?: ReactNode;
14
+ /** How wide a wide row's media runs: the whole column, or a centred, readable measure. */
15
+ mediaWidth?: 'full' | 'measure';
16
+ /** Gives the media two-thirds of a side-by-side row instead of seven twelfths. */
17
+ largeMedia?: boolean;
18
+ }
19
+ /** A feature told in copy on one side and shown on a device on the other. */
20
+ export declare function FeatureRow({ eyebrow, title, children, points, media, reverse, wide, badge, mediaWidth, largeMedia }: FeatureRowProps): import("react").JSX.Element;
21
+ /** Checked lines under a feature. */
22
+ export declare function PointList({ points }: {
23
+ points: readonly string[];
24
+ }): import("react").JSX.Element;
25
+ /** A stack of feature rows with room between them. */
26
+ export declare function FeatureRows({ children }: {
27
+ children: ReactNode;
28
+ }): import("react").JSX.Element;
29
+ export {};
30
+ //# sourceMappingURL=FeatureRow.d.ts.map