@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,21 @@
1
+ import { cx } from "../lib/cx.ts";
2
+ import type { TimelineCategory } from "./Charts.types.ts";
3
+
4
+ /**
5
+ * Categorical colour steps of day-type tags and row segments (viz-cat-1 to viz-cat-7, B4). A small module of its
6
+ * own so the Calendar, the Timeline and the day sheet share it without loading each other.
7
+ */
8
+ export const TL_CATEGORY: Readonly<Record<number, string>> = {
9
+ 1: cx("bg-viz-cat-1"),
10
+ 2: cx("bg-viz-cat-2"),
11
+ 3: cx("bg-viz-cat-3"),
12
+ 4: cx("bg-viz-cat-4"),
13
+ 5: cx("bg-viz-cat-5"),
14
+ 6: cx("bg-viz-cat-6"),
15
+ 7: cx("bg-viz-cat-7"),
16
+ };
17
+
18
+ /** A day's or a segment's categories as text, for the table alternative and announcements. */
19
+ export function categoryText(tags: readonly TimelineCategory[] | undefined): string {
20
+ return (tags ?? []).map((tag) => tag.label).join(", ");
21
+ }
@@ -0,0 +1,191 @@
1
+ import type { TimelineChange, TimelineLink, TimelineMove } from "../types/reference";
2
+
3
+ /** A bar's first and last day, by day index (the last day inclusive). */
4
+ interface Span {
5
+ readonly start: number;
6
+ readonly end: number;
7
+ /** A milestone: one instant on its day, so it starts and finishes at the same point. */
8
+ readonly point?: boolean;
9
+ }
10
+
11
+ /** The dependency preview of a pending change, worked out on the day grid. */
12
+ export interface TimelinePlan {
13
+ /** Rows other than the changed one that the change pushes, with their new days. */
14
+ readonly moves: readonly TimelineMove[];
15
+ /** Rows the change would move that are locked, the changed row first. */
16
+ readonly locked: readonly number[];
17
+ /** Rows on the critical path before and after the change. */
18
+ readonly criticalBefore: readonly number[];
19
+ readonly criticalAfter: readonly number[];
20
+ /** Days the last finish moves (negative for earlier). */
21
+ readonly finishShift: number;
22
+ }
23
+
24
+ const EPSILON = 1e-9;
25
+
26
+ /** Where a bar finishes on the day grid: the end of its last day, or a milestone's own day. */
27
+ function finishOf(s: Span): number {
28
+ return s.point ? s.start : s.end + 1;
29
+ }
30
+
31
+ /*
32
+ * Bars occupy half-open day ranges [start, end + 1), so a Finish to Start successor may start the
33
+ * day after its predecessor's last day. A milestone is one instant, as app.reschedule_record reads
34
+ * a one-date record, so it starts and finishes on its day. Each type compares one side of each
35
+ * bar: the predecessor's start or finish, plus lag, against the successor's start or finish.
36
+ */
37
+ function gap(link: TimelineLink, from: Span, to: Span): number {
38
+ const type = link.type ?? "Finish to Start";
39
+ const fromFinish = type === "Finish to Start" || type === "Finish to Finish";
40
+ const toStart = type === "Finish to Start" || type === "Start to Start";
41
+ const required = (fromFinish ? finishOf(from) : from.start) + (link.lagDays ?? 0);
42
+ const actual = toStart ? to.start : finishOf(to);
43
+ return required - actual;
44
+ }
45
+
46
+ /** True when a dependency path from the row comes back to a row already on it. */
47
+ function cyclic(links: readonly TimelineLink[], row: number): boolean {
48
+ const out = new Map<number, number[]>();
49
+ for (const l of links) out.set(l.from, [...(out.get(l.from) ?? []), l.to]);
50
+ const done = new Set<number>();
51
+ const path = new Set<number>();
52
+ const visit = (i: number): boolean => {
53
+ if (path.has(i)) return true;
54
+ if (done.has(i)) return false;
55
+ path.add(i);
56
+ const found = (out.get(i) ?? []).some(visit);
57
+ path.delete(i);
58
+ done.add(i);
59
+ return found;
60
+ };
61
+ return visit(row);
62
+ }
63
+
64
+ /**
65
+ * Pushes the successors of a changed row by the whole days their dependencies need, round by round
66
+ * through the chain, as app.reschedule_record does on the server (ADR 0111): a successor moves only
67
+ * by what the change adds to its dependency's gap, so a gap already broken stays as it was and
68
+ * moving a row earlier pulls nothing. Returns null for a cycle.
69
+ */
70
+ export function pushSuccessors(
71
+ spans: readonly Span[],
72
+ links: readonly TimelineLink[],
73
+ change: TimelineChange,
74
+ ): Span[] | null {
75
+ if (cyclic(links, change.row)) return null;
76
+ const now: Span[] = spans.map((s) => ({ ...s }));
77
+ now[change.row] = { ...spans[change.row], start: change.start, end: change.end };
78
+ const allowed = links.map((l) => {
79
+ const from = spans[l.from];
80
+ const to = spans[l.to];
81
+ return from && to ? Math.max(0, gap(l, from, to)) : 0;
82
+ });
83
+ const moved = (i: number) => now[i]?.start !== spans[i]?.start || now[i]?.end !== spans[i]?.end;
84
+ for (let round = 0; round <= spans.length; round += 1) {
85
+ const push = new Map<number, number>();
86
+ links.forEach((l, k) => {
87
+ const from = now[l.from];
88
+ const to = now[l.to];
89
+ if (!from || !to || l.to === change.row || !moved(l.from)) return;
90
+ const need = gap(l, from, to) - (allowed[k] ?? 0);
91
+ if (need > EPSILON) push.set(l.to, Math.max(push.get(l.to) ?? 0, Math.ceil(need - EPSILON)));
92
+ });
93
+ if (push.size === 0) return now;
94
+ for (const [i, days] of push) {
95
+ const s = now[i];
96
+ if (s) now[i] = { ...s, start: s.start + days, end: s.end + days };
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+
102
+ /**
103
+ * Rows with no float: those whose slip, followed through their successors' slack, moves the last
104
+ * finish. A row with no successor has the days between its finish and the last finish as float.
105
+ */
106
+ export function criticalRows(spans: readonly Span[], links: readonly TimelineLink[]): number[] {
107
+ if (spans.length === 0) return [];
108
+ const finish = Math.max(...spans.map(finishOf));
109
+ const out = new Map<number, TimelineLink[]>();
110
+ for (const l of links) out.set(l.from, [...(out.get(l.from) ?? []), l]);
111
+ const memo = new Map<number, number>();
112
+ const visiting = new Set<number>();
113
+ const float = (i: number): number => {
114
+ const known = memo.get(i);
115
+ if (known !== undefined) return known;
116
+ const s = spans[i];
117
+ if (!s || visiting.has(i)) return Number.POSITIVE_INFINITY;
118
+ visiting.add(i);
119
+ let value = finish - finishOf(s);
120
+ for (const l of out.get(i) ?? []) {
121
+ const to = spans[l.to];
122
+ if (to) value = Math.min(value, -gap(l, s, to) + float(l.to));
123
+ }
124
+ visiting.delete(i);
125
+ memo.set(i, value);
126
+ return value;
127
+ };
128
+ return spans.flatMap((_, i) => (float(i) <= EPSILON ? [i] : []));
129
+ }
130
+
131
+ /** The preview of one change: the rows it pushes, the locked rows it would move, and the critical path. */
132
+ export function planChange(
133
+ spans: readonly Span[],
134
+ links: readonly TimelineLink[],
135
+ change: TimelineChange,
136
+ isLocked: (row: number) => boolean,
137
+ ): TimelinePlan | null {
138
+ const after = pushSuccessors(spans, links, change);
139
+ if (!after) return null;
140
+ const moves: TimelineMove[] = [];
141
+ after.forEach((s, i) => {
142
+ const was = spans[i];
143
+ if (i !== change.row && was && (s.start !== was.start || s.end !== was.end)) {
144
+ moves.push({ row: i, start: s.start, end: s.end });
145
+ }
146
+ });
147
+ return withMoves(spans, links, change, moves, isLocked);
148
+ }
149
+
150
+ /** The preview of a change whose pushed rows are already known (the page's own preview). */
151
+ export function withMoves(
152
+ spans: readonly Span[],
153
+ links: readonly TimelineLink[],
154
+ change: TimelineChange,
155
+ moves: readonly TimelineMove[],
156
+ isLocked: (row: number) => boolean,
157
+ ): TimelinePlan {
158
+ const after = spans.map((s) => ({ ...s }));
159
+ after[change.row] = { ...spans[change.row], start: change.start, end: change.end };
160
+ for (const m of moves) after[m.row] = { ...spans[m.row], start: m.start, end: m.end };
161
+ const was = spans[change.row];
162
+ const targetMoved = !!was && (was.start !== change.start || was.end !== change.end);
163
+ const lastFinish = (list: readonly Span[]) => Math.max(...list.map(finishOf));
164
+ return {
165
+ moves,
166
+ locked: [
167
+ ...(targetMoved && isLocked(change.row) ? [change.row] : []),
168
+ ...moves.filter((m) => isLocked(m.row)).map((m) => m.row),
169
+ ],
170
+ criticalBefore: criticalRows(spans, links),
171
+ criticalAfter: criticalRows(after, links),
172
+ finishShift: spans.length > 0 ? lastFinish(after) - lastFinish(spans) : 0,
173
+ };
174
+ }
175
+
176
+ /** Same rows in both lists, in any order. */
177
+ export function sameRows(a: readonly number[], b: readonly number[]): boolean {
178
+ if (a.length !== b.length) return false;
179
+ const set = new Set(a);
180
+ return b.every((i) => set.has(i));
181
+ }
182
+
183
+ /** The same rows moved to the same days, in any order. */
184
+ export function sameMoves(a: readonly TimelineMove[], b: readonly TimelineMove[]): boolean {
185
+ if (a.length !== b.length) return false;
186
+ const at = new Map(a.map((m) => [m.row, m]));
187
+ return b.every((m) => {
188
+ const other = at.get(m.row);
189
+ return !!other && other.start === m.start && other.end === m.end;
190
+ });
191
+ }
@@ -0,0 +1,6 @@
1
+ # Checkbox
2
+
3
+ Checkbox toggles one independent option in a form or checklist row.
4
+
5
+ - Checklist items are rows, never array positions.
6
+ - 16 px box, `radius-chip`, accent fill when checked.
@@ -0,0 +1,3 @@
1
+ # ChecklistRunner
2
+
3
+ ChecklistRunner shows one inspection item per card with large Pass and Fail buttons; Fail asks for a photo and a note.
@@ -0,0 +1,27 @@
1
+ import type { ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { type BadgeProps } from "./Chips.types.ts";
4
+
5
+ const BADGE_TONE: Record<NonNullable<BadgeProps["tone"]>, string> = {
6
+ neutral: cx("bg-bg-hover text-text-secondary"),
7
+ accent: cx("bg-accent text-accent-text-on"),
8
+ danger: cx("bg-danger text-danger-text-on"),
9
+ };
10
+
11
+ /** A count pill; above 99 it reads 99+. `label` names the count for assistive technology. */
12
+ export function Badge({ count, tone = "neutral", label, className }: BadgeProps): ReactElement {
13
+ const text = count > 99 ? "99+" : String(count);
14
+ return (
15
+ <span
16
+ className={cx(
17
+ "inline-grid place-items-center min-w-(--ui-kbd) h-(--ui-kbd) px-6 rounded-pill",
18
+ "text-text-11 font-semibold tabular-nums",
19
+ BADGE_TONE[tone],
20
+ className,
21
+ )}
22
+ {...(label ? { role: "img", "aria-label": label } : {})}
23
+ >
24
+ {text}
25
+ </span>
26
+ );
27
+ }
@@ -0,0 +1,34 @@
1
+ import type { ReactNode } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { chipClass } from "./chipClass.tsx";
4
+
5
+ /* Pressed holds the hover fill: a brightness filter took small chip text under 4.5:1 (A24-004). */
6
+ export const buttonChipClass = cx("xos-hit cursor-pointer hover:bg-bg-hover active:bg-bg-hover");
7
+
8
+ export function Chip({
9
+ onClick,
10
+ title,
11
+ children,
12
+ }: {
13
+ onClick?: (() => void) | undefined;
14
+ title?: string;
15
+ children: ReactNode;
16
+ }) {
17
+ if (onClick) {
18
+ return (
19
+ <button
20
+ type="button"
21
+ className={cx(chipClass, buttonChipClass)}
22
+ onClick={onClick}
23
+ title={title}
24
+ >
25
+ {children}
26
+ </button>
27
+ );
28
+ }
29
+ return (
30
+ <span className={chipClass} title={title}>
31
+ {children}
32
+ </span>
33
+ );
34
+ }
@@ -0,0 +1,21 @@
1
+ export {
2
+ type StateChipProps,
3
+ type PhaseChipProps,
4
+ type DepartmentChipProps,
5
+ type URIDChipProps,
6
+ type RecordKindChipProps,
7
+ type PropertyChipProps,
8
+ type TagProps,
9
+ type TagSwatch,
10
+ type BadgeProps,
11
+ } from "./Chips.types.ts";
12
+ export { chipClass } from "./chipClass.tsx";
13
+ export { codeClass } from "./codeClass.tsx";
14
+ export { StateChip } from "./StateChip.tsx";
15
+ export { PhaseChip } from "./PhaseChip.tsx";
16
+ export { DepartmentChip } from "./DepartmentChip.tsx";
17
+ export { URIDChip } from "./URIDChip.tsx";
18
+ export { RecordKindChip } from "./RecordKindChip.tsx";
19
+ export { PropertyChip } from "./PropertyChip.tsx";
20
+ export { Tag } from "./Tag.tsx";
21
+ export { Badge } from "./Badge.tsx";
@@ -0,0 +1,35 @@
1
+ import type {
2
+ BadgeProps as ReferenceBadgeProps,
3
+ DepartmentChipProps as ReferenceDepartmentChipProps,
4
+ PhaseChipProps as ReferencePhaseChipProps,
5
+ PropertyChipProps as ReferencePropertyChipProps,
6
+ RecordKindChipProps as ReferenceRecordKindChipProps,
7
+ StateChipProps as ReferenceStateChipProps,
8
+ TagProps as ReferenceTagProps,
9
+ URIDChipProps as ReferenceURIDChipProps,
10
+ } from "../types/reference";
11
+
12
+ export type StateChipProps = ReferenceStateChipProps;
13
+
14
+ export type PhaseChipProps = ReferencePhaseChipProps;
15
+
16
+ export type DepartmentChipProps = ReferenceDepartmentChipProps;
17
+
18
+ export type URIDChipProps = ReferenceURIDChipProps;
19
+
20
+ export type RecordKindChipProps = ReferenceRecordKindChipProps;
21
+
22
+ export type PropertyChipProps = ReferencePropertyChipProps;
23
+
24
+ /** One of the seven themed categorical colors (color.viz.cat-1..7), as a Tag's dot (ADR 0142). */
25
+ export type TagSwatch = "cat-1" | "cat-2" | "cat-3" | "cat-4" | "cat-5" | "cat-6" | "cat-7";
26
+
27
+ export type TagProps = ReferenceTagProps & {
28
+ /**
29
+ * A categorical color for the dot instead of the tone's, for user-defined choices and segments. The label
30
+ * always shows beside it, so color is never the only signal.
31
+ */
32
+ swatch?: TagSwatch;
33
+ };
34
+
35
+ export type BadgeProps = ReferenceBadgeProps & { className?: string };
@@ -0,0 +1,16 @@
1
+ import type { ReactElement } from "react";
2
+ import { DepartmentGlyph } from "../Glyphs/Glyphs.tsx";
3
+ import { Chip } from "./Chips.shared.tsx";
4
+ import { type DepartmentChipProps } from "./Chips.types.ts";
5
+ import { codeClass } from "./codeClass.tsx";
6
+
7
+ /** Department name with its code in a mono chip. */
8
+ export function DepartmentChip({ name, code }: DepartmentChipProps): ReactElement {
9
+ return (
10
+ <Chip>
11
+ <DepartmentGlyph code={code} size={14} color="var(--color-text-secondary)" />
12
+ <span>{name}</span>
13
+ <span className={codeClass}>{code}</span>
14
+ </Chip>
15
+ );
16
+ }
@@ -0,0 +1,16 @@
1
+ import type { ReactElement } from "react";
2
+ import { useT } from "../lib/context.tsx";
3
+ import { PhaseGlyph } from "../Glyphs/Glyphs.tsx";
4
+ import { Chip } from "./Chips.shared.tsx";
5
+ import { type PhaseChipProps } from "./Chips.types.ts";
6
+
7
+ /** Gate number and phase name (`Gate 3 · Advance`); the code is never shown alone. */
8
+ export function PhaseChip({ gate, name, code }: PhaseChipProps): ReactElement {
9
+ const t = useT();
10
+ return (
11
+ <Chip title={code}>
12
+ <PhaseGlyph code={code} size={14} color="var(--color-text-secondary)" />
13
+ <span>{t("phase.gateName", { n: gate, name })}</span>
14
+ </Chip>
15
+ );
16
+ }
@@ -0,0 +1,15 @@
1
+ import type { ReactElement } from "react";
2
+ import { Icon } from "../Icon/Icon.tsx";
3
+ import { Chip } from "./Chips.shared.tsx";
4
+ import { type PropertyChipProps } from "./Chips.types.ts";
5
+
6
+ /** An inline property that edits in place when clickable. */
7
+ export function PropertyChip({ label, value, icon, onClick }: PropertyChipProps): ReactElement {
8
+ return (
9
+ <Chip onClick={onClick}>
10
+ {icon ? <Icon name={icon} size={14} color="var(--color-text-secondary)" /> : null}
11
+ {label ? <span className="text-text-secondary">{label}</span> : null}
12
+ <span>{value}</span>
13
+ </Chip>
14
+ );
15
+ }
@@ -0,0 +1,14 @@
1
+ import type { ReactElement } from "react";
2
+ import { RecordKindGlyph } from "../Glyphs/Glyphs.tsx";
3
+ import { Chip } from "./Chips.shared.tsx";
4
+ import { type RecordKindChipProps } from "./Chips.types.ts";
5
+
6
+ /** Record kind glyph and name. */
7
+ export function RecordKindChip({ kind, label }: RecordKindChipProps): ReactElement {
8
+ return (
9
+ <Chip>
10
+ <RecordKindGlyph kind={kind} size={14} color="var(--color-text-secondary)" />
11
+ <span>{label ?? kind}</span>
12
+ </Chip>
13
+ );
14
+ }
@@ -0,0 +1,19 @@
1
+ import type { ReactElement } from "react";
2
+ import { StateIcon } from "../StateIcon/StateIcon.tsx";
3
+ import { Chip } from "./Chips.shared.tsx";
4
+ import { type StateChipProps } from "./Chips.types.ts";
5
+
6
+ /** Record state as icon plus label; clickable chips open the state menu. `compact` keeps the label for assistive technology only. */
7
+ export function StateChip({
8
+ state,
9
+ label,
10
+ compact = false,
11
+ onClick,
12
+ }: StateChipProps): ReactElement {
13
+ return (
14
+ <Chip onClick={onClick}>
15
+ <StateIcon state={state} />
16
+ <span className={compact ? "sr-only" : undefined}>{label}</span>
17
+ </Chip>
18
+ );
19
+ }
@@ -0,0 +1,47 @@
1
+ import type { ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { type TagProps, type TagSwatch } from "./Chips.types.ts";
4
+
5
+ const TAG_DOT: Record<NonNullable<TagProps["tone"]>, string> = {
6
+ neutral: cx("bg-text-tertiary"),
7
+ accent: cx("bg-accent"),
8
+ success: cx("bg-success"),
9
+ warning: cx("bg-warning"),
10
+ danger: cx("bg-danger"),
11
+ };
12
+
13
+ const TAG_SWATCH: Record<TagSwatch, string> = {
14
+ "cat-1": cx("bg-viz-cat-1"),
15
+ "cat-2": cx("bg-viz-cat-2"),
16
+ "cat-3": cx("bg-viz-cat-3"),
17
+ "cat-4": cx("bg-viz-cat-4"),
18
+ "cat-5": cx("bg-viz-cat-5"),
19
+ "cat-6": cx("bg-viz-cat-6"),
20
+ "cat-7": cx("bg-viz-cat-7"),
21
+ };
22
+
23
+ /**
24
+ * A status word with a colored dot; the word carries the meaning. A swatch colors the dot with a themed
25
+ * categorical token (light, dark and sunlight) for a user-defined choice; in forced colors the dot takes the text
26
+ * color and the tag keeps its border.
27
+ */
28
+ export function Tag({ tone = "neutral", swatch, children }: TagProps): ReactElement {
29
+ return (
30
+ <span
31
+ className={cx(
32
+ "inline-flex items-center gap-4 h-(--ui-tag) px-6 rounded-chip bg-bg-hover text-text-secondary",
33
+ "text-text-12 font-medium whitespace-nowrap forced-colors:border",
34
+ )}
35
+ >
36
+ <span
37
+ aria-hidden="true"
38
+ data-swatch={swatch}
39
+ className={cx(
40
+ "size-(--ui-dot) rounded-full flex-none",
41
+ swatch ? cx(TAG_SWATCH[swatch], "forced-colors:bg-[CanvasText]") : TAG_DOT[tone],
42
+ )}
43
+ />
44
+ {children}
45
+ </span>
46
+ );
47
+ }
@@ -0,0 +1,14 @@
1
+ import type { ReactElement } from "react";
2
+ import { Chip } from "./Chips.shared.tsx";
3
+ import { type URIDChipProps } from "./Chips.types.ts";
4
+ import { codeClass } from "./codeClass.tsx";
5
+
6
+ /** Catalog element name with its URID in a mono chip. */
7
+ export function URIDChip({ name, urid }: URIDChipProps): ReactElement {
8
+ return (
9
+ <Chip>
10
+ <span>{name}</span>
11
+ <span className={codeClass}>{urid}</span>
12
+ </Chip>
13
+ );
14
+ }
@@ -0,0 +1,8 @@
1
+ import { cx } from "../lib/cx.ts";
2
+
3
+ /** The chip shape shared by every chip and property: 22 px, hairline border, surface ground. */
4
+ export const chipClass = cx(
5
+ "inline-flex items-center gap-4 h-(--ui-chip) px-6 rounded-chip border border-border-subtle",
6
+ "bg-bg-surface text-text-primary font-sans text-text-12 whitespace-nowrap",
7
+ "transition-colors duration-fast ease-standard forced-colors:border-[CanvasText]",
8
+ );
@@ -0,0 +1,6 @@
1
+ import { cx } from "../lib/cx.ts";
2
+
3
+ /** The mono code beside a plain name; codes never appear alone. */
4
+ export const codeClass = cx(
5
+ "font-mono text-text-11 text-text-secondary px-4 rounded-chip bg-bg-hover",
6
+ );
@@ -0,0 +1,6 @@
1
+ # ClockButton
2
+
3
+ ClockButton is the Compass Today screen's single primary control, changing with the person's state.
4
+
5
+ - States: `out` (Clock In), `on` (timer), `break`, `blocked` (outside geofence).
6
+ - Minimum 96 px tall, well above the 48 pt `touch-min`; haptic on press.
@@ -0,0 +1,7 @@
1
+ # CodeSample
2
+
3
+ CodeSample shows a short command or snippet with a copy button.
4
+
5
+ The block is keyboard focusable so it scrolls without a pointer, and Copy confirms through a polite live region. Keep samples to commands a reader can run as written; package names and endpoints come from the repository.
6
+
7
+ The consumer provides a label and the code.
@@ -0,0 +1,5 @@
1
+ # ColorPicker
2
+
3
+ ColorPicker checks contrast live and blocks any tenant color that fails WCAG 2.2 AA.
4
+
5
+ - `XOS.contrastRatio(a, b)` exposes the same calculation.
@@ -0,0 +1,7 @@
1
+ # Combobox
2
+
3
+ Combobox searches a long list as the person types; arrow keys move, Enter picks, Escape closes.
4
+
5
+ - Coded options show the plain name first and the code in mono, in numeric order.
6
+ - Options come from reference tables; the preview lists the ten department classes.
7
+ - No match shows one sentence telling the person what to try.