@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.
Files changed (487) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -2
  3. package/package.json +76 -4
  4. package/scripts/generate-stories.mjs +85 -0
  5. package/src/AIDisclosureBadge/README.md +7 -0
  6. package/src/AccessGridMatrix/README.md +3 -0
  7. package/src/Accordion/README.md +7 -0
  8. package/src/ActivityFeedItem/README.md +3 -0
  9. package/src/AgencySlate/README.md +3 -0
  10. package/src/AppShell/README.md +5 -0
  11. package/src/ApplicationForm/README.md +3 -0
  12. package/src/AssertionRankBadge/README.md +5 -0
  13. package/src/AvailabilityCalendar/README.md +3 -0
  14. package/src/Avatar/Avatar.tsx +56 -0
  15. package/src/Avatar/README.md +3 -0
  16. package/src/Avatar/avatar-class.ts +19 -0
  17. package/src/AvatarStack/README.md +3 -0
  18. package/src/Badge/README.md +3 -0
  19. package/src/Banner/README.md +3 -0
  20. package/src/BidSheet/README.md +3 -0
  21. package/src/Board/README.md +6 -0
  22. package/src/BrandMark/BrandMark.tsx +95 -0
  23. package/src/BrandMark/README.md +7 -0
  24. package/src/BrandSlot/README.md +6 -0
  25. package/src/Breadcrumbs/README.md +3 -0
  26. package/src/BudgetGrid/README.md +10 -0
  27. package/src/BulkActionBar/README.md +3 -0
  28. package/src/Button/Button.tsx +100 -0
  29. package/src/Button/README.md +10 -0
  30. package/src/Button/button-class.ts +54 -0
  31. package/src/ButtonLink/README.md +7 -0
  32. package/src/Calendar/README.md +3 -0
  33. package/src/Card/README.md +3 -0
  34. package/src/Chart/README.md +9 -0
  35. package/src/Charts/Calendar.tsx +228 -0
  36. package/src/Charts/Chart.tsx +547 -0
  37. package/src/Charts/Charts.tsx +20 -0
  38. package/src/Charts/Charts.types.ts +40 -0
  39. package/src/Charts/Gallery.tsx +25 -0
  40. package/src/Charts/Heatmap.tsx +116 -0
  41. package/src/Charts/OrgChart.tsx +53 -0
  42. package/src/Charts/ResourceSchedule.tsx +91 -0
  43. package/src/Charts/Sparkline.tsx +59 -0
  44. package/src/Charts/Timeline.tsx +777 -0
  45. package/src/Charts/categories.ts +21 -0
  46. package/src/Charts/timeline-plan.ts +191 -0
  47. package/src/Checkbox/README.md +6 -0
  48. package/src/ChecklistRunner/README.md +3 -0
  49. package/src/Chips/Badge.tsx +27 -0
  50. package/src/Chips/Chips.shared.tsx +34 -0
  51. package/src/Chips/Chips.tsx +21 -0
  52. package/src/Chips/Chips.types.ts +35 -0
  53. package/src/Chips/DepartmentChip.tsx +16 -0
  54. package/src/Chips/PhaseChip.tsx +16 -0
  55. package/src/Chips/PropertyChip.tsx +15 -0
  56. package/src/Chips/RecordKindChip.tsx +14 -0
  57. package/src/Chips/StateChip.tsx +19 -0
  58. package/src/Chips/Tag.tsx +47 -0
  59. package/src/Chips/URIDChip.tsx +14 -0
  60. package/src/Chips/chipClass.tsx +8 -0
  61. package/src/Chips/codeClass.tsx +6 -0
  62. package/src/ClockButton/README.md +6 -0
  63. package/src/CodeSample/README.md +7 -0
  64. package/src/ColorPicker/README.md +5 -0
  65. package/src/Combobox/README.md +7 -0
  66. package/src/CommandMenu/CommandMenu.tsx +179 -0
  67. package/src/CommandMenu/README.md +5 -0
  68. package/src/ComparisonTable/README.md +9 -0
  69. package/src/Compass/ChecklistRunner.tsx +128 -0
  70. package/src/Compass/ClockButton.tsx +57 -0
  71. package/src/Compass/Compass.shared.tsx +58 -0
  72. package/src/Compass/Compass.tsx +26 -0
  73. package/src/Compass/Compass.types.ts +79 -0
  74. package/src/Compass/DaySheetView.tsx +104 -0
  75. package/src/Compass/ForceUpdateScreen.tsx +29 -0
  76. package/src/Compass/LiveActivity.tsx +60 -0
  77. package/src/Compass/OfflineBanner.tsx +31 -0
  78. package/src/Compass/PhotoCapture.tsx +69 -0
  79. package/src/Compass/QuickIncidentSheet.tsx +46 -0
  80. package/src/Compass/ScanSheet.tsx +83 -0
  81. package/src/Compass/ShiftCard.tsx +55 -0
  82. package/src/Compass/SignaturePad.tsx +71 -0
  83. package/src/Compass/SyncConflictSheet.tsx +60 -0
  84. package/src/ConsentBanner/ConsentBanner.tsx +210 -0
  85. package/src/ConsentBanner/ConsentBannerStatic.tsx +163 -0
  86. package/src/ConsentBanner/ConsentSettings.tsx +213 -0
  87. package/src/ConsentBanner/README.md +101 -0
  88. package/src/ConsentBanner/consent.ts +238 -0
  89. package/src/ConsentBanner/index.ts +40 -0
  90. package/src/ConsentBanner/static.ts +11 -0
  91. package/src/ConsentBanner/useConsent.ts +160 -0
  92. package/src/ContextMenu/README.md +3 -0
  93. package/src/CoordinateMatrix/README.md +6 -0
  94. package/src/CredentialBadge/README.md +7 -0
  95. package/src/CurrencyInput/README.md +7 -0
  96. package/src/DataTable/DataTable.tsx +1034 -0
  97. package/src/DataTable/DataTableResizer.tsx +72 -0
  98. package/src/DataTable/DataTableVirtualizer.tsx +58 -0
  99. package/src/DataTable/README.md +9 -0
  100. package/src/DatePicker/README.md +5 -0
  101. package/src/DateRangePicker/README.md +3 -0
  102. package/src/DaySheetView/README.md +3 -0
  103. package/src/DepartmentChip/README.md +3 -0
  104. package/src/DepartmentGlyph/README.md +18 -0
  105. package/src/Dialog/README.md +3 -0
  106. package/src/DiffViewer/README.md +3 -0
  107. package/src/Divider/README.md +3 -0
  108. package/src/Drawer/README.md +3 -0
  109. package/src/DropdownMenu/README.md +3 -0
  110. package/src/EPKViewer/README.md +3 -0
  111. package/src/Editing/ColorPicker.tsx +125 -0
  112. package/src/Editing/DiffViewer.tsx +49 -0
  113. package/src/Editing/Editing.tsx +29 -0
  114. package/src/Editing/Editing.types.ts +71 -0
  115. package/src/Editing/FilterBuilder.tsx +72 -0
  116. package/src/Editing/QuickAdd.tsx +102 -0
  117. package/src/Editing/QuickAddChips.tsx +180 -0
  118. package/src/Editing/contrastRatio.tsx +11 -0
  119. package/src/Editing/parseQuickAdd.tsx +187 -0
  120. package/src/Editing/quickAddCore.ts +204 -0
  121. package/src/Editing/timeShorthand.ts +157 -0
  122. package/src/Editing/useQuickAdd.ts +201 -0
  123. package/src/EmergencyCodeCard/README.md +10 -0
  124. package/src/EmptyState/README.md +5 -0
  125. package/src/EngagementTimeline/README.md +3 -0
  126. package/src/ErrorState/README.md +3 -0
  127. package/src/FAQ/README.md +7 -0
  128. package/src/FeatureGrid/README.md +7 -0
  129. package/src/Feedback/Banner.tsx +40 -0
  130. package/src/Feedback/EmptyState.tsx +32 -0
  131. package/src/Feedback/ErrorState.tsx +32 -0
  132. package/src/Feedback/Feedback.shared.tsx +38 -0
  133. package/src/Feedback/Feedback.tsx +18 -0
  134. package/src/Feedback/Feedback.types.ts +40 -0
  135. package/src/Feedback/InlineAlert.tsx +19 -0
  136. package/src/Feedback/RefusalNotice.tsx +46 -0
  137. package/src/Feedback/RegionBoundary.tsx +102 -0
  138. package/src/Feedback/Toast.tsx +31 -0
  139. package/src/Feedback/ToastRegion.tsx +26 -0
  140. package/src/Feedback/UndoToast.tsx +97 -0
  141. package/src/FeedbackWidget/README.md +3 -0
  142. package/src/Field/Field.tsx +81 -0
  143. package/src/FileDrop/README.md +3 -0
  144. package/src/FilePreviewer/README.md +3 -0
  145. package/src/FilterBuilder/README.md +3 -0
  146. package/src/ForceUpdateScreen/README.md +3 -0
  147. package/src/Forms/Checkbox.tsx +14 -0
  148. package/src/Forms/CurrencyInput.tsx +40 -0
  149. package/src/Forms/Forms.shared.tsx +5 -0
  150. package/src/Forms/Forms.tsx +20 -0
  151. package/src/Forms/Forms.types.ts +33 -0
  152. package/src/Forms/Input.tsx +28 -0
  153. package/src/Forms/Money.tsx +15 -0
  154. package/src/Forms/NumberInput.tsx +85 -0
  155. package/src/Forms/Radio.tsx +31 -0
  156. package/src/Forms/Select.tsx +54 -0
  157. package/src/Forms/Switch.tsx +14 -0
  158. package/src/Forms/Textarea.tsx +30 -0
  159. package/src/Gallery/README.md +5 -0
  160. package/src/GateLifecycleRail/README.md +7 -0
  161. package/src/GateReadinessPanel/README.md +8 -0
  162. package/src/Gateway/AgencySlate.tsx +76 -0
  163. package/src/Gateway/ApplicationForm.tsx +48 -0
  164. package/src/Gateway/AvailabilityCalendar.tsx +82 -0
  165. package/src/Gateway/EPKViewer.tsx +77 -0
  166. package/src/Gateway/EngagementTimeline.tsx +43 -0
  167. package/src/Gateway/Gateway.shared.tsx +5 -0
  168. package/src/Gateway/Gateway.tsx +30 -0
  169. package/src/Gateway/Gateway.types.ts +69 -0
  170. package/src/Gateway/OnboardingPacket.tsx +61 -0
  171. package/src/Gateway/OpportunityCard.tsx +73 -0
  172. package/src/Gateway/OpportunityFilters.tsx +64 -0
  173. package/src/Gateway/PaymentTracker.tsx +71 -0
  174. package/src/Gateway/PayoutDetailsForm.tsx +62 -0
  175. package/src/Gateway/ProfileEditor.tsx +45 -0
  176. package/src/Gateway/ProgressBar.tsx +30 -0
  177. package/src/Gateway/RatingDialog.tsx +83 -0
  178. package/src/Gateway/UpNextCard.tsx +76 -0
  179. package/src/Glyphs/Glyphs.tsx +66 -0
  180. package/src/Grids/BidSheet.tsx +63 -0
  181. package/src/Grids/BudgetGrid.tsx +164 -0
  182. package/src/Grids/Grids.shared.tsx +5 -0
  183. package/src/Grids/Grids.tsx +11 -0
  184. package/src/Grids/Grids.types.ts +38 -0
  185. package/src/Grids/SpreadsheetGrid.tsx +445 -0
  186. package/src/Grids/columnTotal.tsx +14 -0
  187. package/src/Grids/glForCode.tsx +11 -0
  188. package/src/Grids/parseCell.tsx +16 -0
  189. package/src/Help/FeedbackWidget.tsx +89 -0
  190. package/src/Help/Help.tsx +14 -0
  191. package/src/Help/Help.types.ts +51 -0
  192. package/src/Help/HelpPanel.tsx +116 -0
  193. package/src/Help/NotificationCenter.tsx +100 -0
  194. package/src/Help/OnboardingChecklist.tsx +57 -0
  195. package/src/Help/ShortcutEditor.tsx +81 -0
  196. package/src/Help/WhatsNew.tsx +33 -0
  197. package/src/HelpPanel/README.md +5 -0
  198. package/src/HoverCard/README.md +3 -0
  199. package/src/Icon/Icon.tsx +47 -0
  200. package/src/Icon/README.md +9 -0
  201. package/src/IconButton/README.md +6 -0
  202. package/src/Identity/BrandSlot.tsx +20 -0
  203. package/src/Identity/BrandSlotFrame.tsx +38 -0
  204. package/src/Identity/CredentialBadge.tsx +92 -0
  205. package/src/Identity/Identity.tsx +14 -0
  206. package/src/Identity/Identity.types.ts +25 -0
  207. package/src/Identity/PresenceIndicator.tsx +37 -0
  208. package/src/Identity/QRCode.tsx +22 -0
  209. package/src/Identity/WhiteLabelPreview.tsx +33 -0
  210. package/src/Identity/qrPath.tsx +16 -0
  211. package/src/Identity/tokenVariable.tsx +9 -0
  212. package/src/InlineAlert/README.md +3 -0
  213. package/src/Input/README.md +8 -0
  214. package/src/Kbd/Kbd.tsx +30 -0
  215. package/src/Kbd/README.md +6 -0
  216. package/src/Layout/AppShell.tsx +151 -0
  217. package/src/Layout/Layout.tsx +14 -0
  218. package/src/Layout/Layout.types.ts +43 -0
  219. package/src/Layout/PageHeader.tsx +22 -0
  220. package/src/Layout/ResizablePanel.tsx +81 -0
  221. package/src/Layout/ScrollRegion.tsx +107 -0
  222. package/src/Layout/SplitView.tsx +78 -0
  223. package/src/Layout/Stepper.tsx +39 -0
  224. package/src/LegalText/LegalText.tsx +289 -0
  225. package/src/LegalText/README.md +10 -0
  226. package/src/LegalText/index.ts +29 -0
  227. package/src/LegalText/legal-markdown.ts +581 -0
  228. package/src/Link/Link.tsx +25 -0
  229. package/src/Link/README.md +5 -0
  230. package/src/Link/link-class.ts +10 -0
  231. package/src/LiveActivity/README.md +3 -0
  232. package/src/LogoSlotWall/README.md +7 -0
  233. package/src/MapView/README.md +5 -0
  234. package/src/Marketing/AIDisclosureBadge.tsx +31 -0
  235. package/src/Marketing/ButtonLink.tsx +32 -0
  236. package/src/Marketing/CodeSample.tsx +47 -0
  237. package/src/Marketing/ComparisonScroll.tsx +7 -0
  238. package/src/Marketing/ComparisonTable.tsx +104 -0
  239. package/src/Marketing/FAQ.tsx +26 -0
  240. package/src/Marketing/FeatureGrid.tsx +65 -0
  241. package/src/Marketing/GateLifecycleRail.tsx +52 -0
  242. package/src/Marketing/LogoSlotWall.tsx +53 -0
  243. package/src/Marketing/Marketing.tsx +49 -0
  244. package/src/Marketing/Marketing.types.ts +64 -0
  245. package/src/Marketing/MarketingFooter.tsx +88 -0
  246. package/src/Marketing/MarketingHero.tsx +45 -0
  247. package/src/Marketing/MarketingNav.tsx +76 -0
  248. package/src/Marketing/MarketingPoints.tsx +16 -0
  249. package/src/Marketing/MarketingSection.tsx +52 -0
  250. package/src/Marketing/PersonaSwitcher.tsx +137 -0
  251. package/src/Marketing/PriceDisplay.tsx +56 -0
  252. package/src/Marketing/PricingTable.tsx +122 -0
  253. package/src/Marketing/ProofStatStrip.tsx +35 -0
  254. package/src/Marketing/ScreenshotFrame.tsx +56 -0
  255. package/src/Marketing/SurfaceTriptych.tsx +43 -0
  256. package/src/Marketing/Testimonial.tsx +45 -0
  257. package/src/Marketing/marketing-copy.ts +25 -0
  258. package/src/Marketing/provided.tsx +36 -0
  259. package/src/MarketingFooter/README.md +7 -0
  260. package/src/MarketingHero/README.md +7 -0
  261. package/src/MarketingNav/README.md +7 -0
  262. package/src/MarketingSection/README.md +7 -0
  263. package/src/Media/FilePreviewer.tsx +86 -0
  264. package/src/Media/MapView.tsx +200 -0
  265. package/src/Media/Media.tsx +11 -0
  266. package/src/Media/Media.types.ts +47 -0
  267. package/src/Media/RichTextEditor.tsx +198 -0
  268. package/src/Media/toLngLat.tsx +13 -0
  269. package/src/Menus/ContextMenu.tsx +106 -0
  270. package/src/Menus/DropdownMenu.tsx +51 -0
  271. package/src/Menus/Menus.shared.tsx +67 -0
  272. package/src/Menus/Menus.tsx +13 -0
  273. package/src/Menus/Menus.types.ts +49 -0
  274. package/src/Menus/OrgSwitcher.tsx +69 -0
  275. package/src/Menus/compactTriggerClass.tsx +7 -0
  276. package/src/Menus/menuClass.tsx +4 -0
  277. package/src/Menus/menuItemClass.tsx +7 -0
  278. package/src/Menus/orgSwitcherTriggerClass.tsx +7 -0
  279. package/src/Money/README.md +6 -0
  280. package/src/MultiSelect/README.md +3 -0
  281. package/src/Navigation/Accordion.tsx +59 -0
  282. package/src/Navigation/Breadcrumbs.tsx +59 -0
  283. package/src/Navigation/MoreFields.tsx +42 -0
  284. package/src/Navigation/Navigation.shared.tsx +32 -0
  285. package/src/Navigation/Navigation.tsx +21 -0
  286. package/src/Navigation/Navigation.types.ts +63 -0
  287. package/src/Navigation/Pagination.tsx +30 -0
  288. package/src/Navigation/SegmentedControl.tsx +87 -0
  289. package/src/Navigation/Sidebar.tsx +106 -0
  290. package/src/Navigation/TabBar.tsx +61 -0
  291. package/src/Navigation/Tabs.tsx +79 -0
  292. package/src/Navigation/TopNav.tsx +86 -0
  293. package/src/Navigation/sidebar-classes.ts +18 -0
  294. package/src/NotificationCenter/README.md +3 -0
  295. package/src/NumberInput/README.md +3 -0
  296. package/src/OfflineBanner/README.md +3 -0
  297. package/src/OnboardingChecklist/README.md +3 -0
  298. package/src/OnboardingPacket/README.md +3 -0
  299. package/src/OpportunityCard/README.md +5 -0
  300. package/src/OpportunityFilters/README.md +3 -0
  301. package/src/OrgChart/README.md +5 -0
  302. package/src/OrgSwitcher/README.md +3 -0
  303. package/src/Overlays/Dialog.tsx +54 -0
  304. package/src/Overlays/Drawer.tsx +62 -0
  305. package/src/Overlays/HoverCard.tsx +59 -0
  306. package/src/Overlays/Overlays.shared.tsx +12 -0
  307. package/src/Overlays/Overlays.tsx +20 -0
  308. package/src/Overlays/Overlays.types.ts +66 -0
  309. package/src/Overlays/Popover.tsx +70 -0
  310. package/src/Overlays/PropertyList.tsx +19 -0
  311. package/src/Overlays/ShortcutSheet.tsx +62 -0
  312. package/src/Overlays/SidePeek.tsx +117 -0
  313. package/src/Overlays/Tooltip.tsx +73 -0
  314. package/src/Overlays/panelClass.tsx +6 -0
  315. package/src/Overlays/popoverPanelClass.tsx +6 -0
  316. package/src/PageHeader/README.md +3 -0
  317. package/src/Pagination/README.md +3 -0
  318. package/src/PaymentTracker/README.md +3 -0
  319. package/src/PayoutDetailsForm/README.md +3 -0
  320. package/src/PersonaSwitcher/README.md +7 -0
  321. package/src/PhaseChip/README.md +5 -0
  322. package/src/PhaseGlyph/README.md +17 -0
  323. package/src/PhotoCapture/README.md +3 -0
  324. package/src/Pickers/Combobox.tsx +91 -0
  325. package/src/Pickers/DatePicker.tsx +60 -0
  326. package/src/Pickers/DateRangePicker.tsx +78 -0
  327. package/src/Pickers/FileDrop.tsx +84 -0
  328. package/src/Pickers/MultiSelect.tsx +118 -0
  329. package/src/Pickers/Pickers.shared.tsx +337 -0
  330. package/src/Pickers/Pickers.tsx +17 -0
  331. package/src/Pickers/Pickers.types.ts +47 -0
  332. package/src/Pickers/Slider.tsx +59 -0
  333. package/src/Pickers/TimePicker.tsx +68 -0
  334. package/src/Pickers/rankOptions.tsx +12 -0
  335. package/src/Popover/README.md +3 -0
  336. package/src/PresenceIndicator/README.md +3 -0
  337. package/src/PriceDisplay/README.md +7 -0
  338. package/src/PricingTable/README.md +9 -0
  339. package/src/ProfileEditor/README.md +3 -0
  340. package/src/ProgressBar/README.md +3 -0
  341. package/src/ProofStatStrip/README.md +7 -0
  342. package/src/PropertyChip/README.md +3 -0
  343. package/src/ProvenanceBadge/README.md +3 -0
  344. package/src/QRCode/README.md +6 -0
  345. package/src/QuickAdd/README.md +5 -0
  346. package/src/QuickIncidentSheet/README.md +3 -0
  347. package/src/Radio/README.md +3 -0
  348. package/src/RadioChannelTable/README.md +7 -0
  349. package/src/RatingDialog/README.md +3 -0
  350. package/src/ReconciliationTable/README.md +3 -0
  351. package/src/RecordKindChip/README.md +3 -0
  352. package/src/RecordKindGlyph/README.md +34 -0
  353. package/src/RecordRow/README.md +7 -0
  354. package/src/RefusalNotice/README.md +5 -0
  355. package/src/ResizablePanel/README.md +3 -0
  356. package/src/ResourceSchedule/README.md +6 -0
  357. package/src/RichTextEditor/README.md +3 -0
  358. package/src/RichTextEditor/extensions.ts +217 -0
  359. package/src/RunOfShowLive/README.md +5 -0
  360. package/src/ScanSheet/README.md +3 -0
  361. package/src/ScreenshotFrame/README.md +7 -0
  362. package/src/ScrollRegion/README.md +9 -0
  363. package/src/SegmentedControl/README.md +5 -0
  364. package/src/Select/README.md +5 -0
  365. package/src/ShiftCard/README.md +3 -0
  366. package/src/ShortcutEditor/README.md +3 -0
  367. package/src/ShortcutSheet/README.md +3 -0
  368. package/src/SidePeek/README.md +6 -0
  369. package/src/Sidebar/README.md +5 -0
  370. package/src/SignaturePad/README.md +3 -0
  371. package/src/Skeleton/README.md +3 -0
  372. package/src/Slider/README.md +3 -0
  373. package/src/SplitView/README.md +3 -0
  374. package/src/SpreadsheetGrid/README.md +9 -0
  375. package/src/StalenessIndicator/README.md +3 -0
  376. package/src/StatTile/README.md +6 -0
  377. package/src/StateChip/README.md +6 -0
  378. package/src/StateIcon/README.md +6 -0
  379. package/src/StateIcon/StateIcon.tsx +127 -0
  380. package/src/StatusHeatmap/README.md +15 -0
  381. package/src/Stepper/README.md +3 -0
  382. package/src/Surface/Skeleton.tsx +21 -0
  383. package/src/Surface/Surface.tsx +63 -0
  384. package/src/SurfaceTriptych/README.md +7 -0
  385. package/src/Switch/README.md +5 -0
  386. package/src/SyncConflictSheet/README.md +3 -0
  387. package/src/TabBar/README.md +7 -0
  388. package/src/Tabs/README.md +6 -0
  389. package/src/Tag/README.md +3 -0
  390. package/src/TemplateAuth/README.md +6 -0
  391. package/src/TemplateCollection/README.md +6 -0
  392. package/src/TemplateDashboard/README.md +8 -0
  393. package/src/TemplateDocument/README.md +5 -0
  394. package/src/TemplateGatewayShell/README.md +5 -0
  395. package/src/TemplateGridEditor/README.md +3 -0
  396. package/src/TemplateRecord/README.md +3 -0
  397. package/src/TemplateSettings/README.md +5 -0
  398. package/src/TemplateSplitView/README.md +3 -0
  399. package/src/TemplateSystem/README.md +5 -0
  400. package/src/TemplateWizard/README.md +3 -0
  401. package/src/Templates/TemplateAuth.tsx +16 -0
  402. package/src/Templates/TemplateCollection.tsx +35 -0
  403. package/src/Templates/TemplateDashboard.tsx +200 -0
  404. package/src/Templates/TemplateDocument.tsx +24 -0
  405. package/src/Templates/TemplateGatewayShell.tsx +36 -0
  406. package/src/Templates/TemplateGridEditor.tsx +17 -0
  407. package/src/Templates/TemplateRecord.tsx +31 -0
  408. package/src/Templates/TemplateSettings.tsx +26 -0
  409. package/src/Templates/TemplateSplitView.tsx +27 -0
  410. package/src/Templates/TemplateSystem.tsx +19 -0
  411. package/src/Templates/TemplateSystemLink.tsx +55 -0
  412. package/src/Templates/TemplateWizard.tsx +43 -0
  413. package/src/Templates/Templates.tsx +29 -0
  414. package/src/Templates/Templates.types.ts +153 -0
  415. package/src/Testimonial/README.md +7 -0
  416. package/src/Textarea/README.md +3 -0
  417. package/src/TimePicker/README.md +5 -0
  418. package/src/Timeline/README.md +6 -0
  419. package/src/Toast/README.md +3 -0
  420. package/src/Tooltip/README.md +3 -0
  421. package/src/TopNav/README.md +5 -0
  422. package/src/TreeView/README.md +3 -0
  423. package/src/URIDChip/README.md +5 -0
  424. package/src/UndoToast/README.md +3 -0
  425. package/src/UpNextCard/README.md +6 -0
  426. package/src/Views/ActivityFeedItem.tsx +52 -0
  427. package/src/Views/Board.tsx +229 -0
  428. package/src/Views/BulkActionBar.tsx +76 -0
  429. package/src/Views/RecordList.tsx +146 -0
  430. package/src/Views/RecordRow.tsx +132 -0
  431. package/src/Views/StatTile.tsx +88 -0
  432. package/src/Views/TreeView.tsx +161 -0
  433. package/src/Views/Views.tsx +18 -0
  434. package/src/Views/Views.types.ts +99 -0
  435. package/src/WhatsNew/README.md +3 -0
  436. package/src/WhiteLabelPreview/README.md +8 -0
  437. package/src/XOS/AccessGridMatrix.tsx +111 -0
  438. package/src/XOS/AssertionRankBadge.tsx +27 -0
  439. package/src/XOS/CoordinateMatrix.tsx +123 -0
  440. package/src/XOS/EmergencyCodeCard.tsx +109 -0
  441. package/src/XOS/GateReadinessPanel.tsx +100 -0
  442. package/src/XOS/ProvenanceBadge.tsx +19 -0
  443. package/src/XOS/RadioChannelTable.tsx +50 -0
  444. package/src/XOS/ReconciliationTable.tsx +64 -0
  445. package/src/XOS/RunOfShowLive.tsx +97 -0
  446. package/src/XOS/StalenessIndicator.tsx +31 -0
  447. package/src/XOS/StatusHeatmap.tsx +200 -0
  448. package/src/XOS/XOS.shared.tsx +90 -0
  449. package/src/XOS/XOS.tsx +29 -0
  450. package/src/XOS/XOS.types.ts +99 -0
  451. package/src/XOS/resolveStep.tsx +16 -0
  452. package/src/brand/defaults/README.md +13 -0
  453. package/src/brand/defaults/app-icon.svg +6 -0
  454. package/src/brand/defaults/favicon.svg +6 -0
  455. package/src/brand/defaults/logo-dark.svg +6 -0
  456. package/src/brand/defaults/logo-light.svg +6 -0
  457. package/src/brand/defaults/splash.svg +6 -0
  458. package/src/index.ts +606 -0
  459. package/src/lib/context.tsx +156 -0
  460. package/src/lib/cx.ts +4 -0
  461. package/src/lib/format.ts +200 -0
  462. package/src/lib/hooks.ts +187 -0
  463. package/src/lib/i18n.ts +97 -0
  464. package/src/lib/icons.ts +45 -0
  465. package/src/lib/live.ts +92 -0
  466. package/src/lib/preferences.ts +242 -0
  467. package/src/lib/route-transition.tsx +22 -0
  468. package/src/lib/selection.ts +92 -0
  469. package/src/lib/shortcut-targets.ts +125 -0
  470. package/src/lib/theme.ts +50 -0
  471. package/src/lib/undo-stack.ts +125 -0
  472. package/src/marketing.ts +33 -0
  473. package/src/pwa/action-outcome.tsx +81 -0
  474. package/src/pwa/analytics.ts +236 -0
  475. package/src/pwa/browser-push.tsx +132 -0
  476. package/src/pwa/client.ts +126 -0
  477. package/src/pwa/index.ts +40 -0
  478. package/src/pwa/offline-key.ts +18 -0
  479. package/src/pwa/service-worker.ts +229 -0
  480. package/src/static.ts +10 -0
  481. package/src/styles/base.css +208 -0
  482. package/src/styles/components.css +453 -0
  483. package/src/styles/index.css +16 -0
  484. package/src/styles/marketing.css +1260 -0
  485. package/src/styles/reference.css +5792 -0
  486. package/src/types/reference.d.ts +1608 -0
  487. package/tailwind.config.cjs +3 -0
