@modern-admin/web 0.4.0 → 0.4.1

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 (162) hide show
  1. package/dist/standalone/assets/{action-component-host-CuzX-99S.js → action-component-host-BrEZDHZt.js} +2 -2
  2. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.br +0 -0
  3. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.gz +0 -0
  4. package/dist/standalone/assets/{action-component-host-CuzX-99S.js.map → action-component-host-BrEZDHZt.js.map} +1 -1
  5. package/dist/standalone/assets/{action-page-BUTCUZ7e.js → action-page-Bx7kzeK7.js} +2 -2
  6. package/dist/standalone/assets/action-page-Bx7kzeK7.js.br +0 -0
  7. package/dist/standalone/assets/action-page-Bx7kzeK7.js.gz +0 -0
  8. package/dist/standalone/assets/{action-page-BUTCUZ7e.js.map → action-page-Bx7kzeK7.js.map} +1 -1
  9. package/dist/standalone/assets/{ai-assistant-widget-B3Xy7bCi.js → ai-assistant-widget-BbIXVrSu.js} +2 -2
  10. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.br +0 -0
  11. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.gz +0 -0
  12. package/dist/standalone/assets/{ai-assistant-widget-B3Xy7bCi.js.map → ai-assistant-widget-BbIXVrSu.js.map} +1 -1
  13. package/dist/standalone/assets/{audit-log-page-GHzf7mLS.js → audit-log-page-BoZh23oQ.js} +2 -2
  14. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.br +0 -0
  15. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.gz +0 -0
  16. package/dist/standalone/assets/{audit-log-page-GHzf7mLS.js.map → audit-log-page-BoZh23oQ.js.map} +1 -1
  17. package/dist/standalone/assets/{calendar-DxUwrP2r.js → calendar-nvD_z7KQ.js} +2 -2
  18. package/dist/standalone/assets/calendar-nvD_z7KQ.js.br +0 -0
  19. package/dist/standalone/assets/calendar-nvD_z7KQ.js.gz +0 -0
  20. package/dist/standalone/assets/{calendar-DxUwrP2r.js.map → calendar-nvD_z7KQ.js.map} +1 -1
  21. package/dist/standalone/assets/{chart-widget-DnK78Joj.js → chart-widget-YeCL7jdB.js} +2 -2
  22. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.br +0 -0
  23. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.gz +0 -0
  24. package/dist/standalone/assets/{chart-widget-DnK78Joj.js.map → chart-widget-YeCL7jdB.js.map} +1 -1
  25. package/dist/standalone/assets/{command-Df4Effbo.js → command-Sb0xL-se.js} +2 -2
  26. package/dist/standalone/assets/command-Sb0xL-se.js.br +0 -0
  27. package/dist/standalone/assets/command-Sb0xL-se.js.gz +0 -0
  28. package/dist/standalone/assets/{command-Df4Effbo.js.map → command-Sb0xL-se.js.map} +1 -1
  29. package/dist/standalone/assets/date-picker-C4HcgidQ.js +2 -0
  30. package/dist/standalone/assets/date-picker-C4HcgidQ.js.br +0 -0
  31. package/dist/standalone/assets/date-picker-C4HcgidQ.js.gz +0 -0
  32. package/dist/standalone/assets/date-picker-C4HcgidQ.js.map +1 -0
  33. package/dist/standalone/assets/{edit-page-C_QYbzrq.js → edit-page-CW7-FAPC.js} +2 -2
  34. package/dist/standalone/assets/edit-page-CW7-FAPC.js.br +0 -0
  35. package/dist/standalone/assets/edit-page-CW7-FAPC.js.gz +0 -0
  36. package/dist/standalone/assets/{edit-page-C_QYbzrq.js.map → edit-page-CW7-FAPC.js.map} +1 -1
  37. package/dist/standalone/assets/{empty-BQFNUnfh.js → empty-Cposcczv.js} +2 -2
  38. package/dist/standalone/assets/empty-Cposcczv.js.br +0 -0
  39. package/dist/standalone/assets/empty-Cposcczv.js.gz +0 -0
  40. package/dist/standalone/assets/{empty-BQFNUnfh.js.map → empty-Cposcczv.js.map} +1 -1
  41. package/dist/standalone/assets/{global-search-dialog-DMgCfJpF.js → global-search-dialog-DLv_nIvM.js} +2 -2
  42. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.br +0 -0
  43. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.gz +0 -0
  44. package/dist/standalone/assets/{global-search-dialog-DMgCfJpF.js.map → global-search-dialog-DLv_nIvM.js.map} +1 -1
  45. package/dist/standalone/assets/{heavy-fields-Do2qd-Wi.js → heavy-fields-BiCEgD2L.js} +2 -2
  46. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.br +0 -0
  47. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.gz +0 -0
  48. package/dist/standalone/assets/{heavy-fields-Do2qd-Wi.js.map → heavy-fields-BiCEgD2L.js.map} +1 -1
  49. package/dist/standalone/assets/{home-page-eGVeZnKR.js → home-page-BSz1wGk0.js} +3 -3
  50. package/dist/standalone/assets/home-page-BSz1wGk0.js.br +0 -0
  51. package/dist/standalone/assets/home-page-BSz1wGk0.js.gz +0 -0
  52. package/dist/standalone/assets/{home-page-eGVeZnKR.js.map → home-page-BSz1wGk0.js.map} +1 -1
  53. package/dist/standalone/assets/{icon-registry-BroqBCns.js → icon-registry-BQU4fIc4.js} +2 -2
  54. package/dist/standalone/assets/icon-registry-BQU4fIc4.js.br +0 -0
  55. package/dist/standalone/assets/{icon-registry-BroqBCns.js.gz → icon-registry-BQU4fIc4.js.gz} +0 -0
  56. package/dist/standalone/assets/{icon-registry-BroqBCns.js.map → icon-registry-BQU4fIc4.js.map} +1 -1
  57. package/dist/standalone/assets/{index-C3MuojaM.js → index-BL8keDxQ.js} +3 -3
  58. package/dist/standalone/assets/index-BL8keDxQ.js.br +0 -0
  59. package/dist/standalone/assets/index-BL8keDxQ.js.gz +0 -0
  60. package/dist/standalone/assets/{index-C3MuojaM.js.map → index-BL8keDxQ.js.map} +1 -1
  61. package/dist/standalone/assets/{json-editor-BQLKoybQ.js → json-editor-CAIgxYb3.js} +2 -2
  62. package/dist/standalone/assets/json-editor-CAIgxYb3.js.br +0 -0
  63. package/dist/standalone/assets/json-editor-CAIgxYb3.js.gz +0 -0
  64. package/dist/standalone/assets/{json-editor-BQLKoybQ.js.map → json-editor-CAIgxYb3.js.map} +1 -1
  65. package/dist/standalone/assets/{property-renderer--LvNtRJE.js → property-renderer-B8Md-EqW.js} +4 -4
  66. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.br +0 -0
  67. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.gz +0 -0
  68. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.map +1 -0
  69. package/dist/standalone/assets/{reference-UuQ6Jts1.js → reference-WPaf6IdD.js} +2 -2
  70. package/dist/standalone/assets/reference-WPaf6IdD.js.br +0 -0
  71. package/dist/standalone/assets/reference-WPaf6IdD.js.gz +0 -0
  72. package/dist/standalone/assets/{reference-UuQ6Jts1.js.map → reference-WPaf6IdD.js.map} +1 -1
  73. package/dist/standalone/assets/{revisions-button-DHcQjj4r.js → revisions-button-0WtL6bsZ.js} +2 -2
  74. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.br +0 -0
  75. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.gz +0 -0
  76. package/dist/standalone/assets/{revisions-button-DHcQjj4r.js.map → revisions-button-0WtL6bsZ.js.map} +1 -1
  77. package/dist/standalone/assets/{select-B30EsRTA.js → select-CR4acjX0.js} +2 -2
  78. package/dist/standalone/assets/select-CR4acjX0.js.br +0 -0
  79. package/dist/standalone/assets/select-CR4acjX0.js.gz +0 -0
  80. package/dist/standalone/assets/{select-B30EsRTA.js.map → select-CR4acjX0.js.map} +1 -1
  81. package/dist/standalone/assets/{settings-page-3r5atVKG.js → settings-page-DtguXLAP.js} +2 -2
  82. package/dist/standalone/assets/settings-page-DtguXLAP.js.br +0 -0
  83. package/dist/standalone/assets/settings-page-DtguXLAP.js.gz +0 -0
  84. package/dist/standalone/assets/{settings-page-3r5atVKG.js.map → settings-page-DtguXLAP.js.map} +1 -1
  85. package/dist/standalone/assets/{show-page-CmRDBZRg.js → show-page-Dnox2NwO.js} +2 -2
  86. package/dist/standalone/assets/show-page-Dnox2NwO.js.br +0 -0
  87. package/dist/standalone/assets/show-page-Dnox2NwO.js.gz +0 -0
  88. package/dist/standalone/assets/{show-page-CmRDBZRg.js.map → show-page-Dnox2NwO.js.map} +1 -1
  89. package/dist/standalone/assets/{tabs-BXeUKAN4.js → tabs-DUS8e6dR.js} +2 -2
  90. package/dist/standalone/assets/tabs-DUS8e6dR.js.br +0 -0
  91. package/dist/standalone/assets/tabs-DUS8e6dR.js.gz +0 -0
  92. package/dist/standalone/assets/{tabs-BXeUKAN4.js.map → tabs-DUS8e6dR.js.map} +1 -1
  93. package/dist/standalone/assets/{value-format-BikdS7In.js → value-format-Cgau0meh.js} +2 -2
  94. package/dist/standalone/assets/value-format-Cgau0meh.js.br +0 -0
  95. package/dist/standalone/assets/value-format-Cgau0meh.js.gz +0 -0
  96. package/dist/standalone/assets/{value-format-BikdS7In.js.map → value-format-Cgau0meh.js.map} +1 -1
  97. package/dist/standalone/assets/{wizard-create-page-ChrGqxlO.js → wizard-create-page-v2-Aw8Oj.js} +2 -2
  98. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.br +0 -0
  99. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.gz +0 -0
  100. package/dist/standalone/assets/{wizard-create-page-ChrGqxlO.js.map → wizard-create-page-v2-Aw8Oj.js.map} +1 -1
  101. package/dist/standalone/assets/{zod-CF8JsamI.js → zod-BrelKLfy.js} +2 -2
  102. package/dist/standalone/assets/zod-BrelKLfy.js.br +0 -0
  103. package/dist/standalone/assets/zod-BrelKLfy.js.gz +0 -0
  104. package/dist/standalone/assets/{zod-CF8JsamI.js.map → zod-BrelKLfy.js.map} +1 -1
  105. package/dist/standalone/index.html +4 -4
  106. package/dist/standalone/index.html.br +0 -0
  107. package/dist/standalone/index.html.gz +0 -0
  108. package/package.json +4 -4
  109. package/dist/standalone/assets/action-component-host-CuzX-99S.js.br +0 -0
  110. package/dist/standalone/assets/action-component-host-CuzX-99S.js.gz +0 -0
  111. package/dist/standalone/assets/action-page-BUTCUZ7e.js.br +0 -0
  112. package/dist/standalone/assets/action-page-BUTCUZ7e.js.gz +0 -0
  113. package/dist/standalone/assets/ai-assistant-widget-B3Xy7bCi.js.br +0 -0
  114. package/dist/standalone/assets/ai-assistant-widget-B3Xy7bCi.js.gz +0 -0
  115. package/dist/standalone/assets/audit-log-page-GHzf7mLS.js.br +0 -0
  116. package/dist/standalone/assets/audit-log-page-GHzf7mLS.js.gz +0 -0
  117. package/dist/standalone/assets/calendar-DxUwrP2r.js.br +0 -0
  118. package/dist/standalone/assets/calendar-DxUwrP2r.js.gz +0 -0
  119. package/dist/standalone/assets/chart-widget-DnK78Joj.js.br +0 -0
  120. package/dist/standalone/assets/chart-widget-DnK78Joj.js.gz +0 -0
  121. package/dist/standalone/assets/command-Df4Effbo.js.br +0 -0
  122. package/dist/standalone/assets/command-Df4Effbo.js.gz +0 -0
  123. package/dist/standalone/assets/date-picker-BM6tYOT1.js +0 -2
  124. package/dist/standalone/assets/date-picker-BM6tYOT1.js.br +0 -0
  125. package/dist/standalone/assets/date-picker-BM6tYOT1.js.gz +0 -0
  126. package/dist/standalone/assets/date-picker-BM6tYOT1.js.map +0 -1
  127. package/dist/standalone/assets/edit-page-C_QYbzrq.js.br +0 -0
  128. package/dist/standalone/assets/edit-page-C_QYbzrq.js.gz +0 -0
  129. package/dist/standalone/assets/empty-BQFNUnfh.js.br +0 -0
  130. package/dist/standalone/assets/empty-BQFNUnfh.js.gz +0 -0
  131. package/dist/standalone/assets/global-search-dialog-DMgCfJpF.js.br +0 -0
  132. package/dist/standalone/assets/global-search-dialog-DMgCfJpF.js.gz +0 -0
  133. package/dist/standalone/assets/heavy-fields-Do2qd-Wi.js.br +0 -0
  134. package/dist/standalone/assets/heavy-fields-Do2qd-Wi.js.gz +0 -0
  135. package/dist/standalone/assets/home-page-eGVeZnKR.js.br +0 -0
  136. package/dist/standalone/assets/home-page-eGVeZnKR.js.gz +0 -0
  137. package/dist/standalone/assets/icon-registry-BroqBCns.js.br +0 -0
  138. package/dist/standalone/assets/index-C3MuojaM.js.br +0 -0
  139. package/dist/standalone/assets/index-C3MuojaM.js.gz +0 -0
  140. package/dist/standalone/assets/json-editor-BQLKoybQ.js.br +0 -0
  141. package/dist/standalone/assets/json-editor-BQLKoybQ.js.gz +0 -0
  142. package/dist/standalone/assets/property-renderer--LvNtRJE.js.br +0 -0
  143. package/dist/standalone/assets/property-renderer--LvNtRJE.js.gz +0 -0
  144. package/dist/standalone/assets/property-renderer--LvNtRJE.js.map +0 -1
  145. package/dist/standalone/assets/reference-UuQ6Jts1.js.br +0 -0
  146. package/dist/standalone/assets/reference-UuQ6Jts1.js.gz +0 -0
  147. package/dist/standalone/assets/revisions-button-DHcQjj4r.js.br +0 -0
  148. package/dist/standalone/assets/revisions-button-DHcQjj4r.js.gz +0 -0
  149. package/dist/standalone/assets/select-B30EsRTA.js.br +0 -0
  150. package/dist/standalone/assets/select-B30EsRTA.js.gz +0 -0
  151. package/dist/standalone/assets/settings-page-3r5atVKG.js.br +0 -0
  152. package/dist/standalone/assets/settings-page-3r5atVKG.js.gz +0 -0
  153. package/dist/standalone/assets/show-page-CmRDBZRg.js.br +0 -0
  154. package/dist/standalone/assets/show-page-CmRDBZRg.js.gz +0 -0
  155. package/dist/standalone/assets/tabs-BXeUKAN4.js.br +0 -0
  156. package/dist/standalone/assets/tabs-BXeUKAN4.js.gz +0 -0
  157. package/dist/standalone/assets/value-format-BikdS7In.js.br +0 -0
  158. package/dist/standalone/assets/value-format-BikdS7In.js.gz +0 -0
  159. package/dist/standalone/assets/wizard-create-page-ChrGqxlO.js.br +0 -0
  160. package/dist/standalone/assets/wizard-create-page-ChrGqxlO.js.gz +0 -0
  161. package/dist/standalone/assets/zod-CF8JsamI.js.br +0 -0
  162. package/dist/standalone/assets/zod-CF8JsamI.js.gz +0 -0
