@marinoscar/platform-web 0.1.0-next.17 → 0.1.0-next.19

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 (358) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +3 -2
  3. package/dist/ai/headless/errors.d.ts +7 -0
  4. package/dist/ai/headless/errors.d.ts.map +1 -1
  5. package/dist/ai/headless/errors.js +2 -0
  6. package/dist/ai/headless/errors.js.map +1 -1
  7. package/dist/ai/headless/schema-presets.js +1 -1
  8. package/dist/ai/headless/schema-presets.js.map +1 -1
  9. package/dist/ai/headless/types.d.ts +30 -5
  10. package/dist/ai/headless/types.d.ts.map +1 -1
  11. package/dist/ai/headless/types.js +22 -10
  12. package/dist/ai/headless/types.js.map +1 -1
  13. package/dist/ai/headless/use-ai-usage.d.ts +5 -2
  14. package/dist/ai/headless/use-ai-usage.d.ts.map +1 -1
  15. package/dist/ai/headless/use-ai-usage.js +15 -5
  16. package/dist/ai/headless/use-ai-usage.js.map +1 -1
  17. package/dist/ai/ui/AiConfigPage.d.ts.map +1 -1
  18. package/dist/ai/ui/AiConfigPage.js +3 -2
  19. package/dist/ai/ui/AiConfigPage.js.map +1 -1
  20. package/dist/ai/ui/AiModelsPage.d.ts.map +1 -1
  21. package/dist/ai/ui/AiModelsPage.js +4 -2
  22. package/dist/ai/ui/AiModelsPage.js.map +1 -1
  23. package/dist/ai/ui/AiUsagePage.d.ts.map +1 -1
  24. package/dist/ai/ui/AiUsagePage.js +7 -5
  25. package/dist/ai/ui/AiUsagePage.js.map +1 -1
  26. package/dist/ai/ui/OrgAiKeysPage.d.ts.map +1 -1
  27. package/dist/ai/ui/OrgAiKeysPage.js +3 -2
  28. package/dist/ai/ui/OrgAiKeysPage.js.map +1 -1
  29. package/dist/ai/ui/admin/AiGenericProviderCard.d.ts.map +1 -1
  30. package/dist/ai/ui/admin/AiGenericProviderCard.js +2 -0
  31. package/dist/ai/ui/admin/AiGenericProviderCard.js.map +1 -1
  32. package/dist/ai/ui/admin/AiProviderCard.d.ts.map +1 -1
  33. package/dist/ai/ui/admin/AiProviderCard.js +2 -0
  34. package/dist/ai/ui/admin/AiProviderCard.js.map +1 -1
  35. package/dist/ai/ui/admin/AiProviderKeyActions.d.ts.map +1 -1
  36. package/dist/ai/ui/admin/AiProviderKeyActions.js +2 -1
  37. package/dist/ai/ui/admin/AiProviderKeyActions.js.map +1 -1
  38. package/dist/ai/ui/admin/aiModelColumns.d.ts.map +1 -1
  39. package/dist/ai/ui/admin/aiModelColumns.js +2 -1
  40. package/dist/ai/ui/admin/aiModelColumns.js.map +1 -1
  41. package/dist/ai/ui/shared/AiErrorAlert.d.ts.map +1 -1
  42. package/dist/ai/ui/shared/AiErrorAlert.js +5 -1
  43. package/dist/ai/ui/shared/AiErrorAlert.js.map +1 -1
  44. package/dist/ai/ui/usage/aiUsageFormat.d.ts +9 -6
  45. package/dist/ai/ui/usage/aiUsageFormat.d.ts.map +1 -1
  46. package/dist/ai/ui/usage/aiUsageFormat.js +28 -12
  47. package/dist/ai/ui/usage/aiUsageFormat.js.map +1 -1
  48. package/dist/ai/ui/user/MyAiUsageSection.d.ts.map +1 -1
  49. package/dist/ai/ui/user/MyAiUsageSection.js +5 -2
  50. package/dist/ai/ui/user/MyAiUsageSection.js.map +1 -1
  51. package/dist/ai/ui/user/UserAiKeyCard.d.ts.map +1 -1
  52. package/dist/ai/ui/user/UserAiKeyCard.js +6 -4
  53. package/dist/ai/ui/user/UserAiKeyCard.js.map +1 -1
  54. package/dist/ai/ui/user/aiErrorText.d.ts +4 -1
  55. package/dist/ai/ui/user/aiErrorText.d.ts.map +1 -1
  56. package/dist/ai/ui/user/aiErrorText.js +10 -2
  57. package/dist/ai/ui/user/aiErrorText.js.map +1 -1
  58. package/dist/android-app/ui/AndroidAppPage.d.ts.map +1 -1
  59. package/dist/android-app/ui/AndroidAppPage.js +3 -2
  60. package/dist/android-app/ui/AndroidAppPage.js.map +1 -1
  61. package/dist/core/host.d.ts +2 -2
  62. package/dist/core/host.js +2 -2
  63. package/dist/core/http/client.d.ts.map +1 -1
  64. package/dist/core/http/client.js +7 -0
  65. package/dist/core/http/client.js.map +1 -1
  66. package/dist/core/http/sse.d.ts.map +1 -1
  67. package/dist/core/http/sse.js +3 -1
  68. package/dist/core/http/sse.js.map +1 -1
  69. package/dist/core/index.d.ts +4 -0
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +7 -0
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/core/time-zone/format.d.ts +139 -0
  74. package/dist/core/time-zone/format.d.ts.map +1 -0
  75. package/dist/core/time-zone/format.js +230 -0
  76. package/dist/core/time-zone/format.js.map +1 -0
  77. package/dist/core/time-zone/request.d.ts +17 -0
  78. package/dist/core/time-zone/request.d.ts.map +1 -0
  79. package/dist/core/time-zone/request.js +26 -0
  80. package/dist/core/time-zone/request.js.map +1 -0
  81. package/dist/core/time-zone/store.d.ts +93 -0
  82. package/dist/core/time-zone/store.d.ts.map +1 -0
  83. package/dist/core/time-zone/store.js +170 -0
  84. package/dist/core/time-zone/store.js.map +1 -0
  85. package/dist/credentials/headless/saved-secret.d.ts +1 -1
  86. package/dist/credentials/headless/saved-secret.d.ts.map +1 -1
  87. package/dist/credentials/headless/saved-secret.js +2 -1
  88. package/dist/credentials/headless/saved-secret.js.map +1 -1
  89. package/dist/credentials/ui/secret-field.d.ts +1 -1
  90. package/dist/credentials/ui/secret-field.d.ts.map +1 -1
  91. package/dist/credentials/ui/secret-field.js +2 -0
  92. package/dist/credentials/ui/secret-field.js.map +1 -1
  93. package/dist/datatable/headless/export/exportModel.d.ts +7 -1
  94. package/dist/datatable/headless/export/exportModel.d.ts.map +1 -1
  95. package/dist/datatable/headless/export/exportModel.js +10 -2
  96. package/dist/datatable/headless/export/exportModel.js.map +1 -1
  97. package/dist/datatable/headless/filter/dateRange.d.ts +40 -0
  98. package/dist/datatable/headless/filter/dateRange.d.ts.map +1 -0
  99. package/dist/datatable/headless/filter/dateRange.js +53 -0
  100. package/dist/datatable/headless/filter/dateRange.js.map +1 -0
  101. package/dist/datatable/headless/filter/filterTypes.d.ts.map +1 -1
  102. package/dist/datatable/headless/filter/filterTypes.js +24 -4
  103. package/dist/datatable/headless/filter/filterTypes.js.map +1 -1
  104. package/dist/datatable/headless/index.d.ts +2 -0
  105. package/dist/datatable/headless/index.d.ts.map +1 -1
  106. package/dist/datatable/headless/index.js +1 -0
  107. package/dist/datatable/headless/index.js.map +1 -1
  108. package/dist/db-backup/internal/format.d.ts +4 -1
  109. package/dist/db-backup/internal/format.d.ts.map +1 -1
  110. package/dist/db-backup/internal/format.js +6 -2
  111. package/dist/db-backup/internal/format.js.map +1 -1
  112. package/dist/db-backup/internal/time-zones.d.ts +3 -0
  113. package/dist/db-backup/internal/time-zones.d.ts.map +1 -0
  114. package/dist/db-backup/internal/time-zones.js +24 -0
  115. package/dist/db-backup/internal/time-zones.js.map +1 -0
  116. package/dist/db-backup/ui/DbBackupConfigPanel.d.ts +11 -6
  117. package/dist/db-backup/ui/DbBackupConfigPanel.d.ts.map +1 -1
  118. package/dist/db-backup/ui/DbBackupConfigPanel.js +22 -12
  119. package/dist/db-backup/ui/DbBackupConfigPanel.js.map +1 -1
  120. package/dist/db-backup/ui/DbBackupPage.d.ts.map +1 -1
  121. package/dist/db-backup/ui/DbBackupPage.js +7 -4
  122. package/dist/db-backup/ui/DbBackupPage.js.map +1 -1
  123. package/dist/db-backup/ui/DbBackupRestoreDialog.d.ts.map +1 -1
  124. package/dist/db-backup/ui/DbBackupRestoreDialog.js +4 -1
  125. package/dist/db-backup/ui/DbBackupRestoreDialog.js.map +1 -1
  126. package/dist/email/ui/EmailSettingsPage.d.ts.map +1 -1
  127. package/dist/email/ui/EmailSettingsPage.js +3 -2
  128. package/dist/email/ui/EmailSettingsPage.js.map +1 -1
  129. package/dist/email/ui/SesTransportPanel.d.ts.map +1 -1
  130. package/dist/email/ui/SesTransportPanel.js +3 -1
  131. package/dist/email/ui/SesTransportPanel.js.map +1 -1
  132. package/dist/email/ui/SmtpTransportPanel.d.ts.map +1 -1
  133. package/dist/email/ui/SmtpTransportPanel.js +3 -1
  134. package/dist/email/ui/SmtpTransportPanel.js.map +1 -1
  135. package/dist/exports/ui/ExportsList.d.ts.map +1 -1
  136. package/dist/exports/ui/ExportsList.js +5 -2
  137. package/dist/exports/ui/ExportsList.js.map +1 -1
  138. package/dist/host/ui/about-page.d.ts.map +1 -1
  139. package/dist/host/ui/about-page.js +7 -5
  140. package/dist/host/ui/about-page.js.map +1 -1
  141. package/dist/host/ui/maintenance-page.d.ts.map +1 -1
  142. package/dist/host/ui/maintenance-page.js +3 -2
  143. package/dist/host/ui/maintenance-page.js.map +1 -1
  144. package/dist/identity/index.d.ts +1 -1
  145. package/dist/identity/index.d.ts.map +1 -1
  146. package/dist/identity/index.js +3 -2
  147. package/dist/identity/index.js.map +1 -1
  148. package/dist/identity/ui/org/OrgInvitesPanel.d.ts.map +1 -1
  149. package/dist/identity/ui/org/OrgInvitesPanel.js +2 -0
  150. package/dist/identity/ui/org/OrgInvitesPanel.js.map +1 -1
  151. package/dist/identity/ui/org/OrgMembersPanel.d.ts.map +1 -1
  152. package/dist/identity/ui/org/OrgMembersPanel.js +2 -0
  153. package/dist/identity/ui/org/OrgMembersPanel.js.map +1 -1
  154. package/dist/identity/ui/org/orgLabels.d.ts +1 -1
  155. package/dist/identity/ui/org/orgLabels.d.ts.map +1 -1
  156. package/dist/identity/ui/org/orgLabels.js +3 -5
  157. package/dist/identity/ui/org/orgLabels.js.map +1 -1
  158. package/dist/identity/ui/tokens/CreatePatDialog.d.ts +17 -0
  159. package/dist/identity/ui/tokens/CreatePatDialog.d.ts.map +1 -1
  160. package/dist/identity/ui/tokens/CreatePatDialog.js +35 -10
  161. package/dist/identity/ui/tokens/CreatePatDialog.js.map +1 -1
  162. package/dist/identity/ui/tokens/PersonalAccessTokens.d.ts.map +1 -1
  163. package/dist/identity/ui/tokens/PersonalAccessTokens.js +4 -1
  164. package/dist/identity/ui/tokens/PersonalAccessTokens.js.map +1 -1
  165. package/dist/identity/ui/tokens/patColumns.d.ts.map +1 -1
  166. package/dist/identity/ui/tokens/patColumns.js +7 -5
  167. package/dist/identity/ui/tokens/patColumns.js.map +1 -1
  168. package/dist/identity/ui/users/AllowlistTable.d.ts.map +1 -1
  169. package/dist/identity/ui/users/AllowlistTable.js +4 -1
  170. package/dist/identity/ui/users/AllowlistTable.js.map +1 -1
  171. package/dist/identity/ui/users/UserList.d.ts.map +1 -1
  172. package/dist/identity/ui/users/UserList.js +4 -2
  173. package/dist/identity/ui/users/UserList.js.map +1 -1
  174. package/dist/identity/ui/users/allowlistColumns.d.ts.map +1 -1
  175. package/dist/identity/ui/users/allowlistColumns.js +5 -3
  176. package/dist/identity/ui/users/allowlistColumns.js.map +1 -1
  177. package/dist/identity/ui/users/userListColumns.d.ts.map +1 -1
  178. package/dist/identity/ui/users/userListColumns.js +5 -3
  179. package/dist/identity/ui/users/userListColumns.js.map +1 -1
  180. package/dist/jobs/headless/format.d.ts +4 -1
  181. package/dist/jobs/headless/format.d.ts.map +1 -1
  182. package/dist/jobs/headless/format.js +6 -2
  183. package/dist/jobs/headless/format.js.map +1 -1
  184. package/dist/jobs/ui/JobInsightsPage.d.ts.map +1 -1
  185. package/dist/jobs/ui/JobInsightsPage.js +2 -1
  186. package/dist/jobs/ui/JobInsightsPage.js.map +1 -1
  187. package/dist/jobs/ui/JobsPage.d.ts.map +1 -1
  188. package/dist/jobs/ui/JobsPage.js +4 -2
  189. package/dist/jobs/ui/JobsPage.js.map +1 -1
  190. package/dist/nodes/headless/format.d.ts +4 -1
  191. package/dist/nodes/headless/format.d.ts.map +1 -1
  192. package/dist/nodes/headless/format.js +6 -2
  193. package/dist/nodes/headless/format.js.map +1 -1
  194. package/dist/nodes/ui/NodeCredentialRevealDialog.d.ts.map +1 -1
  195. package/dist/nodes/ui/NodeCredentialRevealDialog.js +3 -1
  196. package/dist/nodes/ui/NodeCredentialRevealDialog.js.map +1 -1
  197. package/dist/nodes/ui/NodeCredentials.d.ts.map +1 -1
  198. package/dist/nodes/ui/NodeCredentials.js +4 -1
  199. package/dist/nodes/ui/NodeCredentials.js.map +1 -1
  200. package/dist/nodes/ui/NodeVitalsDialog.d.ts.map +1 -1
  201. package/dist/nodes/ui/NodeVitalsDialog.js +2 -0
  202. package/dist/nodes/ui/NodeVitalsDialog.js.map +1 -1
  203. package/dist/nodes/ui/WorkersPage.d.ts.map +1 -1
  204. package/dist/nodes/ui/WorkersPage.js +4 -2
  205. package/dist/nodes/ui/WorkersPage.js.map +1 -1
  206. package/dist/notifications/headless/broadcasts.d.ts +26 -17
  207. package/dist/notifications/headless/broadcasts.d.ts.map +1 -1
  208. package/dist/notifications/headless/broadcasts.js +76 -36
  209. package/dist/notifications/headless/broadcasts.js.map +1 -1
  210. package/dist/notifications/ui/BroadcastComposer.d.ts.map +1 -1
  211. package/dist/notifications/ui/BroadcastComposer.js +11 -6
  212. package/dist/notifications/ui/BroadcastComposer.js.map +1 -1
  213. package/dist/notifications/ui/BroadcastDetailDialog.d.ts.map +1 -1
  214. package/dist/notifications/ui/BroadcastDetailDialog.js +2 -0
  215. package/dist/notifications/ui/BroadcastDetailDialog.js.map +1 -1
  216. package/dist/notifications/ui/BroadcastsPage.d.ts.map +1 -1
  217. package/dist/notifications/ui/BroadcastsPage.js +4 -2
  218. package/dist/notifications/ui/BroadcastsPage.js.map +1 -1
  219. package/dist/notifications/ui/NotificationBell.d.ts.map +1 -1
  220. package/dist/notifications/ui/NotificationBell.js +3 -1
  221. package/dist/notifications/ui/NotificationBell.js.map +1 -1
  222. package/dist/notifications/ui/PushConfigPage.d.ts.map +1 -1
  223. package/dist/notifications/ui/PushConfigPage.js +4 -3
  224. package/dist/notifications/ui/PushConfigPage.js.map +1 -1
  225. package/dist/notifications/ui/PushTestPanel.d.ts.map +1 -1
  226. package/dist/notifications/ui/PushTestPanel.js +6 -3
  227. package/dist/notifications/ui/PushTestPanel.js.map +1 -1
  228. package/dist/notifications/ui/SystemSettingsSection.d.ts.map +1 -1
  229. package/dist/notifications/ui/SystemSettingsSection.js +3 -2
  230. package/dist/notifications/ui/SystemSettingsSection.js.map +1 -1
  231. package/dist/notifications/ui/broadcastsTable.d.ts +4 -1
  232. package/dist/notifications/ui/broadcastsTable.d.ts.map +1 -1
  233. package/dist/notifications/ui/broadcastsTable.js +6 -2
  234. package/dist/notifications/ui/broadcastsTable.js.map +1 -1
  235. package/dist/settings/headless/use-user-settings.d.ts +7 -0
  236. package/dist/settings/headless/use-user-settings.d.ts.map +1 -1
  237. package/dist/settings/headless/use-user-settings.js +12 -4
  238. package/dist/settings/headless/use-user-settings.js.map +1 -1
  239. package/dist/settings/ui/ProfileSettings.d.ts +13 -4
  240. package/dist/settings/ui/ProfileSettings.d.ts.map +1 -1
  241. package/dist/settings/ui/ProfileSettings.js +15 -2
  242. package/dist/settings/ui/ProfileSettings.js.map +1 -1
  243. package/dist/settings/ui/UserProfilePage.d.ts +2 -2
  244. package/dist/settings/ui/UserProfilePage.js +3 -3
  245. package/dist/settings/ui/UserProfilePage.js.map +1 -1
  246. package/dist/settings/ui/UserSettingsSection.d.ts +5 -2
  247. package/dist/settings/ui/UserSettingsSection.d.ts.map +1 -1
  248. package/dist/settings/ui/UserSettingsSection.js.map +1 -1
  249. package/dist/sharing/internal/format.d.ts +11 -1
  250. package/dist/sharing/internal/format.d.ts.map +1 -1
  251. package/dist/sharing/internal/format.js +13 -7
  252. package/dist/sharing/internal/format.js.map +1 -1
  253. package/dist/sharing/ui/GroupDetailPage.d.ts.map +1 -1
  254. package/dist/sharing/ui/GroupDetailPage.js +2 -0
  255. package/dist/sharing/ui/GroupDetailPage.js.map +1 -1
  256. package/dist/sharing/ui/PendingGroupInvites.d.ts.map +1 -1
  257. package/dist/sharing/ui/PendingGroupInvites.js +2 -0
  258. package/dist/sharing/ui/PendingGroupInvites.js.map +1 -1
  259. package/dist/sharing/ui/ShareDialog.d.ts.map +1 -1
  260. package/dist/sharing/ui/ShareDialog.js +2 -0
  261. package/dist/sharing/ui/ShareDialog.js.map +1 -1
  262. package/dist/sharing/ui/SharedWithMeList.d.ts.map +1 -1
  263. package/dist/sharing/ui/SharedWithMeList.js +2 -0
  264. package/dist/sharing/ui/SharedWithMeList.js.map +1 -1
  265. package/dist/storage/ui/S3FamilyDriverPanel.d.ts.map +1 -1
  266. package/dist/storage/ui/S3FamilyDriverPanel.js +3 -1
  267. package/dist/storage/ui/S3FamilyDriverPanel.js.map +1 -1
  268. package/dist/storage/ui/StorageConfigPage.d.ts.map +1 -1
  269. package/dist/storage/ui/StorageConfigPage.js +3 -2
  270. package/dist/storage/ui/StorageConfigPage.js.map +1 -1
  271. package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +1 -1
  272. package/dist/telemetry/headless/lib/format.d.ts +4 -2
  273. package/dist/telemetry/headless/lib/format.d.ts.map +1 -1
  274. package/dist/telemetry/headless/lib/format.js +8 -6
  275. package/dist/telemetry/headless/lib/format.js.map +1 -1
  276. package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts.map +1 -1
  277. package/dist/telemetry/ui/components/TelemetryConnectionSection.js +3 -1
  278. package/dist/telemetry/ui/components/TelemetryConnectionSection.js.map +1 -1
  279. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts.map +1 -1
  280. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js +2 -0
  281. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js.map +1 -1
  282. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts.map +1 -1
  283. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js +2 -0
  284. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js.map +1 -1
  285. package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts.map +1 -1
  286. package/dist/telemetry/ui/components/dashboard/EventsFeed.js +3 -0
  287. package/dist/telemetry/ui/components/dashboard/EventsFeed.js.map +1 -1
  288. package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts.map +1 -1
  289. package/dist/telemetry/ui/components/dashboard/KpiTiles.js +2 -0
  290. package/dist/telemetry/ui/components/dashboard/KpiTiles.js.map +1 -1
  291. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts.map +1 -1
  292. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js +2 -0
  293. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js.map +1 -1
  294. package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts.map +1 -1
  295. package/dist/telemetry/ui/components/dashboard/TopProblems.js +2 -0
  296. package/dist/telemetry/ui/components/dashboard/TopProblems.js.map +1 -1
  297. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts.map +1 -1
  298. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js +2 -0
  299. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js.map +1 -1
  300. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts.map +1 -1
  301. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js +2 -0
  302. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js.map +1 -1
  303. package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts.map +1 -1
  304. package/dist/telemetry/ui/pages/TelemetrySettingsPage.js +3 -2
  305. package/dist/telemetry/ui/pages/TelemetrySettingsPage.js.map +1 -1
  306. package/dist/timezone/headless/catalog.d.ts +82 -0
  307. package/dist/timezone/headless/catalog.d.ts.map +1 -0
  308. package/dist/timezone/headless/catalog.js +192 -0
  309. package/dist/timezone/headless/catalog.js.map +1 -0
  310. package/dist/timezone/headless/format.d.ts +3 -0
  311. package/dist/timezone/headless/format.d.ts.map +1 -0
  312. package/dist/timezone/headless/format.js +5 -0
  313. package/dist/timezone/headless/format.js.map +1 -0
  314. package/dist/timezone/headless/index.d.ts +10 -0
  315. package/dist/timezone/headless/index.d.ts.map +1 -0
  316. package/dist/timezone/headless/index.js +10 -0
  317. package/dist/timezone/headless/index.js.map +1 -0
  318. package/dist/timezone/headless/map-data.d.ts +13 -0
  319. package/dist/timezone/headless/map-data.d.ts.map +1 -0
  320. package/dist/timezone/headless/map-data.js +530 -0
  321. package/dist/timezone/headless/map-data.js.map +1 -0
  322. package/dist/timezone/headless/map-geometry.d.ts +77 -0
  323. package/dist/timezone/headless/map-geometry.d.ts.map +1 -0
  324. package/dist/timezone/headless/map-geometry.js +104 -0
  325. package/dist/timezone/headless/map-geometry.js.map +1 -0
  326. package/dist/timezone/headless/store.d.ts +2 -0
  327. package/dist/timezone/headless/store.d.ts.map +1 -0
  328. package/dist/timezone/headless/store.js +6 -0
  329. package/dist/timezone/headless/store.js.map +1 -0
  330. package/dist/timezone/headless/sync.d.ts +39 -0
  331. package/dist/timezone/headless/sync.d.ts.map +1 -0
  332. package/dist/timezone/headless/sync.js +66 -0
  333. package/dist/timezone/headless/sync.js.map +1 -0
  334. package/dist/timezone/index.d.ts +4 -0
  335. package/dist/timezone/index.d.ts.map +1 -0
  336. package/dist/timezone/index.js +11 -0
  337. package/dist/timezone/index.js.map +1 -0
  338. package/dist/timezone/internal/use-now.d.ts +3 -0
  339. package/dist/timezone/internal/use-now.d.ts.map +1 -0
  340. package/dist/timezone/internal/use-now.js +13 -0
  341. package/dist/timezone/internal/use-now.js.map +1 -0
  342. package/dist/timezone/ui/TimeZoneField.d.ts +33 -0
  343. package/dist/timezone/ui/TimeZoneField.d.ts.map +1 -0
  344. package/dist/timezone/ui/TimeZoneField.js +50 -0
  345. package/dist/timezone/ui/TimeZoneField.js.map +1 -0
  346. package/dist/timezone/ui/TimeZoneMap.d.ts +38 -0
  347. package/dist/timezone/ui/TimeZoneMap.d.ts.map +1 -0
  348. package/dist/timezone/ui/TimeZoneMap.js +231 -0
  349. package/dist/timezone/ui/TimeZoneMap.js.map +1 -0
  350. package/dist/timezone/ui/TimeZonePickerDialog.d.ts +34 -0
  351. package/dist/timezone/ui/TimeZonePickerDialog.d.ts.map +1 -0
  352. package/dist/timezone/ui/TimeZonePickerDialog.js +85 -0
  353. package/dist/timezone/ui/TimeZonePickerDialog.js.map +1 -0
  354. package/dist/timezone/ui/index.d.ts +7 -0
  355. package/dist/timezone/ui/index.d.ts.map +1 -0
  356. package/dist/timezone/ui/index.js +7 -0
  357. package/dist/timezone/ui/index.js.map +1 -0
  358. package/package.json +10 -2
