@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,547 @@
|
|
|
1
|
+
import { useId, useState, type ReactElement } from "react";
|
|
2
|
+
import { scaleBand, scaleLinear } from "@visx/scale";
|
|
3
|
+
import { BarRounded, LinePath } from "@visx/shape";
|
|
4
|
+
import { Group } from "@visx/group";
|
|
5
|
+
import { PatternLines } from "@visx/pattern";
|
|
6
|
+
import type { ChartProps as ReferenceChartProps } from "../types/reference";
|
|
7
|
+
import { cx } from "../lib/cx.ts";
|
|
8
|
+
import { useFormat, useT } from "../lib/context.tsx";
|
|
9
|
+
import { SegmentedControl } from "../Navigation/Navigation.tsx";
|
|
10
|
+
import { ScrollRegion } from "../Layout/Layout.tsx";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The data chart (bar, line, area and combinations) on visx. Its own module so that the
|
|
14
|
+
* calendar, timeline and list views never load the chart library (A24-009).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type ChartProps = ReferenceChartProps;
|
|
18
|
+
|
|
19
|
+
const SERIES_FILL = [
|
|
20
|
+
cx("fill-viz-cat-1"),
|
|
21
|
+
cx("fill-viz-cat-2"),
|
|
22
|
+
cx("fill-viz-cat-3"),
|
|
23
|
+
cx("fill-viz-cat-4"),
|
|
24
|
+
cx("fill-viz-cat-5"),
|
|
25
|
+
cx("fill-viz-cat-6"),
|
|
26
|
+
cx("fill-viz-cat-7"),
|
|
27
|
+
];
|
|
28
|
+
const SERIES_STROKE = [
|
|
29
|
+
cx("stroke-viz-cat-1"),
|
|
30
|
+
cx("stroke-viz-cat-2"),
|
|
31
|
+
cx("stroke-viz-cat-3"),
|
|
32
|
+
cx("stroke-viz-cat-4"),
|
|
33
|
+
cx("stroke-viz-cat-5"),
|
|
34
|
+
cx("stroke-viz-cat-6"),
|
|
35
|
+
cx("stroke-viz-cat-7"),
|
|
36
|
+
];
|
|
37
|
+
const SERIES_VAR = [
|
|
38
|
+
"--color-viz-cat-1",
|
|
39
|
+
"--color-viz-cat-2",
|
|
40
|
+
"--color-viz-cat-3",
|
|
41
|
+
"--color-viz-cat-4",
|
|
42
|
+
"--color-viz-cat-5",
|
|
43
|
+
"--color-viz-cat-6",
|
|
44
|
+
"--color-viz-cat-7",
|
|
45
|
+
];
|
|
46
|
+
const MARKERS = [
|
|
47
|
+
"circle",
|
|
48
|
+
"square",
|
|
49
|
+
"triangle",
|
|
50
|
+
"diamond",
|
|
51
|
+
"cross",
|
|
52
|
+
"circle-open",
|
|
53
|
+
"square-open",
|
|
54
|
+
] as const;
|
|
55
|
+
|
|
56
|
+
interface Series {
|
|
57
|
+
name: string;
|
|
58
|
+
values: (number | null)[];
|
|
59
|
+
other?: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Seven categorical colors at most: from the eighth series on, the sixth and later fold into one Other series, blank where any part is blank. */
|
|
63
|
+
export function foldSeries(
|
|
64
|
+
series: ChartProps["series"],
|
|
65
|
+
otherLabel: string,
|
|
66
|
+
count: number,
|
|
67
|
+
): Series[] {
|
|
68
|
+
if (series.length <= 7) return series;
|
|
69
|
+
const rest = series.slice(6);
|
|
70
|
+
return [
|
|
71
|
+
...series.slice(0, 6),
|
|
72
|
+
{
|
|
73
|
+
name: otherLabel,
|
|
74
|
+
other: true,
|
|
75
|
+
values: Array.from({ length: count }, (_, i) => {
|
|
76
|
+
let sum = 0;
|
|
77
|
+
for (const s of rest) {
|
|
78
|
+
const v = s.values[i];
|
|
79
|
+
if (v === null || v === undefined) return null;
|
|
80
|
+
sum += v;
|
|
81
|
+
}
|
|
82
|
+
return sum;
|
|
83
|
+
}),
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function niceStep(raw: number, whole: boolean): number {
|
|
89
|
+
if (whole && raw <= 1) return 1;
|
|
90
|
+
const e = 10 ** Math.floor(Math.log10(raw));
|
|
91
|
+
const f = raw / e;
|
|
92
|
+
const m = f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 && !(whole && e < 10) ? 2.5 : f <= 5 ? 5 : 10;
|
|
93
|
+
return m * e;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The top of the value axis, which has four steps. Whole-number data (counts, whole amounts, or nothing but zeros)
|
|
98
|
+
* keeps whole-number steps, so an all-zero or small series never reads $0.3 or 1.25 between its ticks.
|
|
99
|
+
*/
|
|
100
|
+
export function niceMax(v: number, whole = false): number {
|
|
101
|
+
if (v <= 0) return whole ? 4 : 1;
|
|
102
|
+
const e = 10 ** Math.floor(Math.log10(v));
|
|
103
|
+
const f = v / e;
|
|
104
|
+
const max = (f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 ? 2.5 : f <= 5 ? 5 : 10) * e;
|
|
105
|
+
return whole && !Number.isInteger(max / 4) ? 4 * niceStep(v / 4, true) : max;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function Marker({
|
|
109
|
+
kind,
|
|
110
|
+
x,
|
|
111
|
+
y,
|
|
112
|
+
className,
|
|
113
|
+
}: {
|
|
114
|
+
kind: (typeof MARKERS)[number];
|
|
115
|
+
x: number;
|
|
116
|
+
y: number;
|
|
117
|
+
className: string;
|
|
118
|
+
}) {
|
|
119
|
+
const r = 4.5;
|
|
120
|
+
switch (kind) {
|
|
121
|
+
case "square":
|
|
122
|
+
return <rect x={x - r} y={y - r} width={r * 2} height={r * 2} rx={1} className={className} />;
|
|
123
|
+
case "triangle":
|
|
124
|
+
return (
|
|
125
|
+
<path
|
|
126
|
+
d={`M${x} ${y - r - 1} L${x + r + 1} ${y + r} L${x - r - 1} ${y + r} Z`}
|
|
127
|
+
className={className}
|
|
128
|
+
/>
|
|
129
|
+
);
|
|
130
|
+
case "diamond":
|
|
131
|
+
return (
|
|
132
|
+
<path
|
|
133
|
+
d={`M${x} ${y - r - 1} L${x + r + 1} ${y} L${x} ${y + r + 1} L${x - r - 1} ${y} Z`}
|
|
134
|
+
className={className}
|
|
135
|
+
/>
|
|
136
|
+
);
|
|
137
|
+
case "cross":
|
|
138
|
+
return (
|
|
139
|
+
<path
|
|
140
|
+
d={`M${x - r} ${y} H${x + r} M${x} ${y - r} V${y + r}`}
|
|
141
|
+
className={cx(className, "fill-none")}
|
|
142
|
+
strokeWidth={2.5}
|
|
143
|
+
/>
|
|
144
|
+
);
|
|
145
|
+
case "circle-open":
|
|
146
|
+
return (
|
|
147
|
+
<circle cx={x} cy={y} r={r} className={cx(className, "fill-bg-canvas")} strokeWidth={2} />
|
|
148
|
+
);
|
|
149
|
+
case "square-open":
|
|
150
|
+
return (
|
|
151
|
+
<rect
|
|
152
|
+
x={x - r}
|
|
153
|
+
y={y - r}
|
|
154
|
+
width={r * 2}
|
|
155
|
+
height={r * 2}
|
|
156
|
+
rx={1}
|
|
157
|
+
className={cx(className, "fill-bg-canvas")}
|
|
158
|
+
strokeWidth={2}
|
|
159
|
+
/>
|
|
160
|
+
);
|
|
161
|
+
default:
|
|
162
|
+
return <circle cx={x} cy={y} r={r} className={className} />;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Bar and line charts on Visx with one y-axis, a legend for two or more series and a table view one
|
|
168
|
+
* click away. Every series differs by a second encoding (texture or marker); missing values are gaps.
|
|
169
|
+
*/
|
|
170
|
+
export function Chart({
|
|
171
|
+
type,
|
|
172
|
+
title,
|
|
173
|
+
subtitle,
|
|
174
|
+
categoryLabel,
|
|
175
|
+
categories,
|
|
176
|
+
series: given,
|
|
177
|
+
format = "number",
|
|
178
|
+
currency,
|
|
179
|
+
width = 640,
|
|
180
|
+
height = 260,
|
|
181
|
+
}: ChartProps): ReactElement {
|
|
182
|
+
const t = useT();
|
|
183
|
+
const fmt = useFormat();
|
|
184
|
+
const uid = useId().replace(/:/g, "");
|
|
185
|
+
const [view, setView] = useState("chart");
|
|
186
|
+
const [hover, setHover] = useState<{
|
|
187
|
+
x: number;
|
|
188
|
+
y: number;
|
|
189
|
+
s: string;
|
|
190
|
+
c: string;
|
|
191
|
+
v: number;
|
|
192
|
+
} | null>(null);
|
|
193
|
+
const series = foldSeries(given, t("chart.other"), categories.length);
|
|
194
|
+
const fill = (s: Series, i: number) => (s.other ? cx("fill-viz-other") : (SERIES_FILL[i] ?? ""));
|
|
195
|
+
const stroke = (s: Series, i: number) =>
|
|
196
|
+
s.other ? cx("stroke-viz-other") : (SERIES_STROKE[i] ?? "");
|
|
197
|
+
const colorVar = (s: Series, i: number) =>
|
|
198
|
+
`var(${s.other ? "--color-viz-other" : (SERIES_VAR[i] ?? "--color-viz-other")})`;
|
|
199
|
+
const value = (v: number) => (format === "money" ? fmt.currency(v, currency) : fmt.number(v));
|
|
200
|
+
const pl = 60;
|
|
201
|
+
const pr = type === "line" && series.length <= 4 ? 96 : 16;
|
|
202
|
+
const pt = 12;
|
|
203
|
+
const pb = 32;
|
|
204
|
+
const innerW = width - pl - pr;
|
|
205
|
+
const innerH = height - pt - pb;
|
|
206
|
+
const all = series.flatMap((s) =>
|
|
207
|
+
s.values.filter((v): v is number => v !== null && v !== undefined),
|
|
208
|
+
);
|
|
209
|
+
const max = niceMax(
|
|
210
|
+
Math.max(0, ...all),
|
|
211
|
+
all.every((v) => Number.isInteger(v)),
|
|
212
|
+
);
|
|
213
|
+
const x = scaleBand({ domain: categories, range: [0, innerW], padding: 0.3 });
|
|
214
|
+
const y = scaleLinear({ domain: [0, max], range: [innerH, 0] });
|
|
215
|
+
const ticks = [0, 0.25, 0.5, 0.75, 1].map((f) => f * max);
|
|
216
|
+
const band = x.bandwidth();
|
|
217
|
+
const gap = 2;
|
|
218
|
+
const barW = Math.min(28, (band - gap * (series.length - 1)) / series.length);
|
|
219
|
+
|
|
220
|
+
const table = (
|
|
221
|
+
<ScrollRegion label={title}>
|
|
222
|
+
<table className="w-full border-collapse text-text-13">
|
|
223
|
+
<caption className="sr-only">{title}</caption>
|
|
224
|
+
<thead>
|
|
225
|
+
<tr>
|
|
226
|
+
<th
|
|
227
|
+
scope="col"
|
|
228
|
+
className="h-control-lg px-12 text-start font-medium text-text-12 text-text-secondary bg-bg-surface border-b border-border-subtle"
|
|
229
|
+
>
|
|
230
|
+
{categoryLabel}
|
|
231
|
+
</th>
|
|
232
|
+
{series.map((s) => (
|
|
233
|
+
<th
|
|
234
|
+
key={s.name}
|
|
235
|
+
scope="col"
|
|
236
|
+
className="h-control-lg px-12 text-end font-medium text-text-12 text-text-secondary bg-bg-surface border-b border-border-subtle"
|
|
237
|
+
>
|
|
238
|
+
{s.name}
|
|
239
|
+
</th>
|
|
240
|
+
))}
|
|
241
|
+
</tr>
|
|
242
|
+
</thead>
|
|
243
|
+
<tbody>
|
|
244
|
+
{categories.map((c, ci) => (
|
|
245
|
+
<tr key={c}>
|
|
246
|
+
<th
|
|
247
|
+
scope="row"
|
|
248
|
+
className="h-row-default px-12 text-start font-regular border-b border-border-subtle"
|
|
249
|
+
>
|
|
250
|
+
{c}
|
|
251
|
+
</th>
|
|
252
|
+
{series.map((s) => {
|
|
253
|
+
const v = s.values[ci];
|
|
254
|
+
return (
|
|
255
|
+
<td
|
|
256
|
+
key={s.name}
|
|
257
|
+
className="h-row-default px-12 text-end border-b border-border-subtle tabular-nums"
|
|
258
|
+
>
|
|
259
|
+
{v === null || v === undefined ? (
|
|
260
|
+
<span className="text-text-secondary">{t("chart.noValue")}</span>
|
|
261
|
+
) : (
|
|
262
|
+
value(v)
|
|
263
|
+
)}
|
|
264
|
+
</td>
|
|
265
|
+
);
|
|
266
|
+
})}
|
|
267
|
+
</tr>
|
|
268
|
+
))}
|
|
269
|
+
</tbody>
|
|
270
|
+
</table>
|
|
271
|
+
</ScrollRegion>
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
return (
|
|
275
|
+
<figure className="flex flex-col gap-12 m-0 max-w-(--layout-reading)">
|
|
276
|
+
<div className="flex flex-wrap items-start justify-between gap-12">
|
|
277
|
+
<figcaption className="flex flex-col">
|
|
278
|
+
<strong id={`${uid}-title`} className="font-semibold">
|
|
279
|
+
{title}
|
|
280
|
+
</strong>
|
|
281
|
+
<span id={`${uid}-hint`} className="sr-only">
|
|
282
|
+
{t("chart.tableHint")}
|
|
283
|
+
</span>
|
|
284
|
+
{subtitle ? <span className="text-text-secondary">{subtitle}</span> : null}
|
|
285
|
+
</figcaption>
|
|
286
|
+
<SegmentedControl
|
|
287
|
+
label={t("chart.view")}
|
|
288
|
+
value={view}
|
|
289
|
+
onChange={setView}
|
|
290
|
+
options={[
|
|
291
|
+
{ value: "chart", label: t("chart.chart"), icon: "ChartColumn" },
|
|
292
|
+
{ value: "table", label: t("chart.table"), icon: "Table" },
|
|
293
|
+
]}
|
|
294
|
+
/>
|
|
295
|
+
</div>
|
|
296
|
+
{series.length > 1 ? (
|
|
297
|
+
<ul
|
|
298
|
+
aria-label={t("chart.legend")}
|
|
299
|
+
className="flex flex-wrap gap-x-16 gap-y-4 m-0 p-0 list-none text-text-12 text-text-secondary"
|
|
300
|
+
>
|
|
301
|
+
{series.map((s, si) => (
|
|
302
|
+
<li key={s.name} className="flex items-center gap-6">
|
|
303
|
+
<svg width={14} height={14} viewBox="0 0 14 14" aria-hidden="true">
|
|
304
|
+
{type === "line" ? (
|
|
305
|
+
<Marker
|
|
306
|
+
kind={MARKERS[si] ?? "circle"}
|
|
307
|
+
x={7}
|
|
308
|
+
y={7}
|
|
309
|
+
className={cx(fill(s, si), stroke(s, si))}
|
|
310
|
+
/>
|
|
311
|
+
) : (
|
|
312
|
+
<rect
|
|
313
|
+
x={1}
|
|
314
|
+
y={1}
|
|
315
|
+
width={12}
|
|
316
|
+
height={12}
|
|
317
|
+
rx={3}
|
|
318
|
+
className={cx(fill(s, si), si % 2 ? "opacity-50" : undefined)}
|
|
319
|
+
/>
|
|
320
|
+
)}
|
|
321
|
+
</svg>
|
|
322
|
+
{s.name}
|
|
323
|
+
</li>
|
|
324
|
+
))}
|
|
325
|
+
</ul>
|
|
326
|
+
) : null}
|
|
327
|
+
{view === "table" ? (
|
|
328
|
+
table
|
|
329
|
+
) : (
|
|
330
|
+
<div className="relative">
|
|
331
|
+
<svg
|
|
332
|
+
viewBox={`0 0 ${width} ${height}`}
|
|
333
|
+
width="100%"
|
|
334
|
+
role="group"
|
|
335
|
+
aria-labelledby={`${uid}-title ${uid}-hint`}
|
|
336
|
+
>
|
|
337
|
+
<defs>
|
|
338
|
+
{series.map((s, si) =>
|
|
339
|
+
si % 2 ? (
|
|
340
|
+
<PatternLines
|
|
341
|
+
key={s.name}
|
|
342
|
+
id={`${uid}-tex-${si}`}
|
|
343
|
+
width={6}
|
|
344
|
+
height={6}
|
|
345
|
+
stroke={colorVar(s, si)}
|
|
346
|
+
strokeWidth={2.5}
|
|
347
|
+
orientation={["diagonal"]}
|
|
348
|
+
background="transparent"
|
|
349
|
+
/>
|
|
350
|
+
) : null,
|
|
351
|
+
)}
|
|
352
|
+
</defs>
|
|
353
|
+
<Group left={pl} top={pt}>
|
|
354
|
+
{ticks.map((tv) => (
|
|
355
|
+
<g key={tv}>
|
|
356
|
+
<line
|
|
357
|
+
x1={0}
|
|
358
|
+
x2={innerW}
|
|
359
|
+
y1={y(tv)}
|
|
360
|
+
y2={y(tv)}
|
|
361
|
+
className={tv === 0 ? "stroke-border-control" : "stroke-border-subtle"}
|
|
362
|
+
/>
|
|
363
|
+
<text
|
|
364
|
+
x={-8}
|
|
365
|
+
y={y(tv) + 4}
|
|
366
|
+
textAnchor="end"
|
|
367
|
+
className="fill-text-secondary text-text-11 tabular-nums"
|
|
368
|
+
>
|
|
369
|
+
{fmt.compact(tv, format === "money" ? (currency ?? "USD") : undefined)}
|
|
370
|
+
</text>
|
|
371
|
+
</g>
|
|
372
|
+
))}
|
|
373
|
+
{categories.map((c) => (
|
|
374
|
+
<text
|
|
375
|
+
key={c}
|
|
376
|
+
x={(x(c) ?? 0) + band / 2}
|
|
377
|
+
y={innerH + 22}
|
|
378
|
+
textAnchor="middle"
|
|
379
|
+
className="fill-text-secondary text-text-11"
|
|
380
|
+
>
|
|
381
|
+
{c}
|
|
382
|
+
</text>
|
|
383
|
+
))}
|
|
384
|
+
{type === "line"
|
|
385
|
+
? series.map((s, si) => {
|
|
386
|
+
const pts = s.values
|
|
387
|
+
.map((v, i) => ({ v, i }))
|
|
388
|
+
.filter(
|
|
389
|
+
(p): p is { v: number; i: number } => p.v !== null && p.v !== undefined,
|
|
390
|
+
);
|
|
391
|
+
const cls = cx(fill(s, si), stroke(s, si));
|
|
392
|
+
return (
|
|
393
|
+
<g key={s.name}>
|
|
394
|
+
<LinePath
|
|
395
|
+
data={s.values.map((v, i) => ({ v, i }))}
|
|
396
|
+
x={(p) => (x(categories[p.i] ?? "") ?? 0) + band / 2}
|
|
397
|
+
y={(p) => y(p.v ?? 0)}
|
|
398
|
+
defined={(p) => p.v !== null && p.v !== undefined}
|
|
399
|
+
className={cx("fill-none", stroke(s, si))}
|
|
400
|
+
strokeWidth={2}
|
|
401
|
+
strokeLinejoin="round"
|
|
402
|
+
strokeLinecap="round"
|
|
403
|
+
strokeDasharray={si % 2 ? "6 4" : undefined}
|
|
404
|
+
/>
|
|
405
|
+
{pts.map((p) => {
|
|
406
|
+
const cx0 = (x(categories[p.i] ?? "") ?? 0) + band / 2;
|
|
407
|
+
const cy0 = y(p.v);
|
|
408
|
+
const show = () =>
|
|
409
|
+
setHover({
|
|
410
|
+
x: cx0 + pl,
|
|
411
|
+
y: cy0 + pt,
|
|
412
|
+
s: s.name,
|
|
413
|
+
c: categories[p.i] ?? "",
|
|
414
|
+
v: p.v,
|
|
415
|
+
});
|
|
416
|
+
return (
|
|
417
|
+
<g
|
|
418
|
+
key={p.i}
|
|
419
|
+
role="img"
|
|
420
|
+
tabIndex={0}
|
|
421
|
+
aria-label={t("chart.point", {
|
|
422
|
+
series: s.name,
|
|
423
|
+
category: categories[p.i] ?? "",
|
|
424
|
+
value: value(p.v),
|
|
425
|
+
})}
|
|
426
|
+
onMouseEnter={show}
|
|
427
|
+
onFocus={show}
|
|
428
|
+
onMouseLeave={() => setHover(null)}
|
|
429
|
+
onBlur={() => setHover(null)}
|
|
430
|
+
className="outline-none focus-visible:[&>circle:last-child]:stroke-focus-ring"
|
|
431
|
+
>
|
|
432
|
+
<Marker
|
|
433
|
+
kind={MARKERS[si] ?? "circle"}
|
|
434
|
+
x={cx0}
|
|
435
|
+
y={cy0}
|
|
436
|
+
className={cls}
|
|
437
|
+
/>
|
|
438
|
+
<circle
|
|
439
|
+
cx={cx0}
|
|
440
|
+
cy={cy0}
|
|
441
|
+
r={12}
|
|
442
|
+
className="fill-transparent"
|
|
443
|
+
strokeWidth={2}
|
|
444
|
+
/>
|
|
445
|
+
</g>
|
|
446
|
+
);
|
|
447
|
+
})}
|
|
448
|
+
{pr > 16 && pts.length ? (
|
|
449
|
+
<text
|
|
450
|
+
x={
|
|
451
|
+
(x(categories[pts[pts.length - 1]?.i ?? 0] ?? "") ?? 0) +
|
|
452
|
+
band / 2 +
|
|
453
|
+
10
|
|
454
|
+
}
|
|
455
|
+
y={y(pts[pts.length - 1]?.v ?? 0) + 4}
|
|
456
|
+
className="fill-text-primary text-text-11 font-medium"
|
|
457
|
+
>
|
|
458
|
+
{s.name}
|
|
459
|
+
</text>
|
|
460
|
+
) : null}
|
|
461
|
+
</g>
|
|
462
|
+
);
|
|
463
|
+
})
|
|
464
|
+
: series.map((s, si) => (
|
|
465
|
+
<g key={s.name}>
|
|
466
|
+
{s.values.map((v, i) => {
|
|
467
|
+
if (v === null || v === undefined) return null;
|
|
468
|
+
const bx =
|
|
469
|
+
(x(categories[i] ?? "") ?? 0) +
|
|
470
|
+
(band - (barW * series.length + gap * (series.length - 1))) / 2 +
|
|
471
|
+
si * (barW + gap);
|
|
472
|
+
const top = y(v);
|
|
473
|
+
const h = innerH - top;
|
|
474
|
+
const show = () =>
|
|
475
|
+
setHover({
|
|
476
|
+
x: bx + barW / 2 + pl,
|
|
477
|
+
y: top + pt,
|
|
478
|
+
s: s.name,
|
|
479
|
+
c: categories[i] ?? "",
|
|
480
|
+
v,
|
|
481
|
+
});
|
|
482
|
+
return (
|
|
483
|
+
<g
|
|
484
|
+
key={i}
|
|
485
|
+
role="img"
|
|
486
|
+
tabIndex={0}
|
|
487
|
+
aria-label={t("chart.point", {
|
|
488
|
+
series: s.name,
|
|
489
|
+
category: categories[i] ?? "",
|
|
490
|
+
value: value(v),
|
|
491
|
+
})}
|
|
492
|
+
onMouseEnter={show}
|
|
493
|
+
onFocus={show}
|
|
494
|
+
onMouseLeave={() => setHover(null)}
|
|
495
|
+
onBlur={() => setHover(null)}
|
|
496
|
+
className="outline-none focus-visible:[&>rect]:stroke-focus-ring"
|
|
497
|
+
>
|
|
498
|
+
<BarRounded
|
|
499
|
+
x={bx}
|
|
500
|
+
y={top}
|
|
501
|
+
width={barW}
|
|
502
|
+
height={h}
|
|
503
|
+
radius={Math.min(4, h)}
|
|
504
|
+
top
|
|
505
|
+
className={cx(
|
|
506
|
+
fill(s, si),
|
|
507
|
+
si % 2 === 1 && stroke(s, si),
|
|
508
|
+
"hover:brightness-110",
|
|
509
|
+
)}
|
|
510
|
+
{...(si % 2
|
|
511
|
+
? { fill: `url(#${uid}-tex-${si})`, strokeWidth: 1.5 }
|
|
512
|
+
: {})}
|
|
513
|
+
/>
|
|
514
|
+
<rect
|
|
515
|
+
x={bx - 2}
|
|
516
|
+
y={0}
|
|
517
|
+
width={barW + 4}
|
|
518
|
+
height={innerH}
|
|
519
|
+
className="fill-transparent"
|
|
520
|
+
strokeWidth={2}
|
|
521
|
+
/>
|
|
522
|
+
</g>
|
|
523
|
+
);
|
|
524
|
+
})}
|
|
525
|
+
</g>
|
|
526
|
+
))}
|
|
527
|
+
</Group>
|
|
528
|
+
</svg>
|
|
529
|
+
{hover ? (
|
|
530
|
+
<div
|
|
531
|
+
role="status"
|
|
532
|
+
className="absolute z-tooltip flex flex-col px-8 py-6 whitespace-nowrap pointer-events-none rounded-control bg-bg-raised shadow-menu text-text-12 -translate-x-1/2 -translate-y-[calc(100%+var(--space-8))] rtl:translate-x-1/2"
|
|
533
|
+
style={{
|
|
534
|
+
insetInlineStart: `${(hover.x / width) * 100}%`,
|
|
535
|
+
insetBlockStart: `${(hover.y / height) * 100}%`,
|
|
536
|
+
}}
|
|
537
|
+
>
|
|
538
|
+
<strong className="font-semibold">{hover.s}</strong>
|
|
539
|
+
<span className="text-text-secondary">{hover.c}</span>
|
|
540
|
+
<span className="tabular-nums">{value(hover.v)}</span>
|
|
541
|
+
</div>
|
|
542
|
+
) : null}
|
|
543
|
+
</div>
|
|
544
|
+
)}
|
|
545
|
+
</figure>
|
|
546
|
+
);
|
|
547
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export {
|
|
2
|
+
type GalleryProps,
|
|
3
|
+
type CalendarProps,
|
|
4
|
+
type TimelineProps,
|
|
5
|
+
type TimelineChange,
|
|
6
|
+
type TimelineLink,
|
|
7
|
+
type TimelinePreview,
|
|
8
|
+
type TimelineCategory,
|
|
9
|
+
type TimelineSegment,
|
|
10
|
+
type ResourceScheduleProps,
|
|
11
|
+
type OrgChartProps,
|
|
12
|
+
} from "./Charts.types.ts";
|
|
13
|
+
export { Gallery } from "./Gallery.tsx";
|
|
14
|
+
export { Calendar } from "./Calendar.tsx";
|
|
15
|
+
export { Timeline, dayAtPointer, RECORD_MIME } from "./Timeline.tsx";
|
|
16
|
+
export { ResourceSchedule } from "./ResourceSchedule.tsx";
|
|
17
|
+
export { OrgChart } from "./OrgChart.tsx";
|
|
18
|
+
export { Sparkline, type SparklineProps } from "./Sparkline.tsx";
|
|
19
|
+
export { Chart, foldSeries, type ChartProps } from "./Chart.tsx";
|
|
20
|
+
export { Heatmap, type HeatmapProps } from "./Heatmap.tsx";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CalendarProps as ReferenceCalendarProps,
|
|
3
|
+
GalleryProps as ReferenceGalleryProps,
|
|
4
|
+
OrgChartProps as ReferenceOrgChartProps,
|
|
5
|
+
ResourceScheduleProps as ReferenceResourceScheduleProps,
|
|
6
|
+
TimelineCategory as ReferenceTimelineCategory,
|
|
7
|
+
TimelineChange as ReferenceTimelineChange,
|
|
8
|
+
TimelineLink as ReferenceTimelineLink,
|
|
9
|
+
TimelinePreview as ReferenceTimelinePreview,
|
|
10
|
+
TimelineProps as ReferenceTimelineProps,
|
|
11
|
+
TimelineSegment as ReferenceTimelineSegment,
|
|
12
|
+
} from "../types/reference";
|
|
13
|
+
import type { ItemSelection } from "../lib/selection.ts";
|
|
14
|
+
import type { ItemContextMenu } from "../Views/Views.types.ts";
|
|
15
|
+
|
|
16
|
+
export type GalleryProps = ReferenceGalleryProps;
|
|
17
|
+
|
|
18
|
+
type CalendarEvent = ReferenceCalendarProps["events"][number] & {
|
|
19
|
+
/** How the selection, menus and hover cards name the event (`data-item`). */
|
|
20
|
+
id?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type CalendarProps = Omit<ReferenceCalendarProps, "events"> & {
|
|
24
|
+
events: CalendarEvent[];
|
|
25
|
+
onEventSelect?: (event: CalendarEvent) => void;
|
|
26
|
+
/** Events with an `id` can be selected. See useItemSelection. */
|
|
27
|
+
selection?: ItemSelection;
|
|
28
|
+
onItemContextMenu?: ItemContextMenu;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type TimelineProps = ReferenceTimelineProps;
|
|
32
|
+
export type TimelineChange = ReferenceTimelineChange;
|
|
33
|
+
export type TimelineLink = ReferenceTimelineLink;
|
|
34
|
+
export type TimelinePreview = ReferenceTimelinePreview;
|
|
35
|
+
export type TimelineCategory = ReferenceTimelineCategory;
|
|
36
|
+
export type TimelineSegment = ReferenceTimelineSegment;
|
|
37
|
+
|
|
38
|
+
export type ResourceScheduleProps = ReferenceResourceScheduleProps;
|
|
39
|
+
|
|
40
|
+
export type OrgChartProps = ReferenceOrgChartProps;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Children, isValidElement, type CSSProperties, type ReactElement } from "react";
|
|
2
|
+
import { type GalleryProps } from "./Charts.types.ts";
|
|
3
|
+
|
|
4
|
+
/** Cards on an auto-filling grid; `min` sets the smallest card width in pixels (240 by default). */
|
|
5
|
+
export function Gallery({ label, min, children }: GalleryProps): ReactElement {
|
|
6
|
+
const items = Children.toArray(children).filter((c) => !(typeof c === "string" && !c.trim()));
|
|
7
|
+
const style = {
|
|
8
|
+
"--xos-gallery-min":
|
|
9
|
+
min === undefined ? "calc(var(--space-40) * 6)" : `calc(var(--space-4) * ${min / 4})`,
|
|
10
|
+
} as CSSProperties;
|
|
11
|
+
return (
|
|
12
|
+
<div
|
|
13
|
+
role="list"
|
|
14
|
+
aria-label={label}
|
|
15
|
+
style={style}
|
|
16
|
+
className="grid grid-cols-[repeat(auto-fill,minmax(min(var(--xos-gallery-min),100%),1fr))] gap-16"
|
|
17
|
+
>
|
|
18
|
+
{items.map((child, i) => (
|
|
19
|
+
<div role="listitem" key={isValidElement(child) && child.key !== null ? child.key : i}>
|
|
20
|
+
{child}
|
|
21
|
+
</div>
|
|
22
|
+
))}
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|