@@ -12,7 +12,7 @@
12
12
  smoke tests), the standalone entry falls back to same-origin defaults.
13
13
  -->
14
14
  <!--MODERN_ADMIN_CONFIG-->
15
- <script type="module" crossorigin src="./assets/index-C3MuojaM.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-BL8keDxQ.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/createLucideIcon-CUopU_LC.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/with-selector-NDLhu4dT.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/dist-BSbFjTlr.js">
@@ -21,9 +21,9 @@
21
21
  <link rel="modulepreload" crossorigin href="./assets/router-wFvtgo77.js">
22
22
  <link rel="modulepreload" crossorigin href="./assets/dist-BcL2U6dT.js">
23
23
  <link rel="stylesheet" crossorigin href="./assets/index-95cwJ2RY.css">
24
- <link rel="prefetch" as="script" href="./assets/home-page-eGVeZnKR.js">
25
- <link rel="prefetch" as="script" href="./assets/icon-registry-BroqBCns.js">
26
- <link rel="prefetch" as="script" href="./assets/property-renderer--LvNtRJE.js">
24
+ <link rel="prefetch" as="script" href="./assets/home-page-BSz1wGk0.js">
25
+ <link rel="prefetch" as="script" href="./assets/icon-registry-BQU4fIc4.js">
26
+ <link rel="prefetch" as="script" href="./assets/property-renderer-B8Md-EqW.js">
27
27
  </head>
