@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,48 @@
|
|
|
1
|
+
import { Text } from "../typography/Typography.js";
|
|
2
|
+
import { moveTabSelection } from "./TabKeys.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
// src/navigation/ViewTabs.tsx
|
|
5
|
+
/** A row of tabs that switches which list the page shows, each with its count. */
|
|
6
|
+
function ViewTabs({ items, label, onChange, value, end }) {
|
|
7
|
+
const tabs = /* @__PURE__ */ jsx("div", {
|
|
8
|
+
role: "tablist",
|
|
9
|
+
"aria-label": label,
|
|
10
|
+
className: "border-base-300 flex min-w-0 gap-1 overflow-x-auto border-b",
|
|
11
|
+
onKeyDown: (event) => moveTabSelection(event, items.map((item) => item.value), value, onChange),
|
|
12
|
+
children: items.map((item) => {
|
|
13
|
+
const selected = item.value === value;
|
|
14
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
15
|
+
type: "button",
|
|
16
|
+
role: "tab",
|
|
17
|
+
"aria-selected": selected,
|
|
18
|
+
tabIndex: selected ? 0 : -1,
|
|
19
|
+
"data-value": item.value,
|
|
20
|
+
className: `focus-visible:outline-primary -mb-px flex shrink-0 items-center gap-2 border-b-2 px-3 py-2 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-[-2px] ${selected ? "border-base-content text-base-content" : "text-base-700 hover:text-base-content border-transparent"}`,
|
|
21
|
+
onClick: () => onChange(item.value),
|
|
22
|
+
children: [
|
|
23
|
+
item.label,
|
|
24
|
+
item.count !== void 0 ? " " : null,
|
|
25
|
+
item.count !== void 0 ? /* @__PURE__ */ jsx(Text, {
|
|
26
|
+
as: "span",
|
|
27
|
+
variant: "caption",
|
|
28
|
+
className: `rounded-full px-1.5 tabular-nums ${selected ? "bg-base-content/10 text-base-content" : "bg-base-200 text-base-700 dark:bg-base-300"}`,
|
|
29
|
+
children: item.count
|
|
30
|
+
}) : null
|
|
31
|
+
]
|
|
32
|
+
}, item.value);
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
return end ? /* @__PURE__ */ jsxs("div", {
|
|
36
|
+
className: "flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between",
|
|
37
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
38
|
+
className: "min-w-0",
|
|
39
|
+
children: tabs
|
|
40
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
41
|
+
className: "sm:w-64 sm:pb-1",
|
|
42
|
+
children: end
|
|
43
|
+
})]
|
|
44
|
+
}) : tabs;
|
|
45
|
+
}
|
|
46
|
+
export { ViewTabs };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=ViewTabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewTabs.js","names":[],"sources":["../../src/navigation/ViewTabs.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Text } from '../typography/Typography';\nimport { moveTabSelection } from './TabKeys';\n\nexport interface ViewTabsItem<T extends string> {\n value: T;\n label: string;\n /** Already formatted for the viewer's locale. */\n count?: string;\n}\n\ninterface ViewTabsProps<T extends string> {\n items: readonly ViewTabsItem<T>[];\n label: string;\n onChange: (value: T) => void;\n value: T;\n /** A control that acts on the same list, such as its search, beside the tabs on wide screens. */\n end?: ReactNode;\n}\n\n/** A row of tabs that switches which list the page shows, each with its count. */\nexport function ViewTabs<T extends string>({ items, label, onChange, value, end }: ViewTabsProps<T>) {\n const tabs = (\n <div\n role=\"tablist\"\n aria-label={label}\n className=\"border-base-300 flex min-w-0 gap-1 overflow-x-auto border-b\"\n onKeyDown={(event) =>\n moveTabSelection(\n event,\n items.map((item) => item.value),\n value,\n onChange,\n )\n }\n >\n {items.map((item) => {\n const selected = item.value === value;\n\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n data-value={item.value}\n className={`focus-visible:outline-primary -mb-px flex shrink-0 items-center gap-2 border-b-2 px-3 py-2 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-[-2px] ${\n selected\n ? 'border-base-content text-base-content'\n : 'text-base-700 hover:text-base-content border-transparent'\n }`}\n onClick={() => onChange(item.value)}\n >\n {item.label}\n {item.count !== undefined ? ' ' : null}\n {item.count !== undefined ? (\n <Text\n as=\"span\"\n variant=\"caption\"\n className={`rounded-full px-1.5 tabular-nums ${\n selected\n ? 'bg-base-content/10 text-base-content'\n : 'bg-base-200 text-base-700 dark:bg-base-300'\n }`}\n >\n {item.count}\n </Text>\n ) : null}\n </button>\n );\n })}\n </div>\n );\n\n return end ? (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"min-w-0\">{tabs}</div>\n <div className=\"sm:w-64 sm:pb-1\">{end}</div>\n </div>\n ) : (\n tabs\n );\n}\n"],"mappings":";;;;;AAsBA,SAAgB,SAA2B,EAAE,OAAO,OAAO,UAAU,OAAO,OAAyB;CACjG,MAAM,OACF,oBAAC,OAAD;EACI,MAAK;EACL,cAAY;EACZ,WAAU;EACV,YAAY,UACR,iBACI,OACA,MAAM,KAAK,SAAS,KAAK,KAAK,GAC9B,OACA,QACJ;EAGH,UAAA,MAAM,KAAK,SAAS;GACjB,MAAM,WAAW,KAAK,UAAU;GAEhC,OACI,qBAAC,UAAD;IAEI,MAAK;IACL,MAAK;IACL,iBAAe;IACf,UAAU,WAAW,IAAI;IACzB,cAAY,KAAK;IACjB,WAAW,gMACP,WACM,0CACA;IAEV,eAAe,SAAS,KAAK,KAAK;IAZtC,UAAA;KAcK,KAAK;KACL,KAAK,UAAU,KAAA,IAAY,MAAM;KACjC,KAAK,UAAU,KAAA,IACZ,oBAAC,MAAD;MACI,IAAG;MACH,SAAQ;MACR,WAAW,oCACP,WACM,yCACA;MAGT,UAAA,KAAK;KACJ,CAAA,IACN;IACA;GA5BC,GAAA,KAAK,KA4BN;EAEhB,CAAC;CACA,CAAA;CAGT,OAAO,MACH,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,oBAAC,OAAD;GAAK,WAAU;GAAW,UAAA;EAAU,CAAA,GACpC,oBAAC,OAAD;GAAK,WAAU;GAAmB,UAAA;EAAS,CAAA,CAC1C;CAEL,CAAA,IAAA;AAER"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ArtworkTabs, ArtworkTabsItem } from "./ArtworkTabs.js";
|
|
2
|
+
import { Breadcrumbs } from "./Breadcrumbs.js";
|
|
3
|
+
import { CollectionBrowseControls, CollectionBrowseSelector, CollectionBrowseTrigger } from "./CollectionBrowseSelector.js";
|
|
4
|
+
import { CollectionView, CollectionViewToggle } from "./CollectionViewToggle.js";
|
|
5
|
+
import { DrilldownBrowseGroup, DrilldownBrowseItem, DrilldownBrowseSelector } from "./DrilldownBrowseSelector.js";
|
|
6
|
+
import { FolderSelector, FolderSelectorOption, FolderSelectorProps } from "./FolderSelector.js";
|
|
7
|
+
import { ViewTabs, ViewTabsItem } from "./ViewTabs.js";
|
|
8
|
+
export { ArtworkTabs, type ArtworkTabsItem, Breadcrumbs, CollectionBrowseControls, CollectionBrowseSelector, CollectionBrowseTrigger, type CollectionView, CollectionViewToggle, type DrilldownBrowseGroup, type DrilldownBrowseItem, DrilldownBrowseSelector, FolderSelector, type FolderSelectorOption, type FolderSelectorProps, ViewTabs, type ViewTabsItem };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface ActionModalProps {
|
|
3
|
+
accessibleTitle?: string;
|
|
4
|
+
actionColor?: 'danger' | 'primary';
|
|
5
|
+
actionDisabled?: boolean;
|
|
6
|
+
actionLabel: string;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
bodyLayout?: 'scroll' | 'fill';
|
|
9
|
+
description: string;
|
|
10
|
+
footerLeading?: ReactNode;
|
|
11
|
+
headerActions?: ReactNode;
|
|
12
|
+
loading: boolean;
|
|
13
|
+
onAction: () => void;
|
|
14
|
+
onClose: () => void;
|
|
15
|
+
sidebar?: ReactNode;
|
|
16
|
+
noValidate?: boolean;
|
|
17
|
+
title: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function ActionModal({ accessibleTitle, actionColor, actionDisabled, actionLabel, children, bodyLayout, description, footerLeading, headerActions, loading, onAction, onClose, sidebar, noValidate, title }: ActionModalProps): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ActionModal.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Button } from "../actions/Button.js";
|
|
2
|
+
import { useDesignSystemLabels } from "../foundations/DesignSystemProvider.js";
|
|
3
|
+
import { Modal } from "./Modal.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
// src/overlays/ActionModal.tsx
|
|
6
|
+
function ActionModal({ accessibleTitle, actionColor = "primary", actionDisabled = false, actionLabel, children, bodyLayout, description, footerLeading, headerActions, loading, onAction, onClose, sidebar, noValidate, title }) {
|
|
7
|
+
const labels = useDesignSystemLabels();
|
|
8
|
+
return /* @__PURE__ */ jsx(Modal, {
|
|
9
|
+
loading,
|
|
10
|
+
onClose,
|
|
11
|
+
children: /* @__PURE__ */ jsx(Modal.Content, {
|
|
12
|
+
title,
|
|
13
|
+
accessibleTitle,
|
|
14
|
+
description,
|
|
15
|
+
sidebar,
|
|
16
|
+
headerActions,
|
|
17
|
+
children: /* @__PURE__ */ jsxs(Modal.Form, {
|
|
18
|
+
noValidate,
|
|
19
|
+
onSubmit: (event) => {
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
if (!loading && !actionDisabled) onAction();
|
|
22
|
+
},
|
|
23
|
+
children: [/* @__PURE__ */ jsx(Modal.Body, {
|
|
24
|
+
layout: bodyLayout,
|
|
25
|
+
children
|
|
26
|
+
}), /* @__PURE__ */ jsxs(Modal.Footer, {
|
|
27
|
+
leading: footerLeading,
|
|
28
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
29
|
+
type: "button",
|
|
30
|
+
disabled: loading,
|
|
31
|
+
onClick: onClose,
|
|
32
|
+
variant: "secondary",
|
|
33
|
+
children: labels.cancel
|
|
34
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
35
|
+
type: "submit",
|
|
36
|
+
loading,
|
|
37
|
+
disabled: loading || actionDisabled,
|
|
38
|
+
variant: actionColor === "danger" ? "destructive" : "primary",
|
|
39
|
+
children: actionLabel
|
|
40
|
+
})]
|
|
41
|
+
})]
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export { ActionModal };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=ActionModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionModal.js","names":[],"sources":["../../src/overlays/ActionModal.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { useDesignSystemLabels } from '../foundations/DesignSystemProvider';\nimport { Modal } from './Modal';\n\ninterface ActionModalProps {\n accessibleTitle?: string;\n actionColor?: 'danger' | 'primary';\n actionDisabled?: boolean;\n actionLabel: string;\n children: ReactNode;\n bodyLayout?: 'scroll' | 'fill';\n description: string;\n footerLeading?: ReactNode;\n headerActions?: ReactNode;\n loading: boolean;\n onAction: () => void;\n onClose: () => void;\n sidebar?: ReactNode;\n noValidate?: boolean;\n title: string;\n}\n\nexport function ActionModal({\n accessibleTitle,\n actionColor = 'primary',\n actionDisabled = false,\n actionLabel,\n children,\n bodyLayout,\n description,\n footerLeading,\n headerActions,\n loading,\n onAction,\n onClose,\n sidebar,\n noValidate,\n title,\n}: ActionModalProps) {\n const labels = useDesignSystemLabels();\n\n return (\n <Modal loading={loading} onClose={onClose}>\n <Modal.Content\n title={title}\n accessibleTitle={accessibleTitle}\n description={description}\n sidebar={sidebar}\n headerActions={headerActions}\n >\n <Modal.Form\n noValidate={noValidate}\n onSubmit={(event) => {\n event.preventDefault();\n\n if (!loading && !actionDisabled) {\n onAction();\n }\n }}\n >\n <Modal.Body layout={bodyLayout}>{children}</Modal.Body>\n <Modal.Footer leading={footerLeading}>\n <Button type=\"button\" disabled={loading} onClick={onClose} variant=\"secondary\">\n {labels.cancel}\n </Button>\n <Button\n type=\"submit\"\n loading={loading}\n disabled={loading || actionDisabled}\n variant={actionColor === 'danger' ? 'destructive' : 'primary'}\n >\n {actionLabel}\n </Button>\n </Modal.Footer>\n </Modal.Form>\n </Modal.Content>\n </Modal>\n );\n}\n"],"mappings":";;;;;AAwBA,SAAgB,YAAY,EACxB,iBACA,cAAc,WACd,iBAAiB,OACjB,aACA,UACA,YACA,aACA,eACA,eACA,SACA,UACA,SACA,SACA,YACA,SACiB;CACjB,MAAM,SAAS,sBAAsB;CAErC,OACI,oBAAC,OAAD;EAAgB;EAAkB;EAC9B,UAAA,oBAAC,MAAM,SAAP;GACW;GACU;GACJ;GACJ;GACM;GAEf,UAAA,qBAAC,MAAM,MAAP;IACgB;IACZ,WAAW,UAAU;KACjB,MAAM,eAAe;KAErB,IAAI,CAAC,WAAW,CAAC,gBACb,SAAS;IAEjB;IARJ,UAAA,CAUI,oBAAC,MAAM,MAAP;KAAY,QAAQ;KAAa;IAAqB,CAAA,GACtD,qBAAC,MAAM,QAAP;KAAc,SAAS;KAAvB,UAAA,CACI,oBAAC,QAAD;MAAQ,MAAK;MAAS,UAAU;MAAS,SAAS;MAAS,SAAQ;MAC9D,UAAA,OAAO;KACJ,CAAA,GACR,oBAAC,QAAD;MACI,MAAK;MACI;MACT,UAAU,WAAW;MACrB,SAAS,gBAAgB,WAAW,gBAAgB;MAEnD,UAAA;KACG,CAAA,CACE;IACN,CAAA,CAAA;;EACD,CAAA;CACZ,CAAA;AAEf"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface CommandPaletteProps {
|
|
3
|
+
/** The dialog's accessible title and description; the field says the rest. */
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
placeholder: string;
|
|
7
|
+
query: string;
|
|
8
|
+
onQueryChange: (query: string) => void;
|
|
9
|
+
/** Narrows the list to one level, shown as a chip before the field; Backspace in an empty field leaves it. */
|
|
10
|
+
scope?: {
|
|
11
|
+
label: string;
|
|
12
|
+
leaveLabel: string;
|
|
13
|
+
onLeave: () => void;
|
|
14
|
+
};
|
|
15
|
+
/** The options' values in list order, for the arrow keys and Enter. */
|
|
16
|
+
options: readonly string[];
|
|
17
|
+
onSelect: (value: string) => void;
|
|
18
|
+
onClose: () => void;
|
|
19
|
+
listLabel: string;
|
|
20
|
+
busy?: boolean;
|
|
21
|
+
/** Shown when nothing is listed. */
|
|
22
|
+
empty?: ReactNode;
|
|
23
|
+
/** Quiet key hints under the list, on screens with a keyboard. */
|
|
24
|
+
footer?: ReactNode;
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}
|
|
27
|
+
/** T3 Code's command palette: a field over one keyboard list of grouped options, as a dialog over the page
|
|
28
|
+
* or, on phones, the whole screen. The arrow keys move through `options`, Enter selects, Escape closes. */
|
|
29
|
+
export declare function CommandPalette({ label, description, placeholder, query, onQueryChange, scope, options, onSelect, onClose, listLabel, busy, empty, footer, children }: CommandPaletteProps): import("react").JSX.Element;
|
|
30
|
+
/** A labelled run of options in the palette's list. */
|
|
31
|
+
export declare function CommandPaletteGroup({ label, children }: {
|
|
32
|
+
label: string;
|
|
33
|
+
children: ReactNode;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
/** Props for a palette option, such as a `ResultRow`: its id, highlight and pointer tracking. */
|
|
36
|
+
export declare function useCommandPaletteOption(value: string): {
|
|
37
|
+
id: string;
|
|
38
|
+
selected: boolean;
|
|
39
|
+
tabIndex: number;
|
|
40
|
+
onPointerMove: () => void;
|
|
41
|
+
};
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=CommandPalette.d.ts.map
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { IconButton } from "../actions/IconButton.js";
|
|
2
|
+
import { ResultList } from "../collections/ResultList.js";
|
|
3
|
+
import { useDesignSystemLabels } from "../foundations/DesignSystemProvider.js";
|
|
4
|
+
import { Text } from "../typography/Typography.js";
|
|
5
|
+
import { useModalAutoFocus } from "./useModalAutoFocus.js";
|
|
6
|
+
import { useScrollFade } from "./useScrollFade.js";
|
|
7
|
+
import { createContext, useContext, useEffect, useId, useRef, useState } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { SearchIcon, XIcon } from "lucide-react";
|
|
10
|
+
import { Modal } from "@ninna-ui/overlays";
|
|
11
|
+
// src/overlays/CommandPalette.tsx
|
|
12
|
+
const OptionContext = createContext(null);
|
|
13
|
+
/** T3 Code's command palette: a field over one keyboard list of grouped options, as a dialog over the page
|
|
14
|
+
* or, on phones, the whole screen. The arrow keys move through `options`, Enter selects, Escape closes. */
|
|
15
|
+
function CommandPalette({ label, description, placeholder, query, onQueryChange, scope, options, onSelect, onClose, listLabel, busy = false, empty, footer, children }) {
|
|
16
|
+
const labels = useDesignSystemLabels();
|
|
17
|
+
const focusProps = useModalAutoFocus();
|
|
18
|
+
const { setViewport, setContent, className } = useScrollFade();
|
|
19
|
+
const listId = useId();
|
|
20
|
+
const input = useRef(null);
|
|
21
|
+
const [chosen, setActiveValue] = useState();
|
|
22
|
+
const activeValue = chosen !== void 0 && options.includes(chosen) ? chosen : options[0];
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (activeValue) document.getElementById(optionId(listId, activeValue))?.scrollIntoView({ block: "nearest" });
|
|
25
|
+
}, [activeValue, listId]);
|
|
26
|
+
return /* @__PURE__ */ jsx(Modal, {
|
|
27
|
+
open: true,
|
|
28
|
+
onOpenChange: (open) => !open && onClose(),
|
|
29
|
+
children: /* @__PURE__ */ jsxs(Modal.Content, {
|
|
30
|
+
title: label,
|
|
31
|
+
description,
|
|
32
|
+
centered: false,
|
|
33
|
+
...focusProps,
|
|
34
|
+
className: "flex max-h-[min(36rem,calc(100dvh-6rem))] w-[calc(100vw-2rem)] max-w-2xl flex-col overflow-hidden p-0 shadow-(--lar-shadow-dialog) max-sm:top-0 max-sm:left-0 max-sm:h-dvh max-sm:max-h-none max-sm:w-full max-sm:max-w-none max-sm:translate-x-0 max-sm:rounded-none! max-sm:border-0 max-sm:pt-[env(safe-area-inset-top)]",
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ jsxs("div", {
|
|
37
|
+
className: "border-base-300 [&>svg]:text-base-600 flex shrink-0 items-center gap-2 border-b px-4 py-3 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ jsx(SearchIcon, {}),
|
|
40
|
+
scope ? /* @__PURE__ */ jsxs("span", {
|
|
41
|
+
className: "bg-primary/12 text-primary flex shrink-0 items-center gap-1 rounded-md py-0.5 pr-1 pl-2 text-xs font-medium",
|
|
42
|
+
children: [scope.label, /* @__PURE__ */ jsx("button", {
|
|
43
|
+
type: "button",
|
|
44
|
+
tabIndex: -1,
|
|
45
|
+
"aria-label": scope.leaveLabel,
|
|
46
|
+
className: "hover:bg-primary/15 rounded-sm p-0.5 [&>svg]:size-3",
|
|
47
|
+
onClick: () => {
|
|
48
|
+
scope.onLeave();
|
|
49
|
+
input.current?.focus();
|
|
50
|
+
},
|
|
51
|
+
children: /* @__PURE__ */ jsx(XIcon, {})
|
|
52
|
+
})]
|
|
53
|
+
}) : null,
|
|
54
|
+
/* @__PURE__ */ jsx("input", {
|
|
55
|
+
ref: input,
|
|
56
|
+
role: "combobox",
|
|
57
|
+
"aria-label": label,
|
|
58
|
+
"aria-expanded": true,
|
|
59
|
+
"aria-controls": listId,
|
|
60
|
+
"aria-autocomplete": "list",
|
|
61
|
+
"aria-activedescendant": activeValue ? optionId(listId, activeValue) : void 0,
|
|
62
|
+
"aria-busy": busy,
|
|
63
|
+
placeholder,
|
|
64
|
+
value: query,
|
|
65
|
+
className: "text-base-content placeholder:text-base-600 min-w-0 flex-1 bg-transparent text-base outline-none sm:text-sm",
|
|
66
|
+
onChange: (event) => onQueryChange(event.target.value),
|
|
67
|
+
onKeyDown: (event) => {
|
|
68
|
+
if (event.nativeEvent.isComposing) return;
|
|
69
|
+
if (event.key === "Backspace" && !query && scope) {
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
scope.onLeave();
|
|
72
|
+
} else if ((event.key === "ArrowDown" || event.key === "ArrowUp") && options.length) {
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
const index = activeValue ? options.indexOf(activeValue) : -1;
|
|
75
|
+
const step = event.key === "ArrowDown" ? 1 : -1;
|
|
76
|
+
setActiveValue(options[(index + step + options.length) % options.length]);
|
|
77
|
+
} else if (event.key === "Enter" && activeValue) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
onSelect(activeValue);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ jsx("span", {
|
|
84
|
+
className: "flex sm:hidden",
|
|
85
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
86
|
+
"aria-label": labels.close,
|
|
87
|
+
icon: /* @__PURE__ */ jsx(XIcon, {}),
|
|
88
|
+
onClick: onClose,
|
|
89
|
+
variant: "header"
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
]
|
|
93
|
+
}),
|
|
94
|
+
/* @__PURE__ */ jsx("div", {
|
|
95
|
+
ref: setViewport,
|
|
96
|
+
className: `min-h-0 flex-1 overflow-y-auto overscroll-contain p-2 ${className}`,
|
|
97
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
98
|
+
ref: setContent,
|
|
99
|
+
className: "flow-root",
|
|
100
|
+
children: [/* @__PURE__ */ jsx(OptionContext.Provider, {
|
|
101
|
+
value: {
|
|
102
|
+
listId,
|
|
103
|
+
activeValue,
|
|
104
|
+
setActiveValue
|
|
105
|
+
},
|
|
106
|
+
children: /* @__PURE__ */ jsx(ResultList, {
|
|
107
|
+
id: listId,
|
|
108
|
+
label: listLabel,
|
|
109
|
+
density: "compact",
|
|
110
|
+
"aria-busy": busy,
|
|
111
|
+
children
|
|
112
|
+
})
|
|
113
|
+
}), options.length === 0 && empty ? /* @__PURE__ */ jsx(Text, {
|
|
114
|
+
tone: "muted",
|
|
115
|
+
className: "px-3 py-8 text-center",
|
|
116
|
+
children: empty
|
|
117
|
+
}) : null]
|
|
118
|
+
})
|
|
119
|
+
}),
|
|
120
|
+
footer ? /* @__PURE__ */ jsx("div", {
|
|
121
|
+
className: "border-base-300 text-2xs text-base-700 hidden shrink-0 items-center gap-4 border-t px-4 py-2 pointer-fine:flex",
|
|
122
|
+
children: footer
|
|
123
|
+
}) : null
|
|
124
|
+
]
|
|
125
|
+
})
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/** A labelled run of options in the palette's list. */
|
|
129
|
+
function CommandPaletteGroup({ label, children }) {
|
|
130
|
+
const labelId = useId();
|
|
131
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
132
|
+
role: "group",
|
|
133
|
+
"aria-labelledby": labelId,
|
|
134
|
+
className: "flex flex-col gap-1 not-first:pt-2",
|
|
135
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
136
|
+
as: "span",
|
|
137
|
+
id: labelId,
|
|
138
|
+
variant: "caption",
|
|
139
|
+
tone: "muted",
|
|
140
|
+
className: "px-2 pt-1 font-medium tracking-wide uppercase",
|
|
141
|
+
children: label
|
|
142
|
+
}), children]
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/** Props for a palette option, such as a `ResultRow`: its id, highlight and pointer tracking. */
|
|
146
|
+
function useCommandPaletteOption(value) {
|
|
147
|
+
const context = useContext(OptionContext);
|
|
148
|
+
if (!context) throw new Error("useCommandPaletteOption must be used inside CommandPalette");
|
|
149
|
+
return {
|
|
150
|
+
id: optionId(context.listId, value),
|
|
151
|
+
selected: context.activeValue === value,
|
|
152
|
+
tabIndex: -1,
|
|
153
|
+
onPointerMove: () => {
|
|
154
|
+
if (context.activeValue !== value) context.setActiveValue(value);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function optionId(listId, value) {
|
|
159
|
+
return `${listId}-${value.replace(/[^\w-]/g, "_")}`;
|
|
160
|
+
}
|
|
161
|
+
export { CommandPalette, CommandPaletteGroup, useCommandPaletteOption };
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","names":["NinnaModal"],"sources":["../../src/overlays/CommandPalette.tsx"],"sourcesContent":["/* oxlint-disable react/only-export-components -- The option hook belongs to the palette. */\n\nimport { Modal as NinnaModal } from '@ninna-ui/overlays';\nimport { SearchIcon, XIcon } from 'lucide-react';\nimport { createContext, type ReactNode, useContext, useEffect, useId, useRef, useState } from 'react';\n\nimport { IconButton } from '../actions/IconButton';\nimport { ResultList } from '../collections/ResultList';\nimport { useDesignSystemLabels } from '../foundations/DesignSystemProvider';\nimport { Text } from '../typography/Typography';\nimport { useModalAutoFocus } from './useModalAutoFocus';\nimport { useScrollFade } from './useScrollFade';\n\ninterface CommandPaletteProps {\n /** The dialog's accessible title and description; the field says the rest. */\n label: string;\n description: string;\n placeholder: string;\n query: string;\n onQueryChange: (query: string) => void;\n /** Narrows the list to one level, shown as a chip before the field; Backspace in an empty field leaves it. */\n scope?: { label: string; leaveLabel: string; onLeave: () => void };\n /** The options' values in list order, for the arrow keys and Enter. */\n options: readonly string[];\n onSelect: (value: string) => void;\n onClose: () => void;\n listLabel: string;\n busy?: boolean;\n /** Shown when nothing is listed. */\n empty?: ReactNode;\n /** Quiet key hints under the list, on screens with a keyboard. */\n footer?: ReactNode;\n children: ReactNode;\n}\n\nconst OptionContext = createContext<{\n listId: string;\n activeValue: string | undefined;\n setActiveValue: (value: string) => void;\n} | null>(null);\n\n/** T3 Code's command palette: a field over one keyboard list of grouped options, as a dialog over the page\n * or, on phones, the whole screen. The arrow keys move through `options`, Enter selects, Escape closes. */\nexport function CommandPalette({\n label,\n description,\n placeholder,\n query,\n onQueryChange,\n scope,\n options,\n onSelect,\n onClose,\n listLabel,\n busy = false,\n empty,\n footer,\n children,\n}: CommandPaletteProps) {\n const labels = useDesignSystemLabels();\n const focusProps = useModalAutoFocus();\n const { setViewport, setContent, className } = useScrollFade();\n const listId = useId();\n const input = useRef<HTMLInputElement>(null);\n const [chosen, setActiveValue] = useState<string>();\n // The highlight follows the list: when the chosen option leaves it, the first option takes over.\n const activeValue = chosen !== undefined && options.includes(chosen) ? chosen : options[0];\n\n useEffect(() => {\n if (activeValue) document.getElementById(optionId(listId, activeValue))?.scrollIntoView({ block: 'nearest' });\n }, [activeValue, listId]);\n\n return (\n <NinnaModal open onOpenChange={(open) => !open && onClose()}>\n <NinnaModal.Content\n title={label}\n description={description}\n centered={false}\n {...focusProps}\n className=\"flex max-h-[min(36rem,calc(100dvh-6rem))] w-[calc(100vw-2rem)] max-w-2xl flex-col overflow-hidden p-0 shadow-(--lar-shadow-dialog) max-sm:top-0 max-sm:left-0 max-sm:h-dvh max-sm:max-h-none max-sm:w-full max-sm:max-w-none max-sm:translate-x-0 max-sm:rounded-none! max-sm:border-0 max-sm:pt-[env(safe-area-inset-top)]\"\n >\n <div className=\"border-base-300 [&>svg]:text-base-600 flex shrink-0 items-center gap-2 border-b px-4 py-3 [&>svg]:size-4 [&>svg]:shrink-0\">\n <SearchIcon />\n {scope ? (\n <span className=\"bg-primary/12 text-primary flex shrink-0 items-center gap-1 rounded-md py-0.5 pr-1 pl-2 text-xs font-medium\">\n {scope.label}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={scope.leaveLabel}\n className=\"hover:bg-primary/15 rounded-sm p-0.5 [&>svg]:size-3\"\n onClick={() => {\n scope.onLeave();\n input.current?.focus();\n }}\n >\n <XIcon />\n </button>\n </span>\n ) : null}\n <input\n ref={input}\n role=\"combobox\"\n aria-label={label}\n aria-expanded\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeValue ? optionId(listId, activeValue) : undefined}\n aria-busy={busy}\n placeholder={placeholder}\n value={query}\n className=\"text-base-content placeholder:text-base-600 min-w-0 flex-1 bg-transparent text-base outline-none sm:text-sm\"\n onChange={(event) => onQueryChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.nativeEvent.isComposing) return;\n\n if (event.key === 'Backspace' && !query && scope) {\n event.preventDefault();\n scope.onLeave();\n } else if ((event.key === 'ArrowDown' || event.key === 'ArrowUp') && options.length) {\n event.preventDefault();\n\n const index = activeValue ? options.indexOf(activeValue) : -1;\n const step = event.key === 'ArrowDown' ? 1 : -1;\n\n setActiveValue(options[(index + step + options.length) % options.length]!);\n } else if (event.key === 'Enter' && activeValue) {\n event.preventDefault();\n onSelect(activeValue);\n }\n }}\n />\n <span className=\"flex sm:hidden\">\n <IconButton aria-label={labels.close} icon={<XIcon />} onClick={onClose} variant=\"header\" />\n </span>\n </div>\n <div ref={setViewport} className={`min-h-0 flex-1 overflow-y-auto overscroll-contain p-2 ${className}`}>\n <div ref={setContent} className=\"flow-root\">\n <OptionContext.Provider value={{ listId, activeValue, setActiveValue }}>\n <ResultList id={listId} label={listLabel} density=\"compact\" aria-busy={busy}>\n {children}\n </ResultList>\n </OptionContext.Provider>\n {options.length === 0 && empty ? (\n <Text tone=\"muted\" className=\"px-3 py-8 text-center\">\n {empty}\n </Text>\n ) : null}\n </div>\n </div>\n {footer ? (\n <div className=\"border-base-300 text-2xs text-base-700 hidden shrink-0 items-center gap-4 border-t px-4 py-2 pointer-fine:flex\">\n {footer}\n </div>\n ) : null}\n </NinnaModal.Content>\n </NinnaModal>\n );\n}\n\n/** A labelled run of options in the palette's list. */\nexport function CommandPaletteGroup({ label, children }: { label: string; children: ReactNode }) {\n const labelId = useId();\n\n return (\n <div role=\"group\" aria-labelledby={labelId} className=\"flex flex-col gap-1 not-first:pt-2\">\n <Text\n as=\"span\"\n id={labelId}\n variant=\"caption\"\n tone=\"muted\"\n className=\"px-2 pt-1 font-medium tracking-wide uppercase\"\n >\n {label}\n </Text>\n {children}\n </div>\n );\n}\n\n/** Props for a palette option, such as a `ResultRow`: its id, highlight and pointer tracking. */\nexport function useCommandPaletteOption(value: string) {\n const context = useContext(OptionContext);\n\n if (!context) throw new Error('useCommandPaletteOption must be used inside CommandPalette');\n\n return {\n id: optionId(context.listId, value),\n selected: context.activeValue === value,\n tabIndex: -1,\n onPointerMove: () => {\n if (context.activeValue !== value) context.setActiveValue(value);\n },\n };\n}\n\nfunction optionId(listId: string, value: string) {\n return `${listId}-${value.replace(/[^\\w-]/g, '_')}`;\n}\n"],"mappings":";;;;;;;;;;;AAmCA,MAAM,gBAAgB,cAIZ,IAAI;;;AAId,SAAgB,eAAe,EAC3B,OACA,aACA,aACA,OACA,eACA,OACA,SACA,UACA,SACA,WACA,OAAO,OACP,OACA,QACA,YACoB;CACpB,MAAM,SAAS,sBAAsB;CACrC,MAAM,aAAa,kBAAkB;CACrC,MAAM,EAAE,aAAa,YAAY,cAAc,cAAc;CAC7D,MAAM,SAAS,MAAM;CACrB,MAAM,QAAQ,OAAyB,IAAI;CAC3C,MAAM,CAAC,QAAQ,kBAAkB,SAAiB;CAElD,MAAM,cAAc,WAAW,KAAA,KAAa,QAAQ,SAAS,MAAM,IAAI,SAAS,QAAQ;CAExF,gBAAgB;EACZ,IAAI,aAAa,SAAS,eAAe,SAAS,QAAQ,WAAW,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,UAAU,CAAC;CAChH,GAAG,CAAC,aAAa,MAAM,CAAC;CAExB,OACI,oBAACA,OAAD;EAAY,MAAA;EAAK,eAAe,SAAS,CAAC,QAAQ,QAAQ;EACtD,UAAA,qBAACA,MAAW,SAAZ;GACI,OAAO;GACM;GACb,UAAU;GACV,GAAI;GACJ,WAAU;GALd,UAAA;IAOI,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACI,oBAAC,YAAD,CAAa,CAAA;MACZ,QACG,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACK,MAAM,OACP,oBAAC,UAAD;QACI,MAAK;QACL,UAAU;QACV,cAAY,MAAM;QAClB,WAAU;QACV,eAAe;SACX,MAAM,QAAQ;SACd,MAAM,SAAS,MAAM;QACzB;QAEA,UAAA,oBAAC,OAAD,CAAQ,CAAA;OACJ,CAAA,CACN;MACN,CAAA,IAAA;MACJ,oBAAC,SAAD;OACI,KAAK;OACL,MAAK;OACL,cAAY;OACZ,iBAAA;OACA,iBAAe;OACf,qBAAkB;OAClB,yBAAuB,cAAc,SAAS,QAAQ,WAAW,IAAI,KAAA;OACrE,aAAW;OACE;OACb,OAAO;OACP,WAAU;OACV,WAAW,UAAU,cAAc,MAAM,OAAO,KAAK;OACrD,YAAY,UAAU;QAClB,IAAI,MAAM,YAAY,aAAa;QAEnC,IAAI,MAAM,QAAQ,eAAe,CAAC,SAAS,OAAO;SAC9C,MAAM,eAAe;SACrB,MAAM,QAAQ;QAClB,OAAO,KAAK,MAAM,QAAQ,eAAe,MAAM,QAAQ,cAAc,QAAQ,QAAQ;SACjF,MAAM,eAAe;SAErB,MAAM,QAAQ,cAAc,QAAQ,QAAQ,WAAW,IAAI;SAC3D,MAAM,OAAO,MAAM,QAAQ,cAAc,IAAI;SAE7C,eAAe,SAAS,QAAQ,OAAO,QAAQ,UAAU,QAAQ,OAAQ;QAC7E,OAAO,IAAI,MAAM,QAAQ,WAAW,aAAa;SAC7C,MAAM,eAAe;SACrB,SAAS,WAAW;QACxB;OACJ;MACH,CAAA;MACD,oBAAC,QAAD;OAAM,WAAU;OACZ,UAAA,oBAAC,YAAD;QAAY,cAAY,OAAO;QAAO,MAAM,oBAAC,OAAD,CAAQ,CAAA;QAAG,SAAS;QAAS,SAAQ;OAAU,CAAA;MACzF,CAAA;KACL;;IACL,oBAAC,OAAD;KAAK,KAAK;KAAa,WAAW,yDAAyD;KACvF,UAAA,qBAAC,OAAD;MAAK,KAAK;MAAY,WAAU;MAAhC,UAAA,CACI,oBAAC,cAAc,UAAf;OAAwB,OAAO;QAAE;QAAQ;QAAa;OAAe;OACjE,UAAA,oBAAC,YAAD;QAAY,IAAI;QAAQ,OAAO;QAAW,SAAQ;QAAU,aAAW;QAClE;OACO,CAAA;MACQ,CAAA,GACvB,QAAQ,WAAW,KAAK,QACrB,oBAAC,MAAD;OAAM,MAAK;OAAQ,WAAU;OACxB,UAAA;MACC,CAAA,IACN,IACH;;IACJ,CAAA;IACJ,SACG,oBAAC,OAAD;KAAK,WAAU;KACV,UAAA;IACA,CAAA,IACL;GACY;;CACZ,CAAA;AAEpB;;AAGA,SAAgB,oBAAoB,EAAE,OAAO,YAAoD;CAC7F,MAAM,UAAU,MAAM;CAEtB,OACI,qBAAC,OAAD;EAAK,MAAK;EAAQ,mBAAiB;EAAS,WAAU;EAAtD,UAAA,CACI,oBAAC,MAAD;GACI,IAAG;GACH,IAAI;GACJ,SAAQ;GACR,MAAK;GACL,WAAU;GAET,UAAA;EACC,CAAA,GACL,QACA;;AAEb;;AAGA,SAAgB,wBAAwB,OAAe;CACnD,MAAM,UAAU,WAAW,aAAa;CAExC,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,4DAA4D;CAE1F,OAAO;EACH,IAAI,SAAS,QAAQ,QAAQ,KAAK;EAClC,UAAU,QAAQ,gBAAgB;EAClC,UAAU;EACV,qBAAqB;GACjB,IAAI,QAAQ,gBAAgB,OAAO,QAAQ,eAAe,KAAK;EACnE;CACJ;AACJ;AAEA,SAAS,SAAS,QAAgB,OAAe;CAC7C,OAAO,GAAG,OAAO,GAAG,MAAM,QAAQ,WAAW,GAAG;AACpD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from "react";
|
|
2
|
+
import { Drawer, DrawerBodyProps, DrawerContentProps, DrawerFooterProps } from "@ninna-ui/overlays";
|
|
3
|
+
interface DrawerContentPolicyProps extends Omit<DrawerContentProps, 'className' | 'placement' | 'size' | 'title'> {
|
|
4
|
+
title: string;
|
|
5
|
+
subtitle?: ReactNode;
|
|
6
|
+
/** Header controls shown before the close button. */
|
|
7
|
+
actions?: ReactNode;
|
|
8
|
+
/** Runs as the drawer closes; preventing its default keeps focus from returning to the opening control. */
|
|
9
|
+
onCloseAutoFocus?: (event: Event) => void;
|
|
10
|
+
}
|
|
11
|
+
declare function DrawerRoot(props: ComponentProps<typeof Drawer>): import("react").JSX.Element;
|
|
12
|
+
declare const Drawer$1: typeof DrawerRoot & {
|
|
13
|
+
Body: import("react").ForwardRefExoticComponent<Omit<DrawerBodyProps, "className"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
14
|
+
Content: import("react").ForwardRefExoticComponent<DrawerContentPolicyProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
15
|
+
Footer: import("react").ForwardRefExoticComponent<Omit<DrawerFooterProps, "className"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
16
|
+
Trigger: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DrawerTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
17
|
+
};
|
|
18
|
+
export { Drawer$1 as Drawer };
|
|
19
|
+
//# sourceMappingURL=Drawer.d.ts.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { IconButton } from "../actions/IconButton.js";
|
|
2
|
+
import { useDesignSystemLabels } from "../foundations/DesignSystemProvider.js";
|
|
3
|
+
import { Heading, Text } from "../typography/Typography.js";
|
|
4
|
+
import { useModalAutoFocus } from "./useModalAutoFocus.js";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { XIcon } from "lucide-react";
|
|
8
|
+
import { Drawer } from "@ninna-ui/overlays";
|
|
9
|
+
// src/overlays/Drawer.tsx
|
|
10
|
+
function DrawerRoot(props) {
|
|
11
|
+
return /* @__PURE__ */ jsx(Drawer, { ...props });
|
|
12
|
+
}
|
|
13
|
+
const DrawerContent = forwardRef(({ actions, children, description, subtitle, title, onCloseAutoFocus, ...props }, ref) => {
|
|
14
|
+
const labels = useDesignSystemLabels();
|
|
15
|
+
const autoFocus = useModalAutoFocus();
|
|
16
|
+
const focusProps = {
|
|
17
|
+
...autoFocus,
|
|
18
|
+
onCloseAutoFocus: (event) => {
|
|
19
|
+
onCloseAutoFocus?.(event);
|
|
20
|
+
if (!event.defaultPrevented) autoFocus.onCloseAutoFocus(event);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
return /* @__PURE__ */ jsxs(Drawer.Content, {
|
|
24
|
+
ref,
|
|
25
|
+
...props,
|
|
26
|
+
...focusProps,
|
|
27
|
+
title,
|
|
28
|
+
description,
|
|
29
|
+
placement: "right",
|
|
30
|
+
size: "lg",
|
|
31
|
+
className: "flex w-full max-w-xl flex-col overflow-hidden",
|
|
32
|
+
children: [/* @__PURE__ */ jsxs("header", {
|
|
33
|
+
"data-slot": "drawer-header",
|
|
34
|
+
className: "border-base-300 shrink-0 border-b px-5 py-5 sm:px-6 sm:py-6",
|
|
35
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
36
|
+
className: "grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-start gap-4",
|
|
37
|
+
children: [/* @__PURE__ */ jsx(Heading, {
|
|
38
|
+
as: "h2",
|
|
39
|
+
className: "min-w-0 wrap-break-word",
|
|
40
|
+
variant: "section",
|
|
41
|
+
children: title
|
|
42
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
43
|
+
className: "flex items-center gap-1",
|
|
44
|
+
children: [actions, /* @__PURE__ */ jsx(Drawer.Close, {
|
|
45
|
+
asChild: true,
|
|
46
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
47
|
+
"aria-label": labels.close,
|
|
48
|
+
icon: /* @__PURE__ */ jsx(XIcon, {}),
|
|
49
|
+
variant: "header"
|
|
50
|
+
})
|
|
51
|
+
})]
|
|
52
|
+
})]
|
|
53
|
+
}), subtitle ?? description ? /* @__PURE__ */ jsx(Text, {
|
|
54
|
+
className: "mt-2 wrap-break-word",
|
|
55
|
+
variant: "description",
|
|
56
|
+
tone: "muted",
|
|
57
|
+
children: subtitle ?? description
|
|
58
|
+
}) : null]
|
|
59
|
+
}), children]
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
DrawerContent.displayName = "Drawer.Content";
|
|
63
|
+
const DrawerBody = forwardRef((props, ref) => /* @__PURE__ */ jsx(Drawer.Body, {
|
|
64
|
+
ref,
|
|
65
|
+
...props,
|
|
66
|
+
className: "min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain px-5 py-5 sm:px-6"
|
|
67
|
+
}));
|
|
68
|
+
DrawerBody.displayName = "Drawer.Body";
|
|
69
|
+
const DrawerFooter = forwardRef((props, ref) => /* @__PURE__ */ jsx(Drawer.Footer, {
|
|
70
|
+
ref,
|
|
71
|
+
...props,
|
|
72
|
+
className: "border-base-300 shrink-0 justify-between border-t px-5 py-3 sm:px-6 sm:py-3"
|
|
73
|
+
}));
|
|
74
|
+
DrawerFooter.displayName = "Drawer.Footer";
|
|
75
|
+
const Drawer$1 = Object.assign(DrawerRoot, {
|
|
76
|
+
Body: DrawerBody,
|
|
77
|
+
Content: DrawerContent,
|
|
78
|
+
Footer: DrawerFooter,
|
|
79
|
+
Trigger: Drawer.Trigger
|
|
80
|
+
});
|
|
81
|
+
export { Drawer$1 as Drawer };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.js","names":["NinnaDrawer","Drawer"],"sources":["../../src/overlays/Drawer.tsx"],"sourcesContent":["/* oxlint-disable react/only-export-components -- Compound members are exported through Drawer. */\nimport {\n Drawer as NinnaDrawer,\n type DrawerBodyProps,\n type DrawerContentProps,\n type DrawerFooterProps,\n} from '@ninna-ui/overlays';\nimport { XIcon } from 'lucide-react';\nimport { type ComponentProps, forwardRef, type ReactNode } from 'react';\n\nimport { IconButton } from '../actions/IconButton';\nimport { useDesignSystemLabels } from '../foundations/DesignSystemProvider';\nimport { Heading, Text } from '../typography/Typography';\nimport { useModalAutoFocus } from './useModalAutoFocus';\n\ninterface DrawerContentPolicyProps extends Omit<DrawerContentProps, 'className' | 'placement' | 'size' | 'title'> {\n title: string;\n subtitle?: ReactNode;\n /** Header controls shown before the close button. */\n actions?: ReactNode;\n /** Runs as the drawer closes; preventing its default keeps focus from returning to the opening control. */\n onCloseAutoFocus?: (event: Event) => void;\n}\n\nfunction DrawerRoot(props: ComponentProps<typeof NinnaDrawer>) {\n return <NinnaDrawer {...props} />;\n}\n\nconst DrawerContent = forwardRef<HTMLDivElement, DrawerContentPolicyProps>(\n ({ actions, children, description, subtitle, title, onCloseAutoFocus, ...props }, ref) => {\n const labels = useDesignSystemLabels();\n const autoFocus = useModalAutoFocus();\n const focusProps = {\n ...autoFocus,\n onCloseAutoFocus: (event: Event) => {\n onCloseAutoFocus?.(event);\n\n if (!event.defaultPrevented) autoFocus.onCloseAutoFocus(event);\n },\n };\n\n return (\n <NinnaDrawer.Content\n ref={ref}\n {...props}\n {...focusProps}\n title={title}\n description={description}\n placement=\"right\"\n size=\"lg\"\n className=\"flex w-full max-w-xl flex-col overflow-hidden\"\n >\n <header\n data-slot=\"drawer-header\"\n className=\"border-base-300 shrink-0 border-b px-5 py-5 sm:px-6 sm:py-6\"\n >\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-start gap-4\">\n <Heading as=\"h2\" className=\"min-w-0 wrap-break-word\" variant=\"section\">\n {title}\n </Heading>\n <div className=\"flex items-center gap-1\">\n {actions}\n <NinnaDrawer.Close asChild>\n <IconButton aria-label={labels.close} icon={<XIcon />} variant=\"header\" />\n </NinnaDrawer.Close>\n </div>\n </div>\n {(subtitle ?? description) ? (\n <Text className=\"mt-2 wrap-break-word\" variant=\"description\" tone=\"muted\">\n {subtitle ?? description}\n </Text>\n ) : null}\n </header>\n {children}\n </NinnaDrawer.Content>\n );\n },\n);\n\nDrawerContent.displayName = 'Drawer.Content';\n\nconst DrawerBody = forwardRef<HTMLDivElement, Omit<DrawerBodyProps, 'className'>>((props, ref) => (\n <NinnaDrawer.Body\n ref={ref}\n {...props}\n className=\"min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain px-5 py-5 sm:px-6\"\n />\n));\n\nDrawerBody.displayName = 'Drawer.Body';\n\nconst DrawerFooter = forwardRef<HTMLDivElement, Omit<DrawerFooterProps, 'className'>>((props, ref) => (\n <NinnaDrawer.Footer\n ref={ref}\n {...props}\n className=\"border-base-300 shrink-0 justify-between border-t px-5 py-3 sm:px-6 sm:py-3\"\n />\n));\n\nDrawerFooter.displayName = 'Drawer.Footer';\n\nexport const Drawer = Object.assign(DrawerRoot, {\n Body: DrawerBody,\n Content: DrawerContent,\n Footer: DrawerFooter,\n Trigger: NinnaDrawer.Trigger,\n});\n"],"mappings":";;;;;;;;;AAwBA,SAAS,WAAW,OAA2C;CAC3D,OAAO,oBAACA,QAAD,EAAa,GAAI,MAAQ,CAAA;AACpC;AAEA,MAAM,gBAAgB,YACjB,EAAE,SAAS,UAAU,aAAa,UAAU,OAAO,kBAAkB,GAAG,SAAS,QAAQ;CACtF,MAAM,SAAS,sBAAsB;CACrC,MAAM,YAAY,kBAAkB;CACpC,MAAM,aAAa;EACf,GAAG;EACH,mBAAmB,UAAiB;GAChC,mBAAmB,KAAK;GAExB,IAAI,CAAC,MAAM,kBAAkB,UAAU,iBAAiB,KAAK;EACjE;CACJ;CAEA,OACI,qBAACA,OAAY,SAAb;EACS;EACL,GAAI;EACJ,GAAI;EACG;EACM;EACb,WAAU;EACV,MAAK;EACL,WAAU;EARd,UAAA,CAUI,qBAAC,UAAD;GACI,aAAU;GACV,WAAU;GAFd,UAAA,CAII,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,oBAAC,SAAD;KAAS,IAAG;KAAK,WAAU;KAA0B,SAAQ;KACxD,UAAA;IACI,CAAA,GACT,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACK,SACD,oBAACA,OAAY,OAAb;MAAmB,SAAA;MACf,UAAA,oBAAC,YAAD;OAAY,cAAY,OAAO;OAAO,MAAM,oBAAC,OAAD,CAAQ,CAAA;OAAG,SAAQ;MAAU,CAAA;KAC1D,CAAA,CAClB;IACJ,CAAA,CAAA;GACH,CAAA,GAAA,YAAY,cACV,oBAAC,MAAD;IAAM,WAAU;IAAuB,SAAQ;IAAc,MAAK;IAC7D,UAAA,YAAY;GACX,CAAA,IACN,IACA;EACP,CAAA,GAAA,QACgB;;AAE7B,CACJ;AAEA,cAAc,cAAc;AAE5B,MAAM,aAAa,YAAgE,OAAO,QACtF,oBAACA,OAAY,MAAb;CACS;CACL,GAAI;CACJ,WAAU;AACb,CAAA,CACJ;AAED,WAAW,cAAc;AAEzB,MAAM,eAAe,YAAkE,OAAO,QAC1F,oBAACA,OAAY,QAAb;CACS;CACL,GAAI;CACJ,WAAU;AACb,CAAA,CACJ;AAED,aAAa,cAAc;AAE3B,MAAaC,WAAS,OAAO,OAAO,YAAY;CAC5C,MAAM;CACN,SAAS;CACT,QAAQ;CACR,SAASD,OAAY;AACzB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
import { DropdownMenu, DropdownMenuContentProps, DropdownMenuItemProps, DropdownMenuLabelProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps } from "@ninna-ui/overlays";
|
|
3
|
+
interface DropdownMenuContentPolicyProps extends Omit<DropdownMenuContentProps, 'className'> {
|
|
4
|
+
width?: 'sm' | 'md';
|
|
5
|
+
}
|
|
6
|
+
interface DropdownMenuLabelPolicyProps extends Omit<DropdownMenuLabelProps, 'className'> {
|
|
7
|
+
presentation?: 'section' | 'identity';
|
|
8
|
+
}
|
|
9
|
+
interface DropdownMenuItemPolicyProps extends Omit<DropdownMenuItemProps, 'className'> {
|
|
10
|
+
/** Forward the underlying menu item's behavior to a link without a second tab stop. */
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
}
|
|
13
|
+
interface DropdownMenuRadioGroupPolicyProps extends Omit<DropdownMenuRadioGroupProps, 'className'> {
|
|
14
|
+
presentation?: 'default' | 'segmented';
|
|
15
|
+
}
|
|
16
|
+
interface DropdownMenuRadioItemPolicyProps extends Omit<DropdownMenuRadioItemProps, 'className'> {
|
|
17
|
+
presentation?: 'default' | 'segmented';
|
|
18
|
+
}
|
|
19
|
+
declare function DropdownMenuRoot(props: ComponentProps<typeof DropdownMenu>): import("react").JSX.Element;
|
|
20
|
+
declare const DropdownMenu$1: typeof DropdownMenuRoot & {
|
|
21
|
+
({ children, open, defaultOpen, onOpenChange, modal, dir }: import("@ninna-ui/overlays").DropdownMenuProps): import("react").JSX.Element;
|
|
22
|
+
displayName: string;
|
|
23
|
+
} & {
|
|
24
|
+
Trigger: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DropdownMenuTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
25
|
+
Content: import("react").ForwardRefExoticComponent<DropdownMenuContentProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
26
|
+
Item: import("react").ForwardRefExoticComponent<DropdownMenuItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
27
|
+
CheckboxItem: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DropdownMenuCheckboxItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
28
|
+
RadioGroup: import("react").ForwardRefExoticComponent<DropdownMenuRadioGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
29
|
+
RadioItem: import("react").ForwardRefExoticComponent<DropdownMenuRadioItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
30
|
+
Label: import("react").ForwardRefExoticComponent<DropdownMenuLabelProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
31
|
+
Separator: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DropdownMenuSeparatorProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
32
|
+
Group: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DropdownMenuGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
33
|
+
Sub: {
|
|
34
|
+
({ children, open, defaultOpen, onOpenChange }: import("@ninna-ui/overlays").DropdownMenuSubProps): import("react").JSX.Element;
|
|
35
|
+
displayName: string;
|
|
36
|
+
};
|
|
37
|
+
SubTrigger: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DropdownMenuSubTriggerProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
38
|
+
SubContent: import("react").ForwardRefExoticComponent<import("@ninna-ui/overlays").DropdownMenuSubContentProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
39
|
+
} & {
|
|
40
|
+
Content: import("react").ForwardRefExoticComponent<DropdownMenuContentPolicyProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
41
|
+
Item: import("react").ForwardRefExoticComponent<DropdownMenuItemPolicyProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
42
|
+
Label: import("react").ForwardRefExoticComponent<DropdownMenuLabelPolicyProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
43
|
+
RadioGroup: import("react").ForwardRefExoticComponent<DropdownMenuRadioGroupPolicyProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
44
|
+
RadioItem: import("react").ForwardRefExoticComponent<DropdownMenuRadioItemPolicyProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
45
|
+
};
|
|
46
|
+
export { DropdownMenu$1 as DropdownMenu };
|
|
47
|
+
//# sourceMappingURL=DropdownMenu.d.ts.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { forwardRef } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { DropdownMenu } from "@ninna-ui/overlays";
|
|
4
|
+
// src/overlays/DropdownMenu.tsx
|
|
5
|
+
const contentWidthClasses = {
|
|
6
|
+
sm: "w-60",
|
|
7
|
+
md: "w-64"
|
|
8
|
+
};
|
|
9
|
+
const DropdownMenuContent = forwardRef(({ side = "bottom", sideOffset = 8, width = "sm", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu.Content, {
|
|
10
|
+
ref,
|
|
11
|
+
side,
|
|
12
|
+
sideOffset,
|
|
13
|
+
...props,
|
|
14
|
+
className: `${contentWidthClasses[width]} max-h-(--radix-dropdown-menu-content-available-height) max-w-[calc(100vw-2rem)] overflow-y-auto`
|
|
15
|
+
}));
|
|
16
|
+
DropdownMenuContent.displayName = "DropdownMenu.Content";
|
|
17
|
+
const DropdownMenuLabel = forwardRef(({ presentation = "section", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu.Label, {
|
|
18
|
+
ref,
|
|
19
|
+
...props,
|
|
20
|
+
className: presentation === "identity" ? "tracking-normal normal-case" : void 0
|
|
21
|
+
}));
|
|
22
|
+
DropdownMenuLabel.displayName = "DropdownMenu.Label";
|
|
23
|
+
const DropdownMenuItem = forwardRef((props, ref) => /* @__PURE__ */ jsx(DropdownMenu.Item, {
|
|
24
|
+
ref,
|
|
25
|
+
...props,
|
|
26
|
+
className: "aria-[current=page]:bg-primary/10 aria-[current=page]:text-primary max-lg:min-h-11 pointer-coarse:min-h-11 [&>svg]:size-4 [&>svg]:shrink-0"
|
|
27
|
+
}));
|
|
28
|
+
DropdownMenuItem.displayName = "DropdownMenu.Item";
|
|
29
|
+
const DropdownMenuRadioGroup = forwardRef(({ presentation = "default", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu.RadioGroup, {
|
|
30
|
+
ref,
|
|
31
|
+
...props,
|
|
32
|
+
className: presentation === "segmented" ? "bg-base-200/70 flex gap-0.5 rounded-lg p-0.5" : void 0
|
|
33
|
+
}));
|
|
34
|
+
DropdownMenuRadioGroup.displayName = "DropdownMenu.RadioGroup";
|
|
35
|
+
const DropdownMenuRadioItem = forwardRef(({ onSelect, presentation = "default", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu.RadioItem, {
|
|
36
|
+
ref,
|
|
37
|
+
...props,
|
|
38
|
+
"data-presentation": presentation,
|
|
39
|
+
onSelect: presentation === "segmented" ? (event) => {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
onSelect?.(event);
|
|
42
|
+
} : onSelect,
|
|
43
|
+
className: presentation === "segmented" ? "text-base-600 focus:bg-base-300 focus:text-base-content data-[state=checked]:bg-base-100 data-[state=checked]:text-base-content size-7 justify-center rounded-md p-0 data-[state=checked]:shadow-sm [&>span]:hidden [&>svg]:size-4" : "max-lg:min-h-11 pointer-coarse:min-h-11 [&>svg]:size-4 [&>svg]:shrink-0"
|
|
44
|
+
}));
|
|
45
|
+
DropdownMenuRadioItem.displayName = "DropdownMenu.RadioItem";
|
|
46
|
+
function DropdownMenuRoot(props) {
|
|
47
|
+
return /* @__PURE__ */ jsx(DropdownMenu, { ...props });
|
|
48
|
+
}
|
|
49
|
+
const DropdownMenu$1 = Object.assign(DropdownMenuRoot, DropdownMenu, {
|
|
50
|
+
Content: DropdownMenuContent,
|
|
51
|
+
Item: DropdownMenuItem,
|
|
52
|
+
Label: DropdownMenuLabel,
|
|
53
|
+
RadioGroup: DropdownMenuRadioGroup,
|
|
54
|
+
RadioItem: DropdownMenuRadioItem
|
|
55
|
+
});
|
|
56
|
+
export { DropdownMenu$1 as DropdownMenu };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=DropdownMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","names":["NinnaDropdownMenu","DropdownMenu"],"sources":["../../src/overlays/DropdownMenu.tsx"],"sourcesContent":["/* oxlint-disable react/only-export-components -- Compound members are exported through DropdownMenu. */\n\nimport {\n DropdownMenu as NinnaDropdownMenu,\n type DropdownMenuContentProps,\n type DropdownMenuItemProps,\n type DropdownMenuLabelProps,\n type DropdownMenuRadioGroupProps,\n type DropdownMenuRadioItemProps,\n} from '@ninna-ui/overlays';\nimport { type ComponentProps, forwardRef } from 'react';\n\ninterface DropdownMenuContentPolicyProps extends Omit<DropdownMenuContentProps, 'className'> {\n width?: 'sm' | 'md';\n}\n\nconst contentWidthClasses: Record<NonNullable<DropdownMenuContentPolicyProps['width']>, string> = {\n sm: 'w-60',\n md: 'w-64',\n};\n\nconst DropdownMenuContent = forwardRef<HTMLDivElement, DropdownMenuContentPolicyProps>(\n ({ side = 'bottom', sideOffset = 8, width = 'sm', ...props }, ref) => (\n <NinnaDropdownMenu.Content\n ref={ref}\n side={side}\n sideOffset={sideOffset}\n {...props}\n className={`${contentWidthClasses[width]} max-h-(--radix-dropdown-menu-content-available-height) max-w-[calc(100vw-2rem)] overflow-y-auto`}\n />\n ),\n);\n\nDropdownMenuContent.displayName = 'DropdownMenu.Content';\n\ninterface DropdownMenuLabelPolicyProps extends Omit<DropdownMenuLabelProps, 'className'> {\n presentation?: 'section' | 'identity';\n}\n\nconst DropdownMenuLabel = forwardRef<HTMLDivElement, DropdownMenuLabelPolicyProps>(\n ({ presentation = 'section', ...props }, ref) => (\n <NinnaDropdownMenu.Label\n ref={ref}\n {...props}\n className={presentation === 'identity' ? 'tracking-normal normal-case' : undefined}\n />\n ),\n);\n\nDropdownMenuLabel.displayName = 'DropdownMenu.Label';\n\ninterface DropdownMenuItemPolicyProps extends Omit<DropdownMenuItemProps, 'className'> {\n /** Forward the underlying menu item's behavior to a link without a second tab stop. */\n asChild?: boolean;\n}\n\nconst DropdownMenuItem = forwardRef<HTMLDivElement, DropdownMenuItemPolicyProps>((props, ref) => (\n <NinnaDropdownMenu.Item\n ref={ref}\n {...props}\n className=\"aria-[current=page]:bg-primary/10 aria-[current=page]:text-primary max-lg:min-h-11 pointer-coarse:min-h-11 [&>svg]:size-4 [&>svg]:shrink-0\"\n />\n));\n\nDropdownMenuItem.displayName = 'DropdownMenu.Item';\n\ninterface DropdownMenuRadioGroupPolicyProps extends Omit<DropdownMenuRadioGroupProps, 'className'> {\n presentation?: 'default' | 'segmented';\n}\n\nconst DropdownMenuRadioGroup = forwardRef<HTMLDivElement, DropdownMenuRadioGroupPolicyProps>(\n ({ presentation = 'default', ...props }, ref) => (\n <NinnaDropdownMenu.RadioGroup\n ref={ref}\n {...props}\n className={presentation === 'segmented' ? 'bg-base-200/70 flex gap-0.5 rounded-lg p-0.5' : undefined}\n />\n ),\n);\n\nDropdownMenuRadioGroup.displayName = 'DropdownMenu.RadioGroup';\n\ninterface DropdownMenuRadioItemPolicyProps extends Omit<DropdownMenuRadioItemProps, 'className'> {\n presentation?: 'default' | 'segmented';\n}\n\nconst DropdownMenuRadioItem = forwardRef<HTMLDivElement, DropdownMenuRadioItemPolicyProps>(\n ({ onSelect, presentation = 'default', ...props }, ref) => (\n <NinnaDropdownMenu.RadioItem\n ref={ref}\n {...props}\n data-presentation={presentation}\n onSelect={\n presentation === 'segmented'\n ? (event) => {\n event.preventDefault();\n onSelect?.(event);\n }\n : onSelect\n }\n className={\n presentation === 'segmented'\n ? 'text-base-600 focus:bg-base-300 focus:text-base-content data-[state=checked]:bg-base-100 data-[state=checked]:text-base-content size-7 justify-center rounded-md p-0 data-[state=checked]:shadow-sm [&>span]:hidden [&>svg]:size-4'\n : 'max-lg:min-h-11 pointer-coarse:min-h-11 [&>svg]:size-4 [&>svg]:shrink-0'\n }\n />\n ),\n);\n\nDropdownMenuRadioItem.displayName = 'DropdownMenu.RadioItem';\n\nfunction DropdownMenuRoot(props: ComponentProps<typeof NinnaDropdownMenu>) {\n return <NinnaDropdownMenu {...props} />;\n}\n\nexport const DropdownMenu = Object.assign(DropdownMenuRoot, NinnaDropdownMenu, {\n Content: DropdownMenuContent,\n Item: DropdownMenuItem,\n Label: DropdownMenuLabel,\n RadioGroup: DropdownMenuRadioGroup,\n RadioItem: DropdownMenuRadioItem,\n});\n"],"mappings":";;;;AAgBA,MAAM,sBAA4F;CAC9F,IAAI;CACJ,IAAI;AACR;AAEA,MAAM,sBAAsB,YACvB,EAAE,OAAO,UAAU,aAAa,GAAG,QAAQ,MAAM,GAAG,SAAS,QAC1D,oBAACA,aAAkB,SAAnB;CACS;CACC;CACM;CACZ,GAAI;CACJ,WAAW,GAAG,oBAAoB,OAAO;AAC5C,CAAA,CAET;AAEA,oBAAoB,cAAc;AAMlC,MAAM,oBAAoB,YACrB,EAAE,eAAe,WAAW,GAAG,SAAS,QACrC,oBAACA,aAAkB,OAAnB;CACS;CACL,GAAI;CACJ,WAAW,iBAAiB,aAAa,gCAAgC,KAAA;AAC5E,CAAA,CAET;AAEA,kBAAkB,cAAc;AAOhC,MAAM,mBAAmB,YAAyD,OAAO,QACrF,oBAACA,aAAkB,MAAnB;CACS;CACL,GAAI;CACJ,WAAU;AACb,CAAA,CACJ;AAED,iBAAiB,cAAc;AAM/B,MAAM,yBAAyB,YAC1B,EAAE,eAAe,WAAW,GAAG,SAAS,QACrC,oBAACA,aAAkB,YAAnB;CACS;CACL,GAAI;CACJ,WAAW,iBAAiB,cAAc,iDAAiD,KAAA;AAC9F,CAAA,CAET;AAEA,uBAAuB,cAAc;AAMrC,MAAM,wBAAwB,YACzB,EAAE,UAAU,eAAe,WAAW,GAAG,SAAS,QAC/C,oBAACA,aAAkB,WAAnB;CACS;CACL,GAAI;CACJ,qBAAmB;CACnB,UACI,iBAAiB,eACV,UAAU;EACP,MAAM,eAAe;EACrB,WAAW,KAAK;CACpB,IACA;CAEV,WACI,iBAAiB,cACX,uOACA;AAEb,CAAA,CAET;AAEA,sBAAsB,cAAc;AAEpC,SAAS,iBAAiB,OAAiD;CACvE,OAAO,oBAACA,cAAD,EAAmB,GAAI,MAAQ,CAAA;AAC1C;AAEA,MAAaC,iBAAe,OAAO,OAAO,kBAAkBD,cAAmB;CAC3E,SAAS;CACT,MAAM;CACN,OAAO;CACP,YAAY;CACZ,WAAW;AACf,CAAC"}
|