@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,54 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { Icon } from "../Icon/Icon.tsx";
4
+ import { Field, controlClass, describedBy, useFieldId } from "../Field/Field.tsx";
5
+ import { type SelectProps } from "./Forms.types.ts";
6
+
7
+ /**
8
+ * A native select styled to the system. The contract's onChange is a native select change event,
9
+ * so the control stays a native select, which also gives the platform picker on touch devices.
10
+ */
11
+ export function Select({
12
+ label,
13
+ help,
14
+ error,
15
+ value,
16
+ placeholder: hint,
17
+ options,
18
+ disabled,
19
+ onChange,
20
+ id,
21
+ name,
22
+ }: SelectProps): ReactElement {
23
+ const fieldId = useFieldId(id);
24
+ return (
25
+ <Field id={fieldId} label={label} help={help} error={error}>
26
+ <div className="relative">
27
+ <select
28
+ id={fieldId}
29
+ name={name}
30
+ className={cx(controlClass, "appearance-none w-full pe-24")}
31
+ defaultValue={value ?? (hint ? "" : undefined)}
32
+ disabled={disabled}
33
+ onChange={onChange}
34
+ aria-invalid={error ? true : undefined}
35
+ aria-describedby={describedBy(fieldId, help, error)}
36
+ >
37
+ {hint ? (
38
+ <option value="" disabled>
39
+ {hint}
40
+ </option>
41
+ ) : null}
42
+ {options.map((o) => (
43
+ <option key={o.value} value={o.value}>
44
+ {o.label}
45
+ </option>
46
+ ))}
47
+ </select>
48
+ <span className="pointer-events-none absolute inset-y-0 end-8 flex items-center text-text-tertiary">
49
+ <Icon name="ChevronsUpDown" size={14} />
50
+ </span>
51
+ </div>
52
+ </Field>
53
+ );
54
+ }
@@ -0,0 +1,14 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { checkLabelClass } from "./Forms.shared.tsx";
4
+ import { type SwitchProps } from "./Forms.types.ts";
5
+
6
+ /** An immediate on or off setting; a checkbox input with the switch role. */
7
+ export function Switch({ label, className, ...rest }: SwitchProps): ReactElement {
8
+ return (
9
+ <label className={cx(checkLabelClass, className)}>
10
+ <input type="checkbox" role="switch" {...rest} className="xos-check-input" />
11
+ {label}
12
+ </label>
13
+ );
14
+ }
@@ -0,0 +1,30 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { Field, controlClass, describedBy, useFieldId } from "../Field/Field.tsx";
4
+ import { type TextareaProps } from "./Forms.types.ts";
5
+
6
+ /** A multi-line field; grows by rows and resizes vertically. */
7
+ export function Textarea({
8
+ label,
9
+ help,
10
+ error,
11
+ id,
12
+ width,
13
+ className,
14
+ rows = 3,
15
+ ...rest
16
+ }: TextareaProps): ReactElement {
17
+ const fieldId = useFieldId(id);
18
+ return (
19
+ <Field id={fieldId} label={label} help={help} error={error} width={width}>
20
+ <textarea
21
+ id={fieldId}
22
+ rows={rows}
23
+ aria-invalid={error ? true : undefined}
24
+ aria-describedby={describedBy(fieldId, help, error)}
25
+ {...rest}
26
+ className={cx(controlClass, "h-auto py-6 resize-y leading-normal", className)}
27
+ />
28
+ </Field>
29
+ );
30
+ }
@@ -0,0 +1,5 @@
1
+ # Gallery
2
+
3
+ Gallery lays cards on an auto-filling grid for gallery views: opportunities, profiles and media.
4
+
5
+ - `min` sets the smallest card width; columns fill the space without breakpoints.
@@ -0,0 +1,7 @@
1
+ # GateLifecycleRail
2
+
3
+ GateLifecycleRail lays out the nine gates in their three acts, each with one criterion from the canon.
4
+
5
+ The three acts sit side by side from bp-lg and stack below it; gates run top to bottom inside each act, so reading order always matches gate order. Each gate reads "Gate 3 · Advance" beside its phase glyph: the number never stands alone. All text is visible without interaction.
6
+
7
+ The consumer provides the acts and gates. `evidence` quotes one criterion as the canon writes it (`xpms.dim_gate_criterion`); do not paraphrase a criterion.
@@ -0,0 +1,8 @@
1
+ # GateReadinessPanel
2
+
3
+ GateReadinessPanel lists a gate's criteria as a checklist with evidence, blocking flags and the action that clears each gap.
4
+
5
+ - Criteria, statements and blocking flags come from `xpms.dim_gate_criterion` (Bible tab 06, 35 criteria); the panel never defines them.
6
+ - Codes display as stored (`G3.PERMITS_FILED`) beside a plain statement, in numeric gate order.
7
+ - The next-gate button enables the moment the last blocking criterion is met; the database enforces the same rule.
8
+ - The preview shows all five Gate 3 criteria with their Bible statements verbatim, in Bible order. All five are blocking.
@@ -0,0 +1,76 @@
1
+ import { useState, type ReactElement } from "react";
2
+ import { useT } from "../lib/context.tsx";
3
+ import { Icon } from "../Icon/Icon.tsx";
4
+ import { Button } from "../Button/Button.tsx";
5
+ import { Avatar } from "../Avatar/Avatar.tsx";
6
+ import { chipClass } from "../Chips/Chips.tsx";
7
+ import { Card } from "../Surface/Surface.tsx";
8
+ import { type AgencySlateProps } from "./Gateway.types.ts";
9
+ import { ProgressBar } from "./ProgressBar.tsx";
10
+
11
+ /** Named staff from an agency roster against the positions, with certification status. */
12
+ export function AgencySlate({
13
+ positions,
14
+ roster,
15
+ onChange,
16
+ onSubmit,
17
+ }: AgencySlateProps): ReactElement {
18
+ const t = useT();
19
+ const [selected, setSelected] = useState(roster.filter((r) => r.selected).map((r) => r.name));
20
+ const toggle = (name: string) => {
21
+ const next = selected.includes(name) ? selected.filter((n) => n !== name) : [...selected, name];
22
+ setSelected(next);
23
+ onChange?.(next);
24
+ };
25
+ return (
26
+ <Card
27
+ title={t("slate.title")}
28
+ meta={t("slate.positions", { n: selected.length, total: positions })}
29
+ footer={
30
+ <Button
31
+ variant="primary"
32
+ disabled={selected.length === 0}
33
+ onClick={() => onSubmit?.(selected)}
34
+ >
35
+ {t("slate.submit")}
36
+ </Button>
37
+ }
38
+ >
39
+ <ProgressBar
40
+ label={t("slate.filled")}
41
+ value={positions ? (selected.length / positions) * 100 : 0}
42
+ />
43
+ <ul className="m-0 p-0 list-none">
44
+ {roster.map((r) => (
45
+ <li
46
+ key={r.name}
47
+ className="flex flex-wrap items-center gap-8 min-h-touch-min border-b border-border-subtle last:border-b-0"
48
+ >
49
+ <label className="xos-check inline-flex items-center">
50
+ <input
51
+ type="checkbox"
52
+ className="xos-check-input"
53
+ checked={selected.includes(r.name)}
54
+ onChange={() => toggle(r.name)}
55
+ aria-label={t("slate.include", { name: r.name })}
56
+ />
57
+ </label>
58
+ <Avatar name={r.name} />
59
+ <div className="flex flex-1 flex-col min-w-0">
60
+ <strong className="font-semibold">{r.name}</strong>
61
+ <span className="text-text-secondary">{r.role}</span>
62
+ </div>
63
+ {r.certs.map((c) => (
64
+ <span key={c.label} className={chipClass}>
65
+ <span className={c.ok ? "text-success" : "text-warning"}>
66
+ <Icon name={c.ok ? "BadgeCheck" : "CircleAlert"} size={12} />
67
+ </span>
68
+ {c.label}
69
+ </span>
70
+ ))}
71
+ </li>
72
+ ))}
73
+ </ul>
74
+ </Card>
75
+ );
76
+ }
@@ -0,0 +1,48 @@
1
+ import { type ReactElement } from "react";
2
+ import { useT } from "../lib/context.tsx";
3
+ import { Button } from "../Button/Button.tsx";
4
+ import { Card } from "../Surface/Surface.tsx";
5
+ import { Checkbox, Textarea } from "../Forms/Forms.tsx";
6
+ import { type ApplicationFormProps } from "./Gateway.types.ts";
7
+
8
+ /** What the person shares before applying, the org's questions and availability confirmation. */
9
+ export function ApplicationForm({
10
+ role,
11
+ org,
12
+ shared,
13
+ questions,
14
+ onSubmit,
15
+ }: ApplicationFormProps): ReactElement {
16
+ const t = useT();
17
+ return (
18
+ <Card
19
+ title={t("apply.title", { role })}
20
+ meta={org}
21
+ footer={
22
+ <>
23
+ <span className="me-auto text-text-secondary">{t("apply.draftSaved")}</span>
24
+ <Button variant="primary" onClick={onSubmit}>
25
+ {t("apply.submit")}
26
+ </Button>
27
+ </>
28
+ }
29
+ >
30
+ <fieldset className="m-0 p-0 border-0 flex flex-col gap-8">
31
+ <legend className="mb-8 text-text-12 font-medium text-text-secondary">
32
+ {t("apply.shared", { org })}
33
+ </legend>
34
+ <ul className="grid grid-cols-2 max-sm:grid-cols-1 gap-8 m-0 px-12 py-8 list-none rounded-control bg-bg-surface">
35
+ {shared.map((s) => (
36
+ <li key={s.label}>
37
+ <Checkbox label={s.label} defaultChecked={s.on} />
38
+ </li>
39
+ ))}
40
+ </ul>
41
+ </fieldset>
42
+ {questions.map((q) => (
43
+ <Textarea key={q} label={q} width="100%" rows={2} />
44
+ ))}
45
+ <Checkbox label={t("apply.available")} />
46
+ </Card>
47
+ );
48
+ }
@@ -0,0 +1,82 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useLocale, usePreferences, useT } from "../lib/context.tsx";
4
+ import { monthCells, monthTitle, parseIso, toIso, weekdayNames } from "../lib/format.ts";
5
+ import { type AvailabilityCalendarProps } from "./Gateway.types.ts";
6
+
7
+ /** Available and booked days; booked days are struck through as well as colored. */
8
+ export function AvailabilityCalendar({
9
+ month,
10
+ available,
11
+ booked,
12
+ }: AvailabilityCalendarProps): ReactElement {
13
+ const t = useT();
14
+ const locale = useLocale();
15
+ const { weekStart: firstDay } = usePreferences();
16
+ const { y, m } = parseIso(month);
17
+ const title = monthTitle(locale, y, m);
18
+ return (
19
+ <div className="flex flex-col gap-12 w-(--ui-popover) max-w-full">
20
+ <strong className="font-semibold">{title}</strong>
21
+ <table aria-label={title} className="border-collapse">
22
+ <thead>
23
+ <tr>
24
+ {weekdayNames(locale, firstDay).map((d) => (
25
+ <th
26
+ key={d}
27
+ scope="col"
28
+ className="h-control-sm text-text-11 font-medium text-text-tertiary"
29
+ >
30
+ {d}
31
+ </th>
32
+ ))}
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ {monthCells(locale, y, m, firstDay).map((week, wi) => (
37
+ <tr key={wi}>
38
+ {week.map((d, di) => {
39
+ if (d === null) return <td key={di} />;
40
+ const iso = toIso(y, m, d);
41
+ const isBooked = booked.includes(iso);
42
+ const isAvailable = !isBooked && available.includes(iso);
43
+ return (
44
+ <td key={di} className="p-0 text-center">
45
+ <span
46
+ className={cx(
47
+ "inline-grid place-items-center w-(--ui-day-inline) h-(--ui-day-block) rounded-control tabular-nums",
48
+ isBooked && "bg-bg-hover text-text-tertiary line-through",
49
+ isAvailable && "ring-(length:--ui-hairline-half) ring-inset ring-success",
50
+ )}
51
+ >
52
+ {d}
53
+ {isBooked || isAvailable ? (
54
+ <span className="sr-only">
55
+ {" "}
56
+ {isBooked ? t("availability.booked") : t("availability.available")}
57
+ </span>
58
+ ) : null}
59
+ </span>
60
+ </td>
61
+ );
62
+ })}
63
+ </tr>
64
+ ))}
65
+ </tbody>
66
+ </table>
67
+ <div className="flex flex-wrap items-center gap-8 text-text-secondary">
68
+ <span className="inline-flex items-center gap-4">
69
+ <span
70
+ aria-hidden="true"
71
+ className="inline-block size-icon-12 rounded-mark ring-(length:--ui-hairline-half) ring-inset ring-success"
72
+ />
73
+ {t("availability.available")}
74
+ </span>
75
+ <span className="inline-flex items-center gap-4">
76
+ <span aria-hidden="true" className="inline-block size-icon-12 rounded-mark bg-bg-hover" />
77
+ {t("availability.booked")}
78
+ </span>
79
+ </div>
80
+ </div>
81
+ );
82
+ }
@@ -0,0 +1,77 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { Icon } from "../Icon/Icon.tsx";
4
+ import { Avatar } from "../Avatar/Avatar.tsx";
5
+ import { chipClass } from "../Chips/Chips.tsx";
6
+ import { linkClass } from "../Link/Link.tsx";
7
+ import { type EPKViewerProps } from "./Gateway.types.ts";
8
+
9
+ const TILE_SEQ = [cx("bg-viz-seq-9"), cx("bg-viz-seq-8"), cx("bg-viz-seq-7"), cx("bg-viz-seq-6")];
10
+
11
+ /** An artist's press kit: media grid, bio, verified badges and links. */
12
+ export function EPKViewer({
13
+ artist,
14
+ headline,
15
+ badges,
16
+ bio,
17
+ media,
18
+ links,
19
+ onMedia,
20
+ }: EPKViewerProps): ReactElement {
21
+ return (
22
+ <section aria-label={artist} className="flex flex-col gap-16 max-w-(--layout-form)">
23
+ <header className="flex flex-wrap items-center gap-8">
24
+ <Avatar name={artist} size="lg" />
25
+ <div className="flex flex-col">
26
+ <h2 className="m-0 text-heading-20 font-semibold">{artist}</h2>
27
+ <span className="text-text-secondary">{headline}</span>
28
+ </div>
29
+ <span className="ms-auto flex flex-wrap gap-4">
30
+ {badges.map((b) => (
31
+ <span key={b} className={chipClass}>
32
+ <span className="text-success">
33
+ <Icon name="BadgeCheck" size={12} />
34
+ </span>
35
+ {b}
36
+ </span>
37
+ ))}
38
+ </span>
39
+ </header>
40
+ <div className="grid grid-cols-4 max-sm:grid-cols-2 gap-8">
41
+ {media.map((m, i) => (
42
+ <button
43
+ key={`${m.label}-${i}`}
44
+ type="button"
45
+ onClick={() => onMedia?.(m.label)}
46
+ className={cx(
47
+ "flex aspect-square flex-col items-center justify-center gap-6 rounded-card border-0 cursor-pointer",
48
+ "text-accent-text-on font-medium text-text-12",
49
+ TILE_SEQ[i % 4],
50
+ )}
51
+ >
52
+ <Icon
53
+ name={m.type === "video" ? "Play" : m.type === "audio" ? "AudioLines" : "Image"}
54
+ size={20}
55
+ />
56
+ <span>{m.label}</span>
57
+ </button>
58
+ ))}
59
+ </div>
60
+ <p className="m-0 text-text-secondary">{bio}</p>
61
+ <div className="flex flex-wrap gap-8">
62
+ {links.map((l) => (
63
+ <a
64
+ key={l.label}
65
+ href={l.href}
66
+ className={linkClass}
67
+ target="_blank"
68
+ rel="noopener noreferrer"
69
+ >
70
+ {l.label}
71
+ <Icon name="ExternalLink" size={12} />
72
+ </a>
73
+ ))}
74
+ </div>
75
+ </section>
76
+ );
77
+ }
@@ -0,0 +1,43 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useT } from "../lib/context.tsx";
4
+ import { Icon } from "../Icon/Icon.tsx";
5
+ import { type EngagementTimelineProps } from "./Gateway.types.ts";
6
+
7
+ /** The engagement stages and where this engagement is. */
8
+ export function EngagementTimeline({ current, stages }: EngagementTimelineProps): ReactElement {
9
+ const t = useT();
10
+ return (
11
+ <ol aria-label={t("engagement.stages")} className="flex flex-col m-0 p-0 list-none">
12
+ {stages.map((s, i) => {
13
+ const state = i < current ? "done" : i === current ? "current" : "todo";
14
+ return (
15
+ <li
16
+ key={s.label}
17
+ aria-current={state === "current" ? "step" : undefined}
18
+ className={cx(
19
+ "relative flex items-start gap-12 py-6 text-text-secondary",
20
+ state === "current" && "text-text-primary font-medium",
21
+ )}
22
+ >
23
+ <span
24
+ className={cx(
25
+ "inline-grid place-items-center flex-none size-icon-20 rounded-full text-text-11 font-semibold tabular-nums",
26
+ state === "todo" &&
27
+ "ring-(length:--stroke-width-hairline) ring-inset ring-border-strong",
28
+ state === "current" && "bg-accent text-accent-text-on",
29
+ state === "done" && "bg-bg-hover text-success",
30
+ )}
31
+ >
32
+ {state === "done" ? <Icon name="Check" size={12} /> : i + 1}
33
+ </span>
34
+ <div className="flex flex-col">
35
+ <strong className="font-semibold">{s.label}</strong>
36
+ <span className="text-text-secondary">{s.date ?? s.owner}</span>
37
+ </div>
38
+ </li>
39
+ );
40
+ })}
41
+ </ol>
42
+ );
43
+ }
@@ -0,0 +1,5 @@
1
+ import { cx } from "../lib/cx.ts";
2
+
3
+ export const panelClass = cx(
4
+ "flex flex-col box-border max-w-full rounded-dialog border border-border-subtle bg-bg-raised",
5
+ );
@@ -0,0 +1,30 @@
1
+ export {
2
+ type ProgressBarProps,
3
+ type OpportunityCardProps,
4
+ type OpportunityFiltersProps,
5
+ type ApplicationFormProps,
6
+ type AgencySlateProps,
7
+ type ProfileEditorProps,
8
+ type EPKViewerProps,
9
+ type AvailabilityCalendarProps,
10
+ type OnboardingPacketProps,
11
+ type EngagementTimelineProps,
12
+ type RatingDialogProps,
13
+ type PayoutDetailsFormProps,
14
+ type PaymentTrackerProps,
15
+ type UpNextCardProps,
16
+ } from "./Gateway.types.ts";
17
+ export { ProgressBar } from "./ProgressBar.tsx";
18
+ export { OpportunityCard } from "./OpportunityCard.tsx";
19
+ export { OpportunityFilters } from "./OpportunityFilters.tsx";
20
+ export { ApplicationForm } from "./ApplicationForm.tsx";
21
+ export { AgencySlate } from "./AgencySlate.tsx";
22
+ export { ProfileEditor } from "./ProfileEditor.tsx";
23
+ export { EPKViewer } from "./EPKViewer.tsx";
24
+ export { AvailabilityCalendar } from "./AvailabilityCalendar.tsx";
25
+ export { OnboardingPacket } from "./OnboardingPacket.tsx";
26
+ export { EngagementTimeline } from "./EngagementTimeline.tsx";
27
+ export { RatingDialog } from "./RatingDialog.tsx";
28
+ export { PayoutDetailsForm } from "./PayoutDetailsForm.tsx";
29
+ export { PaymentTracker } from "./PaymentTracker.tsx";
30
+ export { UpNextCard } from "./UpNextCard.tsx";
@@ -0,0 +1,69 @@
1
+ import type {
2
+ AgencySlateProps as ReferenceAgencySlateProps,
3
+ ApplicationFormProps as ReferenceApplicationFormProps,
4
+ AvailabilityCalendarProps as ReferenceAvailabilityCalendarProps,
5
+ EngagementTimelineProps as ReferenceEngagementTimelineProps,
6
+ EPKViewerProps as ReferenceEPKViewerProps,
7
+ OnboardingPacketProps as ReferenceOnboardingPacketProps,
8
+ OpportunityCardProps as ReferenceOpportunityCardProps,
9
+ OpportunityFiltersProps as ReferenceOpportunityFiltersProps,
10
+ PaymentTrackerProps as ReferencePaymentTrackerProps,
11
+ PayoutDetailsFormProps as ReferencePayoutDetailsFormProps,
12
+ ProfileEditorProps as ReferenceProfileEditorProps,
13
+ ProgressBarProps as ReferenceProgressBarProps,
14
+ RatingDialogProps as ReferenceRatingDialogProps,
15
+ UpNextCardProps as ReferenceUpNextCardProps,
16
+ } from "../types/reference";
17
+
18
+ export type ProgressBarProps = ReferenceProgressBarProps;
19
+
20
+ export type OpportunityCardProps = ReferenceOpportunityCardProps & {
21
+ onApply?: () => void;
22
+ onSave?: () => void;
23
+ };
24
+
25
+ export type OpportunityFiltersProps = ReferenceOpportunityFiltersProps & {
26
+ onSearch?: (query: string) => void;
27
+ onChipsChange?: (active: string[]) => void;
28
+ onViewChange?: (view: "cards" | "map") => void;
29
+ };
30
+
31
+ export type ApplicationFormProps = ReferenceApplicationFormProps & { onSubmit?: () => void };
32
+
33
+ export type AgencySlateProps = ReferenceAgencySlateProps & {
34
+ onChange?: (selected: string[]) => void;
35
+ onSubmit?: (selected: string[]) => void;
36
+ };
37
+
38
+ export type ProfileEditorProps = ReferenceProfileEditorProps & {
39
+ onVisibilityChange?: (label: string, visibility: "private" | "application" | "public") => void;
40
+ };
41
+
42
+ export type EPKViewerProps = ReferenceEPKViewerProps & { onMedia?: (label: string) => void };
43
+
44
+ export type AvailabilityCalendarProps = ReferenceAvailabilityCalendarProps;
45
+
46
+ export type OnboardingPacketProps = ReferenceOnboardingPacketProps & {
47
+ onStart?: (label: string) => void;
48
+ };
49
+
50
+ export type EngagementTimelineProps = ReferenceEngagementTimelineProps;
51
+
52
+ export type RatingDialogProps = ReferenceRatingDialogProps & {
53
+ onSubmit?: (rating: number, comment: string) => void;
54
+ onLater?: () => void;
55
+ open?: boolean;
56
+ onOpenChange?: (open: boolean) => void;
57
+ };
58
+
59
+ export type PayoutDetailsFormProps = ReferencePayoutDetailsFormProps & {
60
+ onSave?: (details: { routing: string; account: string; type: string }) => void;
61
+ };
62
+
63
+ export type PaymentTrackerProps = ReferencePaymentTrackerProps;
64
+
65
+ export type UpNextCardProps = ReferenceUpNextCardProps & {
66
+ onDirections?: () => void;
67
+ onCalendar?: () => void;
68
+ onWallet?: () => void;
69
+ };
@@ -0,0 +1,61 @@
1
+ import { type ReactElement } from "react";
2
+ import { cx } from "../lib/cx.ts";
3
+ import { useT } from "../lib/context.tsx";
4
+ import { Icon } from "../Icon/Icon.tsx";
5
+ import { Button } from "../Button/Button.tsx";
6
+ import { Tag } from "../Chips/Chips.tsx";
7
+ import { Card } from "../Surface/Surface.tsx";
8
+ import { type OnboardingPacketProps } from "./Gateway.types.ts";
9
+ import { ProgressBar } from "./ProgressBar.tsx";
10
+
11
+ const PACKET: Record<
12
+ "verified" | "review" | "todo" | "expired",
13
+ { icon: string; className: string; key: string }
14
+ > = {
15
+ verified: { icon: "CircleCheck", className: cx("text-success"), key: "packet.verified" },
16
+ review: { icon: "Eye", className: cx("text-state-in-review"), key: "packet.review" },
17
+ todo: { icon: "Circle", className: cx("text-text-tertiary"), key: "packet.todo" },
18
+ expired: { icon: "CircleAlert", className: cx("text-danger"), key: "packet.expired" },
19
+ };
20
+
21
+ /** Each onboarding requirement with a time estimate; blocking items gate the engagement. */
22
+ export function OnboardingPacket({ items, onStart }: OnboardingPacketProps): ReactElement {
23
+ const t = useT();
24
+ const done = items.filter((i) => i.state === "verified").length;
25
+ const minutes = items.filter((i) => i.state === "todo").reduce((sum, i) => sum + i.minutes, 0);
26
+ return (
27
+ <Card title={t("packet.title")} meta={t("packet.minutesLeft", { n: minutes })}>
28
+ <ProgressBar
29
+ label={t("packet.verifiedCount", { n: done, total: items.length })}
30
+ value={items.length ? (done / items.length) * 100 : 0}
31
+ />
32
+ <ul className="flex flex-col m-0 p-0 list-none">
33
+ {items.map((item) => {
34
+ const s = PACKET[item.state];
35
+ return (
36
+ <li
37
+ key={item.label}
38
+ className="flex items-center gap-8 min-h-(--space-40) border-b border-border-subtle last:border-b-0"
39
+ >
40
+ <span className={s.className}>
41
+ <Icon name={s.icon} label={t(s.key)} />
42
+ </span>
43
+ <div className="flex flex-1 flex-col min-w-0">
44
+ <span>{item.label}</span>
45
+ <span className="text-text-secondary">
46
+ {item.note ?? t("packet.minutes", { n: item.minutes })}
47
+ </span>
48
+ </div>
49
+ {item.blocking ? <Tag>{t("packet.required")}</Tag> : null}
50
+ {item.state === "todo" ? (
51
+ <Button size="sm" onClick={() => onStart?.(item.label)}>
52
+ {item.action ?? t("action.start")}
53
+ </Button>
54
+ ) : null}
55
+ </li>
56
+ );
57
+ })}
58
+ </ul>
59
+ </Card>
60
+ );
61
+ }