@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,547 @@
1
+ import { useId, useState, type ReactElement } from "react";
2
+ import { scaleBand, scaleLinear } from "@visx/scale";
3
+ import { BarRounded, LinePath } from "@visx/shape";
4
+ import { Group } from "@visx/group";
5
+ import { PatternLines } from "@visx/pattern";
6
+ import type { ChartProps as ReferenceChartProps } from "../types/reference";
7
+ import { cx } from "../lib/cx.ts";
8
+ import { useFormat, useT } from "../lib/context.tsx";
9
+ import { SegmentedControl } from "../Navigation/Navigation.tsx";
10
+ import { ScrollRegion } from "../Layout/Layout.tsx";
11
+
12
+ /**
13
+ * The data chart (bar, line, area and combinations) on visx. Its own module so that the
14
+ * calendar, timeline and list views never load the chart library (A24-009).
15
+ */
16
+
17
+ export type ChartProps = ReferenceChartProps;
18
+
19
+ const SERIES_FILL = [
20
+ cx("fill-viz-cat-1"),
21
+ cx("fill-viz-cat-2"),
22
+ cx("fill-viz-cat-3"),
23
+ cx("fill-viz-cat-4"),
24
+ cx("fill-viz-cat-5"),
25
+ cx("fill-viz-cat-6"),
26
+ cx("fill-viz-cat-7"),
27
+ ];
28
+ const SERIES_STROKE = [
29
+ cx("stroke-viz-cat-1"),
30
+ cx("stroke-viz-cat-2"),
31
+ cx("stroke-viz-cat-3"),
32
+ cx("stroke-viz-cat-4"),
33
+ cx("stroke-viz-cat-5"),
34
+ cx("stroke-viz-cat-6"),
35
+ cx("stroke-viz-cat-7"),
36
+ ];
37
+ const SERIES_VAR = [
38
+ "--color-viz-cat-1",
39
+ "--color-viz-cat-2",
40
+ "--color-viz-cat-3",
41
+ "--color-viz-cat-4",
42
+ "--color-viz-cat-5",
43
+ "--color-viz-cat-6",
44
+ "--color-viz-cat-7",
45
+ ];
46
+ const MARKERS = [
47
+ "circle",
48
+ "square",
49
+ "triangle",
50
+ "diamond",
51
+ "cross",
52
+ "circle-open",
53
+ "square-open",
54
+ ] as const;
55
+
56
+ interface Series {
57
+ name: string;
58
+ values: (number | null)[];
59
+ other?: boolean;
60
+ }
61
+
62
+ /** Seven categorical colors at most: from the eighth series on, the sixth and later fold into one Other series, blank where any part is blank. */
63
+ export function foldSeries(
64
+ series: ChartProps["series"],
65
+ otherLabel: string,
66
+ count: number,
67
+ ): Series[] {
68
+ if (series.length <= 7) return series;
69
+ const rest = series.slice(6);
70
+ return [
71
+ ...series.slice(0, 6),
72
+ {
73
+ name: otherLabel,
74
+ other: true,
75
+ values: Array.from({ length: count }, (_, i) => {
76
+ let sum = 0;
77
+ for (const s of rest) {
78
+ const v = s.values[i];
79
+ if (v === null || v === undefined) return null;
80
+ sum += v;
81
+ }
82
+ return sum;
83
+ }),
84
+ },
85
+ ];
86
+ }
87
+
88
+ function niceStep(raw: number, whole: boolean): number {
89
+ if (whole && raw <= 1) return 1;
90
+ const e = 10 ** Math.floor(Math.log10(raw));
91
+ const f = raw / e;
92
+ const m = f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 && !(whole && e < 10) ? 2.5 : f <= 5 ? 5 : 10;
93
+ return m * e;
94
+ }
95
+
96
+ /**
97
+ * The top of the value axis, which has four steps. Whole-number data (counts, whole amounts, or nothing but zeros)
98
+ * keeps whole-number steps, so an all-zero or small series never reads $0.3 or 1.25 between its ticks.
99
+ */
100
+ export function niceMax(v: number, whole = false): number {
101
+ if (v <= 0) return whole ? 4 : 1;
102
+ const e = 10 ** Math.floor(Math.log10(v));
103
+ const f = v / e;
104
+ const max = (f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 ? 2.5 : f <= 5 ? 5 : 10) * e;
105
+ return whole && !Number.isInteger(max / 4) ? 4 * niceStep(v / 4, true) : max;
106
+ }
107
+
108
+ function Marker({
109
+ kind,
110
+ x,
111
+ y,
112
+ className,
113
+ }: {
114
+ kind: (typeof MARKERS)[number];
115
+ x: number;
116
+ y: number;
117
+ className: string;
118
+ }) {
119
+ const r = 4.5;
120
+ switch (kind) {
121
+ case "square":
122
+ return <rect x={x - r} y={y - r} width={r * 2} height={r * 2} rx={1} className={className} />;
123
+ case "triangle":
124
+ return (
125
+ <path
126
+ d={`M${x} ${y - r - 1} L${x + r + 1} ${y + r} L${x - r - 1} ${y + r} Z`}
127
+ className={className}
128
+ />
129
+ );
130
+ case "diamond":
131
+ return (
132
+ <path
133
+ d={`M${x} ${y - r - 1} L${x + r + 1} ${y} L${x} ${y + r + 1} L${x - r - 1} ${y} Z`}
134
+ className={className}
135
+ />
136
+ );
137
+ case "cross":
138
+ return (
139
+ <path
140
+ d={`M${x - r} ${y} H${x + r} M${x} ${y - r} V${y + r}`}
141
+ className={cx(className, "fill-none")}
142
+ strokeWidth={2.5}
143
+ />
144
+ );
145
+ case "circle-open":
146
+ return (
147
+ <circle cx={x} cy={y} r={r} className={cx(className, "fill-bg-canvas")} strokeWidth={2} />
148
+ );
149
+ case "square-open":
150
+ return (
151
+ <rect
152
+ x={x - r}
153
+ y={y - r}
154
+ width={r * 2}
155
+ height={r * 2}
156
+ rx={1}
157
+ className={cx(className, "fill-bg-canvas")}
158
+ strokeWidth={2}
159
+ />
160
+ );
161
+ default:
162
+ return <circle cx={x} cy={y} r={r} className={className} />;
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Bar and line charts on Visx with one y-axis, a legend for two or more series and a table view one
168
+ * click away. Every series differs by a second encoding (texture or marker); missing values are gaps.
169
+ */
170
+ export function Chart({
171
+ type,
172
+ title,
173
+ subtitle,
174
+ categoryLabel,
175
+ categories,
176
+ series: given,
177
+ format = "number",
178
+ currency,
179
+ width = 640,
180
+ height = 260,
181
+ }: ChartProps): ReactElement {
182
+ const t = useT();
183
+ const fmt = useFormat();
184
+ const uid = useId().replace(/:/g, "");
185
+ const [view, setView] = useState("chart");
186
+ const [hover, setHover] = useState<{
187
+ x: number;
188
+ y: number;
189
+ s: string;
190
+ c: string;
191
+ v: number;
192
+ } | null>(null);
193
+ const series = foldSeries(given, t("chart.other"), categories.length);
194
+ const fill = (s: Series, i: number) => (s.other ? cx("fill-viz-other") : (SERIES_FILL[i] ?? ""));
195
+ const stroke = (s: Series, i: number) =>
196
+ s.other ? cx("stroke-viz-other") : (SERIES_STROKE[i] ?? "");
197
+ const colorVar = (s: Series, i: number) =>
198
+ `var(${s.other ? "--color-viz-other" : (SERIES_VAR[i] ?? "--color-viz-other")})`;
199
+ const value = (v: number) => (format === "money" ? fmt.currency(v, currency) : fmt.number(v));
200
+ const pl = 60;
201
+ const pr = type === "line" && series.length <= 4 ? 96 : 16;
202
+ const pt = 12;
203
+ const pb = 32;
204
+ const innerW = width - pl - pr;
205
+ const innerH = height - pt - pb;
206
+ const all = series.flatMap((s) =>
207
+ s.values.filter((v): v is number => v !== null && v !== undefined),
208
+ );
209
+ const max = niceMax(
210
+ Math.max(0, ...all),
211
+ all.every((v) => Number.isInteger(v)),
212
+ );
213
+ const x = scaleBand({ domain: categories, range: [0, innerW], padding: 0.3 });
214
+ const y = scaleLinear({ domain: [0, max], range: [innerH, 0] });
215
+ const ticks = [0, 0.25, 0.5, 0.75, 1].map((f) => f * max);
216
+ const band = x.bandwidth();
217
+ const gap = 2;
218
+ const barW = Math.min(28, (band - gap * (series.length - 1)) / series.length);
219
+
220
+ const table = (
221
+ <ScrollRegion label={title}>
222
+ <table className="w-full border-collapse text-text-13">
223
+ <caption className="sr-only">{title}</caption>
224
+ <thead>
225
+ <tr>
226
+ <th
227
+ scope="col"
228
+ className="h-control-lg px-12 text-start font-medium text-text-12 text-text-secondary bg-bg-surface border-b border-border-subtle"
229
+ >
230
+ {categoryLabel}
231
+ </th>
232
+ {series.map((s) => (
233
+ <th
234
+ key={s.name}
235
+ scope="col"
236
+ className="h-control-lg px-12 text-end font-medium text-text-12 text-text-secondary bg-bg-surface border-b border-border-subtle"
237
+ >
238
+ {s.name}
239
+ </th>
240
+ ))}
241
+ </tr>
242
+ </thead>
243
+ <tbody>
244
+ {categories.map((c, ci) => (
245
+ <tr key={c}>
246
+ <th
247
+ scope="row"
248
+ className="h-row-default px-12 text-start font-regular border-b border-border-subtle"
249
+ >
250
+ {c}
251
+ </th>
252
+ {series.map((s) => {
253
+ const v = s.values[ci];
254
+ return (
255
+ <td
256
+ key={s.name}
257
+ className="h-row-default px-12 text-end border-b border-border-subtle tabular-nums"
258
+ >
259
+ {v === null || v === undefined ? (
260
+ <span className="text-text-secondary">{t("chart.noValue")}</span>
261
+ ) : (
262
+ value(v)
263
+ )}
264
+ </td>
265
+ );
266
+ })}
267
+ </tr>
268
+ ))}
269
+ </tbody>
270
+ </table>
271
+ </ScrollRegion>
272
+ );
273
+
274
+ return (
275
+ <figure className="flex flex-col gap-12 m-0 max-w-(--layout-reading)">
276
+ <div className="flex flex-wrap items-start justify-between gap-12">
277
+ <figcaption className="flex flex-col">
278
+ <strong id={`${uid}-title`} className="font-semibold">
279
+ {title}
280
+ </strong>
281
+ <span id={`${uid}-hint`} className="sr-only">
282
+ {t("chart.tableHint")}
283
+ </span>
284
+ {subtitle ? <span className="text-text-secondary">{subtitle}</span> : null}
285
+ </figcaption>
286
+ <SegmentedControl
287
+ label={t("chart.view")}
288
+ value={view}
289
+ onChange={setView}
290
+ options={[
291
+ { value: "chart", label: t("chart.chart"), icon: "ChartColumn" },
292
+ { value: "table", label: t("chart.table"), icon: "Table" },
293
+ ]}
294
+ />
295
+ </div>
296
+ {series.length > 1 ? (
297
+ <ul
298
+ aria-label={t("chart.legend")}
299
+ className="flex flex-wrap gap-x-16 gap-y-4 m-0 p-0 list-none text-text-12 text-text-secondary"
300
+ >
301
+ {series.map((s, si) => (
302
+ <li key={s.name} className="flex items-center gap-6">
303
+ <svg width={14} height={14} viewBox="0 0 14 14" aria-hidden="true">
304
+ {type === "line" ? (
305
+ <Marker
306
+ kind={MARKERS[si] ?? "circle"}
307
+ x={7}
308
+ y={7}
309
+ className={cx(fill(s, si), stroke(s, si))}
310
+ />
311
+ ) : (
312
+ <rect
313
+ x={1}
314
+ y={1}
315
+ width={12}
316
+ height={12}
317
+ rx={3}
318
+ className={cx(fill(s, si), si % 2 ? "opacity-50" : undefined)}
319
+ />
320
+ )}
321
+ </svg>
322
+ {s.name}
323
+ </li>
324
+ ))}
325
+ </ul>
326
+ ) : null}
327
+ {view === "table" ? (
328
+ table
329
+ ) : (
330
+ <div className="relative">
331
+ <svg
332
+ viewBox={`0 0 ${width} ${height}`}
333
+ width="100%"
334
+ role="group"
335
+ aria-labelledby={`${uid}-title ${uid}-hint`}
336
+ >
337
+ <defs>
338
+ {series.map((s, si) =>
339
+ si % 2 ? (
340
+ <PatternLines
341
+ key={s.name}
342
+ id={`${uid}-tex-${si}`}
343
+ width={6}
344
+ height={6}
345
+ stroke={colorVar(s, si)}
346
+ strokeWidth={2.5}
347
+ orientation={["diagonal"]}
348
+ background="transparent"
349
+ />
350
+ ) : null,
351
+ )}
352
+ </defs>
353
+ <Group left={pl} top={pt}>
354
+ {ticks.map((tv) => (
355
+ <g key={tv}>
356
+ <line
357
+ x1={0}
358
+ x2={innerW}
359
+ y1={y(tv)}
360
+ y2={y(tv)}
361
+ className={tv === 0 ? "stroke-border-control" : "stroke-border-subtle"}
362
+ />
363
+ <text
364
+ x={-8}
365
+ y={y(tv) + 4}
366
+ textAnchor="end"
367
+ className="fill-text-secondary text-text-11 tabular-nums"
368
+ >
369
+ {fmt.compact(tv, format === "money" ? (currency ?? "USD") : undefined)}
370
+ </text>
371
+ </g>
372
+ ))}
373
+ {categories.map((c) => (
374
+ <text
375
+ key={c}
376
+ x={(x(c) ?? 0) + band / 2}
377
+ y={innerH + 22}
378
+ textAnchor="middle"
379
+ className="fill-text-secondary text-text-11"
380
+ >
381
+ {c}
382
+ </text>
383
+ ))}
384
+ {type === "line"
385
+ ? series.map((s, si) => {
386
+ const pts = s.values
387
+ .map((v, i) => ({ v, i }))
388
+ .filter(
389
+ (p): p is { v: number; i: number } => p.v !== null && p.v !== undefined,
390
+ );
391
+ const cls = cx(fill(s, si), stroke(s, si));
392
+ return (
393
+ <g key={s.name}>
394
+ <LinePath
395
+ data={s.values.map((v, i) => ({ v, i }))}
396
+ x={(p) => (x(categories[p.i] ?? "") ?? 0) + band / 2}
397
+ y={(p) => y(p.v ?? 0)}
398
+ defined={(p) => p.v !== null && p.v !== undefined}
399
+ className={cx("fill-none", stroke(s, si))}
400
+ strokeWidth={2}
401
+ strokeLinejoin="round"
402
+ strokeLinecap="round"
403
+ strokeDasharray={si % 2 ? "6 4" : undefined}
404
+ />
405
+ {pts.map((p) => {
406
+ const cx0 = (x(categories[p.i] ?? "") ?? 0) + band / 2;
407
+ const cy0 = y(p.v);
408
+ const show = () =>
409
+ setHover({
410
+ x: cx0 + pl,
411
+ y: cy0 + pt,
412
+ s: s.name,
413
+ c: categories[p.i] ?? "",
414
+ v: p.v,
415
+ });
416
+ return (
417
+ <g
418
+ key={p.i}
419
+ role="img"
420
+ tabIndex={0}
421
+ aria-label={t("chart.point", {
422
+ series: s.name,
423
+ category: categories[p.i] ?? "",
424
+ value: value(p.v),
425
+ })}
426
+ onMouseEnter={show}
427
+ onFocus={show}
428
+ onMouseLeave={() => setHover(null)}
429
+ onBlur={() => setHover(null)}
430
+ className="outline-none focus-visible:[&>circle:last-child]:stroke-focus-ring"
431
+ >
432
+ <Marker
433
+ kind={MARKERS[si] ?? "circle"}
434
+ x={cx0}
435
+ y={cy0}
436
+ className={cls}
437
+ />
438
+ <circle
439
+ cx={cx0}
440
+ cy={cy0}
441
+ r={12}
442
+ className="fill-transparent"
443
+ strokeWidth={2}
444
+ />
445
+ </g>
446
+ );
447
+ })}
448
+ {pr > 16 && pts.length ? (
449
+ <text
450
+ x={
451
+ (x(categories[pts[pts.length - 1]?.i ?? 0] ?? "") ?? 0) +
452
+ band / 2 +
453
+ 10
454
+ }
455
+ y={y(pts[pts.length - 1]?.v ?? 0) + 4}
456
+ className="fill-text-primary text-text-11 font-medium"
457
+ >
458
+ {s.name}
459
+ </text>
460
+ ) : null}
461
+ </g>
462
+ );
463
+ })
464
+ : series.map((s, si) => (
465
+ <g key={s.name}>
466
+ {s.values.map((v, i) => {
467
+ if (v === null || v === undefined) return null;
468
+ const bx =
469
+ (x(categories[i] ?? "") ?? 0) +
470
+ (band - (barW * series.length + gap * (series.length - 1))) / 2 +
471
+ si * (barW + gap);
472
+ const top = y(v);
473
+ const h = innerH - top;
474
+ const show = () =>
475
+ setHover({
476
+ x: bx + barW / 2 + pl,
477
+ y: top + pt,
478
+ s: s.name,
479
+ c: categories[i] ?? "",
480
+ v,
481
+ });
482
+ return (
483
+ <g
484
+ key={i}
485
+ role="img"
486
+ tabIndex={0}
487
+ aria-label={t("chart.point", {
488
+ series: s.name,
489
+ category: categories[i] ?? "",
490
+ value: value(v),
491
+ })}
492
+ onMouseEnter={show}
493
+ onFocus={show}
494
+ onMouseLeave={() => setHover(null)}
495
+ onBlur={() => setHover(null)}
496
+ className="outline-none focus-visible:[&>rect]:stroke-focus-ring"
497
+ >
498
+ <BarRounded
499
+ x={bx}
500
+ y={top}
501
+ width={barW}
502
+ height={h}
503
+ radius={Math.min(4, h)}
504
+ top
505
+ className={cx(
506
+ fill(s, si),
507
+ si % 2 === 1 && stroke(s, si),
508
+ "hover:brightness-110",
509
+ )}
510
+ {...(si % 2
511
+ ? { fill: `url(#${uid}-tex-${si})`, strokeWidth: 1.5 }
512
+ : {})}
513
+ />
514
+ <rect
515
+ x={bx - 2}
516
+ y={0}
517
+ width={barW + 4}
518
+ height={innerH}
519
+ className="fill-transparent"
520
+ strokeWidth={2}
521
+ />
522
+ </g>
523
+ );
524
+ })}
525
+ </g>
526
+ ))}
527
+ </Group>
528
+ </svg>
529
+ {hover ? (
530
+ <div
531
+ role="status"
532
+ className="absolute z-tooltip flex flex-col px-8 py-6 whitespace-nowrap pointer-events-none rounded-control bg-bg-raised shadow-menu text-text-12 -translate-x-1/2 -translate-y-[calc(100%+var(--space-8))] rtl:translate-x-1/2"
533
+ style={{
534
+ insetInlineStart: `${(hover.x / width) * 100}%`,
535
+ insetBlockStart: `${(hover.y / height) * 100}%`,
536
+ }}
537
+ >
538
+ <strong className="font-semibold">{hover.s}</strong>
539
+ <span className="text-text-secondary">{hover.c}</span>
540
+ <span className="tabular-nums">{value(hover.v)}</span>
541
+ </div>
542
+ ) : null}
543
+ </div>
544
+ )}
545
+ </figure>
546
+ );
547
+ }
@@ -0,0 +1,20 @@
1
+ export {
2
+ type GalleryProps,
3
+ type CalendarProps,
4
+ type TimelineProps,
5
+ type TimelineChange,
6
+ type TimelineLink,
7
+ type TimelinePreview,
8
+ type TimelineCategory,
9
+ type TimelineSegment,
10
+ type ResourceScheduleProps,
11
+ type OrgChartProps,
12
+ } from "./Charts.types.ts";
13
+ export { Gallery } from "./Gallery.tsx";
14
+ export { Calendar } from "./Calendar.tsx";
15
+ export { Timeline, dayAtPointer, RECORD_MIME } from "./Timeline.tsx";
16
+ export { ResourceSchedule } from "./ResourceSchedule.tsx";
17
+ export { OrgChart } from "./OrgChart.tsx";
18
+ export { Sparkline, type SparklineProps } from "./Sparkline.tsx";
19
+ export { Chart, foldSeries, type ChartProps } from "./Chart.tsx";
20
+ export { Heatmap, type HeatmapProps } from "./Heatmap.tsx";
@@ -0,0 +1,40 @@
1
+ import type {
2
+ CalendarProps as ReferenceCalendarProps,
3
+ GalleryProps as ReferenceGalleryProps,
4
+ OrgChartProps as ReferenceOrgChartProps,
5
+ ResourceScheduleProps as ReferenceResourceScheduleProps,
6
+ TimelineCategory as ReferenceTimelineCategory,
7
+ TimelineChange as ReferenceTimelineChange,
8
+ TimelineLink as ReferenceTimelineLink,
9
+ TimelinePreview as ReferenceTimelinePreview,
10
+ TimelineProps as ReferenceTimelineProps,
11
+ TimelineSegment as ReferenceTimelineSegment,
12
+ } from "../types/reference";
13
+ import type { ItemSelection } from "../lib/selection.ts";
14
+ import type { ItemContextMenu } from "../Views/Views.types.ts";
15
+
16
+ export type GalleryProps = ReferenceGalleryProps;
17
+
18
+ type CalendarEvent = ReferenceCalendarProps["events"][number] & {
19
+ /** How the selection, menus and hover cards name the event (`data-item`). */
20
+ id?: string;
21
+ };
22
+
23
+ export type CalendarProps = Omit<ReferenceCalendarProps, "events"> & {
24
+ events: CalendarEvent[];
25
+ onEventSelect?: (event: CalendarEvent) => void;
26
+ /** Events with an `id` can be selected. See useItemSelection. */
27
+ selection?: ItemSelection;
28
+ onItemContextMenu?: ItemContextMenu;
29
+ };
30
+
31
+ export type TimelineProps = ReferenceTimelineProps;
32
+ export type TimelineChange = ReferenceTimelineChange;
33
+ export type TimelineLink = ReferenceTimelineLink;
34
+ export type TimelinePreview = ReferenceTimelinePreview;
35
+ export type TimelineCategory = ReferenceTimelineCategory;
36
+ export type TimelineSegment = ReferenceTimelineSegment;
37
+
38
+ export type ResourceScheduleProps = ReferenceResourceScheduleProps;
39
+
40
+ export type OrgChartProps = ReferenceOrgChartProps;
@@ -0,0 +1,25 @@
1
+ import { Children, isValidElement, type CSSProperties, type ReactElement } from "react";
2
+ import { type GalleryProps } from "./Charts.types.ts";
3
+
4
+ /** Cards on an auto-filling grid; `min` sets the smallest card width in pixels (240 by default). */
5
+ export function Gallery({ label, min, children }: GalleryProps): ReactElement {
6
+ const items = Children.toArray(children).filter((c) => !(typeof c === "string" && !c.trim()));
7
+ const style = {
8
+ "--xos-gallery-min":
9
+ min === undefined ? "calc(var(--space-40) * 6)" : `calc(var(--space-4) * ${min / 4})`,
10
+ } as CSSProperties;
11
+ return (
12
+ <div
13
+ role="list"
14
+ aria-label={label}
15
+ style={style}
16
+ className="grid grid-cols-[repeat(auto-fill,minmax(min(var(--xos-gallery-min),100%),1fr))] gap-16"
17
+ >
18
+ {items.map((child, i) => (
19
+ <div role="listitem" key={isValidElement(child) && child.key !== null ? child.key : i}>
20
+ {child}
21
+ </div>
22
+ ))}
23
+ </div>
24
+ );
25
+ }