@@ -0,0 +1,93 @@
1
+ /**
2
+ * The `localStorage` key the chosen zone is cached under, so a reload renders
3
+ * in the right zone before the settings fetch lands.
4
+ *
5
+ * @stability experimental
6
+ */
7
+ export declare const TIME_ZONE_STORAGE_KEY = "platform.timezone";
8
+ /**
9
+ * The IANA zone this device reports (`Europe/Paris`), or `'UTC'` when the
10
+ * runtime does not say.
11
+ *
12
+ * @returns the device's zone id.
13
+ *
14
+ * @stability experimental
15
+ */
16
+ export declare function deviceTimeZone(): string;
17
+ /**
18
+ * The zone the user chose (`profile.timezone`), or `null` when they follow the
19
+ * device.
20
+ *
21
+ * @returns the stored choice.
22
+ *
23
+ * @stability experimental
24
+ */
25
+ export declare function getPreferredTimeZone(): string | null;
26
+ /**
27
+ * The zone every packaged time is rendered in: the user's choice, else the
28
+ * device's zone, else `'UTC'`.
29
+ *
30
+ * @returns an IANA zone id.
31
+ *
32
+ * @stability experimental
33
+ */
34
+ export declare function getDisplayTimeZone(): string;
35
+ /**
36
+ * Sets the user's choice (`null` follows the device again) and notifies every
37
+ * subscriber. An id the runtime does not know is ignored. The value is cached
38
+ * in `localStorage` (`platform.timezone`) when the browser allows it.
39
+ *
40
+ * @param id - an IANA zone id, or `null`.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * setPreferredTimeZone(settings.profile.timezone ?? null);
45
+ * ```
46
+ *
47
+ * @stability experimental
48
+ */
49
+ export declare function setPreferredTimeZone(id: string | null): void;
50
+ /**
51
+ * Calls `listener` whenever the display zone may have changed.
52
+ *
53
+ * @param listener - called with no argument.
54
+ * @returns the unsubscribe function.
55
+ *
56
+ * @stability experimental
57
+ */
58
+ export declare function subscribeDisplayTimeZone(listener: () => void): () => void;
59
+ /**
60
+ * The display zone, re-rendering the component when it changes. Use it in a
61
+ * component that formats times, so a saved profile re-renders them.
62
+ *
63
+ * @returns the effective IANA zone id ({@link getDisplayTimeZone}).
64
+ *
65
+ * @example
66
+ * ```tsx
67
+ * const zone = useDisplayTimeZone();
68
+ * return <span>{formatDateTime(job.createdAt, { timeZone: zone })}</span>;
69
+ * ```
70
+ *
71
+ * @extensionPoint hook
72
+ * @stability experimental
73
+ */
74
+ export declare function useDisplayTimeZone(): string;
75
+ /**
76
+ * The user's stored choice, re-rendering on change (`null`: follow the device).
77
+ *
78
+ * @returns the choice ({@link getPreferredTimeZone}).
79
+ *
80
+ * @stability experimental
81
+ */
82
+ export declare function usePreferredTimeZone(): string | null;
83
+ /**
84
+ * `profile.timezone` out of a settings profile: the id when it is a valid zone,
85
+ * else `null`.
86
+ *
87
+ * @param profile - a stored profile (any shape).
88
+ * @returns the zone id, or `null`.
89
+ *
90
+ * @stability experimental
91
+ */
92
+ export declare function timeZoneFromProfile(profile: unknown): string | null;
93
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/time-zone/store.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AA2BzD;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAWvC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAEpD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAM5D;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAInE"}
@@ -0,0 +1,170 @@
1
+ // The display time zone: one module-level store, so a pure formatter, a hook
2
+ // and code outside React all read the same answer. The user's choice comes
3
+ // from `profile.timezone` (pushed here by `UserTimeZoneSync` of the timezone
4
+ // slice and by `useUserSettings` of the settings slice); without one, the
5
+ // device's zone. It lives in `core`, not in the timezone slice, because every
6
+ // slice renders dates (identity included, which the timezone slice depends
7
+ // on): core is the one place all of them may import without a cycle. The
8
+ // timezone slice re-exports it from `/timezone/headless`.
9
+ import { isValidTimeZone } from '@marinoscar/platform-contract/settings';
10
+ import { useSyncExternalStore } from 'react';
11
+ /**
12
+ * The `localStorage` key the chosen zone is cached under, so a reload renders
13
+ * in the right zone before the settings fetch lands.
14
+ *
15
+ * @stability experimental
16
+ */
17
+ export const TIME_ZONE_STORAGE_KEY = 'platform.timezone';
18
+ const listeners = new Set();
19
+ function readCache() {
20
+ try {
21
+ const cached = globalThis.localStorage?.getItem(TIME_ZONE_STORAGE_KEY) ?? null;
22
+ return isValidTimeZone(cached) ? cached : null;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function writeCache(id) {
29
+ try {
30
+ const storage = globalThis.localStorage;
31
+ if (!storage)
32
+ return;
33
+ if (id === null)
34
+ storage.removeItem(TIME_ZONE_STORAGE_KEY);
35
+ else
36
+ storage.setItem(TIME_ZONE_STORAGE_KEY, id);
37
+ }
38
+ catch {
39
+ // Private mode or blocked storage: the choice still applies to this page.
40
+ }
41
+ }
42
+ let preferred = readCache();
43
+ let device;
44
+ /**
45
+ * The IANA zone this device reports (`Europe/Paris`), or `'UTC'` when the
46
+ * runtime does not say.
47
+ *
48
+ * @returns the device's zone id.
49
+ *
50
+ * @stability experimental
51
+ */
52
+ export function deviceTimeZone() {
53
+ if (device !== undefined)
54
+ return device;
55
+ let zone = 'UTC';
56
+ try {
57
+ const resolved = new Intl.DateTimeFormat().resolvedOptions().timeZone;
58
+ if (isValidTimeZone(resolved))
59
+ zone = resolved;
60
+ }
61
+ catch {
62
+ // An engine without Intl time zone support: UTC.
63
+ }
64
+ device = zone;
65
+ return zone;
66
+ }
67
+ /**
68
+ * The zone the user chose (`profile.timezone`), or `null` when they follow the
69
+ * device.
70
+ *
71
+ * @returns the stored choice.
72
+ *
73
+ * @stability experimental
74
+ */
75
+ export function getPreferredTimeZone() {
76
+ return preferred;
77
+ }
78
+ /**
79
+ * The zone every packaged time is rendered in: the user's choice, else the
80
+ * device's zone, else `'UTC'`.
81
+ *
82
+ * @returns an IANA zone id.
83
+ *
84
+ * @stability experimental
85
+ */
86
+ export function getDisplayTimeZone() {
87
+ return preferred ?? deviceTimeZone();
88
+ }
89
+ /**
90
+ * Sets the user's choice (`null` follows the device again) and notifies every
91
+ * subscriber. An id the runtime does not know is ignored. The value is cached
92
+ * in `localStorage` (`platform.timezone`) when the browser allows it.
93
+ *
94
+ * @param id - an IANA zone id, or `null`.
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * setPreferredTimeZone(settings.profile.timezone ?? null);
99
+ * ```
100
+ *
101
+ * @stability experimental
102
+ */
103
+ export function setPreferredTimeZone(id) {
104
+ if (id !== null && !isValidTimeZone(id))
105
+ return;
106
+ if (id === preferred)
107
+ return;
108
+ preferred = id;
109
+ writeCache(id);
110
+ for (const listener of [...listeners])
111
+ listener();
112
+ }
113
+ /**
114
+ * Calls `listener` whenever the display zone may have changed.
115
+ *
116
+ * @param listener - called with no argument.
117
+ * @returns the unsubscribe function.
118
+ *
119
+ * @stability experimental
120
+ */
121
+ export function subscribeDisplayTimeZone(listener) {
122
+ listeners.add(listener);
123
+ return () => {
124
+ listeners.delete(listener);
125
+ };
126
+ }
127
+ /**
128
+ * The display zone, re-rendering the component when it changes. Use it in a
129
+ * component that formats times, so a saved profile re-renders them.
130
+ *
131
+ * @returns the effective IANA zone id ({@link getDisplayTimeZone}).
132
+ *
133
+ * @example
134
+ * ```tsx
135
+ * const zone = useDisplayTimeZone();
136
+ * return <span>{formatDateTime(job.createdAt, { timeZone: zone })}</span>;
137
+ * ```
138
+ *
139
+ * @extensionPoint hook
140
+ * @stability experimental
141
+ */
142
+ export function useDisplayTimeZone() {
143
+ return useSyncExternalStore(subscribeDisplayTimeZone, getDisplayTimeZone, getDisplayTimeZone);
144
+ }
145
+ /**
146
+ * The user's stored choice, re-rendering on change (`null`: follow the device).
147
+ *
148
+ * @returns the choice ({@link getPreferredTimeZone}).
149
+ *
150
+ * @stability experimental
151
+ */
152
+ export function usePreferredTimeZone() {
153
+ return useSyncExternalStore(subscribeDisplayTimeZone, getPreferredTimeZone, getPreferredTimeZone);
154
+ }
155
+ /**
156
+ * `profile.timezone` out of a settings profile: the id when it is a valid zone,
157
+ * else `null`.
158
+ *
159
+ * @param profile - a stored profile (any shape).
160
+ * @returns the zone id, or `null`.
161
+ *
162
+ * @stability experimental
163
+ */
164
+ export function timeZoneFromProfile(profile) {
165
+ if (!profile || typeof profile !== 'object')
166
+ return null;
167
+ const value = profile.timezone;
168
+ return isValidTimeZone(value) ? value : null;
169
+ }
170
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/time-zone/store.ts"],"names":[],"mappings":"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"}
@@ -31,7 +31,7 @@ export interface SavedSecretHelperTextOptions {
31
31
  /**
32
32
  * Formats the last-change date.
33
33
  *
34
- * @defaultValue `date.toLocaleDateString()`
34
+ * @defaultValue the numeric date (`toLocaleDateString()`'s fields) in the display time zone
35
35
  */
36
36
  readonly formatDate?: (date: Date) => string;
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"saved-secret.d.ts","sourceRoot":"","sources":["../../../src/credentials/headless/saved-secret.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,GAAG;IAC1C,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEJ;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;CAC9C;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACxC,OAAO,GAAE,4BAAiC,GACzC,MAAM,CASR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE"}
1
+ {"version":3,"file":"saved-secret.d.ts","sourceRoot":"","sources":["../../../src/credentials/headless/saved-secret.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAGnF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,GAAG;IAC1C,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEJ;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;CAC9C;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACxC,OAAO,GAAE,4BAAiC,GACzC,MAAM,CASR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE"}
@@ -12,6 +12,7 @@
12
12
  // stored", which is what the sentence tells the user and what
13
13
  // `secretForSubmit` sends.
14
14
  // =============================================================================
15
+ import { NUMERIC_DATE, formatDate } from '../../core/index.js';
15
16
  /** `a key`, `an access key`. */
16
17
  function withArticle(noun) {
17
18
  return /^[aeiou]/i.test(noun) ? `An ${noun}` : `A ${noun}`;
@@ -41,7 +42,7 @@ export function savedSecretHelperText(info, options = {}) {
41
42
  return options.emptyHelp ?? `No ${noun} is saved yet.`;
42
43
  const which = info.hint ? ` (${info.hint})` : '';
43
44
  const date = info.updatedAt ? new Date(info.updatedAt) : null;
44
- const format = options.formatDate ?? ((d) => d.toLocaleDateString());
45
+ const format = options.formatDate ?? ((d) => formatDate(d, NUMERIC_DATE));
45
46
  const when = date && !Number.isNaN(date.getTime()) ? `, updated ${format(date)}` : '';
46
47
  return `${withArticle(noun)} is saved${which}${when}. Leave this blank to keep it, or type a new one to replace it.`;
47
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"saved-secret.js","sourceRoot":"","sources":["../../../src/credentials/headless/saved-secret.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wDAAwD;AACxD,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,gFAAgF;AAChF,oEAAoE;AACpE,EAAE;AACF,sEAAsE;AACtE,8EAA8E;AAC9E,8DAA8D;AAC9D,2BAA2B;AAC3B,gFAAgF;AA2ChF,gCAAgC;AAChC,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAwC,EACxC,UAAwC,EAAE;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,SAAS,IAAI,MAAM,IAAI,gBAAgB,CAAC;IAElE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,KAAK,GAAG,IAAI,iEAAiE,CAAC;AACvH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"saved-secret.js","sourceRoot":"","sources":["../../../src/credentials/headless/saved-secret.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wDAAwD;AACxD,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,gFAAgF;AAChF,oEAAoE;AACpE,EAAE;AACF,sEAAsE;AACtE,8EAA8E;AAC9E,8DAA8D;AAC9D,2BAA2B;AAC3B,gFAAgF;AAGhF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyC/D,gCAAgC;AAChC,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAwC,EACxC,UAAwC,EAAE;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,SAAS,IAAI,MAAM,IAAI,gBAAgB,CAAC;IAElE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,KAAK,GAAG,IAAI,iEAAiE,CAAC;AACvH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC"}
@@ -20,7 +20,7 @@ export interface SecretFieldProps {
20
20
  emptyHelp?: string;
21
21
  /** What the secret is called in the helper text; default `'key'`. */
22
22
  noun?: string;
23
- /** Formats the last-change date; default `toLocaleDateString()`. */
23
+ /** Formats the last-change date; default the numeric date in the display time zone. */
24
24
  formatDate?: SavedSecretHelperTextOptions['formatDate'];
25
25
  /** Disables the input (a viewer without the write permission). */
26
26
  disabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"secret-field.d.ts","sourceRoot":"","sources":["../../../src/credentials/ui/secret-field.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wFAAwF;IACxF,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,UAAU,CAAC,EAAE,4BAA4B,CAAC,YAAY,CAAC,CAAC;IACxD,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC;CAC1E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA4BjE"}
1
+ {"version":3,"file":"secret-field.d.ts","sourceRoot":"","sources":["../../../src/credentials/ui/secret-field.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG1F;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wFAAwF;IACxF,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,UAAU,CAAC,EAAE,4BAA4B,CAAC,YAAY,CAAC,CAAC;IACxD,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC;CAC1E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA6BjE"}
@@ -13,6 +13,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
13
13
  import { TextField } from '@mui/material';
14
14
  import { useId } from 'react';
15
15
  import { savedSecretHelperText } from '../headless/index.js';
16
+ import { useDisplayTimeZone } from '../../core/index.js';
16
17
  /**
17
18
  * A write-only secret input with the unified "saved secret" helper text.
18
19
  *
@@ -34,6 +35,7 @@ import { savedSecretHelperText } from '../headless/index.js';
34
35
  * @stability experimental
35
36
  */
36
37
  export function SecretField(props) {
38
+ useDisplayTimeZone(); // "updated" renders in the display zone.
37
39
  const generatedId = useId();
38
40
  const id = props.id ?? `secret-field-${generatedId.replace(/[^A-Za-z0-9_-]/g, '')}`;
39
41
  const helper = props.error ??
@@ -1 +1 @@
1
- {"version":3,"file":"secret-field.js","sourceRoot":"","sources":["../../../src/credentials/ui/secret-field.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8DAA8D;AAC9D,gFAAgF;AAChF,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,wEAAwE;AACxE,8EAA8E;AAC9E,4EAA4E;AAC5E,4DAA4D;AAC5D,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAmD7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,gBAAgB,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC;IACpF,MAAM,MAAM,GACV,KAAK,CAAC,KAAK;QACX,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE;YACjC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;IAEL,OAAO,CACL,KAAC,SAAS,IACR,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAC3B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAC,cAAc,EAC3B,SAAS,QACT,EAAE,EAAE,KAAK,CAAC,EAAE,KACR,KAAK,CAAC,KAAK,EAAE,SAAS,EAC1B,IAAI,EAAC,UAAU,EACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GACvD,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"secret-field.js","sourceRoot":"","sources":["../../../src/credentials/ui/secret-field.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8DAA8D;AAC9D,gFAAgF;AAChF,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,wEAAwE;AACxE,8EAA8E;AAC9E,4EAA4E;AAC5E,4DAA4D;AAC5D,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAkDzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,kBAAkB,EAAE,CAAC,CAAC,yCAAyC;IAC/D,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,gBAAgB,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC;IACpF,MAAM,MAAM,GACV,KAAK,CAAC,KAAK;QACX,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE;YACjC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;IAEL,OAAO,CACL,KAAC,SAAS,IACR,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAC3B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAC,cAAc,EAC3B,SAAS,QACT,EAAE,EAAE,KAAK,CAAC,EAAE,KACR,KAAK,CAAC,KAAK,EAAE,SAAS,EAC1B,IAAI,EAAC,UAAU,EACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GACvD,CACH,CAAC;AACJ,CAAC"}
@@ -109,10 +109,16 @@ export declare function slugifyExportName(name: string | undefined | null): stri
109
109
  *
110
110
  * Dated because an export is a snapshot: two files downloaded a week apart must
111
111
  * not collide in a Downloads folder, and `jobs (3).csv` tells nobody anything.
112
+ * The date is today in the viewer's display zone (`zonedDateKey`), so a file
113
+ * saved at 9 PM in Costa Rica is named for that day, not tomorrow's UTC date.
114
+ *
115
+ * @param base - the table's name; slugified.
116
+ * @param now - the instant of the export; default now.
117
+ * @param timeZone - the zone the date is read in; default the display zone.
112
118
  *
113
119
  * @stability experimental
114
120
  */
115
- export declare function exportFilename(base: string | undefined | null, now?: Date): string;
121
+ export declare function exportFilename(base: string | undefined | null, now?: Date, timeZone?: string): string;
116
122
  /**
117
123
  * Hand a CSV string to the browser as a file download.
118
124
  *
@@ -1 +1 @@
1
- {"version":3,"file":"exportModel.d.ts","sourceRoot":"","sources":["../../../../src/datatable/headless/export/exportModel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAQ7E;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AASrD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAE7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAC/B,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,eAAe,CAAC,GAAG,CAAC,EAAE,CAKxB;AAMD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mDAAmD;IACnD,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EACnC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC/B,IAAI,EAAE,SAAS,GAAG,EAAE,GACnB,YAAY,CAKd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EACjC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC/B,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,MAAM,CAIR;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOzE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAG9F;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoBtE;AAMD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CAAC,GAAG;IACxC,6EAA6E;IAC7E,SAAS,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACzC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB,CAAC,GAAG;IACvC,0BAA0B;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,EACxC,SAAS,EACT,QAA4C,EAC5C,OAAoC,EACpC,UAAU,EACV,MAAM,GACP,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CA6BjE"}
1
+ {"version":3,"file":"exportModel.d.ts","sourceRoot":"","sources":["../../../../src/datatable/headless/export/exportModel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAS7E;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AASrD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAE7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAC/B,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,eAAe,CAAC,GAAG,CAAC,EAAE,CAKxB;AAMD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mDAAmD;IACnD,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EACnC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC/B,IAAI,EAAE,SAAS,GAAG,EAAE,GACnB,YAAY,CAKd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EACjC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC/B,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,MAAM,CAIR;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOzE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,GAAG,GAAE,IAAiB,EACtB,QAAQ,GAAE,MAA6B,GACtC,MAAM,CAIR;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoBtE;AAMD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CAAC,GAAG;IACxC,6EAA6E;IAC7E,SAAS,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACzC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB,CAAC,GAAG;IACvC,0BAA0B;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,EACxC,SAAS,EACT,QAA4C,EAC5C,OAAoC,EACpC,UAAU,EACV,MAAM,GACP,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CA6BjE"}
@@ -22,6 +22,7 @@
22
22
  * page's OWN fetch callback, so it is subject to exactly the same
23
23
  * authorization and the same active filters as the table itself.
24
24
  */
25
+ import { getDisplayTimeZone, zonedDateKey } from '../../../core/index.js';
25
26
  import { extractColumnValue } from '../columns.js';
26
27
  import { toCsvFile } from './csv.js';
27
28
  // ---------------------------------------------------------------------------
@@ -130,11 +131,18 @@ export function slugifyExportName(name) {
130
131
  *
131
132
  * Dated because an export is a snapshot: two files downloaded a week apart must
132
133
  * not collide in a Downloads folder, and `jobs (3).csv` tells nobody anything.
134
+ * The date is today in the viewer's display zone (`zonedDateKey`), so a file
135
+ * saved at 9 PM in Costa Rica is named for that day, not tomorrow's UTC date.
136
+ *
137
+ * @param base - the table's name; slugified.
138
+ * @param now - the instant of the export; default now.
139
+ * @param timeZone - the zone the date is read in; default the display zone.
133
140
  *
134
141
  * @stability experimental
135
142
  */
136
- export function exportFilename(base, now = new Date()) {
137
- const iso = Number.isNaN(now.getTime()) ? '' : `-${now.toISOString().slice(0, 10)}`;
143
+ export function exportFilename(base, now = new Date(), timeZone = getDisplayTimeZone()) {
144
+ const day = zonedDateKey(now, timeZone);
145
+ const iso = day === null ? '' : `-${day}`;
138
146
  return `${slugifyExportName(base)}${iso}.csv`;
139
147
  }
140
148
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"exportModel.js","sourceRoot":"","sources":["../../../../src/datatable/headless/export/exportModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exportModel.js","sourceRoot":"","sources":["../../../../src/datatable/headless/export/exportModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * What {@link zonedDayRangeToInstants} returns: a half-open instant range.
3
+ *
4
+ * @stability experimental
5
+ */
6
+ export interface ZonedDayInstantRange {
7
+ /** Local midnight at the start of the first day, ISO 8601 (inclusive). */
8
+ from: string;
9
+ /** Local midnight at the start of the day after the last day, ISO 8601 (exclusive). */
10
+ to: string;
11
+ }
12
+ /**
13
+ * The ISO instants that bound the calendar days `fromKey` to `toKey`
14
+ * (inclusive) in `tz`: `from` is local midnight at the start of `fromKey`,
15
+ * `to` is local midnight at the start of the day after `toKey`, so a server
16
+ * filters `createdAt >= from AND createdAt < to`. DST-safe: a 23- or 25-hour
17
+ * day is covered exactly, and a skipped midnight starts at the first instant
18
+ * after the gap.
19
+ *
20
+ * Use it to turn a `date` filter (`between`, `after`, `before`) into server
21
+ * query parameters, rather than sending the bare days (which a server would
22
+ * read in its own zone) or `new Date(key)` (which is UTC midnight).
23
+ *
24
+ * @param fromKey - the first day, `YYYY-MM-DD`.
25
+ * @param toKey - the last day included, `YYYY-MM-DD`; default `fromKey` (one day).
26
+ * @param tz - an IANA zone id; default the display zone. An unknown zone reads as UTC.
27
+ * @returns the half-open range as ISO 8601 instants.
28
+ * @throws RangeError when a key is not a real `YYYY-MM-DD` day.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * // A "between 2026-10-01 and 2026-10-31" filter, for a viewer in Costa Rica:
33
+ * zonedDayRangeToInstants('2026-10-01', '2026-10-31', 'America/Costa_Rica');
34
+ * // { from: '2026-10-01T06:00:00.000Z', to: '2026-11-01T06:00:00.000Z' }
35
+ * ```
36
+ *
37
+ * @stability experimental
38
+ */
39
+ export declare function zonedDayRangeToInstants(fromKey: string, toKey?: string, tz?: string): ZonedDayInstantRange;
40
+ //# sourceMappingURL=dateRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateRange.d.ts","sourceRoot":"","sources":["../../../../src/datatable/headless/filter/dateRange.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAgB,EACvB,EAAE,GAAE,MAA6B,GAChC,oBAAoB,CActB"}
@@ -0,0 +1,53 @@
1
+ // Mapping a date filter onto a server query. A DataTable date filter carries
2
+ // calendar days (`YYYY-MM-DD`); a server filters instants. The honest mapping
3
+ // is the half-open instant range [start of `from`, start of the day after
4
+ // `to`) in the viewer's zone, computed with the contract's DST-safe
5
+ // `zonedDayStart`, the same function the API uses to cut days.
6
+ import { addDaysToDateKey, isDateKey, zonedDayStart } from '@marinoscar/platform-contract/timezone';
7
+ import { getDisplayTimeZone } from '../../../core/index.js';
8
+ /**
9
+ * The ISO instants that bound the calendar days `fromKey` to `toKey`
10
+ * (inclusive) in `tz`: `from` is local midnight at the start of `fromKey`,
11
+ * `to` is local midnight at the start of the day after `toKey`, so a server
12
+ * filters `createdAt >= from AND createdAt < to`. DST-safe: a 23- or 25-hour
13
+ * day is covered exactly, and a skipped midnight starts at the first instant
14
+ * after the gap.
15
+ *
16
+ * Use it to turn a `date` filter (`between`, `after`, `before`) into server
17
+ * query parameters, rather than sending the bare days (which a server would
18
+ * read in its own zone) or `new Date(key)` (which is UTC midnight).
19
+ *
20
+ * @param fromKey - the first day, `YYYY-MM-DD`.
21
+ * @param toKey - the last day included, `YYYY-MM-DD`; default `fromKey` (one day).
22
+ * @param tz - an IANA zone id; default the display zone. An unknown zone reads as UTC.
23
+ * @returns the half-open range as ISO 8601 instants.
24
+ * @throws RangeError when a key is not a real `YYYY-MM-DD` day.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // A "between 2026-10-01 and 2026-10-31" filter, for a viewer in Costa Rica:
29
+ * zonedDayRangeToInstants('2026-10-01', '2026-10-31', 'America/Costa_Rica');
30
+ * // { from: '2026-10-01T06:00:00.000Z', to: '2026-11-01T06:00:00.000Z' }
31
+ * ```
32
+ *
33
+ * @stability experimental
34
+ */
35
+ export function zonedDayRangeToInstants(fromKey, toKey = fromKey, tz = getDisplayTimeZone()) {
36
+ if (!isDateKey(fromKey))
37
+ throw new RangeError(`Not a YYYY-MM-DD day: ${fromKey}`);
38
+ if (!isDateKey(toKey))
39
+ throw new RangeError(`Not a YYYY-MM-DD day: ${toKey}`);
40
+ const start = (day) => {
41
+ try {
42
+ return zonedDayStart(day, tz);
43
+ }
44
+ catch {
45
+ return zonedDayStart(day, 'UTC');
46
+ }
47
+ };
48
+ return {
49
+ from: start(fromKey).toISOString(),
50
+ to: start(addDaysToDateKey(toKey, 1)).toISOString(),
51
+ };
52
+ }
53
+ //# sourceMappingURL=dateRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateRange.js","sourceRoot":"","sources":["../../../../src/datatable/headless/filter/dateRange.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,oEAAoE;AACpE,+DAA+D;AAE/D,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAc5D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,QAAgB,OAAO,EACvB,KAAa,kBAAkB,EAAE;IAEjC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,CAAC,GAAW,EAAQ,EAAE;QAClC,IAAI,CAAC;YACH,OAAO,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;QAClC,EAAE,EAAE,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;KACpD,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"filterTypes.d.ts","sourceRoot":"","sources":["../../../../src/datatable/headless/filter/filterTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAEV,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,sBAAsB;IACrC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACxC;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAC1F,uGAAuG;IACvG,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,kFAAkF;IAClF,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC;CAC/F;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAkBvF,CAAC;AAyBH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAoBnF;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,sBAAsB,GAAG,SAAS,CAEpG;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,sBAAsB,EAAE,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAE1E;AAID;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,GAAG,IAAI,CAW9F"}
1
+ {"version":3,"file":"filterTypes.d.ts","sourceRoot":"","sources":["../../../../src/datatable/headless/filter/filterTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAEV,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,sBAAsB;IACrC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACxC;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAC1F,uGAAuG;IACvG,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,kFAAkF;IAClF,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC;CAC/F;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAkBvF,CAAC;AAyBH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAoBnF;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,sBAAsB,GAAG,SAAS,CAEpG;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,sBAAsB,EAAE,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAE1E;AAID;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,GAAG,IAAI,CAW9F"}
@@ -14,6 +14,7 @@
14
14
  * first render), exactly like the settings and doctor registries of this
15
15
  * package.
16
16
  */
17
+ import { zonedDateKey } from '../../../core/index.js';
17
18
  /**
18
19
  * What a filter type id looks like: lower case letters and digits, 2 to 32
19
20
  * characters, starting with a letter.
@@ -173,6 +174,23 @@ export function learnColumnOperators(operators) {
173
174
  const text = (value) => (value === null || value === undefined ? '' : String(value));
174
175
  const isEmptyValue = (value) => value === null || value === undefined || value === '';
175
176
  const asList = (operand) => (Array.isArray(operand) ? operand : operand === null ? [] : [operand]);
177
+ /** A bare `YYYY-MM-DD` (no time part): a calendar day, not an instant. */
178
+ const BARE_DAY = /^\d{4}-\d{2}-\d{2}$/;
179
+ /**
180
+ * The calendar day a filter value names: a bare `YYYY-MM-DD` as is; an instant
181
+ * (ISO string with a time, epoch milliseconds, a `Date`) as its day in the
182
+ * display zone; anything unparsable by its first ten characters, as before.
183
+ */
184
+ function calendarDayOf(value) {
185
+ if (typeof value === 'string' && BARE_DAY.test(value))
186
+ return value;
187
+ if (typeof value === 'string' || typeof value === 'number' || value instanceof Date) {
188
+ const key = zonedDateKey(value);
189
+ if (key !== null)
190
+ return key;
191
+ }
192
+ return text(value).slice(0, 10);
193
+ }
176
194
  function matchesEmptiness(value, operator) {
177
195
  if (operator === 'isEmpty')
178
196
  return isEmptyValue(value);
@@ -255,13 +273,15 @@ const BUILTIN_TYPES = [
255
273
  return empty;
256
274
  if (isEmptyValue(value))
257
275
  return false;
258
- // Dates travel as YYYY-MM-DD; a datetime value compares by its day.
259
- const day = text(value).slice(0, 10);
276
+ // Operands travel as YYYY-MM-DD days. A bare day compares as is; an
277
+ // instant compares by the calendar day it falls on in the display zone
278
+ // (never its UTC `.slice(0, 10)`, which is the wrong day near midnight).
279
+ const day = calendarDayOf(value);
260
280
  if (operator === 'between') {
261
- const [from, to] = asList(operand).map(String);
281
+ const [from, to] = asList(operand).map(calendarDayOf);
262
282
  return from !== undefined && to !== undefined && day >= from && day <= to;
263
283
  }
264
- const other = text(operand).slice(0, 10);
284
+ const other = calendarDayOf(operand);
265
285
  if (operator === 'before')
266
286
  return day < other;
267
287
  if (operator === 'after')