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