@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.
- package/README.md +24 -2
- package/dist/actions/Button.d.ts +25 -0
- package/dist/actions/Button.js +55 -0
- package/dist/actions/Button.js.map +1 -0
- package/dist/actions/ButtonLink.d.ts +21 -0
- package/dist/actions/ButtonLink.js +40 -0
- package/dist/actions/ButtonLink.js.map +1 -0
- package/dist/actions/IconButton.d.ts +14 -0
- package/dist/actions/IconButton.js +29 -0
- package/dist/actions/IconButton.js.map +1 -0
- package/dist/actions/ThemeSwitch.d.ts +7 -0
- package/dist/actions/ThemeSwitch.js +42 -0
- package/dist/actions/ThemeSwitch.js.map +1 -0
- package/dist/actions/index.d.ts +5 -0
- package/dist/collections/CollectionSectionHeader.d.ts +5 -0
- package/dist/collections/CollectionSectionHeader.js +18 -0
- package/dist/collections/CollectionSectionHeader.js.map +1 -0
- package/dist/collections/CollectionState.d.ts +37 -0
- package/dist/collections/CollectionState.js +69 -0
- package/dist/collections/CollectionState.js.map +1 -0
- package/dist/collections/CollectionTokens.d.ts +16 -0
- package/dist/collections/CollectionTokens.js +19 -0
- package/dist/collections/CollectionTokens.js.map +1 -0
- package/dist/collections/CollectionViewport.js +36 -0
- package/dist/collections/CollectionViewport.js.map +1 -0
- package/dist/collections/DataRow.d.ts +23 -0
- package/dist/collections/DataRow.js +57 -0
- package/dist/collections/DataRow.js.map +1 -0
- package/dist/collections/ResultList.d.ts +29 -0
- package/dist/collections/ResultList.js +128 -0
- package/dist/collections/ResultList.js.map +1 -0
- package/dist/collections/ScrollRow.d.ts +23 -0
- package/dist/collections/ScrollRow.js +59 -0
- package/dist/collections/ScrollRow.js.map +1 -0
- package/dist/collections/VirtualGrid.d.ts +14 -0
- package/dist/collections/VirtualGrid.js +71 -0
- package/dist/collections/VirtualGrid.js.map +1 -0
- package/dist/collections/VirtualList.d.ts +34 -0
- package/dist/collections/VirtualList.js +128 -0
- package/dist/collections/VirtualList.js.map +1 -0
- package/dist/collections/index.d.ts +10 -0
- package/dist/collections/useCollectionMotion.d.ts +3 -0
- package/dist/collections/useCollectionMotion.js +34 -0
- package/dist/collections/useCollectionMotion.js.map +1 -0
- package/dist/collections/useScrollRow.d.ts +17 -0
- package/dist/collections/useScrollRow.js +63 -0
- package/dist/collections/useScrollRow.js.map +1 -0
- package/dist/display/ActivityCard.d.ts +17 -0
- package/dist/display/ActivityCard.js +58 -0
- package/dist/display/ActivityCard.js.map +1 -0
- package/dist/display/Artwork.d.ts +25 -0
- package/dist/display/Artwork.js +97 -0
- package/dist/display/Artwork.js.map +1 -0
- package/dist/display/Avatar.d.ts +5 -0
- package/dist/display/Avatar.js +13 -0
- package/dist/display/Avatar.js.map +1 -0
- package/dist/display/Badge.d.ts +10 -0
- package/dist/display/Badge.js +28 -0
- package/dist/display/Badge.js.map +1 -0
- package/dist/display/BadgeList.d.ts +11 -0
- package/dist/display/BadgeList.js +20 -0
- package/dist/display/BadgeList.js.map +1 -0
- package/dist/display/BrandMark.d.ts +21 -0
- package/dist/display/BrandMark.js +60 -0
- package/dist/display/BrandMark.js.map +1 -0
- package/dist/display/ChangeList.d.ts +16 -0
- package/dist/display/ChangeList.js +56 -0
- package/dist/display/ChangeList.js.map +1 -0
- package/dist/display/CheckList.d.ts +10 -0
- package/dist/display/CheckList.js +25 -0
- package/dist/display/CheckList.js.map +1 -0
- package/dist/display/CodeBlock.d.ts +6 -0
- package/dist/display/CodeBlock.js +12 -0
- package/dist/display/CodeBlock.js.map +1 -0
- package/dist/display/CopyButton.d.ts +9 -0
- package/dist/display/CopyButton.js +59 -0
- package/dist/display/CopyButton.js.map +1 -0
- package/dist/display/DataTable.d.ts +35 -0
- package/dist/display/DataTable.js +53 -0
- package/dist/display/DataTable.js.map +1 -0
- package/dist/display/DetailHero.d.ts +39 -0
- package/dist/display/DetailHero.js +146 -0
- package/dist/display/DetailHero.js.map +1 -0
- package/dist/display/DetailList.d.ts +15 -0
- package/dist/display/DetailList.js +53 -0
- package/dist/display/DetailList.js.map +1 -0
- package/dist/display/DeviceCard.d.ts +18 -0
- package/dist/display/DeviceCard.js +48 -0
- package/dist/display/DeviceCard.js.map +1 -0
- package/dist/display/Identity.d.ts +14 -0
- package/dist/display/Identity.js +54 -0
- package/dist/display/Identity.js.map +1 -0
- package/dist/display/ImageCard.d.ts +22 -0
- package/dist/display/ImageCard.js +63 -0
- package/dist/display/ImageCard.js.map +1 -0
- package/dist/display/ImagePicker.d.ts +30 -0
- package/dist/display/ImagePicker.js +108 -0
- package/dist/display/ImagePicker.js.map +1 -0
- package/dist/display/InfoBox.d.ts +15 -0
- package/dist/display/InfoBox.js +41 -0
- package/dist/display/InfoBox.js.map +1 -0
- package/dist/display/InsetPanel.d.ts +13 -0
- package/dist/display/InsetPanel.js +26 -0
- package/dist/display/InsetPanel.js.map +1 -0
- package/dist/display/ItemAction.d.ts +10 -0
- package/dist/display/ItemAction.js +35 -0
- package/dist/display/ItemAction.js.map +1 -0
- package/dist/display/Kbd.d.ts +6 -0
- package/dist/display/Kbd.js +12 -0
- package/dist/display/Kbd.js.map +1 -0
- package/dist/display/KindIcon.d.ts +8 -0
- package/dist/display/KindIcon.js +15 -0
- package/dist/display/KindIcon.js.map +1 -0
- package/dist/display/NoticeCard.d.ts +24 -0
- package/dist/display/NoticeCard.js +59 -0
- package/dist/display/NoticeCard.js.map +1 -0
- package/dist/display/PairingList.d.ts +19 -0
- package/dist/display/PairingList.js +53 -0
- package/dist/display/PairingList.js.map +1 -0
- package/dist/display/PathList.d.ts +9 -0
- package/dist/display/PathList.js +21 -0
- package/dist/display/PathList.js.map +1 -0
- package/dist/display/PeoplePreview.d.ts +16 -0
- package/dist/display/PeoplePreview.js +41 -0
- package/dist/display/PeoplePreview.js.map +1 -0
- package/dist/display/PropertySheet.d.ts +56 -0
- package/dist/display/PropertySheet.js +150 -0
- package/dist/display/PropertySheet.js.map +1 -0
- package/dist/display/QrCode.d.ts +6 -0
- package/dist/display/QrCode.js +47 -0
- package/dist/display/QrCode.js.map +1 -0
- package/dist/display/RadioChoice.d.ts +9 -0
- package/dist/display/RadioChoice.js +28 -0
- package/dist/display/RadioChoice.js.map +1 -0
- package/dist/display/RatingLink.d.ts +10 -0
- package/dist/display/RatingLink.js +80 -0
- package/dist/display/RatingLink.js.map +1 -0
- package/dist/display/ResourceCard.d.ts +20 -0
- package/dist/display/ResourceCard.js +200 -0
- package/dist/display/ResourceCard.js.map +1 -0
- package/dist/display/RowList.d.ts +28 -0
- package/dist/display/RowList.js +76 -0
- package/dist/display/RowList.js.map +1 -0
- package/dist/display/StackedMeter.d.ts +28 -0
- package/dist/display/StackedMeter.js +48 -0
- package/dist/display/StackedMeter.js.map +1 -0
- package/dist/display/StatTile.d.ts +13 -0
- package/dist/display/StatTile.js +35 -0
- package/dist/display/StatTile.js.map +1 -0
- package/dist/display/StepList.d.ts +5 -0
- package/dist/display/StepList.js +12 -0
- package/dist/display/StepList.js.map +1 -0
- package/dist/display/TextPreview.d.ts +14 -0
- package/dist/display/TextPreview.js +46 -0
- package/dist/display/TextPreview.js.map +1 -0
- package/dist/display/TimeSeriesChart.d.ts +19 -0
- package/dist/display/TimeSeriesChart.js +163 -0
- package/dist/display/TimeSeriesChart.js.map +1 -0
- package/dist/display/ToneTile.js +12 -0
- package/dist/display/ToneTile.js.map +1 -0
- package/dist/display/index.d.ts +38 -0
- package/dist/feedback/Alert.d.ts +15 -0
- package/dist/feedback/Alert.js +19 -0
- package/dist/feedback/Alert.js.map +1 -0
- package/dist/feedback/AsyncState.d.ts +16 -0
- package/dist/feedback/AsyncState.js +29 -0
- package/dist/feedback/AsyncState.js.map +1 -0
- package/dist/feedback/ErrorNotification.d.ts +8 -0
- package/dist/feedback/ErrorNotification.js +20 -0
- package/dist/feedback/ErrorNotification.js.map +1 -0
- package/dist/feedback/Notifications.d.ts +2 -0
- package/dist/feedback/Notifications.js +9 -0
- package/dist/feedback/Notifications.js.map +1 -0
- package/dist/feedback/ProgressStatusRow.d.ts +23 -0
- package/dist/feedback/ProgressStatusRow.js +74 -0
- package/dist/feedback/ProgressStatusRow.js.map +1 -0
- package/dist/feedback/SkeletonLoader.d.ts +19 -0
- package/dist/feedback/SkeletonLoader.js +59 -0
- package/dist/feedback/SkeletonLoader.js.map +1 -0
- package/dist/feedback/StatusIndicator.d.ts +9 -0
- package/dist/feedback/StatusIndicator.js +28 -0
- package/dist/feedback/StatusIndicator.js.map +1 -0
- package/dist/feedback/StatusPopoverContent.d.ts +13 -0
- package/dist/feedback/StatusPopoverContent.js +50 -0
- package/dist/feedback/StatusPopoverContent.js.map +1 -0
- package/dist/feedback/StatusRow.d.ts +16 -0
- package/dist/feedback/StatusRow.js +60 -0
- package/dist/feedback/StatusRow.js.map +1 -0
- package/dist/feedback/index.d.ts +11 -0
- package/dist/feedback/index.js +11 -0
- package/dist/forms/Checkbox.d.ts +10 -0
- package/dist/forms/Checkbox.js +48 -0
- package/dist/forms/Checkbox.js.map +1 -0
- package/dist/forms/Field.d.ts +5 -0
- package/dist/forms/Field.js +15 -0
- package/dist/forms/Field.js.map +1 -0
- package/dist/forms/FormControlStyles.js +14 -0
- package/dist/forms/FormControlStyles.js.map +1 -0
- package/dist/forms/FormSection.d.ts +48 -0
- package/dist/forms/FormSection.js +142 -0
- package/dist/forms/FormSection.js.map +1 -0
- package/dist/forms/InlineFields.d.ts +13 -0
- package/dist/forms/InlineFields.js +24 -0
- package/dist/forms/InlineFields.js.map +1 -0
- package/dist/forms/Input.d.ts +5 -0
- package/dist/forms/Input.js +18 -0
- package/dist/forms/Input.js.map +1 -0
- package/dist/forms/OptionSelect.d.ts +21 -0
- package/dist/forms/OptionSelect.js +28 -0
- package/dist/forms/OptionSelect.js.map +1 -0
- package/dist/forms/RadioGroup.d.ts +5 -0
- package/dist/forms/RadioGroup.js +35 -0
- package/dist/forms/RadioGroup.js.map +1 -0
- package/dist/forms/Select.d.ts +6 -0
- package/dist/forms/Select.js +36 -0
- package/dist/forms/Select.js.map +1 -0
- package/dist/forms/Switch.d.ts +4 -0
- package/dist/forms/Switch.js +16 -0
- package/dist/forms/Switch.js.map +1 -0
- package/dist/forms/TagInput.d.ts +19 -0
- package/dist/forms/TagInput.js +60 -0
- package/dist/forms/TagInput.js.map +1 -0
- package/dist/forms/Textarea.d.ts +4 -0
- package/dist/forms/Textarea.js +15 -0
- package/dist/forms/Textarea.js.map +1 -0
- package/dist/forms/index.d.ts +12 -0
- package/dist/foundations/DesignSystemProvider.d.ts +64 -0
- package/dist/foundations/DesignSystemProvider.js +66 -0
- package/dist/foundations/DesignSystemProvider.js.map +1 -0
- package/dist/foundations/KeyboardFocus.d.ts +9 -0
- package/dist/foundations/KeyboardFocus.js +10 -0
- package/dist/foundations/KeyboardFocus.js.map +1 -0
- package/dist/foundations/KeyboardShortcut.d.ts +5 -0
- package/dist/foundations/KeyboardShortcut.js +10 -0
- package/dist/foundations/KeyboardShortcut.js.map +1 -0
- package/dist/foundations/Theme.d.ts +14 -0
- package/dist/foundations/Theme.js +56 -0
- package/dist/foundations/Theme.js.map +1 -0
- package/dist/foundations/index.d.ts +5 -0
- package/dist/icons/BrandIcons.d.ts +3 -0
- package/dist/icons/BrandIcons.js +14 -0
- package/dist/icons/BrandIcons.js.map +1 -0
- package/dist/icons/index.d.ts +3 -0
- package/dist/icons/index.js +2 -0
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +2 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.js +125 -0
- package/dist/layout/AppShell.d.ts +11 -0
- package/dist/layout/AppShell.js +46 -0
- package/dist/layout/AppShell.js.map +1 -0
- package/dist/layout/AuthLayout.d.ts +11 -0
- package/dist/layout/AuthLayout.js +48 -0
- package/dist/layout/AuthLayout.js.map +1 -0
- package/dist/layout/ContentContainer.d.ts +9 -0
- package/dist/layout/ContentContainer.js +15 -0
- package/dist/layout/ContentContainer.js.map +1 -0
- package/dist/layout/Flow.d.ts +26 -0
- package/dist/layout/Flow.js +65 -0
- package/dist/layout/Flow.js.map +1 -0
- package/dist/layout/PageLayout.d.ts +12 -0
- package/dist/layout/PageLayout.js +31 -0
- package/dist/layout/PageLayout.js.map +1 -0
- package/dist/layout/PageSection.d.ts +43 -0
- package/dist/layout/PageSection.js +63 -0
- package/dist/layout/PageSection.js.map +1 -0
- package/dist/layout/ScrollArea.d.ts +4 -0
- package/dist/layout/ScrollArea.js +11 -0
- package/dist/layout/ScrollArea.js.map +1 -0
- package/dist/layout/Section.d.ts +12 -0
- package/dist/layout/Section.js +36 -0
- package/dist/layout/Section.js.map +1 -0
- package/dist/layout/Site.d.ts +41 -0
- package/dist/layout/Site.js +157 -0
- package/dist/layout/Site.js.map +1 -0
- package/dist/layout/TitleBar.d.ts +28 -0
- package/dist/layout/TitleBar.js +83 -0
- package/dist/layout/TitleBar.js.map +1 -0
- package/dist/layout/WorkspaceActionsHeader.d.ts +8 -0
- package/dist/layout/WorkspaceActionsHeader.js +18 -0
- package/dist/layout/WorkspaceActionsHeader.js.map +1 -0
- package/dist/layout/index.d.ts +19 -0
- package/dist/layout/index.js +19 -0
- package/dist/layout/sidebar/SidebarNavigationItem.d.ts +10 -0
- package/dist/layout/sidebar/SidebarNavigationItem.js +36 -0
- package/dist/layout/sidebar/SidebarNavigationItem.js.map +1 -0
- package/dist/layout/sidebar/SidebarPane.d.ts +13 -0
- package/dist/layout/sidebar/SidebarPane.js +30 -0
- package/dist/layout/sidebar/SidebarPane.js.map +1 -0
- package/dist/layout/toolbar/CommandPaletteTrigger.d.ts +11 -0
- package/dist/layout/toolbar/CommandPaletteTrigger.js +46 -0
- package/dist/layout/toolbar/CommandPaletteTrigger.js.map +1 -0
- package/dist/layout/toolbar/ToolbarStatusGroup.d.ts +5 -0
- package/dist/layout/toolbar/ToolbarStatusGroup.js +14 -0
- package/dist/layout/toolbar/ToolbarStatusGroup.js.map +1 -0
- package/dist/layout/toolbar/ToolbarStatusItem.d.ts +9 -0
- package/dist/layout/toolbar/ToolbarStatusItem.js +18 -0
- package/dist/layout/toolbar/ToolbarStatusItem.js.map +1 -0
- package/dist/navigation/ArtworkTabs.d.ts +18 -0
- package/dist/navigation/ArtworkTabs.js +72 -0
- package/dist/navigation/ArtworkTabs.js.map +1 -0
- package/dist/navigation/Breadcrumbs.d.ts +13 -0
- package/dist/navigation/Breadcrumbs.js +32 -0
- package/dist/navigation/Breadcrumbs.js.map +1 -0
- package/dist/navigation/CollectionBrowseSelector.d.ts +22 -0
- package/dist/navigation/CollectionBrowseSelector.js +70 -0
- package/dist/navigation/CollectionBrowseSelector.js.map +1 -0
- package/dist/navigation/CollectionViewToggle.d.ts +12 -0
- package/dist/navigation/CollectionViewToggle.js +36 -0
- package/dist/navigation/CollectionViewToggle.js.map +1 -0
- package/dist/navigation/DrilldownBrowseSelector.d.ts +31 -0
- package/dist/navigation/DrilldownBrowseSelector.js +174 -0
- package/dist/navigation/DrilldownBrowseSelector.js.map +1 -0
- package/dist/navigation/FolderSelector.d.ts +24 -0
- package/dist/navigation/FolderSelector.js +142 -0
- package/dist/navigation/FolderSelector.js.map +1 -0
- package/dist/navigation/TabKeys.js +13 -0
- package/dist/navigation/TabKeys.js.map +1 -0
- package/dist/navigation/ViewTabs.d.ts +19 -0
- package/dist/navigation/ViewTabs.js +48 -0
- package/dist/navigation/ViewTabs.js.map +1 -0
- package/dist/navigation/index.d.ts +8 -0
- package/dist/overlays/ActionModal.d.ts +21 -0
- package/dist/overlays/ActionModal.js +48 -0
- package/dist/overlays/ActionModal.js.map +1 -0
- package/dist/overlays/CommandPalette.d.ts +43 -0
- package/dist/overlays/CommandPalette.js +163 -0
- package/dist/overlays/CommandPalette.js.map +1 -0
- package/dist/overlays/Drawer.d.ts +19 -0
- package/dist/overlays/Drawer.js +83 -0
- package/dist/overlays/Drawer.js.map +1 -0
- package/dist/overlays/DropdownMenu.d.ts +47 -0
- package/dist/overlays/DropdownMenu.js +58 -0
- package/dist/overlays/DropdownMenu.js.map +1 -0
- package/dist/overlays/ImageViewer.d.ts +21 -0
- package/dist/overlays/ImageViewer.js +82 -0
- package/dist/overlays/ImageViewer.js.map +1 -0
- package/dist/overlays/Modal.d.ts +36 -0
- package/dist/overlays/Modal.js +149 -0
- package/dist/overlays/Modal.js.map +1 -0
- package/dist/overlays/Popover.d.ts +19 -0
- package/dist/overlays/Popover.js +26 -0
- package/dist/overlays/Popover.js.map +1 -0
- package/dist/overlays/Tooltip.d.ts +12 -0
- package/dist/overlays/Tooltip.js +54 -0
- package/dist/overlays/Tooltip.js.map +1 -0
- package/dist/overlays/index.d.ts +9 -0
- package/dist/overlays/useModalAutoFocus.js +84 -0
- package/dist/overlays/useModalAutoFocus.js.map +1 -0
- package/dist/overlays/useScrollFade.js +43 -0
- package/dist/overlays/useScrollFade.js.map +1 -0
- package/dist/showcase/CallToAction.d.ts +11 -0
- package/dist/showcase/CallToAction.js +54 -0
- package/dist/showcase/CallToAction.js.map +1 -0
- package/dist/showcase/Cards.d.ts +34 -0
- package/dist/showcase/Cards.js +122 -0
- package/dist/showcase/Cards.js.map +1 -0
- package/dist/showcase/Devices.d.ts +72 -0
- package/dist/showcase/Devices.js +249 -0
- package/dist/showcase/Devices.js.map +1 -0
- package/dist/showcase/FeatureRow.d.ts +30 -0
- package/dist/showcase/FeatureRow.js +91 -0
- package/dist/showcase/FeatureRow.js.map +1 -0
- package/dist/showcase/Hero.d.ts +15 -0
- package/dist/showcase/Hero.js +73 -0
- package/dist/showcase/Hero.js.map +1 -0
- package/dist/showcase/PhotoSearchConcept.d.ts +14 -0
- package/dist/showcase/PhotoSearchConcept.js +43 -0
- package/dist/showcase/PhotoSearchConcept.js.map +1 -0
- package/dist/showcase/Platforms.d.ts +15 -0
- package/dist/showcase/Platforms.js +48 -0
- package/dist/showcase/Platforms.js.map +1 -0
- package/dist/showcase/ProductBand.d.ts +38 -0
- package/dist/showcase/ProductBand.js +120 -0
- package/dist/showcase/ProductBand.js.map +1 -0
- package/dist/showcase/Roadmap.d.ts +21 -0
- package/dist/showcase/Roadmap.js +111 -0
- package/dist/showcase/Roadmap.js.map +1 -0
- package/dist/showcase/RouteDiagram.d.ts +14 -0
- package/dist/showcase/RouteDiagram.js +57 -0
- package/dist/showcase/RouteDiagram.js.map +1 -0
- package/dist/showcase/ServerUnit.d.ts +50 -0
- package/dist/showcase/ServerUnit.js +175 -0
- package/dist/showcase/ServerUnit.js.map +1 -0
- package/dist/showcase/Stage.d.ts +46 -0
- package/dist/showcase/Stage.js +106 -0
- package/dist/showcase/Stage.js.map +1 -0
- package/dist/showcase/Status.d.ts +30 -0
- package/dist/showcase/Status.js +84 -0
- package/dist/showcase/Status.js.map +1 -0
- package/dist/showcase/StepFlow.d.ts +13 -0
- package/dist/showcase/StepFlow.js +47 -0
- package/dist/showcase/StepFlow.js.map +1 -0
- package/dist/showcase/index.d.ts +15 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.js +43 -0
- package/dist/testing.js.map +1 -0
- package/dist/typography/Link.d.ts +21 -0
- package/dist/typography/Link.js +60 -0
- package/dist/typography/Link.js.map +1 -0
- package/dist/typography/Typography.d.ts +53 -0
- package/dist/typography/Typography.js +67 -0
- package/dist/typography/Typography.js.map +1 -0
- package/dist/typography/index.d.ts +4 -0
- package/dist/typography/index.js +4 -0
- package/package.json +80 -3
- package/src/actions/Button.tsx +68 -0
- package/src/actions/ButtonLink.tsx +75 -0
- package/src/actions/IconButton.tsx +55 -0
- package/src/actions/ThemeSwitch.tsx +46 -0
- package/src/actions/index.ts +4 -0
- package/src/collections/CollectionSectionHeader.tsx +13 -0
- package/src/collections/CollectionState.tsx +76 -0
- package/src/collections/CollectionTokens.ts +12 -0
- package/src/collections/CollectionViewport.ts +40 -0
- package/src/collections/DataRow.tsx +79 -0
- package/src/collections/ResultList.tsx +164 -0
- package/src/collections/ScrollRow.tsx +90 -0
- package/src/collections/VirtualGrid.tsx +92 -0
- package/src/collections/VirtualList.tsx +224 -0
- package/src/collections/index.ts +10 -0
- package/src/collections/useCollectionMotion.ts +42 -0
- package/src/collections/useScrollRow.ts +64 -0
- package/src/display/ActivityCard.tsx +76 -0
- package/src/display/Artwork.tsx +140 -0
- package/src/display/Avatar.tsx +7 -0
- package/src/display/Badge.tsx +33 -0
- package/src/display/BadgeList.tsx +25 -0
- package/src/display/BrandMark.tsx +72 -0
- package/src/display/ChangeList.tsx +41 -0
- package/src/display/CheckList.tsx +27 -0
- package/src/display/CodeBlock.tsx +12 -0
- package/src/display/CopyButton.tsx +77 -0
- package/src/display/DataTable.tsx +80 -0
- package/src/display/DetailHero.tsx +191 -0
- package/src/display/DetailList.tsx +74 -0
- package/src/display/DeviceCard.tsx +49 -0
- package/src/display/Identity.tsx +56 -0
- package/src/display/ImageCard.tsx +102 -0
- package/src/display/ImagePicker.tsx +149 -0
- package/src/display/InfoBox.tsx +48 -0
- package/src/display/InsetPanel.tsx +37 -0
- package/src/display/ItemAction.tsx +53 -0
- package/src/display/Kbd.tsx +6 -0
- package/src/display/KindIcon.tsx +15 -0
- package/src/display/NoticeCard.tsx +77 -0
- package/src/display/PairingList.tsx +55 -0
- package/src/display/PathList.tsx +16 -0
- package/src/display/PeoplePreview.tsx +66 -0
- package/src/display/PropertySheet.tsx +180 -0
- package/src/display/QrCode.tsx +47 -0
- package/src/display/RadioChoice.tsx +34 -0
- package/src/display/RatingLink.tsx +76 -0
- package/src/display/ResourceCard.tsx +201 -0
- package/src/display/RowList.tsx +110 -0
- package/src/display/StackedMeter.tsx +72 -0
- package/src/display/StatTile.tsx +39 -0
- package/src/display/StepList.tsx +10 -0
- package/src/display/TextPreview.tsx +66 -0
- package/src/display/TimeSeriesChart.tsx +191 -0
- package/src/display/ToneTile.ts +10 -0
- package/src/display/index.ts +37 -0
- package/src/feedback/Alert.tsx +35 -0
- package/src/feedback/AsyncState.tsx +56 -0
- package/src/feedback/ErrorNotification.ts +24 -0
- package/src/feedback/Notifications.tsx +5 -0
- package/src/feedback/ProgressStatusRow.tsx +104 -0
- package/src/feedback/SkeletonLoader.tsx +88 -0
- package/src/feedback/StatusIndicator.tsx +28 -0
- package/src/feedback/StatusPopoverContent.tsx +54 -0
- package/src/feedback/StatusRow.tsx +70 -0
- package/src/feedback/index.ts +15 -0
- package/src/forms/Checkbox.tsx +61 -0
- package/src/forms/Field.tsx +17 -0
- package/src/forms/FormControlStyles.ts +9 -0
- package/src/forms/FormSection.tsx +175 -0
- package/src/forms/InlineFields.tsx +22 -0
- package/src/forms/Input.tsx +22 -0
- package/src/forms/OptionSelect.tsx +49 -0
- package/src/forms/RadioGroup.tsx +48 -0
- package/src/forms/Select.tsx +46 -0
- package/src/forms/Switch.tsx +10 -0
- package/src/forms/TagInput.tsx +76 -0
- package/src/forms/Textarea.tsx +14 -0
- package/src/forms/index.ts +11 -0
- package/src/foundations/DesignSystemProvider.tsx +79 -0
- package/src/foundations/KeyboardFocus.ts +6 -0
- package/src/foundations/KeyboardShortcut.ts +12 -0
- package/src/foundations/Theme.ts +75 -0
- package/src/foundations/index.ts +10 -0
- package/src/foundations/theme.css +425 -0
- package/src/icons/BrandIcons.tsx +8 -0
- package/src/icons/index.ts +4 -0
- package/src/icons.ts +1 -0
- package/src/index.ts +13 -0
- package/src/layout/AppShell.tsx +63 -0
- package/src/layout/AuthLayout.tsx +40 -0
- package/src/layout/ContentContainer.tsx +16 -0
- package/src/layout/Flow.tsx +56 -0
- package/src/layout/PageLayout.tsx +35 -0
- package/src/layout/PageSection.tsx +103 -0
- package/src/layout/ScrollArea.tsx +7 -0
- package/src/layout/Section.tsx +36 -0
- package/src/layout/Site.tsx +205 -0
- package/src/layout/TitleBar.tsx +97 -0
- package/src/layout/WorkspaceActionsHeader.tsx +17 -0
- package/src/layout/index.ts +18 -0
- package/src/layout/sidebar/SidebarNavigationItem.tsx +45 -0
- package/src/layout/sidebar/SidebarPane.tsx +37 -0
- package/src/layout/toolbar/CommandPaletteTrigger.tsx +53 -0
- package/src/layout/toolbar/ToolbarStatusGroup.tsx +9 -0
- package/src/layout/toolbar/ToolbarStatusItem.tsx +18 -0
- package/src/navigation/ArtworkTabs.tsx +107 -0
- package/src/navigation/Breadcrumbs.tsx +31 -0
- package/src/navigation/CollectionBrowseSelector.tsx +90 -0
- package/src/navigation/CollectionViewToggle.tsx +52 -0
- package/src/navigation/DrilldownBrowseSelector.tsx +229 -0
- package/src/navigation/FolderSelector.tsx +172 -0
- package/src/navigation/TabKeys.ts +21 -0
- package/src/navigation/ViewTabs.tsx +85 -0
- package/src/navigation/index.ts +15 -0
- package/src/overlays/ActionModal.tsx +81 -0
- package/src/overlays/CommandPalette.tsx +199 -0
- package/src/overlays/Drawer.tsx +107 -0
- package/src/overlays/DropdownMenu.tsx +122 -0
- package/src/overlays/ImageViewer.tsx +96 -0
- package/src/overlays/Modal.tsx +234 -0
- package/src/overlays/Popover.tsx +40 -0
- package/src/overlays/Tooltip.tsx +56 -0
- package/src/overlays/index.ts +8 -0
- package/src/overlays/useModalAutoFocus.ts +119 -0
- package/src/overlays/useScrollFade.ts +49 -0
- package/src/showcase/CallToAction.tsx +46 -0
- package/src/showcase/Cards.tsx +133 -0
- package/src/showcase/Devices.tsx +259 -0
- package/src/showcase/FeatureRow.tsx +107 -0
- package/src/showcase/Hero.tsx +70 -0
- package/src/showcase/PhotoSearchConcept.tsx +50 -0
- package/src/showcase/Platforms.tsx +49 -0
- package/src/showcase/ProductBand.tsx +148 -0
- package/src/showcase/Roadmap.tsx +115 -0
- package/src/showcase/RouteDiagram.tsx +56 -0
- package/src/showcase/ServerUnit.tsx +191 -0
- package/src/showcase/Stage.tsx +160 -0
- package/src/showcase/Status.tsx +107 -0
- package/src/showcase/StepFlow.tsx +48 -0
- package/src/showcase/devices.css +441 -0
- package/src/showcase/index.ts +34 -0
- package/src/showcase/server-unit.css +258 -0
- package/src/showcase/stage.css +175 -0
- package/src/styles.css +5 -0
- package/src/testing.ts +34 -0
- package/src/typography/Link.tsx +105 -0
- package/src/typography/Typography.tsx +113 -0
- package/src/typography/index.ts +3 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Eyebrow } from "../layout/PageSection.js";
|
|
2
|
+
import { Heading, Text } from "../typography/Typography.js";
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon } from "lucide-react";
|
|
6
|
+
// src/showcase/FeatureRow.tsx
|
|
7
|
+
/** A feature told in copy on one side and shown on a device on the other. */
|
|
8
|
+
function FeatureRow({ eyebrow, title, children, points, media, reverse, wide, badge, mediaWidth = "measure", largeMedia }) {
|
|
9
|
+
const id = useId();
|
|
10
|
+
if (wide) return /* @__PURE__ */ jsxs("article", {
|
|
11
|
+
"aria-labelledby": id,
|
|
12
|
+
className: "flex flex-col gap-12",
|
|
13
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
14
|
+
className: "grid gap-x-16 gap-y-4 lg:grid-cols-2",
|
|
15
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
16
|
+
className: "flex flex-col gap-4",
|
|
17
|
+
children: [
|
|
18
|
+
eyebrow ? /* @__PURE__ */ jsx(Eyebrow, { children: eyebrow }) : null,
|
|
19
|
+
/* @__PURE__ */ jsx(Heading, {
|
|
20
|
+
id,
|
|
21
|
+
as: "h3",
|
|
22
|
+
variant: "feature",
|
|
23
|
+
children: title
|
|
24
|
+
}),
|
|
25
|
+
/* @__PURE__ */ jsx(Text, {
|
|
26
|
+
variant: "prose",
|
|
27
|
+
tone: "muted",
|
|
28
|
+
children
|
|
29
|
+
})
|
|
30
|
+
]
|
|
31
|
+
}), points?.length ? /* @__PURE__ */ jsx("div", {
|
|
32
|
+
className: "lg:pt-9",
|
|
33
|
+
children: /* @__PURE__ */ jsx(PointList, { points })
|
|
34
|
+
}) : null]
|
|
35
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
36
|
+
className: `mx-auto w-full ${mediaWidth === "full" ? "" : "max-w-[780px]"}`,
|
|
37
|
+
children: media
|
|
38
|
+
})]
|
|
39
|
+
});
|
|
40
|
+
return /* @__PURE__ */ jsxs("article", {
|
|
41
|
+
"aria-labelledby": id,
|
|
42
|
+
className: `grid items-center gap-8 sm:gap-12 lg:gap-16 ${reverse ? largeMedia ? "lg:grid-cols-[minmax(0,8fr)_minmax(0,4fr)]" : "lg:grid-cols-[minmax(0,7fr)_minmax(0,5fr)]" : largeMedia ? "lg:grid-cols-[minmax(0,4fr)_minmax(0,8fr)]" : "lg:grid-cols-[minmax(0,5fr)_minmax(0,7fr)]"}`,
|
|
43
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
44
|
+
className: `flex flex-col gap-4 max-sm:[&>h3]:mb-1 ${reverse ? "lg:order-2" : ""}`,
|
|
45
|
+
children: [
|
|
46
|
+
eyebrow ? /* @__PURE__ */ jsxs("div", {
|
|
47
|
+
className: "flex items-center gap-3",
|
|
48
|
+
children: [/* @__PURE__ */ jsx(Eyebrow, { children: eyebrow }), badge]
|
|
49
|
+
}) : null,
|
|
50
|
+
/* @__PURE__ */ jsx(Heading, {
|
|
51
|
+
id,
|
|
52
|
+
as: "h3",
|
|
53
|
+
variant: "feature",
|
|
54
|
+
children: title
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ jsx(Text, {
|
|
57
|
+
variant: "prose",
|
|
58
|
+
tone: "muted",
|
|
59
|
+
children
|
|
60
|
+
}),
|
|
61
|
+
points?.length ? /* @__PURE__ */ jsx(PointList, { points }) : null
|
|
62
|
+
]
|
|
63
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
64
|
+
className: reverse ? "lg:order-1" : "",
|
|
65
|
+
children: media
|
|
66
|
+
})]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** Checked lines under a feature. */
|
|
70
|
+
function PointList({ points }) {
|
|
71
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
72
|
+
className: "mt-2 flex flex-col gap-2.5",
|
|
73
|
+
children: points.map((point) => /* @__PURE__ */ jsxs("li", {
|
|
74
|
+
className: "text-base-800 flex gap-2.5 text-[15px] leading-6",
|
|
75
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
76
|
+
className: "bg-primary/12 text-primary dark:bg-primary/25 mt-[3px] inline-flex size-[18px] shrink-0 items-center justify-center rounded-full dark:text-[color-mix(in_srgb,var(--color-primary)_45%,white)] [&>svg]:size-3",
|
|
77
|
+
children: /* @__PURE__ */ jsx(CheckIcon, {})
|
|
78
|
+
}), point]
|
|
79
|
+
}, point))
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** A stack of feature rows with room between them. */
|
|
83
|
+
function FeatureRows({ children }) {
|
|
84
|
+
return /* @__PURE__ */ jsx("div", {
|
|
85
|
+
className: "flex flex-col gap-16 sm:gap-24",
|
|
86
|
+
children
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export { FeatureRow, FeatureRows, PointList };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=FeatureRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureRow.js","names":[],"sources":["../../src/showcase/FeatureRow.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\nimport { type ReactNode, useId } from 'react';\n\nimport { Eyebrow } from '../layout/PageSection';\nimport { Heading, Text } from '../typography/Typography';\n\ninterface FeatureRowProps {\n eyebrow?: string;\n title: string;\n children: ReactNode;\n points?: readonly string[];\n media: ReactNode;\n /** Puts the media on the left. */\n reverse?: boolean;\n /** Copy in two columns above media that spans the full width, for detailed screenshots. */\n wide?: boolean;\n /** A status chip beside the eyebrow. */\n badge?: ReactNode;\n /** How wide a wide row's media runs: the whole column, or a centred, readable measure. */\n mediaWidth?: 'full' | 'measure';\n /** Gives the media two-thirds of a side-by-side row instead of seven twelfths. */\n largeMedia?: boolean;\n}\n\n/** A feature told in copy on one side and shown on a device on the other. */\nexport function FeatureRow({\n eyebrow,\n title,\n children,\n points,\n media,\n reverse,\n wide,\n badge,\n mediaWidth = 'measure',\n largeMedia,\n}: FeatureRowProps) {\n const id = useId();\n\n if (wide)\n return (\n <article aria-labelledby={id} className=\"flex flex-col gap-12\">\n <div className=\"grid gap-x-16 gap-y-4 lg:grid-cols-2\">\n <div className=\"flex flex-col gap-4\">\n {eyebrow ? <Eyebrow>{eyebrow}</Eyebrow> : null}\n <Heading id={id} as=\"h3\" variant=\"feature\">\n {title}\n </Heading>\n <Text variant=\"prose\" tone=\"muted\">\n {children}\n </Text>\n </div>\n {points?.length ? (\n <div className=\"lg:pt-9\">\n <PointList points={points} />\n </div>\n ) : null}\n </div>\n <div className={`mx-auto w-full ${mediaWidth === 'full' ? '' : 'max-w-[780px]'}`}>{media}</div>\n </article>\n );\n\n return (\n <article\n aria-labelledby={id}\n className={`grid items-center gap-8 sm:gap-12 lg:gap-16 ${reverse ? (largeMedia ? 'lg:grid-cols-[minmax(0,8fr)_minmax(0,4fr)]' : 'lg:grid-cols-[minmax(0,7fr)_minmax(0,5fr)]') : largeMedia ? 'lg:grid-cols-[minmax(0,4fr)_minmax(0,8fr)]' : 'lg:grid-cols-[minmax(0,5fr)_minmax(0,7fr)]'}`}\n >\n <div className={`flex flex-col gap-4 max-sm:[&>h3]:mb-1 ${reverse ? 'lg:order-2' : ''}`}>\n {eyebrow ? (\n <div className=\"flex items-center gap-3\">\n <Eyebrow>{eyebrow}</Eyebrow>\n {badge}\n </div>\n ) : null}\n <Heading id={id} as=\"h3\" variant=\"feature\">\n {title}\n </Heading>\n <Text variant=\"prose\" tone=\"muted\">\n {children}\n </Text>\n {points?.length ? <PointList points={points} /> : null}\n </div>\n <div className={reverse ? 'lg:order-1' : ''}>{media}</div>\n </article>\n );\n}\n\n/** Checked lines under a feature. */\nexport function PointList({ points }: { points: readonly string[] }) {\n return (\n <ul className=\"mt-2 flex flex-col gap-2.5\">\n {points.map((point) => (\n <li key={point} className=\"text-base-800 flex gap-2.5 text-[15px] leading-6\">\n <span className=\"bg-primary/12 text-primary dark:bg-primary/25 mt-[3px] inline-flex size-[18px] shrink-0 items-center justify-center rounded-full dark:text-[color-mix(in_srgb,var(--color-primary)_45%,white)] [&>svg]:size-3\">\n <CheckIcon />\n </span>\n {point}\n </li>\n ))}\n </ul>\n );\n}\n\n/** A stack of feature rows with room between them. */\nexport function FeatureRows({ children }: { children: ReactNode }) {\n return <div className=\"flex flex-col gap-16 sm:gap-24\">{children}</div>;\n}\n"],"mappings":";;;;;;;AAyBA,SAAgB,WAAW,EACvB,SACA,OACA,UACA,QACA,OACA,SACA,MACA,OACA,aAAa,WACb,cACgB;CAChB,MAAM,KAAK,MAAM;CAEjB,IAAI,MACA,OACI,qBAAC,WAAD;EAAS,mBAAiB;EAAI,WAAU;EAAxC,UAAA,CACI,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACK,UAAU,oBAAC,SAAD,EAAA,UAAU,QAAiB,CAAA,IAAI;KAC1C,oBAAC,SAAD;MAAa;MAAI,IAAG;MAAK,SAAQ;MAC5B,UAAA;KACI,CAAA;KACT,oBAAC,MAAD;MAAM,SAAQ;MAAQ,MAAK;MACtB;KACC,CAAA;IACL;GACJ,CAAA,GAAA,QAAQ,SACL,oBAAC,OAAD;IAAK,WAAU;IACX,UAAA,oBAAC,WAAD,EAAmB,OAAS,CAAA;GAC3B,CAAA,IACL,IACH;EACL,CAAA,GAAA,oBAAC,OAAD;GAAK,WAAW,kBAAkB,eAAe,SAAS,KAAK;GAAoB,UAAA;EAAW,CAAA,CACzF;;CAGjB,OACI,qBAAC,WAAD;EACI,mBAAiB;EACjB,WAAW,+CAA+C,UAAW,aAAa,+CAA+C,+CAAgD,aAAa,+CAA+C;EAFjP,UAAA,CAII,qBAAC,OAAD;GAAK,WAAW,0CAA0C,UAAU,eAAe;GAAnF,UAAA;IACK,UACG,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACI,oBAAC,SAAD,EAAA,UAAU,QAAiB,CAAA,GAC1B,KACA;IACL,CAAA,IAAA;IACJ,oBAAC,SAAD;KAAa;KAAI,IAAG;KAAK,SAAQ;KAC5B,UAAA;IACI,CAAA;IACT,oBAAC,MAAD;KAAM,SAAQ;KAAQ,MAAK;KACtB;IACC,CAAA;IACL,QAAQ,SAAS,oBAAC,WAAD,EAAmB,OAAS,CAAA,IAAI;GACjD;EACL,CAAA,GAAA,oBAAC,OAAD;GAAK,WAAW,UAAU,eAAe;GAAK,UAAA;EAAW,CAAA,CACpD;;AAEjB;;AAGA,SAAgB,UAAU,EAAE,UAAyC;CACjE,OACI,oBAAC,MAAD;EAAI,WAAU;EACT,UAAA,OAAO,KAAK,UACT,qBAAC,MAAD;GAAgB,WAAU;GAA1B,UAAA,CACI,oBAAC,QAAD;IAAM,WAAU;IACZ,UAAA,oBAAC,WAAD,CAAY,CAAA;GACV,CAAA,GACL,KACD;EALK,GAAA,KAKL,CACP;CACD,CAAA;AAEZ;;AAGA,SAAgB,YAAY,EAAE,YAAqC;CAC/D,OAAO,oBAAC,OAAD;EAAK,WAAU;EAAkC;CAAc,CAAA;AAC1E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface HeroProps {
|
|
3
|
+
announcement?: ReactNode;
|
|
4
|
+
title: ReactNode;
|
|
5
|
+
lead: ReactNode;
|
|
6
|
+
actions?: ReactNode;
|
|
7
|
+
note?: ReactNode;
|
|
8
|
+
visual?: ReactNode;
|
|
9
|
+
/** Tints the glow behind the hero with a product hue. */
|
|
10
|
+
hue?: number;
|
|
11
|
+
}
|
|
12
|
+
/** A page's opening: a centred statement over the brand glow, then the product on its devices. */
|
|
13
|
+
export declare function Hero({ announcement, title, lead, actions, note, visual, hue }: HeroProps): import("react").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=Hero.d.ts.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Heading, Text } from "../typography/Typography.js";
|
|
2
|
+
import { Backdrop } from "./Stage.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
// src/showcase/Hero.tsx
|
|
5
|
+
/** A page's opening: a centred statement over the brand glow, then the product on its devices. */
|
|
6
|
+
function Hero({ announcement, title, lead, actions, note, visual, hue }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
8
|
+
className: "relative isolate",
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ jsx(Backdrop, { hue }),
|
|
11
|
+
/* @__PURE__ */ jsxs("div", {
|
|
12
|
+
className: "mx-auto flex w-full max-w-[1200px] flex-col items-center px-5 pt-8 text-center sm:px-8 sm:pt-16 lg:pt-16",
|
|
13
|
+
children: [
|
|
14
|
+
announcement ? /* @__PURE__ */ jsx(Intro, {
|
|
15
|
+
delay: 0,
|
|
16
|
+
children: announcement
|
|
17
|
+
}) : null,
|
|
18
|
+
/* @__PURE__ */ jsx(Intro, {
|
|
19
|
+
delay: 60,
|
|
20
|
+
children: /* @__PURE__ */ jsx(Heading, {
|
|
21
|
+
as: "h1",
|
|
22
|
+
variant: "display",
|
|
23
|
+
className: "mx-auto mt-5 max-w-[920px] whitespace-pre-line",
|
|
24
|
+
children: title
|
|
25
|
+
})
|
|
26
|
+
}),
|
|
27
|
+
/* @__PURE__ */ jsx(Intro, {
|
|
28
|
+
delay: 140,
|
|
29
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
30
|
+
variant: "lead",
|
|
31
|
+
tone: "muted",
|
|
32
|
+
className: "mx-auto mt-5 max-w-[640px]",
|
|
33
|
+
children: lead
|
|
34
|
+
})
|
|
35
|
+
}),
|
|
36
|
+
actions ? /* @__PURE__ */ jsx(Intro, {
|
|
37
|
+
delay: 220,
|
|
38
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
39
|
+
className: "mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row sm:flex-wrap max-sm:[&>a]:w-full max-sm:[&>a]:max-w-[320px]",
|
|
40
|
+
children: actions
|
|
41
|
+
})
|
|
42
|
+
}) : null,
|
|
43
|
+
note ? /* @__PURE__ */ jsx(Intro, {
|
|
44
|
+
delay: 280,
|
|
45
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
46
|
+
variant: "body",
|
|
47
|
+
tone: "muted",
|
|
48
|
+
className: "mx-auto mt-4 max-w-[560px] text-balance dark:text-[#96969f]",
|
|
49
|
+
children: note
|
|
50
|
+
})
|
|
51
|
+
}) : null
|
|
52
|
+
]
|
|
53
|
+
}),
|
|
54
|
+
visual ? /* @__PURE__ */ jsx("div", {
|
|
55
|
+
className: "mx-auto w-full max-w-[1200px] px-5 pt-7 pb-6 sm:px-8 sm:pt-12 sm:pb-28",
|
|
56
|
+
children: /* @__PURE__ */ jsx(Intro, {
|
|
57
|
+
delay: 320,
|
|
58
|
+
children: visual
|
|
59
|
+
})
|
|
60
|
+
}) : /* @__PURE__ */ jsx("div", { className: "pb-16 sm:pb-24" })
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function Intro({ children, delay }) {
|
|
65
|
+
return /* @__PURE__ */ jsx("div", {
|
|
66
|
+
className: "lar-intro w-full",
|
|
67
|
+
style: { "--lar-intro-delay": `${delay}ms` },
|
|
68
|
+
children
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export { Hero };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=Hero.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Hero.js","names":[],"sources":["../../src/showcase/Hero.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nimport { Heading, Text } from '../typography/Typography';\nimport { Backdrop } from './Stage';\n\ninterface HeroProps {\n announcement?: ReactNode;\n title: ReactNode;\n lead: ReactNode;\n actions?: ReactNode;\n note?: ReactNode;\n visual?: ReactNode;\n /** Tints the glow behind the hero with a product hue. */\n hue?: number;\n}\n\n/** A page's opening: a centred statement over the brand glow, then the product on its devices. */\nexport function Hero({ announcement, title, lead, actions, note, visual, hue }: HeroProps) {\n return (\n <section className=\"relative isolate\">\n <Backdrop hue={hue} />\n <div className=\"mx-auto flex w-full max-w-[1200px] flex-col items-center px-5 pt-8 text-center sm:px-8 sm:pt-16 lg:pt-16\">\n {announcement ? <Intro delay={0}>{announcement}</Intro> : null}\n <Intro delay={60}>\n <Heading as=\"h1\" variant=\"display\" className=\"mx-auto mt-5 max-w-[920px] whitespace-pre-line\">\n {title}\n </Heading>\n </Intro>\n <Intro delay={140}>\n <Text variant=\"lead\" tone=\"muted\" className=\"mx-auto mt-5 max-w-[640px]\">\n {lead}\n </Text>\n </Intro>\n {actions ? (\n <Intro delay={220}>\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row sm:flex-wrap max-sm:[&>a]:w-full max-sm:[&>a]:max-w-[320px]\">\n {actions}\n </div>\n </Intro>\n ) : null}\n {note ? (\n <Intro delay={280}>\n <Text\n variant=\"body\"\n tone=\"muted\"\n className=\"mx-auto mt-4 max-w-[560px] text-balance dark:text-[#96969f]\"\n >\n {note}\n </Text>\n </Intro>\n ) : null}\n </div>\n {visual ? (\n <div className=\"mx-auto w-full max-w-[1200px] px-5 pt-7 pb-6 sm:px-8 sm:pt-12 sm:pb-28\">\n <Intro delay={320}>{visual}</Intro>\n </div>\n ) : (\n <div className=\"pb-16 sm:pb-24\" />\n )}\n </section>\n );\n}\n\nfunction Intro({ children, delay }: { children: ReactNode; delay: number }) {\n return (\n <div className=\"lar-intro w-full\" style={{ '--lar-intro-delay': `${delay}ms` } as CSSProperties}>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;AAiBA,SAAgB,KAAK,EAAE,cAAc,OAAO,MAAM,SAAS,MAAM,QAAQ,OAAkB;CACvF,OACI,qBAAC,WAAD;EAAS,WAAU;EAAnB,UAAA;GACI,oBAAC,UAAD,EAAe,IAAM,CAAA;GACrB,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACK,eAAe,oBAAC,OAAD;MAAO,OAAO;MAAI,UAAA;KAAoB,CAAA,IAAI;KAC1D,oBAAC,OAAD;MAAO,OAAO;MACV,UAAA,oBAAC,SAAD;OAAS,IAAG;OAAK,SAAQ;OAAU,WAAU;OACxC,UAAA;MACI,CAAA;KACN,CAAA;KACP,oBAAC,OAAD;MAAO,OAAO;MACV,UAAA,oBAAC,MAAD;OAAM,SAAQ;OAAO,MAAK;OAAQ,WAAU;OACvC,UAAA;MACC,CAAA;KACH,CAAA;KACN,UACG,oBAAC,OAAD;MAAO,OAAO;MACV,UAAA,oBAAC,OAAD;OAAK,WAAU;OACV,UAAA;MACA,CAAA;KACF,CAAA,IACP;KACH,OACG,oBAAC,OAAD;MAAO,OAAO;MACV,UAAA,oBAAC,MAAD;OACI,SAAQ;OACR,MAAK;OACL,WAAU;OAET,UAAA;MACC,CAAA;KACH,CAAA,IACP;IACH;;GACJ,SACG,oBAAC,OAAD;IAAK,WAAU;IACX,UAAA,oBAAC,OAAD;KAAO,OAAO;KAAM,UAAA;IAAc,CAAA;GACjC,CAAA,IAEL,oBAAC,OAAD,EAAK,WAAU,iBAAkB,CAAA;EAEhC;;AAEjB;AAEA,SAAS,MAAM,EAAE,UAAU,SAAiD;CACxE,OACI,oBAAC,OAAD;EAAK,WAAU;EAAmB,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;EACxE;CACA,CAAA;AAEb"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ConceptPhoto {
|
|
2
|
+
src: string;
|
|
3
|
+
alt: string;
|
|
4
|
+
/** Whether the photo matches the search shown above the grid. */
|
|
5
|
+
match: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** An illustration, not a screenshot: a search over your own photo library, with the matches lit. Its label says
|
|
8
|
+
* it is a concept. */
|
|
9
|
+
export declare function PhotoSearchConcept({ query, photos, label }: {
|
|
10
|
+
query: string;
|
|
11
|
+
photos: readonly ConceptPhoto[];
|
|
12
|
+
label: string;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=PhotoSearchConcept.d.ts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { SearchIcon } from "lucide-react";
|
|
3
|
+
// src/showcase/PhotoSearchConcept.tsx
|
|
4
|
+
/** An illustration, not a screenshot: a search over your own photo library, with the matches lit. Its label says
|
|
5
|
+
* it is a concept. */
|
|
6
|
+
function PhotoSearchConcept({ query, photos, label }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs("figure", {
|
|
8
|
+
className: "flex flex-col gap-3",
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ jsxs("div", {
|
|
11
|
+
className: "border-base-300 bg-base-100/80 text-base-content dark:bg-base-200/70 [&>svg]:text-base-600 flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm [&>svg]:size-4",
|
|
12
|
+
children: [/* @__PURE__ */ jsx(SearchIcon, {}), /* @__PURE__ */ jsx("span", {
|
|
13
|
+
className: "truncate",
|
|
14
|
+
children: query
|
|
15
|
+
})]
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ jsx("ul", {
|
|
18
|
+
className: "grid grid-cols-3 gap-1.5",
|
|
19
|
+
children: photos.map((photo) => /* @__PURE__ */ jsxs("li", {
|
|
20
|
+
className: "relative overflow-hidden rounded-md",
|
|
21
|
+
children: [/* @__PURE__ */ jsx("img", {
|
|
22
|
+
src: photo.src,
|
|
23
|
+
alt: photo.alt,
|
|
24
|
+
loading: "lazy",
|
|
25
|
+
width: 320,
|
|
26
|
+
height: 320,
|
|
27
|
+
className: `aspect-square w-full object-cover transition-opacity ${photo.match ? "" : "opacity-35"}`
|
|
28
|
+
}), photo.match ? /* @__PURE__ */ jsx("span", {
|
|
29
|
+
"aria-hidden": "true",
|
|
30
|
+
className: "absolute inset-0 rounded-md ring-2 ring-white/80 ring-inset"
|
|
31
|
+
}) : null]
|
|
32
|
+
}, photo.src))
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ jsx("figcaption", {
|
|
35
|
+
className: "text-base-700 text-xs",
|
|
36
|
+
children: label
|
|
37
|
+
})
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export { PhotoSearchConcept };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=PhotoSearchConcept.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhotoSearchConcept.js","names":[],"sources":["../../src/showcase/PhotoSearchConcept.tsx"],"sourcesContent":["import { SearchIcon } from 'lucide-react';\n\nexport interface ConceptPhoto {\n src: string;\n alt: string;\n /** Whether the photo matches the search shown above the grid. */\n match: boolean;\n}\n\n/** An illustration, not a screenshot: a search over your own photo library, with the matches lit. Its label says\n * it is a concept. */\nexport function PhotoSearchConcept({\n query,\n photos,\n label,\n}: {\n query: string;\n photos: readonly ConceptPhoto[];\n label: string;\n}) {\n return (\n <figure className=\"flex flex-col gap-3\">\n <div className=\"border-base-300 bg-base-100/80 text-base-content dark:bg-base-200/70 [&>svg]:text-base-600 flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm [&>svg]:size-4\">\n <SearchIcon />\n <span className=\"truncate\">{query}</span>\n </div>\n <ul className=\"grid grid-cols-3 gap-1.5\">\n {photos.map((photo) => (\n <li key={photo.src} className=\"relative overflow-hidden rounded-md\">\n <img\n src={photo.src}\n alt={photo.alt}\n loading=\"lazy\"\n width={320}\n height={320}\n className={`aspect-square w-full object-cover transition-opacity ${photo.match ? '' : 'opacity-35'}`}\n />\n {photo.match ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-0 rounded-md ring-2 ring-white/80 ring-inset\"\n />\n ) : null}\n </li>\n ))}\n </ul>\n <figcaption className=\"text-base-700 text-xs\">{label}</figcaption>\n </figure>\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,mBAAmB,EAC/B,OACA,QACA,SAKD;CACC,OACI,qBAAC,UAAD;EAAQ,WAAU;EAAlB,UAAA;GACI,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,oBAAC,YAAD,CAAa,CAAA,GACb,oBAAC,QAAD;KAAM,WAAU;KAAY,UAAA;IAAY,CAAA,CACvC;;GACL,oBAAC,MAAD;IAAI,WAAU;IACT,UAAA,OAAO,KAAK,UACT,qBAAC,MAAD;KAAoB,WAAU;KAA9B,UAAA,CACI,oBAAC,OAAD;MACI,KAAK,MAAM;MACX,KAAK,MAAM;MACX,SAAQ;MACR,OAAO;MACP,QAAQ;MACR,WAAW,wDAAwD,MAAM,QAAQ,KAAK;KACzF,CAAA,GACA,MAAM,QACH,oBAAC,QAAD;MACI,eAAY;MACZ,WAAU;KACb,CAAA,IACD,IACJ;IAfK,GAAA,MAAM,GAeX,CACP;GACD,CAAA;GACJ,oBAAC,cAAD;IAAY,WAAU;IAAyB,UAAA;GAAkB,CAAA;EAC7D;;AAEhB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Readiness } from "./Status.js";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
export interface Platform {
|
|
4
|
+
name: string;
|
|
5
|
+
detail: string;
|
|
6
|
+
icon: ReactNode;
|
|
7
|
+
status: Readiness;
|
|
8
|
+
statusLabel: string;
|
|
9
|
+
}
|
|
10
|
+
/** Every screen Lar reaches, each with where it stands: compact rows on phones, cards on wider screens. */
|
|
11
|
+
export declare function PlatformGrid({ platforms, label }: {
|
|
12
|
+
platforms: readonly Platform[];
|
|
13
|
+
label: string;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=Platforms.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { StatusPill } from "./Status.js";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
// src/showcase/Platforms.tsx
|
|
4
|
+
/** Every screen Lar reaches, each with where it stands: compact rows on phones, cards on wider screens. */
|
|
5
|
+
function PlatformGrid({ platforms, label }) {
|
|
6
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
7
|
+
"aria-label": label,
|
|
8
|
+
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:grid-cols-2 sm:gap-3 sm:divide-y-0 sm:rounded-none sm:border-0 sm:bg-transparent lg:grid-cols-4 sm:dark:bg-transparent",
|
|
9
|
+
children: platforms.map((platform) => /* @__PURE__ */ jsxs("li", {
|
|
10
|
+
"data-status": platform.status,
|
|
11
|
+
className: "sm:border-base-300/80 sm:bg-base-100/60 sm:dark:bg-base-100/40 flex items-start gap-3 p-4 sm:flex-col sm:items-stretch sm:gap-4 sm:rounded-2xl sm:border sm:p-5 sm:data-[status=planned]:border-dashed sm:data-[status=planned]:bg-transparent",
|
|
12
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
13
|
+
className: "flex shrink-0 items-start justify-between gap-3",
|
|
14
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
15
|
+
className: "bg-base-200 text-base-800 ring-base-300/70 dark:bg-base-300/60 inline-flex size-9 items-center justify-center rounded-[0.65rem] ring-1 ring-inset sm:size-10 [&>svg]:size-[18px] sm:[&>svg]:size-5",
|
|
16
|
+
children: platform.icon
|
|
17
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
18
|
+
className: "hidden sm:inline-flex",
|
|
19
|
+
children: /* @__PURE__ */ jsx(StatusPill, {
|
|
20
|
+
status: platform.status,
|
|
21
|
+
children: platform.statusLabel
|
|
22
|
+
})
|
|
23
|
+
})]
|
|
24
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
25
|
+
className: "flex min-w-0 flex-1 flex-col gap-0.5 sm:gap-1",
|
|
26
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
27
|
+
className: "flex flex-wrap items-center gap-x-2 gap-y-1",
|
|
28
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
29
|
+
className: "text-base-content text-[15px] font-semibold tracking-[-0.01em]",
|
|
30
|
+
children: platform.name
|
|
31
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
32
|
+
className: "sm:hidden",
|
|
33
|
+
children: /* @__PURE__ */ jsx(StatusPill, {
|
|
34
|
+
status: platform.status,
|
|
35
|
+
children: platform.statusLabel
|
|
36
|
+
})
|
|
37
|
+
})]
|
|
38
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: "text-base-700 text-sm leading-5",
|
|
40
|
+
children: platform.detail
|
|
41
|
+
})]
|
|
42
|
+
})]
|
|
43
|
+
}, platform.name))
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export { PlatformGrid };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=Platforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Platforms.js","names":[],"sources":["../../src/showcase/Platforms.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { type Readiness, StatusPill } from './Status';\n\nexport interface Platform {\n name: string;\n detail: string;\n icon: ReactNode;\n status: Readiness;\n statusLabel: string;\n}\n\n/** Every screen Lar reaches, each with where it stands: compact rows on phones, cards on wider screens. */\nexport function PlatformGrid({ platforms, label }: { platforms: readonly Platform[]; label: string }) {\n return (\n <ul\n aria-label={label}\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:grid-cols-2 sm:gap-3 sm:divide-y-0 sm:rounded-none sm:border-0 sm:bg-transparent lg:grid-cols-4 sm:dark:bg-transparent\"\n >\n {platforms.map((platform) => (\n <li\n key={platform.name}\n data-status={platform.status}\n className=\"sm:border-base-300/80 sm:bg-base-100/60 sm:dark:bg-base-100/40 flex items-start gap-3 p-4 sm:flex-col sm:items-stretch sm:gap-4 sm:rounded-2xl sm:border sm:p-5 sm:data-[status=planned]:border-dashed sm:data-[status=planned]:bg-transparent\"\n >\n <div className=\"flex shrink-0 items-start justify-between gap-3\">\n <span className=\"bg-base-200 text-base-800 ring-base-300/70 dark:bg-base-300/60 inline-flex size-9 items-center justify-center rounded-[0.65rem] ring-1 ring-inset sm:size-10 [&>svg]:size-[18px] sm:[&>svg]:size-5\">\n {platform.icon}\n </span>\n <span className=\"hidden sm:inline-flex\">\n <StatusPill status={platform.status}>{platform.statusLabel}</StatusPill>\n </span>\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5 sm:gap-1\">\n <span className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"text-base-content text-[15px] font-semibold tracking-[-0.01em]\">\n {platform.name}\n </span>\n <span className=\"sm:hidden\">\n <StatusPill status={platform.status}>{platform.statusLabel}</StatusPill>\n </span>\n </span>\n <span className=\"text-base-700 text-sm leading-5\">{platform.detail}</span>\n </div>\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;;AAaA,SAAgB,aAAa,EAAE,WAAW,SAA4D;CAClG,OACI,oBAAC,MAAD;EACI,cAAY;EACZ,WAAU;EAET,UAAA,UAAU,KAAK,aACZ,qBAAC,MAAD;GAEI,eAAa,SAAS;GACtB,WAAU;GAHd,UAAA,CAKI,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,oBAAC,QAAD;KAAM,WAAU;KACX,UAAA,SAAS;IACR,CAAA,GACN,oBAAC,QAAD;KAAM,WAAU;KACZ,UAAA,oBAAC,YAAD;MAAY,QAAQ,SAAS;MAAS,UAAA,SAAS;KAAwB,CAAA;IACrE,CAAA,CACL;GACL,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACI,oBAAC,QAAD;MAAM,WAAU;MACX,UAAA,SAAS;KACR,CAAA,GACN,oBAAC,QAAD;MAAM,WAAU;MACZ,UAAA,oBAAC,YAAD;OAAY,QAAQ,SAAS;OAAS,UAAA,SAAS;MAAwB,CAAA;KACrE,CAAA,CACJ;IACN,CAAA,GAAA,oBAAC,QAAD;KAAM,WAAU;KAAmC,UAAA,SAAS;IAAa,CAAA,CACxE;GACL,CAAA,CAAA;EAvBK,GAAA,SAAS,IAuBd,CACP;CACD,CAAA;AAEZ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
export interface ProductEntry {
|
|
3
|
+
name: string;
|
|
4
|
+
icon: ReactNode;
|
|
5
|
+
status: ReactNode;
|
|
6
|
+
summary: string;
|
|
7
|
+
href: string;
|
|
8
|
+
}
|
|
9
|
+
/** The family of products under a hero, one compact entry each, wrapping as the family grows. */
|
|
10
|
+
export declare function ProductIndex({ products, label, onNavigate }: {
|
|
11
|
+
products: readonly ProductEntry[];
|
|
12
|
+
label: string;
|
|
13
|
+
onNavigate: (href: string) => void;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
interface ProductBandProps {
|
|
16
|
+
/** The band's colour world: a hue and how strongly it shows. */
|
|
17
|
+
hue: number;
|
|
18
|
+
chroma?: number;
|
|
19
|
+
icon: ReactNode;
|
|
20
|
+
name: string;
|
|
21
|
+
status: ReactNode;
|
|
22
|
+
title: string;
|
|
23
|
+
description: string;
|
|
24
|
+
actions: ReactNode;
|
|
25
|
+
media: ReactNode;
|
|
26
|
+
/** Puts the media on the left. */
|
|
27
|
+
reverse?: boolean;
|
|
28
|
+
/** A short line under the actions, such as requirements. */
|
|
29
|
+
note?: ReactNode;
|
|
30
|
+
}
|
|
31
|
+
/** One product's own space on a page that presents several: its colour, its devices, its way in. */
|
|
32
|
+
export declare function ProductBand({ hue, chroma, icon, name, status, title, description, actions, media, reverse, note }: ProductBandProps): import("react").JSX.Element;
|
|
33
|
+
/** Product bands one after another, as many as the family has. */
|
|
34
|
+
export declare function ProductBands({ children }: {
|
|
35
|
+
children: ReactNode;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=ProductBand.d.ts.map
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { tabbable } from "../foundations/KeyboardFocus.js";
|
|
2
|
+
import { Heading, Text } from "../typography/Typography.js";
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { ArrowRightIcon } from "lucide-react";
|
|
6
|
+
// src/showcase/ProductBand.tsx
|
|
7
|
+
/** The family of products under a hero, one compact entry each, wrapping as the family grows. */
|
|
8
|
+
function ProductIndex({ products, label, onNavigate }) {
|
|
9
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
10
|
+
"aria-label": label,
|
|
11
|
+
className: "mx-auto flex max-w-[880px] flex-wrap justify-center gap-3",
|
|
12
|
+
children: products.map((product) => /* @__PURE__ */ jsx("li", {
|
|
13
|
+
className: "w-full sm:w-[calc(50%-0.375rem)] lg:w-[calc(50%-0.375rem)]",
|
|
14
|
+
children: /* @__PURE__ */ jsxs("a", {
|
|
15
|
+
...tabbable,
|
|
16
|
+
href: product.href,
|
|
17
|
+
onClick: (event) => {
|
|
18
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
onNavigate(product.href);
|
|
21
|
+
},
|
|
22
|
+
className: "group/entry border-base-300 bg-base-100/70 hover:border-base-400 focus-visible:outline-primary dark:bg-base-100/50 flex h-full items-center gap-3 rounded-2xl border px-4 py-3 text-left shadow-xs/5 backdrop-blur transition-[border-color,background-color] focus-visible:outline-2",
|
|
23
|
+
children: [
|
|
24
|
+
product.icon,
|
|
25
|
+
/* @__PURE__ */ jsxs("span", {
|
|
26
|
+
className: "flex min-w-0 flex-1 flex-col gap-1",
|
|
27
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
28
|
+
className: "flex flex-wrap items-center gap-2",
|
|
29
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
30
|
+
className: "text-base-content text-[15px] font-semibold tracking-[-0.01em]",
|
|
31
|
+
children: product.name
|
|
32
|
+
}), product.status]
|
|
33
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
34
|
+
className: "text-base-700 text-sm leading-5",
|
|
35
|
+
children: product.summary
|
|
36
|
+
})]
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: "text-base-600 inline-flex transition-transform duration-200 group-hover/entry:translate-x-0.5 [&_svg]:size-4",
|
|
40
|
+
children: /* @__PURE__ */ jsx(ArrowRightIcon, {})
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
})
|
|
44
|
+
}, product.href))
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** One product's own space on a page that presents several: its colour, its devices, its way in. */
|
|
48
|
+
function ProductBand({ hue, chroma = .13, icon, name, status, title, description, actions, media, reverse, note }) {
|
|
49
|
+
const id = useId();
|
|
50
|
+
return /* @__PURE__ */ jsxs("article", {
|
|
51
|
+
"aria-labelledby": id,
|
|
52
|
+
className: "border-base-300 bg-base-100 dark:bg-base-100/70 relative isolate overflow-hidden rounded-[2rem] border",
|
|
53
|
+
style: {
|
|
54
|
+
"--lar-band-hue": hue,
|
|
55
|
+
"--lar-band-chroma": chroma
|
|
56
|
+
},
|
|
57
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
58
|
+
"aria-hidden": "true",
|
|
59
|
+
className: "absolute inset-0 -z-10 bg-[radial-gradient(70%_90%_at_var(--lar-band-x)_50%,oklch(0.6_var(--lar-band-chroma)_var(--lar-band-hue)/0.24),transparent_70%)] dark:bg-[radial-gradient(70%_90%_at_var(--lar-band-x)_50%,oklch(0.42_var(--lar-band-chroma)_var(--lar-band-hue)/0.45),transparent_70%)]",
|
|
60
|
+
style: { "--lar-band-x": reverse ? "20%" : "80%" }
|
|
61
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
62
|
+
className: `grid items-center gap-5 p-6 sm:p-10 lg:gap-12 lg:p-12 ${reverse ? "lg:grid-cols-[minmax(0,8fr)_minmax(0,4fr)]" : "lg:grid-cols-[minmax(0,4fr)_minmax(0,8fr)]"}`,
|
|
63
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
64
|
+
className: `contents lg:flex lg:flex-col lg:gap-5 ${reverse ? "lg:order-2" : ""}`,
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsxs("div", {
|
|
67
|
+
className: "order-1 flex items-center gap-3 lg:order-none",
|
|
68
|
+
children: [
|
|
69
|
+
icon,
|
|
70
|
+
/* @__PURE__ */ jsx(Text, {
|
|
71
|
+
as: "span",
|
|
72
|
+
variant: "label",
|
|
73
|
+
children: name
|
|
74
|
+
}),
|
|
75
|
+
status
|
|
76
|
+
]
|
|
77
|
+
}),
|
|
78
|
+
/* @__PURE__ */ jsx(Heading, {
|
|
79
|
+
id,
|
|
80
|
+
as: "h2",
|
|
81
|
+
variant: "feature",
|
|
82
|
+
className: "order-2 lg:order-none lg:text-[1.875rem] lg:leading-[1.15]",
|
|
83
|
+
children: title
|
|
84
|
+
}),
|
|
85
|
+
/* @__PURE__ */ jsx(Text, {
|
|
86
|
+
variant: "lead",
|
|
87
|
+
tone: "muted",
|
|
88
|
+
className: "order-4 lg:order-none",
|
|
89
|
+
children: description
|
|
90
|
+
}),
|
|
91
|
+
/* @__PURE__ */ jsxs("div", {
|
|
92
|
+
className: "order-5 mt-1 flex flex-col gap-3 lg:order-none",
|
|
93
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
94
|
+
className: "flex flex-wrap items-center gap-3 max-sm:flex-col max-sm:[&>a]:w-full",
|
|
95
|
+
children: actions
|
|
96
|
+
}), note ? /* @__PURE__ */ jsx(Text, {
|
|
97
|
+
variant: "caption",
|
|
98
|
+
tone: "muted",
|
|
99
|
+
className: "dark:text-[#96969f]",
|
|
100
|
+
children: note
|
|
101
|
+
}) : null]
|
|
102
|
+
})
|
|
103
|
+
]
|
|
104
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
105
|
+
className: `order-3 my-3 lg:my-0 ${reverse ? "lg:order-1" : "lg:order-none"}`,
|
|
106
|
+
children: media
|
|
107
|
+
})]
|
|
108
|
+
})]
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/** Product bands one after another, as many as the family has. */
|
|
112
|
+
function ProductBands({ children }) {
|
|
113
|
+
return /* @__PURE__ */ jsx("div", {
|
|
114
|
+
className: "flex flex-col gap-6 sm:gap-8",
|
|
115
|
+
children
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
export { ProductBand, ProductBands, ProductIndex };
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=ProductBand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductBand.js","names":[],"sources":["../../src/showcase/ProductBand.tsx"],"sourcesContent":["import { ArrowRightIcon } from 'lucide-react';\nimport { type CSSProperties, type ReactNode, useId } from 'react';\n\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { Heading, Text } from '../typography/Typography';\n\nexport interface ProductEntry {\n name: string;\n icon: ReactNode;\n status: ReactNode;\n summary: string;\n href: string;\n}\n\n/** The family of products under a hero, one compact entry each, wrapping as the family grows. */\nexport function ProductIndex({\n products,\n label,\n onNavigate,\n}: {\n products: readonly ProductEntry[];\n label: string;\n onNavigate: (href: string) => void;\n}) {\n return (\n <ul aria-label={label} className=\"mx-auto flex max-w-[880px] flex-wrap justify-center gap-3\">\n {products.map((product) => (\n <li key={product.href} className=\"w-full sm:w-[calc(50%-0.375rem)] lg:w-[calc(50%-0.375rem)]\">\n <a\n {...tabbable}\n href={product.href}\n onClick={(event) => {\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;\n\n event.preventDefault();\n onNavigate(product.href);\n }}\n className=\"group/entry border-base-300 bg-base-100/70 hover:border-base-400 focus-visible:outline-primary dark:bg-base-100/50 flex h-full items-center gap-3 rounded-2xl border px-4 py-3 text-left shadow-xs/5 backdrop-blur transition-[border-color,background-color] focus-visible:outline-2\"\n >\n {product.icon}\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-base-content text-[15px] font-semibold tracking-[-0.01em]\">\n {product.name}\n </span>\n {product.status}\n </span>\n <span className=\"text-base-700 text-sm leading-5\">{product.summary}</span>\n </span>\n <span className=\"text-base-600 inline-flex transition-transform duration-200 group-hover/entry:translate-x-0.5 [&_svg]:size-4\">\n <ArrowRightIcon />\n </span>\n </a>\n </li>\n ))}\n </ul>\n );\n}\n\ninterface ProductBandProps {\n /** The band's colour world: a hue and how strongly it shows. */\n hue: number;\n chroma?: number;\n icon: ReactNode;\n name: string;\n status: ReactNode;\n title: string;\n description: string;\n actions: ReactNode;\n media: ReactNode;\n /** Puts the media on the left. */\n reverse?: boolean;\n /** A short line under the actions, such as requirements. */\n note?: ReactNode;\n}\n\n/** One product's own space on a page that presents several: its colour, its devices, its way in. */\nexport function ProductBand({\n hue,\n chroma = 0.13,\n icon,\n name,\n status,\n title,\n description,\n actions,\n media,\n reverse,\n note,\n}: ProductBandProps) {\n const id = useId();\n\n return (\n <article\n aria-labelledby={id}\n className=\"border-base-300 bg-base-100 dark:bg-base-100/70 relative isolate overflow-hidden rounded-[2rem] border\"\n style={{ '--lar-band-hue': hue, '--lar-band-chroma': chroma } as CSSProperties}\n >\n <div\n aria-hidden=\"true\"\n className=\"absolute inset-0 -z-10 bg-[radial-gradient(70%_90%_at_var(--lar-band-x)_50%,oklch(0.6_var(--lar-band-chroma)_var(--lar-band-hue)/0.24),transparent_70%)] dark:bg-[radial-gradient(70%_90%_at_var(--lar-band-x)_50%,oklch(0.42_var(--lar-band-chroma)_var(--lar-band-hue)/0.45),transparent_70%)]\"\n style={{ '--lar-band-x': reverse ? '20%' : '80%' } as CSSProperties}\n />\n {/* On narrow screens the text wrapper dissolves, so the product's picture sits right under its\n heading, before the description and actions. */}\n <div\n className={`grid items-center gap-5 p-6 sm:p-10 lg:gap-12 lg:p-12 ${reverse ? 'lg:grid-cols-[minmax(0,8fr)_minmax(0,4fr)]' : 'lg:grid-cols-[minmax(0,4fr)_minmax(0,8fr)]'}`}\n >\n <div className={`contents lg:flex lg:flex-col lg:gap-5 ${reverse ? 'lg:order-2' : ''}`}>\n <div className=\"order-1 flex items-center gap-3 lg:order-none\">\n {icon}\n <Text as=\"span\" variant=\"label\">\n {name}\n </Text>\n {status}\n </div>\n <Heading\n id={id}\n as=\"h2\"\n variant=\"feature\"\n className=\"order-2 lg:order-none lg:text-[1.875rem] lg:leading-[1.15]\"\n >\n {title}\n </Heading>\n <Text variant=\"lead\" tone=\"muted\" className=\"order-4 lg:order-none\">\n {description}\n </Text>\n <div className=\"order-5 mt-1 flex flex-col gap-3 lg:order-none\">\n <div className=\"flex flex-wrap items-center gap-3 max-sm:flex-col max-sm:[&>a]:w-full\">\n {actions}\n </div>\n {note ? (\n <Text variant=\"caption\" tone=\"muted\" className=\"dark:text-[#96969f]\">\n {note}\n </Text>\n ) : null}\n </div>\n </div>\n <div className={`order-3 my-3 lg:my-0 ${reverse ? 'lg:order-1' : 'lg:order-none'}`}>{media}</div>\n </div>\n </article>\n );\n}\n\n/** Product bands one after another, as many as the family has. */\nexport function ProductBands({ children }: { children: ReactNode }) {\n return <div className=\"flex flex-col gap-6 sm:gap-8\">{children}</div>;\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,aAAa,EACzB,UACA,OACA,cAKD;CACC,OACI,oBAAC,MAAD;EAAI,cAAY;EAAO,WAAU;EAC5B,UAAA,SAAS,KAAK,YACX,oBAAC,MAAD;GAAuB,WAAU;GAC7B,UAAA,qBAAC,KAAD;IACI,GAAI;IACJ,MAAM,QAAQ;IACd,UAAU,UAAU;KAChB,IAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,WAAW,GAAG;KAE5E,MAAM,eAAe;KACrB,WAAW,QAAQ,IAAI;IAC3B;IACA,WAAU;IATd,UAAA;KAWK,QAAQ;KACT,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACI,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACI,oBAAC,QAAD;QAAM,WAAU;QACX,UAAA,QAAQ;OACP,CAAA,GACL,QAAQ,MACP;MACN,CAAA,GAAA,oBAAC,QAAD;OAAM,WAAU;OAAmC,UAAA,QAAQ;MAAc,CAAA,CACvE;;KACN,oBAAC,QAAD;MAAM,WAAU;MACZ,UAAA,oBAAC,gBAAD,CAAiB,CAAA;KACf,CAAA;IACP;;EACH,GA1BK,QAAQ,IA0Bb,CACP;CACD,CAAA;AAEZ;;AAoBA,SAAgB,YAAY,EACxB,KACA,SAAS,KACT,MACA,MACA,QACA,OACA,aACA,SACA,OACA,SACA,QACiB;CACjB,MAAM,KAAK,MAAM;CAEjB,OACI,qBAAC,WAAD;EACI,mBAAiB;EACjB,WAAU;EACV,OAAO;GAAE,kBAAkB;GAAK,qBAAqB;EAAO;EAHhE,UAAA,CAKI,oBAAC,OAAD;GACI,eAAY;GACZ,WAAU;GACV,OAAO,EAAE,gBAAgB,UAAU,QAAQ,MAAM;EACpD,CAAA,GAGD,qBAAC,OAAD;GACI,WAAW,yDAAyD,UAAU,+CAA+C;GADjI,UAAA,CAGI,qBAAC,OAAD;IAAK,WAAW,yCAAyC,UAAU,eAAe;IAAlF,UAAA;KACI,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACK;OACD,oBAAC,MAAD;QAAM,IAAG;QAAO,SAAQ;QACnB,UAAA;OACC,CAAA;OACL;MACA;;KACL,oBAAC,SAAD;MACQ;MACJ,IAAG;MACH,SAAQ;MACR,WAAU;MAET,UAAA;KACI,CAAA;KACT,oBAAC,MAAD;MAAM,SAAQ;MAAO,MAAK;MAAQ,WAAU;MACvC,UAAA;KACC,CAAA;KACN,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACI,oBAAC,OAAD;OAAK,WAAU;OACV,UAAA;MACA,CAAA,GACJ,OACG,oBAAC,MAAD;OAAM,SAAQ;OAAU,MAAK;OAAQ,WAAU;OAC1C,UAAA;MACC,CAAA,IACN,IACH;;IACJ;GACL,CAAA,GAAA,oBAAC,OAAD;IAAK,WAAW,wBAAwB,UAAU,eAAe;IAAoB,UAAA;GAAW,CAAA,CAC/F;EACA,CAAA,CAAA;;AAEjB;;AAGA,SAAgB,aAAa,EAAE,YAAqC;CAChE,OAAO,oBAAC,OAAD;EAAK,WAAU;EAAgC;CAAc,CAAA;AACxE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
export interface RoadmapItem {
|
|
3
|
+
icon: ReactNode;
|
|
4
|
+
title: string;
|
|
5
|
+
body: string;
|
|
6
|
+
/** The next big thing: a card of its own above the list, in an app's hue, with its highlights and an
|
|
7
|
+
* illustration of the idea. */
|
|
8
|
+
featured?: {
|
|
9
|
+
hue: number;
|
|
10
|
+
highlights: readonly string[];
|
|
11
|
+
visual?: ReactNode;
|
|
12
|
+
steps?: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** What is planned: a featured card for the next big thing, then quiet dashed cards that read like promises. */
|
|
16
|
+
export declare function Roadmap({ items, label, statusLabel }: {
|
|
17
|
+
items: readonly RoadmapItem[];
|
|
18
|
+
label: string;
|
|
19
|
+
statusLabel: string;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=Roadmap.d.ts.map
|