pixelize-design-library 2.4.1-beta.1 → 2.4.1-beta.11

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 (573) hide show
  1. package/dist/Assets/defaultLogo.d.ts.map +1 -1
  2. package/dist/Assets/defaultLogo.js +1 -3
  3. package/dist/Assets/defaultLogo.tsx +4 -8
  4. package/dist/Components/Accordion/accordionColors.d.ts.map +1 -1
  5. package/dist/Components/Accordion/accordionColors.js +17 -3
  6. package/dist/Components/Checkbox/Checkbox.styles.d.ts.map +1 -1
  7. package/dist/Components/Checkbox/Checkbox.styles.js +13 -2
  8. package/dist/Components/CustomModulesTable/EditModuleModal.d.ts.map +1 -1
  9. package/dist/Components/CustomModulesTable/EditModuleModal.js +5 -1
  10. package/dist/Components/DatePicker/CalendarPanel.d.ts.map +1 -1
  11. package/dist/Components/DatePicker/CalendarPanel.js +15 -4
  12. package/dist/Components/DatePicker/SingleDatePicker.d.ts.map +1 -1
  13. package/dist/Components/DatePicker/SingleDatePicker.js +11 -9
  14. package/dist/Components/DatePicker/TimeOnlyPicker.js +2 -2
  15. package/dist/Components/DatePicker/TimePicker.d.ts.map +1 -1
  16. package/dist/Components/DatePicker/TimePicker.js +14 -2
  17. package/dist/Components/DatePicker/TimePickerInput.d.ts.map +1 -1
  18. package/dist/Components/DatePicker/TimePickerInput.js +9 -1
  19. package/dist/Components/Editor/joditThemeVars.d.ts.map +1 -1
  20. package/dist/Components/Editor/joditThemeVars.js +9 -0
  21. package/dist/Components/FilePreview/FilePreview.d.ts.map +1 -1
  22. package/dist/Components/FilePreview/FilePreview.js +3 -1
  23. package/dist/Components/FileUploader/FileUploader.js +2 -2
  24. package/dist/Components/FilterSidebar/FilterSidebar.js +1 -1
  25. package/dist/Components/LimitReachedModal/LimitReachedModal.d.ts +5 -0
  26. package/dist/Components/LimitReachedModal/LimitReachedModal.d.ts.map +1 -0
  27. package/dist/Components/LimitReachedModal/LimitReachedModal.js +45 -0
  28. package/dist/Components/LimitReachedModal/LimitReachedModalProps.d.ts +16 -0
  29. package/dist/Components/LimitReachedModal/LimitReachedModalProps.d.ts.map +1 -0
  30. package/dist/Components/LimitReachedModal/LimitReachedModalProps.js +2 -0
  31. package/dist/Components/LimitReachedModal/limitReachedCopy.d.ts +7 -0
  32. package/dist/Components/LimitReachedModal/limitReachedCopy.d.ts.map +1 -0
  33. package/dist/Components/LimitReachedModal/limitReachedCopy.js +54 -0
  34. package/dist/Components/Loading/Loading.d.ts +1 -1
  35. package/dist/Components/Loading/Loading.d.ts.map +1 -1
  36. package/dist/Components/Loading/Loading.js +2 -2
  37. package/dist/Components/Loading/LoadingProps.d.ts +2 -0
  38. package/dist/Components/Loading/LoadingProps.d.ts.map +1 -1
  39. package/dist/Components/Modal/Modal.d.ts.map +1 -1
  40. package/dist/Components/Modal/Modal.js +1 -4
  41. package/dist/Components/NavigationBar/NavigationBar.d.ts.map +1 -1
  42. package/dist/Components/NavigationBar/NavigationBar.js +10 -6
  43. package/dist/Components/OrgSwitcher/OrgSwitcher.d.ts.map +1 -1
  44. package/dist/Components/OrgSwitcher/OrgSwitcher.js +22 -3
  45. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +9 -1
  46. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts.map +1 -1
  47. package/dist/Components/OrgSwitcher/OrgSwitcherProps.js +19 -5
  48. package/dist/Components/OrganizationDetails/CreateOrgModal.js +6 -4
  49. package/dist/Components/OrganizationDetails/OrganizationDetails.d.ts.map +1 -1
  50. package/dist/Components/OrganizationDetails/OrganizationDetails.js +66 -9
  51. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +47 -14
  52. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts.map +1 -1
  53. package/dist/Components/PlanBadge/PlanBadge.d.ts +12 -0
  54. package/dist/Components/PlanBadge/PlanBadge.d.ts.map +1 -0
  55. package/dist/Components/PlanBadge/PlanBadge.js +22 -0
  56. package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +11 -0
  57. package/dist/Components/PlanBadge/PlanBadgeProps.d.ts.map +1 -0
  58. package/dist/Components/PlanBadge/PlanBadgeProps.js +2 -0
  59. package/dist/Components/PlanPill/PlanPill.d.ts +5 -0
  60. package/dist/Components/PlanPill/PlanPill.d.ts.map +1 -0
  61. package/dist/Components/PlanPill/PlanPill.js +42 -0
  62. package/dist/Components/PlanPill/PlanPillProps.d.ts +28 -0
  63. package/dist/Components/PlanPill/PlanPillProps.d.ts.map +1 -0
  64. package/dist/Components/PlanPill/PlanPillProps.js +2 -0
  65. package/dist/Components/PlanPill/planPillGradient.d.ts +22 -0
  66. package/dist/Components/PlanPill/planPillGradient.d.ts.map +1 -0
  67. package/dist/Components/PlanPill/planPillGradient.js +20 -0
  68. package/dist/Components/Search/Search.d.ts.map +1 -1
  69. package/dist/Components/Search/Search.js +4 -2
  70. package/dist/Components/Select/Select.styles.d.ts.map +1 -1
  71. package/dist/Components/Select/Select.styles.js +29 -20
  72. package/dist/Components/SelectSearch/SelectSearch.js +1 -1
  73. package/dist/Components/SelectV2/SelectV2.d.ts +3 -0
  74. package/dist/Components/SelectV2/SelectV2.d.ts.map +1 -0
  75. package/dist/Components/SelectV2/SelectV2.js +185 -0
  76. package/dist/Components/SelectV2/SelectV2Props.d.ts +67 -0
  77. package/dist/Components/SelectV2/SelectV2Props.d.ts.map +1 -0
  78. package/dist/Components/SelectV2/SelectV2Props.js +2 -0
  79. package/dist/Components/SideBar/SecondaryBar.d.ts.map +1 -1
  80. package/dist/Components/SideBar/SecondaryBar.js +10 -2
  81. package/dist/Components/SideBar/SideBar.js +2 -2
  82. package/dist/Components/SideBar/components/MenuItemBox.d.ts.map +1 -1
  83. package/dist/Components/SideBar/components/MenuItemBox.js +7 -6
  84. package/dist/Components/Table/components/tableRowHoverStyle.d.ts +9 -8
  85. package/dist/Components/Table/components/tableRowHoverStyle.d.ts.map +1 -1
  86. package/dist/Components/Table/components/tableRowHoverStyle.js +12 -12
  87. package/dist/Components/Table/settings/ManageColumns.js +2 -2
  88. package/dist/Components/UpgradeButton/UpgradeButton.d.ts.map +1 -1
  89. package/dist/Components/UpgradeButton/UpgradeButton.js +25 -7
  90. package/dist/Components/UserDetails/UserDetails.d.ts.map +1 -1
  91. package/dist/Components/UserDetails/UserDetails.js +5 -2
  92. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +2 -1
  93. package/dist/Components/WorkspaceWindow/WorkspaceWindow.d.ts +2 -2
  94. package/dist/Components/WorkspaceWindow/WorkspaceWindow.d.ts.map +1 -1
  95. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +25 -4
  96. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +18 -0
  97. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts.map +1 -1
  98. package/dist/Theme/chakra/Avatar.styles.d.ts +33 -0
  99. package/dist/Theme/chakra/Avatar.styles.d.ts.map +1 -0
  100. package/dist/Theme/chakra/Avatar.styles.js +28 -0
  101. package/dist/Theme/chakra/Drawer.styles.d.ts +32 -0
  102. package/dist/Theme/chakra/Drawer.styles.d.ts.map +1 -0
  103. package/dist/Theme/chakra/Drawer.styles.js +26 -0
  104. package/dist/Theme/chakra/Menu.styles.d.ts +70 -0
  105. package/dist/Theme/chakra/Menu.styles.d.ts.map +1 -0
  106. package/dist/Theme/chakra/Menu.styles.js +50 -0
  107. package/dist/Theme/chakra/Modal.styles.d.ts +32 -0
  108. package/dist/Theme/chakra/Modal.styles.d.ts.map +1 -0
  109. package/dist/Theme/chakra/Modal.styles.js +26 -0
  110. package/dist/Theme/chakra/Popover.styles.d.ts +37 -0
  111. package/dist/Theme/chakra/Popover.styles.d.ts.map +1 -0
  112. package/dist/Theme/chakra/Popover.styles.js +30 -0
  113. package/dist/Theme/chakra/Slider.styles.d.ts +31 -0
  114. package/dist/Theme/chakra/Slider.styles.d.ts.map +1 -0
  115. package/dist/Theme/chakra/Slider.styles.js +25 -0
  116. package/dist/Theme/chakra/Switch.styles.d.ts +31 -0
  117. package/dist/Theme/chakra/Switch.styles.d.ts.map +1 -0
  118. package/dist/Theme/chakra/Switch.styles.js +24 -0
  119. package/dist/Theme/chakra/Tabs.styles.d.ts +43 -0
  120. package/dist/Theme/chakra/Tabs.styles.d.ts.map +1 -0
  121. package/dist/Theme/chakra/Tabs.styles.js +41 -0
  122. package/dist/Theme/chakra/common.web.d.ts.map +1 -1
  123. package/dist/Theme/chakra/common.web.js +4 -1
  124. package/dist/Theme/chakra/componentStyles.d.ts +230 -1
  125. package/dist/Theme/chakra/componentStyles.d.ts.map +1 -1
  126. package/dist/Theme/chakra/componentStyles.js +136 -0
  127. package/dist/Theme/chakra/createBrandTheme.d.ts.map +1 -1
  128. package/dist/Theme/chakra/createBrandTheme.js +47 -0
  129. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +22 -3
  130. package/dist/Theme/provider/PixelizeThemeProvider.d.ts.map +1 -1
  131. package/dist/Theme/provider/PixelizeThemeProvider.js +115 -5
  132. package/dist/Theme/provider/ThemeSwitcher.d.ts.map +1 -1
  133. package/dist/Theme/provider/ThemeSwitcher.js +23 -11
  134. package/dist/Theme/tokens/brands/index.d.ts.map +1 -1
  135. package/dist/Theme/tokens/brands/index.js +20 -18
  136. package/dist/Theme/tokens/brands/lavender/palette.light.d.ts.map +1 -1
  137. package/dist/Theme/tokens/brands/lavender/palette.light.js +22 -15
  138. package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts.map +1 -1
  139. package/dist/Theme/tokens/brands/zinc/palette.dark.js +5 -2
  140. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts.map +1 -1
  141. package/dist/Theme/tokens/builders/buildDarkPalette.js +19 -4
  142. package/dist/Theme/tokens/builders/outlineRung.d.ts +35 -0
  143. package/dist/Theme/tokens/builders/outlineRung.d.ts.map +1 -0
  144. package/dist/Theme/tokens/builders/outlineRung.js +69 -0
  145. package/dist/Theme/tokens/builders/statusTone.d.ts +35 -0
  146. package/dist/Theme/tokens/builders/statusTone.d.ts.map +1 -0
  147. package/dist/Theme/tokens/builders/statusTone.js +63 -0
  148. package/dist/Utils/accountHandoff.d.ts +54 -0
  149. package/dist/Utils/accountHandoff.d.ts.map +1 -0
  150. package/dist/Utils/accountHandoff.js +144 -0
  151. package/dist/Utils/planBadge.d.ts +39 -0
  152. package/dist/Utils/planBadge.d.ts.map +1 -0
  153. package/dist/Utils/planBadge.js +108 -0
  154. package/dist/Utils/planExpiry.d.ts +35 -0
  155. package/dist/Utils/planExpiry.d.ts.map +1 -0
  156. package/dist/Utils/planExpiry.js +115 -0
  157. package/dist/index.d.ts +18 -1
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +36 -3
  160. package/package.json +6 -2
  161. package/.claude/settings.local.json +0 -51
  162. package/.cursor/TASK-SETUP.md +0 -43
  163. package/.cursor/agents/be-impl.md +0 -37
  164. package/.cursor/agents/fe-impl.md +0 -39
  165. package/.cursor/agents/task-plan.md +0 -56
  166. package/.cursor/agents/test-create.md +0 -31
  167. package/.cursor/agents/test-exec.md +0 -26
  168. package/.cursor/hooks/task-hint.env +0 -1
  169. package/.cursor/hooks/task-skill-nudge.sh +0 -71
  170. package/.cursor/hooks/task-slash-guard.sh +0 -31
  171. package/.cursor/hooks.json +0 -13
  172. package/.cursor/modules/account-management/MODULE.md +0 -34
  173. package/.cursor/modules/buttons/MODULE.md +0 -47
  174. package/.cursor/modules/cards/MODULE.md +0 -55
  175. package/.cursor/modules/charts/MODULE.md +0 -40
  176. package/.cursor/modules/common/MODULE.md +0 -36
  177. package/.cursor/modules/contact-auth/MODULE.md +0 -19
  178. package/.cursor/modules/data-display/MODULE.md +0 -42
  179. package/.cursor/modules/feedback/MODULE.md +0 -32
  180. package/.cursor/modules/form/MODULE.md +0 -13
  181. package/.cursor/modules/inputs-basic/MODULE.md +0 -42
  182. package/.cursor/modules/inputs-date-file/MODULE.md +0 -56
  183. package/.cursor/modules/inputs-select/MODULE.md +0 -27
  184. package/.cursor/modules/inputs-toggle/MODULE.md +0 -18
  185. package/.cursor/modules/kanban/MODULE.md +0 -22
  186. package/.cursor/modules/layout-navigation/MODULE.md +0 -269
  187. package/.cursor/modules/overlays/MODULE.md +0 -69
  188. package/.cursor/modules/playground/MODULE.md +0 -28
  189. package/.cursor/modules/table/MODULE.md +0 -78
  190. package/.cursor/modules/theme/MODULE.md +0 -314
  191. package/.cursor/modules/types-exports/MODULE.md +0 -17
  192. package/.cursor/modules/utility-ui/MODULE.md +0 -50
  193. package/.cursor/modules/utils-hooks/MODULE.md +0 -35
  194. package/.cursor/pixelize-task-statusline.sh +0 -64
  195. package/.cursor/plans/blocked/.gitkeep +0 -0
  196. package/.cursor/plans/current.md +0 -12
  197. package/.cursor/plans/current.theme-tokens-dark-mode.md +0 -77
  198. package/.cursor/plans/current.theme-tokens-dark.md +0 -155
  199. package/.cursor/plans/done/.gitkeep +0 -0
  200. package/.cursor/rules +0 -31
  201. package/.cursor/skills/task/SKILL.md +0 -167
  202. package/CLAUDE.md +0 -148
  203. package/__mocks__/styleMock.js +0 -8
  204. package/coverage/clover.xml +0 -405
  205. package/coverage/coverage-final.json +0 -16
  206. package/coverage/coverage-summary.json +0 -50
  207. package/coverage/lcov-report/Button/Button.tsx.html +0 -244
  208. package/coverage/lcov-report/Button/index.html +0 -116
  209. package/coverage/lcov-report/Checkbox/Checkbox.tsx.html +0 -433
  210. package/coverage/lcov-report/Checkbox/index.html +0 -116
  211. package/coverage/lcov-report/Common/ErrorMessage.tsx.html +0 -148
  212. package/coverage/lcov-report/Common/FormLabel.tsx.html +0 -331
  213. package/coverage/lcov-report/Common/HelperText.tsx.html +0 -124
  214. package/coverage/lcov-report/Common/index.html +0 -146
  215. package/coverage/lcov-report/Components/Button/Button.tsx.html +0 -244
  216. package/coverage/lcov-report/Components/Button/index.html +0 -116
  217. package/coverage/lcov-report/Components/Checkbox/Checkbox.tsx.html +0 -433
  218. package/coverage/lcov-report/Components/Checkbox/index.html +0 -116
  219. package/coverage/lcov-report/Components/Common/ErrorMessage.tsx.html +0 -148
  220. package/coverage/lcov-report/Components/Common/FormLabel.tsx.html +0 -331
  221. package/coverage/lcov-report/Components/Common/HelperText.tsx.html +0 -124
  222. package/coverage/lcov-report/Components/Common/index.html +0 -146
  223. package/coverage/lcov-report/Components/CustomModulesTable/CustomModulesTable.tsx.html +0 -712
  224. package/coverage/lcov-report/Components/CustomModulesTable/DeleteModuleModal.tsx.html +0 -343
  225. package/coverage/lcov-report/Components/CustomModulesTable/EditModuleModal.tsx.html +0 -313
  226. package/coverage/lcov-report/Components/CustomModulesTable/index.html +0 -146
  227. package/coverage/lcov-report/Components/Divider/Divider.tsx.html +0 -133
  228. package/coverage/lcov-report/Components/Divider/index.html +0 -116
  229. package/coverage/lcov-report/Components/Dropdown/DropDown.tsx.html +0 -994
  230. package/coverage/lcov-report/Components/Dropdown/index.html +0 -116
  231. package/coverage/lcov-report/Components/EmptyState/EmptyState.tsx.html +0 -466
  232. package/coverage/lcov-report/Components/EmptyState/index.html +0 -116
  233. package/coverage/lcov-report/Components/Header/HeaderActions.tsx.html +0 -373
  234. package/coverage/lcov-report/Components/Header/index.html +0 -116
  235. package/coverage/lcov-report/Components/Input/TextInput.tsx.html +0 -487
  236. package/coverage/lcov-report/Components/Input/index.html +0 -116
  237. package/coverage/lcov-report/Components/Input/textInputIconSize.ts.html +0 -205
  238. package/coverage/lcov-report/Components/KanbanBoard/AccountCard.tsx.html +0 -547
  239. package/coverage/lcov-report/Components/KanbanBoard/AccountRow.tsx.html +0 -190
  240. package/coverage/lcov-report/Components/KanbanBoard/KanbanActions/KanbanActions.tsx.html +0 -247
  241. package/coverage/lcov-report/Components/KanbanBoard/KanbanActions/index.html +0 -116
  242. package/coverage/lcov-report/Components/KanbanBoard/KanbanBoard.tsx.html +0 -3598
  243. package/coverage/lcov-report/Components/KanbanBoard/MeasuredItem.tsx.html +0 -283
  244. package/coverage/lcov-report/Components/KanbanBoard/index.html +0 -161
  245. package/coverage/lcov-report/Components/OrganizationDetails/CreateOrgModal.tsx.html +0 -511
  246. package/coverage/lcov-report/Components/OrganizationDetails/DeleteOrgModal.tsx.html +0 -334
  247. package/coverage/lcov-report/Components/OrganizationDetails/OrganizationDetails.tsx.html +0 -1519
  248. package/coverage/lcov-report/Components/OrganizationDetails/index.html +0 -146
  249. package/coverage/lcov-report/Components/RolesPermission/DeleteRoleModal.tsx.html +0 -328
  250. package/coverage/lcov-report/Components/RolesPermission/RolesPermission.tsx.html +0 -1732
  251. package/coverage/lcov-report/Components/RolesPermission/index.html +0 -131
  252. package/coverage/lcov-report/Components/SearchSelect/SearchSelect.tsx.html +0 -2575
  253. package/coverage/lcov-report/Components/SearchSelect/SelectTruncatedLabel.tsx.html +0 -202
  254. package/coverage/lcov-report/Components/SearchSelect/index.html +0 -146
  255. package/coverage/lcov-report/Components/SearchSelect/searchSelectSize.ts.html +0 -496
  256. package/coverage/lcov-report/Components/Select/Select.tsx.html +0 -361
  257. package/coverage/lcov-report/Components/Select/index.html +0 -116
  258. package/coverage/lcov-report/Components/SideBar/components/OtherApps.tsx.html +0 -562
  259. package/coverage/lcov-report/Components/SideBar/components/OverflowTooltipText.tsx.html +0 -346
  260. package/coverage/lcov-report/Components/SideBar/components/index.html +0 -116
  261. package/coverage/lcov-report/Components/SignInActivityTable/SignInActivityTable.tsx.html +0 -490
  262. package/coverage/lcov-report/Components/SignInActivityTable/index.html +0 -116
  263. package/coverage/lcov-report/Components/Table/components/TableActions.tsx.html +0 -595
  264. package/coverage/lcov-report/Components/Table/components/TableBody.tsx.html +0 -2212
  265. package/coverage/lcov-report/Components/Table/components/TableGroupRow.tsx.html +0 -358
  266. package/coverage/lcov-report/Components/Table/components/TableLoading.tsx.html +0 -358
  267. package/coverage/lcov-report/Components/Table/components/index.html +0 -161
  268. package/coverage/lcov-report/Components/Table/settings/ManageColumns.tsx.html +0 -856
  269. package/coverage/lcov-report/Components/Table/settings/index.html +0 -116
  270. package/coverage/lcov-report/Components/Tag/Tag.styles.tsx.html +0 -331
  271. package/coverage/lcov-report/Components/Tag/Tag.tsx.html +0 -256
  272. package/coverage/lcov-report/Components/Tag/index.html +0 -131
  273. package/coverage/lcov-report/Components/ToolTip/ToolTip.tsx.html +0 -286
  274. package/coverage/lcov-report/Components/ToolTip/index.html +0 -116
  275. package/coverage/lcov-report/Components/UserDetails/AddUserModal.tsx.html +0 -709
  276. package/coverage/lcov-report/Components/UserDetails/ChangeRoleModal.tsx.html +0 -505
  277. package/coverage/lcov-report/Components/UserDetails/DeactivateConfirmModal.tsx.html +0 -379
  278. package/coverage/lcov-report/Components/UserDetails/UserDetails.tsx.html +0 -1900
  279. package/coverage/lcov-report/Components/UserDetails/index.html +0 -161
  280. package/coverage/lcov-report/EmptyState/EmptyState.tsx.html +0 -466
  281. package/coverage/lcov-report/EmptyState/index.html +0 -116
  282. package/coverage/lcov-report/Hooks/index.html +0 -116
  283. package/coverage/lcov-report/Hooks/usePreferences.ts.html +0 -421
  284. package/coverage/lcov-report/Input/TextInput.tsx.html +0 -487
  285. package/coverage/lcov-report/Input/index.html +0 -131
  286. package/coverage/lcov-report/Input/textInputIconSize.ts.html +0 -205
  287. package/coverage/lcov-report/KanbanBoard.tsx.html +0 -3481
  288. package/coverage/lcov-report/OrganizationDetails/CreateOrgModal.tsx.html +0 -511
  289. package/coverage/lcov-report/OrganizationDetails/DeleteOrgModal.tsx.html +0 -334
  290. package/coverage/lcov-report/OrganizationDetails/OrganizationDetails.tsx.html +0 -1519
  291. package/coverage/lcov-report/OrganizationDetails/index.html +0 -146
  292. package/coverage/lcov-report/RolesPermission/DeleteRoleModal.tsx.html +0 -328
  293. package/coverage/lcov-report/RolesPermission/RolesPermission.tsx.html +0 -1732
  294. package/coverage/lcov-report/RolesPermission/index.html +0 -116
  295. package/coverage/lcov-report/SearchSelect/SearchSelect.tsx.html +0 -2575
  296. package/coverage/lcov-report/SearchSelect/SelectTruncatedLabel.tsx.html +0 -202
  297. package/coverage/lcov-report/SearchSelect/index.html +0 -146
  298. package/coverage/lcov-report/SearchSelect/searchSelectSize.ts.html +0 -496
  299. package/coverage/lcov-report/Table/CompactSelect.tsx.html +0 -379
  300. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +0 -514
  301. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +0 -373
  302. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +0 -574
  303. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +0 -574
  304. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +0 -1027
  305. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +0 -397
  306. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +0 -1060
  307. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +0 -361
  308. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +0 -337
  309. package/coverage/lcov-report/Table/Components/index.html +0 -266
  310. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +0 -178
  311. package/coverage/lcov-report/Table/Components/useTable.ts.html +0 -778
  312. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +0 -1810
  313. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +0 -178
  314. package/coverage/lcov-report/Table/Table.tsx.html +0 -1567
  315. package/coverage/lcov-report/Table/TableProps.tsx.html +0 -658
  316. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +0 -619
  317. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +0 -229
  318. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +0 -532
  319. package/coverage/lcov-report/Table/TableSettings/index.html +0 -146
  320. package/coverage/lcov-report/Table/TableToDo.tsx.html +0 -973
  321. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +0 -271
  322. package/coverage/lcov-report/Table/filterTypes.ts.html +0 -97
  323. package/coverage/lcov-report/Table/index.html +0 -176
  324. package/coverage/lcov-report/Table/settings/ManageColumns.tsx.html +0 -856
  325. package/coverage/lcov-report/Table/settings/index.html +0 -116
  326. package/coverage/lcov-report/Tag/Tag.tsx.html +0 -256
  327. package/coverage/lcov-report/Tag/index.html +0 -116
  328. package/coverage/lcov-report/Theme/buildBrandTokens.ts.html +0 -175
  329. package/coverage/lcov-report/Theme/chartColorsFromTheme.ts.html +0 -214
  330. package/coverage/lcov-report/Theme/index.html +0 -131
  331. package/coverage/lcov-report/Theme/useCustomTheme.ts.html +0 -100
  332. package/coverage/lcov-report/ToolTip/ToolTip.tsx.html +0 -286
  333. package/coverage/lcov-report/ToolTip/index.html +0 -116
  334. package/coverage/lcov-report/UserDetails/AddUserModal.tsx.html +0 -709
  335. package/coverage/lcov-report/UserDetails/ChangeRoleModal.tsx.html +0 -505
  336. package/coverage/lcov-report/UserDetails/index.html +0 -116
  337. package/coverage/lcov-report/Utils/functions.ts.html +0 -106
  338. package/coverage/lcov-report/Utils/index.html +0 -116
  339. package/coverage/lcov-report/Utils/table.ts.html +0 -1189
  340. package/coverage/lcov-report/base.css +0 -224
  341. package/coverage/lcov-report/block-navigation.js +0 -87
  342. package/coverage/lcov-report/favicon.png +0 -0
  343. package/coverage/lcov-report/index.html +0 -251
  344. package/coverage/lcov-report/prettify.css +0 -1
  345. package/coverage/lcov-report/prettify.js +0 -2
  346. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  347. package/coverage/lcov-report/sorter.js +0 -210
  348. package/coverage/lcov.info +0 -981
  349. package/dist/App.d.ts +0 -4
  350. package/dist/App.js +0 -95
  351. package/dist/Layout.d.ts +0 -3
  352. package/dist/Layout.js +0 -286
  353. package/dist/Pages/TInput.d.ts +0 -3
  354. package/dist/Pages/TInput.d.ts.map +0 -1
  355. package/dist/Pages/TInput.js +0 -20
  356. package/dist/Pages/accordion.d.ts +0 -3
  357. package/dist/Pages/accordion.d.ts.map +0 -1
  358. package/dist/Pages/accordion.js +0 -21
  359. package/dist/Pages/alertdialog.d.ts +0 -3
  360. package/dist/Pages/alertdialog.d.ts.map +0 -1
  361. package/dist/Pages/alertdialog.js +0 -53
  362. package/dist/Pages/button.d.ts +0 -3
  363. package/dist/Pages/button.d.ts.map +0 -1
  364. package/dist/Pages/button.js +0 -32
  365. package/dist/Pages/card.d.ts +0 -3
  366. package/dist/Pages/card.d.ts.map +0 -1
  367. package/dist/Pages/card.js +0 -102
  368. package/dist/Pages/chart.d.ts +0 -4
  369. package/dist/Pages/chart.d.ts.map +0 -1
  370. package/dist/Pages/chart.js +0 -25
  371. package/dist/Pages/checkbox.d.ts +0 -3
  372. package/dist/Pages/checkbox.d.ts.map +0 -1
  373. package/dist/Pages/checkbox.js +0 -11
  374. package/dist/Pages/contactForm.d.ts +0 -3
  375. package/dist/Pages/contactForm.d.ts.map +0 -1
  376. package/dist/Pages/contactForm.js +0 -15
  377. package/dist/Pages/customModulesTable.d.ts +0 -4
  378. package/dist/Pages/customModulesTable.d.ts.map +0 -1
  379. package/dist/Pages/customModulesTable.js +0 -25
  380. package/dist/Pages/datePick.d.ts +0 -3
  381. package/dist/Pages/datePick.d.ts.map +0 -1
  382. package/dist/Pages/datePick.js +0 -49
  383. package/dist/Pages/drawer.d.ts +0 -3
  384. package/dist/Pages/drawer.d.ts.map +0 -1
  385. package/dist/Pages/drawer.js +0 -53
  386. package/dist/Pages/dropdown.d.ts +0 -3
  387. package/dist/Pages/dropdown.d.ts.map +0 -1
  388. package/dist/Pages/dropdown.js +0 -21
  389. package/dist/Pages/editor.d.ts +0 -3
  390. package/dist/Pages/editor.d.ts.map +0 -1
  391. package/dist/Pages/editor.js +0 -13
  392. package/dist/Pages/feedback.d.ts +0 -2
  393. package/dist/Pages/feedback.d.ts.map +0 -1
  394. package/dist/Pages/feedback.js +0 -12
  395. package/dist/Pages/fileUpload.d.ts +0 -2
  396. package/dist/Pages/fileUpload.d.ts.map +0 -1
  397. package/dist/Pages/fileUpload.js +0 -36
  398. package/dist/Pages/input.d.ts +0 -3
  399. package/dist/Pages/input.d.ts.map +0 -1
  400. package/dist/Pages/input.js +0 -48
  401. package/dist/Pages/kanbanboard.d.ts +0 -3
  402. package/dist/Pages/kanbanboard.d.ts.map +0 -1
  403. package/dist/Pages/kanbanboard.js +0 -182
  404. package/dist/Pages/modal.d.ts +0 -3
  405. package/dist/Pages/modal.d.ts.map +0 -1
  406. package/dist/Pages/modal.js +0 -61
  407. package/dist/Pages/multiSelect.d.ts +0 -3
  408. package/dist/Pages/multiSelect.d.ts.map +0 -1
  409. package/dist/Pages/multiSelect.js +0 -22
  410. package/dist/Pages/noteArea.d.ts +0 -3
  411. package/dist/Pages/noteArea.d.ts.map +0 -1
  412. package/dist/Pages/noteArea.js +0 -26
  413. package/dist/Pages/notification.d.ts +0 -3
  414. package/dist/Pages/notification.d.ts.map +0 -1
  415. package/dist/Pages/notification.js +0 -37
  416. package/dist/Pages/numberInput.d.ts +0 -3
  417. package/dist/Pages/numberInput.d.ts.map +0 -1
  418. package/dist/Pages/numberInput.js +0 -16
  419. package/dist/Pages/orgSwitcher.d.ts +0 -4
  420. package/dist/Pages/orgSwitcher.d.ts.map +0 -1
  421. package/dist/Pages/orgSwitcher.js +0 -36
  422. package/dist/Pages/organizationDetails.d.ts +0 -4
  423. package/dist/Pages/organizationDetails.d.ts.map +0 -1
  424. package/dist/Pages/organizationDetails.js +0 -64
  425. package/dist/Pages/photoViewer.d.ts +0 -3
  426. package/dist/Pages/photoViewer.d.ts.map +0 -1
  427. package/dist/Pages/photoViewer.js +0 -12
  428. package/dist/Pages/pinInputs.d.ts +0 -3
  429. package/dist/Pages/pinInputs.d.ts.map +0 -1
  430. package/dist/Pages/pinInputs.js +0 -11
  431. package/dist/Pages/productCaard.d.ts +0 -3
  432. package/dist/Pages/productCaard.d.ts.map +0 -1
  433. package/dist/Pages/productCaard.js +0 -311
  434. package/dist/Pages/productDetailCard.d.ts +0 -3
  435. package/dist/Pages/productDetailCard.d.ts.map +0 -1
  436. package/dist/Pages/productDetailCard.js +0 -78
  437. package/dist/Pages/productFilter.d.ts +0 -3
  438. package/dist/Pages/productFilter.d.ts.map +0 -1
  439. package/dist/Pages/productFilter.js +0 -148
  440. package/dist/Pages/progressbar.d.ts +0 -3
  441. package/dist/Pages/progressbar.d.ts.map +0 -1
  442. package/dist/Pages/progressbar.js +0 -11
  443. package/dist/Pages/radioButton.d.ts +0 -3
  444. package/dist/Pages/radioButton.d.ts.map +0 -1
  445. package/dist/Pages/radioButton.js +0 -18
  446. package/dist/Pages/rolesPermission.d.ts +0 -4
  447. package/dist/Pages/rolesPermission.d.ts.map +0 -1
  448. package/dist/Pages/rolesPermission.js +0 -144
  449. package/dist/Pages/search.d.ts +0 -3
  450. package/dist/Pages/search.d.ts.map +0 -1
  451. package/dist/Pages/search.js +0 -21
  452. package/dist/Pages/searchSelect.d.ts +0 -3
  453. package/dist/Pages/searchSelect.d.ts.map +0 -1
  454. package/dist/Pages/searchSelect.js +0 -97
  455. package/dist/Pages/select.d.ts +0 -3
  456. package/dist/Pages/select.d.ts.map +0 -1
  457. package/dist/Pages/select.js +0 -20
  458. package/dist/Pages/selectSearch.d.ts +0 -3
  459. package/dist/Pages/selectSearch.d.ts.map +0 -1
  460. package/dist/Pages/selectSearch.js +0 -58
  461. package/dist/Pages/signInActivityTable.d.ts +0 -4
  462. package/dist/Pages/signInActivityTable.d.ts.map +0 -1
  463. package/dist/Pages/signInActivityTable.js +0 -17
  464. package/dist/Pages/skeleton.d.ts +0 -3
  465. package/dist/Pages/skeleton.d.ts.map +0 -1
  466. package/dist/Pages/skeleton.js +0 -12
  467. package/dist/Pages/stageProgress.d.ts +0 -4
  468. package/dist/Pages/stageProgress.d.ts.map +0 -1
  469. package/dist/Pages/stageProgress.js +0 -31
  470. package/dist/Pages/switch.d.ts +0 -3
  471. package/dist/Pages/switch.d.ts.map +0 -1
  472. package/dist/Pages/switch.js +0 -17
  473. package/dist/Pages/table.d.ts +0 -3
  474. package/dist/Pages/table.d.ts.map +0 -1
  475. package/dist/Pages/table.js +0 -182
  476. package/dist/Pages/tag.d.ts +0 -3
  477. package/dist/Pages/tag.d.ts.map +0 -1
  478. package/dist/Pages/tag.js +0 -27
  479. package/dist/Pages/textArea.d.ts +0 -3
  480. package/dist/Pages/textArea.d.ts.map +0 -1
  481. package/dist/Pages/textArea.js +0 -14
  482. package/dist/Pages/tier1.d.ts +0 -4
  483. package/dist/Pages/tier1.d.ts.map +0 -1
  484. package/dist/Pages/tier1.js +0 -86
  485. package/dist/Pages/timeline.d.ts +0 -3
  486. package/dist/Pages/timeline.d.ts.map +0 -1
  487. package/dist/Pages/timeline.js +0 -73
  488. package/dist/Pages/tooltip.d.ts +0 -3
  489. package/dist/Pages/tooltip.d.ts.map +0 -1
  490. package/dist/Pages/tooltip.js +0 -11
  491. package/dist/Pages/toster.d.ts +0 -3
  492. package/dist/Pages/toster.d.ts.map +0 -1
  493. package/dist/Pages/toster.js +0 -53
  494. package/dist/Pages/upgradeButton.d.ts +0 -4
  495. package/dist/Pages/upgradeButton.d.ts.map +0 -1
  496. package/dist/Pages/upgradeButton.js +0 -17
  497. package/dist/Pages/userDetails.d.ts +0 -4
  498. package/dist/Pages/userDetails.d.ts.map +0 -1
  499. package/dist/Pages/userDetails.js +0 -79
  500. package/dist/Pages/verifyEmail.d.ts +0 -3
  501. package/dist/Pages/verifyEmail.d.ts.map +0 -1
  502. package/dist/Pages/verifyEmail.js +0 -17
  503. package/dist/Theme/Dark/theme.d.ts +0 -3
  504. package/dist/Theme/Dark/theme.d.ts.map +0 -1
  505. package/dist/Theme/Dark/theme.js +0 -277
  506. package/dist/Theme/Default/palette.d.ts +0 -375
  507. package/dist/Theme/Default/palette.d.ts.map +0 -1
  508. package/dist/Theme/Default/palette.js +0 -306
  509. package/dist/Theme/Default/theme.d.ts +0 -3
  510. package/dist/Theme/Default/theme.d.ts.map +0 -1
  511. package/dist/Theme/Default/theme.js +0 -19
  512. package/dist/Theme/Emerald/palette.d.ts +0 -375
  513. package/dist/Theme/Emerald/palette.d.ts.map +0 -1
  514. package/dist/Theme/Emerald/palette.js +0 -125
  515. package/dist/Theme/Emerald/theme.d.ts +0 -3
  516. package/dist/Theme/Emerald/theme.d.ts.map +0 -1
  517. package/dist/Theme/Emerald/theme.js +0 -19
  518. package/dist/Theme/Meadow/palette.d.ts +0 -375
  519. package/dist/Theme/Meadow/palette.d.ts.map +0 -1
  520. package/dist/Theme/Meadow/palette.js +0 -123
  521. package/dist/Theme/Meadow/theme.d.ts +0 -3
  522. package/dist/Theme/Meadow/theme.d.ts.map +0 -1
  523. package/dist/Theme/Meadow/theme.js +0 -19
  524. package/dist/Theme/Radiant/palette.d.ts +0 -375
  525. package/dist/Theme/Radiant/palette.d.ts.map +0 -1
  526. package/dist/Theme/Radiant/palette.js +0 -125
  527. package/dist/Theme/Radiant/theme.d.ts +0 -3
  528. package/dist/Theme/Radiant/theme.d.ts.map +0 -1
  529. package/dist/Theme/Radiant/theme.js +0 -19
  530. package/dist/Theme/Rosewood/palette.d.ts +0 -375
  531. package/dist/Theme/Rosewood/palette.d.ts.map +0 -1
  532. package/dist/Theme/Rosewood/palette.js +0 -125
  533. package/dist/Theme/Rosewood/theme.d.ts +0 -3
  534. package/dist/Theme/Rosewood/theme.d.ts.map +0 -1
  535. package/dist/Theme/Rosewood/theme.js +0 -19
  536. package/dist/Theme/Skyline/palette.d.ts +0 -375
  537. package/dist/Theme/Skyline/palette.d.ts.map +0 -1
  538. package/dist/Theme/Skyline/palette.js +0 -123
  539. package/dist/Theme/Skyline/theme.d.ts +0 -3
  540. package/dist/Theme/Skyline/theme.d.ts.map +0 -1
  541. package/dist/Theme/Skyline/theme.js +0 -19
  542. package/dist/Theme/Slate/palette.d.ts +0 -375
  543. package/dist/Theme/Slate/palette.d.ts.map +0 -1
  544. package/dist/Theme/Slate/palette.js +0 -123
  545. package/dist/Theme/Slate/theme.d.ts +0 -3
  546. package/dist/Theme/Slate/theme.d.ts.map +0 -1
  547. package/dist/Theme/Slate/theme.js +0 -19
  548. package/dist/Theme/buildBrandTokens.d.ts +0 -16
  549. package/dist/Theme/buildBrandTokens.d.ts.map +0 -1
  550. package/dist/Theme/buildBrandTokens.js +0 -33
  551. package/dist/Theme/chartColorsFromTheme.d.ts +0 -19
  552. package/dist/Theme/chartColorsFromTheme.d.ts.map +0 -1
  553. package/dist/Theme/chartColorsFromTheme.js +0 -34
  554. package/dist/Theme/common.d.ts +0 -167
  555. package/dist/Theme/common.d.ts.map +0 -1
  556. package/dist/Theme/common.js +0 -112
  557. package/dist/Theme/componentStyles.d.ts +0 -10
  558. package/dist/Theme/componentStyles.d.ts.map +0 -1
  559. package/dist/Theme/componentStyles.js +0 -19
  560. package/dist/Theme/fonts.d.ts +0 -37
  561. package/dist/Theme/fonts.d.ts.map +0 -1
  562. package/dist/Theme/fonts.js +0 -41
  563. package/dist/Theme/space.d.ts +0 -34
  564. package/dist/Theme/space.d.ts.map +0 -1
  565. package/dist/Theme/space.js +0 -35
  566. package/dist/Theme/theme.d.ts +0 -3
  567. package/dist/Theme/theme.d.ts.map +0 -1
  568. package/dist/Theme/theme.js +0 -12
  569. package/dist/bootstrap.d.ts +0 -2
  570. package/dist/bootstrap.js +0 -16
  571. package/eslint.config.js +0 -48
  572. package/index.html +0 -13
  573. package/vite.config.ts +0 -13
