@stableflow/pay-ui 0.0.1-beta-82ede460a5-20260923

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 (307) hide show
  1. package/dist/autocomplete/index.d.ts +27 -0
  2. package/dist/autocomplete/index.js +229 -0
  3. package/dist/autocomplete/index.js.map +1 -0
  4. package/dist/button/index.d.ts +28 -0
  5. package/dist/button/index.js +83 -0
  6. package/dist/button/index.js.map +1 -0
  7. package/dist/card/index.d.ts +7 -0
  8. package/dist/card/index.js +8 -0
  9. package/dist/card/index.js.map +1 -0
  10. package/dist/checkbox/index.d.ts +11 -0
  11. package/dist/checkbox/index.js +54 -0
  12. package/dist/checkbox/index.js.map +1 -0
  13. package/dist/chunk-6OV2OZVR.js +34 -0
  14. package/dist/chunk-6OV2OZVR.js.map +1 -0
  15. package/dist/chunk-AIJAGS5R.js +223 -0
  16. package/dist/chunk-AIJAGS5R.js.map +1 -0
  17. package/dist/chunk-DON56HU7.js +113 -0
  18. package/dist/chunk-DON56HU7.js.map +1 -0
  19. package/dist/chunk-FXENEWNN.js +7 -0
  20. package/dist/chunk-FXENEWNN.js.map +1 -0
  21. package/dist/chunk-J5TQGGEN.js +57 -0
  22. package/dist/chunk-J5TQGGEN.js.map +1 -0
  23. package/dist/chunk-MJ36QLY3.js +23 -0
  24. package/dist/chunk-MJ36QLY3.js.map +1 -0
  25. package/dist/chunk-NZGSPYWG.js +34 -0
  26. package/dist/chunk-NZGSPYWG.js.map +1 -0
  27. package/dist/chunk-OGSFVQK2.js +34 -0
  28. package/dist/chunk-OGSFVQK2.js.map +1 -0
  29. package/dist/chunk-R46DAHYR.js +14 -0
  30. package/dist/chunk-R46DAHYR.js.map +1 -0
  31. package/dist/chunk-R4BKHISR.js +34 -0
  32. package/dist/chunk-R4BKHISR.js.map +1 -0
  33. package/dist/chunk-RUOUGZWI.js +73 -0
  34. package/dist/chunk-RUOUGZWI.js.map +1 -0
  35. package/dist/chunk-SE7Z4ZYP.js +34 -0
  36. package/dist/chunk-SE7Z4ZYP.js.map +1 -0
  37. package/dist/chunk-TUEV2KLC.js +11 -0
  38. package/dist/chunk-TUEV2KLC.js.map +1 -0
  39. package/dist/chunk-VAPGLPZ5.js +184 -0
  40. package/dist/chunk-VAPGLPZ5.js.map +1 -0
  41. package/dist/date-range-picker/index.d.ts +42 -0
  42. package/dist/date-range-picker/index.js +272 -0
  43. package/dist/date-range-picker/index.js.map +1 -0
  44. package/dist/dialog/index.d.ts +7 -0
  45. package/dist/dialog/index.js +116 -0
  46. package/dist/dialog/index.js.map +1 -0
  47. package/dist/drawer/index.d.ts +17 -0
  48. package/dist/drawer/index.js +15 -0
  49. package/dist/drawer/index.js.map +1 -0
  50. package/dist/dropdown/index.d.ts +29 -0
  51. package/dist/dropdown/index.js +198 -0
  52. package/dist/dropdown/index.js.map +1 -0
  53. package/dist/icons/alert.d.ts +6 -0
  54. package/dist/icons/alert.js +9 -0
  55. package/dist/icons/alert.js.map +1 -0
  56. package/dist/icons/all-networks.d.ts +6 -0
  57. package/dist/icons/all-networks.js +30 -0
  58. package/dist/icons/all-networks.js.map +1 -0
  59. package/dist/icons/arrow-down.d.ts +6 -0
  60. package/dist/icons/arrow-down.js +9 -0
  61. package/dist/icons/arrow-down.js.map +1 -0
  62. package/dist/icons/back.d.ts +6 -0
  63. package/dist/icons/back.js +47 -0
  64. package/dist/icons/back.js.map +1 -0
  65. package/dist/icons/bonus.d.ts +6 -0
  66. package/dist/icons/bonus.js +33 -0
  67. package/dist/icons/bonus.js.map +1 -0
  68. package/dist/icons/book.d.ts +6 -0
  69. package/dist/icons/book.js +30 -0
  70. package/dist/icons/book.js.map +1 -0
  71. package/dist/icons/calendar.d.ts +6 -0
  72. package/dist/icons/calendar.js +33 -0
  73. package/dist/icons/calendar.js.map +1 -0
  74. package/dist/icons/cash.d.ts +6 -0
  75. package/dist/icons/cash.js +33 -0
  76. package/dist/icons/cash.js.map +1 -0
  77. package/dist/icons/check.d.ts +6 -0
  78. package/dist/icons/check.js +9 -0
  79. package/dist/icons/check.js.map +1 -0
  80. package/dist/icons/chevron.d.ts +6 -0
  81. package/dist/icons/chevron.js +33 -0
  82. package/dist/icons/chevron.js.map +1 -0
  83. package/dist/icons/close.d.ts +6 -0
  84. package/dist/icons/close.js +9 -0
  85. package/dist/icons/close.js.map +1 -0
  86. package/dist/icons/cloud.d.ts +6 -0
  87. package/dist/icons/cloud.js +33 -0
  88. package/dist/icons/cloud.js.map +1 -0
  89. package/dist/icons/code.d.ts +6 -0
  90. package/dist/icons/code.js +36 -0
  91. package/dist/icons/code.js.map +1 -0
  92. package/dist/icons/copy.d.ts +6 -0
  93. package/dist/icons/copy.js +33 -0
  94. package/dist/icons/copy.js.map +1 -0
  95. package/dist/icons/database.d.ts +6 -0
  96. package/dist/icons/database.js +33 -0
  97. package/dist/icons/database.js.map +1 -0
  98. package/dist/icons/delete.d.ts +6 -0
  99. package/dist/icons/delete.js +33 -0
  100. package/dist/icons/delete.js.map +1 -0
  101. package/dist/icons/download.d.ts +6 -0
  102. package/dist/icons/download.js +30 -0
  103. package/dist/icons/download.js.map +1 -0
  104. package/dist/icons/duration.d.ts +6 -0
  105. package/dist/icons/duration.js +36 -0
  106. package/dist/icons/duration.js.map +1 -0
  107. package/dist/icons/email.d.ts +6 -0
  108. package/dist/icons/email.js +30 -0
  109. package/dist/icons/email.js.map +1 -0
  110. package/dist/icons/expense-user.d.ts +6 -0
  111. package/dist/icons/expense-user.js +33 -0
  112. package/dist/icons/expense-user.js.map +1 -0
  113. package/dist/icons/expense.d.ts +6 -0
  114. package/dist/icons/expense.js +30 -0
  115. package/dist/icons/expense.js.map +1 -0
  116. package/dist/icons/eye.d.ts +8 -0
  117. package/dist/icons/eye.js +59 -0
  118. package/dist/icons/eye.js.map +1 -0
  119. package/dist/icons/fee.d.ts +6 -0
  120. package/dist/icons/fee.js +34 -0
  121. package/dist/icons/fee.js.map +1 -0
  122. package/dist/icons/field-error.d.ts +6 -0
  123. package/dist/icons/field-error.js +40 -0
  124. package/dist/icons/field-error.js.map +1 -0
  125. package/dist/icons/flask.d.ts +6 -0
  126. package/dist/icons/flask.js +33 -0
  127. package/dist/icons/flask.js.map +1 -0
  128. package/dist/icons/google.d.ts +6 -0
  129. package/dist/icons/google.js +54 -0
  130. package/dist/icons/google.js.map +1 -0
  131. package/dist/icons/grants.d.ts +6 -0
  132. package/dist/icons/grants.js +33 -0
  133. package/dist/icons/grants.js.map +1 -0
  134. package/dist/icons/guard.d.ts +6 -0
  135. package/dist/icons/guard.js +33 -0
  136. package/dist/icons/guard.js.map +1 -0
  137. package/dist/icons/history.d.ts +6 -0
  138. package/dist/icons/history.js +33 -0
  139. package/dist/icons/history.js.map +1 -0
  140. package/dist/icons/import-file.d.ts +6 -0
  141. package/dist/icons/import-file.js +30 -0
  142. package/dist/icons/import-file.js.map +1 -0
  143. package/dist/icons/key.d.ts +6 -0
  144. package/dist/icons/key.js +34 -0
  145. package/dist/icons/key.js.map +1 -0
  146. package/dist/icons/kol-mkt.d.ts +6 -0
  147. package/dist/icons/kol-mkt.js +33 -0
  148. package/dist/icons/kol-mkt.js.map +1 -0
  149. package/dist/icons/link.d.ts +9 -0
  150. package/dist/icons/link.js +85 -0
  151. package/dist/icons/link.js.map +1 -0
  152. package/dist/icons/loading.d.ts +6 -0
  153. package/dist/icons/loading.js +9 -0
  154. package/dist/icons/loading.js.map +1 -0
  155. package/dist/icons/lock.d.ts +6 -0
  156. package/dist/icons/lock.js +33 -0
  157. package/dist/icons/lock.js.map +1 -0
  158. package/dist/icons/logout.d.ts +6 -0
  159. package/dist/icons/logout.js +33 -0
  160. package/dist/icons/logout.js.map +1 -0
  161. package/dist/icons/meno.d.ts +6 -0
  162. package/dist/icons/meno.js +33 -0
  163. package/dist/icons/meno.js.map +1 -0
  164. package/dist/icons/menu.d.ts +6 -0
  165. package/dist/icons/menu.js +33 -0
  166. package/dist/icons/menu.js.map +1 -0
  167. package/dist/icons/money.d.ts +6 -0
  168. package/dist/icons/money.js +33 -0
  169. package/dist/icons/money.js.map +1 -0
  170. package/dist/icons/more.d.ts +6 -0
  171. package/dist/icons/more.js +30 -0
  172. package/dist/icons/more.js.map +1 -0
  173. package/dist/icons/node.d.ts +6 -0
  174. package/dist/icons/node.js +33 -0
  175. package/dist/icons/node.js.map +1 -0
  176. package/dist/icons/office.d.ts +6 -0
  177. package/dist/icons/office.js +33 -0
  178. package/dist/icons/office.js.map +1 -0
  179. package/dist/icons/operations.d.ts +6 -0
  180. package/dist/icons/operations.js +33 -0
  181. package/dist/icons/operations.js.map +1 -0
  182. package/dist/icons/otc-treasury.d.ts +6 -0
  183. package/dist/icons/otc-treasury.js +33 -0
  184. package/dist/icons/otc-treasury.js.map +1 -0
  185. package/dist/icons/outsourcing.d.ts +6 -0
  186. package/dist/icons/outsourcing.js +33 -0
  187. package/dist/icons/outsourcing.js.map +1 -0
  188. package/dist/icons/overview.d.ts +6 -0
  189. package/dist/icons/overview.js +33 -0
  190. package/dist/icons/overview.js.map +1 -0
  191. package/dist/icons/pay.d.ts +6 -0
  192. package/dist/icons/pay.js +36 -0
  193. package/dist/icons/pay.js.map +1 -0
  194. package/dist/icons/payment.d.ts +6 -0
  195. package/dist/icons/payment.js +33 -0
  196. package/dist/icons/payment.js.map +1 -0
  197. package/dist/icons/payout-status.d.ts +8 -0
  198. package/dist/icons/payout-status.js +92 -0
  199. package/dist/icons/payout-status.js.map +1 -0
  200. package/dist/icons/payroll.d.ts +6 -0
  201. package/dist/icons/payroll.js +62 -0
  202. package/dist/icons/payroll.js.map +1 -0
  203. package/dist/icons/pen.d.ts +6 -0
  204. package/dist/icons/pen.js +33 -0
  205. package/dist/icons/pen.js.map +1 -0
  206. package/dist/icons/plus.d.ts +6 -0
  207. package/dist/icons/plus.js +33 -0
  208. package/dist/icons/plus.js.map +1 -0
  209. package/dist/icons/processing.d.ts +6 -0
  210. package/dist/icons/processing.js +34 -0
  211. package/dist/icons/processing.js.map +1 -0
  212. package/dist/icons/procurement.d.ts +6 -0
  213. package/dist/icons/procurement.js +33 -0
  214. package/dist/icons/procurement.js.map +1 -0
  215. package/dist/icons/question.d.ts +6 -0
  216. package/dist/icons/question.js +30 -0
  217. package/dist/icons/question.js.map +1 -0
  218. package/dist/icons/receipt.d.ts +6 -0
  219. package/dist/icons/receipt.js +30 -0
  220. package/dist/icons/receipt.js.map +1 -0
  221. package/dist/icons/records.d.ts +8 -0
  222. package/dist/icons/records.js +63 -0
  223. package/dist/icons/records.js.map +1 -0
  224. package/dist/icons/refresh.d.ts +6 -0
  225. package/dist/icons/refresh.js +33 -0
  226. package/dist/icons/refresh.js.map +1 -0
  227. package/dist/icons/reimbursement.d.ts +6 -0
  228. package/dist/icons/reimbursement.js +33 -0
  229. package/dist/icons/reimbursement.js.map +1 -0
  230. package/dist/icons/remove.d.ts +6 -0
  231. package/dist/icons/remove.js +50 -0
  232. package/dist/icons/remove.js.map +1 -0
  233. package/dist/icons/request.d.ts +6 -0
  234. package/dist/icons/request.js +30 -0
  235. package/dist/icons/request.js.map +1 -0
  236. package/dist/icons/reset-password.d.ts +6 -0
  237. package/dist/icons/reset-password.js +33 -0
  238. package/dist/icons/reset-password.js.map +1 -0
  239. package/dist/icons/search.d.ts +6 -0
  240. package/dist/icons/search.js +9 -0
  241. package/dist/icons/search.js.map +1 -0
  242. package/dist/icons/setting.d.ts +6 -0
  243. package/dist/icons/setting.js +33 -0
  244. package/dist/icons/setting.js.map +1 -0
  245. package/dist/icons/settings.d.ts +6 -0
  246. package/dist/icons/settings.js +30 -0
  247. package/dist/icons/settings.js.map +1 -0
  248. package/dist/icons/shield.d.ts +6 -0
  249. package/dist/icons/shield.js +33 -0
  250. package/dist/icons/shield.js.map +1 -0
  251. package/dist/icons/success.d.ts +6 -0
  252. package/dist/icons/success.js +34 -0
  253. package/dist/icons/success.js.map +1 -0
  254. package/dist/icons/support.d.ts +6 -0
  255. package/dist/icons/support.js +33 -0
  256. package/dist/icons/support.js.map +1 -0
  257. package/dist/icons/swap.d.ts +6 -0
  258. package/dist/icons/swap.js +42 -0
  259. package/dist/icons/swap.js.map +1 -0
  260. package/dist/icons/team.d.ts +6 -0
  261. package/dist/icons/team.js +33 -0
  262. package/dist/icons/team.js.map +1 -0
  263. package/dist/icons/to-right.d.ts +6 -0
  264. package/dist/icons/to-right.js +35 -0
  265. package/dist/icons/to-right.js.map +1 -0
  266. package/dist/icons/types.d.ts +8 -0
  267. package/dist/icons/types.js +1 -0
  268. package/dist/icons/types.js.map +1 -0
  269. package/dist/icons/up.d.ts +8 -0
  270. package/dist/icons/up.js +59 -0
  271. package/dist/icons/up.js.map +1 -0
  272. package/dist/icons/wallet.d.ts +6 -0
  273. package/dist/icons/wallet.js +42 -0
  274. package/dist/icons/wallet.js.map +1 -0
  275. package/dist/icons/webhooks.d.ts +6 -0
  276. package/dist/icons/webhooks.js +30 -0
  277. package/dist/icons/webhooks.js.map +1 -0
  278. package/dist/input-number/index.d.ts +10 -0
  279. package/dist/input-number/index.js +55 -0
  280. package/dist/input-number/index.js.map +1 -0
  281. package/dist/overlay/index.d.ts +48 -0
  282. package/dist/overlay/index.js +41 -0
  283. package/dist/overlay/index.js.map +1 -0
  284. package/dist/pagination/index.d.ts +11 -0
  285. package/dist/pagination/index.js +55 -0
  286. package/dist/pagination/index.js.map +1 -0
  287. package/dist/search-input/index.d.ts +13 -0
  288. package/dist/search-input/index.js +60 -0
  289. package/dist/search-input/index.js.map +1 -0
  290. package/dist/skeleton/index.d.ts +7 -0
  291. package/dist/skeleton/index.js +8 -0
  292. package/dist/skeleton/index.js.map +1 -0
  293. package/dist/switch/index.d.ts +14 -0
  294. package/dist/switch/index.js +79 -0
  295. package/dist/switch/index.js.map +1 -0
  296. package/dist/table/index.d.ts +29 -0
  297. package/dist/table/index.js +95 -0
  298. package/dist/table/index.js.map +1 -0
  299. package/dist/toast/index.d.ts +21 -0
  300. package/dist/toast/index.js +85 -0
  301. package/dist/toast/index.js.map +1 -0
  302. package/dist/tooltip/index.d.ts +17 -0
  303. package/dist/tooltip/index.js +104 -0
  304. package/dist/tooltip/index.js.map +1 -0
  305. package/dist/types-DNElDQZ9.d.ts +23 -0
  306. package/dist/use-floating-position-aNqQwkre.d.ts +33 -0
  307. package/package.json +111 -0
