@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,146 @@
1
+ import {
2
+ Children,
3
+ createContext,
4
+ isValidElement,
5
+ useRef,
6
+ useState,
7
+ type KeyboardEvent,
8
+ type MouseEvent,
9
+ type ReactElement,
10
+ } from "react";
11
+ import { useFormat, useT } from "../lib/context.tsx";
12
+ import { rovingIndex } from "../lib/hooks.ts";
13
+ import { singleKeyShortcutsEnabled } from "../lib/preferences.ts";
14
+ import { isMenuKey, useItemSelection, type ItemSelect } from "../lib/selection.ts";
15
+ import { type RecordListProps } from "./Views.types.ts";
16
+
17
+ /** A selectable list's selection, for its rows' checkboxes and selected state. */
18
+ export const RecordListSelection = createContext<ItemSelect | null>(null);
19
+
20
+ /**
21
+ * The list of RecordRows with the grid role and the list's name. Arrow Up and Down, J and K move
22
+ * between rows; Home and End jump. With `selection`, rows select as in DataTable: a row's checkbox,
23
+ * Cmd or Ctrl+click and Shift+click, X and Shift+X on the focused row, Cmd or Ctrl+A for every row
24
+ * and Esc to clear. Right-click, Shift+F10 or the Context Menu key on a row calls
25
+ * `onItemContextMenu` with the row's id.
26
+ */
27
+ export function RecordList({
28
+ label,
29
+ children,
30
+ selection,
31
+ onItemContextMenu,
32
+ }: RecordListProps): ReactElement {
33
+ const t = useT();
34
+ const fmt = useFormat();
35
+ const ref = useRef<HTMLDivElement>(null);
36
+ const [entered, setEntered] = useState(false);
37
+ const rowsOf = () => [...(ref.current?.querySelectorAll<HTMLElement>("[data-row]") ?? [])];
38
+ const select = useItemSelection(selection, () =>
39
+ rowsOf().flatMap((r) => (r.dataset["item"] ? [r.dataset["item"]] : [])),
40
+ );
41
+ /** The row an event happened in, with its id when it has one. */
42
+ const rowAt = (target: EventTarget) => {
43
+ const row = target instanceof Element ? target.closest<HTMLElement>("[data-row]") : null;
44
+ return row && ref.current?.contains(row) ? row : null;
45
+ };
46
+ const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
47
+ const rows = rowsOf();
48
+ const index = rows.findIndex((r) => r.contains(document.activeElement));
49
+ const focused = rows[index];
50
+ const id = focused?.dataset["item"];
51
+ // Selection and the menu act on the focused row itself, never on a control inside it.
52
+ if (id && focused === e.target && !e.defaultPrevented) {
53
+ if (onItemContextMenu && isMenuKey(e)) {
54
+ e.preventDefault();
55
+ onItemContextMenu(id, null, focused);
56
+ return;
57
+ }
58
+ if (select.onKey(e, id)) return;
59
+ }
60
+ const letters = singleKeyShortcutsEnabled();
61
+ const key =
62
+ letters && e.key === "j" ? "ArrowDown" : letters && e.key === "k" ? "ArrowUp" : e.key;
63
+ const next = rovingIndex(key, Math.max(0, index), rows.length, "vertical");
64
+ if (next === null || rows.length === 0) return;
65
+ if (index === -1 && key !== "Home" && key !== "End") return;
66
+ e.preventDefault();
67
+ rows[next]?.focus();
68
+ };
69
+ const onClick = (e: MouseEvent<HTMLDivElement>) => {
70
+ const id = rowAt(e.target)?.dataset["item"];
71
+ if (id) select.onClick(e, id);
72
+ };
73
+ const grid = (
74
+ <div
75
+ ref={ref}
76
+ role="grid"
77
+ aria-label={label}
78
+ aria-multiselectable={selection ? true : undefined}
79
+ tabIndex={entered ? -1 : 0}
80
+ onFocus={(e) => {
81
+ if (e.target === e.currentTarget) {
82
+ rowsOf()[0]?.focus();
83
+ setEntered(true);
84
+ }
85
+ }}
86
+ onKeyDown={onKeyDown}
87
+ {...(selection
88
+ ? {
89
+ onClick,
90
+ onMouseDown: (e: MouseEvent<HTMLDivElement>) => {
91
+ // Shift+click selects a range, not the text between.
92
+ if (e.shiftKey && rowAt(e.target)) e.preventDefault();
93
+ },
94
+ }
95
+ : {})}
96
+ {...(onItemContextMenu
97
+ ? {
98
+ onContextMenu: (e: MouseEvent<HTMLDivElement>) => {
99
+ const row = rowAt(e.target);
100
+ const id = row?.dataset["item"];
101
+ if (!row || !id) return;
102
+ e.preventDefault();
103
+ onItemContextMenu(id, { x: e.clientX, y: e.clientY }, e.target as HTMLElement);
104
+ },
105
+ }
106
+ : {})}
107
+ className="xos-rlist flex flex-col overflow-hidden rounded-card border border-border-subtle"
108
+ >
109
+ {/* The list stays headless on screen; screen readers moving across a row hear which value
110
+ each cell is (1.3.1, A23-012). */}
111
+ <div role="row" className="sr-only">
112
+ {[
113
+ ...(selection ? ["select"] : []),
114
+ "state",
115
+ "key",
116
+ "title",
117
+ "labels",
118
+ "next",
119
+ "owner",
120
+ "action",
121
+ ].map((c) => (
122
+ <span key={c} role="columnheader">
123
+ {t(`recordList.columns.${c}`)}
124
+ </span>
125
+ ))}
126
+ </div>
127
+ {children}
128
+ </div>
129
+ );
130
+ if (!selection) return grid;
131
+ // The rows of this list that are selected: lists on one page may share a selection.
132
+ const count = Children.toArray(children).filter(
133
+ (child) =>
134
+ isValidElement<{ id?: unknown }>(child) &&
135
+ typeof child.props.id === "string" &&
136
+ select.isSelected(child.props.id),
137
+ ).length;
138
+ return (
139
+ <RecordListSelection value={select}>
140
+ <span role="status" className="sr-only">
141
+ {count > 0 ? t("bulk.selected", { n: fmt.number(count) }) : ""}
142
+ </span>
143
+ {grid}
144
+ </RecordListSelection>
145
+ );
146
+ }
@@ -0,0 +1,132 @@
1
+ import { use, type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useT } from "../lib/context.tsx";
4
+ import { singleKeyShortcutsEnabled } from "../lib/preferences.ts";
5
+ import { Icon } from "../Icon/Icon.tsx";
6
+ import { Button } from "../Button/Button.tsx";
7
+ import { Avatar } from "../Avatar/Avatar.tsx";
8
+ import { RecordKindGlyph } from "../Glyphs/Glyphs.tsx";
9
+ import { StateIcon } from "../StateIcon/StateIcon.tsx";
10
+ import { RecordListSelection } from "./RecordList.tsx";
11
+ import { type RecordRowProps } from "./Views.types.ts";
12
+
13
+ /**
14
+ * One list row that answers what now: state, key, title, chips, next date, owner and the next action.
15
+ * In a selectable list a row with an `id` leads with its checkbox. The key, title and owner cells
16
+ * carry `data-column`, and the row its `data-item` id, so a page can preview them (hover cards).
17
+ */
18
+ export function RecordRow({
19
+ id,
20
+ state,
21
+ stateLabel,
22
+ recordKey,
23
+ kind,
24
+ title,
25
+ chips,
26
+ next,
27
+ owner,
28
+ actionLabel,
29
+ actionKey,
30
+ selected,
31
+ onAction,
32
+ onSelect,
33
+ onOpen,
34
+ }: RecordRowProps): ReactElement {
35
+ const t = useT();
36
+ const list = use(RecordListSelection);
37
+ const select = list && id !== undefined ? list : null;
38
+ const isSelected = selected ?? (select && id !== undefined ? select.isSelected(id) : undefined);
39
+ return (
40
+ <div
41
+ role="row"
42
+ aria-selected={isSelected ?? undefined}
43
+ tabIndex={-1}
44
+ data-row
45
+ data-item={id}
46
+ data-selectable={select ? "" : undefined}
47
+ onKeyDown={(e) => {
48
+ if (e.target !== e.currentTarget) return;
49
+ if (e.key.toLowerCase() === "x" && onSelect && singleKeyShortcutsEnabled()) {
50
+ e.preventDefault();
51
+ onSelect();
52
+ } else if (e.key === "Enter" && onOpen) {
53
+ e.preventDefault();
54
+ onOpen();
55
+ }
56
+ }}
57
+ className={cx(
58
+ "xos-rrow border-b border-border-subtle last:border-b-0 outline-none",
59
+ "hover:bg-bg-hover focus-visible:bg-bg-hover aria-selected:bg-bg-hover",
60
+ "focus-visible:ring-(length:--stroke-width-focus) focus-visible:ring-inset focus-visible:ring-focus-ring",
61
+ )}
62
+ >
63
+ {select && id !== undefined ? (
64
+ <span role="gridcell" className="xos-rrow-select inline-flex">
65
+ <input
66
+ type="checkbox"
67
+ tabIndex={-1}
68
+ className="xos-check-input"
69
+ aria-label={t("table.selectRow", { row: title })}
70
+ checked={isSelected === true}
71
+ onClick={(e) => {
72
+ e.stopPropagation();
73
+ select.toggle(id, e.shiftKey);
74
+ }}
75
+ onChange={() => undefined}
76
+ />
77
+ </span>
78
+ ) : null}
79
+ <span role="gridcell" className="xos-rrow-state inline-flex">
80
+ <StateIcon state={state} />
81
+ <span className="sr-only">{stateLabel}</span>
82
+ </span>
83
+ <span
84
+ role="gridcell"
85
+ data-column="key"
86
+ className="xos-rrow-key font-mono text-text-12 text-text-secondary"
87
+ >
88
+ {recordKey}
89
+ </span>
90
+ <span
91
+ role="gridcell"
92
+ data-column="title"
93
+ className="xos-rrow-title flex items-center gap-6 min-w-0"
94
+ >
95
+ {kind ? (
96
+ <RecordKindGlyph kind={kind} size={14} color="var(--color-text-secondary)" />
97
+ ) : null}
98
+ <span className="truncate" title={title}>
99
+ {title}
100
+ </span>
101
+ </span>
102
+ <span role="gridcell" className="xos-rrow-chips flex gap-4">
103
+ {chips}
104
+ </span>
105
+ {/* The next date has a column wide enough for a date and time; a longer translation ellipsizes
106
+ with the full text as its title instead of running under the owner (A59-008). */}
107
+ <span
108
+ role="gridcell"
109
+ className="xos-rrow-next flex items-center gap-4 min-w-0 text-text-12 text-text-secondary tabular-nums whitespace-nowrap"
110
+ >
111
+ {next ? (
112
+ <>
113
+ <Icon name="Calendar" size={14} />
114
+ <span className="truncate" title={next}>
115
+ {next}
116
+ </span>
117
+ </>
118
+ ) : null}
119
+ </span>
120
+ <span role="gridcell" data-column="owner" className="xos-rrow-owner">
121
+ {owner ? <Avatar name={owner} /> : null}
122
+ </span>
123
+ <span role="gridcell" className="xos-rrow-action flex justify-end">
124
+ {actionLabel ? (
125
+ <Button size="sm" onClick={onAction} {...(actionKey ? { shortcut: actionKey } : {})}>
126
+ {actionLabel}
127
+ </Button>
128
+ ) : null}
129
+ </span>
130
+ </div>
131
+ );
132
+ }
@@ -0,0 +1,88 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useFormat, useT } from "../lib/context.tsx";
4
+ import { Icon } from "../Icon/Icon.tsx";
5
+ import { Money } from "../Forms/Forms.tsx";
6
+ import { Sparkline } from "../Charts/Sparkline.tsx";
7
+ import { type StatTileProps } from "./Views.types.ts";
8
+
9
+ /**
10
+ * One headline number with its change and whether the change is good. Direction is an icon and a
11
+ * signed number as well as color; a blank value reads No value, never 0.
12
+ */
13
+ export function StatTile({
14
+ label,
15
+ value,
16
+ format = "number",
17
+ delta,
18
+ deltaUnit,
19
+ deltaLabel,
20
+ goodWhen,
21
+ caption,
22
+ onDrill,
23
+ trend,
24
+ }: StatTileProps): ReactElement {
25
+ const t = useT();
26
+ const fmt = useFormat();
27
+ const direction =
28
+ delta === undefined || delta === null ? null : delta > 0 ? "up" : delta < 0 ? "down" : "flat";
29
+ const good =
30
+ goodWhen !== undefined &&
31
+ direction !== null &&
32
+ direction !== "flat" &&
33
+ (goodWhen === "up") === (direction === "up");
34
+ const bad = goodWhen !== undefined && direction !== null && direction !== "flat" && !good;
35
+ const figure =
36
+ format === "money" ? (
37
+ <Money amount={value} />
38
+ ) : value === null ? (
39
+ <span className="text-text-secondary">{t("chart.noValue")}</span>
40
+ ) : (
41
+ fmt.number(value)
42
+ );
43
+ return (
44
+ <section
45
+ aria-label={label}
46
+ className="flex flex-col gap-4 min-w-(--ui-stat-min) p-16 rounded-card border border-border-subtle bg-bg-raised"
47
+ >
48
+ <span className="text-text-12 font-medium text-text-secondary">{label}</span>
49
+ <strong className="text-heading-32 font-semibold tabular-nums">
50
+ {onDrill ? (
51
+ <button
52
+ type="button"
53
+ onClick={onDrill}
54
+ className="p-0 border-0 bg-transparent cursor-pointer text-inherit hover:underline"
55
+ >
56
+ {figure}
57
+ </button>
58
+ ) : (
59
+ figure
60
+ )}
61
+ </strong>
62
+ {direction !== null && delta !== null && delta !== undefined ? (
63
+ <span
64
+ className={cx(
65
+ "flex items-center gap-4 text-text-12 text-text-secondary",
66
+ good && "text-success-text",
67
+ bad && "text-danger-text",
68
+ )}
69
+ >
70
+ <Icon
71
+ name={direction === "up" ? "ArrowUp" : direction === "down" ? "ArrowDown" : "Minus"}
72
+ size={14}
73
+ />
74
+ <span className="tabular-nums">
75
+ {delta > 0 ? "+" : ""}
76
+ {fmt.number(delta)}
77
+ {deltaUnit ?? ""}
78
+ </span>
79
+ {deltaLabel ? <span className="text-text-secondary">{deltaLabel}</span> : null}
80
+ </span>
81
+ ) : null}
82
+ {trend && trend.length > 1 ? (
83
+ <Sparkline values={trend} label={t("stat.trend", { label })} />
84
+ ) : null}
85
+ {caption ? <span className="text-text-secondary">{caption}</span> : null}
86
+ </section>
87
+ );
88
+ }
@@ -0,0 +1,161 @@
1
+ import { useId, useRef, useState, type KeyboardEvent, type ReactElement } from "react";
2
+ import { Direction } from "radix-ui";
3
+ import { cx } from "../lib/cx.ts";
4
+ import { rovingIndex } from "../lib/hooks.ts";
5
+ import { Icon } from "../Icon/Icon.tsx";
6
+ import { type FlatNode, type TreeNode, type TreeViewProps } from "./Views.types.ts";
7
+
8
+ function flatten(
9
+ nodes: TreeNode[],
10
+ expanded: Set<string>,
11
+ depth = 0,
12
+ parent: string | null = null,
13
+ prefix = "",
14
+ ): FlatNode[] {
15
+ return nodes.flatMap((node, i) => {
16
+ const id = node.id ?? `${prefix}${i}`;
17
+ const hasChildren = (node.children?.length ?? 0) > 0;
18
+ const self: FlatNode = { node, id, depth, parent, hasChildren };
19
+ return hasChildren && expanded.has(id)
20
+ ? [self, ...flatten(node.children ?? [], expanded, depth + 1, id, `${id}.`)]
21
+ : [self];
22
+ });
23
+ }
24
+
25
+ function initialExpanded(nodes: TreeNode[], prefix = ""): string[] {
26
+ return nodes.flatMap((node, i) => {
27
+ const id = node.id ?? `${prefix}${i}`;
28
+ const kids = node.children ?? [];
29
+ return kids.length && node.expanded !== false ? [id, ...initialExpanded(kids, `${id}.`)] : [];
30
+ });
31
+ }
32
+
33
+ /**
34
+ * The scope tree. Arrow Up and Down move, Arrow Right expands or enters, Arrow Left collapses or
35
+ * returns to the parent, Home and End jump, Enter or Space selects.
36
+ */
37
+ export function TreeView({ label, nodes, onSelect }: TreeViewProps): ReactElement {
38
+ const dir = Direction.useDirection();
39
+ const [expanded, setExpanded] = useState(() => new Set(initialExpanded(nodes)));
40
+ const visible = flatten(nodes, expanded);
41
+ const initialSelected = visible.find((f) => f.node.selected)?.id ?? null;
42
+ const [selected, setSelected] = useState<string | null>(initialSelected);
43
+ const [focused, setFocused] = useState<string>(initialSelected ?? visible[0]?.id ?? "");
44
+ const refs = useRef(new Map<string, HTMLElement>());
45
+ const base = useId().replace(/:/g, "");
46
+
47
+ const focus = (id: string) => {
48
+ setFocused(id);
49
+ refs.current.get(id)?.focus();
50
+ };
51
+ const toggle = (id: string, open: boolean) =>
52
+ setExpanded((current) => {
53
+ const next = new Set(current);
54
+ if (open) next.add(id);
55
+ else next.delete(id);
56
+ return next;
57
+ });
58
+ const select = (item: FlatNode) => {
59
+ setSelected(item.id);
60
+ onSelect?.(item.node);
61
+ };
62
+
63
+ const onKeyDown = (e: KeyboardEvent<HTMLElement>, item: FlatNode, index: number) => {
64
+ if (e.target !== e.currentTarget) return;
65
+ const enter = dir === "rtl" ? "ArrowLeft" : "ArrowRight";
66
+ const leave = dir === "rtl" ? "ArrowRight" : "ArrowLeft";
67
+ const move = rovingIndex(e.key, index, visible.length, "vertical");
68
+ if (move !== null && e.key !== "ArrowLeft" && e.key !== "ArrowRight") {
69
+ e.preventDefault();
70
+ const target = visible[move];
71
+ if (target) focus(target.id);
72
+ } else if (e.key === enter) {
73
+ e.preventDefault();
74
+ if (item.hasChildren && !expanded.has(item.id)) toggle(item.id, true);
75
+ else if (item.hasChildren) {
76
+ const child = visible[index + 1];
77
+ if (child) focus(child.id);
78
+ }
79
+ } else if (e.key === leave) {
80
+ e.preventDefault();
81
+ if (item.hasChildren && expanded.has(item.id)) toggle(item.id, false);
82
+ else if (item.parent !== null) focus(item.parent);
83
+ } else if (e.key === "Enter" || e.key === " ") {
84
+ e.preventDefault();
85
+ select(item);
86
+ }
87
+ };
88
+
89
+ const renderLevel = (parent: string | null) =>
90
+ visible
91
+ .map((item, index) => ({ item, index }))
92
+ .filter(({ item }) => item.parent === parent)
93
+ .map(({ item, index }) => {
94
+ const open = expanded.has(item.id);
95
+ return (
96
+ <li
97
+ key={item.id}
98
+ ref={(el) => {
99
+ if (el) refs.current.set(item.id, el);
100
+ else refs.current.delete(item.id);
101
+ }}
102
+ role="treeitem"
103
+ aria-labelledby={`${base}-${item.id}`}
104
+ aria-level={item.depth + 1}
105
+ aria-expanded={item.hasChildren ? open : undefined}
106
+ aria-selected={selected === item.id}
107
+ tabIndex={focused === item.id ? 0 : -1}
108
+ onKeyDown={(e) => onKeyDown(e, item, index)}
109
+ onFocus={(e) => {
110
+ if (e.target === e.currentTarget) setFocused(item.id);
111
+ }}
112
+ className="outline-none focus-visible:[&>div]:ring-(length:--stroke-width-focus) focus-visible:[&>div]:ring-focus-ring"
113
+ >
114
+ <div
115
+ onClick={() => {
116
+ setFocused(item.id);
117
+ select(item);
118
+ if (item.hasChildren) toggle(item.id, !open);
119
+ }}
120
+ className={cx(
121
+ "flex items-center gap-6 h-control-md pe-8 rounded-control cursor-pointer hover:bg-bg-hover",
122
+ selected === item.id && "bg-bg-hover",
123
+ )}
124
+ style={{
125
+ paddingInlineStart: `calc(var(--space-8) + ${item.depth} * var(--space-16))`,
126
+ }}
127
+ >
128
+ {item.hasChildren ? (
129
+ <span className="text-text-tertiary">
130
+ <Icon name={open ? "ChevronDown" : "ChevronRight"} size={14} />
131
+ </span>
132
+ ) : (
133
+ <span className="inline-block w-(--icon-size-14)" />
134
+ )}
135
+ {item.node.icon ? (
136
+ <Icon name={item.node.icon} size={14} color="var(--color-text-secondary)" />
137
+ ) : null}
138
+ <span id={`${base}-${item.id}`}>{item.node.label}</span>
139
+ {item.node.meta ? (
140
+ <span className="ms-auto text-text-secondary">{item.node.meta}</span>
141
+ ) : null}
142
+ </div>
143
+ {item.hasChildren && open ? (
144
+ <ul role="group" className="m-0 p-0 list-none">
145
+ {renderLevel(item.id)}
146
+ </ul>
147
+ ) : null}
148
+ </li>
149
+ );
150
+ });
151
+
152
+ return (
153
+ <ul
154
+ role="tree"
155
+ aria-label={label}
156
+ className="w-(--ui-tree) max-w-full m-0 p-0 list-none box-border"
157
+ >
158
+ {renderLevel(null)}
159
+ </ul>
160
+ );
161
+ }
@@ -0,0 +1,18 @@
1
+ export {
2
+ type RecordRowProps,
3
+ type RecordListProps,
4
+ type ItemContextMenu,
5
+ type BoardProps,
6
+ type TreeNode,
7
+ type TreeViewProps,
8
+ type BulkActionBarProps,
9
+ type ActivityFeedItemProps,
10
+ type StatTileProps,
11
+ } from "./Views.types.ts";
12
+ export { RecordRow } from "./RecordRow.tsx";
13
+ export { RecordList } from "./RecordList.tsx";
14
+ export { Board } from "./Board.tsx";
15
+ export { TreeView } from "./TreeView.tsx";
16
+ export { BulkActionBar } from "./BulkActionBar.tsx";
17
+ export { ActivityFeedItem } from "./ActivityFeedItem.tsx";
18
+ export { StatTile } from "./StatTile.tsx";
@@ -0,0 +1,99 @@
1
+ import type {
2
+ ActivityFeedItemProps as ReferenceActivityFeedItemProps,
3
+ BoardProps as ReferenceBoardProps,
4
+ BulkActionBarProps as ReferenceBulkActionBarProps,
5
+ RecordListProps as ReferenceRecordListProps,
6
+ RecordRowProps as ReferenceRecordRowProps,
7
+ RecordState,
8
+ StatTileProps as ReferenceStatTileProps,
9
+ TreeNode as ReferenceTreeNode,
10
+ TreeViewProps as ReferenceTreeViewProps,
11
+ } from "../types/reference";
12
+ import type { ItemSelection } from "../lib/selection.ts";
13
+
14
+ /**
15
+ * Right-click, Shift+F10 or the Context Menu key on an item (Section 11.7): its id, the pointer's
16
+ * point (null from the keyboard, when the menu opens at the item) and the element it opened on.
17
+ */
18
+ export type ItemContextMenu = (
19
+ id: string,
20
+ at: { x: number; y: number } | null,
21
+ element: HTMLElement,
22
+ ) => void;
23
+
24
+ export type RecordRowProps = ReferenceRecordRowProps & {
25
+ /**
26
+ * The row's id: its list selects it and opens its menu by this id, and hover cards find it
27
+ * (`data-item`). Rows of a selectable list need one.
28
+ */
29
+ id?: string;
30
+ /** X toggles selection of the focused row, when its list has no selection of its own. */
31
+ onSelect?: () => void;
32
+ /** Enter opens the record. */
33
+ onOpen?: () => void;
34
+ };
35
+
36
+ export type RecordListProps = ReferenceRecordListProps & {
37
+ /** Rows can be selected by id; each row needs an `id`. See useItemSelection. */
38
+ selection?: ItemSelection;
39
+ onItemContextMenu?: ItemContextMenu;
40
+ };
41
+
42
+ type ReferenceColumn = ReferenceBoardProps["columns"][number];
43
+
44
+ export type BoardProps = Omit<ReferenceBoardProps, "columns"> & {
45
+ columns: (Omit<ReferenceColumn, "cards"> & {
46
+ /** A card's `id` is how the selection and menus name it; its key by default. */
47
+ cards: (ReferenceColumn["cards"][number] & { id?: string })[];
48
+ })[];
49
+ /** Cards can be selected by id. See useItemSelection. */
50
+ selection?: ItemSelection;
51
+ onItemContextMenu?: ItemContextMenu;
52
+ /** Called after a card moves to another column by drag or keyboard. */
53
+ onMove?: (cardKey: string, from: RecordState, to: RecordState) => void;
54
+ onAdd?: (state: RecordState) => void;
55
+ onOpen?: (cardKey: string) => void;
56
+ };
57
+
58
+ export interface TreeNode extends ReferenceTreeNode {
59
+ children?: TreeNode[];
60
+ /** Stable id; the label path by default. */
61
+ id?: string;
62
+ }
63
+
64
+ export type TreeViewProps = Omit<ReferenceTreeViewProps, "nodes"> & {
65
+ nodes: TreeNode[];
66
+ onSelect?: (node: TreeNode) => void;
67
+ };
68
+
69
+ export type BulkActionBarProps = Omit<ReferenceBulkActionBarProps, "actions"> & {
70
+ actions: { label: string; icon?: string; shortcut?: string; onSelect?: () => void }[];
71
+ onClear?: () => void;
72
+ /** Shows the overflow button, which calls it; without it the button is left out. */
73
+ onMore?: () => void;
74
+ /**
75
+ * Announces the count as it changes; true by default. Pass false when the selection already
76
+ * announces it (a selectable DataTable does), so screen readers hear it once.
77
+ */
78
+ announce?: boolean;
79
+ };
80
+
81
+ export type ActivityFeedItemProps = ReferenceActivityFeedItemProps & {
82
+ onReact?: (label: string) => void;
83
+ };
84
+
85
+ export type StatTileProps = ReferenceStatTileProps & {
86
+ onDrill?: () => void;
87
+ /** Recent values drawn as a sparkline; blanks are gaps. */
88
+ trend?: (number | null)[];
89
+ };
90
+
91
+ export type Card = BoardProps["columns"][number]["cards"][number];
92
+
93
+ export interface FlatNode {
94
+ node: TreeNode;
95
+ id: string;
96
+ depth: number;
97
+ parent: string | null;
98
+ hasChildren: boolean;
99
+ }
@@ -0,0 +1,3 @@
1
+ # WhatsNew
2
+
3
+ WhatsNew reads from the published changelog inside the Help panel.
@@ -0,0 +1,8 @@
1
+ # WhiteLabelPreview
2
+
3
+ WhiteLabelPreview renders the same screen under two tenant brands to prove theming is token-only.
4
+
5
+ - `sample` is the screen rendered under every brand.
6
+ - Each brand passes token overrides (`accent-default`, optional neutral tint, `radius-*`) and a theme; nothing else changes.
7
+ - Every override must pass the ColorPicker contrast checks before it can be saved.
8
+ - Both tenants in the preview are fictional.