@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,34 @@
|
|
|
1
|
+
# RecordKindGlyph
|
|
2
|
+
|
|
3
|
+
RecordKindGlyph draws the Lucide icon assigned to each of the 26 record kinds, grouped by class.
|
|
4
|
+
|
|
5
|
+
| Class | Kind | Lucide icon |
|
|
6
|
+
| ---------- | ------------ | ------------- |
|
|
7
|
+
| Work | Build | Construction |
|
|
8
|
+
| Work | Rehearsal | Repeat |
|
|
9
|
+
| Work | Shift | CalendarClock |
|
|
10
|
+
| Work | Strike | PackageX |
|
|
11
|
+
| Work | Task | SquareCheck |
|
|
12
|
+
| Work | Training | GraduationCap |
|
|
13
|
+
| Artifact | Document | FileText |
|
|
14
|
+
| Artifact | Supply | Package |
|
|
15
|
+
| Commitment | Booking | CalendarCheck |
|
|
16
|
+
| Commitment | Contract | FileSignature |
|
|
17
|
+
| Commitment | Payment | Banknote |
|
|
18
|
+
| Commitment | Recruitment | UserPlus |
|
|
19
|
+
| Control | Approval | Stamp |
|
|
20
|
+
| Control | Compliance | ShieldCheck |
|
|
21
|
+
| Control | Deadline | AlarmClock |
|
|
22
|
+
| Control | Decision | Split |
|
|
23
|
+
| Control | Inspection | ScanSearch |
|
|
24
|
+
| Control | Permit | BadgeCheck |
|
|
25
|
+
| Time | Distribution | Send |
|
|
26
|
+
| Time | Event | Ticket |
|
|
27
|
+
| Time | Goal | Target |
|
|
28
|
+
| Time | Meeting | Users |
|
|
29
|
+
| Time | Milestone | Milestone |
|
|
30
|
+
| Time | Report | ChartColumn |
|
|
31
|
+
| Time | Risk | TriangleAlert |
|
|
32
|
+
| Time | Timeline | ChartGantt |
|
|
33
|
+
|
|
34
|
+
Exported as `XOS.glyphs.recordKinds`. The Build kind uses Construction so it stays distinct from the Build phase (Hammer).
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# RecordRow
|
|
2
|
+
|
|
3
|
+
RecordRow is one list-view row that answers what now: state, key, title, phase, next date, owner and the next action.
|
|
4
|
+
|
|
5
|
+
- The next action appears on hover or focus, and is always visible on touch.
|
|
6
|
+
- Rows sit inside RecordList, which carries the grid role and the list's name.
|
|
7
|
+
- Titles follow each kind's title grammar (Bible tab 24): Task is imperative, Supply and Inspection are noun phrases.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Extension, type Editor, type Range } from "@tiptap/core";
|
|
2
|
+
import Mention from "@tiptap/extension-mention";
|
|
3
|
+
import { TaskItem, TaskList } from "@tiptap/extension-list";
|
|
4
|
+
import { TableKit } from "@tiptap/extension-table";
|
|
5
|
+
import { PluginKey } from "@tiptap/pm/state";
|
|
6
|
+
import Suggestion, {
|
|
7
|
+
type SuggestionKeyDownProps,
|
|
8
|
+
type SuggestionOptions,
|
|
9
|
+
type SuggestionProps,
|
|
10
|
+
} from "@tiptap/suggestion";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* RichTextEditor extensions (RRR-75): `@` mentions, `#` record links, `/` slash commands, tables
|
|
14
|
+
* and checklists, on the Tiptap 3.31.4 pin. Suggestion menus render in React: each trigger reports
|
|
15
|
+
* its open menu through `onMenu`, and the editor component draws the listbox.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface SuggestionItem {
|
|
19
|
+
id: string;
|
|
20
|
+
label: string;
|
|
21
|
+
meta?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type SuggestionSource = (query: string) => SuggestionItem[] | Promise<SuggestionItem[]>;
|
|
25
|
+
|
|
26
|
+
export type MenuKind = "mention" | "record" | "slash";
|
|
27
|
+
|
|
28
|
+
export interface SuggestionMenu {
|
|
29
|
+
kind: MenuKind;
|
|
30
|
+
items: SuggestionItem[];
|
|
31
|
+
active: number;
|
|
32
|
+
rect: DOMRect | null;
|
|
33
|
+
select: (index: number) => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type MenuListener = (menu: SuggestionMenu | null) => void;
|
|
37
|
+
|
|
38
|
+
export interface SlashCommand extends SuggestionItem {
|
|
39
|
+
run: (editor: Editor, range: Range) => void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The slash menu blocks, labeled through the `rte` catalog. */
|
|
43
|
+
export function slashCommands(label: (key: string) => string): SlashCommand[] {
|
|
44
|
+
return [
|
|
45
|
+
{
|
|
46
|
+
id: "heading",
|
|
47
|
+
label: label("rte.heading"),
|
|
48
|
+
run: (e, r) => e.chain().focus().deleteRange(r).toggleHeading({ level: 2 }).run(),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "bullets",
|
|
52
|
+
label: label("rte.bullets"),
|
|
53
|
+
run: (e, r) => e.chain().focus().deleteRange(r).toggleBulletList().run(),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "checklist",
|
|
57
|
+
label: label("rte.checklist"),
|
|
58
|
+
run: (e, r) => e.chain().focus().deleteRange(r).toggleTaskList().run(),
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "table",
|
|
62
|
+
label: label("rte.table"),
|
|
63
|
+
run: (e, r) =>
|
|
64
|
+
e
|
|
65
|
+
.chain()
|
|
66
|
+
.focus()
|
|
67
|
+
.deleteRange(r)
|
|
68
|
+
.insertTable({ rows: 3, cols: 3, withHeaderRow: true })
|
|
69
|
+
.run(),
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "quote",
|
|
73
|
+
label: label("rte.quote"),
|
|
74
|
+
run: (e, r) => e.chain().focus().deleteRange(r).toggleBlockquote().run(),
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "divider",
|
|
78
|
+
label: label("rte.divider"),
|
|
79
|
+
run: (e, r) => e.chain().focus().deleteRange(r).setHorizontalRule().run(),
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Bridges Tiptap's suggestion lifecycle to a React listener, with arrow, Enter and Escape keys. */
|
|
85
|
+
export function menuRenderer<T extends SuggestionItem>(
|
|
86
|
+
kind: MenuKind,
|
|
87
|
+
listen: () => MenuListener,
|
|
88
|
+
): NonNullable<SuggestionOptions<T>["render"]> {
|
|
89
|
+
return () => {
|
|
90
|
+
let props: SuggestionProps<T> | null = null;
|
|
91
|
+
let active = 0;
|
|
92
|
+
const publish = () => {
|
|
93
|
+
if (!props) return listen()(null);
|
|
94
|
+
const current = props;
|
|
95
|
+
listen()({
|
|
96
|
+
kind,
|
|
97
|
+
items: current.items,
|
|
98
|
+
active,
|
|
99
|
+
rect: current.clientRect?.() ?? null,
|
|
100
|
+
select: (index) => {
|
|
101
|
+
const item = current.items[index];
|
|
102
|
+
if (item) current.command(item);
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
onStart: (next) => {
|
|
108
|
+
props = next;
|
|
109
|
+
active = 0;
|
|
110
|
+
publish();
|
|
111
|
+
},
|
|
112
|
+
onUpdate: (next) => {
|
|
113
|
+
props = next;
|
|
114
|
+
active = Math.min(active, Math.max(0, next.items.length - 1));
|
|
115
|
+
publish();
|
|
116
|
+
},
|
|
117
|
+
onKeyDown: ({ event }: SuggestionKeyDownProps) => {
|
|
118
|
+
if (!props) return false;
|
|
119
|
+
const count = props.items.length;
|
|
120
|
+
if (event.key === "Escape") {
|
|
121
|
+
props = null;
|
|
122
|
+
publish();
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
if (count === 0) return false;
|
|
126
|
+
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
127
|
+
active = (active + (event.key === "ArrowDown" ? 1 : count - 1)) % count;
|
|
128
|
+
publish();
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
if (event.key === "Enter" || event.key === "Tab") {
|
|
132
|
+
const item = props.items[active];
|
|
133
|
+
if (item) props.command(item);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
},
|
|
138
|
+
onExit: () => {
|
|
139
|
+
props = null;
|
|
140
|
+
publish();
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function filtered(source: SuggestionSource, query: string): Promise<SuggestionItem[]> {
|
|
147
|
+
return (await source(query)).slice(0, 8);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** `@` mentions of people; the node keeps the person id and renders `@Name`. */
|
|
151
|
+
export function mentionExtension(source: SuggestionSource, listen: () => MenuListener) {
|
|
152
|
+
return Mention.configure({
|
|
153
|
+
HTMLAttributes: { class: "xos-mention" },
|
|
154
|
+
suggestion: {
|
|
155
|
+
char: "@",
|
|
156
|
+
pluginKey: new PluginKey("xosMention"),
|
|
157
|
+
items: ({ query }) => filtered(source, query),
|
|
158
|
+
render: menuRenderer("mention", listen),
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** `#` record links; the node keeps the URID and renders a link to the record. */
|
|
164
|
+
export function recordLinkExtension(
|
|
165
|
+
source: SuggestionSource,
|
|
166
|
+
href: (urid: string) => string,
|
|
167
|
+
listen: () => MenuListener,
|
|
168
|
+
) {
|
|
169
|
+
return Mention.extend({ name: "recordLink" }).configure({
|
|
170
|
+
HTMLAttributes: { class: "xos-record-link" },
|
|
171
|
+
renderHTML: ({ node, options }) => [
|
|
172
|
+
"a",
|
|
173
|
+
{
|
|
174
|
+
...options.HTMLAttributes,
|
|
175
|
+
href: href(String(node.attrs["id"])),
|
|
176
|
+
"data-urid": node.attrs["id"],
|
|
177
|
+
},
|
|
178
|
+
`#${String(node.attrs["label"] ?? node.attrs["id"])}`,
|
|
179
|
+
],
|
|
180
|
+
renderText: ({ node }) => `#${String(node.attrs["label"] ?? node.attrs["id"])}`,
|
|
181
|
+
suggestion: {
|
|
182
|
+
char: "#",
|
|
183
|
+
pluginKey: new PluginKey("xosRecordLink"),
|
|
184
|
+
items: ({ query }) => filtered(source, query),
|
|
185
|
+
render: menuRenderer("record", listen),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** `/` slash commands that insert blocks. */
|
|
191
|
+
export function slashExtension(commands: SlashCommand[], listen: () => MenuListener) {
|
|
192
|
+
return Extension.create({
|
|
193
|
+
name: "slashCommand",
|
|
194
|
+
addProseMirrorPlugins() {
|
|
195
|
+
return [
|
|
196
|
+
Suggestion<SlashCommand>({
|
|
197
|
+
editor: this.editor,
|
|
198
|
+
char: "/",
|
|
199
|
+
pluginKey: new PluginKey("xosSlash"),
|
|
200
|
+
items: ({ query }) =>
|
|
201
|
+
commands.filter((c) => c.label.toLowerCase().includes(query.toLowerCase())),
|
|
202
|
+
command: ({ editor, range, props }) => props.run(editor, range),
|
|
203
|
+
render: menuRenderer<SlashCommand>("slash", listen),
|
|
204
|
+
}),
|
|
205
|
+
];
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Tables (with header rows and column resizing off for touch) and nested checklists. */
|
|
211
|
+
export function blockExtensions() {
|
|
212
|
+
return [
|
|
213
|
+
TableKit.configure({ table: { resizable: false, HTMLAttributes: { class: "xos-rte-table" } } }),
|
|
214
|
+
TaskList,
|
|
215
|
+
TaskItem.configure({ nested: true }),
|
|
216
|
+
];
|
|
217
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# ScreenshotFrame
|
|
2
|
+
|
|
3
|
+
ScreenshotFrame presents a product image, or live XOS components standing in for one, inside a window frame.
|
|
4
|
+
|
|
5
|
+
With `src` it draws an image at a fixed aspect ratio, lazy by default; pass `eager` for the hero image. Without `src` it frames the components passed as children: the content is inert, hidden from assistive technology and exposed as a single image, so it adds no tab stops.
|
|
6
|
+
|
|
7
|
+
`alt` is required in both modes and says what the picture shows, not that it is a screenshot. Provide one image per locale so the picture matches the page language. Pictures use only the fictional Northwind Live tenant.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# ScrollRegion
|
|
2
|
+
|
|
3
|
+
ScrollRegion keeps wide data inside the page width. Content wider than its container scrolls horizontally inside a labeled region; the page itself never scrolls sideways, which satisfies WCAG 1.4.10 Reflow for two-dimensional content.
|
|
4
|
+
|
|
5
|
+
- DataTable, BudgetGrid, ReconciliationTable, AccessGridMatrix, RadioChannelTable, ShortcutEditor, ResourceSchedule, DiffViewer, CoordinateMatrix, OrgChart and Timeline are wrapped automatically. Use ScrollRegion directly for any other wide content.
|
|
6
|
+
- The region has `role="region"` and an accessible name taken from the wrapped component's label, caption or title (fallback: "Scrollable content").
|
|
7
|
+
- It joins the tab order only while its content actually overflows, measured with a ResizeObserver, so keyboard users can scroll it with the arrow keys and nobody else pays an extra tab stop.
|
|
8
|
+
- Focus shows the standard 2 px `focus-ring` outline. Scrolling is contained (`overscroll-behavior-x: contain`) so a horizontal swipe never navigates the browser back.
|
|
9
|
+
- Production: keep this wrapper around TanStack Table and Glide Data Grid surfaces; Glide's own canvas scroller replaces it inside the grid.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# SpreadsheetGrid
|
|
2
|
+
|
|
3
|
+
SpreadsheetGrid edits money and numbers at spreadsheet speed: arrow keys, Enter to edit, fill handle, Excel paste, NULL-aware cells.
|
|
4
|
+
|
|
5
|
+
- Deleting a cell sets it to Unpriced, never 0.
|
|
6
|
+
- A totals row is blank when any line is blank.
|
|
7
|
+
- `type: 'multiplier'` stores a plain number and displays it with one decimal and an x (1.5 shows as 1.5x, 2 as 2.0x). Typing 1.5x commits 1.5; the stored value is never text.
|
|
8
|
+
- `derive` makes a read-only column computed from the row. Use it for any value whose source of truth is another table, so the grid never holds a second copy. Derived cells use secondary text, refuse edits and explain why on hover.
|
|
9
|
+
- The preview is the Playbook Labor Rate Cards (decision D12). Each row stores only its own facts: rate card ID, role code, worker classification, pay basis, arrangement, standard rate and overtime rule. Classification, pay basis and arrangement are separate facts (decision D16): W2 Daily, Contractor 1099 and Vendor Master became Employee, Independent Contractor and Vendor-Supplied. Job Title comes from the Roles Library by role code; OT and DT come from the referenced overtime rule (decision D14), so the grid shows the multipliers and the row stores only the rule; GL Account is derived from the role code's class through the GL Accounts table (decision D13), which is why 9000.50.01 Production Stage Manager posts to 5900 Expense · Technology. The same joins are the `rate_card_resolved` view in `export/canon/schema.sql`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# StateIcon
|
|
2
|
+
|
|
3
|
+
StateIcon draws the shape for each of the nine record states so state never relies on color alone.
|
|
4
|
+
|
|
5
|
+
- Proposed dashed circle, Ready empty circle, Scheduled clock circle, Active half circle, Blocked octagon, In Review eye circle, Complete check circle, Deferred pause circle, Canceled slashed circle.
|
|
6
|
+
- Color comes from the `state-*` tokens.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from "react";
|
|
2
|
+
import type { RecordState, StateIconProps as ReferenceStateIconProps } from "../types/reference";
|
|
3
|
+
import { cx } from "../lib/cx.ts";
|
|
4
|
+
|
|
5
|
+
export type StateIconProps = ReferenceStateIconProps;
|
|
6
|
+
|
|
7
|
+
/** State hue classes. The shape carries meaning; the hue reinforces it. */
|
|
8
|
+
const STATE_CLASS: Record<RecordState, string> = {
|
|
9
|
+
proposed: cx("text-state-proposed"),
|
|
10
|
+
ready: cx("text-state-ready"),
|
|
11
|
+
scheduled: cx("text-state-scheduled"),
|
|
12
|
+
active: cx("text-state-active"),
|
|
13
|
+
blocked: cx("text-state-blocked"),
|
|
14
|
+
"in-review": cx("text-state-in-review"),
|
|
15
|
+
complete: cx("text-state-complete"),
|
|
16
|
+
deferred: cx("text-state-deferred"),
|
|
17
|
+
canceled: cx("text-state-canceled"),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const CUT = "var(--color-bg-canvas)";
|
|
21
|
+
|
|
22
|
+
function ring(extra: Record<string, string> = {}): ReactNode {
|
|
23
|
+
return (
|
|
24
|
+
<circle cx={8} cy={8} r={6} fill="none" stroke="currentColor" strokeWidth={1.5} {...extra} />
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function shape(state: RecordState): ReactNode {
|
|
29
|
+
switch (state) {
|
|
30
|
+
case "proposed":
|
|
31
|
+
return ring({ strokeDasharray: "2.2 2.2" });
|
|
32
|
+
case "scheduled":
|
|
33
|
+
return (
|
|
34
|
+
<>
|
|
35
|
+
{ring()}
|
|
36
|
+
<path
|
|
37
|
+
d="M8 5v3.25l2 1.25"
|
|
38
|
+
fill="none"
|
|
39
|
+
stroke="currentColor"
|
|
40
|
+
strokeWidth={1.5}
|
|
41
|
+
strokeLinecap="round"
|
|
42
|
+
/>
|
|
43
|
+
</>
|
|
44
|
+
);
|
|
45
|
+
case "active":
|
|
46
|
+
return (
|
|
47
|
+
<>
|
|
48
|
+
{ring()}
|
|
49
|
+
<path d="M8 4.5a3.5 3.5 0 0 1 0 7z" fill="currentColor" />
|
|
50
|
+
</>
|
|
51
|
+
);
|
|
52
|
+
case "blocked":
|
|
53
|
+
return (
|
|
54
|
+
<>
|
|
55
|
+
<path d="M5.5 2h5L14 5.5v5L10.5 14h-5L2 10.5v-5z" fill="currentColor" />
|
|
56
|
+
<path d="M5.5 8h5" stroke={CUT} strokeWidth={1.5} strokeLinecap="round" />
|
|
57
|
+
</>
|
|
58
|
+
);
|
|
59
|
+
case "in-review":
|
|
60
|
+
return (
|
|
61
|
+
<>
|
|
62
|
+
{ring()}
|
|
63
|
+
<path
|
|
64
|
+
d="M4.75 8s1.25-2 3.25-2s3.25 2 3.25 2s-1.25 2-3.25 2s-3.25-2-3.25-2z"
|
|
65
|
+
fill="none"
|
|
66
|
+
stroke="currentColor"
|
|
67
|
+
strokeWidth={1.25}
|
|
68
|
+
/>
|
|
69
|
+
<circle cx={8} cy={8} r={0.9} fill="currentColor" />
|
|
70
|
+
</>
|
|
71
|
+
);
|
|
72
|
+
case "complete":
|
|
73
|
+
return (
|
|
74
|
+
<>
|
|
75
|
+
<circle cx={8} cy={8} r={6.75} fill="currentColor" />
|
|
76
|
+
<path
|
|
77
|
+
d="M5.25 8.25l1.75 1.75l3.5-4"
|
|
78
|
+
fill="none"
|
|
79
|
+
stroke={CUT}
|
|
80
|
+
strokeWidth={1.5}
|
|
81
|
+
strokeLinecap="round"
|
|
82
|
+
strokeLinejoin="round"
|
|
83
|
+
/>
|
|
84
|
+
</>
|
|
85
|
+
);
|
|
86
|
+
case "deferred":
|
|
87
|
+
return (
|
|
88
|
+
<>
|
|
89
|
+
{ring()}
|
|
90
|
+
<path
|
|
91
|
+
d="M6.75 5.75v4.5M9.25 5.75v4.5"
|
|
92
|
+
stroke="currentColor"
|
|
93
|
+
strokeWidth={1.5}
|
|
94
|
+
strokeLinecap="round"
|
|
95
|
+
/>
|
|
96
|
+
</>
|
|
97
|
+
);
|
|
98
|
+
case "canceled":
|
|
99
|
+
return (
|
|
100
|
+
<>
|
|
101
|
+
{ring()}
|
|
102
|
+
<path d="M4 12l8-8" stroke="currentColor" strokeWidth={1.5} strokeLinecap="round" />
|
|
103
|
+
</>
|
|
104
|
+
);
|
|
105
|
+
default:
|
|
106
|
+
return ring();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** One of the nine record state icons, drawn by this system (filled and half-filled shapes). Decorative: pair it with a label. */
|
|
111
|
+
export function StateIcon({ state, size = 14 }: StateIconProps): ReactElement {
|
|
112
|
+
return (
|
|
113
|
+
<svg
|
|
114
|
+
className={cx(
|
|
115
|
+
"inline-block flex-none align-middle",
|
|
116
|
+
STATE_CLASS[state] ?? "text-text-secondary",
|
|
117
|
+
)}
|
|
118
|
+
width={size}
|
|
119
|
+
height={size}
|
|
120
|
+
viewBox="0 0 16 16"
|
|
121
|
+
aria-hidden="true"
|
|
122
|
+
data-state={state}
|
|
123
|
+
>
|
|
124
|
+
{shape(state)}
|
|
125
|
+
</svg>
|
|
126
|
+
);
|
|
127
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# StatusHeatmap
|
|
2
|
+
|
|
3
|
+
StatusHeatmap crosses rows with columns, one state per cell: the recipients of an advance packet by its sections, the
|
|
4
|
+
people on a roster by readiness category, or the parties of a project by offering (R11, Section 11.11).
|
|
5
|
+
|
|
6
|
+
- Props: `label`, `corner`, `rows` (`{ id, label, sublabel }`), `cols` (`{ id, label }`), `cells` keyed
|
|
7
|
+
`<row id>:<col id>` to `{ state, href, detail, readOnly }` (`detail` shows under the state; a `readOnly` cell keeps its
|
|
8
|
+
focus but opens nothing), `legend` (`{ state, icon, label }`), optional `selection` for a
|
|
9
|
+
bulk action on rows, and `onCellSelect`.
|
|
10
|
+
- An ARIA grid with `useGridFocus`, like CoordinateMatrix: arrows move between cells, Home and End go to the row's
|
|
11
|
+
ends (with Ctrl or Cmd, the grid's), and Enter or Space opens a cell (`onCellSelect`, else the cell's `href`).
|
|
12
|
+
- Every state shows its `StateIcon` and its label, never color alone. A row and column with no cell reads "not asked".
|
|
13
|
+
- The table is its own accessible alternative: row and column headers name every cell, and the legend lists each
|
|
14
|
+
state once. Wide grids scroll inside a `ScrollRegion`, so a 375 px page never scrolls sideways.
|
|
15
|
+
- Atlas imports it directly on Advancing > Progress, the default section of a route that is not a key page: a control that renders on arrival loses its first clicks behind `next/dynamic` (ADR 0027).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { SkeletonProps as ReferenceSkeletonProps } from "../types/reference";
|
|
3
|
+
|
|
4
|
+
export type SkeletonProps = ReferenceSkeletonProps;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Reserves space for streamed content; stops pulsing under reduced motion. A module of its own:
|
|
8
|
+
* route loading boundaries render it on every visit, so it brings nothing else along (ADR 0027).
|
|
9
|
+
*/
|
|
10
|
+
export function Skeleton({ width, height }: SkeletonProps): ReactElement {
|
|
11
|
+
return (
|
|
12
|
+
<span
|
|
13
|
+
aria-hidden="true"
|
|
14
|
+
className="xos-anim-pulse block rounded-chip bg-bg-hover"
|
|
15
|
+
style={{
|
|
16
|
+
inlineSize: width ?? "var(--ui-skeleton-inline)",
|
|
17
|
+
blockSize: height ?? "var(--ui-skeleton-block)",
|
|
18
|
+
}}
|
|
19
|
+
/>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type {
|
|
3
|
+
CardProps as ReferenceCardProps,
|
|
4
|
+
DividerProps as ReferenceDividerProps,
|
|
5
|
+
} from "../types/reference";
|
|
6
|
+
import { cx } from "../lib/cx.ts";
|
|
7
|
+
|
|
8
|
+
export { Skeleton, type SkeletonProps } from "./Skeleton.tsx";
|
|
9
|
+
|
|
10
|
+
export type CardProps = ReferenceCardProps & { className?: string };
|
|
11
|
+
export type DividerProps = ReferenceDividerProps;
|
|
12
|
+
|
|
13
|
+
export const cardClass = cx(
|
|
14
|
+
"bg-bg-raised border border-border-subtle rounded-card forced-colors:border-[CanvasText]",
|
|
15
|
+
"print:bg-paper print:text-paper-ink print:shadow-none",
|
|
16
|
+
);
|
|
17
|
+
export const cardHeadClass = cx(
|
|
18
|
+
"flex items-center justify-between gap-8 px-16 py-12 border-b border-border-subtle",
|
|
19
|
+
);
|
|
20
|
+
export const cardBodyClass = cx("flex flex-col gap-12 p-16");
|
|
21
|
+
export const cardFootClass = cx(
|
|
22
|
+
"flex items-center justify-end gap-8 px-16 py-12 border-t border-border-subtle",
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/** A raised region with an optional title, meta and footer. `interactive` strengthens the border on hover. */
|
|
26
|
+
export function Card({
|
|
27
|
+
title,
|
|
28
|
+
meta,
|
|
29
|
+
footer,
|
|
30
|
+
interactive = false,
|
|
31
|
+
children,
|
|
32
|
+
className,
|
|
33
|
+
}: CardProps): ReactElement {
|
|
34
|
+
return (
|
|
35
|
+
<section className={cx(cardClass, interactive && "hover:border-border-strong", className)}>
|
|
36
|
+
{title ? (
|
|
37
|
+
<header className={cardHeadClass}>
|
|
38
|
+
<strong className="font-semibold">{title}</strong>
|
|
39
|
+
{meta ? <span className="text-text-secondary">{meta}</span> : null}
|
|
40
|
+
</header>
|
|
41
|
+
) : null}
|
|
42
|
+
<div className={cardBodyClass}>{children}</div>
|
|
43
|
+
{footer ? <footer className={cardFootClass}>{footer}</footer> : null}
|
|
44
|
+
</section>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** A hairline rule, or a labeled separator between groups. */
|
|
49
|
+
export function Divider({ label }: DividerProps): ReactElement {
|
|
50
|
+
if (!label) return <hr className="h-(--stroke-width-hairline) my-8 border-0 bg-border-subtle" />;
|
|
51
|
+
return (
|
|
52
|
+
<div
|
|
53
|
+
role="separator"
|
|
54
|
+
aria-label={label}
|
|
55
|
+
className={cx(
|
|
56
|
+
"flex items-center gap-8 my-8 text-text-11 text-text-tertiary",
|
|
57
|
+
"before:h-(--stroke-width-hairline) before:flex-1 before:bg-border-subtle after:h-(--stroke-width-hairline) after:flex-1 after:bg-border-subtle",
|
|
58
|
+
)}
|
|
59
|
+
>
|
|
60
|
+
<span aria-hidden="true">{label}</span>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# SurfaceTriptych
|
|
2
|
+
|
|
3
|
+
SurfaceTriptych presents the three XOS surfaces side by side, each with its audience and its release status.
|
|
4
|
+
|
|
5
|
+
Each card names the surface, who uses it and what it does, and carries a Tag with the status. Status is always a word beside the dot, never color alone. A surface that is not released says so here; the page never implies availability the source does not support.
|
|
6
|
+
|
|
7
|
+
The consumer provides name, audience, body, status and up to three points per surface.
|