@ghxstship/xos-ui 0.0.0-stage → 4.16.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/LICENSE +21 -0
- package/README.md +32 -2
- package/package.json +76 -4
- package/scripts/generate-stories.mjs +85 -0
- package/src/AIDisclosureBadge/README.md +7 -0
- package/src/AccessGridMatrix/README.md +3 -0
- package/src/Accordion/README.md +7 -0
- package/src/ActivityFeedItem/README.md +3 -0
- package/src/AgencySlate/README.md +3 -0
- package/src/AppShell/README.md +5 -0
- package/src/ApplicationForm/README.md +3 -0
- package/src/AssertionRankBadge/README.md +5 -0
- package/src/AvailabilityCalendar/README.md +3 -0
- package/src/Avatar/Avatar.tsx +56 -0
- package/src/Avatar/README.md +3 -0
- package/src/Avatar/avatar-class.ts +19 -0
- package/src/AvatarStack/README.md +3 -0
- package/src/Badge/README.md +3 -0
- package/src/Banner/README.md +3 -0
- package/src/BidSheet/README.md +3 -0
- package/src/Board/README.md +6 -0
- package/src/BrandMark/BrandMark.tsx +95 -0
- package/src/BrandMark/README.md +7 -0
- package/src/BrandSlot/README.md +6 -0
- package/src/Breadcrumbs/README.md +3 -0
- package/src/BudgetGrid/README.md +10 -0
- package/src/BulkActionBar/README.md +3 -0
- package/src/Button/Button.tsx +100 -0
- package/src/Button/README.md +10 -0
- package/src/Button/button-class.ts +54 -0
- package/src/ButtonLink/README.md +7 -0
- package/src/Calendar/README.md +3 -0
- package/src/Card/README.md +3 -0
- package/src/Chart/README.md +9 -0
- package/src/Charts/Calendar.tsx +228 -0
- package/src/Charts/Chart.tsx +547 -0
- package/src/Charts/Charts.tsx +20 -0
- package/src/Charts/Charts.types.ts +40 -0
- package/src/Charts/Gallery.tsx +25 -0
- package/src/Charts/Heatmap.tsx +116 -0
- package/src/Charts/OrgChart.tsx +53 -0
- package/src/Charts/ResourceSchedule.tsx +91 -0
- package/src/Charts/Sparkline.tsx +59 -0
- package/src/Charts/Timeline.tsx +777 -0
- package/src/Charts/categories.ts +21 -0
- package/src/Charts/timeline-plan.ts +191 -0
- package/src/Checkbox/README.md +6 -0
- package/src/ChecklistRunner/README.md +3 -0
- package/src/Chips/Badge.tsx +27 -0
- package/src/Chips/Chips.shared.tsx +34 -0
- package/src/Chips/Chips.tsx +21 -0
- package/src/Chips/Chips.types.ts +35 -0
- package/src/Chips/DepartmentChip.tsx +16 -0
- package/src/Chips/PhaseChip.tsx +16 -0
- package/src/Chips/PropertyChip.tsx +15 -0
- package/src/Chips/RecordKindChip.tsx +14 -0
- package/src/Chips/StateChip.tsx +19 -0
- package/src/Chips/Tag.tsx +47 -0
- package/src/Chips/URIDChip.tsx +14 -0
- package/src/Chips/chipClass.tsx +8 -0
- package/src/Chips/codeClass.tsx +6 -0
- package/src/ClockButton/README.md +6 -0
- package/src/CodeSample/README.md +7 -0
- package/src/ColorPicker/README.md +5 -0
- package/src/Combobox/README.md +7 -0
- package/src/CommandMenu/CommandMenu.tsx +179 -0
- package/src/CommandMenu/README.md +5 -0
- package/src/ComparisonTable/README.md +9 -0
- package/src/Compass/ChecklistRunner.tsx +128 -0
- package/src/Compass/ClockButton.tsx +57 -0
- package/src/Compass/Compass.shared.tsx +58 -0
- package/src/Compass/Compass.tsx +26 -0
- package/src/Compass/Compass.types.ts +79 -0
- package/src/Compass/DaySheetView.tsx +104 -0
- package/src/Compass/ForceUpdateScreen.tsx +29 -0
- package/src/Compass/LiveActivity.tsx +60 -0
- package/src/Compass/OfflineBanner.tsx +31 -0
- package/src/Compass/PhotoCapture.tsx +69 -0
- package/src/Compass/QuickIncidentSheet.tsx +46 -0
- package/src/Compass/ScanSheet.tsx +83 -0
- package/src/Compass/ShiftCard.tsx +55 -0
- package/src/Compass/SignaturePad.tsx +71 -0
- package/src/Compass/SyncConflictSheet.tsx +60 -0
- package/src/ConsentBanner/ConsentBanner.tsx +210 -0
- package/src/ConsentBanner/ConsentBannerStatic.tsx +163 -0
- package/src/ConsentBanner/ConsentSettings.tsx +213 -0
- package/src/ConsentBanner/README.md +101 -0
- package/src/ConsentBanner/consent.ts +238 -0
- package/src/ConsentBanner/index.ts +40 -0
- package/src/ConsentBanner/static.ts +11 -0
- package/src/ConsentBanner/useConsent.ts +160 -0
- package/src/ContextMenu/README.md +3 -0
- package/src/CoordinateMatrix/README.md +6 -0
- package/src/CredentialBadge/README.md +7 -0
- package/src/CurrencyInput/README.md +7 -0
- package/src/DataTable/DataTable.tsx +1034 -0
- package/src/DataTable/DataTableResizer.tsx +72 -0
- package/src/DataTable/DataTableVirtualizer.tsx +58 -0
- package/src/DataTable/README.md +9 -0
- package/src/DatePicker/README.md +5 -0
- package/src/DateRangePicker/README.md +3 -0
- package/src/DaySheetView/README.md +3 -0
- package/src/DepartmentChip/README.md +3 -0
- package/src/DepartmentGlyph/README.md +18 -0
- package/src/Dialog/README.md +3 -0
- package/src/DiffViewer/README.md +3 -0
- package/src/Divider/README.md +3 -0
- package/src/Drawer/README.md +3 -0
- package/src/DropdownMenu/README.md +3 -0
- package/src/EPKViewer/README.md +3 -0
- package/src/Editing/ColorPicker.tsx +125 -0
- package/src/Editing/DiffViewer.tsx +49 -0
- package/src/Editing/Editing.tsx +29 -0
- package/src/Editing/Editing.types.ts +71 -0
- package/src/Editing/FilterBuilder.tsx +72 -0
- package/src/Editing/QuickAdd.tsx +102 -0
- package/src/Editing/QuickAddChips.tsx +180 -0
- package/src/Editing/contrastRatio.tsx +11 -0
- package/src/Editing/parseQuickAdd.tsx +187 -0
- package/src/Editing/quickAddCore.ts +204 -0
- package/src/Editing/timeShorthand.ts +157 -0
- package/src/Editing/useQuickAdd.ts +201 -0
- package/src/EmergencyCodeCard/README.md +10 -0
- package/src/EmptyState/README.md +5 -0
- package/src/EngagementTimeline/README.md +3 -0
- package/src/ErrorState/README.md +3 -0
- package/src/FAQ/README.md +7 -0
- package/src/FeatureGrid/README.md +7 -0
- package/src/Feedback/Banner.tsx +40 -0
- package/src/Feedback/EmptyState.tsx +32 -0
- package/src/Feedback/ErrorState.tsx +32 -0
- package/src/Feedback/Feedback.shared.tsx +38 -0
- package/src/Feedback/Feedback.tsx +18 -0
- package/src/Feedback/Feedback.types.ts +40 -0
- package/src/Feedback/InlineAlert.tsx +19 -0
- package/src/Feedback/RefusalNotice.tsx +46 -0
- package/src/Feedback/RegionBoundary.tsx +102 -0
- package/src/Feedback/Toast.tsx +31 -0
- package/src/Feedback/ToastRegion.tsx +26 -0
- package/src/Feedback/UndoToast.tsx +97 -0
- package/src/FeedbackWidget/README.md +3 -0
- package/src/Field/Field.tsx +81 -0
- package/src/FileDrop/README.md +3 -0
- package/src/FilePreviewer/README.md +3 -0
- package/src/FilterBuilder/README.md +3 -0
- package/src/ForceUpdateScreen/README.md +3 -0
- package/src/Forms/Checkbox.tsx +14 -0
- package/src/Forms/CurrencyInput.tsx +40 -0
- package/src/Forms/Forms.shared.tsx +5 -0
- package/src/Forms/Forms.tsx +20 -0
- package/src/Forms/Forms.types.ts +33 -0
- package/src/Forms/Input.tsx +28 -0
- package/src/Forms/Money.tsx +15 -0
- package/src/Forms/NumberInput.tsx +85 -0
- package/src/Forms/Radio.tsx +31 -0
- package/src/Forms/Select.tsx +54 -0
- package/src/Forms/Switch.tsx +14 -0
- package/src/Forms/Textarea.tsx +30 -0
- package/src/Gallery/README.md +5 -0
- package/src/GateLifecycleRail/README.md +7 -0
- package/src/GateReadinessPanel/README.md +8 -0
- package/src/Gateway/AgencySlate.tsx +76 -0
- package/src/Gateway/ApplicationForm.tsx +48 -0
- package/src/Gateway/AvailabilityCalendar.tsx +82 -0
- package/src/Gateway/EPKViewer.tsx +77 -0
- package/src/Gateway/EngagementTimeline.tsx +43 -0
- package/src/Gateway/Gateway.shared.tsx +5 -0
- package/src/Gateway/Gateway.tsx +30 -0
- package/src/Gateway/Gateway.types.ts +69 -0
- package/src/Gateway/OnboardingPacket.tsx +61 -0
- package/src/Gateway/OpportunityCard.tsx +73 -0
- package/src/Gateway/OpportunityFilters.tsx +64 -0
- package/src/Gateway/PaymentTracker.tsx +71 -0
- package/src/Gateway/PayoutDetailsForm.tsx +62 -0
- package/src/Gateway/ProfileEditor.tsx +45 -0
- package/src/Gateway/ProgressBar.tsx +30 -0
- package/src/Gateway/RatingDialog.tsx +83 -0
- package/src/Gateway/UpNextCard.tsx +76 -0
- package/src/Glyphs/Glyphs.tsx +66 -0
- package/src/Grids/BidSheet.tsx +63 -0
- package/src/Grids/BudgetGrid.tsx +164 -0
- package/src/Grids/Grids.shared.tsx +5 -0
- package/src/Grids/Grids.tsx +11 -0
- package/src/Grids/Grids.types.ts +38 -0
- package/src/Grids/SpreadsheetGrid.tsx +445 -0
- package/src/Grids/columnTotal.tsx +14 -0
- package/src/Grids/glForCode.tsx +11 -0
- package/src/Grids/parseCell.tsx +16 -0
- package/src/Help/FeedbackWidget.tsx +89 -0
- package/src/Help/Help.tsx +14 -0
- package/src/Help/Help.types.ts +51 -0
- package/src/Help/HelpPanel.tsx +116 -0
- package/src/Help/NotificationCenter.tsx +100 -0
- package/src/Help/OnboardingChecklist.tsx +57 -0
- package/src/Help/ShortcutEditor.tsx +81 -0
- package/src/Help/WhatsNew.tsx +33 -0
- package/src/HelpPanel/README.md +5 -0
- package/src/HoverCard/README.md +3 -0
- package/src/Icon/Icon.tsx +47 -0
- package/src/Icon/README.md +9 -0
- package/src/IconButton/README.md +6 -0
- package/src/Identity/BrandSlot.tsx +20 -0
- package/src/Identity/BrandSlotFrame.tsx +38 -0
- package/src/Identity/CredentialBadge.tsx +92 -0
- package/src/Identity/Identity.tsx +14 -0
- package/src/Identity/Identity.types.ts +25 -0
- package/src/Identity/PresenceIndicator.tsx +37 -0
- package/src/Identity/QRCode.tsx +22 -0
- package/src/Identity/WhiteLabelPreview.tsx +33 -0
- package/src/Identity/qrPath.tsx +16 -0
- package/src/Identity/tokenVariable.tsx +9 -0
- package/src/InlineAlert/README.md +3 -0
- package/src/Input/README.md +8 -0
- package/src/Kbd/Kbd.tsx +30 -0
- package/src/Kbd/README.md +6 -0
- package/src/Layout/AppShell.tsx +151 -0
- package/src/Layout/Layout.tsx +14 -0
- package/src/Layout/Layout.types.ts +43 -0
- package/src/Layout/PageHeader.tsx +22 -0
- package/src/Layout/ResizablePanel.tsx +81 -0
- package/src/Layout/ScrollRegion.tsx +107 -0
- package/src/Layout/SplitView.tsx +78 -0
- package/src/Layout/Stepper.tsx +39 -0
- package/src/LegalText/LegalText.tsx +289 -0
- package/src/LegalText/README.md +10 -0
- package/src/LegalText/index.ts +29 -0
- package/src/LegalText/legal-markdown.ts +581 -0
- package/src/Link/Link.tsx +25 -0
- package/src/Link/README.md +5 -0
- package/src/Link/link-class.ts +10 -0
- package/src/LiveActivity/README.md +3 -0
- package/src/LogoSlotWall/README.md +7 -0
- package/src/MapView/README.md +5 -0
- package/src/Marketing/AIDisclosureBadge.tsx +31 -0
- package/src/Marketing/ButtonLink.tsx +32 -0
- package/src/Marketing/CodeSample.tsx +47 -0
- package/src/Marketing/ComparisonScroll.tsx +7 -0
- package/src/Marketing/ComparisonTable.tsx +104 -0
- package/src/Marketing/FAQ.tsx +26 -0
- package/src/Marketing/FeatureGrid.tsx +65 -0
- package/src/Marketing/GateLifecycleRail.tsx +52 -0
- package/src/Marketing/LogoSlotWall.tsx +53 -0
- package/src/Marketing/Marketing.tsx +49 -0
- package/src/Marketing/Marketing.types.ts +64 -0
- package/src/Marketing/MarketingFooter.tsx +88 -0
- package/src/Marketing/MarketingHero.tsx +45 -0
- package/src/Marketing/MarketingNav.tsx +76 -0
- package/src/Marketing/MarketingPoints.tsx +16 -0
- package/src/Marketing/MarketingSection.tsx +52 -0
- package/src/Marketing/PersonaSwitcher.tsx +137 -0
- package/src/Marketing/PriceDisplay.tsx +56 -0
- package/src/Marketing/PricingTable.tsx +122 -0
- package/src/Marketing/ProofStatStrip.tsx +35 -0
- package/src/Marketing/ScreenshotFrame.tsx +56 -0
- package/src/Marketing/SurfaceTriptych.tsx +43 -0
- package/src/Marketing/Testimonial.tsx +45 -0
- package/src/Marketing/marketing-copy.ts +25 -0
- package/src/Marketing/provided.tsx +36 -0
- package/src/MarketingFooter/README.md +7 -0
- package/src/MarketingHero/README.md +7 -0
- package/src/MarketingNav/README.md +7 -0
- package/src/MarketingSection/README.md +7 -0
- package/src/Media/FilePreviewer.tsx +86 -0
- package/src/Media/MapView.tsx +200 -0
- package/src/Media/Media.tsx +11 -0
- package/src/Media/Media.types.ts +47 -0
- package/src/Media/RichTextEditor.tsx +198 -0
- package/src/Media/toLngLat.tsx +13 -0
- package/src/Menus/ContextMenu.tsx +106 -0
- package/src/Menus/DropdownMenu.tsx +51 -0
- package/src/Menus/Menus.shared.tsx +67 -0
- package/src/Menus/Menus.tsx +13 -0
- package/src/Menus/Menus.types.ts +49 -0
- package/src/Menus/OrgSwitcher.tsx +69 -0
- package/src/Menus/compactTriggerClass.tsx +7 -0
- package/src/Menus/menuClass.tsx +4 -0
- package/src/Menus/menuItemClass.tsx +7 -0
- package/src/Menus/orgSwitcherTriggerClass.tsx +7 -0
- package/src/Money/README.md +6 -0
- package/src/MultiSelect/README.md +3 -0
- package/src/Navigation/Accordion.tsx +59 -0
- package/src/Navigation/Breadcrumbs.tsx +59 -0
- package/src/Navigation/MoreFields.tsx +42 -0
- package/src/Navigation/Navigation.shared.tsx +32 -0
- package/src/Navigation/Navigation.tsx +21 -0
- package/src/Navigation/Navigation.types.ts +63 -0
- package/src/Navigation/Pagination.tsx +30 -0
- package/src/Navigation/SegmentedControl.tsx +87 -0
- package/src/Navigation/Sidebar.tsx +106 -0
- package/src/Navigation/TabBar.tsx +61 -0
- package/src/Navigation/Tabs.tsx +79 -0
- package/src/Navigation/TopNav.tsx +86 -0
- package/src/Navigation/sidebar-classes.ts +18 -0
- package/src/NotificationCenter/README.md +3 -0
- package/src/NumberInput/README.md +3 -0
- package/src/OfflineBanner/README.md +3 -0
- package/src/OnboardingChecklist/README.md +3 -0
- package/src/OnboardingPacket/README.md +3 -0
- package/src/OpportunityCard/README.md +5 -0
- package/src/OpportunityFilters/README.md +3 -0
- package/src/OrgChart/README.md +5 -0
- package/src/OrgSwitcher/README.md +3 -0
- package/src/Overlays/Dialog.tsx +54 -0
- package/src/Overlays/Drawer.tsx +62 -0
- package/src/Overlays/HoverCard.tsx +59 -0
- package/src/Overlays/Overlays.shared.tsx +12 -0
- package/src/Overlays/Overlays.tsx +20 -0
- package/src/Overlays/Overlays.types.ts +66 -0
- package/src/Overlays/Popover.tsx +70 -0
- package/src/Overlays/PropertyList.tsx +19 -0
- package/src/Overlays/ShortcutSheet.tsx +62 -0
- package/src/Overlays/SidePeek.tsx +117 -0
- package/src/Overlays/Tooltip.tsx +73 -0
- package/src/Overlays/panelClass.tsx +6 -0
- package/src/Overlays/popoverPanelClass.tsx +6 -0
- package/src/PageHeader/README.md +3 -0
- package/src/Pagination/README.md +3 -0
- package/src/PaymentTracker/README.md +3 -0
- package/src/PayoutDetailsForm/README.md +3 -0
- package/src/PersonaSwitcher/README.md +7 -0
- package/src/PhaseChip/README.md +5 -0
- package/src/PhaseGlyph/README.md +17 -0
- package/src/PhotoCapture/README.md +3 -0
- package/src/Pickers/Combobox.tsx +91 -0
- package/src/Pickers/DatePicker.tsx +60 -0
- package/src/Pickers/DateRangePicker.tsx +78 -0
- package/src/Pickers/FileDrop.tsx +84 -0
- package/src/Pickers/MultiSelect.tsx +118 -0
- package/src/Pickers/Pickers.shared.tsx +337 -0
- package/src/Pickers/Pickers.tsx +17 -0
- package/src/Pickers/Pickers.types.ts +47 -0
- package/src/Pickers/Slider.tsx +59 -0
- package/src/Pickers/TimePicker.tsx +68 -0
- package/src/Pickers/rankOptions.tsx +12 -0
- package/src/Popover/README.md +3 -0
- package/src/PresenceIndicator/README.md +3 -0
- package/src/PriceDisplay/README.md +7 -0
- package/src/PricingTable/README.md +9 -0
- package/src/ProfileEditor/README.md +3 -0
- package/src/ProgressBar/README.md +3 -0
- package/src/ProofStatStrip/README.md +7 -0
- package/src/PropertyChip/README.md +3 -0
- package/src/ProvenanceBadge/README.md +3 -0
- package/src/QRCode/README.md +6 -0
- package/src/QuickAdd/README.md +5 -0
- package/src/QuickIncidentSheet/README.md +3 -0
- package/src/Radio/README.md +3 -0
- package/src/RadioChannelTable/README.md +7 -0
- package/src/RatingDialog/README.md +3 -0
- package/src/ReconciliationTable/README.md +3 -0
- package/src/RecordKindChip/README.md +3 -0
- package/src/RecordKindGlyph/README.md +34 -0
- package/src/RecordRow/README.md +7 -0
- package/src/RefusalNotice/README.md +5 -0
- package/src/ResizablePanel/README.md +3 -0
- package/src/ResourceSchedule/README.md +6 -0
- package/src/RichTextEditor/README.md +3 -0
- package/src/RichTextEditor/extensions.ts +217 -0
- package/src/RunOfShowLive/README.md +5 -0
- package/src/ScanSheet/README.md +3 -0
- package/src/ScreenshotFrame/README.md +7 -0
- package/src/ScrollRegion/README.md +9 -0
- package/src/SegmentedControl/README.md +5 -0
- package/src/Select/README.md +5 -0
- package/src/ShiftCard/README.md +3 -0
- package/src/ShortcutEditor/README.md +3 -0
- package/src/ShortcutSheet/README.md +3 -0
- package/src/SidePeek/README.md +6 -0
- package/src/Sidebar/README.md +5 -0
- package/src/SignaturePad/README.md +3 -0
- package/src/Skeleton/README.md +3 -0
- package/src/Slider/README.md +3 -0
- package/src/SplitView/README.md +3 -0
- package/src/SpreadsheetGrid/README.md +9 -0
- package/src/StalenessIndicator/README.md +3 -0
- package/src/StatTile/README.md +6 -0
- package/src/StateChip/README.md +6 -0
- package/src/StateIcon/README.md +6 -0
- package/src/StateIcon/StateIcon.tsx +127 -0
- package/src/StatusHeatmap/README.md +15 -0
- package/src/Stepper/README.md +3 -0
- package/src/Surface/Skeleton.tsx +21 -0
- package/src/Surface/Surface.tsx +63 -0
- package/src/SurfaceTriptych/README.md +7 -0
- package/src/Switch/README.md +5 -0
- package/src/SyncConflictSheet/README.md +3 -0
- package/src/TabBar/README.md +7 -0
- package/src/Tabs/README.md +6 -0
- package/src/Tag/README.md +3 -0
- package/src/TemplateAuth/README.md +6 -0
- package/src/TemplateCollection/README.md +6 -0
- package/src/TemplateDashboard/README.md +8 -0
- package/src/TemplateDocument/README.md +5 -0
- package/src/TemplateGatewayShell/README.md +5 -0
- package/src/TemplateGridEditor/README.md +3 -0
- package/src/TemplateRecord/README.md +3 -0
- package/src/TemplateSettings/README.md +5 -0
- package/src/TemplateSplitView/README.md +3 -0
- package/src/TemplateSystem/README.md +5 -0
- package/src/TemplateWizard/README.md +3 -0
- package/src/Templates/TemplateAuth.tsx +16 -0
- package/src/Templates/TemplateCollection.tsx +35 -0
- package/src/Templates/TemplateDashboard.tsx +200 -0
- package/src/Templates/TemplateDocument.tsx +24 -0
- package/src/Templates/TemplateGatewayShell.tsx +36 -0
- package/src/Templates/TemplateGridEditor.tsx +17 -0
- package/src/Templates/TemplateRecord.tsx +31 -0
- package/src/Templates/TemplateSettings.tsx +26 -0
- package/src/Templates/TemplateSplitView.tsx +27 -0
- package/src/Templates/TemplateSystem.tsx +19 -0
- package/src/Templates/TemplateSystemLink.tsx +55 -0
- package/src/Templates/TemplateWizard.tsx +43 -0
- package/src/Templates/Templates.tsx +29 -0
- package/src/Templates/Templates.types.ts +153 -0
- package/src/Testimonial/README.md +7 -0
- package/src/Textarea/README.md +3 -0
- package/src/TimePicker/README.md +5 -0
- package/src/Timeline/README.md +6 -0
- package/src/Toast/README.md +3 -0
- package/src/Tooltip/README.md +3 -0
- package/src/TopNav/README.md +5 -0
- package/src/TreeView/README.md +3 -0
- package/src/URIDChip/README.md +5 -0
- package/src/UndoToast/README.md +3 -0
- package/src/UpNextCard/README.md +6 -0
- package/src/Views/ActivityFeedItem.tsx +52 -0
- package/src/Views/Board.tsx +229 -0
- package/src/Views/BulkActionBar.tsx +76 -0
- package/src/Views/RecordList.tsx +146 -0
- package/src/Views/RecordRow.tsx +132 -0
- package/src/Views/StatTile.tsx +88 -0
- package/src/Views/TreeView.tsx +161 -0
- package/src/Views/Views.tsx +18 -0
- package/src/Views/Views.types.ts +99 -0
- package/src/WhatsNew/README.md +3 -0
- package/src/WhiteLabelPreview/README.md +8 -0
- package/src/XOS/AccessGridMatrix.tsx +111 -0
- package/src/XOS/AssertionRankBadge.tsx +27 -0
- package/src/XOS/CoordinateMatrix.tsx +123 -0
- package/src/XOS/EmergencyCodeCard.tsx +109 -0
- package/src/XOS/GateReadinessPanel.tsx +100 -0
- package/src/XOS/ProvenanceBadge.tsx +19 -0
- package/src/XOS/RadioChannelTable.tsx +50 -0
- package/src/XOS/ReconciliationTable.tsx +64 -0
- package/src/XOS/RunOfShowLive.tsx +97 -0
- package/src/XOS/StalenessIndicator.tsx +31 -0
- package/src/XOS/StatusHeatmap.tsx +200 -0
- package/src/XOS/XOS.shared.tsx +90 -0
- package/src/XOS/XOS.tsx +29 -0
- package/src/XOS/XOS.types.ts +99 -0
- package/src/XOS/resolveStep.tsx +16 -0
- package/src/brand/defaults/README.md +13 -0
- package/src/brand/defaults/app-icon.svg +6 -0
- package/src/brand/defaults/favicon.svg +6 -0
- package/src/brand/defaults/logo-dark.svg +6 -0
- package/src/brand/defaults/logo-light.svg +6 -0
- package/src/brand/defaults/splash.svg +6 -0
- package/src/index.ts +606 -0
- package/src/lib/context.tsx +156 -0
- package/src/lib/cx.ts +4 -0
- package/src/lib/format.ts +200 -0
- package/src/lib/hooks.ts +187 -0
- package/src/lib/i18n.ts +97 -0
- package/src/lib/icons.ts +45 -0
- package/src/lib/live.ts +92 -0
- package/src/lib/preferences.ts +242 -0
- package/src/lib/route-transition.tsx +22 -0
- package/src/lib/selection.ts +92 -0
- package/src/lib/shortcut-targets.ts +125 -0
- package/src/lib/theme.ts +50 -0
- package/src/lib/undo-stack.ts +125 -0
- package/src/marketing.ts +33 -0
- package/src/pwa/action-outcome.tsx +81 -0
- package/src/pwa/analytics.ts +236 -0
- package/src/pwa/browser-push.tsx +132 -0
- package/src/pwa/client.ts +126 -0
- package/src/pwa/index.ts +40 -0
- package/src/pwa/offline-key.ts +18 -0
- package/src/pwa/service-worker.ts +229 -0
- package/src/static.ts +10 -0
- package/src/styles/base.css +208 -0
- package/src/styles/components.css +453 -0
- package/src/styles/index.css +16 -0
- package/src/styles/marketing.css +1260 -0
- package/src/styles/reference.css +5792 -0
- package/src/types/reference.d.ts +1608 -0
- package/tailwind.config.cjs +3 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { useState, type ReactElement } from "react";
|
|
2
|
+
import { Popover as RPopover } from "radix-ui";
|
|
3
|
+
import type { Option } from "../types/reference";
|
|
4
|
+
import { cx } from "../lib/cx.ts";
|
|
5
|
+
import { useT } from "../lib/context.tsx";
|
|
6
|
+
import { Icon } from "../Icon/Icon.tsx";
|
|
7
|
+
import { Field, controlClass, describedBy, useFieldId } from "../Field/Field.tsx";
|
|
8
|
+
import { Listbox, listKeys, useList } from "./Pickers.shared.tsx";
|
|
9
|
+
import { type ComboboxProps } from "./Pickers.types.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Searches a long list as the person types (fuzzy ranking from cmdk, positioned on Radix Popover).
|
|
13
|
+
* Arrow keys move, Enter picks, Escape closes.
|
|
14
|
+
*/
|
|
15
|
+
export function Combobox({
|
|
16
|
+
label,
|
|
17
|
+
help,
|
|
18
|
+
value,
|
|
19
|
+
placeholder: hint,
|
|
20
|
+
noMatch,
|
|
21
|
+
options,
|
|
22
|
+
defaultOpen,
|
|
23
|
+
onChange,
|
|
24
|
+
onQueryChange,
|
|
25
|
+
id,
|
|
26
|
+
}: ComboboxProps): ReactElement {
|
|
27
|
+
const t = useT();
|
|
28
|
+
const fieldId = useFieldId(id);
|
|
29
|
+
const s = useList(options, defaultOpen);
|
|
30
|
+
const [current, setCurrent] = useState(value);
|
|
31
|
+
const chosen = options.find((o) => o.value === current);
|
|
32
|
+
const pick = (o: Option) => {
|
|
33
|
+
setCurrent(o.value);
|
|
34
|
+
s.setQuery("");
|
|
35
|
+
s.setOpen(false);
|
|
36
|
+
onChange?.(o.value);
|
|
37
|
+
};
|
|
38
|
+
return (
|
|
39
|
+
<Field id={fieldId} label={label} help={help}>
|
|
40
|
+
<RPopover.Root
|
|
41
|
+
open={s.open && (s.list.length > 0 || s.query !== "")}
|
|
42
|
+
onOpenChange={s.setOpen}
|
|
43
|
+
>
|
|
44
|
+
<RPopover.Anchor asChild>
|
|
45
|
+
<div className="relative" data-combobox={fieldId}>
|
|
46
|
+
<input
|
|
47
|
+
id={fieldId}
|
|
48
|
+
role="combobox"
|
|
49
|
+
aria-expanded={s.open}
|
|
50
|
+
aria-controls={s.open ? `${fieldId}-list` : undefined}
|
|
51
|
+
aria-autocomplete="list"
|
|
52
|
+
aria-activedescendant={
|
|
53
|
+
s.open && s.list.length ? `${fieldId}-opt-${s.active}` : undefined
|
|
54
|
+
}
|
|
55
|
+
aria-describedby={describedBy(fieldId, help, undefined)}
|
|
56
|
+
autoComplete="off"
|
|
57
|
+
value={s.query}
|
|
58
|
+
placeholder={chosen?.label ?? hint}
|
|
59
|
+
onFocus={() => s.setOpen(true)}
|
|
60
|
+
onBlur={() => {
|
|
61
|
+
if (!defaultOpen) s.setOpen(false);
|
|
62
|
+
}}
|
|
63
|
+
onChange={(e) => {
|
|
64
|
+
s.setQuery(e.target.value);
|
|
65
|
+
onQueryChange?.(e.target.value);
|
|
66
|
+
s.setOpen(true);
|
|
67
|
+
s.setActive(0);
|
|
68
|
+
}}
|
|
69
|
+
onKeyDown={(e) => listKeys(e, s, pick)}
|
|
70
|
+
className={cx(
|
|
71
|
+
controlClass,
|
|
72
|
+
"w-full pe-24",
|
|
73
|
+
chosen && "placeholder:text-text-primary",
|
|
74
|
+
)}
|
|
75
|
+
/>
|
|
76
|
+
<span className="pointer-events-none absolute inset-y-0 end-8 flex items-center text-text-tertiary">
|
|
77
|
+
<Icon name="ChevronsUpDown" size={14} />
|
|
78
|
+
</span>
|
|
79
|
+
</div>
|
|
80
|
+
</RPopover.Anchor>
|
|
81
|
+
<Listbox
|
|
82
|
+
id={fieldId}
|
|
83
|
+
state={s}
|
|
84
|
+
isSelected={(o) => o.value === current}
|
|
85
|
+
pick={pick}
|
|
86
|
+
noMatch={noMatch ?? t("list.noMatch")}
|
|
87
|
+
/>
|
|
88
|
+
</RPopover.Root>
|
|
89
|
+
</Field>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useState, type ReactElement } from "react";
|
|
2
|
+
import { Popover as RPopover } from "radix-ui";
|
|
3
|
+
import { useLocale, usePreferences, useT } from "../lib/context.tsx";
|
|
4
|
+
import { formatDate } from "../lib/format.ts";
|
|
5
|
+
import { Icon } from "../Icon/Icon.tsx";
|
|
6
|
+
import { Field, describedBy, useFieldId } from "../Field/Field.tsx";
|
|
7
|
+
import { CalendarPanel, todayIso, triggerClass } from "./Pickers.shared.tsx";
|
|
8
|
+
import { type DatePickerProps } from "./Pickers.types.ts";
|
|
9
|
+
|
|
10
|
+
/** One date from a month grid in a popover dialog; dates display as Oct 30, 2026. */
|
|
11
|
+
export function DatePicker({
|
|
12
|
+
label,
|
|
13
|
+
help,
|
|
14
|
+
value,
|
|
15
|
+
month,
|
|
16
|
+
today,
|
|
17
|
+
placeholder: hint,
|
|
18
|
+
defaultOpen,
|
|
19
|
+
onChange,
|
|
20
|
+
id,
|
|
21
|
+
}: DatePickerProps): ReactElement {
|
|
22
|
+
const t = useT();
|
|
23
|
+
const locale = useLocale();
|
|
24
|
+
const { dateFormat } = usePreferences();
|
|
25
|
+
const fieldId = useFieldId(id);
|
|
26
|
+
const [current, setCurrent] = useState(value);
|
|
27
|
+
const [open, setOpen] = useState(Boolean(defaultOpen));
|
|
28
|
+
const initial = current ?? month ?? today ?? todayIso();
|
|
29
|
+
return (
|
|
30
|
+
<Field id={fieldId} label={label} help={help}>
|
|
31
|
+
<RPopover.Root open={open} onOpenChange={setOpen}>
|
|
32
|
+
<RPopover.Trigger asChild>
|
|
33
|
+
<button
|
|
34
|
+
id={fieldId}
|
|
35
|
+
type="button"
|
|
36
|
+
aria-haspopup="dialog"
|
|
37
|
+
aria-labelledby={label ? `${fieldId}-label ${fieldId}` : undefined}
|
|
38
|
+
className={triggerClass}
|
|
39
|
+
aria-describedby={describedBy(fieldId, help, undefined)}
|
|
40
|
+
>
|
|
41
|
+
<Icon name="Calendar" size={14} />
|
|
42
|
+
<span className={current ? undefined : "text-text-tertiary"}>
|
|
43
|
+
{current ? formatDate(locale, current, dateFormat) : (hint ?? t("date.pick"))}
|
|
44
|
+
</span>
|
|
45
|
+
</button>
|
|
46
|
+
</RPopover.Trigger>
|
|
47
|
+
<CalendarPanel
|
|
48
|
+
label={t("date.choose")}
|
|
49
|
+
initial={initial}
|
|
50
|
+
mark={(iso) => (iso === current ? "selected" : iso === today ? "today" : null)}
|
|
51
|
+
onPick={(iso) => {
|
|
52
|
+
setCurrent(iso);
|
|
53
|
+
onChange?.(iso);
|
|
54
|
+
setOpen(false);
|
|
55
|
+
}}
|
|
56
|
+
/>
|
|
57
|
+
</RPopover.Root>
|
|
58
|
+
</Field>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useState, type ReactElement } from "react";
|
|
2
|
+
import { Popover as RPopover } from "radix-ui";
|
|
3
|
+
import { useLocale, usePreferences, useT } from "../lib/context.tsx";
|
|
4
|
+
import { formatDate } from "../lib/format.ts";
|
|
5
|
+
import { Icon } from "../Icon/Icon.tsx";
|
|
6
|
+
import { Field, describedBy, useFieldId } from "../Field/Field.tsx";
|
|
7
|
+
import { CalendarPanel, todayIso, triggerClass } from "./Pickers.shared.tsx";
|
|
8
|
+
import { type DateRangePickerProps } from "./Pickers.types.ts";
|
|
9
|
+
|
|
10
|
+
/** A start and end date with the length in days; the first pick starts a range, the second ends it. */
|
|
11
|
+
export function DateRangePicker({
|
|
12
|
+
label,
|
|
13
|
+
help,
|
|
14
|
+
start,
|
|
15
|
+
end,
|
|
16
|
+
defaultOpen,
|
|
17
|
+
onChange,
|
|
18
|
+
id,
|
|
19
|
+
}: DateRangePickerProps): ReactElement {
|
|
20
|
+
const t = useT();
|
|
21
|
+
const locale = useLocale();
|
|
22
|
+
const { dateFormat } = usePreferences();
|
|
23
|
+
const fieldId = useFieldId(id);
|
|
24
|
+
const [range, setRange] = useState<[string | undefined, string | undefined]>([start, end]);
|
|
25
|
+
const [open, setOpen] = useState(Boolean(defaultOpen));
|
|
26
|
+
const [a, b] = range;
|
|
27
|
+
const days = a && b ? Math.round((Date.parse(b) - Date.parse(a)) / 86400000) + 1 : null;
|
|
28
|
+
const pick = (iso: string) => {
|
|
29
|
+
const next: [string, string | undefined] =
|
|
30
|
+
!a || b ? [iso, undefined] : iso < a ? [iso, a] : [a, iso];
|
|
31
|
+
setRange(next);
|
|
32
|
+
if (next[1]) {
|
|
33
|
+
onChange?.([next[0], next[1]]);
|
|
34
|
+
setOpen(false);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return (
|
|
38
|
+
<Field id={fieldId} label={label} help={help}>
|
|
39
|
+
<RPopover.Root open={open} onOpenChange={setOpen}>
|
|
40
|
+
<RPopover.Trigger asChild>
|
|
41
|
+
<button
|
|
42
|
+
id={fieldId}
|
|
43
|
+
type="button"
|
|
44
|
+
aria-haspopup="dialog"
|
|
45
|
+
aria-labelledby={label ? `${fieldId}-label ${fieldId}` : undefined}
|
|
46
|
+
className={triggerClass}
|
|
47
|
+
aria-describedby={describedBy(fieldId, help, undefined)}
|
|
48
|
+
>
|
|
49
|
+
<Icon name="CalendarRange" size={14} />
|
|
50
|
+
<span className={a ? undefined : "text-text-tertiary"}>
|
|
51
|
+
{a
|
|
52
|
+
? b
|
|
53
|
+
? t("date.rangeValue", {
|
|
54
|
+
start: formatDate(locale, a, dateFormat),
|
|
55
|
+
end: formatDate(locale, b, dateFormat),
|
|
56
|
+
})
|
|
57
|
+
: formatDate(locale, a, dateFormat)
|
|
58
|
+
: t("date.chooseRange")}
|
|
59
|
+
</span>
|
|
60
|
+
{days !== null ? (
|
|
61
|
+
<span className="ms-auto text-text-secondary tabular-nums">
|
|
62
|
+
{t("date.days", { n: days })}
|
|
63
|
+
</span>
|
|
64
|
+
) : null}
|
|
65
|
+
</button>
|
|
66
|
+
</RPopover.Trigger>
|
|
67
|
+
<CalendarPanel
|
|
68
|
+
label={t("date.chooseRange")}
|
|
69
|
+
initial={a ?? todayIso()}
|
|
70
|
+
mark={(iso) =>
|
|
71
|
+
iso === a || iso === b ? "edge" : a && b && iso > a && iso < b ? "range" : null
|
|
72
|
+
}
|
|
73
|
+
onPick={pick}
|
|
74
|
+
/>
|
|
75
|
+
</RPopover.Root>
|
|
76
|
+
</Field>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useState, type ReactElement } from "react";
|
|
2
|
+
import { cx } from "../lib/cx.ts";
|
|
3
|
+
import { useFormat, useT } from "../lib/context.tsx";
|
|
4
|
+
import { Icon } from "../Icon/Icon.tsx";
|
|
5
|
+
import { fieldClass, helpClass, labelClass, useFieldId } from "../Field/Field.tsx";
|
|
6
|
+
import { type FileDropProps } from "./Pickers.types.ts";
|
|
7
|
+
|
|
8
|
+
/** Files by drag or browse, with a keyboard-reachable input and a list of what was added. */
|
|
9
|
+
export function FileDrop({
|
|
10
|
+
label,
|
|
11
|
+
hint,
|
|
12
|
+
accept,
|
|
13
|
+
width,
|
|
14
|
+
files: initial,
|
|
15
|
+
onFiles,
|
|
16
|
+
id,
|
|
17
|
+
}: FileDropProps): ReactElement {
|
|
18
|
+
const t = useT();
|
|
19
|
+
const fmt = useFormat();
|
|
20
|
+
const inputId = useFieldId(id);
|
|
21
|
+
const [over, setOver] = useState(false);
|
|
22
|
+
const [files, setFiles] = useState(initial ?? []);
|
|
23
|
+
const add = (list: FileList | null) => {
|
|
24
|
+
if (!list || list.length === 0) return;
|
|
25
|
+
setFiles((current) => [
|
|
26
|
+
...current,
|
|
27
|
+
...Array.from(list, (f) => ({ name: f.name, size: f.size })),
|
|
28
|
+
]);
|
|
29
|
+
onFiles?.(list);
|
|
30
|
+
};
|
|
31
|
+
return (
|
|
32
|
+
<div
|
|
33
|
+
className={fieldClass}
|
|
34
|
+
style={width === undefined ? { inlineSize: "var(--ui-popover)" } : { inlineSize: width }}
|
|
35
|
+
>
|
|
36
|
+
{label ? <span className={labelClass}>{label}</span> : null}
|
|
37
|
+
<label
|
|
38
|
+
htmlFor={inputId}
|
|
39
|
+
onDragOver={(e) => {
|
|
40
|
+
e.preventDefault();
|
|
41
|
+
setOver(true);
|
|
42
|
+
}}
|
|
43
|
+
onDragLeave={() => setOver(false)}
|
|
44
|
+
onDrop={(e) => {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
setOver(false);
|
|
47
|
+
add(e.dataTransfer.files);
|
|
48
|
+
}}
|
|
49
|
+
className={cx(
|
|
50
|
+
"flex flex-col items-center gap-4 p-24 text-center rounded-card border border-dashed border-border-strong bg-bg-surface text-text-secondary cursor-pointer",
|
|
51
|
+
"transition-colors duration-fast ease-standard focus-within:outline-solid focus-within:outline-stroke-focus focus-within:outline-focus-ring",
|
|
52
|
+
over && "border-accent bg-bg-hover",
|
|
53
|
+
)}
|
|
54
|
+
>
|
|
55
|
+
<Icon name="Upload" size={20} />
|
|
56
|
+
<span>
|
|
57
|
+
<strong className="text-text-primary">{t("file.drop")}</strong> {t("file.orBrowse")}
|
|
58
|
+
</span>
|
|
59
|
+
{hint ? <span className={helpClass}>{hint}</span> : null}
|
|
60
|
+
<input
|
|
61
|
+
id={inputId}
|
|
62
|
+
type="file"
|
|
63
|
+
multiple
|
|
64
|
+
accept={accept}
|
|
65
|
+
onChange={(e) => add(e.target.files)}
|
|
66
|
+
className="sr-only"
|
|
67
|
+
/>
|
|
68
|
+
</label>
|
|
69
|
+
{files.length ? (
|
|
70
|
+
<ul className="flex flex-col gap-4 m-0 p-0 list-none" aria-live="polite">
|
|
71
|
+
{files.map((f, i) => (
|
|
72
|
+
<li key={`${f.name}-${i}`} className="flex items-center gap-8">
|
|
73
|
+
<Icon name="File" size={14} />
|
|
74
|
+
<span>{f.name}</span>
|
|
75
|
+
<span className="ms-auto text-text-secondary tabular-nums">
|
|
76
|
+
{t("file.kb", { n: fmt.number(Math.max(1, Math.round(f.size / 1024))) })}
|
|
77
|
+
</span>
|
|
78
|
+
</li>
|
|
79
|
+
))}
|
|
80
|
+
</ul>
|
|
81
|
+
) : null}
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { useState, type ReactElement } from "react";
|
|
2
|
+
import { Popover as RPopover } from "radix-ui";
|
|
3
|
+
import type { Option } from "../types/reference";
|
|
4
|
+
import { cx } from "../lib/cx.ts";
|
|
5
|
+
import { useT } from "../lib/context.tsx";
|
|
6
|
+
import { Icon } from "../Icon/Icon.tsx";
|
|
7
|
+
import { chipClass } from "../Chips/Chips.tsx";
|
|
8
|
+
import { controlClass, fieldClass, helpClass, labelClass, useFieldId } from "../Field/Field.tsx";
|
|
9
|
+
import { Listbox, listKeys, useList } from "./Pickers.shared.tsx";
|
|
10
|
+
import { type MultiSelectProps } from "./Pickers.types.ts";
|
|
11
|
+
|
|
12
|
+
/** Picks several values; picks show as removable chips and Backspace removes the last. */
|
|
13
|
+
export function MultiSelect({
|
|
14
|
+
label,
|
|
15
|
+
help,
|
|
16
|
+
value,
|
|
17
|
+
placeholder: hint,
|
|
18
|
+
options,
|
|
19
|
+
defaultOpen,
|
|
20
|
+
onChange,
|
|
21
|
+
id,
|
|
22
|
+
}: MultiSelectProps): ReactElement {
|
|
23
|
+
const t = useT();
|
|
24
|
+
const fieldId = useFieldId(id);
|
|
25
|
+
const s = useList(options, defaultOpen);
|
|
26
|
+
const [picked, setPicked] = useState(value ?? []);
|
|
27
|
+
const set = (next: string[]) => {
|
|
28
|
+
setPicked(next);
|
|
29
|
+
onChange?.(next);
|
|
30
|
+
};
|
|
31
|
+
const toggle = (o: Option) =>
|
|
32
|
+
set(picked.includes(o.value) ? picked.filter((v) => v !== o.value) : [...picked, o.value]);
|
|
33
|
+
const chosen = options.filter((o) => picked.includes(o.value));
|
|
34
|
+
return (
|
|
35
|
+
<div className={fieldClass}>
|
|
36
|
+
{label ? (
|
|
37
|
+
<label className={labelClass} htmlFor={fieldId}>
|
|
38
|
+
{label}
|
|
39
|
+
</label>
|
|
40
|
+
) : null}
|
|
41
|
+
<RPopover.Root open={s.open} onOpenChange={s.setOpen}>
|
|
42
|
+
<RPopover.Anchor asChild>
|
|
43
|
+
<div
|
|
44
|
+
data-combobox={fieldId}
|
|
45
|
+
className={cx(
|
|
46
|
+
controlClass,
|
|
47
|
+
// The field grows with its chips, and rows of chips stay far enough apart for their remove buttons to meet WCAG 2.5.8.
|
|
48
|
+
"relative flex flex-wrap items-center gap-x-4 gap-y-12 h-auto! min-h-control-md py-2 ps-4 pe-24",
|
|
49
|
+
)}
|
|
50
|
+
>
|
|
51
|
+
{chosen.map((o) => (
|
|
52
|
+
<span key={o.value} className={cx(chipClass, "h-(--ui-tag)")}>
|
|
53
|
+
{o.label}
|
|
54
|
+
<button
|
|
55
|
+
type="button"
|
|
56
|
+
aria-label={t("chip.remove", { label: o.label })}
|
|
57
|
+
title={t("chip.remove", { label: o.label })}
|
|
58
|
+
onClick={() => toggle(o)}
|
|
59
|
+
className="xos-hit inline-grid place-items-center ms-2 p-0 border-0 bg-transparent text-text-tertiary hover:text-text-primary rounded-mark cursor-pointer"
|
|
60
|
+
>
|
|
61
|
+
<Icon name="X" size={12} />
|
|
62
|
+
</button>
|
|
63
|
+
</span>
|
|
64
|
+
))}
|
|
65
|
+
<input
|
|
66
|
+
id={fieldId}
|
|
67
|
+
role="combobox"
|
|
68
|
+
aria-expanded={s.open}
|
|
69
|
+
aria-controls={s.open ? `${fieldId}-list` : undefined}
|
|
70
|
+
aria-autocomplete="list"
|
|
71
|
+
aria-activedescendant={
|
|
72
|
+
s.open && s.list.length ? `${fieldId}-opt-${s.active}` : undefined
|
|
73
|
+
}
|
|
74
|
+
aria-describedby={help ? `${fieldId}-help` : undefined}
|
|
75
|
+
autoComplete="off"
|
|
76
|
+
value={s.query}
|
|
77
|
+
placeholder={chosen.length ? "" : hint}
|
|
78
|
+
onFocus={() => s.setOpen(true)}
|
|
79
|
+
onBlur={() => {
|
|
80
|
+
if (!defaultOpen) s.setOpen(false);
|
|
81
|
+
}}
|
|
82
|
+
onChange={(e) => {
|
|
83
|
+
s.setQuery(e.target.value);
|
|
84
|
+
s.setOpen(true);
|
|
85
|
+
s.setActive(0);
|
|
86
|
+
}}
|
|
87
|
+
onKeyDown={(e) => {
|
|
88
|
+
if (e.key === "Backspace" && !s.query && chosen.length) {
|
|
89
|
+
const last = chosen[chosen.length - 1];
|
|
90
|
+
if (last) toggle(last);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
listKeys(e, s, toggle);
|
|
94
|
+
}}
|
|
95
|
+
className="flex-1 min-w-(--space-64) border-0 bg-transparent outline-none text-text-primary text-text-13 placeholder:text-text-tertiary pointer-coarse:min-h-target-coarse"
|
|
96
|
+
/>
|
|
97
|
+
<span className="pointer-events-none absolute inset-y-0 end-8 flex items-center text-text-tertiary">
|
|
98
|
+
<Icon name="ChevronsUpDown" size={14} />
|
|
99
|
+
</span>
|
|
100
|
+
</div>
|
|
101
|
+
</RPopover.Anchor>
|
|
102
|
+
<Listbox
|
|
103
|
+
id={fieldId}
|
|
104
|
+
state={s}
|
|
105
|
+
isSelected={(o) => picked.includes(o.value)}
|
|
106
|
+
pick={toggle}
|
|
107
|
+
multiselectable
|
|
108
|
+
noMatch={t("list.noMatch")}
|
|
109
|
+
/>
|
|
110
|
+
</RPopover.Root>
|
|
111
|
+
{help ? (
|
|
112
|
+
<div className={helpClass} id={`${fieldId}-help`}>
|
|
113
|
+
{help}
|
|
114
|
+
</div>
|
|
115
|
+
) : null}
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|