@@ -0,0 +1,73 @@
1
+ // src/overlay/config.ts
2
+ var OVERLAY_BASE_Z_INDEX = 1e3;
3
+ var OVERLAY_Z_INDEX_STEP = 10;
4
+ var FLOATING_LAYER_Z_INDEX = 1100;
5
+ var WALLET_PORTAL_Z_INDEX = 1e4;
6
+ var DESKTOP_MEDIA_QUERY = "(min-width: 768px)";
7
+ var OVERLAY_MASK_FADE_SECONDS = 0.1;
8
+ var OVERLAY_DIALOG_PANEL_FADE_SECONDS = 0.1;
9
+ var OVERLAY_PANEL_SLIDE_SECONDS = 0.2;
10
+ var OVERLAY_EXIT_SECONDS = OVERLAY_MASK_FADE_SECONDS + OVERLAY_PANEL_SLIDE_SECONDS;
11
+
12
+ // src/overlay/stack.ts
13
+ var layerSeq = 0;
14
+ var openLayers = [];
15
+ var previousBodyOverflow = null;
16
+ function lockBodyScroll() {
17
+ if (typeof document === "undefined") return;
18
+ previousBodyOverflow = document.body.style.overflow;
19
+ document.body.style.overflow = "hidden";
20
+ }
21
+ function unlockBodyScroll() {
22
+ if (typeof document === "undefined") return;
23
+ document.body.style.overflow = previousBodyOverflow ?? "";
24
+ previousBodyOverflow = null;
25
+ }
26
+ function acquireOverlayLayer() {
27
+ layerSeq += 1;
28
+ const zIndex = OVERLAY_BASE_Z_INDEX + layerSeq * OVERLAY_Z_INDEX_STEP;
29
+ openLayers.push(zIndex);
30
+ if (openLayers.length === 1) {
31
+ lockBodyScroll();
32
+ }
33
+ return zIndex;
34
+ }
35
+ function releaseOverlayLayer(zIndex) {
36
+ const index = openLayers.lastIndexOf(zIndex);
37
+ if (index >= 0) {
38
+ openLayers.splice(index, 1);
39
+ }
40
+ if (openLayers.length === 0) {
41
+ layerSeq = 0;
42
+ unlockBodyScroll();
43
+ }
44
+ }
45
+ function isTopOverlay(zIndex) {
46
+ return openLayers[openLayers.length - 1] === zIndex;
47
+ }
48
+ function floatingLayerZIndex() {
49
+ const top = openLayers[openLayers.length - 1];
50
+ if (top == null) return FLOATING_LAYER_Z_INDEX;
51
+ return top + OVERLAY_Z_INDEX_STEP;
52
+ }
53
+ function elevatedOverlayZIndex(acquired) {
54
+ return WALLET_PORTAL_Z_INDEX + (acquired - OVERLAY_BASE_Z_INDEX);
55
+ }
56
+
57
+ export {
58
+ OVERLAY_BASE_Z_INDEX,
59
+ OVERLAY_Z_INDEX_STEP,
60
+ FLOATING_LAYER_Z_INDEX,
61
+ WALLET_PORTAL_Z_INDEX,
62
+ DESKTOP_MEDIA_QUERY,
63
+ OVERLAY_MASK_FADE_SECONDS,
64
+ OVERLAY_DIALOG_PANEL_FADE_SECONDS,
65
+ OVERLAY_PANEL_SLIDE_SECONDS,
66
+ OVERLAY_EXIT_SECONDS,
67
+ acquireOverlayLayer,
68
+ releaseOverlayLayer,
69
+ isTopOverlay,
70
+ floatingLayerZIndex,
71
+ elevatedOverlayZIndex
72
+ };
73
+ //# sourceMappingURL=chunk-RUOUGZWI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/overlay/config.ts","../src/overlay/stack.ts"],"sourcesContent":["export const OVERLAY_BASE_Z_INDEX = 1000;\nexport const OVERLAY_Z_INDEX_STEP = 10;\n/** Portalled menus and tooltips when no overlay is open. */\nexport const FLOATING_LAYER_Z_INDEX = 1100;\n/** Wallet portals must sit above Overlay. */\nexport const WALLET_PORTAL_Z_INDEX = 10000;\n\nexport const DESKTOP_MEDIA_QUERY = \"(min-width: 768px)\";\n\n/** Mask fade in and out. The panel enter waits so the mask shows first. */\nexport const OVERLAY_MASK_FADE_SECONDS = 0.1;\n/** Dialog panel fade on open and close. */\nexport const OVERLAY_DIALOG_PANEL_FADE_SECONDS = 0.1;\n/** Drawer panel slide. */\nexport const OVERLAY_PANEL_SLIDE_SECONDS = 0.2;\nexport const OVERLAY_EXIT_SECONDS = OVERLAY_MASK_FADE_SECONDS + OVERLAY_PANEL_SLIDE_SECONDS;\n","import {\n FLOATING_LAYER_Z_INDEX,\n OVERLAY_BASE_Z_INDEX,\n OVERLAY_Z_INDEX_STEP,\n WALLET_PORTAL_Z_INDEX,\n} from \"./config\";\n\nlet layerSeq = 0;\nconst openLayers: number[] = [];\nlet previousBodyOverflow: string | null = null;\n\nfunction lockBodyScroll() {\n if (typeof document === \"undefined\") return;\n previousBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n}\n\nfunction unlockBodyScroll() {\n if (typeof document === \"undefined\") return;\n document.body.style.overflow = previousBodyOverflow ?? \"\";\n previousBodyOverflow = null;\n}\n\nexport function acquireOverlayLayer(): number {\n layerSeq += 1;\n const zIndex = OVERLAY_BASE_Z_INDEX + layerSeq * OVERLAY_Z_INDEX_STEP;\n openLayers.push(zIndex);\n if (openLayers.length === 1) {\n lockBodyScroll();\n }\n return zIndex;\n}\n\nexport function releaseOverlayLayer(zIndex: number) {\n const index = openLayers.lastIndexOf(zIndex);\n if (index >= 0) {\n openLayers.splice(index, 1);\n }\n if (openLayers.length === 0) {\n layerSeq = 0;\n unlockBodyScroll();\n }\n}\n\nexport function isTopOverlay(zIndex: number) {\n return openLayers[openLayers.length - 1] === zIndex;\n}\n\nexport function floatingLayerZIndex(): number {\n const top = openLayers[openLayers.length - 1];\n if (top == null) return FLOATING_LAYER_Z_INDEX;\n return top + OVERLAY_Z_INDEX_STEP;\n}\n\nexport function elevatedOverlayZIndex(acquired: number): number {\n return WALLET_PORTAL_Z_INDEX + (acquired - OVERLAY_BASE_Z_INDEX);\n}\n"],"mappings":";AAAO,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,yBAAyB;AAE/B,IAAM,wBAAwB;AAE9B,IAAM,sBAAsB;AAG5B,IAAM,4BAA4B;AAElC,IAAM,oCAAoC;AAE1C,IAAM,8BAA8B;AACpC,IAAM,uBAAuB,4BAA4B;;;ACRhE,IAAI,WAAW;AACf,IAAM,aAAuB,CAAC;AAC9B,IAAI,uBAAsC;AAE1C,SAAS,iBAAiB;AACxB,MAAI,OAAO,aAAa,YAAa;AACrC,yBAAuB,SAAS,KAAK,MAAM;AAC3C,WAAS,KAAK,MAAM,WAAW;AACjC;AAEA,SAAS,mBAAmB;AAC1B,MAAI,OAAO,aAAa,YAAa;AACrC,WAAS,KAAK,MAAM,WAAW,wBAAwB;AACvD,yBAAuB;AACzB;AAEO,SAAS,sBAA8B;AAC5C,cAAY;AACZ,QAAM,SAAS,uBAAuB,WAAW;AACjD,aAAW,KAAK,MAAM;AACtB,MAAI,WAAW,WAAW,GAAG;AAC3B,mBAAe;AAAA,EACjB;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAgB;AAClD,QAAM,QAAQ,WAAW,YAAY,MAAM;AAC3C,MAAI,SAAS,GAAG;AACd,eAAW,OAAO,OAAO,CAAC;AAAA,EAC5B;AACA,MAAI,WAAW,WAAW,GAAG;AAC3B,eAAW;AACX,qBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,aAAa,QAAgB;AAC3C,SAAO,WAAW,WAAW,SAAS,CAAC,MAAM;AAC/C;AAEO,SAAS,sBAA8B;AAC5C,QAAM,MAAM,WAAW,WAAW,SAAS,CAAC;AAC5C,MAAI,OAAO,KAAM,QAAO;AACxB,SAAO,MAAM;AACf;AAEO,SAAS,sBAAsB,UAA0B;AAC9D,SAAO,yBAAyB,WAAW;AAC7C;","names":[]}
@@ -0,0 +1,34 @@
1
+ // src/icons/loading.tsx
2
+ import { jsx } from "react/jsx-runtime";
3
+ var IconLoading = (props) => {
4
+ const {
5
+ className,
6
+ style
7
+ } = props;
8
+ return /* @__PURE__ */ jsx(
9
+ "svg",
10
+ {
11
+ xmlns: "http://www.w3.org/2000/svg",
12
+ width: "13",
13
+ height: "13",
14
+ viewBox: "0 0 13 13",
15
+ fill: "none",
16
+ className: className ? `sfp-icon ${className}` : "sfp-icon",
17
+ style,
18
+ children: /* @__PURE__ */ jsx(
19
+ "path",
20
+ {
21
+ d: "M10.9474 6.5C10.9474 4.04379 8.95621 2.05263 6.5 2.05263C4.04379 2.05263 2.05263 4.04379 2.05263 6.5C2.05263 7.06682 1.59313 7.52632 1.02632 7.52632C0.459497 7.52632 0 7.06682 0 6.5C0 2.91015 2.91015 0 6.5 0C10.0899 0 13 2.91015 13 6.5C13 10.0899 10.0899 13 6.5 13C5.93318 13 5.47368 12.5405 5.47368 11.9737C5.47368 11.4069 5.93318 10.9474 6.5 10.9474C8.95621 10.9474 10.9474 8.95621 10.9474 6.5Z",
22
+ fill: "currentColor"
23
+ }
24
+ )
25
+ }
26
+ );
27
+ };
28
+ var loading_default = IconLoading;
29
+
30
+ export {
31
+ IconLoading,
32
+ loading_default
33
+ };
34
+ //# sourceMappingURL=chunk-SE7Z4ZYP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/icons/loading.tsx"],"sourcesContent":["import type { IconProps } from \"./types\";\n\nexport const IconLoading = (props: IconProps) => {\n const {\n className,\n style,\n } = props;\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 13 13\"\n fill=\"none\"\n className={className ? `sfp-icon ${className}` : \"sfp-icon\"}\n style={style}\n >\n <path\n d=\"M10.9474 6.5C10.9474 4.04379 8.95621 2.05263 6.5 2.05263C4.04379 2.05263 2.05263 4.04379 2.05263 6.5C2.05263 7.06682 1.59313 7.52632 1.02632 7.52632C0.459497 7.52632 0 7.06682 0 6.5C0 2.91015 2.91015 0 6.5 0C10.0899 0 13 2.91015 13 6.5C13 10.0899 10.0899 13 6.5 13C5.93318 13 5.47368 12.5405 5.47368 11.9737C5.47368 11.4069 5.93318 10.9474 6.5 10.9474C8.95621 10.9474 10.9474 8.95621 10.9474 6.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default IconLoading;\n"],"mappings":";AAkBM;AAhBC,IAAM,cAAc,CAAC,UAAqB;AAC/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,WAAW,YAAY,YAAY,SAAS,KAAK;AAAA,MACjD;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kBAAQ;","names":[]}
@@ -0,0 +1,11 @@
1
+ // src/lib/cn.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+
8
+ export {
9
+ cn
10
+ };
11
+ //# sourceMappingURL=chunk-TUEV2KLC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";AAAA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
@@ -0,0 +1,184 @@
1
+ // src/overlay/use-floating-position.ts
2
+ import { useCallback, useLayoutEffect, useState } from "react";
3
+ var FLOATING_SIDE = {
4
+ Top: "top",
5
+ TopLeft: "top-left",
6
+ TopRight: "top-right",
7
+ Right: "right",
8
+ RightTop: "right-top",
9
+ RightBottom: "right-bottom",
10
+ Bottom: "bottom",
11
+ BottomLeft: "bottom-left",
12
+ BottomRight: "bottom-right",
13
+ Left: "left",
14
+ LeftTop: "left-top",
15
+ LeftBottom: "left-bottom"
16
+ };
17
+ var FLOATING_ALIGN = {
18
+ Start: "start",
19
+ Center: "center",
20
+ End: "end"
21
+ };
22
+ var CARDINAL_SIDE = {
23
+ Top: FLOATING_SIDE.Top,
24
+ Right: FLOATING_SIDE.Right,
25
+ Bottom: FLOATING_SIDE.Bottom,
26
+ Left: FLOATING_SIDE.Left
27
+ };
28
+ var VIEWPORT_PADDING = 8;
29
+ var HIDDEN_STYLE = {
30
+ position: "fixed",
31
+ top: 0,
32
+ left: 0,
33
+ visibility: "hidden",
34
+ pointerEvents: "none"
35
+ };
36
+ function useFloatingPosition(options) {
37
+ const {
38
+ open,
39
+ triggerRef,
40
+ panelRef,
41
+ side = FLOATING_SIDE.Bottom,
42
+ align = FLOATING_ALIGN.Start,
43
+ offset = 8
44
+ } = options;
45
+ const [style, setStyle] = useState(HIDDEN_STYLE);
46
+ const update = useCallback(() => {
47
+ const trigger = triggerRef.current;
48
+ const panel = panelRef.current;
49
+ if (!trigger || !panel) return false;
50
+ const triggerRect = trigger.getBoundingClientRect();
51
+ const panelRect = measurePanelRect(panel);
52
+ setStyle(getClampedFloatingStyle(triggerRect, panelRect, side, align, offset));
53
+ return true;
54
+ }, [align, offset, panelRef, side, triggerRef]);
55
+ useLayoutEffect(() => {
56
+ if (!open) {
57
+ setStyle(HIDDEN_STYLE);
58
+ return;
59
+ }
60
+ if (update()) return;
61
+ const frame = window.requestAnimationFrame(() => {
62
+ update();
63
+ });
64
+ return () => window.cancelAnimationFrame(frame);
65
+ }, [open, update]);
66
+ useLayoutEffect(() => {
67
+ if (!open) return;
68
+ window.addEventListener("resize", update);
69
+ return () => window.removeEventListener("resize", update);
70
+ }, [open, update]);
71
+ return style;
72
+ }
73
+ function measurePanelRect(panel) {
74
+ const previous = {
75
+ position: panel.style.position,
76
+ top: panel.style.top,
77
+ left: panel.style.left,
78
+ width: panel.style.width,
79
+ visibility: panel.style.visibility,
80
+ pointerEvents: panel.style.pointerEvents
81
+ };
82
+ panel.style.position = "fixed";
83
+ panel.style.top = "0px";
84
+ panel.style.left = "0px";
85
+ panel.style.visibility = "hidden";
86
+ panel.style.pointerEvents = "none";
87
+ panel.style.width = "";
88
+ const rect = panel.getBoundingClientRect();
89
+ panel.style.position = previous.position;
90
+ panel.style.top = previous.top;
91
+ panel.style.left = previous.left;
92
+ panel.style.width = previous.width;
93
+ panel.style.visibility = previous.visibility;
94
+ panel.style.pointerEvents = previous.pointerEvents;
95
+ return rect;
96
+ }
97
+ function resolveFloatingPlacement(side, align) {
98
+ switch (side) {
99
+ case FLOATING_SIDE.TopLeft:
100
+ return { side: CARDINAL_SIDE.Top, align: FLOATING_ALIGN.Start };
101
+ case FLOATING_SIDE.TopRight:
102
+ return { side: CARDINAL_SIDE.Top, align: FLOATING_ALIGN.End };
103
+ case FLOATING_SIDE.BottomLeft:
104
+ return { side: CARDINAL_SIDE.Bottom, align: FLOATING_ALIGN.Start };
105
+ case FLOATING_SIDE.BottomRight:
106
+ return { side: CARDINAL_SIDE.Bottom, align: FLOATING_ALIGN.End };
107
+ case FLOATING_SIDE.LeftTop:
108
+ return { side: CARDINAL_SIDE.Left, align: FLOATING_ALIGN.Start };
109
+ case FLOATING_SIDE.LeftBottom:
110
+ return { side: CARDINAL_SIDE.Left, align: FLOATING_ALIGN.End };
111
+ case FLOATING_SIDE.RightTop:
112
+ return { side: CARDINAL_SIDE.Right, align: FLOATING_ALIGN.Start };
113
+ case FLOATING_SIDE.RightBottom:
114
+ return { side: CARDINAL_SIDE.Right, align: FLOATING_ALIGN.End };
115
+ default:
116
+ return { side, align };
117
+ }
118
+ }
119
+ function getFloatingCoords(trigger, panel, side, align, offset) {
120
+ const placement = resolveFloatingPlacement(side, align);
121
+ if (placement.side === CARDINAL_SIDE.Bottom) {
122
+ return {
123
+ top: trigger.bottom + offset,
124
+ left: getAlignedLeft(trigger, panel.width, placement.align)
125
+ };
126
+ }
127
+ if (placement.side === CARDINAL_SIDE.Top) {
128
+ return {
129
+ top: trigger.top - panel.height - offset,
130
+ left: getAlignedLeft(trigger, panel.width, placement.align)
131
+ };
132
+ }
133
+ if (placement.side === CARDINAL_SIDE.Left) {
134
+ return {
135
+ top: getAlignedTop(trigger, panel.height, placement.align),
136
+ left: trigger.left - panel.width - offset
137
+ };
138
+ }
139
+ return {
140
+ top: getAlignedTop(trigger, panel.height, placement.align),
141
+ left: trigger.right + offset
142
+ };
143
+ }
144
+ function getClampedFloatingStyle(trigger, panel, side, align, offset) {
145
+ let { top, left } = getFloatingCoords(trigger, panel, side, align, offset);
146
+ const maxLeft = window.innerWidth - panel.width - VIEWPORT_PADDING;
147
+ const maxTop = window.innerHeight - panel.height - VIEWPORT_PADDING;
148
+ left = clamp(left, VIEWPORT_PADDING, Math.max(VIEWPORT_PADDING, maxLeft));
149
+ top = clamp(top, VIEWPORT_PADDING, Math.max(VIEWPORT_PADDING, maxTop));
150
+ return {
151
+ position: "fixed",
152
+ top,
153
+ left,
154
+ visibility: "visible"
155
+ };
156
+ }
157
+ function getAlignedLeft(trigger, panelWidth, align) {
158
+ if (align === FLOATING_ALIGN.Center) {
159
+ return trigger.left + trigger.width / 2 - panelWidth / 2;
160
+ }
161
+ if (align === FLOATING_ALIGN.End) {
162
+ return trigger.right - panelWidth;
163
+ }
164
+ return trigger.left;
165
+ }
166
+ function getAlignedTop(trigger, panelHeight, align) {
167
+ if (align === FLOATING_ALIGN.Center) {
168
+ return trigger.top + trigger.height / 2 - panelHeight / 2;
169
+ }
170
+ if (align === FLOATING_ALIGN.End) {
171
+ return trigger.bottom - panelHeight;
172
+ }
173
+ return trigger.top;
174
+ }
175
+ function clamp(value, min, max) {
176
+ return Math.min(max, Math.max(min, value));
177
+ }
178
+
179
+ export {
180
+ FLOATING_SIDE,
181
+ FLOATING_ALIGN,
182
+ useFloatingPosition
183
+ };
184
+ //# sourceMappingURL=chunk-VAPGLPZ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/overlay/use-floating-position.ts"],"sourcesContent":["import type { CSSProperties, RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useState } from \"react\";\n\nexport const FLOATING_SIDE = {\n Top: \"top\",\n TopLeft: \"top-left\",\n TopRight: \"top-right\",\n Right: \"right\",\n RightTop: \"right-top\",\n RightBottom: \"right-bottom\",\n Bottom: \"bottom\",\n BottomLeft: \"bottom-left\",\n BottomRight: \"bottom-right\",\n Left: \"left\",\n LeftTop: \"left-top\",\n LeftBottom: \"left-bottom\",\n} as const;\n\nexport type FloatingSide = (typeof FLOATING_SIDE)[keyof typeof FLOATING_SIDE];\n\nexport const FLOATING_ALIGN = {\n Start: \"start\",\n Center: \"center\",\n End: \"end\",\n} as const;\n\nexport type FloatingAlign = (typeof FLOATING_ALIGN)[keyof typeof FLOATING_ALIGN];\n\nconst CARDINAL_SIDE = {\n Top: FLOATING_SIDE.Top,\n Right: FLOATING_SIDE.Right,\n Bottom: FLOATING_SIDE.Bottom,\n Left: FLOATING_SIDE.Left,\n} as const;\n\nexport type CardinalSide = (typeof CARDINAL_SIDE)[keyof typeof CARDINAL_SIDE];\n\nconst VIEWPORT_PADDING = 8;\n\nconst HIDDEN_STYLE: CSSProperties = {\n position: \"fixed\",\n top: 0,\n left: 0,\n visibility: \"hidden\",\n pointerEvents: \"none\",\n};\n\nexport function useFloatingPosition(options: {\n open: boolean;\n triggerRef: RefObject<HTMLElement | null>;\n panelRef: RefObject<HTMLElement | null>;\n side?: FloatingSide;\n align?: FloatingAlign;\n offset?: number;\n}) {\n const {\n open,\n triggerRef,\n panelRef,\n side = FLOATING_SIDE.Bottom,\n align = FLOATING_ALIGN.Start,\n offset = 8,\n } = options;\n const [style, setStyle] = useState<CSSProperties>(HIDDEN_STYLE);\n\n const update = useCallback(() => {\n const trigger = triggerRef.current;\n const panel = panelRef.current;\n if (!trigger || !panel) return false;\n\n const triggerRect = trigger.getBoundingClientRect();\n const panelRect = measurePanelRect(panel);\n setStyle(getClampedFloatingStyle(triggerRect, panelRect, side, align, offset));\n return true;\n }, [align, offset, panelRef, side, triggerRef]);\n\n useLayoutEffect(() => {\n if (!open) {\n setStyle(HIDDEN_STYLE);\n return;\n }\n if (update()) return;\n const frame = window.requestAnimationFrame(() => {\n update();\n });\n return () => window.cancelAnimationFrame(frame);\n }, [open, update]);\n\n useLayoutEffect(() => {\n if (!open) return;\n window.addEventListener(\"resize\", update);\n return () => window.removeEventListener(\"resize\", update);\n }, [open, update]);\n\n return style;\n}\n\nfunction measurePanelRect(panel: HTMLElement): DOMRect {\n const previous = {\n position: panel.style.position,\n top: panel.style.top,\n left: panel.style.left,\n width: panel.style.width,\n visibility: panel.style.visibility,\n pointerEvents: panel.style.pointerEvents,\n };\n panel.style.position = \"fixed\";\n panel.style.top = \"0px\";\n panel.style.left = \"0px\";\n panel.style.visibility = \"hidden\";\n panel.style.pointerEvents = \"none\";\n // Drop the helper's inline width so className constraints (e.g. w-[285px]) apply.\n panel.style.width = \"\";\n const rect = panel.getBoundingClientRect();\n panel.style.position = previous.position;\n panel.style.top = previous.top;\n panel.style.left = previous.left;\n panel.style.width = previous.width;\n panel.style.visibility = previous.visibility;\n panel.style.pointerEvents = previous.pointerEvents;\n return rect;\n}\n\nexport function resolveFloatingPlacement(\n side: FloatingSide,\n align: FloatingAlign,\n): { side: CardinalSide; align: FloatingAlign } {\n switch (side) {\n case FLOATING_SIDE.TopLeft:\n return { side: CARDINAL_SIDE.Top, align: FLOATING_ALIGN.Start };\n case FLOATING_SIDE.TopRight:\n return { side: CARDINAL_SIDE.Top, align: FLOATING_ALIGN.End };\n case FLOATING_SIDE.BottomLeft:\n return { side: CARDINAL_SIDE.Bottom, align: FLOATING_ALIGN.Start };\n case FLOATING_SIDE.BottomRight:\n return { side: CARDINAL_SIDE.Bottom, align: FLOATING_ALIGN.End };\n case FLOATING_SIDE.LeftTop:\n return { side: CARDINAL_SIDE.Left, align: FLOATING_ALIGN.Start };\n case FLOATING_SIDE.LeftBottom:\n return { side: CARDINAL_SIDE.Left, align: FLOATING_ALIGN.End };\n case FLOATING_SIDE.RightTop:\n return { side: CARDINAL_SIDE.Right, align: FLOATING_ALIGN.Start };\n case FLOATING_SIDE.RightBottom:\n return { side: CARDINAL_SIDE.Right, align: FLOATING_ALIGN.End };\n default:\n return { side, align };\n }\n}\n\nexport function getFloatingCoords(\n trigger: Pick<DOMRect, \"top\" | \"right\" | \"bottom\" | \"left\" | \"width\" | \"height\">,\n panel: Pick<DOMRect, \"width\" | \"height\">,\n side: FloatingSide,\n align: FloatingAlign,\n offset: number,\n): { top: number; left: number } {\n const placement = resolveFloatingPlacement(side, align);\n\n if (placement.side === CARDINAL_SIDE.Bottom) {\n return {\n top: trigger.bottom + offset,\n left: getAlignedLeft(trigger, panel.width, placement.align),\n };\n }\n if (placement.side === CARDINAL_SIDE.Top) {\n return {\n top: trigger.top - panel.height - offset,\n left: getAlignedLeft(trigger, panel.width, placement.align),\n };\n }\n if (placement.side === CARDINAL_SIDE.Left) {\n return {\n top: getAlignedTop(trigger, panel.height, placement.align),\n left: trigger.left - panel.width - offset,\n };\n }\n return {\n top: getAlignedTop(trigger, panel.height, placement.align),\n left: trigger.right + offset,\n };\n}\n\nfunction getClampedFloatingStyle(\n trigger: DOMRect,\n panel: DOMRect,\n side: FloatingSide,\n align: FloatingAlign,\n offset: number,\n): CSSProperties {\n let { top, left } = getFloatingCoords(trigger, panel, side, align, offset);\n const maxLeft = window.innerWidth - panel.width - VIEWPORT_PADDING;\n const maxTop = window.innerHeight - panel.height - VIEWPORT_PADDING;\n left = clamp(left, VIEWPORT_PADDING, Math.max(VIEWPORT_PADDING, maxLeft));\n top = clamp(top, VIEWPORT_PADDING, Math.max(VIEWPORT_PADDING, maxTop));\n\n return {\n position: \"fixed\",\n top,\n left,\n visibility: \"visible\",\n };\n}\n\ntype Box = Pick<DOMRect, \"top\" | \"right\" | \"bottom\" | \"left\" | \"width\" | \"height\">;\n\nfunction getAlignedLeft(trigger: Box, panelWidth: number, align: FloatingAlign) {\n if (align === FLOATING_ALIGN.Center) {\n return trigger.left + trigger.width / 2 - panelWidth / 2;\n }\n if (align === FLOATING_ALIGN.End) {\n return trigger.right - panelWidth;\n }\n return trigger.left;\n}\n\nfunction getAlignedTop(trigger: Box, panelHeight: number, align: FloatingAlign) {\n if (align === FLOATING_ALIGN.Center) {\n return trigger.top + trigger.height / 2 - panelHeight / 2;\n }\n if (align === FLOATING_ALIGN.End) {\n return trigger.bottom - panelHeight;\n }\n return trigger.top;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,42 @@
1
+ import * as react from 'react';
2
+
3
+ type DateRangeValue = {
4
+ from: Date;
5
+ to: Date;
6
+ };
7
+ declare function calendarRangeFromPicks(start: Date, end: Date): DateRangeValue;
8
+ declare function lastNDaysRange(days: number, now?: Date): DateRangeValue;
9
+ declare function matchesLastNDays(range: DateRangeValue, days: number, now?: Date): boolean;
10
+ declare function formatDateRangeLabel(range: DateRangeValue, now?: Date): string;
11
+ declare function isInDateRange(iso: string, range: DateRangeValue): boolean;
12
+ declare function rangeToUnixSeconds(range: DateRangeValue): {
13
+ start_time: number;
14
+ end_time: number;
15
+ };
16
+ declare function dateRangeDayCount(range: DateRangeValue): number;
17
+
18
+ declare function DateRangePicker(props: {
19
+ value: DateRangeValue;
20
+ onChange: (range: DateRangeValue) => void;
21
+ className?: string;
22
+ triggerClassName?: string;
23
+ }): react.JSX.Element;
24
+
25
+ declare const DATE_RANGE_WEEKDAY_LABELS: readonly ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
26
+ declare const DATE_RANGE_PRESET: {
27
+ readonly Days30: 30;
28
+ readonly Days7: 7;
29
+ readonly Days1: 1;
30
+ };
31
+ declare const DATE_RANGE_PRESET_OPTIONS: readonly [{
32
+ readonly days: 30;
33
+ readonly label: "Last 30 days";
34
+ }, {
35
+ readonly days: 7;
36
+ readonly label: "Last 7 days";
37
+ }, {
38
+ readonly days: 1;
39
+ readonly label: "Last 1 day";
40
+ }];
41
+
42
+ export { DATE_RANGE_PRESET, DATE_RANGE_PRESET_OPTIONS, DATE_RANGE_WEEKDAY_LABELS, DateRangePicker, type DateRangeValue, calendarRangeFromPicks, dateRangeDayCount, formatDateRangeLabel, isInDateRange, lastNDaysRange, matchesLastNDays, rangeToUnixSeconds };
@@ -0,0 +1,272 @@
1
+ import {
2
+ IconArrowDown
3
+ } from "../chunk-OGSFVQK2.js";
4
+ import {
5
+ FLOATING_ALIGN,
6
+ FLOATING_SIDE,
7
+ useFloatingPosition
8
+ } from "../chunk-VAPGLPZ5.js";
9
+ import {
10
+ floatingLayerZIndex
11
+ } from "../chunk-RUOUGZWI.js";
12
+ import {
13
+ fontSans
14
+ } from "../chunk-FXENEWNN.js";
15
+ import {
16
+ cn
17
+ } from "../chunk-TUEV2KLC.js";
18
+
19
+ // src/date-range-picker/DateRangePicker.tsx
20
+ import { useEffect, useMemo, useRef, useState } from "react";
21
+ import { createPortal } from "react-dom";
22
+ import {
23
+ addMonths,
24
+ eachDayOfInterval,
25
+ endOfMonth,
26
+ endOfWeek,
27
+ format as format2,
28
+ isSameDay as isSameDay2,
29
+ isSameMonth,
30
+ isWithinInterval,
31
+ startOfMonth,
32
+ startOfWeek
33
+ } from "date-fns";
34
+
35
+ // src/date-range-picker/config.ts
36
+ var DATE_RANGE_WEEKDAY_LABELS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
37
+ var DATE_RANGE_PRESET = {
38
+ Days30: 30,
39
+ Days7: 7,
40
+ Days1: 1
41
+ };
42
+ var DATE_RANGE_PRESET_OPTIONS = [
43
+ { days: DATE_RANGE_PRESET.Days30, label: "Last 30 days" },
44
+ { days: DATE_RANGE_PRESET.Days7, label: "Last 7 days" },
45
+ { days: DATE_RANGE_PRESET.Days1, label: "Last 1 day" }
46
+ ];
47
+
48
+ // src/date-range-picker/utils.ts
49
+ import {
50
+ differenceInCalendarDays,
51
+ endOfDay,
52
+ format,
53
+ isSameDay,
54
+ startOfDay,
55
+ subDays
56
+ } from "date-fns";
57
+ function calendarRangeFromPicks(start, end) {
58
+ if (isSameDay(start, end)) {
59
+ return { from: startOfDay(end), to: endOfDay(end) };
60
+ }
61
+ const from = start.getTime() <= end.getTime() ? start : end;
62
+ const to = start.getTime() <= end.getTime() ? end : start;
63
+ return { from: startOfDay(from), to: endOfDay(to) };
64
+ }
65
+ function lastNDaysRange(days, now = /* @__PURE__ */ new Date()) {
66
+ return {
67
+ from: startOfDay(subDays(now, days - 1)),
68
+ to: endOfDay(now)
69
+ };
70
+ }
71
+ function matchesLastNDays(range, days, now = /* @__PURE__ */ new Date()) {
72
+ const expected = lastNDaysRange(days, now);
73
+ return isSameDay(range.from, expected.from) && isSameDay(range.to, expected.to);
74
+ }
75
+ function formatDateRangeLabel(range, now = /* @__PURE__ */ new Date()) {
76
+ const preset = DATE_RANGE_PRESET_OPTIONS.find(
77
+ (option) => matchesLastNDays(range, option.days, now)
78
+ );
79
+ if (preset) return preset.label;
80
+ if (isSameDay(range.from, range.to)) return format(range.from, "MMM d, yyyy");
81
+ return `${format(range.from, "MMM d, yyyy")} \u2013 ${format(range.to, "MMM d, yyyy")}`;
82
+ }
83
+ function isInDateRange(iso, range) {
84
+ const time = new Date(iso).getTime();
85
+ if (Number.isNaN(time)) return true;
86
+ return time >= range.from.getTime() && time <= range.to.getTime();
87
+ }
88
+ function rangeToUnixSeconds(range) {
89
+ return {
90
+ start_time: Math.floor(range.from.getTime() / 1e3),
91
+ end_time: Math.floor(range.to.getTime() / 1e3)
92
+ };
93
+ }
94
+ function dateRangeDayCount(range) {
95
+ return differenceInCalendarDays(range.to, range.from) + 1;
96
+ }
97
+
98
+ // src/date-range-picker/DateRangePicker.tsx
99
+ import { jsx, jsxs } from "react/jsx-runtime";
100
+ function DateRangePicker(props) {
101
+ const { value, onChange, className, triggerClassName } = props;
102
+ const triggerRef = useRef(null);
103
+ const panelRef = useRef(null);
104
+ const [open, setOpen] = useState(false);
105
+ const [viewMonth, setViewMonth] = useState(() => startOfMonth(value.to));
106
+ const [draftStart, setDraftStart] = useState(null);
107
+ const panelStyle = useFloatingPosition({
108
+ open,
109
+ triggerRef,
110
+ panelRef,
111
+ side: FLOATING_SIDE.Bottom,
112
+ align: FLOATING_ALIGN.Start,
113
+ offset: 6
114
+ });
115
+ useEffect(() => {
116
+ if (open) setViewMonth(startOfMonth(value.to));
117
+ }, [open, value.to]);
118
+ useEffect(() => {
119
+ if (!open) return;
120
+ const onPointerDown = (event) => {
121
+ const target = event.target;
122
+ if (!target) return;
123
+ if (triggerRef.current?.contains(target)) return;
124
+ if (panelRef.current?.contains(target)) return;
125
+ setOpen(false);
126
+ setDraftStart(null);
127
+ };
128
+ const onKeyDown = (event) => {
129
+ if (event.key === "Escape") {
130
+ setOpen(false);
131
+ setDraftStart(null);
132
+ }
133
+ };
134
+ document.addEventListener("mousedown", onPointerDown);
135
+ document.addEventListener("keydown", onKeyDown);
136
+ return () => {
137
+ document.removeEventListener("mousedown", onPointerDown);
138
+ document.removeEventListener("keydown", onKeyDown);
139
+ };
140
+ }, [open]);
141
+ const days = useMemo(() => {
142
+ const monthStart = startOfMonth(viewMonth);
143
+ return eachDayOfInterval({
144
+ start: startOfWeek(monthStart),
145
+ end: endOfWeek(endOfMonth(monthStart))
146
+ });
147
+ }, [viewMonth]);
148
+ const commit = (range) => {
149
+ onChange(range);
150
+ setDraftStart(null);
151
+ setOpen(false);
152
+ };
153
+ const pickDay = (day) => {
154
+ if (!draftStart) {
155
+ setDraftStart(day);
156
+ return;
157
+ }
158
+ commit(calendarRangeFromPicks(draftStart, day));
159
+ };
160
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative inline-block min-w-0", className), children: [
161
+ /* @__PURE__ */ jsxs(
162
+ "button",
163
+ {
164
+ ref: triggerRef,
165
+ type: "button",
166
+ "aria-haspopup": "dialog",
167
+ "aria-expanded": open,
168
+ "aria-label": "Select time range",
169
+ onClick: () => {
170
+ setOpen((current) => !current);
171
+ setDraftStart(null);
172
+ },
173
+ className: cn(
174
+ "inline-flex cursor-pointer h-9 w-full min-w-0 items-center justify-between gap-2 overflow-hidden rounded-[6px] border border-[#E3E3E3] bg-white px-3 text-sm font-medium text-black outline-none",
175
+ fontSans,
176
+ triggerClassName
177
+ ),
178
+ children: [
179
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 shrink truncate text-[#aaa]", children: "Time" }),
180
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 items-center justify-end gap-2 truncate text-right", children: formatDateRangeLabel(value) }),
181
+ /* @__PURE__ */ jsx(IconArrowDown, { className: cn("h-1.5 w-2.75 shrink-0 text-black transition-transform", open && "rotate-180") })
182
+ ]
183
+ }
184
+ ),
185
+ open && typeof document !== "undefined" ? createPortal(
186
+ /* @__PURE__ */ jsxs(
187
+ "div",
188
+ {
189
+ ref: panelRef,
190
+ role: "dialog",
191
+ "aria-label": "Date range",
192
+ style: { ...panelStyle, zIndex: floatingLayerZIndex() },
193
+ className: cn(
194
+ "w-[min(320px,calc(100vw-32px))] rounded-[16px] border border-black/10 bg-white p-4 shadow-[0_8px_24px_rgba(0,0,0,0.08)]",
195
+ fontSans
196
+ ),
197
+ children: [
198
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
199
+ /* @__PURE__ */ jsx(
200
+ "button",
201
+ {
202
+ type: "button",
203
+ "aria-label": "Previous month",
204
+ onClick: () => setViewMonth((month) => addMonths(month, -1)),
205
+ className: "inline-flex size-8 cursor-pointer items-center justify-center rounded-full border-0 bg-transparent p-0 text-[#606060] hover:bg-black/5",
206
+ children: /* @__PURE__ */ jsx(IconArrowDown, { className: "h-1.5 w-2.75 rotate-90" })
207
+ }
208
+ ),
209
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-black", children: format2(viewMonth, "yyyy MMM") }),
210
+ /* @__PURE__ */ jsx(
211
+ "button",
212
+ {
213
+ type: "button",
214
+ "aria-label": "Next month",
215
+ onClick: () => setViewMonth((month) => addMonths(month, 1)),
216
+ className: "inline-flex size-8 cursor-pointer items-center justify-center rounded-full border-0 bg-transparent p-0 text-[#606060] hover:bg-black/5",
217
+ children: /* @__PURE__ */ jsx(IconArrowDown, { className: "h-1.5 w-2.75 -rotate-90" })
218
+ }
219
+ )
220
+ ] }),
221
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: DATE_RANGE_WEEKDAY_LABELS.map((label) => /* @__PURE__ */ jsx("div", { className: "text-center text-[11px] font-medium text-[#aaa]", children: label }, label)) }),
222
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: days.map((day) => {
223
+ const inMonth = isSameMonth(day, viewMonth);
224
+ const selected = isSameDay2(day, value.from) || isSameDay2(day, value.to) || (draftStart ? isSameDay2(day, draftStart) : false);
225
+ const inRange = !draftStart && isWithinInterval(day, { start: value.from, end: value.to });
226
+ return /* @__PURE__ */ jsx(
227
+ "button",
228
+ {
229
+ type: "button",
230
+ onClick: () => pickDay(day),
231
+ className: cn(
232
+ "h-8 cursor-pointer rounded-[8px] border-0 bg-transparent text-[13px] font-medium text-black hover:bg-black/5",
233
+ !inMonth && "text-[#ccc]",
234
+ inRange && !selected && "bg-black/5",
235
+ selected && "bg-black text-white hover:bg-black"
236
+ ),
237
+ children: format2(day, "d")
238
+ },
239
+ day.toISOString()
240
+ );
241
+ }) }),
242
+ /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-col gap-1 border-t border-black/10 pt-2", children: DATE_RANGE_PRESET_OPTIONS.map((option) => /* @__PURE__ */ jsx(
243
+ "button",
244
+ {
245
+ type: "button",
246
+ onClick: () => commit(lastNDaysRange(option.days)),
247
+ className: "cursor-pointer rounded-[8px] border-0 bg-transparent px-2 py-1.5 text-left text-sm font-medium text-black hover:bg-black/5",
248
+ children: option.label
249
+ },
250
+ option.days
251
+ )) })
252
+ ]
253
+ }
254
+ ),
255
+ document.body
256
+ ) : null
257
+ ] });
258
+ }
259
+ export {
260
+ DATE_RANGE_PRESET,
261
+ DATE_RANGE_PRESET_OPTIONS,
262
+ DATE_RANGE_WEEKDAY_LABELS,
263
+ DateRangePicker,
264
+ calendarRangeFromPicks,
265
+ dateRangeDayCount,
266
+ formatDateRangeLabel,
267
+ isInDateRange,
268
+ lastNDaysRange,
269
+ matchesLastNDays,
270
+ rangeToUnixSeconds
271
+ };
272
+ //# sourceMappingURL=index.js.map