@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,7 @@
|
|
|
1
|
+
# TabBar
|
|
2
|
+
|
|
3
|
+
TabBar is the five-destination bottom bar for phones: Compass always, Gateway and Atlas below the md breakpoint.
|
|
4
|
+
|
|
5
|
+
- Destinations and order come from the sitemaps (Section 4.5): Compass Today, Schedule, Scan, Inbox, More, with Scan raised in the center; Gateway Home, Explore, Work, Money, Messages; Atlas Home, Inbox, Search, My Work, Menu.
|
|
6
|
+
- Supervisors get a sixth Compass tab, Crew, only when their role allows it.
|
|
7
|
+
- Targets meet touch-min (48 pt).
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# TemplateAuth
|
|
2
|
+
|
|
3
|
+
Auth is the template for sign in, MFA, invite acceptance and passkey setup: a centered 400 px card on the brand background.
|
|
4
|
+
|
|
5
|
+
- Passwordless first: passkey, Sign in with Apple, Google, magic link. Passwords remain available, never first.
|
|
6
|
+
- Provider buttons (Continue with Google) use the secondary Button at full width, with the catalog label as the accessible name. A provider's mark keeps its own colors on every theme (Google's sign-in branding guidelines), so it is an image file beside the label, never a recolored icon or a color literal (ADR 0036).
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# TemplateCollection
|
|
2
|
+
|
|
3
|
+
Collection is the template for every list, board, timeline, calendar and table: page header with title, view switcher, filter bar and one primary action; a virtualized body; optional side peek.
|
|
4
|
+
|
|
5
|
+
- View state lives in the query string: `view`, `group`, `sort`, `filter`, `scope`.
|
|
6
|
+
- The switcher offers only views the data supports.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# TemplateDashboard
|
|
2
|
+
|
|
3
|
+
Dashboard is the template for Home, report dashboards and the partner console: a header with date range and scope picker, then tiles on the 12-column grid, resizable in grid units.
|
|
4
|
+
|
|
5
|
+
- Each tile spans whole columns (3 to 12 by default; `minSpan` raises the floor). Below md the grid is one column.
|
|
6
|
+
- With `resize`, a tile's inline-end handle widens or narrows it by drag or by the arrow keys (Home and End jump to the limits); a screen reader hears the new span, and `resize.onChange` receives every span to save. Atlas keeps them in the person's dashboard layout setting.
|
|
7
|
+
- The app supplies the handle and announcement copy, so the library ships no strings for it.
|
|
8
|
+
- Every figure drills through to its records in one click.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# TemplateGatewayShell
|
|
2
|
+
|
|
3
|
+
Gateway shell is the template for every Gateway page and token flow: top navigation with the org's or the platform's brand, no sidebar, comfortable density, 14 px base text and the System theme by default.
|
|
4
|
+
|
|
5
|
+
- Home leads with Up Next, then the feed of things that need the person, each with its action inline.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# TemplateSettings
|
|
2
|
+
|
|
3
|
+
Settings is the template for org, personal and project settings: a section list on the left, a centered 640 px form column, and a sticky save bar while there are unsaved changes.
|
|
4
|
+
|
|
5
|
+
- Every setting shows where its current value comes from (personal, project, team, workspace, organization, platform).
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# TemplateSystem
|
|
2
|
+
|
|
3
|
+
System is the template for 404, 403 shown as 404, 500, maintenance, offline and archived org: a centered message, an icon from the set and one primary action.
|
|
4
|
+
|
|
5
|
+
- A page the person may not see returns 404, never 403, so its existence is not disclosed.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { type TemplateAuthProps } from "./Templates.types.ts";
|
|
3
|
+
|
|
4
|
+
/** Sign in, MFA, invite acceptance and passkey setup: a centered 400 px card. */
|
|
5
|
+
export function TemplateAuth({ brand, children }: TemplateAuthProps): ReactElement {
|
|
6
|
+
return (
|
|
7
|
+
<div data-template="auth" className="grid place-items-center min-h-full p-24 bg-bg-canvas">
|
|
8
|
+
<div className="flex flex-col gap-24 w-[min(var(--layout-auth),100%)]">
|
|
9
|
+
{brand ? <div className="flex justify-center">{brand}</div> : null}
|
|
10
|
+
<div className="flex flex-col gap-16 p-24 bg-bg-raised border border-border-subtle rounded-card">
|
|
11
|
+
{children}
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { type TemplateCollectionProps } from "./Templates.types.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Every list, board, timeline, calendar and table. The root (data-template) is the view region of the
|
|
6
|
+
* shell's view shortcuts (lib/shortcut-targets.ts); Open the filters focuses the filter row unless a
|
|
7
|
+
* control in the header, such as the filter builder's Add filter, carries data-shortcut="view.filters".
|
|
8
|
+
*/
|
|
9
|
+
export function TemplateCollection({
|
|
10
|
+
header,
|
|
11
|
+
filters,
|
|
12
|
+
children,
|
|
13
|
+
peek,
|
|
14
|
+
bulk,
|
|
15
|
+
}: TemplateCollectionProps): ReactElement {
|
|
16
|
+
return (
|
|
17
|
+
<div data-template="collection" className="flex flex-col gap-12 min-w-0">
|
|
18
|
+
{header}
|
|
19
|
+
{filters ? (
|
|
20
|
+
<div
|
|
21
|
+
data-shortcut="view.filters"
|
|
22
|
+
data-shortcut-focus=""
|
|
23
|
+
className="flex flex-wrap items-center gap-6"
|
|
24
|
+
>
|
|
25
|
+
{filters}
|
|
26
|
+
</div>
|
|
27
|
+
) : null}
|
|
28
|
+
<div className="min-w-0">{children}</div>
|
|
29
|
+
{bulk ? (
|
|
30
|
+
<div className="sticky bottom-16 flex justify-center print:hidden">{bulk}</div>
|
|
31
|
+
) : null}
|
|
32
|
+
{peek}
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Children,
|
|
3
|
+
useRef,
|
|
4
|
+
useState,
|
|
5
|
+
type CSSProperties,
|
|
6
|
+
type KeyboardEvent,
|
|
7
|
+
type PointerEvent as ReactPointerEvent,
|
|
8
|
+
type ReactElement,
|
|
9
|
+
} from "react";
|
|
10
|
+
import { Direction } from "radix-ui";
|
|
11
|
+
import {
|
|
12
|
+
type DashboardResize,
|
|
13
|
+
type DashboardSpans,
|
|
14
|
+
type DashboardTile,
|
|
15
|
+
type TemplateDashboardProps,
|
|
16
|
+
} from "./Templates.types.ts";
|
|
17
|
+
|
|
18
|
+
/** Columns of the dashboard grid (Section 11.6). */
|
|
19
|
+
const COLUMNS = 12;
|
|
20
|
+
const MIN_SPAN = 3;
|
|
21
|
+
|
|
22
|
+
/** A span kept inside the grid: whole columns from the tile's minimum to the full width. */
|
|
23
|
+
export function clampSpan(span: number, min: number = MIN_SPAN): number {
|
|
24
|
+
const floor = Math.max(1, Math.min(COLUMNS, Math.round(min)));
|
|
25
|
+
if (!Number.isFinite(span)) return floor;
|
|
26
|
+
return Math.max(floor, Math.min(COLUMNS, Math.round(span)));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Every tile's span: the saved one when there is one, else its default, each kept inside the grid. */
|
|
30
|
+
export function spansOf(
|
|
31
|
+
tiles: readonly DashboardTile[],
|
|
32
|
+
saved: DashboardSpans = {},
|
|
33
|
+
): Record<string, number> {
|
|
34
|
+
return Object.fromEntries(
|
|
35
|
+
tiles.map((t) => [t.id, clampSpan(saved[t.id] ?? t.span, t.minSpan ?? MIN_SPAN)]),
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The handle on a tile's inline end: a vertical separator whose value is the span. Arrow keys change
|
|
41
|
+
* it by one column, Home and End jump to the limits, and a drag snaps to whole columns.
|
|
42
|
+
*/
|
|
43
|
+
function ResizeHandle({
|
|
44
|
+
tile,
|
|
45
|
+
span,
|
|
46
|
+
resize,
|
|
47
|
+
onSpan,
|
|
48
|
+
onDone,
|
|
49
|
+
}: {
|
|
50
|
+
tile: DashboardTile;
|
|
51
|
+
span: number;
|
|
52
|
+
resize: DashboardResize;
|
|
53
|
+
onSpan: (span: number) => void;
|
|
54
|
+
onDone: () => void;
|
|
55
|
+
}): ReactElement {
|
|
56
|
+
const dir = Direction.useDirection();
|
|
57
|
+
const min = clampSpan(tile.minSpan ?? MIN_SPAN, 1);
|
|
58
|
+
const growKey = dir === "rtl" ? "ArrowLeft" : "ArrowRight";
|
|
59
|
+
const shrinkKey = growKey === "ArrowRight" ? "ArrowLeft" : "ArrowRight";
|
|
60
|
+
|
|
61
|
+
const keyDown = (e: KeyboardEvent<HTMLDivElement>) => {
|
|
62
|
+
const next =
|
|
63
|
+
e.key === growKey
|
|
64
|
+
? span + 1
|
|
65
|
+
: e.key === shrinkKey
|
|
66
|
+
? span - 1
|
|
67
|
+
: e.key === "Home"
|
|
68
|
+
? min
|
|
69
|
+
: e.key === "End"
|
|
70
|
+
? COLUMNS
|
|
71
|
+
: null;
|
|
72
|
+
if (next === null) return;
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
const clamped = clampSpan(next, min);
|
|
75
|
+
if (clamped === span) return;
|
|
76
|
+
onSpan(clamped);
|
|
77
|
+
onDone();
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const pointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {
|
|
81
|
+
const grid = e.currentTarget.parentElement?.parentElement;
|
|
82
|
+
if (!grid) return;
|
|
83
|
+
e.preventDefault();
|
|
84
|
+
const gap = parseFloat(getComputedStyle(grid).columnGap) || 0;
|
|
85
|
+
// One grid unit: a column and the gap after it.
|
|
86
|
+
const unit = (grid.clientWidth - (COLUMNS - 1) * gap) / COLUMNS + gap;
|
|
87
|
+
const start = e.clientX;
|
|
88
|
+
const startSpan = span;
|
|
89
|
+
const sign = dir === "rtl" ? -1 : 1;
|
|
90
|
+
let last = span;
|
|
91
|
+
const move = (ev: PointerEvent) => {
|
|
92
|
+
if (unit <= 0) return;
|
|
93
|
+
const next = clampSpan(startSpan + (sign * (ev.clientX - start)) / unit, min);
|
|
94
|
+
if (next !== last) {
|
|
95
|
+
last = next;
|
|
96
|
+
onSpan(next);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const up = () => {
|
|
100
|
+
window.removeEventListener("pointermove", move);
|
|
101
|
+
window.removeEventListener("pointerup", up);
|
|
102
|
+
if (last !== startSpan) onDone();
|
|
103
|
+
};
|
|
104
|
+
window.addEventListener("pointermove", move);
|
|
105
|
+
window.addEventListener("pointerup", up);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<div
|
|
110
|
+
role="separator"
|
|
111
|
+
aria-orientation="vertical"
|
|
112
|
+
aria-label={resize.label(tile.label)}
|
|
113
|
+
aria-valuenow={span}
|
|
114
|
+
aria-valuemin={min}
|
|
115
|
+
aria-valuemax={COLUMNS}
|
|
116
|
+
aria-valuetext={resize.describe(tile.label, span)}
|
|
117
|
+
tabIndex={0}
|
|
118
|
+
onKeyDown={keyDown}
|
|
119
|
+
onPointerDown={pointerDown}
|
|
120
|
+
className="absolute inset-y-8 -end-6 w-(--ui-handle) rounded-full cursor-col-resize touch-none max-md:hidden hover:bg-accent focus-visible:bg-accent"
|
|
121
|
+
/>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Home, report dashboards and the partner console (Section 11.6): the header with the date range and
|
|
127
|
+
* scope picker, then tiles on the 12-column grid. Each tile spans whole columns; with `resize`, a
|
|
128
|
+
* person widens or narrows a tile by dragging its edge or with the arrow keys on its handle, a screen
|
|
129
|
+
* reader hears the new span, and `resize.onChange` receives every span to save. Below md the grid is
|
|
130
|
+
* one column, so the handles hide.
|
|
131
|
+
*/
|
|
132
|
+
export function TemplateDashboard({
|
|
133
|
+
header,
|
|
134
|
+
controls,
|
|
135
|
+
tiles,
|
|
136
|
+
spans,
|
|
137
|
+
resize,
|
|
138
|
+
label,
|
|
139
|
+
children,
|
|
140
|
+
}: TemplateDashboardProps): ReactElement {
|
|
141
|
+
// Spans changed here since the page rendered; they win over the saved ones until it renders again.
|
|
142
|
+
const [own, setOwn] = useState<Record<string, number>>({});
|
|
143
|
+
const [message, setMessage] = useState("");
|
|
144
|
+
const current = useRef<Record<string, number>>({});
|
|
145
|
+
const effective = tiles ? spansOf(tiles, { ...spans, ...own }) : {};
|
|
146
|
+
current.current = effective;
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div data-template="dashboard" className="flex flex-col gap-16 min-w-0">
|
|
150
|
+
{controls ? (
|
|
151
|
+
<div className="flex flex-wrap items-start justify-between gap-12">
|
|
152
|
+
<div className="flex-1 min-w-0">{header}</div>
|
|
153
|
+
<div className="flex flex-wrap items-center gap-8">{controls}</div>
|
|
154
|
+
</div>
|
|
155
|
+
) : (
|
|
156
|
+
header
|
|
157
|
+
)}
|
|
158
|
+
<div
|
|
159
|
+
{...(label ? { role: "group", "aria-label": label } : {})}
|
|
160
|
+
className="grid grid-cols-12 gap-(--layout-gutter-lg)"
|
|
161
|
+
>
|
|
162
|
+
{tiles?.map((tile) => {
|
|
163
|
+
const span = effective[tile.id] ?? tile.span;
|
|
164
|
+
return (
|
|
165
|
+
<div
|
|
166
|
+
key={tile.id}
|
|
167
|
+
data-tile={tile.id}
|
|
168
|
+
data-span={span}
|
|
169
|
+
className="relative flex flex-col min-w-0 col-span-12 md:col-span-(--tile-span) *:flex-1"
|
|
170
|
+
style={{ "--tile-span": span } as CSSProperties}
|
|
171
|
+
>
|
|
172
|
+
{tile.content}
|
|
173
|
+
{resize ? (
|
|
174
|
+
<ResizeHandle
|
|
175
|
+
tile={tile}
|
|
176
|
+
span={span}
|
|
177
|
+
resize={resize}
|
|
178
|
+
onSpan={(next) => {
|
|
179
|
+
current.current = { ...current.current, [tile.id]: next };
|
|
180
|
+
setOwn((old) => ({ ...old, [tile.id]: next }));
|
|
181
|
+
setMessage(resize.describe(tile.label, next));
|
|
182
|
+
}}
|
|
183
|
+
onDone={() => resize.onChange({ ...current.current })}
|
|
184
|
+
/>
|
|
185
|
+
) : null}
|
|
186
|
+
</div>
|
|
187
|
+
);
|
|
188
|
+
})}
|
|
189
|
+
{Children.map(children, (child) => (
|
|
190
|
+
<div className="min-w-0 col-span-12 md:col-span-6 lg:col-span-4">{child}</div>
|
|
191
|
+
))}
|
|
192
|
+
</div>
|
|
193
|
+
{resize ? (
|
|
194
|
+
<span aria-live="polite" className="sr-only">
|
|
195
|
+
{message}
|
|
196
|
+
</span>
|
|
197
|
+
) : null}
|
|
198
|
+
</div>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { type TemplateDocumentProps } from "./Templates.types.ts";
|
|
3
|
+
|
|
4
|
+
/** SOPs, documents and legal pages: a 720 px reading column beside its outline. */
|
|
5
|
+
export function TemplateDocument({
|
|
6
|
+
outline,
|
|
7
|
+
children,
|
|
8
|
+
acknowledgments,
|
|
9
|
+
}: TemplateDocumentProps): ReactElement {
|
|
10
|
+
return (
|
|
11
|
+
<div
|
|
12
|
+
data-template="document"
|
|
13
|
+
className="grid grid-cols-[var(--ui-outline)_minmax(0,var(--layout-reading))] max-lg:grid-cols-[minmax(0,1fr)] gap-32"
|
|
14
|
+
>
|
|
15
|
+
<div className="max-lg:hidden">{outline}</div>
|
|
16
|
+
<article className="flex flex-col gap-16 min-w-0 leading-relaxed">
|
|
17
|
+
{children}
|
|
18
|
+
{acknowledgments ? (
|
|
19
|
+
<footer className="pt-16 border-t border-border-subtle">{acknowledgments}</footer>
|
|
20
|
+
) : null}
|
|
21
|
+
</article>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { cx } from "../lib/cx.ts";
|
|
3
|
+
import { type TemplateGatewayShellProps } from "./Templates.types.ts";
|
|
4
|
+
|
|
5
|
+
/** Every Gateway page: top navigation, no sidebar, comfortable density and 14 px base text. */
|
|
6
|
+
export function TemplateGatewayShell({
|
|
7
|
+
topNav,
|
|
8
|
+
aside,
|
|
9
|
+
children,
|
|
10
|
+
tabBar,
|
|
11
|
+
}: TemplateGatewayShellProps): ReactElement {
|
|
12
|
+
return (
|
|
13
|
+
<div
|
|
14
|
+
data-template="gateway-shell"
|
|
15
|
+
className="flex flex-col min-h-full max-md:flex-1 max-md:min-h-0 bg-bg-canvas text-text-14"
|
|
16
|
+
>
|
|
17
|
+
<div className="max-md:hidden">{topNav}</div>
|
|
18
|
+
<main
|
|
19
|
+
className={cx(
|
|
20
|
+
"flex-1 p-24 max-md:p-16 min-w-0 max-md:min-h-0 max-md:overflow-y-auto",
|
|
21
|
+
aside
|
|
22
|
+
? "grid grid-cols-[var(--ui-gateway-aside)_minmax(0,1fr)] max-lg:grid-cols-[minmax(0,1fr)] gap-24"
|
|
23
|
+
: "flex flex-col gap-16",
|
|
24
|
+
)}
|
|
25
|
+
>
|
|
26
|
+
{aside ? <div className="flex flex-col gap-16 min-w-0">{aside}</div> : null}
|
|
27
|
+
<div className="flex flex-col gap-16 min-w-0">{children}</div>
|
|
28
|
+
</main>
|
|
29
|
+
{tabBar ? (
|
|
30
|
+
<div data-xos-bottom-bar="" className="hidden max-md:block sticky bottom-0 [&_nav]:w-full">
|
|
31
|
+
{tabBar}
|
|
32
|
+
</div>
|
|
33
|
+
) : null}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { type TemplateGridEditorProps } from "./Templates.types.ts";
|
|
3
|
+
|
|
4
|
+
/** Spreadsheet-speed editing: a full-width grid under its header. */
|
|
5
|
+
export function TemplateGridEditor({
|
|
6
|
+
header,
|
|
7
|
+
children,
|
|
8
|
+
toolbar,
|
|
9
|
+
}: TemplateGridEditorProps): ReactElement {
|
|
10
|
+
return (
|
|
11
|
+
<div data-template="grid-editor" className="flex flex-col gap-12 min-w-0">
|
|
12
|
+
{header}
|
|
13
|
+
{toolbar ? <div className="flex flex-wrap items-center gap-8">{toolbar}</div> : null}
|
|
14
|
+
<div className="min-w-0">{children}</div>
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { cx } from "../lib/cx.ts";
|
|
3
|
+
import { type TemplateRecordProps } from "./Templates.types.ts";
|
|
4
|
+
|
|
5
|
+
/** Every record full page: content and activity beside the 320 px property column. */
|
|
6
|
+
export function TemplateRecord({
|
|
7
|
+
header,
|
|
8
|
+
children,
|
|
9
|
+
properties,
|
|
10
|
+
related,
|
|
11
|
+
propertiesLabel,
|
|
12
|
+
}: TemplateRecordProps): ReactElement {
|
|
13
|
+
return (
|
|
14
|
+
<article data-template="record" className="flex flex-col gap-16 min-w-0">
|
|
15
|
+
{header}
|
|
16
|
+
<div className="grid grid-cols-[minmax(0,1fr)_var(--layout-property-column)] max-lg:grid-cols-[minmax(0,1fr)] gap-24">
|
|
17
|
+
<div className="flex flex-col gap-16 min-w-0">{children}</div>
|
|
18
|
+
<aside
|
|
19
|
+
aria-label={propertiesLabel}
|
|
20
|
+
className={cx(
|
|
21
|
+
"min-w-0 ps-20 border-s border-border-subtle",
|
|
22
|
+
"max-lg:ps-0 max-lg:border-s-0 max-lg:pt-16 max-lg:border-t",
|
|
23
|
+
)}
|
|
24
|
+
>
|
|
25
|
+
{properties}
|
|
26
|
+
</aside>
|
|
27
|
+
</div>
|
|
28
|
+
{related ? <section className="min-w-0">{related}</section> : null}
|
|
29
|
+
</article>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { type TemplateSettingsProps } from "./Templates.types.ts";
|
|
3
|
+
|
|
4
|
+
/** Org, personal and project settings: sections beside a centered form column. */
|
|
5
|
+
export function TemplateSettings({
|
|
6
|
+
sections,
|
|
7
|
+
children,
|
|
8
|
+
saveBar,
|
|
9
|
+
}: TemplateSettingsProps): ReactElement {
|
|
10
|
+
return (
|
|
11
|
+
<div
|
|
12
|
+
data-template="settings"
|
|
13
|
+
className="grid grid-cols-[var(--ui-settings-nav)_minmax(0,var(--layout-form))] max-md:grid-cols-[minmax(0,1fr)] gap-32 max-md:gap-16"
|
|
14
|
+
>
|
|
15
|
+
<div className="min-w-0">{sections}</div>
|
|
16
|
+
<div className="flex flex-col gap-16 min-w-0">
|
|
17
|
+
{children}
|
|
18
|
+
{saveBar ? (
|
|
19
|
+
<div className="sticky bottom-0 flex items-center justify-end gap-8 py-12 bg-bg-canvas border-t border-border-subtle">
|
|
20
|
+
{saveBar}
|
|
21
|
+
</div>
|
|
22
|
+
) : null}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { ResizablePanel } from "../Layout/Layout.tsx";
|
|
3
|
+
import { type TemplateSplitViewProps } from "./Templates.types.ts";
|
|
4
|
+
|
|
5
|
+
/** A resizable list beside the selected record: Inbox, Dispatch, Advancing, Import review. */
|
|
6
|
+
export function TemplateSplitView({
|
|
7
|
+
list,
|
|
8
|
+
detail,
|
|
9
|
+
listWidth = 300,
|
|
10
|
+
listLabel,
|
|
11
|
+
}: TemplateSplitViewProps): ReactElement {
|
|
12
|
+
return (
|
|
13
|
+
<div data-template="split-view" className="flex gap-16 min-w-0 max-lg:flex-col">
|
|
14
|
+
<div className="max-lg:[&>div]:w-full! max-lg:[&_[role=separator]]:hidden">
|
|
15
|
+
<ResizablePanel
|
|
16
|
+
initial={listWidth}
|
|
17
|
+
min={240}
|
|
18
|
+
max={480}
|
|
19
|
+
{...(listLabel ? { label: listLabel } : {})}
|
|
20
|
+
>
|
|
21
|
+
{list}
|
|
22
|
+
</ResizablePanel>
|
|
23
|
+
</div>
|
|
24
|
+
<div className="flex-1 min-w-0">{detail}</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { Button } from "../Button/Button.tsx";
|
|
3
|
+
import { SystemMessage } from "./TemplateSystemLink.tsx";
|
|
4
|
+
import { type TemplateSystemProps } from "./Templates.types.ts";
|
|
5
|
+
|
|
6
|
+
/** 404, 500, maintenance, offline and archived org: a centered message and one primary action. */
|
|
7
|
+
export function TemplateSystem({
|
|
8
|
+
actionLabel,
|
|
9
|
+
onAction,
|
|
10
|
+
...message
|
|
11
|
+
}: TemplateSystemProps): ReactElement {
|
|
12
|
+
return (
|
|
13
|
+
<SystemMessage {...message}>
|
|
14
|
+
<Button variant="primary" onClick={onAction}>
|
|
15
|
+
{actionLabel}
|
|
16
|
+
</Button>
|
|
17
|
+
</SystemMessage>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from "react";
|
|
2
|
+
import { Icon } from "../Icon/Icon.tsx";
|
|
3
|
+
import { buttonClass } from "../Button/button-class.ts";
|
|
4
|
+
import { type TemplateSystemLinkProps } from "./Templates.types.ts";
|
|
5
|
+
|
|
6
|
+
/** The System template's centered message, around whatever its one action is. */
|
|
7
|
+
export function SystemMessage({
|
|
8
|
+
icon,
|
|
9
|
+
title,
|
|
10
|
+
sentence,
|
|
11
|
+
reference,
|
|
12
|
+
children,
|
|
13
|
+
}: {
|
|
14
|
+
icon: string;
|
|
15
|
+
title: string;
|
|
16
|
+
sentence: string;
|
|
17
|
+
reference?: string | undefined;
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
}): ReactElement {
|
|
20
|
+
return (
|
|
21
|
+
<div
|
|
22
|
+
data-template="system"
|
|
23
|
+
className="flex flex-col items-center gap-12 py-48 px-16 text-center"
|
|
24
|
+
>
|
|
25
|
+
<span className="text-text-secondary">
|
|
26
|
+
<Icon name={icon} size={28} />
|
|
27
|
+
</span>
|
|
28
|
+
<h1 className="m-0 text-heading-20 font-semibold">{title}</h1>
|
|
29
|
+
<p className="m-0 max-w-(--layout-auth) text-text-secondary">{sentence}</p>
|
|
30
|
+
{children}
|
|
31
|
+
{reference ? (
|
|
32
|
+
<span className="font-mono text-text-12 text-text-secondary">{reference}</span>
|
|
33
|
+
) : null}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The System template whose action is a link styled as the primary Button. It uses no hooks or
|
|
40
|
+
* context, so a server component renders it whole: a not-found boundary built on it sends no
|
|
41
|
+
* JavaScript, where TemplateSystem's click handler needs a client module (ADR 0027).
|
|
42
|
+
*/
|
|
43
|
+
export function TemplateSystemLink({
|
|
44
|
+
href,
|
|
45
|
+
actionLabel,
|
|
46
|
+
...message
|
|
47
|
+
}: TemplateSystemLinkProps): ReactElement {
|
|
48
|
+
return (
|
|
49
|
+
<SystemMessage {...message}>
|
|
50
|
+
<a href={href} className={buttonClass("primary")}>
|
|
51
|
+
{actionLabel}
|
|
52
|
+
</a>
|
|
53
|
+
</SystemMessage>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { useT } from "../lib/context.tsx";
|
|
3
|
+
import { Button } from "../Button/Button.tsx";
|
|
4
|
+
import { Stepper } from "../Layout/Layout.tsx";
|
|
5
|
+
import { type TemplateWizardProps } from "./Templates.types.ts";
|
|
6
|
+
|
|
7
|
+
/** Multi-step creation: a stepper, one step per page, Back and Next. */
|
|
8
|
+
export function TemplateWizard({
|
|
9
|
+
steps,
|
|
10
|
+
current,
|
|
11
|
+
title,
|
|
12
|
+
children,
|
|
13
|
+
onBack,
|
|
14
|
+
onNext,
|
|
15
|
+
finishLabel,
|
|
16
|
+
nextDisabled = false,
|
|
17
|
+
}: TemplateWizardProps): ReactElement {
|
|
18
|
+
const t = useT();
|
|
19
|
+
const last = current >= steps.length - 1;
|
|
20
|
+
return (
|
|
21
|
+
<div
|
|
22
|
+
data-template="wizard"
|
|
23
|
+
className="flex flex-col gap-24 w-full max-w-(--layout-form) mx-auto"
|
|
24
|
+
>
|
|
25
|
+
<Stepper steps={steps} current={current} />
|
|
26
|
+
<section className="flex flex-col gap-16">
|
|
27
|
+
<h1 className="m-0 text-heading-20 font-semibold">{title}</h1>
|
|
28
|
+
<p className="m-0 text-text-secondary tabular-nums">
|
|
29
|
+
{t("count.step", { n: current + 1, total: steps.length })}
|
|
30
|
+
</p>
|
|
31
|
+
{children}
|
|
32
|
+
</section>
|
|
33
|
+
<div className="flex justify-between gap-8">
|
|
34
|
+
<Button variant="ghost" icon="ChevronLeft" disabled={current === 0} onClick={onBack}>
|
|
35
|
+
{t("nav.previous")}
|
|
36
|
+
</Button>
|
|
37
|
+
<Button variant="primary" disabled={nextDisabled} onClick={onNext}>
|
|
38
|
+
{last ? (finishLabel ?? t("action.done")) : t("nav.next")}
|
|
39
|
+
</Button>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
}
|