@@ -0,0 +1,97 @@
1
+ import { useEffect, useState, type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useT } from "../lib/context.tsx";
4
+ import { formatClock } from "../lib/format.ts";
5
+ import { Button } from "../Button/Button.tsx";
6
+ import { DepartmentGlyph } from "../Glyphs/Glyphs.tsx";
7
+ import { Tag } from "../Chips/Chips.tsx";
8
+ import { type RunOfShowLiveProps } from "./XOS.types.ts";
9
+
10
+ /** Steps through cues with a countdown; Space or Go advances. Show mode enlarges cues for arm's-length reading. */
11
+ export function RunOfShowLive({
12
+ cues,
13
+ current,
14
+ nextInSeconds,
15
+ showMode = false,
16
+ onGo,
17
+ }: RunOfShowLiveProps): ReactElement {
18
+ const t = useT();
19
+ const [live, setLive] = useState(current);
20
+ const [left, setLeft] = useState(nextInSeconds);
21
+ useEffect(() => {
22
+ const timer = setInterval(() => setLeft((v) => v - 1), 1000);
23
+ return () => clearInterval(timer);
24
+ }, []);
25
+ const go = () => {
26
+ const next = Math.min(live + 1, cues.length - 1);
27
+ setLive(next);
28
+ setLeft(cues[next]?.durationSeconds ?? 0);
29
+ onGo?.(next);
30
+ };
31
+ return (
32
+ <section
33
+ aria-label={t("ros.label")}
34
+ tabIndex={0}
35
+ onKeyDown={(e) => {
36
+ if (e.key === " " && e.target === e.currentTarget) {
37
+ e.preventDefault();
38
+ go();
39
+ }
40
+ }}
41
+ className="flex flex-col max-w-(--layout-peek) rounded-card border border-border-subtle bg-bg-canvas"
42
+ >
43
+ <header className="flex items-center justify-between px-16 py-12 border-b border-border-subtle">
44
+ <div className="flex flex-col">
45
+ <span className="text-text-secondary">{t("ros.nextIn")}</span>
46
+ <strong
47
+ className={cx(
48
+ "text-heading-32 font-semibold tabular-nums",
49
+ left <= 30 && "text-warning-text",
50
+ )}
51
+ >
52
+ {formatClock(left)}
53
+ </strong>
54
+ </div>
55
+ <Button variant="primary" shortcut={t("key.space")} onClick={go}>
56
+ {t("ros.go")}
57
+ </Button>
58
+ </header>
59
+ <ol className="m-0 py-4 list-none">
60
+ {cues.map((cue, i) => {
61
+ const state = i < live ? "done" : i === live ? "live" : "next";
62
+ return (
63
+ <li
64
+ key={cue.number}
65
+ aria-current={state === "live" ? "true" : undefined}
66
+ className={cx(
67
+ "grid grid-cols-[max-content_max-content_minmax(0,1fr)_auto_auto] items-center gap-x-12 gap-y-8 px-16 py-4",
68
+ showMode ? "min-h-(--ui-cmd-input) text-heading-20" : "min-h-(--space-40)",
69
+ state === "done" && "text-text-tertiary",
70
+ state === "live" &&
71
+ "bg-bg-hover font-semibold border-s-stroke-accent border-s-accent",
72
+ )}
73
+ >
74
+ <span className="font-mono text-text-12">{cue.number}</span>
75
+ <span className="tabular-nums text-text-secondary whitespace-nowrap">{cue.time}</span>
76
+ <span>{cue.title}</span>
77
+ {cue.dept ? (
78
+ <DepartmentGlyph code={cue.dept} size={14} color="var(--color-text-secondary)" />
79
+ ) : (
80
+ <span />
81
+ )}
82
+ {state === "live" ? (
83
+ <Tag tone="accent">{t("ros.live")}</Tag>
84
+ ) : cue.status === "standby" ? (
85
+ <Tag tone="warning">{t("ros.standby")}</Tag>
86
+ ) : cue.status === "skipped" ? (
87
+ <Tag>{t("ros.skipped")}</Tag>
88
+ ) : (
89
+ <span />
90
+ )}
91
+ </li>
92
+ );
93
+ })}
94
+ </ol>
95
+ </section>
96
+ );
97
+ }
@@ -0,0 +1,31 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useT } from "../lib/context.tsx";
4
+ import { Icon } from "../Icon/Icon.tsx";
5
+ import { chipClass } from "../Chips/Chips.tsx";
6
+ import { type StalenessIndicatorProps } from "./XOS.types.ts";
7
+
8
+ /** A price band's age: degraded one step at 12 months, Modeled at 24, Expired at 36. */
9
+ export function StalenessIndicator({ months, basis }: StalenessIndicatorProps): ReactElement {
10
+ const t = useT();
11
+ const [key, tone] =
12
+ months >= 36
13
+ ? ["stale.expired", cx("text-danger")]
14
+ : months >= 24
15
+ ? ["stale.modeled", cx("text-warning")]
16
+ : months >= 12
17
+ ? ["stale.degraded", cx("text-warning")]
18
+ : ["stale.current", cx("text-success")];
19
+ return (
20
+ <span
21
+ className={chipClass}
22
+ title={t("stale.title", { n: months, basis: basis ?? t("stale.basis") })}
23
+ >
24
+ <span className={tone}>
25
+ <Icon name="Clock" size={14} />
26
+ </span>
27
+ <span>{t(key)}</span>
28
+ <span className="text-text-secondary tabular-nums">{t("stale.months", { n: months })}</span>
29
+ </span>
30
+ );
31
+ }
@@ -0,0 +1,200 @@
1
+ import { type KeyboardEvent, type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useT } from "../lib/context.tsx";
4
+ import { ScrollRegion } from "../Layout/Layout.tsx";
5
+ import { StateIcon } from "../StateIcon/StateIcon.tsx";
6
+ import { useGridFocus } from "./XOS.shared.tsx";
7
+ import { type StatusHeatmapCell, type StatusHeatmapProps } from "./XOS.types.ts";
8
+
9
+ /**
10
+ * Rows crossed with columns, each cell one state: who has answered which section, how ready each person on a roster
11
+ * is, where each party's allocations stand (R11). An ARIA grid, like CoordinateMatrix: arrows move between cells,
12
+ * Home and End go to the row's ends (with Ctrl or Cmd, the grid's), and Enter or Space opens a cell. Every state shows
13
+ * its icon and its label, never color alone, with the cell's detail under them, and the table is its own accessible
14
+ * alternative. Rows can be selected for a bulk action. A row and column with no cell is not asked and reads so.
15
+ */
16
+ export function StatusHeatmap({
17
+ label,
18
+ corner,
19
+ rows,
20
+ cols,
21
+ cells,
22
+ legend,
23
+ selection,
24
+ onCellSelect,
25
+ }: StatusHeatmapProps): ReactElement {
26
+ const t = useT();
27
+ const grid = useGridFocus(rows.length, cols.length);
28
+ const byState = new Map(legend.map((l) => [l.state, l]));
29
+ const selected = new Set(selection?.selected ?? []);
30
+
31
+ const open = (
32
+ e: KeyboardEvent<HTMLElement> | null,
33
+ rowId: string,
34
+ colId: string,
35
+ cell: StatusHeatmapCell | undefined,
36
+ target: HTMLElement,
37
+ ) => {
38
+ if (!cell || cell.readOnly) return;
39
+ if (onCellSelect) {
40
+ e?.preventDefault();
41
+ onCellSelect(rowId, colId, cell);
42
+ } else if (cell.href && e) {
43
+ e.preventDefault();
44
+ target.querySelector("a")?.click();
45
+ }
46
+ };
47
+
48
+ const toggle = (id: string) => {
49
+ if (!selection) return;
50
+ const next = new Set(selected);
51
+ if (next.has(id)) next.delete(id);
52
+ else next.add(id);
53
+ selection.onChange(rows.map((r) => r.id).filter((r) => next.has(r)));
54
+ };
55
+
56
+ return (
57
+ <div className="flex flex-col gap-8">
58
+ <ScrollRegion label={label}>
59
+ <table
60
+ role="grid"
61
+ aria-label={label}
62
+ aria-rowcount={rows.length + 1}
63
+ className="border-separate border-spacing-2 text-text-12"
64
+ >
65
+ <caption className="pb-8 text-start text-text-13 font-semibold">{label}</caption>
66
+ <thead>
67
+ <tr>
68
+ {selection ? <td aria-hidden="true" className="p-4" /> : null}
69
+ <th scope="col" className="p-4 text-start font-medium text-text-secondary">
70
+ {corner}
71
+ </th>
72
+ {cols.map((c) => (
73
+ <th
74
+ key={c.id}
75
+ scope="col"
76
+ className="p-4 text-start align-bottom font-medium text-text-secondary"
77
+ >
78
+ {c.label}
79
+ </th>
80
+ ))}
81
+ </tr>
82
+ </thead>
83
+ <tbody>
84
+ {rows.map((r, ri) => (
85
+ <tr key={r.id} aria-selected={selection ? selected.has(r.id) : undefined}>
86
+ {selection ? (
87
+ <td className="p-4 align-middle">
88
+ <input
89
+ type="checkbox"
90
+ className="xos-check-input"
91
+ checked={selected.has(r.id)}
92
+ aria-label={t("heatmap.select", { row: r.label })}
93
+ onChange={() => toggle(r.id)}
94
+ />
95
+ </td>
96
+ ) : null}
97
+ <th scope="row" className="pe-12 text-start font-medium">
98
+ <span className="flex flex-col">
99
+ <span className="whitespace-nowrap">{r.label}</span>
100
+ {r.sublabel ? (
101
+ <span className="text-text-12 font-regular text-text-secondary">
102
+ {r.sublabel}
103
+ </span>
104
+ ) : null}
105
+ </span>
106
+ </th>
107
+ {cols.map((c, ci) => {
108
+ const cell = cells[`${r.id}:${c.id}`];
109
+ const item = cell ? byState.get(cell.state) : undefined;
110
+ const stateLabel = item?.label ?? cell?.state ?? "";
111
+ const name = !cell
112
+ ? t("heatmap.none", { row: r.label, col: c.label })
113
+ : cell.detail
114
+ ? t("heatmap.detail", {
115
+ row: r.label,
116
+ col: c.label,
117
+ state: stateLabel,
118
+ detail: cell.detail,
119
+ })
120
+ : t("heatmap.stateCell", { row: r.label, col: c.label, state: stateLabel });
121
+ const actionable = Boolean(cell && !cell.readOnly && (onCellSelect || cell.href));
122
+ const body = cell ? (
123
+ <span className="inline-flex flex-col gap-2 whitespace-nowrap">
124
+ <span className="inline-flex items-center gap-4">
125
+ {item ? <StateIcon state={item.icon} /> : null}
126
+ <span>{stateLabel}</span>
127
+ </span>
128
+ {cell.detail ? (
129
+ <span className="text-text-secondary">{cell.detail}</span>
130
+ ) : null}
131
+ </span>
132
+ ) : (
133
+ <span className="text-text-secondary">{t("heatmap.noneMark")}</span>
134
+ );
135
+ return (
136
+ <td
137
+ key={c.id}
138
+ ref={grid.register(ri, ci)}
139
+ role="gridcell"
140
+ tabIndex={grid.tabIndex(ri, ci)}
141
+ aria-label={name}
142
+ data-state={cell?.state}
143
+ onFocus={() => grid.setActive([ri, ci])}
144
+ onKeyDown={(e) => {
145
+ if (e.key === "Enter" || e.key === " ") {
146
+ open(e, r.id, c.id, cell, e.currentTarget);
147
+ } else grid.onKeyDown(e, ri, ci);
148
+ }}
149
+ onClick={(e) => {
150
+ if (cell && !cell.readOnly && onCellSelect) {
151
+ e.preventDefault();
152
+ onCellSelect(r.id, c.id, cell);
153
+ }
154
+ }}
155
+ className={cx(
156
+ "xos-hit h-control-md rounded-chip px-8 py-4 text-start",
157
+ cell
158
+ ? "bg-bg-raised ring-(length:--stroke-width-hairline) ring-inset ring-border-subtle"
159
+ : "ring-(length:--stroke-width-hairline) ring-inset ring-border-subtle",
160
+ actionable &&
161
+ "cursor-pointer hover:outline-solid hover:outline-stroke-focus hover:outline-text-primary",
162
+ "focus-visible:outline-solid focus-visible:outline-stroke-focus focus-visible:outline-focus-ring",
163
+ "forced-colors:border",
164
+ )}
165
+ >
166
+ {cell?.href && !onCellSelect ? (
167
+ <a
168
+ href={cell.href}
169
+ tabIndex={-1}
170
+ className="text-text-primary no-underline"
171
+ >
172
+ {body}
173
+ </a>
174
+ ) : (
175
+ body
176
+ )}
177
+ </td>
178
+ );
179
+ })}
180
+ </tr>
181
+ ))}
182
+ </tbody>
183
+ </table>
184
+ </ScrollRegion>
185
+ {legend.length > 0 ? (
186
+ <ul
187
+ aria-label={t("heatmap.legend")}
188
+ className="m-0 flex list-none flex-wrap gap-12 p-0 text-text-12 text-text-secondary"
189
+ >
190
+ {legend.map((l) => (
191
+ <li key={l.state} className="inline-flex items-center gap-4">
192
+ <StateIcon state={l.icon} />
193
+ <span>{l.label}</span>
194
+ </li>
195
+ ))}
196
+ </ul>
197
+ ) : null}
198
+ </div>
199
+ );
200
+ }
@@ -0,0 +1,90 @@
1
+ import { useRef, useState, type KeyboardEvent } from "react";
2
+ import { Direction } from "radix-ui";
3
+ import type { EmergencyAuthority } from "../types/reference";
4
+ import { cx } from "../lib/cx.ts";
5
+ import { type Translate } from "../lib/context.tsx";
6
+ import { Icon } from "../Icon/Icon.tsx";
7
+ import { type Result } from "./XOS.types.ts";
8
+
9
+ export const RESULT: Record<Result, { icon: string; className: string; key: string }> = {
10
+ met: { icon: "CircleCheck", className: cx("text-success"), key: "result.met" },
11
+ gap: { icon: "CircleX", className: cx("text-danger"), key: "result.gap" },
12
+ unknown: { icon: "CircleHelp", className: cx("text-warning"), key: "result.unknown" },
13
+ };
14
+
15
+ export function ResultIcon({
16
+ result,
17
+ t,
18
+ labeled = true,
19
+ }: {
20
+ result: Result;
21
+ t: Translate;
22
+ labeled?: boolean;
23
+ }) {
24
+ const r = RESULT[result];
25
+ return (
26
+ <span className={r.className}>
27
+ <Icon name={r.icon} size={14} {...(labeled ? { label: t(r.key) } : {})} />
28
+ </span>
29
+ );
30
+ }
31
+
32
+ export const tableClass = cx("w-full border-collapse text-text-13");
33
+
34
+ export const thClass = cx(
35
+ "h-control-lg px-12 text-start font-medium text-text-12 text-text-secondary bg-bg-surface border-b border-border-subtle",
36
+ );
37
+
38
+ export const tdClass = cx("h-row-default px-12 border-b border-border-subtle whitespace-nowrap");
39
+
40
+ export const SERVICES: EmergencyAuthority["service"][] = [
41
+ "fire",
42
+ "ems",
43
+ "lawEnforcement",
44
+ "bombSquad",
45
+ "federal",
46
+ ];
47
+
48
+ /** Roving focus over the cells of an ARIA grid: arrows move, Home and End jump within a row, Ctrl with them jumps to the corners. */
49
+ export function useGridFocus(rows: number, cols: number) {
50
+ const dir = Direction.useDirection();
51
+ const [active, setActive] = useState<[number, number]>([0, 0]);
52
+ const refs = useRef(new Map<string, HTMLElement>());
53
+ const register = (r: number, c: number) => (el: HTMLElement | null) => {
54
+ if (el) refs.current.set(`${r}:${c}`, el);
55
+ else refs.current.delete(`${r}:${c}`);
56
+ };
57
+ const onKeyDown = (e: KeyboardEvent<HTMLElement>, r: number, c: number) => {
58
+ const forward = dir === "rtl" ? "ArrowLeft" : "ArrowRight";
59
+ const back = dir === "rtl" ? "ArrowRight" : "ArrowLeft";
60
+ const ctrl = e.ctrlKey || e.metaKey;
61
+ const target: [number, number] | null =
62
+ e.key === "ArrowDown"
63
+ ? [r + 1, c]
64
+ : e.key === "ArrowUp"
65
+ ? [r - 1, c]
66
+ : e.key === forward
67
+ ? [r, c + 1]
68
+ : e.key === back
69
+ ? [r, c - 1]
70
+ : e.key === "Home"
71
+ ? ctrl
72
+ ? [0, 0]
73
+ : [r, 0]
74
+ : e.key === "End"
75
+ ? ctrl
76
+ ? [rows - 1, cols - 1]
77
+ : [r, cols - 1]
78
+ : null;
79
+ if (!target) return;
80
+ e.preventDefault();
81
+ const next: [number, number] = [
82
+ Math.max(0, Math.min(rows - 1, target[0])),
83
+ Math.max(0, Math.min(cols - 1, target[1])),
84
+ ];
85
+ setActive(next);
86
+ refs.current.get(`${next[0]}:${next[1]}`)?.focus();
87
+ };
88
+ const tabIndex = (r: number, c: number) => (active[0] === r && active[1] === c ? 0 : -1);
89
+ return { register, onKeyDown, tabIndex, setActive };
90
+ }
@@ -0,0 +1,29 @@
1
+ export {
2
+ type GateReadinessPanelProps,
3
+ type ProvenanceBadgeProps,
4
+ type AssertionRankBadgeProps,
5
+ type StalenessIndicatorProps,
6
+ type ReconciliationTableProps,
7
+ type EmergencyCodeCardProps,
8
+ type RadioChannelTableProps,
9
+ type RunOfShowLiveProps,
10
+ type CoordinateMatrixProps,
11
+ type AccessGridMatrixProps,
12
+ type StatusHeatmapProps,
13
+ type StatusHeatmapRow,
14
+ type StatusHeatmapCol,
15
+ type StatusHeatmapCell,
16
+ type StatusHeatmapLegendItem,
17
+ } from "./XOS.types.ts";
18
+ export { GateReadinessPanel } from "./GateReadinessPanel.tsx";
19
+ export { ProvenanceBadge } from "./ProvenanceBadge.tsx";
20
+ export { AssertionRankBadge } from "./AssertionRankBadge.tsx";
21
+ export { StalenessIndicator } from "./StalenessIndicator.tsx";
22
+ export { ReconciliationTable } from "./ReconciliationTable.tsx";
23
+ export { resolveStep } from "./resolveStep.tsx";
24
+ export { EmergencyCodeCard } from "./EmergencyCodeCard.tsx";
25
+ export { RadioChannelTable } from "./RadioChannelTable.tsx";
26
+ export { RunOfShowLive } from "./RunOfShowLive.tsx";
27
+ export { CoordinateMatrix } from "./CoordinateMatrix.tsx";
28
+ export { AccessGridMatrix } from "./AccessGridMatrix.tsx";
29
+ export { StatusHeatmap } from "./StatusHeatmap.tsx";
@@ -0,0 +1,99 @@
1
+ import type {
2
+ AccessGridMatrixProps as ReferenceAccessGridMatrixProps,
3
+ AssertionRankBadgeProps as ReferenceAssertionRankBadgeProps,
4
+ CoordinateMatrixProps as ReferenceCoordinateMatrixProps,
5
+ EmergencyCodeCardProps as ReferenceEmergencyCodeCardProps,
6
+ GateReadinessPanelProps as ReferenceGateReadinessPanelProps,
7
+ ProvenanceBadgeProps as ReferenceProvenanceBadgeProps,
8
+ RadioChannelTableProps as ReferenceRadioChannelTableProps,
9
+ ReconciliationTableProps as ReferenceReconciliationTableProps,
10
+ RunOfShowLiveProps as ReferenceRunOfShowLiveProps,
11
+ StalenessIndicatorProps as ReferenceStalenessIndicatorProps,
12
+ RecordState,
13
+ } from "../types/reference";
14
+
15
+ export type GateReadinessPanelProps = ReferenceGateReadinessPanelProps & {
16
+ onAdvance?: () => void;
17
+ onCriterionAction?: (code: string | undefined, label: string) => void;
18
+ };
19
+
20
+ export type ProvenanceBadgeProps = ReferenceProvenanceBadgeProps;
21
+
22
+ export type AssertionRankBadgeProps = ReferenceAssertionRankBadgeProps;
23
+
24
+ export type StalenessIndicatorProps = ReferenceStalenessIndicatorProps;
25
+
26
+ export type ReconciliationTableProps = ReferenceReconciliationTableProps;
27
+
28
+ export type EmergencyCodeCardProps = ReferenceEmergencyCodeCardProps;
29
+
30
+ export type RadioChannelTableProps = ReferenceRadioChannelTableProps;
31
+
32
+ export type RunOfShowLiveProps = Omit<ReferenceRunOfShowLiveProps, "cues"> & {
33
+ /**
34
+ * The reference cues, each with an optional status the index alone cannot show (ADR 0131): a cue the caller
35
+ * jumped past is `skipped`, the cue they put on standby is `standby`.
36
+ */
37
+ cues: (ReferenceRunOfShowLiveProps["cues"][number] & { status?: "skipped" | "standby" })[];
38
+ /** Called with the new live cue index when Go advances. */
39
+ onGo?: (index: number) => void;
40
+ };
41
+
42
+ export type CoordinateMatrixProps = ReferenceCoordinateMatrixProps & {
43
+ onCellSelect?: (department: string, phase: string) => void;
44
+ };
45
+
46
+ export type AccessGridMatrixProps = ReferenceAccessGridMatrixProps & {
47
+ onChange?: (grants: string[]) => void;
48
+ };
49
+
50
+ export type Result = "met" | "gap" | "unknown";
51
+
52
+ /** One row of a StatusHeatmap: a recipient, a person or a party. */
53
+ export interface StatusHeatmapRow {
54
+ readonly id: string;
55
+ readonly label: string;
56
+ readonly sublabel?: string;
57
+ }
58
+
59
+ /** One column of a StatusHeatmap: a section, a category or an offering. */
60
+ export interface StatusHeatmapCol {
61
+ readonly id: string;
62
+ readonly label: string;
63
+ }
64
+
65
+ /** A state the heatmap can show: the key cells name, the icon that carries it and its label. */
66
+ export interface StatusHeatmapLegendItem {
67
+ readonly state: string;
68
+ readonly icon: RecordState;
69
+ readonly label: string;
70
+ }
71
+
72
+ /** One cell, keyed `<row id>:<col id>` in `cells`. A row and column with no cell is not asked. */
73
+ export interface StatusHeatmapCell {
74
+ /** A `state` of the legend. */
75
+ readonly state: string;
76
+ /** Where Enter or a click goes. */
77
+ readonly href?: string;
78
+ /** More about the cell, shown under its state and read after it (a count, a date, who signed). */
79
+ readonly detail?: string;
80
+ /** The cell only says where something stands: Enter, Space and a click do nothing, and it looks that way. */
81
+ readonly readOnly?: boolean;
82
+ }
83
+
84
+ export interface StatusHeatmapProps {
85
+ readonly label: string;
86
+ /** The header of the row column. */
87
+ readonly corner: string;
88
+ readonly rows: readonly StatusHeatmapRow[];
89
+ readonly cols: readonly StatusHeatmapCol[];
90
+ readonly cells: Readonly<Record<string, StatusHeatmapCell>>;
91
+ readonly legend: readonly StatusHeatmapLegendItem[];
92
+ /** Rows that can be selected, for a bulk action: the ids selected and a change handler. */
93
+ readonly selection?: {
94
+ readonly selected: readonly string[];
95
+ readonly onChange: (selected: string[]) => void;
96
+ };
97
+ /** Called on Enter, Space or a click on a cell; without it, a cell with an href follows its link. */
98
+ readonly onCellSelect?: (rowId: string, colId: string, cell: StatusHeatmapCell) => void;
99
+ }
@@ -0,0 +1,16 @@
1
+ import type { EmergencyAuthority } from "../types/reference";
2
+ import { type Translate } from "../lib/context.tsx";
3
+ import { SERVICES } from "./XOS.shared.tsx";
4
+
5
+ /** Resolves `{service}` tokens in a protocol step from the jurisdiction's agencies, or the generic service name. */
6
+ export function resolveStep(
7
+ step: string,
8
+ authorities: EmergencyAuthority[] | undefined,
9
+ t: Translate,
10
+ ): string {
11
+ return step.replace(/\{(\w+)\}/g, (match, key: string) => {
12
+ if (!(SERVICES as string[]).includes(key)) return match;
13
+ const agency = authorities?.find((a) => a.service === key);
14
+ return agency ? agency.agency : t(`ecode.service.${key}`);
15
+ });
16
+ }
@@ -0,0 +1,13 @@
1
+ # Brand
2
+
3
+ White-label slots. Each file marks where a tenant's brand file goes and at what size; the platform brand marks are not set yet.
4
+
5
+ | Slot | File | Delivery size | Formats | Plan |
6
+ | ------------- | -------------- | --------------- | ---------------------- | ------------------------ |
7
+ | Logo, Light | logo-light.svg | 160 x 40 | SVG or transparent PNG | All |
8
+ | Logo, Dark | logo-dark.svg | 160 x 40 | SVG or transparent PNG | All |
9
+ | Favicon | favicon.svg | 32 x 32 minimum | SVG or PNG | All |
10
+ | App Icon | app-icon.svg | 1024 x 1024 | PNG, no transparency | Enterprise branded build |
11
+ | Splash Screen | splash.svg | 1290 x 2796 | PNG | Enterprise branded build |
12
+
13
+ Until a tenant uploads a logo, BrandMark renders a monogram tile in `accent-default` with the name in Inter. Replace these files with real marks; nothing else changes.
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="App Icon slot, 1024 x 1024">
2
+ <rect width="512" height="512" fill="#F7F7F8"></rect>
3
+ <rect x="6" y="6" width="500" height="500" rx="12" fill="none" stroke="#D1D2D6" stroke-width="3" stroke-dasharray="12 10"></rect>
4
+ <text x="256.0" y="245.8" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="51" font-weight="600" fill="#6B6E76">App Icon</text>
5
+ <text x="256.0" y="312.1" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="40" fill="#6B6E76">1024 x 1024</text>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256" role="img" aria-label="Favicon slot, 32 x 32">
2
+ <rect width="256" height="256" fill="#FFFFFF"></rect>
3
+ <rect x="6" y="6" width="244" height="244" rx="12" fill="none" stroke="#D1D2D6" stroke-width="3" stroke-dasharray="12 10"></rect>
4
+ <text x="128.0" y="123.0" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="25" font-weight="600" fill="#6B6E76">Favicon</text>
5
+ <text x="128.0" y="155.5" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="20" fill="#6B6E76">32 x 32</text>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="640" height="160" viewBox="0 0 640 160" role="img" aria-label="Tenant Logo, Dark slot, 160 x 40">
2
+ <rect width="640" height="160" fill="#0E0F11"></rect>
3
+ <rect x="6" y="6" width="628" height="148" rx="12" fill="none" stroke="#34353B" stroke-width="3" stroke-dasharray="12 10"></rect>
4
+ <text x="320.0" y="76.8" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="16" font-weight="600" fill="#A0A3AB">Tenant Logo, Dark</text>
5
+ <text x="320.0" y="97.6" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="12" fill="#A0A3AB">160 x 40</text>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="640" height="160" viewBox="0 0 640 160" role="img" aria-label="Tenant Logo, Light slot, 160 x 40">
2
+ <rect width="640" height="160" fill="#FFFFFF"></rect>
3
+ <rect x="6" y="6" width="628" height="148" rx="12" fill="none" stroke="#D1D2D6" stroke-width="3" stroke-dasharray="12 10"></rect>
4
+ <text x="320.0" y="76.8" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="16" font-weight="600" fill="#6B6E76">Tenant Logo, Light</text>
5
+ <text x="320.0" y="97.6" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="12" fill="#6B6E76">160 x 40</text>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="390" height="844" viewBox="0 0 390 844" role="img" aria-label="Splash Screen slot, 1290 x 2796">
2
+ <rect width="390" height="844" fill="#0E0F11"></rect>
3
+ <rect x="6" y="6" width="378" height="832" rx="12" fill="none" stroke="#34353B" stroke-width="3" stroke-dasharray="12 10"></rect>
4
+ <text x="195.0" y="414.2" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="39" font-weight="600" fill="#A0A3AB">Splash Screen</text>
5
+ <text x="195.0" y="464.9" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="31" fill="#A0A3AB">1290 x 2796</text>
6
+ </svg>