@@ -0,0 +1,35 @@
1
+ import type { ColorScale, ResolvedColorMode } from "../types";
2
+ export type StatusTone = {
3
+ /** Chip fill. */
4
+ bg: string;
5
+ /** Label ink, guaranteed >= 4.5:1 on `bg`. */
6
+ fg: string;
7
+ /** Chip outline, guaranteed >= 3:1 on `bg`. */
8
+ border: string;
9
+ };
10
+ /**
11
+ * Status chips (open / in-progress / resolved …) were authored as `X.500` text on an `X.100`
12
+ * tint, which measures 3.3-4.4:1 — under the 4.5:1 body-text bar in BOTH modes. The ink is
13
+ * resolved from the scale's own hue instead of pinned, so every brand and both modes land on the
14
+ * lightest ink that still passes rather than a hand-copied hex that goes stale.
15
+ *
16
+ * `reverseScale` flips the utility ramps in dark, so `X.100` is already a dark tint there and the
17
+ * ink walks lighter instead of darker — hence the mode argument.
18
+ */
19
+ export declare function resolveStatusTone(scale: ColorScale, mode: ResolvedColorMode): StatusTone;
20
+ /**
21
+ * Avatar initials are drawn white on a generated fill. The seed hues in use measured 1.92:1
22
+ * (`#eab308`), 2.54:1 (`#10b981`) and 3.76:1 (`#ef4444`) — failing in light mode too, not just
23
+ * dark. Darkening the fill keeps the intended hue and the white-initials look while clearing AA.
24
+ */
25
+ export declare function resolveAvatarFill(hex: string, target?: number): string;
26
+ /**
27
+ * Hue set for generated avatars. Values are seeds, not final fills — always pass them through
28
+ * `resolveAvatarFill` so the white initials stay legible.
29
+ */
30
+ export declare const AVATAR_SEEDS: readonly ["#ef4444", "#f97316", "#eab308", "#22c55e", "#10b981", "#06b6d4", "#3b82f6", "#8b5cf6", "#ec4899"];
31
+ /** Stable per-name avatar fill: same name always yields the same accessible colour. */
32
+ export declare function avatarFillFor(seedText: string): string;
33
+ /** True when `fg` clears the body-text bar on `bg` — exported for consumer assertions. */
34
+ export declare const meetsBodyText: (fg: string, bg: string) => boolean;
35
+ //# sourceMappingURL=statusTone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusTone.d.ts","sourceRoot":"","sources":["../../../../src/Theme/tokens/builders/statusTone.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAUxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAuB,GAAG,MAAM,CAGtF;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,8GAUf,CAAC;AAEX,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED,0FAA0F;AAC1F,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,OACd,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.meetsBodyText = exports.AVATAR_SEEDS = void 0;
4
+ exports.resolveStatusTone = resolveStatusTone;
5
+ exports.resolveAvatarFill = resolveAvatarFill;
6
+ exports.avatarFillFor = avatarFillFor;
7
+ const color_1 = require("./color");
8
+ const accentText_1 = require("./accentText");
9
+ const outlineRung_1 = require("./outlineRung");
10
+ /**
11
+ * Status chips (open / in-progress / resolved …) were authored as `X.500` text on an `X.100`
12
+ * tint, which measures 3.3-4.4:1 — under the 4.5:1 body-text bar in BOTH modes. The ink is
13
+ * resolved from the scale's own hue instead of pinned, so every brand and both modes land on the
14
+ * lightest ink that still passes rather than a hand-copied hex that goes stale.
15
+ *
16
+ * `reverseScale` flips the utility ramps in dark, so `X.100` is already a dark tint there and the
17
+ * ink walks lighter instead of darker — hence the mode argument.
18
+ */
19
+ function resolveStatusTone(scale, mode) {
20
+ const bg = scale[100];
21
+ const inkSeed = mode === "dark" ? scale[300] : scale[700];
22
+ const edgeSeed = mode === "dark" ? scale[400] : scale[300];
23
+ return {
24
+ bg,
25
+ fg: (0, outlineRung_1.liftToContrast)(inkSeed, bg, mode, accentText_1.AA_NORMAL_TEXT),
26
+ border: (0, outlineRung_1.liftToContrast)(edgeSeed, bg, mode, outlineRung_1.AA_NON_TEXT),
27
+ };
28
+ }
29
+ /**
30
+ * Avatar initials are drawn white on a generated fill. The seed hues in use measured 1.92:1
31
+ * (`#eab308`), 2.54:1 (`#10b981`) and 3.76:1 (`#ef4444`) — failing in light mode too, not just
32
+ * dark. Darkening the fill keeps the intended hue and the white-initials look while clearing AA.
33
+ */
34
+ function resolveAvatarFill(hex, target = accentText_1.AA_NORMAL_TEXT) {
35
+ // "light" walks downward in lightness — i.e. darken until white ink clears the bar.
36
+ return (0, outlineRung_1.liftToContrast)(hex, "#ffffff", "light", target);
37
+ }
38
+ /**
39
+ * Hue set for generated avatars. Values are seeds, not final fills — always pass them through
40
+ * `resolveAvatarFill` so the white initials stay legible.
41
+ */
42
+ exports.AVATAR_SEEDS = [
43
+ "#ef4444",
44
+ "#f97316",
45
+ "#eab308",
46
+ "#22c55e",
47
+ "#10b981",
48
+ "#06b6d4",
49
+ "#3b82f6",
50
+ "#8b5cf6",
51
+ "#ec4899",
52
+ ];
53
+ /** Stable per-name avatar fill: same name always yields the same accessible colour. */
54
+ function avatarFillFor(seedText) {
55
+ let hash = 0;
56
+ for (let i = 0; i < seedText.length; i++) {
57
+ hash = (hash * 31 + seedText.charCodeAt(i)) >>> 0;
58
+ }
59
+ return resolveAvatarFill(exports.AVATAR_SEEDS[hash % exports.AVATAR_SEEDS.length]);
60
+ }
61
+ /** True when `fg` clears the body-text bar on `bg` — exported for consumer assertions. */
62
+ const meetsBodyText = (fg, bg) => (0, color_1.contrastRatio)(fg, bg) >= accentText_1.AA_NORMAL_TEXT;
63
+ exports.meetsBodyText = meetsBodyText;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Cross-app "Account handoff": deep-link from a product app (CRM, Tickets, HRMS)
3
+ * into the Account app carrying the token, so the user lands signed in. Consuming
4
+ * apps once copy-pasted this per repo; it lives here so they share one contract.
5
+ *
6
+ * Query-param contract (must stay in sync across every caller):
7
+ * `sourceApp`, `returnUrl`, `orgId`, `api_key` (+ `userId` on the users page).
8
+ *
9
+ * The library is pre-bundled, so it must not read `import.meta.env` — that would
10
+ * bake in the library's own build env. Env-derived values are injected as config.
11
+ */
12
+ export declare function isAllowedReturnUrl(url: string): boolean;
13
+ export type ResolveReturnUrlOptions = {
14
+ /** App-specific fallback (e.g. its own origin) used when the param is missing/disallowed. */
15
+ defaultReturnUrl?: string;
16
+ };
17
+ /**
18
+ * Receiver side (Account). Returns the `returnUrl` param only when it passes the
19
+ * allowlist, else the caller's `defaultReturnUrl` when that is allowed, else null.
20
+ * `fallbackOrgId` is accepted for caller symmetry; the app owns any org-derived
21
+ * fallback via `opts.defaultReturnUrl`.
22
+ */
23
+ export declare function resolveReturnUrl(searchParams: URLSearchParams, fallbackOrgId?: number | string | null, opts?: ResolveReturnUrlOptions): string | null;
24
+ export type AccountHandoffConfig = {
25
+ sourceApp: string;
26
+ /** The app's `VITE_ACCOUNT_UI` (may be empty). */
27
+ accountUiBase?: string;
28
+ /** This app's dev port, e.g. "3002". */
29
+ appLocalPort: string;
30
+ /** Account's dev port. Defaults to "3000". */
31
+ accountLocalPort?: string;
32
+ /** The app's `VITE_FORCE_REMOTE_ACCOUNT_UI === "true"`. */
33
+ forceRemote?: boolean;
34
+ /** Where Account returns the user to. Defaults to this app's own origin. */
35
+ buildReturnUrl?: (orgId?: number | string | null) => string;
36
+ };
37
+ export type AccountHandoffLinkOptions = {
38
+ sourceApp?: string;
39
+ returnUrl?: string;
40
+ orgId?: number | string | null;
41
+ token?: string | null;
42
+ };
43
+ export type AccountHandoffUsersOptions = AccountHandoffLinkOptions & {
44
+ userId?: number | string | null;
45
+ };
46
+ export type AccountHandoff = {
47
+ resolveAccountUiBase: () => string;
48
+ buildUsersPageUrl: (options?: AccountHandoffUsersOptions) => string;
49
+ navigateToUsersPage: (options?: AccountHandoffUsersOptions) => void;
50
+ buildOrganizationPageUrl: (options?: AccountHandoffLinkOptions) => string;
51
+ navigateToOrganizationPage: (options?: AccountHandoffLinkOptions) => void;
52
+ };
53
+ export declare function createAccountHandoff(config: AccountHandoffConfig): AccountHandoff;
54
+ //# sourceMappingURL=accountHandoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountHandoff.d.ts","sourceRoot":"","sources":["../../src/Utils/accountHandoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYvD;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,eAAe,EAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EACtC,IAAI,CAAC,EAAE,uBAAuB,GAC7B,MAAM,GAAG,IAAI,CAcf;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,yBAAyB,GAAG;IACnE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,oBAAoB,EAAE,MAAM,MAAM,CAAC;IACnC,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,MAAM,CAAC;IACpE,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACpE,wBAAwB,EAAE,CAAC,OAAO,CAAC,EAAE,yBAAyB,KAAK,MAAM,CAAC;IAC1E,0BAA0B,EAAE,CAAC,OAAO,CAAC,EAAE,yBAAyB,KAAK,IAAI,CAAC;CAC3E,CAAC;AAaF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAyGjF"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-app "Account handoff": deep-link from a product app (CRM, Tickets, HRMS)
4
+ * into the Account app carrying the token, so the user lands signed in. Consuming
5
+ * apps once copy-pasted this per repo; it lives here so they share one contract.
6
+ *
7
+ * Query-param contract (must stay in sync across every caller):
8
+ * `sourceApp`, `returnUrl`, `orgId`, `api_key` (+ `userId` on the users page).
9
+ *
10
+ * The library is pre-bundled, so it must not read `import.meta.env` — that would
11
+ * bake in the library's own build env. Env-derived values are injected as config.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.isAllowedReturnUrl = isAllowedReturnUrl;
15
+ exports.resolveReturnUrl = resolveReturnUrl;
16
+ exports.createAccountHandoff = createAccountHandoff;
17
+ const ALLOWED_RETURN_HOST_PATTERNS = [
18
+ /^localhost$/,
19
+ /^127\.0\.0\.1$/,
20
+ /\.pixelizetech\.com$/i,
21
+ ];
22
+ const DEFAULT_ACCOUNT_PORT = "3000";
23
+ function isAllowedReturnUrl(url) {
24
+ try {
25
+ const parsed = new URL(url);
26
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
27
+ return false;
28
+ }
29
+ return ALLOWED_RETURN_HOST_PATTERNS.some((pattern) => pattern.test(parsed.hostname));
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Receiver side (Account). Returns the `returnUrl` param only when it passes the
37
+ * allowlist, else the caller's `defaultReturnUrl` when that is allowed, else null.
38
+ * `fallbackOrgId` is accepted for caller symmetry; the app owns any org-derived
39
+ * fallback via `opts.defaultReturnUrl`.
40
+ */
41
+ function resolveReturnUrl(searchParams, fallbackOrgId, opts) {
42
+ void fallbackOrgId;
43
+ const returnUrl = searchParams.get("returnUrl");
44
+ if (returnUrl && isAllowedReturnUrl(returnUrl)) {
45
+ return returnUrl;
46
+ }
47
+ const fallback = opts === null || opts === void 0 ? void 0 : opts.defaultReturnUrl;
48
+ if (fallback && isAllowedReturnUrl(fallback)) {
49
+ return fallback;
50
+ }
51
+ return null;
52
+ }
53
+ function isLocalDevHost(hostname) {
54
+ return /^(localhost|127\.0\.0\.1)$/i.test(hostname);
55
+ }
56
+ function currentPagePort() {
57
+ return (window.location.port ||
58
+ (window.location.protocol === "https:" ? "443" : "80"));
59
+ }
60
+ function createAccountHandoff(config) {
61
+ var _a;
62
+ /** Account origin for local dev. Never this app's own port — a same-origin URL would keep the user here. */
63
+ function localAccountBase(hostname) {
64
+ const pagePort = currentPagePort();
65
+ let port = String(config.accountLocalPort || DEFAULT_ACCOUNT_PORT).trim() ||
66
+ DEFAULT_ACCOUNT_PORT;
67
+ if (port === pagePort || port === config.appLocalPort) {
68
+ port = DEFAULT_ACCOUNT_PORT;
69
+ }
70
+ if (port === pagePort) {
71
+ port = pagePort === "3000" ? "3001" : DEFAULT_ACCOUNT_PORT;
72
+ }
73
+ return `http://${hostname}:${port}`;
74
+ }
75
+ function resolveAccountUiBase() {
76
+ const hostname = window.location.hostname;
77
+ const configured = String(config.accountUiBase || "")
78
+ .trim()
79
+ .replace(/\/$/, "");
80
+ if (!config.forceRemote && isLocalDevHost(hostname)) {
81
+ return localAccountBase(hostname);
82
+ }
83
+ if (!configured) {
84
+ return localAccountBase(hostname);
85
+ }
86
+ try {
87
+ if (new URL(configured).origin === window.location.origin) {
88
+ return localAccountBase(hostname);
89
+ }
90
+ }
91
+ catch {
92
+ return localAccountBase(hostname);
93
+ }
94
+ return configured;
95
+ }
96
+ const buildReturnUrl = (_a = config.buildReturnUrl) !== null && _a !== void 0 ? _a : (() => window.location.origin.replace(/\/$/, ""));
97
+ function buildParams(options) {
98
+ var _a, _b;
99
+ const params = new URLSearchParams();
100
+ params.set("sourceApp", (_a = options.sourceApp) !== null && _a !== void 0 ? _a : config.sourceApp);
101
+ const returnUrl = (_b = options.returnUrl) !== null && _b !== void 0 ? _b : buildReturnUrl(options.orgId);
102
+ if (returnUrl && isAllowedReturnUrl(returnUrl)) {
103
+ params.set("returnUrl", returnUrl);
104
+ }
105
+ if (options.orgId) {
106
+ params.set("orgId", String(options.orgId));
107
+ }
108
+ if (options.token) {
109
+ params.set("api_key", options.token);
110
+ }
111
+ return params;
112
+ }
113
+ function buildUsersPageUrl(options = {}) {
114
+ const params = buildParams(options);
115
+ if (options.userId != null && options.userId !== "") {
116
+ params.set("userId", String(options.userId));
117
+ }
118
+ return `${resolveAccountUiBase()}/users?${params.toString()}`;
119
+ }
120
+ function navigateToUsersPage(options = {}) {
121
+ const url = buildUsersPageUrl(options);
122
+ if (!/^https?:\/\//i.test(url)) {
123
+ return;
124
+ }
125
+ window.location.assign(url);
126
+ }
127
+ function buildOrganizationPageUrl(options = {}) {
128
+ return `${resolveAccountUiBase()}/organization?${buildParams(options).toString()}`;
129
+ }
130
+ function navigateToOrganizationPage(options = {}) {
131
+ const url = buildOrganizationPageUrl(options);
132
+ if (!/^https?:\/\//i.test(url)) {
133
+ return;
134
+ }
135
+ window.location.assign(url);
136
+ }
137
+ return {
138
+ resolveAccountUiBase,
139
+ buildUsersPageUrl,
140
+ navigateToUsersPage,
141
+ buildOrganizationPageUrl,
142
+ navigateToOrganizationPage,
143
+ };
144
+ }
@@ -0,0 +1,39 @@
1
+ import { PlanPillTone } from "../Components/PlanPill/PlanPillProps";
2
+ import { PlanExpiryInput } from "./planExpiry";
3
+ export type PlanBadgeInput = {
4
+ /**
5
+ * Whether the org is on any plan at all. Defaults to true, so a caller that
6
+ * only knows the plan's name/code can omit it.
7
+ */
8
+ hasPlan?: boolean;
9
+ planName?: string | null;
10
+ /** Plan code, e.g. `"free"`. Used to detect the free plan when `isFreePlan` is omitted. */
11
+ planCode?: string | null;
12
+ /** Legacy numeric plan id, where `1` is the free plan. */
13
+ planId?: number | null;
14
+ /** Explicit free-plan flag. Overrides detection from `planCode`/`planId`/`planName`. */
15
+ isFreePlan?: boolean;
16
+ isTrial?: boolean;
17
+ isExpired?: boolean;
18
+ expiryDate?: PlanExpiryInput;
19
+ /** The badge is hidden entirely for anyone who cannot act on it. */
20
+ canManageBilling?: boolean;
21
+ /** Injectable clock, for tests. */
22
+ now?: Date;
23
+ };
24
+ export type PlanBadgeResult = {
25
+ visible: boolean;
26
+ label: string;
27
+ mobileLabel: string;
28
+ subtitle: string;
29
+ tone: PlanPillTone;
30
+ };
31
+ /**
32
+ * Turns an org's plan state into the label, urgency tone and inset-chip text for
33
+ * a `PlanPill` — the "Upgrade your plan" badge in an app's top bar.
34
+ *
35
+ * Copy and thresholds are centralized here so every app shows the same badge for
36
+ * the same org.
37
+ */
38
+ export declare function resolvePlanBadge(input: PlanBadgeInput): PlanBadgeResult;
39
+ //# sourceMappingURL=planBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planBadge.d.ts","sourceRoot":"","sources":["../../src/Utils/planBadge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EACL,eAAe,EAGhB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,wFAAwF;IACxF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mCAAmC;IACnC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;CACpB,CAAC;AA0DF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAuDvE"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvePlanBadge = resolvePlanBadge;
4
+ const planExpiry_1 = require("./planExpiry");
5
+ const UPGRADE_LABEL = "Upgrade your plan";
6
+ const UPGRADE_MOBILE_LABEL = "Upgrade";
7
+ const EXPIRED_MOBILE_LABEL = "Expired";
8
+ const TRIAL_LABEL = "Trial";
9
+ const GENERIC_PLAN_NAME = "Plan";
10
+ const LEGACY_FREE_PLAN_ID = 1;
11
+ const TRIAL_DANGER_DAYS = 3;
12
+ const ACTIVE_WARNING_DAYS = 15;
13
+ const HIDDEN = {
14
+ visible: false,
15
+ label: "",
16
+ mobileLabel: "",
17
+ subtitle: "",
18
+ tone: "normal",
19
+ };
20
+ const upgrade = (subtitle, tone = "normal") => ({
21
+ visible: true,
22
+ label: UPGRADE_LABEL,
23
+ mobileLabel: UPGRADE_MOBILE_LABEL,
24
+ subtitle,
25
+ tone,
26
+ });
27
+ const normalize = (value) => String(value !== null && value !== void 0 ? value : "")
28
+ .trim()
29
+ .toLowerCase();
30
+ function isFreePlan(input, planName) {
31
+ if (input.isFreePlan !== undefined)
32
+ return input.isFreePlan;
33
+ if (normalize(input.planCode) === "free")
34
+ return true;
35
+ if (input.planId !== null && input.planId !== undefined) {
36
+ return Number(input.planId) === LEGACY_FREE_PLAN_ID;
37
+ }
38
+ return normalize(planName) === "free";
39
+ }
40
+ /** Whole days from today to the expiry day; null when there is no usable date. */
41
+ function daysUntil(expiryDate, now) {
42
+ if (expiryDate === null || expiryDate === undefined || expiryDate === "") {
43
+ return null;
44
+ }
45
+ const expiry = expiryDate instanceof Date ? expiryDate : new Date(expiryDate);
46
+ if (isNaN(expiry.getTime()))
47
+ return null;
48
+ const startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
49
+ return Math.round((startOfDay(expiry).getTime() - startOfDay(now).getTime()) / 86400000);
50
+ }
51
+ /**
52
+ * Turns an org's plan state into the label, urgency tone and inset-chip text for
53
+ * a `PlanPill` — the "Upgrade your plan" badge in an app's top bar.
54
+ *
55
+ * Copy and thresholds are centralized here so every app shows the same badge for
56
+ * the same org.
57
+ */
58
+ function resolvePlanBadge(input) {
59
+ var _a, _b;
60
+ if (!input.canManageBilling)
61
+ return HIDDEN;
62
+ const now = (_a = input.now) !== null && _a !== void 0 ? _a : new Date();
63
+ const planName = ((_b = input.planName) === null || _b === void 0 ? void 0 : _b.trim()) || "";
64
+ const daysLeft = daysUntil(input.expiryDate, now);
65
+ const remaining = (0, planExpiry_1.formatPlanRemaining)(input.expiryDate, now);
66
+ const elapsed = (0, planExpiry_1.formatPlanElapsed)(input.expiryDate, now);
67
+ // Checked before the expiry branch: a lapsed org is downgraded to free, and
68
+ // "Free expired" is not a state worth shouting about.
69
+ if (isFreePlan(input, planName))
70
+ return upgrade("");
71
+ if (input.isExpired || elapsed !== "") {
72
+ // "<plan> expired" as the label with the elapsed time in the inset chip —
73
+ // folding both behind "Upgrade your plan" made the pill wide enough to
74
+ // crowd the header.
75
+ return {
76
+ visible: true,
77
+ label: `${planName || GENERIC_PLAN_NAME} expired`,
78
+ mobileLabel: EXPIRED_MOBILE_LABEL,
79
+ subtitle: elapsed,
80
+ tone: "danger",
81
+ };
82
+ }
83
+ if (input.hasPlan === false)
84
+ return upgrade("");
85
+ if (input.isTrial) {
86
+ return {
87
+ visible: true,
88
+ label: TRIAL_LABEL,
89
+ mobileLabel: TRIAL_LABEL,
90
+ subtitle: remaining,
91
+ tone: daysLeft !== null && daysLeft <= TRIAL_DANGER_DAYS
92
+ ? "danger"
93
+ : "warning",
94
+ };
95
+ }
96
+ const tone = daysLeft !== null && daysLeft < ACTIVE_WARNING_DAYS ? "warning" : "normal";
97
+ // An active paid plan names itself — falling through to "Upgrade your plan"
98
+ // told users with years remaining that they were on nothing.
99
+ if (!planName)
100
+ return upgrade(remaining, tone);
101
+ return {
102
+ visible: true,
103
+ label: planName,
104
+ mobileLabel: planName,
105
+ subtitle: remaining,
106
+ tone,
107
+ };
108
+ }
@@ -0,0 +1,35 @@
1
+ export type PlanExpiryInput = string | number | Date | null | undefined;
2
+ /**
3
+ * Calendar months + leftover days between two dates.
4
+ * Anchoring on a real month boundary keeps "1 month" honest across 28/30/31-day
5
+ * months, so Jan 31 → Feb 28 reads as 28 days rather than a whole month.
6
+ */
7
+ export declare function splitMonthsAndDays(from: Date, to: Date): {
8
+ months: number;
9
+ days: number;
10
+ };
11
+ /**
12
+ * Time left on a plan, compactly: `"3mo left"` once a whole month remains,
13
+ * `"18d left"` below that. Intended for `UpgradeButton`'s `subtitle`, so it
14
+ * stays one short line. Returns `""` when there is no usable date or the plan
15
+ * has already lapsed — an expired plan is a different message, which the
16
+ * consuming app owns.
17
+ */
18
+ export declare function formatPlanExpiry(expiryDate: PlanExpiryInput, now?: Date): string;
19
+ /**
20
+ * Time left on a plan, to the minute in the final day: `"3mo left"`, `"18d left"`,
21
+ * then `"23h 45m left"` down to `"1m left"`. `""` once lapsed.
22
+ *
23
+ * Differs from `formatPlanExpiry` only in that last day: a calendar-day count
24
+ * reads as "Expires today" for the whole day, which goes stale next to a live
25
+ * countdown. Prefer this for a badge that sits on screen; `formatPlanExpiry`
26
+ * stays the cheaper day-granular option.
27
+ */
28
+ export declare function formatPlanRemaining(expiryDate: PlanExpiryInput, now?: Date): string;
29
+ /**
30
+ * How long ago a plan lapsed: `"1h 10m ago"` under a day, `"2d ago"` / `"1mo ago"`
31
+ * beyond it. `""` while the plan is still live — so a badge can say how stale a
32
+ * lapse is rather than a bare "expired".
33
+ */
34
+ export declare function formatPlanElapsed(expiryDate: PlanExpiryInput, now?: Date): string;
35
+ //# sourceMappingURL=planExpiry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planExpiry.d.ts","sourceRoot":"","sources":["../../src/Utils/planExpiry.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAoCxE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,IAAI,GACP;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAOlC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,eAAe,EAC3B,GAAG,CAAC,EAAE,IAAI,GACT,MAAM,CAaR;AAYD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,eAAe,EAC3B,GAAG,CAAC,EAAE,IAAI,GACT,MAAM,CAgBR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,eAAe,EAC3B,GAAG,CAAC,EAAE,IAAI,GACT,MAAM,CAgBR"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.splitMonthsAndDays = splitMonthsAndDays;
4
+ exports.formatPlanExpiry = formatPlanExpiry;
5
+ exports.formatPlanRemaining = formatPlanRemaining;
6
+ exports.formatPlanElapsed = formatPlanElapsed;
7
+ const MS_PER_DAY = 24 * 60 * 60 * 1000;
8
+ function toDate(value) {
9
+ if (value === null || value === undefined || value === "")
10
+ return null;
11
+ const date = value instanceof Date ? new Date(value.getTime()) : new Date(value);
12
+ return isNaN(date.getTime()) ? null : date;
13
+ }
14
+ function startOfDay(date) {
15
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
16
+ }
17
+ function addCalendarMonths(date, months) {
18
+ const lastDayOfTarget = new Date(date.getFullYear(), date.getMonth() + months + 1, 0).getDate();
19
+ return new Date(date.getFullYear(), date.getMonth() + months, Math.min(date.getDate(), lastDayOfTarget));
20
+ }
21
+ function daysBetween(from, to) {
22
+ return Math.round((to.getTime() - from.getTime()) / MS_PER_DAY);
23
+ }
24
+ /** Compact units (`2mo`, `5d`) — this reads inside a badge subtitle, where
25
+ * "2 months 5 days left" wraps. */
26
+ function unit(count, suffix) {
27
+ return `${count}${suffix}`;
28
+ }
29
+ /**
30
+ * Calendar months + leftover days between two dates.
31
+ * Anchoring on a real month boundary keeps "1 month" honest across 28/30/31-day
32
+ * months, so Jan 31 → Feb 28 reads as 28 days rather than a whole month.
33
+ */
34
+ function splitMonthsAndDays(from, to) {
35
+ let months = (to.getFullYear() - from.getFullYear()) * 12 +
36
+ (to.getMonth() - from.getMonth());
37
+ if (to.getDate() < from.getDate())
38
+ months -= 1;
39
+ if (months < 0)
40
+ months = 0;
41
+ return { months, days: daysBetween(addCalendarMonths(from, months), to) };
42
+ }
43
+ /**
44
+ * Time left on a plan, compactly: `"3mo left"` once a whole month remains,
45
+ * `"18d left"` below that. Intended for `UpgradeButton`'s `subtitle`, so it
46
+ * stays one short line. Returns `""` when there is no usable date or the plan
47
+ * has already lapsed — an expired plan is a different message, which the
48
+ * consuming app owns.
49
+ */
50
+ function formatPlanExpiry(expiryDate, now) {
51
+ const expiry = toDate(expiryDate);
52
+ if (!expiry)
53
+ return "";
54
+ const expiryDay = startOfDay(expiry);
55
+ const today = startOfDay(now !== null && now !== void 0 ? now : new Date());
56
+ const daysLeft = daysBetween(today, expiryDay);
57
+ if (daysLeft < 0)
58
+ return "";
59
+ if (daysLeft === 0)
60
+ return "Expires today";
61
+ const { months, days } = splitMonthsAndDays(today, expiryDay);
62
+ return months > 0 ? `${unit(months, "mo")} left` : `${unit(days, "d")} left`;
63
+ }
64
+ /** Never reports `0m`; the final stretch reads `1m`. */
65
+ function formatHoursMinutes(ms, suffix) {
66
+ const totalMinutes = Math.floor(ms / 60000);
67
+ const hours = Math.floor(totalMinutes / 60);
68
+ const minutes = totalMinutes % 60;
69
+ return hours > 0
70
+ ? `${unit(hours, "h")} ${unit(minutes, "m")} ${suffix}`
71
+ : `${unit(Math.max(minutes, 1), "m")} ${suffix}`;
72
+ }
73
+ /**
74
+ * Time left on a plan, to the minute in the final day: `"3mo left"`, `"18d left"`,
75
+ * then `"23h 45m left"` down to `"1m left"`. `""` once lapsed.
76
+ *
77
+ * Differs from `formatPlanExpiry` only in that last day: a calendar-day count
78
+ * reads as "Expires today" for the whole day, which goes stale next to a live
79
+ * countdown. Prefer this for a badge that sits on screen; `formatPlanExpiry`
80
+ * stays the cheaper day-granular option.
81
+ */
82
+ function formatPlanRemaining(expiryDate, now) {
83
+ const expiry = toDate(expiryDate);
84
+ if (!expiry)
85
+ return "";
86
+ const referenceNow = now !== null && now !== void 0 ? now : new Date();
87
+ const msLeft = expiry.getTime() - referenceNow.getTime();
88
+ if (msLeft < 0)
89
+ return "";
90
+ if (msLeft < MS_PER_DAY) {
91
+ return msLeft === 0 ? "Expires today" : formatHoursMinutes(msLeft, "left");
92
+ }
93
+ const { months, days } = splitMonthsAndDays(startOfDay(referenceNow), startOfDay(expiry));
94
+ return months > 0 ? `${unit(months, "mo")} left` : `${unit(days, "d")} left`;
95
+ }
96
+ /**
97
+ * How long ago a plan lapsed: `"1h 10m ago"` under a day, `"2d ago"` / `"1mo ago"`
98
+ * beyond it. `""` while the plan is still live — so a badge can say how stale a
99
+ * lapse is rather than a bare "expired".
100
+ */
101
+ function formatPlanElapsed(expiryDate, now) {
102
+ const expiry = toDate(expiryDate);
103
+ if (!expiry)
104
+ return "";
105
+ const referenceNow = now !== null && now !== void 0 ? now : new Date();
106
+ const msAgo = referenceNow.getTime() - expiry.getTime();
107
+ if (msAgo <= 0)
108
+ return "";
109
+ if (msAgo < MS_PER_DAY)
110
+ return formatHoursMinutes(msAgo, "ago");
111
+ const { months, days } = splitMonthsAndDays(startOfDay(expiry), startOfDay(referenceNow));
112
+ return months > 0
113
+ ? `${unit(months, "mo")} ago`
114
+ : `${unit(Math.max(days, 1), "d")} ago`;
115
+ }