@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,337 @@
1
+ import { useEffect, useMemo, useRef, useState, type KeyboardEvent } from "react";
2
+ import { Direction, Popover as RPopover } from "radix-ui";
3
+ import type { Option } from "../types/reference";
4
+ import { cx } from "../lib/cx.ts";
5
+ import { useLocale, usePreferences, useT } from "../lib/context.tsx";
6
+ import { monthCells, monthTitle, parseIso, toIso, weekStart, weekdayNames } from "../lib/format.ts";
7
+ import { Icon } from "../Icon/Icon.tsx";
8
+ import { iconButtonClass } from "../Button/Button.tsx";
9
+ import { controlClass } from "../Field/Field.tsx";
10
+ import { popoverPanelClass } from "../Overlays/Overlays.tsx";
11
+ import { type GridProps, type ListState } from "./Pickers.types.ts";
12
+ import { rankOptions } from "./rankOptions.tsx";
13
+
14
+ // A picker's list opens above whatever holds the field, a dialog or a side peek among them (z-dialog, z-peek), or it
15
+ // shows behind its own dialog and no option can be pressed.
16
+ export const listboxClass = cx(
17
+ popoverPanelClass,
18
+ "z-command p-4 max-h-(--ui-listbox-max) overflow-y-auto w-(--radix-popover-trigger-width)",
19
+ );
20
+
21
+ export const optionClass = cx(
22
+ "flex items-center gap-8 min-h-control-lg px-8 py-4 rounded-control cursor-pointer",
23
+ "aria-selected:font-medium data-[active=true]:bg-bg-hover hover:bg-bg-hover pointer-coarse:min-h-target-coarse",
24
+ );
25
+
26
+ export function OptionBody({ option, selected }: { option: Option; selected: boolean }) {
27
+ return (
28
+ <>
29
+ {option.icon ? <Icon name={option.icon} size={14} /> : null}
30
+ <span className="flex-1 min-w-0">{option.label}</span>
31
+ {option.code ? (
32
+ <span className="flex-none font-mono text-text-12 text-text-secondary">{option.code}</span>
33
+ ) : null}
34
+ {selected ? (
35
+ <span className="text-accent">
36
+ <Icon name="Check" size={14} />
37
+ </span>
38
+ ) : null}
39
+ </>
40
+ );
41
+ }
42
+
43
+ export function useList(options: Option[], defaultOpen: boolean | undefined): ListState {
44
+ const [query, setQuery] = useState("");
45
+ const [open, setOpen] = useState(Boolean(defaultOpen));
46
+ const [active, setActive] = useState(0);
47
+ const list = useMemo(() => rankOptions(options, query), [options, query]);
48
+ return {
49
+ query,
50
+ setQuery,
51
+ open,
52
+ setOpen,
53
+ active: Math.min(active, Math.max(0, list.length - 1)),
54
+ setActive,
55
+ list,
56
+ };
57
+ }
58
+
59
+ export function listKeys(
60
+ e: KeyboardEvent<HTMLInputElement>,
61
+ s: ListState,
62
+ pick: (o: Option) => void,
63
+ ): boolean {
64
+ if (e.key === "ArrowDown") {
65
+ e.preventDefault();
66
+ if (!s.open) s.setOpen(true);
67
+ else s.setActive(Math.min(s.active + 1, s.list.length - 1));
68
+ return true;
69
+ }
70
+ if (e.key === "ArrowUp") {
71
+ e.preventDefault();
72
+ s.setActive(Math.max(s.active - 1, 0));
73
+ return true;
74
+ }
75
+ if (e.key === "Home" && s.open) {
76
+ e.preventDefault();
77
+ s.setActive(0);
78
+ return true;
79
+ }
80
+ if (e.key === "End" && s.open) {
81
+ e.preventDefault();
82
+ s.setActive(s.list.length - 1);
83
+ return true;
84
+ }
85
+ if (e.key === "Enter" && s.open) {
86
+ const option = s.list[s.active];
87
+ if (option) {
88
+ e.preventDefault();
89
+ pick(option);
90
+ }
91
+ return true;
92
+ }
93
+ if (e.key === "Escape" && s.open) {
94
+ e.preventDefault();
95
+ s.setOpen(false);
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+
101
+ export function Listbox({
102
+ id,
103
+ state,
104
+ isSelected,
105
+ pick,
106
+ multiselectable = false,
107
+ noMatch,
108
+ }: {
109
+ id: string;
110
+ state: ListState;
111
+ isSelected: (o: Option) => boolean;
112
+ pick: (o: Option) => void;
113
+ multiselectable?: boolean;
114
+ noMatch: string;
115
+ }) {
116
+ return (
117
+ <RPopover.Portal>
118
+ <RPopover.Content
119
+ sideOffset={4}
120
+ align="start"
121
+ collisionPadding={16}
122
+ onOpenAutoFocus={(e) => e.preventDefault()}
123
+ onCloseAutoFocus={(e) => e.preventDefault()}
124
+ onInteractOutside={(e) => {
125
+ if ((e.target as HTMLElement | null)?.closest?.(`[data-combobox="${id}"]`))
126
+ e.preventDefault();
127
+ }}
128
+ role="presentation"
129
+ className={listboxClass}
130
+ >
131
+ <div role="listbox" id={`${id}-list`} aria-multiselectable={multiselectable || undefined}>
132
+ {state.list.map((o, i) => (
133
+ <div
134
+ key={o.value}
135
+ id={`${id}-opt-${i}`}
136
+ role="option"
137
+ aria-selected={isSelected(o)}
138
+ data-active={i === state.active}
139
+ onMouseDown={(e) => {
140
+ e.preventDefault();
141
+ pick(o);
142
+ }}
143
+ onMouseEnter={() => state.setActive(i)}
144
+ className={optionClass}
145
+ >
146
+ <OptionBody option={o} selected={isSelected(o)} />
147
+ </div>
148
+ ))}
149
+ </div>
150
+ {state.list.length === 0 ? (
151
+ <p className="m-0 px-8 py-8 text-text-secondary">{noMatch}</p>
152
+ ) : null}
153
+ </RPopover.Content>
154
+ </RPopover.Portal>
155
+ );
156
+ }
157
+
158
+ export function shiftIso(iso: string, days: number): string {
159
+ const { y, m, d } = parseIso(iso);
160
+ const date = new Date(y, m, d + days);
161
+ return toIso(date.getFullYear(), date.getMonth(), date.getDate());
162
+ }
163
+
164
+ export function shiftMonth(iso: string, months: number): string {
165
+ const { y, m, d } = parseIso(iso);
166
+ const last = new Date(y, m + months + 1, 0).getDate();
167
+ const date = new Date(y, m + months, Math.min(d, last));
168
+ return toIso(date.getFullYear(), date.getMonth(), date.getDate());
169
+ }
170
+
171
+ /**
172
+ * The date grid of the APG date picker dialog: arrows move a day or a week, Page Up and Page Down a
173
+ * month, Home and End the week, Enter or Space picks.
174
+ */
175
+ export function MonthGrid({ year, month, focused, onFocusDate, onPick, mark }: GridProps) {
176
+ const locale = useLocale();
177
+ const { weekStart: firstDay } = usePreferences();
178
+ const dir = Direction.useDirection();
179
+ const refs = useRef(new Map<string, HTMLButtonElement>());
180
+ const title = monthTitle(locale, year, month);
181
+ useEffect(() => {
182
+ refs.current.get(focused)?.focus();
183
+ }, [focused]);
184
+ const onKeyDown = (e: KeyboardEvent<HTMLButtonElement>, iso: string) => {
185
+ const ahead = dir === "rtl" ? "ArrowLeft" : "ArrowRight";
186
+ const behind = dir === "rtl" ? "ArrowRight" : "ArrowLeft";
187
+ const { y, m, d } = parseIso(iso);
188
+ const dow = (new Date(y, m, d).getDay() - weekStart(locale, firstDay) + 7) % 7;
189
+ const next =
190
+ e.key === ahead
191
+ ? shiftIso(iso, 1)
192
+ : e.key === behind
193
+ ? shiftIso(iso, -1)
194
+ : e.key === "ArrowDown"
195
+ ? shiftIso(iso, 7)
196
+ : e.key === "ArrowUp"
197
+ ? shiftIso(iso, -7)
198
+ : e.key === "PageDown"
199
+ ? shiftMonth(iso, e.shiftKey ? 12 : 1)
200
+ : e.key === "PageUp"
201
+ ? shiftMonth(iso, e.shiftKey ? -12 : -1)
202
+ : e.key === "Home"
203
+ ? shiftIso(iso, -dow)
204
+ : e.key === "End"
205
+ ? shiftIso(iso, 6 - dow)
206
+ : null;
207
+ if (next) {
208
+ e.preventDefault();
209
+ onFocusDate(next);
210
+ }
211
+ };
212
+ return (
213
+ <table role="grid" aria-label={title} className="border-collapse">
214
+ <thead>
215
+ <tr>
216
+ {weekdayNames(locale, firstDay).map((d) => (
217
+ <th
218
+ key={d}
219
+ scope="col"
220
+ className="h-control-sm text-text-11 font-medium text-text-tertiary"
221
+ >
222
+ {d}
223
+ </th>
224
+ ))}
225
+ </tr>
226
+ </thead>
227
+ <tbody>
228
+ {monthCells(locale, year, month, firstDay).map((week, wi) => (
229
+ <tr key={wi}>
230
+ {week.map((d, di) => {
231
+ if (d === null) return <td key={di} />;
232
+ const iso = toIso(year, month, d);
233
+ const state = mark(iso);
234
+ return (
235
+ <td key={di} className="p-0 text-center">
236
+ <button
237
+ ref={(el) => {
238
+ if (el) refs.current.set(iso, el);
239
+ else refs.current.delete(iso);
240
+ }}
241
+ type="button"
242
+ tabIndex={iso === focused ? 0 : -1}
243
+ aria-pressed={state === "selected" || state === "edge"}
244
+ aria-current={state === "today" ? "date" : undefined}
245
+ onClick={() => onPick(iso)}
246
+ onKeyDown={(e) => onKeyDown(e, iso)}
247
+ className={cx(
248
+ "w-(--ui-day-inline) h-(--ui-day-block) rounded-control border-0 bg-transparent cursor-pointer tabular-nums text-text-13",
249
+ "hover:bg-bg-hover pointer-coarse:min-h-target-coarse",
250
+ state === "today" &&
251
+ "ring-(length:--stroke-width-hairline) ring-inset ring-border-strong",
252
+ (state === "selected" || state === "edge") &&
253
+ "bg-accent text-accent-text-on font-semibold hover:bg-accent",
254
+ state === "range" && "bg-bg-hover rounded-none",
255
+ )}
256
+ >
257
+ {d}
258
+ </button>
259
+ </td>
260
+ );
261
+ })}
262
+ </tr>
263
+ ))}
264
+ </tbody>
265
+ </table>
266
+ );
267
+ }
268
+
269
+ export function CalendarPanel({
270
+ label,
271
+ initial,
272
+ mark,
273
+ onPick,
274
+ }: {
275
+ label: string;
276
+ initial: string;
277
+ mark: GridProps["mark"];
278
+ onPick: (iso: string) => void;
279
+ }) {
280
+ const t = useT();
281
+ const locale = useLocale();
282
+ const [focused, setFocused] = useState(initial);
283
+ const { y, m } = parseIso(focused);
284
+ return (
285
+ <RPopover.Portal>
286
+ <RPopover.Content
287
+ role="dialog"
288
+ aria-label={label}
289
+ sideOffset={4}
290
+ align="start"
291
+ collisionPadding={16}
292
+ onOpenAutoFocus={(e) => e.preventDefault()}
293
+ className={cx(popoverPanelClass, "z-popover p-8")}
294
+ >
295
+ <div className="flex items-center justify-between gap-8 pb-8">
296
+ <button
297
+ type="button"
298
+ className={iconButtonClass()}
299
+ aria-label={t("date.prevMonth")}
300
+ onClick={() => setFocused(shiftMonth(focused, -1))}
301
+ >
302
+ <Icon name="ChevronLeft" />
303
+ </button>
304
+ <strong className="font-semibold" aria-live="polite">
305
+ {monthTitle(locale, y, m)}
306
+ </strong>
307
+ <button
308
+ type="button"
309
+ className={iconButtonClass()}
310
+ aria-label={t("date.nextMonth")}
311
+ onClick={() => setFocused(shiftMonth(focused, 1))}
312
+ >
313
+ <Icon name="ChevronRight" />
314
+ </button>
315
+ </div>
316
+ <MonthGrid
317
+ year={y}
318
+ month={m}
319
+ focused={focused}
320
+ onFocusDate={setFocused}
321
+ onPick={onPick}
322
+ mark={mark}
323
+ />
324
+ </RPopover.Content>
325
+ </RPopover.Portal>
326
+ );
327
+ }
328
+
329
+ export const triggerClass = cx(
330
+ controlClass,
331
+ "flex items-center gap-8 w-full text-start cursor-pointer [&_svg]:text-text-secondary",
332
+ );
333
+
334
+ export function todayIso(): string {
335
+ const now = new Date();
336
+ return toIso(now.getFullYear(), now.getMonth(), now.getDate());
337
+ }
@@ -0,0 +1,17 @@
1
+ export {
2
+ type ComboboxProps,
3
+ type MultiSelectProps,
4
+ type SliderProps,
5
+ type DatePickerProps,
6
+ type DateRangePickerProps,
7
+ type TimePickerProps,
8
+ type FileDropProps,
9
+ } from "./Pickers.types.ts";
10
+ export { rankOptions } from "./rankOptions.tsx";
11
+ export { Combobox } from "./Combobox.tsx";
12
+ export { MultiSelect } from "./MultiSelect.tsx";
13
+ export { Slider } from "./Slider.tsx";
14
+ export { DatePicker } from "./DatePicker.tsx";
15
+ export { DateRangePicker } from "./DateRangePicker.tsx";
16
+ export { TimePicker } from "./TimePicker.tsx";
17
+ export { FileDrop } from "./FileDrop.tsx";
@@ -0,0 +1,47 @@
1
+ import type {
2
+ ComboboxProps as ReferenceComboboxProps,
3
+ DatePickerProps as ReferenceDatePickerProps,
4
+ DateRangePickerProps as ReferenceDateRangePickerProps,
5
+ FileDropProps as ReferenceFileDropProps,
6
+ MultiSelectProps as ReferenceMultiSelectProps,
7
+ Option,
8
+ SliderProps as ReferenceSliderProps,
9
+ TimePickerProps as ReferenceTimePickerProps,
10
+ } from "../types/reference";
11
+
12
+ export type ComboboxProps = ReferenceComboboxProps & {
13
+ id?: string;
14
+ /** Called with each typed query, for a list searched on the server (the options then follow the results). */
15
+ onQueryChange?: (query: string) => void;
16
+ };
17
+
18
+ export type MultiSelectProps = ReferenceMultiSelectProps & { id?: string };
19
+
20
+ export type SliderProps = ReferenceSliderProps & { id?: string };
21
+
22
+ export type DatePickerProps = ReferenceDatePickerProps & { id?: string };
23
+
24
+ export type DateRangePickerProps = ReferenceDateRangePickerProps & { id?: string };
25
+
26
+ export type TimePickerProps = ReferenceTimePickerProps & { id?: string; name?: string };
27
+
28
+ export type FileDropProps = ReferenceFileDropProps & { id?: string };
29
+
30
+ export interface ListState {
31
+ query: string;
32
+ setQuery: (q: string) => void;
33
+ open: boolean;
34
+ setOpen: (o: boolean) => void;
35
+ active: number;
36
+ setActive: (n: number) => void;
37
+ list: Option[];
38
+ }
39
+
40
+ export interface GridProps {
41
+ year: number;
42
+ month: number;
43
+ focused: string;
44
+ onFocusDate: (iso: string) => void;
45
+ onPick: (iso: string) => void;
46
+ mark: (iso: string) => "selected" | "edge" | "range" | "today" | null;
47
+ }
@@ -0,0 +1,59 @@
1
+ import { useState, type ReactElement } from "react";
2
+ import { Slider as RSlider } from "radix-ui";
3
+ import { useFormat, useT } from "../lib/context.tsx";
4
+ import { fieldClass, labelClass, useFieldId } from "../Field/Field.tsx";
5
+ import { type SliderProps } from "./Pickers.types.ts";
6
+
7
+ /** A value in a bounded range on Radix Slider, always showing the current value beside its label. */
8
+ export function Slider({
9
+ label,
10
+ min,
11
+ max,
12
+ step = 1,
13
+ value,
14
+ unit,
15
+ onChange,
16
+ id,
17
+ }: SliderProps): ReactElement {
18
+ const t = useT();
19
+ const fieldId = useFieldId(id);
20
+ const fmt = useFormat();
21
+ const [current, setCurrent] = useState(value);
22
+ const shown = unit
23
+ ? t("slider.value", { value: fmt.number(current), unit })
24
+ : fmt.number(current);
25
+ return (
26
+ <div className={fieldClass}>
27
+ <div className="flex justify-between text-text-12">
28
+ <span id={`${fieldId}-label`} className={labelClass}>
29
+ {label}
30
+ </span>
31
+ <output htmlFor={fieldId} className="tabular-nums text-text-secondary">
32
+ {shown}
33
+ </output>
34
+ </div>
35
+ <RSlider.Root
36
+ min={min}
37
+ max={max}
38
+ step={step}
39
+ value={[current]}
40
+ onValueChange={([v]) => {
41
+ if (v === undefined) return;
42
+ setCurrent(v);
43
+ onChange?.(v);
44
+ }}
45
+ className="relative flex items-center h-control-md touch-none select-none pointer-coarse:min-h-target-coarse"
46
+ >
47
+ <RSlider.Track className="relative grow h-(--space-4) rounded-pill bg-bg-hover overflow-hidden">
48
+ <RSlider.Range className="absolute h-full bg-accent" />
49
+ </RSlider.Track>
50
+ <RSlider.Thumb
51
+ id={fieldId}
52
+ aria-labelledby={`${fieldId}-label`}
53
+ aria-valuetext={shown}
54
+ className="block size-(--space-16) rounded-full bg-text-primary ring-(length:--stroke-width-focus) ring-bg-canvas cursor-grab"
55
+ />
56
+ </RSlider.Root>
57
+ </div>
58
+ );
59
+ }
@@ -0,0 +1,68 @@
1
+ import { useMemo, type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useLocale } from "../lib/context.tsx";
4
+ import { formatTimeOfDay } from "../lib/format.ts";
5
+ import { Icon } from "../Icon/Icon.tsx";
6
+ import { chipClass } from "../Chips/Chips.tsx";
7
+ import { Field, controlClass, useFieldId } from "../Field/Field.tsx";
8
+ import { type TimePickerProps } from "./Pickers.types.ts";
9
+
10
+ /**
11
+ * A time of day with the venue time zone always beside it. The contract keeps a native select change
12
+ * event; times read in the locale's format (12-hour with AM and PM in en-US).
13
+ */
14
+ export function TimePicker({
15
+ label,
16
+ help,
17
+ value,
18
+ step = 15,
19
+ timeZone,
20
+ zoneLabel,
21
+ onChange,
22
+ id,
23
+ name,
24
+ }: TimePickerProps): ReactElement {
25
+ const locale = useLocale();
26
+ const fieldId = useFieldId(id);
27
+ const options = useMemo(() => {
28
+ const out: { value: string; label: string }[] = [];
29
+ for (let mins = 0; mins < 1440; mins += step) {
30
+ const h = Math.floor(mins / 60);
31
+ const m = mins % 60;
32
+ out.push({
33
+ value: `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")}`,
34
+ label: formatTimeOfDay(locale, h, m),
35
+ });
36
+ }
37
+ return out;
38
+ }, [locale, step]);
39
+ return (
40
+ <Field id={fieldId} label={label} help={help}>
41
+ <div className="flex items-center gap-6">
42
+ <div className="relative flex-1">
43
+ <select
44
+ id={fieldId}
45
+ name={name}
46
+ defaultValue={value}
47
+ onChange={onChange}
48
+ aria-describedby={`${fieldId}-zone${help ? ` ${fieldId}-help` : ""}`}
49
+ className={cx(controlClass, "appearance-none w-full pe-24")}
50
+ >
51
+ {options.map((o) => (
52
+ <option key={o.value} value={o.value}>
53
+ {o.label}
54
+ </option>
55
+ ))}
56
+ </select>
57
+ <span className="pointer-events-none absolute inset-y-0 end-8 flex items-center text-text-tertiary">
58
+ <Icon name="Clock" size={14} />
59
+ </span>
60
+ </div>
61
+ <span id={`${fieldId}-zone`} title={timeZone} className={chipClass}>
62
+ <Icon name="Globe" size={12} />
63
+ {zoneLabel}
64
+ </span>
65
+ </div>
66
+ </Field>
67
+ );
68
+ }
@@ -0,0 +1,12 @@
1
+ import { defaultFilter } from "cmdk";
2
+ import type { Option } from "../types/reference";
3
+
4
+ /** Ranks options against a query with cmdk's fuzzy score; an empty query keeps the given order. */
5
+ export function rankOptions(options: Option[], query: string): Option[] {
6
+ if (!query.trim()) return options;
7
+ return options
8
+ .map((o) => ({ o, score: defaultFilter(`${o.label} ${o.code ?? ""}`, query) }))
9
+ .filter((r) => r.score > 0)
10
+ .sort((a, b) => b.score - a.score)
11
+ .map((r) => r.o);
12
+ }
@@ -0,0 +1,3 @@
1
+ # Popover
2
+
3
+ Popover holds more than one sentence of help, with a Learn more link; tooltips stay one sentence.
@@ -0,0 +1,3 @@
1
+ # PresenceIndicator
2
+
3
+ PresenceIndicator shows who is viewing or editing a record live.
@@ -0,0 +1,7 @@
1
+ # PriceDisplay
2
+
3
+ PriceDisplay prints one price with its billing period and tax label.
4
+
5
+ Amounts format with the page locale and currency, with no decimals on whole amounts. `taxMode` prints the tax label for the visitor's region: exclusive for United States business pricing, inclusive where consumer price rules require the total. A plan sold by quote passes `from` with its starting price.
6
+
7
+ The silence rule holds: a `null` amount is unpriced and renders Quoted, never zero. Zero is a claim, used only for a plan that is free.
@@ -0,0 +1,9 @@
1
+ # PricingTable
2
+
3
+ PricingTable shows the plans side by side with a monthly and annual billing toggle.
4
+
5
+ The toggle is a SegmentedControl, and a polite live region announces each change. Prices render through PriceDisplay, so tax labels and the silence rule apply. `terms` prints renewal, trial and cancellation terms with the plans, before anyone leaves the page. One plan may be marked `recommended`; nothing is preselected or pre-checked, and no countdown or scarcity copy belongs here.
6
+
7
+ From bp-lg the plans sit in one row. Below it they become a snapped horizontal list, with each plan's button reachable by keyboard.
8
+
9
+ The consumer provides plans from the plan registry (`packages/schemas/plans.yaml`); prices never come from anywhere else. Show only currencies of open territories.
@@ -0,0 +1,3 @@
1
+ # ProfileEditor
2
+
3
+ ProfileEditor sets each field's visibility: Private, Shared on application (On Apply) or Public, with a profile strength meter naming the next step.
@@ -0,0 +1,3 @@
1
+ # ProgressBar
2
+
3
+ ProgressBar shows determinate progress with its percentage in tabular numerals.
@@ -0,0 +1,7 @@
1
+ # ProofStatStrip
2
+
3
+ ProofStatStrip shows a row of verifiable figures, each linked to the file that proves it.
4
+
5
+ Figures use tabular numerals and format with the page locale. Every figure on a public page comes from the repository or the canon and carries a `source`, so a reader or an answer engine can check it. Use three to five figures; they sit in one row from bp-lg, two columns from bp-sm and one column below.
6
+
7
+ The consumer provides the value, a short label and the source link. Never use a figure that has no source.
@@ -0,0 +1,3 @@
1
+ # PropertyChip
2
+
3
+ PropertyChip shows one record property inline and edits it in place when clickable.
@@ -0,0 +1,3 @@
1
+ # ProvenanceBadge
2
+
3
+ ProvenanceBadge shows who wrote a canon field and the provenance rank (human 100, operator 80, imported 60, agent 40, provider 20).
@@ -0,0 +1,6 @@
1
+ # QRCode
2
+
3
+ QRCode renders a scannable code as SVG, always dark on a light quiet zone so scanners read it in every theme.
4
+
5
+ - Used by CredentialBadge and the Continue on another device handoff.
6
+ - Generated by qrcode-generator 1.4.4 (MIT), shipped in `components/lib`.
@@ -0,0 +1,5 @@
1
+ # QuickAdd
2
+
3
+ QuickAdd parses date phrases, @person, #tag, /kind and ~scope into chips before saving.
4
+
5
+ - `XOS.parseQuickAdd(text)` exposes the same parser.
@@ -0,0 +1,3 @@
1
+ # QuickIncidentSheet
2
+
3
+ QuickIncidentSheet is step one of the three-step incident report: type, confirmed location, then photos or voice note.
@@ -0,0 +1,3 @@
1
+ # Radio
2
+
3
+ Radio picks exactly one of two to five visible options; use Select for more.
@@ -0,0 +1,7 @@
1
+ # RadioChannelTable
2
+
3
+ RadioChannelTable lists the radio plan by zone and channel, available offline in Compass.
4
+
5
+ - Rows always sort by zone, then channel, in numeric order; the component enforces this.
6
+ - Content comes from the org's copy of the XOS Standard Library Radio Channels. The preview shows six of its 32 rows verbatim.
7
+ - Notes wrap so the plan reads on a phone without sideways scrolling.
@@ -0,0 +1,3 @@
1
+ # RatingDialog
2
+
3
+ RatingDialog collects a two-sided rating after close-out; both ratings release together.
@@ -0,0 +1,3 @@
1
+ # ReconciliationTable
2
+
3
+ ReconciliationTable compares requirements with venue capability as Met, Gap or Unknown; an Unknown against a critical requirement is a gap at Gate 3.
@@ -0,0 +1,3 @@
1
+ # RecordKindChip
2
+
3
+ RecordKindChip shows a record kind as its glyph and name.