@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,32 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { buttonClass } from "../Button/button-class.ts";
4
+ import { Icon } from "../Icon/Icon.tsx";
5
+ import { type ButtonLinkProps } from "./Marketing.types.ts";
6
+
7
+ /**
8
+ * A link drawn as a Button, for calls to action that navigate. Button stays for actions that happen
9
+ * in place; `xl` is the 44 px call to action size on public pages.
10
+ */
11
+ export function ButtonLink({
12
+ variant = "secondary",
13
+ size = "md",
14
+ icon,
15
+ trailingIcon,
16
+ external = false,
17
+ className,
18
+ children,
19
+ ...rest
20
+ }: ButtonLinkProps): ReactElement {
21
+ return (
22
+ <a
23
+ {...rest}
24
+ {...(external ? { target: "_blank", rel: "noopener noreferrer" } : {})}
25
+ className={cx(buttonClass(variant, size), "box-border no-underline", className)}
26
+ >
27
+ {icon ? <Icon name={icon} size={14} /> : null}
28
+ {children}
29
+ {trailingIcon ? <Icon name={trailingIcon} size={14} /> : null}
30
+ </a>
31
+ );
32
+ }
@@ -0,0 +1,47 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, useState, type ReactElement } from "react";
4
+ import { useT } from "../lib/context.tsx";
5
+ import { Button } from "../Button/Button.tsx";
6
+ import { type CodeSampleProps } from "./Marketing.types.ts";
7
+
8
+ /** How long the copy button shows its confirmation, in milliseconds. */
9
+ const COPIED_FOR = 2000;
10
+
11
+ /**
12
+ * A labeled block of code with a copy button. The copy is announced, and when the clipboard is
13
+ * unavailable the text stays selectable in a focusable, scrollable region.
14
+ */
15
+ export function CodeSample({ label, code }: CodeSampleProps): ReactElement {
16
+ const t = useT();
17
+ const [copied, setCopied] = useState(false);
18
+ const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
19
+ useEffect(() => () => clearTimeout(timer.current), []);
20
+
21
+ const copy = () => {
22
+ const confirm = () => {
23
+ setCopied(true);
24
+ clearTimeout(timer.current);
25
+ timer.current = setTimeout(() => setCopied(false), COPIED_FOR);
26
+ };
27
+ // A frame without clipboard access, or a refused write, leaves the text selectable.
28
+ void navigator.clipboard?.writeText(code).then(confirm, () => undefined);
29
+ };
30
+
31
+ return (
32
+ <div className="xos-mkt-code">
33
+ <div className="xos-mkt-code-bar">
34
+ <span className="xos-mkt-label">{label}</span>
35
+ <Button size="sm" variant="ghost" icon={copied ? "Check" : "Copy"} onClick={copy}>
36
+ {t("mk.code.copy")}
37
+ </Button>
38
+ <span className="sr-only" role="status" aria-live="polite">
39
+ {copied ? t("mk.code.copied") : ""}
40
+ </span>
41
+ </div>
42
+ <pre tabIndex={0} role="region" aria-label={label}>
43
+ <code>{code}</code>
44
+ </pre>
45
+ </div>
46
+ );
47
+ }
@@ -0,0 +1,7 @@
1
+ "use client";
2
+
3
+ /**
4
+ * The scroll region of ComparisonTable, as its own client module. ScrollRegion measures its
5
+ * overflow, so it runs in the browser; the table around it renders on the server (ADR 0027).
6
+ */
7
+ export { ScrollRegion as ComparisonScroll } from "../Layout/ScrollRegion.tsx";
@@ -0,0 +1,104 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { Icon } from "../Icon/Icon.tsx";
4
+ import { ComparisonScroll } from "./ComparisonScroll.tsx";
5
+ import { marketingCopy } from "./marketing-copy.ts";
6
+ import { type ComparisonTableProps, type ComparisonValue } from "./Marketing.types.ts";
7
+
8
+ const CELL: Record<ComparisonValue, { icon: string; key: string }> = {
9
+ yes: { icon: "CircleCheck", key: "mk.cmp.yes" },
10
+ partial: { icon: "CircleDot", key: "mk.cmp.partial" },
11
+ no: { icon: "CircleMinus", key: "mk.cmp.no" },
12
+ unpublished: { icon: "CircleDashed", key: "mk.cmp.unpublished" },
13
+ };
14
+
15
+ /**
16
+ * A like-for-like comparison in a real table. Every cell carries a word beside its icon, the
17
+ * caption states when the cells were last verified, and a cell may link to its source. Explicit
18
+ * roles keep the table a table when it stacks into cards below bp-md.
19
+ */
20
+ export function ComparisonTable({
21
+ caption,
22
+ verified,
23
+ featureLabel,
24
+ columns,
25
+ rows,
26
+ footnote,
27
+ locale,
28
+ messages,
29
+ }: ComparisonTableProps): ReactElement {
30
+ const { t } = marketingCopy({ locale, messages });
31
+ return (
32
+ <div className="xos-mkt-cmp">
33
+ <ComparisonScroll label={caption}>
34
+ <table className="xos-mkt-cmp-table" role="table">
35
+ <caption>
36
+ <span>{caption}</span>
37
+ {verified ? (
38
+ <span className="xos-mkt-cmp-verified">
39
+ {t("mk.cmp.verified", { date: verified })}
40
+ </span>
41
+ ) : null}
42
+ </caption>
43
+ <thead role="rowgroup">
44
+ <tr role="row">
45
+ <th scope="col" role="columnheader">
46
+ {featureLabel ?? t("mk.cmp.feature")}
47
+ </th>
48
+ {columns.map((column) => (
49
+ <th
50
+ key={column.name}
51
+ scope="col"
52
+ role="columnheader"
53
+ className={column.highlight ? "xos-mkt-cmp-own" : undefined}
54
+ >
55
+ {column.name}
56
+ </th>
57
+ ))}
58
+ </tr>
59
+ </thead>
60
+ <tbody role="rowgroup">
61
+ {rows.map((row) => (
62
+ <tr key={row.feature} role="row">
63
+ <th scope="row" role="rowheader">
64
+ {row.feature}
65
+ </th>
66
+ {row.cells.map((cell, index) => {
67
+ const column = columns[index];
68
+ const mark = CELL[cell.value] ?? CELL.unpublished;
69
+ return (
70
+ <td
71
+ key={column?.name ?? index}
72
+ role="cell"
73
+ data-label={column?.name}
74
+ className={column?.highlight ? "xos-mkt-cmp-own" : undefined}
75
+ >
76
+ <span
77
+ className={cx(
78
+ "xos-mkt-cmp-cell",
79
+ cell.value === "yes" && "xos-mkt-cmp-yes",
80
+ cell.value === "partial" && "xos-mkt-cmp-partial",
81
+ cell.value === "no" && "xos-mkt-cmp-no",
82
+ cell.value === "unpublished" && "xos-mkt-cmp-unpublished",
83
+ )}
84
+ >
85
+ <Icon name={mark.icon} size={14} />
86
+ <span>{cell.text ?? t(mark.key)}</span>
87
+ </span>
88
+ {cell.source ? (
89
+ <a className="xos-mkt-cmp-src" href={cell.source.href}>
90
+ {cell.source.label}
91
+ </a>
92
+ ) : null}
93
+ </td>
94
+ );
95
+ })}
96
+ </tr>
97
+ ))}
98
+ </tbody>
99
+ </table>
100
+ </ComparisonScroll>
101
+ {footnote ? <p className="xos-mkt-note">{footnote}</p> : null}
102
+ </div>
103
+ );
104
+ }
@@ -0,0 +1,26 @@
1
+ import { type ReactElement } from "react";
2
+ import { Icon } from "../Icon/Icon.tsx";
3
+ import { type FAQProps } from "./Marketing.types.ts";
4
+
5
+ /**
6
+ * Questions and answers on native disclosure elements, so every answer stays in the document
7
+ * while closed and the list works without script.
8
+ */
9
+ export function FAQ({ headingLevel = 3, items }: FAQProps): ReactElement {
10
+ const Heading = `h${headingLevel}` as const;
11
+ return (
12
+ <div className="xos-mkt-faq">
13
+ {items.map((item) => (
14
+ <details key={item.q} {...(item.open ? { open: true } : {})}>
15
+ <summary>
16
+ <Icon name="ChevronRight" size={14} />
17
+ <Heading>{item.q}</Heading>
18
+ </summary>
19
+ <div className="xos-mkt-faq-body">
20
+ {typeof item.a === "string" ? <p>{item.a}</p> : item.a}
21
+ </div>
22
+ </details>
23
+ ))}
24
+ </div>
25
+ );
26
+ }
@@ -0,0 +1,65 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { Icon } from "../Icon/Icon.tsx";
4
+ import { DepartmentGlyph } from "../Glyphs/Glyphs.tsx";
5
+ import { codeClass } from "../Chips/codeClass.tsx";
6
+ import { cardClass } from "../Surface/Surface.tsx";
7
+ import { linkClass } from "../Link/link-class.ts";
8
+ import { marketingCopy } from "./marketing-copy.ts";
9
+ import { type FeatureGridProps } from "./Marketing.types.ts";
10
+
11
+ /**
12
+ * Cards in a grid. An item with a department code draws that department's glyph and prints the
13
+ * code beside the name. An external link opens a new tab and says so.
14
+ */
15
+ export function FeatureGrid({
16
+ columns = 3,
17
+ headingLevel = 3,
18
+ items,
19
+ locale,
20
+ messages,
21
+ }: FeatureGridProps): ReactElement {
22
+ const { t } = marketingCopy({ locale, messages });
23
+ const Heading = `h${headingLevel}` as const;
24
+ return (
25
+ <ul
26
+ className={cx(
27
+ "xos-mkt-grid",
28
+ columns === 3 && "xos-mkt-grid-3",
29
+ columns === 4 && "xos-mkt-grid-4",
30
+ columns === 5 && "xos-mkt-grid-5",
31
+ )}
32
+ >
33
+ {items.map((item) => (
34
+ <li key={item.title} className={cx(cardClass, "xos-mkt-feature")}>
35
+ <div className="xos-mkt-feature-head">
36
+ {item.code ? (
37
+ <span className="xos-mkt-tile" aria-hidden="true">
38
+ <DepartmentGlyph code={item.code} size={16} />
39
+ </span>
40
+ ) : item.icon ? (
41
+ <span className="xos-mkt-tile" aria-hidden="true">
42
+ <Icon name={item.icon} size={16} />
43
+ </span>
44
+ ) : null}
45
+ <Heading>{item.title}</Heading>
46
+ {item.code ? <span className={codeClass}>{item.code}</span> : null}
47
+ </div>
48
+ {item.body ? <p>{item.body}</p> : null}
49
+ {item.link ? (
50
+ <a
51
+ href={item.link.href}
52
+ {...(item.link.external ? { target: "_blank", rel: "noopener noreferrer" } : {})}
53
+ className={cx(linkClass, "xos-mkt-feature-link")}
54
+ >
55
+ {item.link.label}
56
+ {item.link.external ? (
57
+ <Icon name="ExternalLink" size={12} label={t("link.newTab")} />
58
+ ) : null}
59
+ </a>
60
+ ) : null}
61
+ </li>
62
+ ))}
63
+ </ul>
64
+ );
65
+ }
@@ -0,0 +1,52 @@
1
+ import { type ReactElement } from "react";
2
+ import { Icon } from "../Icon/Icon.tsx";
3
+ import { PhaseGlyph } from "../Glyphs/Glyphs.tsx";
4
+ import { marketingCopy } from "./marketing-copy.ts";
5
+ import { type GateLifecycleRailProps } from "./Marketing.types.ts";
6
+
7
+ /** The nine gates in three acts. A gate reads "Gate 3 · Advance": the number never stands alone. */
8
+ export function GateLifecycleRail({
9
+ label,
10
+ acts,
11
+ locale,
12
+ messages,
13
+ }: GateLifecycleRailProps): ReactElement {
14
+ const { t } = marketingCopy({ locale, messages });
15
+ return (
16
+ <ol className="xos-mkt-rail" aria-label={label}>
17
+ {acts.map((act) => (
18
+ <li key={act.name} className="xos-mkt-act">
19
+ <p className="xos-mkt-act-name">
20
+ <strong>{act.name}</strong>
21
+ {act.range ? <span>{act.range}</span> : null}
22
+ </p>
23
+ <ol className="xos-mkt-gates" start={act.gates[0]?.n}>
24
+ {act.gates.map((gate) => (
25
+ <li key={gate.n} className="xos-mkt-gate">
26
+ <div className="xos-mkt-gate-head">
27
+ <span className="xos-mkt-tile" aria-hidden="true">
28
+ <PhaseGlyph code={gate.code} size={16} />
29
+ </span>
30
+ <span className="xos-mkt-gate-name">
31
+ <span>{t("phase.gate", { n: gate.n })}</span>
32
+ <span className="xos-mkt-sep" aria-hidden="true">
33
+ ·
34
+ </span>
35
+ <strong>{gate.name}</strong>
36
+ </span>
37
+ </div>
38
+ {gate.summary ? <p>{gate.summary}</p> : null}
39
+ {gate.evidence ? (
40
+ <p className="xos-mkt-gate-evidence">
41
+ <Icon name="FileCheck" size={14} />
42
+ <span>{gate.evidence}</span>
43
+ </p>
44
+ ) : null}
45
+ </li>
46
+ ))}
47
+ </ol>
48
+ </li>
49
+ ))}
50
+ </ol>
51
+ );
52
+ }
@@ -0,0 +1,53 @@
1
+ import { type ReactElement } from "react";
2
+ import { BrandMark } from "../BrandMark/BrandMark.tsx";
3
+ import { BrandSlotFrame } from "../Identity/BrandSlotFrame.tsx";
4
+ import { marketingCopy } from "./marketing-copy.ts";
5
+ import { type LogoSlotWallProps } from "./Marketing.types.ts";
6
+
7
+ const SLOT = { width: 160, height: 40 } as const;
8
+
9
+ /**
10
+ * Customer marks. With no logos and no slots it renders nothing, so a page ships without it until
11
+ * a customer consents in writing.
12
+ */
13
+ export function LogoSlotWall({
14
+ label,
15
+ title,
16
+ logos = [],
17
+ slots = 0,
18
+ disclosure,
19
+ locale,
20
+ messages,
21
+ }: LogoSlotWallProps): ReactElement | null {
22
+ const { t } = marketingCopy({ locale, messages });
23
+ if (logos.length === 0 && slots <= 0) return null;
24
+ return (
25
+ <div className="xos-mkt-logos">
26
+ {title ? <p className="xos-mkt-label">{title}</p> : null}
27
+ <ul aria-label={label}>
28
+ {logos.map((logo) => (
29
+ <li key={logo.name}>
30
+ <BrandMark
31
+ name={logo.name}
32
+ size="lg"
33
+ {...(logo.logoLight === undefined ? {} : { logoLight: logo.logoLight })}
34
+ {...(logo.logoDark === undefined ? {} : { logoDark: logo.logoDark })}
35
+ />
36
+ </li>
37
+ ))}
38
+ {Array.from({ length: slots }, (_, index) => (
39
+ <li key={`slot-${index}`}>
40
+ <BrandSlotFrame
41
+ label={t("mk.logo.slot", { n: index + 1 })}
42
+ width={SLOT.width}
43
+ height={SLOT.height}
44
+ formats="SVG"
45
+ sizeLabel={t("brand.size", SLOT)}
46
+ />
47
+ </li>
48
+ ))}
49
+ </ul>
50
+ {disclosure ? <p className="xos-mkt-note">{disclosure}</p> : null}
51
+ </div>
52
+ );
53
+ }
@@ -0,0 +1,49 @@
1
+ /* The Marketing layer as `@xos/ui` exports it: inside a product shell every component follows the
2
+ nearest XOSProvider. Public pages import from `@xos/ui/marketing` instead (src/marketing.ts). */
3
+ export type {
4
+ MarketingLocaleProps,
5
+ MarketingLink,
6
+ Persona,
7
+ PricingPlan,
8
+ ComparisonValue,
9
+ ButtonLinkProps,
10
+ MarketingNavProps,
11
+ MarketingSectionProps,
12
+ MarketingHeroProps,
13
+ ScreenshotFrameProps,
14
+ PersonaSwitcherProps,
15
+ ProofStatStripProps,
16
+ GateLifecycleRailProps,
17
+ SurfaceTriptychProps,
18
+ FeatureGridProps,
19
+ ComparisonTableProps,
20
+ PriceDisplayProps,
21
+ PricingTableProps,
22
+ FAQProps,
23
+ TestimonialProps,
24
+ LogoSlotWallProps,
25
+ AIDisclosureBadgeProps,
26
+ CodeSampleProps,
27
+ MarketingFooterProps,
28
+ } from "./Marketing.types.ts";
29
+ export { ButtonLink } from "./ButtonLink.tsx";
30
+ export { MarketingNav } from "./MarketingNav.tsx";
31
+ export { MarketingSection } from "./MarketingSection.tsx";
32
+ export { MarketingHero } from "./MarketingHero.tsx";
33
+ export { ScreenshotFrame } from "./ScreenshotFrame.tsx";
34
+ export { PersonaSwitcher } from "./PersonaSwitcher.tsx";
35
+ export { SurfaceTriptych } from "./SurfaceTriptych.tsx";
36
+ export { PricingTable } from "./PricingTable.tsx";
37
+ export { FAQ } from "./FAQ.tsx";
38
+ export { Testimonial } from "./Testimonial.tsx";
39
+ export { CodeSample } from "./CodeSample.tsx";
40
+ export { MarketingFooter } from "./MarketingFooter.tsx";
41
+ export {
42
+ ProofStatStrip,
43
+ GateLifecycleRail,
44
+ FeatureGrid,
45
+ ComparisonTable,
46
+ PriceDisplay,
47
+ LogoSlotWall,
48
+ AIDisclosureBadge,
49
+ } from "./provided.tsx";
@@ -0,0 +1,64 @@
1
+ import type {
2
+ AIDisclosureBadgeProps as ReferenceAIDisclosureBadgeProps,
3
+ ButtonLinkProps as ReferenceButtonLinkProps,
4
+ CodeSampleProps as ReferenceCodeSampleProps,
5
+ ComparisonTableProps as ReferenceComparisonTableProps,
6
+ ComparisonValue as ReferenceComparisonValue,
7
+ FAQProps as ReferenceFAQProps,
8
+ FeatureGridProps as ReferenceFeatureGridProps,
9
+ GateLifecycleRailProps as ReferenceGateLifecycleRailProps,
10
+ LogoSlotWallProps as ReferenceLogoSlotWallProps,
11
+ MarketingFooterProps as ReferenceMarketingFooterProps,
12
+ MarketingHeroProps as ReferenceMarketingHeroProps,
13
+ MarketingLink as ReferenceMarketingLink,
14
+ MarketingNavProps as ReferenceMarketingNavProps,
15
+ MarketingSectionProps as ReferenceMarketingSectionProps,
16
+ Persona as ReferencePersona,
17
+ PersonaSwitcherProps as ReferencePersonaSwitcherProps,
18
+ PriceDisplayProps as ReferencePriceDisplayProps,
19
+ PricingPlan as ReferencePricingPlan,
20
+ PricingTableProps as ReferencePricingTableProps,
21
+ ProofStatStripProps as ReferenceProofStatStripProps,
22
+ ScreenshotFrameProps as ReferenceScreenshotFrameProps,
23
+ SurfaceTriptychProps as ReferenceSurfaceTriptychProps,
24
+ TestimonialProps as ReferenceTestimonialProps,
25
+ } from "../types/reference";
26
+ import type { Messages } from "../lib/i18n.ts";
27
+
28
+ /**
29
+ * The locale of a component rendered without a provider. The Marketing components that hold no
30
+ * state render on the server, where no XOSProvider is in reach, so the page passes its locale and
31
+ * that locale's `ui` messages to each one that prints a shared string or formats a number. Left
32
+ * out, they read what `configure` set, en-US by default.
33
+ */
34
+ export interface MarketingLocaleProps {
35
+ /** BCP 47 locale for the shared strings and Intl formatting. */
36
+ locale?: string;
37
+ /** Flat `ui` messages for that locale, keyed without the namespace; missing keys read en-US. */
38
+ messages?: Messages;
39
+ }
40
+
41
+ export type MarketingLink = ReferenceMarketingLink;
42
+ export type Persona = ReferencePersona;
43
+ export type PricingPlan = ReferencePricingPlan;
44
+ export type ComparisonValue = ReferenceComparisonValue;
45
+
46
+ export type ButtonLinkProps = ReferenceButtonLinkProps;
47
+ export type MarketingNavProps = ReferenceMarketingNavProps;
48
+ export type MarketingSectionProps = ReferenceMarketingSectionProps;
49
+ export type MarketingHeroProps = ReferenceMarketingHeroProps;
50
+ export type ScreenshotFrameProps = ReferenceScreenshotFrameProps;
51
+ export type PersonaSwitcherProps = ReferencePersonaSwitcherProps;
52
+ export type ProofStatStripProps = ReferenceProofStatStripProps & MarketingLocaleProps;
53
+ export type GateLifecycleRailProps = ReferenceGateLifecycleRailProps & MarketingLocaleProps;
54
+ export type SurfaceTriptychProps = ReferenceSurfaceTriptychProps;
55
+ export type FeatureGridProps = ReferenceFeatureGridProps & MarketingLocaleProps;
56
+ export type ComparisonTableProps = ReferenceComparisonTableProps & MarketingLocaleProps;
57
+ export type PriceDisplayProps = ReferencePriceDisplayProps & MarketingLocaleProps;
58
+ export type PricingTableProps = ReferencePricingTableProps;
59
+ export type FAQProps = ReferenceFAQProps;
60
+ export type TestimonialProps = ReferenceTestimonialProps;
61
+ export type LogoSlotWallProps = ReferenceLogoSlotWallProps & MarketingLocaleProps;
62
+ export type AIDisclosureBadgeProps = ReferenceAIDisclosureBadgeProps & MarketingLocaleProps;
63
+ export type CodeSampleProps = ReferenceCodeSampleProps;
64
+ export type MarketingFooterProps = ReferenceMarketingFooterProps;
@@ -0,0 +1,88 @@
1
+ "use client";
2
+
3
+ import { useState, type ReactElement } from "react";
4
+ import { useT } from "../lib/context.tsx";
5
+ import { applyTheme, isThemePreference } from "../lib/theme.ts";
6
+ import { Select } from "../Forms/Select.tsx";
7
+ import { SegmentedControl } from "../Navigation/SegmentedControl.tsx";
8
+ import { type MarketingFooterProps } from "./Marketing.types.ts";
9
+
10
+ /**
11
+ * The footer of a public page: brand, link columns, the legal line, and the language and theme
12
+ * controls. Without `onTheme` the theme control applies the choice to the document root.
13
+ */
14
+ export function MarketingFooter({
15
+ brand,
16
+ tagline,
17
+ label,
18
+ columns,
19
+ legal,
20
+ locales,
21
+ locale,
22
+ onLocale,
23
+ themes = true,
24
+ theme = "dark",
25
+ onTheme,
26
+ }: MarketingFooterProps): ReactElement {
27
+ const t = useT();
28
+ const [current, setCurrent] = useState<string>(theme);
29
+ const setTheme = (next: string) => {
30
+ setCurrent(next);
31
+ if (onTheme) onTheme(next);
32
+ else if (isThemePreference(next)) applyTheme(next);
33
+ };
34
+ return (
35
+ <footer className="xos-mkt-footer">
36
+ <div className="xos-mkt-wrap">
37
+ <div className="xos-mkt-footer-top">
38
+ <div className="xos-mkt-footer-brand">
39
+ {brand}
40
+ {tagline ? <p>{tagline}</p> : null}
41
+ </div>
42
+ <nav className="xos-mkt-footer-cols" aria-label={label}>
43
+ {columns.map((column) => (
44
+ <div key={column.title}>
45
+ <h2>{column.title}</h2>
46
+ <ul>
47
+ {column.links.map((link) => (
48
+ <li key={link.label}>
49
+ <a href={link.href}>{link.label}</a>
50
+ </li>
51
+ ))}
52
+ </ul>
53
+ </div>
54
+ ))}
55
+ </nav>
56
+ </div>
57
+ <div className="xos-mkt-footer-base">
58
+ <p>{legal}</p>
59
+ <div className="xos-mkt-footer-controls">
60
+ {locales ? (
61
+ <Select
62
+ label={t("mk.footer.language")}
63
+ options={locales}
64
+ {...(locale === undefined ? {} : { value: locale })}
65
+ {...(onLocale === undefined ? {} : { onChange: onLocale })}
66
+ />
67
+ ) : null}
68
+ {themes ? (
69
+ <div className="xos-mkt-footer-theme">
70
+ <span className="xos-mkt-label">{t("mk.footer.theme")}</span>
71
+ <SegmentedControl
72
+ label={t("mk.footer.theme")}
73
+ value={current}
74
+ onChange={setTheme}
75
+ options={[
76
+ { value: "dark", label: t("mk.theme.dark") },
77
+ { value: "light", label: t("mk.theme.light") },
78
+ { value: "sunlight", label: t("mk.theme.sunlight") },
79
+ ]}
80
+ />
81
+ </div>
82
+ ) : null}
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </footer>
87
+ );
88
+ }
@@ -0,0 +1,45 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { type MarketingHeroProps } from "./Marketing.types.ts";
4
+
5
+ /**
6
+ * The opening of a public page, or with `compact` its closing call to action. The default hero
7
+ * holds the page's one h1 at display-64; the compact hero is an h2 at display-48.
8
+ */
9
+ export function MarketingHero({
10
+ id,
11
+ variant = "default",
12
+ eyebrow,
13
+ title,
14
+ lead,
15
+ actions,
16
+ note,
17
+ media,
18
+ headingLevel,
19
+ }: MarketingHeroProps): ReactElement {
20
+ const compact = variant === "compact";
21
+ const Heading = `h${headingLevel ?? (compact ? 2 : 1)}` as const;
22
+ return (
23
+ <section
24
+ id={id}
25
+ className={cx(
26
+ "xos-mkt-hero",
27
+ compact && "xos-mkt-hero-compact",
28
+ !media && "xos-mkt-hero-solo",
29
+ )}
30
+ >
31
+ <div className="xos-mkt-wrap xos-mkt-hero-grid">
32
+ <div className="xos-mkt-hero-copy">
33
+ {eyebrow ? <p className="xos-mkt-eyebrow">{eyebrow}</p> : null}
34
+ <Heading className={compact ? "xos-mkt-display-48" : "xos-mkt-display-64"}>
35
+ {title}
36
+ </Heading>
37
+ {lead ? <p className="xos-mkt-lead">{lead}</p> : null}
38
+ {actions ? <div className="xos-mkt-actions">{actions}</div> : null}
39
+ {note ? <p className="xos-mkt-note">{note}</p> : null}
40
+ </div>
41
+ {media ? <div className="xos-mkt-hero-media">{media}</div> : null}
42
+ </div>
43
+ </section>
44
+ );
45
+ }