@lar-works/design-system 0.0.0-stage → 0.1.1
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 +54 -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 +71 -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,56 @@
|
|
|
1
|
+
import { Stack } from "../layout/Flow.js";
|
|
2
|
+
import { Text } from "../typography/Typography.js";
|
|
3
|
+
import { Code } from "@ninna-ui/primitives";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
// src/display/ChangeList.tsx
|
|
6
|
+
/** Before → after values grouped under the item they belong to. */
|
|
7
|
+
function ChangeList({ items, label }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(Stack, {
|
|
9
|
+
as: "ul",
|
|
10
|
+
space: "group",
|
|
11
|
+
"aria-label": label,
|
|
12
|
+
children: items.map((item) => /* @__PURE__ */ jsx("li", {
|
|
13
|
+
className: "min-w-0",
|
|
14
|
+
children: /* @__PURE__ */ jsxs(Stack, {
|
|
15
|
+
space: "tight",
|
|
16
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
17
|
+
truncate: true,
|
|
18
|
+
title: item.title,
|
|
19
|
+
variant: "label",
|
|
20
|
+
children: item.title
|
|
21
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
22
|
+
className: "space-y-1 pl-4",
|
|
23
|
+
children: item.changes.map((change) => /* @__PURE__ */ jsxs("li", {
|
|
24
|
+
className: "flex min-w-0 flex-wrap items-baseline gap-x-2",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx(Text, {
|
|
27
|
+
as: "span",
|
|
28
|
+
variant: "caption",
|
|
29
|
+
tone: "muted",
|
|
30
|
+
children: change.label
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ jsx(Code, {
|
|
33
|
+
className: "text-xs",
|
|
34
|
+
children: change.from
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ jsx(Text, {
|
|
37
|
+
as: "span",
|
|
38
|
+
"aria-hidden": "true",
|
|
39
|
+
variant: "caption",
|
|
40
|
+
tone: "muted",
|
|
41
|
+
children: "→"
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ jsx(Code, {
|
|
44
|
+
className: "text-xs",
|
|
45
|
+
children: change.to
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
}, change.key))
|
|
49
|
+
})]
|
|
50
|
+
})
|
|
51
|
+
}, item.key))
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export { ChangeList };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=ChangeList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeList.js","names":[],"sources":["../../src/display/ChangeList.tsx"],"sourcesContent":["import { Code } from '@ninna-ui/primitives';\n\nimport { Stack } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\nexport interface ChangeListItem {\n changes: readonly { from: string; key: string; label: string; to: string }[];\n key: string;\n title: string;\n}\n\n/** Before → after values grouped under the item they belong to. */\nexport function ChangeList({ items, label }: { items: readonly ChangeListItem[]; label: string }) {\n return (\n <Stack as=\"ul\" space=\"group\" aria-label={label}>\n {items.map((item) => (\n <li key={item.key} className=\"min-w-0\">\n <Stack space=\"tight\">\n <Text truncate title={item.title} variant=\"label\">\n {item.title}\n </Text>\n <ul className=\"space-y-1 pl-4\">\n {item.changes.map((change) => (\n <li key={change.key} className=\"flex min-w-0 flex-wrap items-baseline gap-x-2\">\n <Text as=\"span\" variant=\"caption\" tone=\"muted\">\n {change.label}\n </Text>\n <Code className=\"text-xs\">{change.from}</Code>\n <Text as=\"span\" aria-hidden=\"true\" variant=\"caption\" tone=\"muted\">\n →\n </Text>\n <Code className=\"text-xs\">{change.to}</Code>\n </li>\n ))}\n </ul>\n </Stack>\n </li>\n ))}\n </Stack>\n );\n}\n"],"mappings":";;;;;;AAYA,SAAgB,WAAW,EAAE,OAAO,SAA8D;CAC9F,OACI,oBAAC,OAAD;EAAO,IAAG;EAAK,OAAM;EAAQ,cAAY;EACpC,UAAA,MAAM,KAAK,SACR,oBAAC,MAAD;GAAmB,WAAU;GACzB,UAAA,qBAAC,OAAD;IAAO,OAAM;IAAb,UAAA,CACI,oBAAC,MAAD;KAAM,UAAA;KAAS,OAAO,KAAK;KAAO,SAAQ;KACrC,UAAA,KAAK;IACJ,CAAA,GACN,oBAAC,MAAD;KAAI,WAAU;KACT,UAAA,KAAK,QAAQ,KAAK,WACf,qBAAC,MAAD;MAAqB,WAAU;MAA/B,UAAA;OACI,oBAAC,MAAD;QAAM,IAAG;QAAO,SAAQ;QAAU,MAAK;QAClC,UAAA,OAAO;OACN,CAAA;OACN,oBAAC,MAAD;QAAM,WAAU;QAAW,UAAA,OAAO;OAAW,CAAA;OAC7C,oBAAC,MAAD;QAAM,IAAG;QAAO,eAAY;QAAO,SAAQ;QAAU,MAAK;QAAQ,UAAA;OAE5D,CAAA;OACN,oBAAC,MAAD;QAAM,WAAU;QAAW,UAAA,OAAO;OAAS,CAAA;MAC3C;KATK,GAAA,OAAO,GASZ,CACP;IACD,CAAA,CACD;;EACP,GApBK,KAAK,GAoBV,CACP;CACE,CAAA;AAEf"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CheckListItem {
|
|
2
|
+
key: string;
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
/** Short statements of what something does or includes, each with a check mark. */
|
|
6
|
+
export declare function CheckList({ items, label }: {
|
|
7
|
+
items: readonly CheckListItem[];
|
|
8
|
+
label: string;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=CheckList.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Text } from "../typography/Typography.js";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { CheckIcon } from "lucide-react";
|
|
4
|
+
// src/display/CheckList.tsx
|
|
5
|
+
/** Short statements of what something does or includes, each with a check mark. */
|
|
6
|
+
function CheckList({ items, label }) {
|
|
7
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
8
|
+
"aria-label": label,
|
|
9
|
+
className: "space-y-2",
|
|
10
|
+
children: items.map((item) => /* @__PURE__ */ jsxs("li", {
|
|
11
|
+
className: "flex min-w-0 items-start gap-2",
|
|
12
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
13
|
+
"aria-hidden": "true",
|
|
14
|
+
className: "text-success mt-0.5 flex size-4 shrink-0 items-center justify-center [&>svg]:size-4",
|
|
15
|
+
children: /* @__PURE__ */ jsx(CheckIcon, {})
|
|
16
|
+
}), /* @__PURE__ */ jsx(Text, {
|
|
17
|
+
as: "span",
|
|
18
|
+
children: item.text
|
|
19
|
+
})]
|
|
20
|
+
}, item.key))
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export { CheckList };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=CheckList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckList.js","names":[],"sources":["../../src/display/CheckList.tsx"],"sourcesContent":["import { CheckIcon } from 'lucide-react';\n\nimport { Text } from '../typography/Typography';\n\nexport interface CheckListItem {\n key: string;\n text: string;\n}\n\n/** Short statements of what something does or includes, each with a check mark. */\nexport function CheckList({ items, label }: { items: readonly CheckListItem[]; label: string }) {\n return (\n <ul aria-label={label} className=\"space-y-2\">\n {items.map((item) => (\n <li key={item.key} className=\"flex min-w-0 items-start gap-2\">\n <span\n aria-hidden=\"true\"\n className=\"text-success mt-0.5 flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\"\n >\n <CheckIcon />\n </span>\n <Text as=\"span\">{item.text}</Text>\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;;;AAUA,SAAgB,UAAU,EAAE,OAAO,SAA6D;CAC5F,OACI,oBAAC,MAAD;EAAI,cAAY;EAAO,WAAU;EAC5B,UAAA,MAAM,KAAK,SACR,qBAAC,MAAD;GAAmB,WAAU;GAA7B,UAAA,CACI,oBAAC,QAAD;IACI,eAAY;IACZ,WAAU;IAEV,UAAA,oBAAC,WAAD,CAAY,CAAA;GACV,CAAA,GACN,oBAAC,MAAD;IAAM,IAAG;IAAQ,UAAA,KAAK;GAAW,CAAA,CACjC;EARK,GAAA,KAAK,GAQV,CACP;CACD,CAAA;AAEZ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
// src/display/CodeBlock.tsx
|
|
3
|
+
/** Readable examples and configuration values, contained even in narrow drawers. */
|
|
4
|
+
function CodeBlock({ value, preserveLines = false }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("pre", {
|
|
6
|
+
className: `border-base-300 bg-base-100/70 text-base-800 min-w-0 rounded-lg border p-4 font-mono text-xs leading-6 ${preserveLines ? "overflow-x-auto" : "wrap-anywhere whitespace-pre-wrap"}`,
|
|
7
|
+
children: /* @__PURE__ */ jsx("code", { children: value })
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export { CodeBlock };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=CodeBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlock.js","names":[],"sources":["../../src/display/CodeBlock.tsx"],"sourcesContent":["/** Readable examples and configuration values, contained even in narrow drawers. */\nexport function CodeBlock({ value, preserveLines = false }: { value: string; preserveLines?: boolean }) {\n return (\n <pre\n className={`border-base-300 bg-base-100/70 text-base-800 min-w-0 rounded-lg border p-4 font-mono text-xs leading-6 ${\n preserveLines ? 'overflow-x-auto' : 'wrap-anywhere whitespace-pre-wrap'\n }`}\n >\n <code>{value}</code>\n </pre>\n );\n}\n"],"mappings":";;;AACA,SAAgB,UAAU,EAAE,OAAO,gBAAgB,SAAqD;CACpG,OACI,oBAAC,OAAD;EACI,WAAW,0GACP,gBAAgB,oBAAoB;EAGxC,UAAA,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA;CAClB,CAAA;AAEb"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface CopyButtonProps {
|
|
2
|
+
copiedLabel: string;
|
|
3
|
+
label: string;
|
|
4
|
+
value: string;
|
|
5
|
+
}
|
|
6
|
+
/** The LAN admin also runs over HTTP, where the async clipboard API is unavailable. */
|
|
7
|
+
export declare function CopyButton({ copiedLabel, label, value }: CopyButtonProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=CopyButton.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { IconButton } from "../actions/IconButton.js";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { CheckIcon, CopyIcon } from "lucide-react";
|
|
5
|
+
// src/display/CopyButton.tsx
|
|
6
|
+
const COPIED_FEEDBACK_MS = 1500;
|
|
7
|
+
/** The LAN admin also runs over HTTP, where the async clipboard API is unavailable. */
|
|
8
|
+
function CopyButton({ copiedLabel, label, value }) {
|
|
9
|
+
const [copiedValue, setCopiedValue] = useState(null);
|
|
10
|
+
const [copying, setCopying] = useState(false);
|
|
11
|
+
const copied = copiedValue === value;
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (copiedValue === null) return void 0;
|
|
14
|
+
const timer = window.setTimeout(() => setCopiedValue(null), COPIED_FEEDBACK_MS);
|
|
15
|
+
return () => window.clearTimeout(timer);
|
|
16
|
+
}, [copiedValue]);
|
|
17
|
+
return /* @__PURE__ */ jsx(IconButton, {
|
|
18
|
+
icon: copied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {}),
|
|
19
|
+
"aria-label": copied ? copiedLabel : label,
|
|
20
|
+
title: copied ? copiedLabel : label,
|
|
21
|
+
loading: copying,
|
|
22
|
+
onClick: async () => {
|
|
23
|
+
setCopying(true);
|
|
24
|
+
try {
|
|
25
|
+
if (navigator.clipboard) {
|
|
26
|
+
await navigator.clipboard.writeText(value);
|
|
27
|
+
setCopiedValue(value);
|
|
28
|
+
} else setCopiedValue(copySelection(value) ? value : null);
|
|
29
|
+
} catch {
|
|
30
|
+
setCopiedValue(copySelection(value) ? value : null);
|
|
31
|
+
} finally {
|
|
32
|
+
setCopying(false);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
tone: copied ? "success" : "neutral"
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function copySelection(value) {
|
|
39
|
+
if (typeof document.execCommand !== "function") return false;
|
|
40
|
+
const previousFocus = document.activeElement;
|
|
41
|
+
const input = document.createElement("textarea");
|
|
42
|
+
input.value = value;
|
|
43
|
+
input.readOnly = true;
|
|
44
|
+
input.className = "fixed -left-full top-0 opacity-0";
|
|
45
|
+
document.body.append(input);
|
|
46
|
+
input.focus({ preventScroll: true });
|
|
47
|
+
input.select();
|
|
48
|
+
try {
|
|
49
|
+
return document.execCommand("copy");
|
|
50
|
+
} catch {
|
|
51
|
+
return false;
|
|
52
|
+
} finally {
|
|
53
|
+
input.remove();
|
|
54
|
+
if (previousFocus instanceof HTMLElement) previousFocus.focus();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export { CopyButton };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=CopyButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopyButton.js","names":[],"sources":["../../src/display/CopyButton.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport { IconButton } from '../actions/IconButton';\n\nconst COPIED_FEEDBACK_MS = 1500;\n\ninterface CopyButtonProps {\n copiedLabel: string;\n label: string;\n value: string;\n}\n\n/** The LAN admin also runs over HTTP, where the async clipboard API is unavailable. */\nexport function CopyButton({ copiedLabel, label, value }: CopyButtonProps) {\n const [copiedValue, setCopiedValue] = useState<string | null>(null);\n const [copying, setCopying] = useState(false);\n const copied = copiedValue === value;\n\n useEffect(() => {\n if (copiedValue === null) return undefined;\n\n const timer = window.setTimeout(() => setCopiedValue(null), COPIED_FEEDBACK_MS);\n\n return () => window.clearTimeout(timer);\n }, [copiedValue]);\n\n return (\n <IconButton\n icon={copied ? <CheckIcon /> : <CopyIcon />}\n aria-label={copied ? copiedLabel : label}\n title={copied ? copiedLabel : label}\n loading={copying}\n onClick={async () => {\n setCopying(true);\n\n try {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(value);\n setCopiedValue(value);\n } else {\n setCopiedValue(copySelection(value) ? value : null);\n }\n } catch {\n setCopiedValue(copySelection(value) ? value : null);\n } finally {\n setCopying(false);\n }\n }}\n tone={copied ? 'success' : 'neutral'}\n />\n );\n}\n\nfunction copySelection(value: string): boolean {\n if (typeof document.execCommand !== 'function') return false;\n\n const previousFocus = document.activeElement;\n const input = document.createElement('textarea');\n\n input.value = value;\n input.readOnly = true;\n input.className = 'fixed -left-full top-0 opacity-0';\n document.body.append(input);\n input.focus({ preventScroll: true });\n input.select();\n\n try {\n return document.execCommand('copy');\n } catch {\n return false;\n } finally {\n input.remove();\n\n if (previousFocus instanceof HTMLElement) previousFocus.focus();\n }\n}\n"],"mappings":";;;;;AAKA,MAAM,qBAAqB;;AAS3B,SAAgB,WAAW,EAAE,aAAa,OAAO,SAA0B;CACvE,MAAM,CAAC,aAAa,kBAAkB,SAAwB,IAAI;CAClE,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,SAAS,gBAAgB;CAE/B,gBAAgB;EACZ,IAAI,gBAAgB,MAAM,OAAO,KAAA;EAEjC,MAAM,QAAQ,OAAO,iBAAiB,eAAe,IAAI,GAAG,kBAAkB;EAE9E,aAAa,OAAO,aAAa,KAAK;CAC1C,GAAG,CAAC,WAAW,CAAC;CAEhB,OACI,oBAAC,YAAD;EACI,MAAM,SAAS,oBAAC,WAAD,CAAY,CAAA,IAAI,oBAAC,UAAD,CAAW,CAAA;EAC1C,cAAY,SAAS,cAAc;EACnC,OAAO,SAAS,cAAc;EAC9B,SAAS;EACT,SAAS,YAAY;GACjB,WAAW,IAAI;GAEf,IAAI;IACA,IAAI,UAAU,WAAW;KACrB,MAAM,UAAU,UAAU,UAAU,KAAK;KACzC,eAAe,KAAK;IACxB,OACI,eAAe,cAAc,KAAK,IAAI,QAAQ,IAAI;GAE1D,QAAQ;IACJ,eAAe,cAAc,KAAK,IAAI,QAAQ,IAAI;GACtD,UAAU;IACN,WAAW,KAAK;GACpB;EACJ;EACA,MAAM,SAAS,YAAY;CAC9B,CAAA;AAET;AAEA,SAAS,cAAc,OAAwB;CAC3C,IAAI,OAAO,SAAS,gBAAgB,YAAY,OAAO;CAEvD,MAAM,gBAAgB,SAAS;CAC/B,MAAM,QAAQ,SAAS,cAAc,UAAU;CAE/C,MAAM,QAAQ;CACd,MAAM,WAAW;CACjB,MAAM,YAAY;CAClB,SAAS,KAAK,OAAO,KAAK;CAC1B,MAAM,MAAM,EAAE,eAAe,KAAK,CAAC;CACnC,MAAM,OAAO;CAEb,IAAI;EACA,OAAO,SAAS,YAAY,MAAM;CACtC,QAAQ;EACJ,OAAO;CACX,UAAU;EACN,MAAM,OAAO;EAEb,IAAI,yBAAyB,aAAa,cAAc,MAAM;CAClE;AACJ"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
declare const tones: {
|
|
2
|
+
readonly default: 'text-base-content';
|
|
3
|
+
readonly muted: 'text-base-700';
|
|
4
|
+
readonly warning: 'text-warning';
|
|
5
|
+
};
|
|
6
|
+
export interface DataTableCell {
|
|
7
|
+
id: string;
|
|
8
|
+
text: string;
|
|
9
|
+
/** A smaller second line under the text. */
|
|
10
|
+
detail?: string;
|
|
11
|
+
/** Shown on hover. */
|
|
12
|
+
title?: string;
|
|
13
|
+
tone?: keyof typeof tones;
|
|
14
|
+
}
|
|
15
|
+
export interface DataTableRow {
|
|
16
|
+
id: string;
|
|
17
|
+
label: string;
|
|
18
|
+
/** One per column, in column order. */
|
|
19
|
+
cells: readonly DataTableCell[];
|
|
20
|
+
}
|
|
21
|
+
interface DataTableProps {
|
|
22
|
+
columns: readonly {
|
|
23
|
+
id: string;
|
|
24
|
+
label: string;
|
|
25
|
+
}[];
|
|
26
|
+
/** Names the table for assistive technology. */
|
|
27
|
+
label: string;
|
|
28
|
+
/** Heads the first column, which labels each row. */
|
|
29
|
+
rowHeader: string;
|
|
30
|
+
rows: readonly DataTableRow[];
|
|
31
|
+
}
|
|
32
|
+
/** A compact read-only grid of values: one labelled row per item and one column per subject. */
|
|
33
|
+
export declare function DataTable({ columns, label, rowHeader, rows }: DataTableProps): import("react").JSX.Element;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
// src/display/DataTable.tsx
|
|
3
|
+
const cellSpacing = "px-4 py-2.5 sm:first:pl-5 sm:last:pr-5";
|
|
4
|
+
const tones = {
|
|
5
|
+
default: "text-base-content",
|
|
6
|
+
muted: "text-base-700",
|
|
7
|
+
warning: "text-warning"
|
|
8
|
+
};
|
|
9
|
+
/** A compact read-only grid of values: one labelled row per item and one column per subject. */
|
|
10
|
+
function DataTable({ columns, label, rowHeader, rows }) {
|
|
11
|
+
return /* @__PURE__ */ jsx("div", {
|
|
12
|
+
className: "overflow-x-auto",
|
|
13
|
+
children: /* @__PURE__ */ jsxs("table", {
|
|
14
|
+
"aria-label": label,
|
|
15
|
+
className: "w-full text-left text-sm leading-5 tabular-nums",
|
|
16
|
+
children: [/* @__PURE__ */ jsx("thead", {
|
|
17
|
+
className: "text-base-700 text-xs leading-4",
|
|
18
|
+
children: /* @__PURE__ */ jsxs("tr", {
|
|
19
|
+
className: "border-base-300 border-b",
|
|
20
|
+
children: [/* @__PURE__ */ jsx("th", {
|
|
21
|
+
scope: "col",
|
|
22
|
+
className: `${cellSpacing} font-medium`,
|
|
23
|
+
children: rowHeader
|
|
24
|
+
}), columns.map((column) => /* @__PURE__ */ jsx("th", {
|
|
25
|
+
scope: "col",
|
|
26
|
+
className: `${cellSpacing} font-medium`,
|
|
27
|
+
children: column.label
|
|
28
|
+
}, column.id))]
|
|
29
|
+
})
|
|
30
|
+
}), /* @__PURE__ */ jsx("tbody", {
|
|
31
|
+
className: "divide-base-300 divide-y",
|
|
32
|
+
children: rows.map((row) => /* @__PURE__ */ jsxs("tr", { children: [/* @__PURE__ */ jsx("th", {
|
|
33
|
+
scope: "row",
|
|
34
|
+
className: `${cellSpacing} text-base-content font-normal`,
|
|
35
|
+
children: row.label
|
|
36
|
+
}), row.cells.map((cell) => /* @__PURE__ */ jsx("td", {
|
|
37
|
+
title: cell.title,
|
|
38
|
+
className: `${cellSpacing} text-xs leading-4 ${tones[cell.tone ?? "default"]}`,
|
|
39
|
+
children: cell.detail ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
40
|
+
className: "block",
|
|
41
|
+
children: cell.text
|
|
42
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
43
|
+
className: "text-base-700 mt-0.5 block",
|
|
44
|
+
children: cell.detail
|
|
45
|
+
})] }) : cell.text
|
|
46
|
+
}, cell.id))] }, row.id))
|
|
47
|
+
})]
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export { DataTable };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=DataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.js","names":[],"sources":["../../src/display/DataTable.tsx"],"sourcesContent":["const cellSpacing = 'px-4 py-2.5 sm:first:pl-5 sm:last:pr-5';\n\nconst tones = {\n default: 'text-base-content',\n muted: 'text-base-700',\n warning: 'text-warning',\n} as const;\n\nexport interface DataTableCell {\n id: string;\n text: string;\n /** A smaller second line under the text. */\n detail?: string;\n /** Shown on hover. */\n title?: string;\n tone?: keyof typeof tones;\n}\n\nexport interface DataTableRow {\n id: string;\n label: string;\n /** One per column, in column order. */\n cells: readonly DataTableCell[];\n}\n\ninterface DataTableProps {\n columns: readonly { id: string; label: string }[];\n /** Names the table for assistive technology. */\n label: string;\n /** Heads the first column, which labels each row. */\n rowHeader: string;\n rows: readonly DataTableRow[];\n}\n\n/** A compact read-only grid of values: one labelled row per item and one column per subject. */\nexport function DataTable({ columns, label, rowHeader, rows }: DataTableProps) {\n return (\n <div className=\"overflow-x-auto\">\n <table aria-label={label} className=\"w-full text-left text-sm leading-5 tabular-nums\">\n <thead className=\"text-base-700 text-xs leading-4\">\n <tr className=\"border-base-300 border-b\">\n <th scope=\"col\" className={`${cellSpacing} font-medium`}>\n {rowHeader}\n </th>\n {columns.map((column) => (\n <th key={column.id} scope=\"col\" className={`${cellSpacing} font-medium`}>\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-base-300 divide-y\">\n {rows.map((row) => (\n <tr key={row.id}>\n <th scope=\"row\" className={`${cellSpacing} text-base-content font-normal`}>\n {row.label}\n </th>\n {row.cells.map((cell) => (\n <td\n key={cell.id}\n title={cell.title}\n className={`${cellSpacing} text-xs leading-4 ${tones[cell.tone ?? 'default']}`}\n >\n {cell.detail ? (\n <>\n <span className=\"block\">{cell.text}</span>\n <span className=\"text-base-700 mt-0.5 block\">{cell.detail}</span>\n </>\n ) : (\n cell.text\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":";;AAAA,MAAM,cAAc;AAEpB,MAAM,QAAQ;CACV,SAAS;CACT,OAAO;CACP,SAAS;AACb;;AA6BA,SAAgB,UAAU,EAAE,SAAS,OAAO,WAAW,QAAwB;CAC3E,OACI,oBAAC,OAAD;EAAK,WAAU;EACX,UAAA,qBAAC,SAAD;GAAO,cAAY;GAAO,WAAU;GAApC,UAAA,CACI,oBAAC,SAAD;IAAO,WAAU;IACb,UAAA,qBAAC,MAAD;KAAI,WAAU;KAAd,UAAA,CACI,oBAAC,MAAD;MAAI,OAAM;MAAM,WAAW,GAAG,YAAY;MACrC,UAAA;KACD,CAAA,GACH,QAAQ,KAAK,WACV,oBAAC,MAAD;MAAoB,OAAM;MAAM,WAAW,GAAG,YAAY;MACrD,UAAA,OAAO;KACR,GAFK,OAAO,EAEZ,CACP,CACD;;GACD,CAAA,GACP,oBAAC,SAAD;IAAO,WAAU;IACZ,UAAA,KAAK,KAAK,QACP,qBAAC,MAAD,EAAA,UAAA,CACI,oBAAC,MAAD;KAAI,OAAM;KAAM,WAAW,GAAG,YAAY;KACrC,UAAA,IAAI;IACL,CAAA,GACH,IAAI,MAAM,KAAK,SACZ,oBAAC,MAAD;KAEI,OAAO,KAAK;KACZ,WAAW,GAAG,YAAY,qBAAqB,MAAM,KAAK,QAAQ;KAEjE,UAAA,KAAK,SACF,qBAAA,UAAA,EAAA,UAAA,CACI,oBAAC,QAAD;MAAM,WAAU;MAAS,UAAA,KAAK;KAAW,CAAA,GACzC,oBAAC,QAAD;MAAM,WAAU;MAA8B,UAAA,KAAK;KAAa,CAAA,CAClE,EAAA,CAAA,IAEF,KAAK;IAET,GAZK,KAAK,EAYV,CACP,CACD,EAAA,GApBK,IAAI,EAoBT,CACP;GACE,CAAA,CACJ;;CACN,CAAA;AAEb"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
type DetailHeroProps = {
|
|
3
|
+
loading: true;
|
|
4
|
+
loadingLabel: string;
|
|
5
|
+
summary?: boolean;
|
|
6
|
+
description?: boolean;
|
|
7
|
+
details?: number;
|
|
8
|
+
} | {
|
|
9
|
+
loading?: false;
|
|
10
|
+
actions?: ReactNode;
|
|
11
|
+
artwork: ReactNode;
|
|
12
|
+
backgroundSrc?: string;
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
label: string;
|
|
15
|
+
subtitle?: ReactNode;
|
|
16
|
+
summary?: ReactNode;
|
|
17
|
+
title: string;
|
|
18
|
+
titleLevel?: 'h1' | 'h2';
|
|
19
|
+
titleLogoSrc?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function DetailHero(props: DetailHeroProps): import("react").JSX.Element;
|
|
22
|
+
export declare function DetailHeroDetails({ children }: {
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
25
|
+
type DetailProps = {
|
|
26
|
+
loading: true;
|
|
27
|
+
} | {
|
|
28
|
+
loading?: false;
|
|
29
|
+
label: string;
|
|
30
|
+
value: ReactNode;
|
|
31
|
+
};
|
|
32
|
+
export declare function DetailHeroDetail(props: DetailProps): import("react").JSX.Element;
|
|
33
|
+
export declare function DetailHeroTags({ label, moreLabel, values }: {
|
|
34
|
+
label: string;
|
|
35
|
+
moreLabel: string;
|
|
36
|
+
values: readonly string[];
|
|
37
|
+
}): import("react").JSX.Element | null;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=DetailHero.d.ts.map
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Button } from "../actions/Button.js";
|
|
2
|
+
import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
|
|
3
|
+
import { Popover } from "../overlays/Popover.js";
|
|
4
|
+
import { Heading, Text } from "../typography/Typography.js";
|
|
5
|
+
import { Badge } from "./Badge.js";
|
|
6
|
+
import { TextPreview } from "./TextPreview.js";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
// src/display/DetailHero.tsx
|
|
9
|
+
function DetailHero(props) {
|
|
10
|
+
const loading = props.loading === true;
|
|
11
|
+
const background = !props.loading && props.backgroundSrc;
|
|
12
|
+
return /* @__PURE__ */ jsx(SkeletonLoader, {
|
|
13
|
+
loading,
|
|
14
|
+
label: props.loading ? props.loadingLabel : "",
|
|
15
|
+
children: /* @__PURE__ */ jsxs("section", {
|
|
16
|
+
className: "relative isolate min-w-0 pb-4",
|
|
17
|
+
children: [background ? /* @__PURE__ */ jsxs("div", {
|
|
18
|
+
"aria-hidden": "true",
|
|
19
|
+
className: "pointer-events-none absolute inset-x-0 -top-2 bottom-0 -z-10 overflow-hidden rounded-2xl [mask-image:linear-gradient(to_bottom,black_55%,transparent)]",
|
|
20
|
+
children: [/* @__PURE__ */ jsx("img", {
|
|
21
|
+
src: background,
|
|
22
|
+
alt: "",
|
|
23
|
+
className: "size-full object-cover opacity-35"
|
|
24
|
+
}), /* @__PURE__ */ jsx("div", { className: "from-base-50 via-base-50/60 to-base-50/20 absolute inset-0 bg-linear-to-t" })]
|
|
25
|
+
}) : null, /* @__PURE__ */ jsxs("div", {
|
|
26
|
+
className: `grid gap-6 sm:grid-cols-[10rem_minmax(0,1fr)] sm:items-center md:grid-cols-[14rem_minmax(0,1fr)] md:gap-8 ${background ? "p-4 sm:p-5" : ""}`,
|
|
27
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
28
|
+
className: "ring-base-900/10 w-40 self-start overflow-hidden rounded-lg shadow-md ring-1 md:w-full",
|
|
29
|
+
children: props.loading ? /* @__PURE__ */ jsx(SkeletonLoader.Shape, { presentation: "artwork" }) : props.artwork
|
|
30
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
31
|
+
className: "flex min-w-0 flex-col gap-5 md:gap-6",
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsxs("div", {
|
|
34
|
+
className: "min-w-0",
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ jsx(Text, {
|
|
37
|
+
variant: "overline",
|
|
38
|
+
tone: "muted",
|
|
39
|
+
className: `mb-2 ${loading ? "max-w-32" : ""}`,
|
|
40
|
+
loading,
|
|
41
|
+
children: !props.loading && props.label
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ jsxs("div", {
|
|
44
|
+
className: "flex min-h-8 min-w-0 flex-wrap items-center gap-5",
|
|
45
|
+
children: [/* @__PURE__ */ jsx(Heading, {
|
|
46
|
+
as: props.loading ? "h2" : props.titleLevel ?? "h2",
|
|
47
|
+
variant: "hero",
|
|
48
|
+
className: `min-w-0 wrap-break-word ${loading ? "w-3/4 max-w-xl" : ""}`,
|
|
49
|
+
loading,
|
|
50
|
+
children: !props.loading && (props.titleLogoSrc ? /* @__PURE__ */ jsx("img", {
|
|
51
|
+
src: props.titleLogoSrc,
|
|
52
|
+
alt: props.title,
|
|
53
|
+
className: "max-h-28 w-auto max-w-full object-contain object-left sm:max-w-sm"
|
|
54
|
+
}) : props.title)
|
|
55
|
+
}), !props.loading && props.actions ? /* @__PURE__ */ jsx("div", {
|
|
56
|
+
className: "flex max-w-full shrink-0 flex-wrap items-center gap-3",
|
|
57
|
+
children: props.actions
|
|
58
|
+
}) : null]
|
|
59
|
+
}),
|
|
60
|
+
props.loading || props.subtitle ? /* @__PURE__ */ jsx(Text, {
|
|
61
|
+
variant: "description",
|
|
62
|
+
tone: "muted",
|
|
63
|
+
className: `mt-2 wrap-break-word ${loading ? "max-w-sm" : ""}`,
|
|
64
|
+
loading,
|
|
65
|
+
children: !props.loading && props.subtitle
|
|
66
|
+
}) : null
|
|
67
|
+
]
|
|
68
|
+
}),
|
|
69
|
+
props.summary ? /* @__PURE__ */ jsx(Text, {
|
|
70
|
+
tone: "muted",
|
|
71
|
+
className: "max-w-xl",
|
|
72
|
+
loading,
|
|
73
|
+
children: !props.loading && props.summary
|
|
74
|
+
}) : null,
|
|
75
|
+
props.loading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DetailHeroDetails, { children: Array.from({ length: props.details ?? 3 }, (_, index) => /* @__PURE__ */ jsx(DetailHeroDetail, { loading: true }, index)) }), props.description ? /* @__PURE__ */ jsx(TextPreview, { loading: true }) : null] }) : props.children
|
|
76
|
+
]
|
|
77
|
+
})]
|
|
78
|
+
})]
|
|
79
|
+
})
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function DetailHeroDetails({ children }) {
|
|
83
|
+
return /* @__PURE__ */ jsx("dl", {
|
|
84
|
+
className: "grid grid-cols-2 gap-x-8 gap-y-4 sm:flex sm:flex-wrap",
|
|
85
|
+
children
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function DetailHeroDetail(props) {
|
|
89
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
90
|
+
className: props.loading ? "w-24" : "max-w-full min-w-0",
|
|
91
|
+
children: [/* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsx(Text, {
|
|
92
|
+
as: "span",
|
|
93
|
+
variant: "caption",
|
|
94
|
+
tone: "muted",
|
|
95
|
+
loading: props.loading,
|
|
96
|
+
children: !props.loading && props.label
|
|
97
|
+
}) }), /* @__PURE__ */ jsx("dd", {
|
|
98
|
+
className: "mt-1 min-h-6 wrap-break-word",
|
|
99
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
100
|
+
as: "div",
|
|
101
|
+
variant: "label",
|
|
102
|
+
loading: props.loading,
|
|
103
|
+
children: !props.loading && props.value
|
|
104
|
+
})
|
|
105
|
+
})]
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function DetailHeroTags({ label, moreLabel, values }) {
|
|
109
|
+
if (!values.length) return null;
|
|
110
|
+
return /* @__PURE__ */ jsx(DetailHeroDetail, {
|
|
111
|
+
label,
|
|
112
|
+
value: /* @__PURE__ */ jsxs("div", {
|
|
113
|
+
className: "flex flex-wrap items-baseline gap-x-2 gap-y-1",
|
|
114
|
+
children: [/* @__PURE__ */ jsx("span", { children: values[0] }), values.length > 1 ? /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsx(Popover.Trigger, {
|
|
115
|
+
asChild: true,
|
|
116
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
117
|
+
className: "h-5 px-1.5 py-0 text-xs leading-5 before:-inset-y-3 sm:h-5",
|
|
118
|
+
"aria-label": `${label}: ${moreLabel}`,
|
|
119
|
+
variant: "quiet",
|
|
120
|
+
children: moreLabel
|
|
121
|
+
})
|
|
122
|
+
}), /* @__PURE__ */ jsxs(Popover.Content, {
|
|
123
|
+
align: "start",
|
|
124
|
+
width: "sm",
|
|
125
|
+
"aria-label": label,
|
|
126
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
127
|
+
variant: "label",
|
|
128
|
+
children: label
|
|
129
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
130
|
+
className: "mt-3 flex flex-wrap gap-2",
|
|
131
|
+
children: values.map((value) => /* @__PURE__ */ jsx("li", {
|
|
132
|
+
className: "max-w-full min-w-0",
|
|
133
|
+
children: /* @__PURE__ */ jsx(Badge, {
|
|
134
|
+
tone: "neutral",
|
|
135
|
+
className: "max-w-full wrap-break-word whitespace-normal",
|
|
136
|
+
children: value
|
|
137
|
+
})
|
|
138
|
+
}, value))
|
|
139
|
+
})]
|
|
140
|
+
})] }) : null]
|
|
141
|
+
})
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
export { DetailHero, DetailHeroDetail, DetailHeroDetails, DetailHeroTags };
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=DetailHero.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailHero.js","names":[],"sources":["../../src/display/DetailHero.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Popover } from '../overlays/Popover';\nimport { Heading, Text } from '../typography/Typography';\nimport { Badge } from './Badge';\nimport { TextPreview } from './TextPreview';\n\ntype DetailHeroProps =\n | { loading: true; loadingLabel: string; summary?: boolean; description?: boolean; details?: number }\n | {\n loading?: false;\n actions?: ReactNode;\n artwork: ReactNode;\n backgroundSrc?: string;\n children: ReactNode;\n label: string;\n subtitle?: ReactNode;\n summary?: ReactNode;\n title: string;\n titleLevel?: 'h1' | 'h2';\n titleLogoSrc?: string;\n };\n\nexport function DetailHero(props: DetailHeroProps) {\n const loading = props.loading === true;\n const background = !props.loading && props.backgroundSrc;\n\n return (\n <SkeletonLoader loading={loading} label={props.loading ? props.loadingLabel : ''}>\n <section className=\"relative isolate min-w-0 pb-4\">\n {background ? (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 -top-2 bottom-0 -z-10 overflow-hidden rounded-2xl [mask-image:linear-gradient(to_bottom,black_55%,transparent)]\"\n >\n <img src={background} alt=\"\" className=\"size-full object-cover opacity-35\" />\n <div className=\"from-base-50 via-base-50/60 to-base-50/20 absolute inset-0 bg-linear-to-t\" />\n </div>\n ) : null}\n <div\n className={`grid gap-6 sm:grid-cols-[10rem_minmax(0,1fr)] sm:items-center md:grid-cols-[14rem_minmax(0,1fr)] md:gap-8 ${background ? 'p-4 sm:p-5' : ''}`}\n >\n <div className=\"ring-base-900/10 w-40 self-start overflow-hidden rounded-lg shadow-md ring-1 md:w-full\">\n {props.loading ? <SkeletonLoader.Shape presentation=\"artwork\" /> : props.artwork}\n </div>\n <div className=\"flex min-w-0 flex-col gap-5 md:gap-6\">\n <div className=\"min-w-0\">\n <Text\n variant=\"overline\"\n tone=\"muted\"\n className={`mb-2 ${loading ? 'max-w-32' : ''}`}\n loading={loading}\n >\n {!props.loading && props.label}\n </Text>\n <div className=\"flex min-h-8 min-w-0 flex-wrap items-center gap-5\">\n <Heading\n as={props.loading ? 'h2' : (props.titleLevel ?? 'h2')}\n variant=\"hero\"\n className={`min-w-0 wrap-break-word ${loading ? 'w-3/4 max-w-xl' : ''}`}\n loading={loading}\n >\n {!props.loading &&\n (props.titleLogoSrc ? (\n <img\n src={props.titleLogoSrc}\n alt={props.title}\n className=\"max-h-28 w-auto max-w-full object-contain object-left sm:max-w-sm\"\n />\n ) : (\n props.title\n ))}\n </Heading>\n {!props.loading && props.actions ? (\n <div className=\"flex max-w-full shrink-0 flex-wrap items-center gap-3\">\n {props.actions}\n </div>\n ) : null}\n </div>\n {props.loading || props.subtitle ? (\n <Text\n variant=\"description\"\n tone=\"muted\"\n className={`mt-2 wrap-break-word ${loading ? 'max-w-sm' : ''}`}\n loading={loading}\n >\n {!props.loading && props.subtitle}\n </Text>\n ) : null}\n </div>\n {props.summary ? (\n <Text tone=\"muted\" className=\"max-w-xl\" loading={loading}>\n {!props.loading && props.summary}\n </Text>\n ) : null}\n {props.loading ? (\n <>\n <DetailHeroDetails>\n {Array.from({ length: props.details ?? 3 }, (_, index) => (\n <DetailHeroDetail key={index} loading />\n ))}\n </DetailHeroDetails>\n {props.description ? <TextPreview loading /> : null}\n </>\n ) : (\n props.children\n )}\n </div>\n </div>\n </section>\n </SkeletonLoader>\n );\n}\n\nexport function DetailHeroDetails({ children }: { children: ReactNode }) {\n return <dl className=\"grid grid-cols-2 gap-x-8 gap-y-4 sm:flex sm:flex-wrap\">{children}</dl>;\n}\n\ntype DetailProps = { loading: true } | { loading?: false; label: string; value: ReactNode };\n\nexport function DetailHeroDetail(props: DetailProps) {\n return (\n <div className={props.loading ? 'w-24' : 'max-w-full min-w-0'}>\n <dt>\n <Text as=\"span\" variant=\"caption\" tone=\"muted\" loading={props.loading}>\n {!props.loading && props.label}\n </Text>\n </dt>\n <dd className=\"mt-1 min-h-6 wrap-break-word\">\n <Text as=\"div\" variant=\"label\" loading={props.loading}>\n {!props.loading && props.value}\n </Text>\n </dd>\n </div>\n );\n}\n\nexport function DetailHeroTags({\n label,\n moreLabel,\n values,\n}: {\n label: string;\n moreLabel: string;\n values: readonly string[];\n}) {\n if (!values.length) return null;\n\n return (\n <DetailHeroDetail\n label={label}\n value={\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span>{values[0]}</span>\n {values.length > 1 ? (\n <Popover>\n <Popover.Trigger asChild>\n {/* One line of the label's height at every width, so the row matches the others;\n the hit area extends past it instead. */}\n <Button\n className=\"h-5 px-1.5 py-0 text-xs leading-5 before:-inset-y-3 sm:h-5\"\n aria-label={`${label}: ${moreLabel}`}\n variant=\"quiet\"\n >\n {moreLabel}\n </Button>\n </Popover.Trigger>\n <Popover.Content align=\"start\" width=\"sm\" aria-label={label}>\n <Text variant=\"label\">{label}</Text>\n <ul className=\"mt-3 flex flex-wrap gap-2\">\n {values.map((value) => (\n <li key={value} className=\"max-w-full min-w-0\">\n <Badge\n tone=\"neutral\"\n className=\"max-w-full wrap-break-word whitespace-normal\"\n >\n {value}\n </Badge>\n </li>\n ))}\n </ul>\n </Popover.Content>\n </Popover>\n ) : null}\n </div>\n }\n />\n );\n}\n"],"mappings":";;;;;;;;AAyBA,SAAgB,WAAW,OAAwB;CAC/C,MAAM,UAAU,MAAM,YAAY;CAClC,MAAM,aAAa,CAAC,MAAM,WAAW,MAAM;CAE3C,OACI,oBAAC,gBAAD;EAAyB;EAAS,OAAO,MAAM,UAAU,MAAM,eAAe;EAC1E,UAAA,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACK,aACG,qBAAC,OAAD;IACI,eAAY;IACZ,WAAU;IAFd,UAAA,CAII,oBAAC,OAAD;KAAK,KAAK;KAAY,KAAI;KAAG,WAAU;IAAqC,CAAA,GAC5E,oBAAC,OAAD,EAAK,WAAU,4EAA6E,CAAA,CAC3F;GACL,CAAA,IAAA,MACJ,qBAAC,OAAD;IACI,WAAW,6GAA6G,aAAa,eAAe;IADxJ,UAAA,CAGI,oBAAC,OAAD;KAAK,WAAU;KACV,UAAA,MAAM,UAAU,oBAAC,eAAe,OAAhB,EAAsB,cAAa,UAAW,CAAA,IAAI,MAAM;IACxE,CAAA,GACL,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACI,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACI,oBAAC,MAAD;SACI,SAAQ;SACR,MAAK;SACL,WAAW,QAAQ,UAAU,aAAa;SACjC;SAER,UAAA,CAAC,MAAM,WAAW,MAAM;QACvB,CAAA;QACN,qBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACI,oBAAC,SAAD;UACI,IAAI,MAAM,UAAU,OAAQ,MAAM,cAAc;UAChD,SAAQ;UACR,WAAW,2BAA2B,UAAU,mBAAmB;UAC1D;UAER,UAAA,CAAC,MAAM,YACH,MAAM,eACH,oBAAC,OAAD;WACI,KAAK,MAAM;WACX,KAAK,MAAM;WACX,WAAU;UACb,CAAA,IAED,MAAM;SAET,CAAA,GACR,CAAC,MAAM,WAAW,MAAM,UACrB,oBAAC,OAAD;UAAK,WAAU;UACV,UAAA,MAAM;SACN,CAAA,IACL,IACH;;QACJ,MAAM,WAAW,MAAM,WACpB,oBAAC,MAAD;SACI,SAAQ;SACR,MAAK;SACL,WAAW,wBAAwB,UAAU,aAAa;SACjD;SAER,UAAA,CAAC,MAAM,WAAW,MAAM;QACvB,CAAA,IACN;OACH;;MACJ,MAAM,UACH,oBAAC,MAAD;OAAM,MAAK;OAAQ,WAAU;OAAoB;OAC5C,UAAA,CAAC,MAAM,WAAW,MAAM;MACvB,CAAA,IACN;MACH,MAAM,UACH,qBAAA,UAAA,EAAA,UAAA,CACI,oBAAC,mBAAD,EAAA,UACK,MAAM,KAAK,EAAE,QAAQ,MAAM,WAAW,EAAE,IAAI,GAAG,UAC5C,oBAAC,kBAAD,EAA8B,SAAA,KAAS,GAAhB,KAAgB,CAC1C,EACc,CAAA,GAClB,MAAM,cAAc,oBAAC,aAAD,EAAa,SAAA,KAAS,CAAA,IAAI,IACjD,EAAA,CAAA,IAEF,MAAM;KAET;IACJ,CAAA,CAAA;GACA,CAAA,CAAA;;CACG,CAAA;AAExB;AAEA,SAAgB,kBAAkB,EAAE,YAAqC;CACrE,OAAO,oBAAC,MAAD;EAAI,WAAU;EAAyD;CAAa,CAAA;AAC/F;AAIA,SAAgB,iBAAiB,OAAoB;CACjD,OACI,qBAAC,OAAD;EAAK,WAAW,MAAM,UAAU,SAAS;EAAzC,UAAA,CACI,oBAAC,MAAD,EAAA,UACI,oBAAC,MAAD;GAAM,IAAG;GAAO,SAAQ;GAAU,MAAK;GAAQ,SAAS,MAAM;GACzD,UAAA,CAAC,MAAM,WAAW,MAAM;EACvB,CAAA,EACN,CAAA,GACJ,oBAAC,MAAD;GAAI,WAAU;GACV,UAAA,oBAAC,MAAD;IAAM,IAAG;IAAM,SAAQ;IAAQ,SAAS,MAAM;IACzC,UAAA,CAAC,MAAM,WAAW,MAAM;GACvB,CAAA;EACN,CAAA,CACH;;AAEb;AAEA,SAAgB,eAAe,EAC3B,OACA,WACA,UAKD;CACC,IAAI,CAAC,OAAO,QAAQ,OAAO;CAE3B,OACI,oBAAC,kBAAD;EACW;EACP,OACI,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,oBAAC,QAAD,EAAA,UAAO,OAAO,GAAS,CAAA,GACtB,OAAO,SAAS,IACb,qBAAC,SAAD,EAAA,UAAA,CACI,oBAAC,QAAQ,SAAT;IAAiB,SAAA;IAGb,UAAA,oBAAC,QAAD;KACI,WAAU;KACV,cAAY,GAAG,MAAM,IAAI;KACzB,SAAQ;KAEP,UAAA;IACG,CAAA;GACK,CAAA,GACjB,qBAAC,QAAQ,SAAT;IAAiB,OAAM;IAAQ,OAAM;IAAK,cAAY;IAAtD,UAAA,CACI,oBAAC,MAAD;KAAM,SAAQ;KAAS,UAAA;IAAY,CAAA,GACnC,oBAAC,MAAD;KAAI,WAAU;KACT,UAAA,OAAO,KAAK,UACT,oBAAC,MAAD;MAAgB,WAAU;MACtB,UAAA,oBAAC,OAAD;OACI,MAAK;OACL,WAAU;OAET,UAAA;MACE,CAAA;KACP,GAPK,KAOL,CACP;IACD,CAAA,CACS;GACZ,CAAA,CAAA,EAAA,CAAA,IACT,IACH;;CAEZ,CAAA;AAET"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface DetailListItem {
|
|
3
|
+
actions?: ReactNode;
|
|
4
|
+
key?: string;
|
|
5
|
+
label: string;
|
|
6
|
+
value: string;
|
|
7
|
+
}
|
|
8
|
+
interface DetailListProps {
|
|
9
|
+
compact?: boolean;
|
|
10
|
+
items: readonly DetailListItem[];
|
|
11
|
+
title: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function DetailList({ compact, items, title }: DetailListProps): import("react").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=DetailList.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Stack as Stack$1 } from "../layout/Flow.js";
|
|
2
|
+
import { Text } from "../typography/Typography.js";
|
|
3
|
+
import { Code } from "@ninna-ui/primitives";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { Box } from "@ninna-ui/layout";
|
|
6
|
+
// src/display/DetailList.tsx
|
|
7
|
+
function DetailList({ compact = false, items, title }) {
|
|
8
|
+
return /* @__PURE__ */ jsxs(Box, {
|
|
9
|
+
className: compact ? "min-w-0" : "border-base-300 mt-1 border-t px-2 pt-3 pb-1",
|
|
10
|
+
children: [!compact ? /* @__PURE__ */ jsx(Text, {
|
|
11
|
+
as: "span",
|
|
12
|
+
variant: "overline",
|
|
13
|
+
tone: "muted",
|
|
14
|
+
children: title
|
|
15
|
+
}) : null, /* @__PURE__ */ jsx(Stack$1, {
|
|
16
|
+
as: "dl",
|
|
17
|
+
"aria-label": title,
|
|
18
|
+
space: compact ? "none" : "related",
|
|
19
|
+
className: compact ? "min-w-0" : "mt-2",
|
|
20
|
+
children: items.map((item) => /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
className: compact ? "grid min-w-0 grid-cols-[minmax(0,5rem)_minmax(0,1fr)] items-center gap-2" : "flex min-w-0 items-center justify-between gap-3",
|
|
22
|
+
children: [/* @__PURE__ */ jsx("dt", {
|
|
23
|
+
className: compact ? "min-w-0" : "shrink-0",
|
|
24
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
25
|
+
as: "span",
|
|
26
|
+
className: compact ? "block" : void 0,
|
|
27
|
+
variant: "caption",
|
|
28
|
+
tone: "muted",
|
|
29
|
+
truncate: compact,
|
|
30
|
+
title: item.label,
|
|
31
|
+
children: item.label
|
|
32
|
+
})
|
|
33
|
+
}), /* @__PURE__ */ jsx("dd", {
|
|
34
|
+
className: "min-w-0",
|
|
35
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
36
|
+
className: "flex min-w-0 items-center gap-1",
|
|
37
|
+
children: [/* @__PURE__ */ jsx(Code, {
|
|
38
|
+
title: item.value,
|
|
39
|
+
className: "block max-w-full min-w-0 flex-1 truncate px-1.5 py-0.5 text-xs",
|
|
40
|
+
children: item.value
|
|
41
|
+
}), item.actions ? /* @__PURE__ */ jsx("span", {
|
|
42
|
+
className: "flex shrink-0 items-center",
|
|
43
|
+
children: item.actions
|
|
44
|
+
}) : null]
|
|
45
|
+
})
|
|
46
|
+
})]
|
|
47
|
+
}, item.key ?? item.label))
|
|
48
|
+
})]
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export { DetailList };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=DetailList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailList.js","names":["Stack"],"sources":["../../src/display/DetailList.tsx"],"sourcesContent":["import { Box } from '@ninna-ui/layout';\nimport { Code } from '@ninna-ui/primitives';\nimport type { ReactNode } from 'react';\n\nimport { Stack } from '../layout/Flow';\nimport { Text } from '../typography/Typography';\n\ninterface DetailListItem {\n actions?: ReactNode;\n key?: string;\n label: string;\n value: string;\n}\n\ninterface DetailListProps {\n compact?: boolean;\n items: readonly DetailListItem[];\n title: string;\n}\n\nexport function DetailList({ compact = false, items, title }: DetailListProps) {\n return (\n <Box className={compact ? 'min-w-0' : 'border-base-300 mt-1 border-t px-2 pt-3 pb-1'}>\n {!compact ? (\n <Text as=\"span\" variant=\"overline\" tone=\"muted\">\n {title}\n </Text>\n ) : null}\n <Stack\n as=\"dl\"\n aria-label={title}\n space={compact ? 'none' : 'related'}\n className={compact ? 'min-w-0' : 'mt-2'}\n >\n {items.map((item) => (\n <div\n key={item.key ?? item.label}\n className={\n compact\n ? 'grid min-w-0 grid-cols-[minmax(0,5rem)_minmax(0,1fr)] items-center gap-2'\n : 'flex min-w-0 items-center justify-between gap-3'\n }\n >\n <dt className={compact ? 'min-w-0' : 'shrink-0'}>\n <Text\n as=\"span\"\n className={compact ? 'block' : undefined}\n variant=\"caption\"\n tone=\"muted\"\n truncate={compact}\n title={item.label}\n >\n {item.label}\n </Text>\n </dt>\n <dd className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <Code\n title={item.value}\n className=\"block max-w-full min-w-0 flex-1 truncate px-1.5 py-0.5 text-xs\"\n >\n {item.value}\n </Code>\n {item.actions ? (\n <span className=\"flex shrink-0 items-center\">{item.actions}</span>\n ) : null}\n </div>\n </dd>\n </div>\n ))}\n </Stack>\n </Box>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,WAAW,EAAE,UAAU,OAAO,OAAO,SAA0B;CAC3E,OACI,qBAAC,KAAD;EAAK,WAAW,UAAU,YAAY;EAAtC,UAAA,CACK,CAAC,UACE,oBAAC,MAAD;GAAM,IAAG;GAAO,SAAQ;GAAW,MAAK;GACnC,UAAA;EACC,CAAA,IACN,MACJ,oBAACA,SAAD;GACI,IAAG;GACH,cAAY;GACZ,OAAO,UAAU,SAAS;GAC1B,WAAW,UAAU,YAAY;GAEhC,UAAA,MAAM,KAAK,SACR,qBAAC,OAAD;IAEI,WACI,UACM,6EACA;IALd,UAAA,CAQI,oBAAC,MAAD;KAAI,WAAW,UAAU,YAAY;KACjC,UAAA,oBAAC,MAAD;MACI,IAAG;MACH,WAAW,UAAU,UAAU,KAAA;MAC/B,SAAQ;MACR,MAAK;MACL,UAAU;MACV,OAAO,KAAK;MAEX,UAAA,KAAK;KACJ,CAAA;IACN,CAAA,GACJ,oBAAC,MAAD;KAAI,WAAU;KACV,UAAA,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACI,oBAAC,MAAD;OACI,OAAO,KAAK;OACZ,WAAU;OAET,UAAA,KAAK;MACJ,CAAA,GACL,KAAK,UACF,oBAAC,QAAD;OAAM,WAAU;OAA8B,UAAA,KAAK;MAAc,CAAA,IACjE,IACH;;IACL,CAAA,CACH;GAhCI,GAAA,KAAK,OAAO,KAAK,KAgCrB,CACR;EACE,CAAA,CACN;;AAEb"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface DeviceCardProps {
|
|
3
|
+
/** A control in the top corner, for example a limit select. */
|
|
4
|
+
action?: ReactNode;
|
|
5
|
+
/** Beside the name, for example a status badge. */
|
|
6
|
+
badge?: ReactNode;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
detail?: string;
|
|
9
|
+
/** Below the content, past a divider, for example the device's encoder. */
|
|
10
|
+
footer?: ReactNode;
|
|
11
|
+
/** Dashed, for a device that is detected but cannot be used. */
|
|
12
|
+
unavailable?: boolean;
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
15
|
+
/** One piece of hardware: its name and detail, a corner control and its content. */
|
|
16
|
+
export declare function DeviceCard({ action, badge, children, detail, footer, name, unavailable }: DeviceCardProps): import("react").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=DeviceCard.d.ts.map
|