@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,5 @@
1
+ # Switch
2
+
3
+ Switch applies a setting immediately, with no save step.
4
+
5
+ - Use Checkbox inside forms that save; use Switch for settings that apply at once.
@@ -0,0 +1,3 @@
1
+ # SyncConflictSheet
2
+
3
+ SyncConflictSheet lets a person choose between their offline value and the server value for one field; nothing is silently lost.
@@ -0,0 +1,7 @@
1
+ # TabBar
2
+
3
+ TabBar is the five-destination bottom bar for phones: Compass always, Gateway and Atlas below the md breakpoint.
4
+
5
+ - Destinations and order come from the sitemaps (Section 4.5): Compass Today, Schedule, Scan, Inbox, More, with Scan raised in the center; Gateway Home, Explore, Work, Money, Messages; Atlas Home, Inbox, Search, My Work, Menu.
6
+ - Supervisors get a sixth Compass tab, Crew, only when their role allows it.
7
+ - Targets meet touch-min (48 pt).
@@ -0,0 +1,6 @@
1
+ # Tabs
2
+
3
+ Tabs switch between sections of one object, such as project tabs, with an accent underline on the selected tab.
4
+
5
+ - Optional `count` shows open items in tertiary text.
6
+ - Tab order for projects follows Section 4.5.4 of the build prompt.
@@ -0,0 +1,3 @@
1
+ # Tag
2
+
3
+ Tag labels a record with a short category; the dot carries tone and the text stays `text-secondary` for contrast.
@@ -0,0 +1,6 @@
1
+ # TemplateAuth
2
+
3
+ Auth is the template for sign in, MFA, invite acceptance and passkey setup: a centered 400 px card on the brand background.
4
+
5
+ - Passwordless first: passkey, Sign in with Apple, Google, magic link. Passwords remain available, never first.
6
+ - Provider buttons (Continue with Google) use the secondary Button at full width, with the catalog label as the accessible name. A provider's mark keeps its own colors on every theme (Google's sign-in branding guidelines), so it is an image file beside the label, never a recolored icon or a color literal (ADR 0036).
@@ -0,0 +1,6 @@
1
+ # TemplateCollection
2
+
3
+ Collection is the template for every list, board, timeline, calendar and table: page header with title, view switcher, filter bar and one primary action; a virtualized body; optional side peek.
4
+
5
+ - View state lives in the query string: `view`, `group`, `sort`, `filter`, `scope`.
6
+ - The switcher offers only views the data supports.
@@ -0,0 +1,8 @@
1
+ # TemplateDashboard
2
+
3
+ Dashboard is the template for Home, report dashboards and the partner console: a header with date range and scope picker, then tiles on the 12-column grid, resizable in grid units.
4
+
5
+ - Each tile spans whole columns (3 to 12 by default; `minSpan` raises the floor). Below md the grid is one column.
6
+ - With `resize`, a tile's inline-end handle widens or narrows it by drag or by the arrow keys (Home and End jump to the limits); a screen reader hears the new span, and `resize.onChange` receives every span to save. Atlas keeps them in the person's dashboard layout setting.
7
+ - The app supplies the handle and announcement copy, so the library ships no strings for it.
8
+ - Every figure drills through to its records in one click.
@@ -0,0 +1,5 @@
1
+ # TemplateDocument
2
+
3
+ Document is the template for SOPs, documents and legal pages: a centered 720 px reading column with an outline sidebar.
4
+
5
+ - Required acknowledgments sit at the end of the document.
@@ -0,0 +1,5 @@
1
+ # TemplateGatewayShell
2
+
3
+ Gateway shell is the template for every Gateway page and token flow: top navigation with the org's or the platform's brand, no sidebar, comfortable density, 14 px base text and the System theme by default.
4
+
5
+ - Home leads with Up Next, then the feed of things that need the person, each with its action inline.
@@ -0,0 +1,3 @@
1
+ # TemplateGridEditor
2
+
3
+ Grid editor is the template for spreadsheet-speed editing: a full-width grid with a totals row and pinned columns. Used by Budget, rate cards and the Access Grid.
@@ -0,0 +1,3 @@
1
+ # TemplateRecord
2
+
3
+ Record is the template for every record full page and the side peek: title row with key, kind and state; content and activity on the left; properties in a 320 px column on the right; related records below.
@@ -0,0 +1,5 @@
1
+ # TemplateSettings
2
+
3
+ Settings is the template for org, personal and project settings: a section list on the left, a centered 640 px form column, and a sticky save bar while there are unsaved changes.
4
+
5
+ - Every setting shows where its current value comes from (personal, project, team, workspace, organization, platform).
@@ -0,0 +1,3 @@
1
+ # TemplateSplitView
2
+
3
+ Split view keeps a resizable list on the left and the selected record on the right: Inbox, Dispatch board, Advancing submissions, Import review.
@@ -0,0 +1,5 @@
1
+ # TemplateSystem
2
+
3
+ System is the template for 404, 403 shown as 404, 500, maintenance, offline and archived org: a centered message, an icon from the set and one primary action.
4
+
5
+ - A page the person may not see returns 404, never 403, so its existence is not disclosed.
@@ -0,0 +1,3 @@
1
+ # TemplateWizard
2
+
3
+ Wizard is the template for multi-step creation: onboarding, import, template apply, white-label setup. A stepper across the top, one step per page, Back and Next, progress saved per step.
@@ -0,0 +1,16 @@
1
+ import type { ReactElement } from "react";
2
+ import { type TemplateAuthProps } from "./Templates.types.ts";
3
+
4
+ /** Sign in, MFA, invite acceptance and passkey setup: a centered 400 px card. */
5
+ export function TemplateAuth({ brand, children }: TemplateAuthProps): ReactElement {
6
+ return (
7
+ <div data-template="auth" className="grid place-items-center min-h-full p-24 bg-bg-canvas">
8
+ <div className="flex flex-col gap-24 w-[min(var(--layout-auth),100%)]">
9
+ {brand ? <div className="flex justify-center">{brand}</div> : null}
10
+ <div className="flex flex-col gap-16 p-24 bg-bg-raised border border-border-subtle rounded-card">
11
+ {children}
12
+ </div>
13
+ </div>
14
+ </div>
15
+ );
16
+ }
@@ -0,0 +1,35 @@
1
+ import type { ReactElement } from "react";
2
+ import { type TemplateCollectionProps } from "./Templates.types.ts";
3
+
4
+ /**
5
+ * Every list, board, timeline, calendar and table. The root (data-template) is the view region of the
6
+ * shell's view shortcuts (lib/shortcut-targets.ts); Open the filters focuses the filter row unless a
7
+ * control in the header, such as the filter builder's Add filter, carries data-shortcut="view.filters".
8
+ */
9
+ export function TemplateCollection({
10
+ header,
11
+ filters,
12
+ children,
13
+ peek,
14
+ bulk,
15
+ }: TemplateCollectionProps): ReactElement {
16
+ return (
17
+ <div data-template="collection" className="flex flex-col gap-12 min-w-0">
18
+ {header}
19
+ {filters ? (
20
+ <div
21
+ data-shortcut="view.filters"
22
+ data-shortcut-focus=""
23
+ className="flex flex-wrap items-center gap-6"
24
+ >
25
+ {filters}
26
+ </div>
27
+ ) : null}
28
+ <div className="min-w-0">{children}</div>
29
+ {bulk ? (
30
+ <div className="sticky bottom-16 flex justify-center print:hidden">{bulk}</div>
31
+ ) : null}
32
+ {peek}
33
+ </div>
34
+ );
35
+ }
@@ -0,0 +1,200 @@
1
+ import {
2
+ Children,
3
+ useRef,
4
+ useState,
5
+ type CSSProperties,
6
+ type KeyboardEvent,
7
+ type PointerEvent as ReactPointerEvent,
8
+ type ReactElement,
9
+ } from "react";
10
+ import { Direction } from "radix-ui";
11
+ import {
12
+ type DashboardResize,
13
+ type DashboardSpans,
14
+ type DashboardTile,
15
+ type TemplateDashboardProps,
16
+ } from "./Templates.types.ts";
17
+
18
+ /** Columns of the dashboard grid (Section 11.6). */
19
+ const COLUMNS = 12;
20
+ const MIN_SPAN = 3;
21
+
22
+ /** A span kept inside the grid: whole columns from the tile's minimum to the full width. */
23
+ export function clampSpan(span: number, min: number = MIN_SPAN): number {
24
+ const floor = Math.max(1, Math.min(COLUMNS, Math.round(min)));
25
+ if (!Number.isFinite(span)) return floor;
26
+ return Math.max(floor, Math.min(COLUMNS, Math.round(span)));
27
+ }
28
+
29
+ /** Every tile's span: the saved one when there is one, else its default, each kept inside the grid. */
30
+ export function spansOf(
31
+ tiles: readonly DashboardTile[],
32
+ saved: DashboardSpans = {},
33
+ ): Record<string, number> {
34
+ return Object.fromEntries(
35
+ tiles.map((t) => [t.id, clampSpan(saved[t.id] ?? t.span, t.minSpan ?? MIN_SPAN)]),
36
+ );
37
+ }
38
+
39
+ /**
40
+ * The handle on a tile's inline end: a vertical separator whose value is the span. Arrow keys change
41
+ * it by one column, Home and End jump to the limits, and a drag snaps to whole columns.
42
+ */
43
+ function ResizeHandle({
44
+ tile,
45
+ span,
46
+ resize,
47
+ onSpan,
48
+ onDone,
49
+ }: {
50
+ tile: DashboardTile;
51
+ span: number;
52
+ resize: DashboardResize;
53
+ onSpan: (span: number) => void;
54
+ onDone: () => void;
55
+ }): ReactElement {
56
+ const dir = Direction.useDirection();
57
+ const min = clampSpan(tile.minSpan ?? MIN_SPAN, 1);
58
+ const growKey = dir === "rtl" ? "ArrowLeft" : "ArrowRight";
59
+ const shrinkKey = growKey === "ArrowRight" ? "ArrowLeft" : "ArrowRight";
60
+
61
+ const keyDown = (e: KeyboardEvent<HTMLDivElement>) => {
62
+ const next =
63
+ e.key === growKey
64
+ ? span + 1
65
+ : e.key === shrinkKey
66
+ ? span - 1
67
+ : e.key === "Home"
68
+ ? min
69
+ : e.key === "End"
70
+ ? COLUMNS
71
+ : null;
72
+ if (next === null) return;
73
+ e.preventDefault();
74
+ const clamped = clampSpan(next, min);
75
+ if (clamped === span) return;
76
+ onSpan(clamped);
77
+ onDone();
78
+ };
79
+
80
+ const pointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {
81
+ const grid = e.currentTarget.parentElement?.parentElement;
82
+ if (!grid) return;
83
+ e.preventDefault();
84
+ const gap = parseFloat(getComputedStyle(grid).columnGap) || 0;
85
+ // One grid unit: a column and the gap after it.
86
+ const unit = (grid.clientWidth - (COLUMNS - 1) * gap) / COLUMNS + gap;
87
+ const start = e.clientX;
88
+ const startSpan = span;
89
+ const sign = dir === "rtl" ? -1 : 1;
90
+ let last = span;
91
+ const move = (ev: PointerEvent) => {
92
+ if (unit <= 0) return;
93
+ const next = clampSpan(startSpan + (sign * (ev.clientX - start)) / unit, min);
94
+ if (next !== last) {
95
+ last = next;
96
+ onSpan(next);
97
+ }
98
+ };
99
+ const up = () => {
100
+ window.removeEventListener("pointermove", move);
101
+ window.removeEventListener("pointerup", up);
102
+ if (last !== startSpan) onDone();
103
+ };
104
+ window.addEventListener("pointermove", move);
105
+ window.addEventListener("pointerup", up);
106
+ };
107
+
108
+ return (
109
+ <div
110
+ role="separator"
111
+ aria-orientation="vertical"
112
+ aria-label={resize.label(tile.label)}
113
+ aria-valuenow={span}
114
+ aria-valuemin={min}
115
+ aria-valuemax={COLUMNS}
116
+ aria-valuetext={resize.describe(tile.label, span)}
117
+ tabIndex={0}
118
+ onKeyDown={keyDown}
119
+ onPointerDown={pointerDown}
120
+ className="absolute inset-y-8 -end-6 w-(--ui-handle) rounded-full cursor-col-resize touch-none max-md:hidden hover:bg-accent focus-visible:bg-accent"
121
+ />
122
+ );
123
+ }
124
+
125
+ /**
126
+ * Home, report dashboards and the partner console (Section 11.6): the header with the date range and
127
+ * scope picker, then tiles on the 12-column grid. Each tile spans whole columns; with `resize`, a
128
+ * person widens or narrows a tile by dragging its edge or with the arrow keys on its handle, a screen
129
+ * reader hears the new span, and `resize.onChange` receives every span to save. Below md the grid is
130
+ * one column, so the handles hide.
131
+ */
132
+ export function TemplateDashboard({
133
+ header,
134
+ controls,
135
+ tiles,
136
+ spans,
137
+ resize,
138
+ label,
139
+ children,
140
+ }: TemplateDashboardProps): ReactElement {
141
+ // Spans changed here since the page rendered; they win over the saved ones until it renders again.
142
+ const [own, setOwn] = useState<Record<string, number>>({});
143
+ const [message, setMessage] = useState("");
144
+ const current = useRef<Record<string, number>>({});
145
+ const effective = tiles ? spansOf(tiles, { ...spans, ...own }) : {};
146
+ current.current = effective;
147
+
148
+ return (
149
+ <div data-template="dashboard" className="flex flex-col gap-16 min-w-0">
150
+ {controls ? (
151
+ <div className="flex flex-wrap items-start justify-between gap-12">
152
+ <div className="flex-1 min-w-0">{header}</div>
153
+ <div className="flex flex-wrap items-center gap-8">{controls}</div>
154
+ </div>
155
+ ) : (
156
+ header
157
+ )}
158
+ <div
159
+ {...(label ? { role: "group", "aria-label": label } : {})}
160
+ className="grid grid-cols-12 gap-(--layout-gutter-lg)"
161
+ >
162
+ {tiles?.map((tile) => {
163
+ const span = effective[tile.id] ?? tile.span;
164
+ return (
165
+ <div
166
+ key={tile.id}
167
+ data-tile={tile.id}
168
+ data-span={span}
169
+ className="relative flex flex-col min-w-0 col-span-12 md:col-span-(--tile-span) *:flex-1"
170
+ style={{ "--tile-span": span } as CSSProperties}
171
+ >
172
+ {tile.content}
173
+ {resize ? (
174
+ <ResizeHandle
175
+ tile={tile}
176
+ span={span}
177
+ resize={resize}
178
+ onSpan={(next) => {
179
+ current.current = { ...current.current, [tile.id]: next };
180
+ setOwn((old) => ({ ...old, [tile.id]: next }));
181
+ setMessage(resize.describe(tile.label, next));
182
+ }}
183
+ onDone={() => resize.onChange({ ...current.current })}
184
+ />
185
+ ) : null}
186
+ </div>
187
+ );
188
+ })}
189
+ {Children.map(children, (child) => (
190
+ <div className="min-w-0 col-span-12 md:col-span-6 lg:col-span-4">{child}</div>
191
+ ))}
192
+ </div>
193
+ {resize ? (
194
+ <span aria-live="polite" className="sr-only">
195
+ {message}
196
+ </span>
197
+ ) : null}
198
+ </div>
199
+ );
200
+ }
@@ -0,0 +1,24 @@
1
+ import type { ReactElement } from "react";
2
+ import { type TemplateDocumentProps } from "./Templates.types.ts";
3
+
4
+ /** SOPs, documents and legal pages: a 720 px reading column beside its outline. */
5
+ export function TemplateDocument({
6
+ outline,
7
+ children,
8
+ acknowledgments,
9
+ }: TemplateDocumentProps): ReactElement {
10
+ return (
11
+ <div
12
+ data-template="document"
13
+ className="grid grid-cols-[var(--ui-outline)_minmax(0,var(--layout-reading))] max-lg:grid-cols-[minmax(0,1fr)] gap-32"
14
+ >
15
+ <div className="max-lg:hidden">{outline}</div>
16
+ <article className="flex flex-col gap-16 min-w-0 leading-relaxed">
17
+ {children}
18
+ {acknowledgments ? (
19
+ <footer className="pt-16 border-t border-border-subtle">{acknowledgments}</footer>
20
+ ) : null}
21
+ </article>
22
+ </div>
23
+ );
24
+ }
@@ -0,0 +1,36 @@
1
+ import type { ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { type TemplateGatewayShellProps } from "./Templates.types.ts";
4
+
5
+ /** Every Gateway page: top navigation, no sidebar, comfortable density and 14 px base text. */
6
+ export function TemplateGatewayShell({
7
+ topNav,
8
+ aside,
9
+ children,
10
+ tabBar,
11
+ }: TemplateGatewayShellProps): ReactElement {
12
+ return (
13
+ <div
14
+ data-template="gateway-shell"
15
+ className="flex flex-col min-h-full max-md:flex-1 max-md:min-h-0 bg-bg-canvas text-text-14"
16
+ >
17
+ <div className="max-md:hidden">{topNav}</div>
18
+ <main
19
+ className={cx(
20
+ "flex-1 p-24 max-md:p-16 min-w-0 max-md:min-h-0 max-md:overflow-y-auto",
21
+ aside
22
+ ? "grid grid-cols-[var(--ui-gateway-aside)_minmax(0,1fr)] max-lg:grid-cols-[minmax(0,1fr)] gap-24"
23
+ : "flex flex-col gap-16",
24
+ )}
25
+ >
26
+ {aside ? <div className="flex flex-col gap-16 min-w-0">{aside}</div> : null}
27
+ <div className="flex flex-col gap-16 min-w-0">{children}</div>
28
+ </main>
29
+ {tabBar ? (
30
+ <div data-xos-bottom-bar="" className="hidden max-md:block sticky bottom-0 [&_nav]:w-full">
31
+ {tabBar}
32
+ </div>
33
+ ) : null}
34
+ </div>
35
+ );
36
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactElement } from "react";
2
+ import { type TemplateGridEditorProps } from "./Templates.types.ts";
3
+
4
+ /** Spreadsheet-speed editing: a full-width grid under its header. */
5
+ export function TemplateGridEditor({
6
+ header,
7
+ children,
8
+ toolbar,
9
+ }: TemplateGridEditorProps): ReactElement {
10
+ return (
11
+ <div data-template="grid-editor" className="flex flex-col gap-12 min-w-0">
12
+ {header}
13
+ {toolbar ? <div className="flex flex-wrap items-center gap-8">{toolbar}</div> : null}
14
+ <div className="min-w-0">{children}</div>
15
+ </div>
16
+ );
17
+ }
@@ -0,0 +1,31 @@
1
+ import type { ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { type TemplateRecordProps } from "./Templates.types.ts";
4
+
5
+ /** Every record full page: content and activity beside the 320 px property column. */
6
+ export function TemplateRecord({
7
+ header,
8
+ children,
9
+ properties,
10
+ related,
11
+ propertiesLabel,
12
+ }: TemplateRecordProps): ReactElement {
13
+ return (
14
+ <article data-template="record" className="flex flex-col gap-16 min-w-0">
15
+ {header}
16
+ <div className="grid grid-cols-[minmax(0,1fr)_var(--layout-property-column)] max-lg:grid-cols-[minmax(0,1fr)] gap-24">
17
+ <div className="flex flex-col gap-16 min-w-0">{children}</div>
18
+ <aside
19
+ aria-label={propertiesLabel}
20
+ className={cx(
21
+ "min-w-0 ps-20 border-s border-border-subtle",
22
+ "max-lg:ps-0 max-lg:border-s-0 max-lg:pt-16 max-lg:border-t",
23
+ )}
24
+ >
25
+ {properties}
26
+ </aside>
27
+ </div>
28
+ {related ? <section className="min-w-0">{related}</section> : null}
29
+ </article>
30
+ );
31
+ }
@@ -0,0 +1,26 @@
1
+ import type { ReactElement } from "react";
2
+ import { type TemplateSettingsProps } from "./Templates.types.ts";
3
+
4
+ /** Org, personal and project settings: sections beside a centered form column. */
5
+ export function TemplateSettings({
6
+ sections,
7
+ children,
8
+ saveBar,
9
+ }: TemplateSettingsProps): ReactElement {
10
+ return (
11
+ <div
12
+ data-template="settings"
13
+ className="grid grid-cols-[var(--ui-settings-nav)_minmax(0,var(--layout-form))] max-md:grid-cols-[minmax(0,1fr)] gap-32 max-md:gap-16"
14
+ >
15
+ <div className="min-w-0">{sections}</div>
16
+ <div className="flex flex-col gap-16 min-w-0">
17
+ {children}
18
+ {saveBar ? (
19
+ <div className="sticky bottom-0 flex items-center justify-end gap-8 py-12 bg-bg-canvas border-t border-border-subtle">
20
+ {saveBar}
21
+ </div>
22
+ ) : null}
23
+ </div>
24
+ </div>
25
+ );
26
+ }
@@ -0,0 +1,27 @@
1
+ import type { ReactElement } from "react";
2
+ import { ResizablePanel } from "../Layout/Layout.tsx";
3
+ import { type TemplateSplitViewProps } from "./Templates.types.ts";
4
+
5
+ /** A resizable list beside the selected record: Inbox, Dispatch, Advancing, Import review. */
6
+ export function TemplateSplitView({
7
+ list,
8
+ detail,
9
+ listWidth = 300,
10
+ listLabel,
11
+ }: TemplateSplitViewProps): ReactElement {
12
+ return (
13
+ <div data-template="split-view" className="flex gap-16 min-w-0 max-lg:flex-col">
14
+ <div className="max-lg:[&>div]:w-full! max-lg:[&_[role=separator]]:hidden">
15
+ <ResizablePanel
16
+ initial={listWidth}
17
+ min={240}
18
+ max={480}
19
+ {...(listLabel ? { label: listLabel } : {})}
20
+ >
21
+ {list}
22
+ </ResizablePanel>
23
+ </div>
24
+ <div className="flex-1 min-w-0">{detail}</div>
25
+ </div>
26
+ );
27
+ }
@@ -0,0 +1,19 @@
1
+ import type { ReactElement } from "react";
2
+ import { Button } from "../Button/Button.tsx";
3
+ import { SystemMessage } from "./TemplateSystemLink.tsx";
4
+ import { type TemplateSystemProps } from "./Templates.types.ts";
5
+
6
+ /** 404, 500, maintenance, offline and archived org: a centered message and one primary action. */
7
+ export function TemplateSystem({
8
+ actionLabel,
9
+ onAction,
10
+ ...message
11
+ }: TemplateSystemProps): ReactElement {
12
+ return (
13
+ <SystemMessage {...message}>
14
+ <Button variant="primary" onClick={onAction}>
15
+ {actionLabel}
16
+ </Button>
17
+ </SystemMessage>
18
+ );
19
+ }
@@ -0,0 +1,55 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ import { Icon } from "../Icon/Icon.tsx";
3
+ import { buttonClass } from "../Button/button-class.ts";
4
+ import { type TemplateSystemLinkProps } from "./Templates.types.ts";
5
+
6
+ /** The System template's centered message, around whatever its one action is. */
7
+ export function SystemMessage({
8
+ icon,
9
+ title,
10
+ sentence,
11
+ reference,
12
+ children,
13
+ }: {
14
+ icon: string;
15
+ title: string;
16
+ sentence: string;
17
+ reference?: string | undefined;
18
+ children: ReactNode;
19
+ }): ReactElement {
20
+ return (
21
+ <div
22
+ data-template="system"
23
+ className="flex flex-col items-center gap-12 py-48 px-16 text-center"
24
+ >
25
+ <span className="text-text-secondary">
26
+ <Icon name={icon} size={28} />
27
+ </span>
28
+ <h1 className="m-0 text-heading-20 font-semibold">{title}</h1>
29
+ <p className="m-0 max-w-(--layout-auth) text-text-secondary">{sentence}</p>
30
+ {children}
31
+ {reference ? (
32
+ <span className="font-mono text-text-12 text-text-secondary">{reference}</span>
33
+ ) : null}
34
+ </div>
35
+ );
36
+ }
37
+
38
+ /**
39
+ * The System template whose action is a link styled as the primary Button. It uses no hooks or
40
+ * context, so a server component renders it whole: a not-found boundary built on it sends no
41
+ * JavaScript, where TemplateSystem's click handler needs a client module (ADR 0027).
42
+ */
43
+ export function TemplateSystemLink({
44
+ href,
45
+ actionLabel,
46
+ ...message
47
+ }: TemplateSystemLinkProps): ReactElement {
48
+ return (
49
+ <SystemMessage {...message}>
50
+ <a href={href} className={buttonClass("primary")}>
51
+ {actionLabel}
52
+ </a>
53
+ </SystemMessage>
54
+ );
55
+ }
@@ -0,0 +1,43 @@
1
+ import type { ReactElement } from "react";
2
+ import { useT } from "../lib/context.tsx";
3
+ import { Button } from "../Button/Button.tsx";
4
+ import { Stepper } from "../Layout/Layout.tsx";
5
+ import { type TemplateWizardProps } from "./Templates.types.ts";
6
+
7
+ /** Multi-step creation: a stepper, one step per page, Back and Next. */
8
+ export function TemplateWizard({
9
+ steps,
10
+ current,
11
+ title,
12
+ children,
13
+ onBack,
14
+ onNext,
15
+ finishLabel,
16
+ nextDisabled = false,
17
+ }: TemplateWizardProps): ReactElement {
18
+ const t = useT();
19
+ const last = current >= steps.length - 1;
20
+ return (
21
+ <div
22
+ data-template="wizard"
23
+ className="flex flex-col gap-24 w-full max-w-(--layout-form) mx-auto"
24
+ >
25
+ <Stepper steps={steps} current={current} />
26
+ <section className="flex flex-col gap-16">
27
+ <h1 className="m-0 text-heading-20 font-semibold">{title}</h1>
28
+ <p className="m-0 text-text-secondary tabular-nums">
29
+ {t("count.step", { n: current + 1, total: steps.length })}
30
+ </p>
31
+ {children}
32
+ </section>
33
+ <div className="flex justify-between gap-8">
34
+ <Button variant="ghost" icon="ChevronLeft" disabled={current === 0} onClick={onBack}>
35
+ {t("nav.previous")}
36
+ </Button>
37
+ <Button variant="primary" disabled={nextDisabled} onClick={onNext}>
38
+ {last ? (finishLabel ?? t("action.done")) : t("nav.next")}
39
+ </Button>
40
+ </div>
41
+ </div>
42
+ );
43
+ }