28
28
  <body>
29
29
  <div id="root"></div>
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modern-admin/web",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Pre-built React admin SPA. Mount it into a host page or let @modern-admin/nest serve the standalone bundle.",
@@ -68,10 +68,10 @@
68
68
  "vite": "^8.0.10"
69
69
  },
70
70
  "dependencies": {
71
- "@modern-admin/core": "^0.3.5",
71
+ "@modern-admin/core": "^0.4.1",
72
72
  "@modern-admin/i18n": "^0.3.4",
73
- "@modern-admin/react": "^0.4.0",
74
- "@modern-admin/ui": "^0.4.0",
73
+ "@modern-admin/react": "^0.4.1",
74
+ "@modern-admin/ui": "^0.4.1",
75
75
  "@tanstack/react-query": "^5.100.9"
76
76
  },
77
77
  "devDependencies": {
@@ -1,2 +0,0 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n,s as r}from"./with-selector-NDLhu4dT.js";import{n as i}from"./refresh-cw-DHvUQTMb.js";import{s as a}from"./dist-Dpg8xy_r.js";import{a as o,i as s,n as c,s as l,t as u}from"./calendar-DxUwrP2r.js";import{a as d,i as f,n as p}from"./useQueries-BCUhWYX4.js";import{Y as m}from"./index-C3MuojaM.js";var h=e(t(),1),g=n(),_=`yyyy-MM-dd`,v=`yyyy-MM-dd'T'HH:mm`,y=`yyyy-MM-dd HH:mm`;function b(e){if(!e)return;let t=e.length<=10?s(e,_,new Date):c(e);return Number.isNaN(t.getTime())?void 0:t}function x(e,t){let n=e.trim();if(n===``)return;let r=t===`datetime`?[v,y,`yyyy-MM-dd'T'HH:mm:ss`,_]:[_];for(let e of r){let t=s(n,e,new Date);if(l(t))return t}let i=c(n);return l(i)?i:null}function S(e,t){return e?o(e,t===`datetime`?y:_):``}function C(e,t){return o(e,t===`datetime`?v:_)}function w({value:e,onChange:t,mode:n=`date`,disabled:s,placeholder:c,className:l,inputClassName:_,ariaLabel:v,openCalendarLabel:y=`Open calendar`,timeLabel:w=`Time`}){let[T,E]=h.useState(!1),D=b(e),[O,k]=h.useState(()=>S(D,n)),A=h.useRef(S(D,n));h.useEffect(()=>{let e=S(D,n);e!==A.current&&(A.current=e,k(e))},[e,n]);let j=D?o(D,`HH:mm`):`00:00`,M=e=>{if(!e){A.current=``,k(``),t(``);return}if(n===`datetime`){let[t,n]=j.split(`:`).map(Number);e.setHours(t??0,n??0,0,0)}let r=S(e,n);A.current=r,k(r),t(C(e,n))},N=e=>{if(!D)return;let[r,i]=e.split(`:`).map(Number),a=new Date(D);a.setHours(r??0,i??0,0,0);let o=S(a,n);A.current=o,k(o),t(C(a,n))},P=e=>{let r=e.target.value;k(r);let i=x(r,n);i===void 0?(A.current=``,t(``)):i&&(A.current=S(i,n),t(C(i,n)))},F=()=>{if(x(O,n)===null){let e=S(D,n);A.current=e,k(e)}},I=c??(n===`datetime`?`YYYY-MM-DD HH:MM`:`YYYY-MM-DD`);return(0,g.jsxs)(p,{open:T,onOpenChange:E,children:[(0,g.jsxs)(`div`,{className:r(`relative w-full`,l),children:[(0,g.jsx)(m,{type:`text`,inputMode:`numeric`,value:O,onChange:P,onBlur:F,placeholder:I,disabled:s,"aria-label":v,className:r(_,`pr-10`)}),(0,g.jsx)(d,{asChild:!0,children:(0,g.jsx)(a,{type:`button`,variant:`ghost`,size:`icon`,disabled:s,"aria-label":y,className:`absolute right-1 top-1/2 size-8 -translate-y-1/2 text-muted-foreground hover:text-foreground`,children:(0,g.jsx)(i,{className:`size-4`})})})]}),(0,g.jsxs)(f,{className:`w-auto p-0`,align:`start`,children:[(0,g.jsx)(u,{mode:`single`,selected:D,defaultMonth:D,onSelect:e=>{M(e),n===`date`&&E(!1)},autoFocus:!0}),n===`datetime`&&(0,g.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border p-3`,children:[(0,g.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:w}),(0,g.jsx)(m,{type:`time`,value:j,disabled:!D,onChange:e=>N(e.target.value),className:`h-8 w-32`})]})]})]})}w.displayName=`DatePicker`;export{w as t};
2
- //# sourceMappingURL=date-picker-BM6tYOT1.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-picker-BM6tYOT1.js","names":[],"sources":["../../../../ui/src/components/date-picker.tsx"],"sourcesContent":["// Popover-driven date / datetime input. Single picker handles both modes:\n// pass `mode=\"datetime\"` to surface an HH:MM time input below the calendar.\n//\n// Value is an ISO-ish string (`yyyy-MM-dd` for dates, `yyyy-MM-ddTHH:mm` for\n// datetime — same shape <input type=\"date\">/<input type=\"datetime-local\">\n// produce, so callers can stay format-stable). The trigger is a real text\n// input so users can also type the date manually; clicks on the trailing\n// calendar icon open the popover with the inline picker.\n\nimport * as React from 'react'\nimport { format, isValid, parse, parseISO } from 'date-fns'\nimport { Calendar as CalendarIcon } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\nimport { Calendar } from './calendar.js'\nimport { Input } from './input.js'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover.js'\n\nexport type DatePickerMode = 'date' | 'datetime'\n\nexport interface DatePickerProps {\n value: string | null | undefined\n onChange(next: string): void\n mode?: DatePickerMode\n disabled?: boolean\n placeholder?: string\n /** Applied to the outer wrapper div (controls width, etc.). */\n className?: string\n /** Applied to the inner text Input — use to override height / font size. */\n inputClassName?: string\n /** ARIA label forwarded to the trigger input (mobile users / screen readers). */\n ariaLabel?: string\n /** ARIA label for the calendar icon button. Default: \"Open calendar\". */\n openCalendarLabel?: string\n /** Label for the time input shown in datetime mode. Default: \"Time\". */\n timeLabel?: string\n}\n\nconst DATE_FMT = 'yyyy-MM-dd'\nconst DATETIME_FMT = \"yyyy-MM-dd'T'HH:mm\"\n// Friendlier display format for the datetime input — space instead of `T`.\nconst DATETIME_DISPLAY_FMT = 'yyyy-MM-dd HH:mm'\n\nfunction parseValue(value: string | null | undefined): Date | undefined {\n if (!value) return undefined\n const direct = value.length <= 10 ? parse(value, DATE_FMT, new Date()) : parseISO(value)\n return Number.isNaN(direct.getTime()) ? undefined : direct\n}\n\n/**\n * Try to parse a manually-typed string in any of the supported shapes.\n * Returns `undefined` on blank, `null` on invalid (non-blank) input so the\n * caller can distinguish \"cleared\" from \"typo\".\n */\nfunction parseTyped(raw: string, mode: DatePickerMode): Date | undefined | null {\n const trimmed = raw.trim()\n if (trimmed === '') return undefined\n const candidates =\n mode === 'datetime'\n ? [DATETIME_FMT, DATETIME_DISPLAY_FMT, \"yyyy-MM-dd'T'HH:mm:ss\", DATE_FMT]\n : [DATE_FMT]\n for (const fmt of candidates) {\n const parsed = parse(trimmed, fmt, new Date())\n if (isValid(parsed)) return parsed\n }\n // Last resort: ISO with timezone, etc.\n const iso = parseISO(trimmed)\n return isValid(iso) ? iso : null\n}\n\nfunction formatForInput(date: Date | undefined, mode: DatePickerMode): string {\n if (!date) return ''\n return format(date, mode === 'datetime' ? DATETIME_DISPLAY_FMT : DATE_FMT)\n}\n\nfunction formatForApi(date: Date, mode: DatePickerMode): string {\n return format(date, mode === 'datetime' ? DATETIME_FMT : DATE_FMT)\n}\n\nexport function DatePicker({\n value,\n onChange,\n mode = 'date',\n disabled,\n placeholder,\n className,\n inputClassName,\n ariaLabel,\n openCalendarLabel = 'Open calendar',\n timeLabel = 'Time',\n}: DatePickerProps): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const date = parseValue(value)\n // Local draft for the text input — keeps user typing intact even when\n // intermediate strings don't yet parse.\n const [draft, setDraft] = React.useState(() => formatForInput(date, mode))\n // Re-sync draft whenever the canonical value changes from outside (e.g.\n // calendar selection or form reset). Compare via formatted shape so a noop\n // update doesn't clobber what the user is typing.\n const lastFormatted = React.useRef(formatForInput(date, mode))\n React.useEffect(() => {\n const next = formatForInput(date, mode)\n if (next !== lastFormatted.current) {\n lastFormatted.current = next\n setDraft(next)\n }\n }, [value, mode]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const time = date ? format(date, 'HH:mm') : '00:00'\n\n const commitDate = (next: Date | undefined): void => {\n if (!next) {\n lastFormatted.current = ''\n setDraft('')\n onChange('')\n return\n }\n if (mode === 'datetime') {\n const [h, m] = time.split(':').map(Number)\n next.setHours(h ?? 0, m ?? 0, 0, 0)\n }\n const formatted = formatForInput(next, mode)\n lastFormatted.current = formatted\n setDraft(formatted)\n onChange(formatForApi(next, mode))\n }\n\n const setTime = (raw: string): void => {\n if (!date) return\n const [h, m] = raw.split(':').map(Number)\n const next = new Date(date)\n next.setHours(h ?? 0, m ?? 0, 0, 0)\n const formatted = formatForInput(next, mode)\n lastFormatted.current = formatted\n setDraft(formatted)\n onChange(formatForApi(next, mode))\n }\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const text = e.target.value\n setDraft(text)\n const parsed = parseTyped(text, mode)\n if (parsed === undefined) {\n // cleared\n lastFormatted.current = ''\n onChange('')\n } else if (parsed) {\n lastFormatted.current = formatForInput(parsed, mode)\n onChange(formatForApi(parsed, mode))\n }\n // parsed === null → keep draft, don't fire onChange yet\n }\n\n const handleInputBlur: React.FocusEventHandler<HTMLInputElement> = () => {\n // On blur, if the draft is invalid, snap back to the canonical value.\n const parsed = parseTyped(draft, mode)\n if (parsed === null) {\n const restored = formatForInput(date, mode)\n lastFormatted.current = restored\n setDraft(restored)\n }\n }\n\n const inputPlaceholder =\n placeholder ?? (mode === 'datetime' ? 'YYYY-MM-DD HH:MM' : 'YYYY-MM-DD')\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <div className={cn('relative w-full', className)}>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n value={draft}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={inputPlaceholder}\n disabled={disabled}\n aria-label={ariaLabel}\n className={cn(inputClassName, 'pr-10')}\n />\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n aria-label={openCalendarLabel}\n className=\"absolute right-1 top-1/2 size-8 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon className=\"size-4\" />\n </Button>\n </PopoverTrigger>\n </div>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={date}\n defaultMonth={date}\n onSelect={(d) => {\n commitDate(d)\n if (mode === 'date') setOpen(false)\n }}\n autoFocus\n />\n {mode === 'datetime' && (\n <div className=\"flex items-center gap-2 border-t border-border p-3\">\n <span className=\"text-xs text-muted-foreground\">{timeLabel}</span>\n <Input\n type=\"time\"\n value={time}\n disabled={!date}\n onChange={(e) => setTime(e.target.value)}\n className=\"h-8 w-32\"\n />\n </div>\n )}\n </PopoverContent>\n </Popover>\n )\n}\nDatePicker.displayName = 'DatePicker'\n"],"mappings":"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"}