@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
@@ -1,2 +1,2 @@
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{t as i}from"./chevrons-up-down-BHCs46XQ.js";import{n as a}from"./pencil-BO-k3yTG.js";import{t as o}from"./x-C3kLunD6.js";import{s}from"./dist-Dpg8xy_r.js";import{K as c,Y as l,et as u,n as d,ot as f,rt as p}from"./router-wFvtgo77.js";import{a as m,i as h,n as g,t as _}from"./useQueries-BCUhWYX4.js";import{t as v}from"./badge-6nyM5Jft.js";import{a as y,i as b,o as x,r as S,s as C,t as w}from"./command-Df4Effbo.js";import{yt as T}from"./index-C3MuojaM.js";var E=e(t(),1),D=n();function O({resourceId:e,recordId:t,fallback:n,showIcon:i=!1,className:o,populated:s}){let l=p(),u=t==null?``:String(t),m=!!(u&&s&&s.title),h=c(e),g=h===void 0||h.actions.some(e=>e.name===`show`),{data:_}=f({queryKey:[`modern-admin`,e,`show`,u],queryFn:()=>l.show(e,u),enabled:!!u&&!m&&g,staleTime:3e4});if(!u)return n??null;let y=(m?s.title:_?.record?.title)||`#${u}`;return g?(0,D.jsxs)(d,{to:{name:`show`,resourceId:e,recordId:u},className:r(`inline-flex items-center gap-1 hover:underline`,o),onClick:e=>e.stopPropagation(),children:[(0,D.jsx)(v,{variant:`secondary`,children:y}),i&&(0,D.jsx)(a,{className:`size-3 opacity-50`})]}):(0,D.jsx)(`span`,{className:r(`inline-flex items-center`,o),children:(0,D.jsx)(v,{variant:`secondary`,children:y})})}function k({referenceResourceId:e,value:t,onChange:n,disabled:a,placeholder:o,className:c}){let[d,_]=E.useState(!1),[v,O]=E.useState(``),k=M(v,250),A=p(),{t:j}=u(),N=o??j(`common:select`),P=f({queryKey:[`modern-admin`,e,`show`,t],queryFn:()=>A.show(e,String(t)),enabled:t!=null&&t!==``,staleTime:3e4}),F=l(e,k,d),I=F.data?.records??[],L=P.data?.record?.title,R=L?`${L} <${t}>`:t!=null&&t!==``?`#${t}`:``;return(0,D.jsxs)(g,{open:d,onOpenChange:_,children:[(0,D.jsx)(m,{asChild:!0,children:(0,D.jsxs)(s,{variant:`outline`,role:`combobox`,"aria-expanded":d,disabled:a,className:r(`w-full justify-between font-normal`,c),children:[(0,D.jsx)(`span`,{className:r(`truncate`,!R&&`text-muted-foreground`),title:R||void 0,children:R||N}),(0,D.jsx)(i,{className:`size-4 shrink-0 opacity-50`})]})}),(0,D.jsx)(h,{className:`w-[var(--radix-popover-trigger-width)] p-0`,align:`start`,children:(0,D.jsxs)(w,{shouldFilter:!1,children:[(0,D.jsx)(y,{placeholder:j(`common:searchPlaceholder`),value:v,onValueChange:O}),(0,D.jsxs)(C,{children:[F.isLoading&&(0,D.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:j(`common:loading`)}),!F.isLoading&&I.length===0&&(0,D.jsx)(S,{children:j(`common:noRecords`)}),t!=null&&t!==``&&(0,D.jsx)(b,{children:(0,D.jsxs)(x,{onSelect:()=>{n(null),_(!1)},children:[(0,D.jsx)(T,{className:`size-4 opacity-0`}),(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:j(`common:clearSelection`)})]})}),(0,D.jsx)(b,{children:I.map(e=>{let i=String(e.id)===String(t??``);return(0,D.jsxs)(x,{value:e.id,onSelect:()=>{n(e.id),_(!1)},children:[(0,D.jsx)(T,{className:r(`size-4`,i?`opacity-100`:`opacity-0`)}),(0,D.jsx)(`span`,{className:`truncate`,title:e.title?`${e.title} <${e.id}>`:`#${e.id}`,children:e.title?`${e.title} <${e.id}>`:`#${e.id}`})]},e.id)})})]})]})})]})}function A({resourceId:e,recordIds:t,className:n,populated:i,populatedKeyPrefix:a}){return!t||t.length===0?(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:`—`}):(0,D.jsx)(`div`,{className:r(`flex flex-wrap gap-1`,n),children:t.map(t=>(0,D.jsx)(O,{resourceId:e,recordId:t,populated:i&&a?i[`${a}.${t}`]:void 0},String(t)))})}function j({referenceResourceId:e,value:t,onChange:n,disabled:a,placeholder:c}){let[d,f]=E.useState(!1),[O,k]=E.useState(``),A=M(O,250),j=p(),{t:N}=u(),P=c??N(`common:select`),F=E.useMemo(()=>(t??[]).map(String),[t]),I=_({queries:F.map(t=>({queryKey:[`modern-admin`,e,`show`,t],queryFn:()=>j.show(e,t),staleTime:3e4}))}),L=E.useMemo(()=>F.map((e,t)=>{let n=I[t]?.data?.record?.title;return{id:e,title:n?`${n} <${e}>`:`#${e}`}}),[F,I]),R=l(e,A,d),z=R.data?.records??[],B=e=>{let t=String(e);n(F.includes(t)?F.filter(e=>e!==t):[...F,t])},V=e=>{n(F.filter(t=>t!==e))};return(0,D.jsxs)(`div`,{className:`space-y-2`,children:[L.length>0&&(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:L.map(e=>(0,D.jsxs)(v,{variant:`secondary`,className:`gap-1 pr-1`,children:[e.title,(0,D.jsx)(`button`,{type:`button`,"aria-label":N(`common:removeItem`,{title:e.title}),disabled:a,onClick:()=>V(e.id),className:`rounded-sm opacity-60 hover:opacity-100`,children:(0,D.jsx)(o,{className:`size-3`})})]},e.id))}),(0,D.jsxs)(g,{open:d,onOpenChange:f,children:[(0,D.jsx)(m,{asChild:!0,children:(0,D.jsxs)(s,{variant:`outline`,role:`combobox`,"aria-expanded":d,disabled:a,className:`w-full justify-between font-normal`,children:[(0,D.jsx)(`span`,{className:`truncate text-muted-foreground`,children:F.length>0?N(`common:nSelectedAddMore`,{count:F.length}):P}),(0,D.jsx)(i,{className:`size-4 shrink-0 opacity-50`})]})}),(0,D.jsx)(h,{className:`w-[var(--radix-popover-trigger-width)] p-0`,align:`start`,children:(0,D.jsxs)(w,{shouldFilter:!1,children:[(0,D.jsx)(y,{placeholder:N(`common:searchPlaceholder`),value:O,onValueChange:k}),(0,D.jsxs)(C,{children:[R.isLoading&&(0,D.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:N(`common:loading`)}),!R.isLoading&&z.length===0&&(0,D.jsx)(S,{children:N(`common:noRecords`)}),(0,D.jsx)(b,{children:z.map(e=>{let t=F.includes(String(e.id));return(0,D.jsxs)(x,{value:String(e.id),onSelect:()=>B(e.id),children:[(0,D.jsx)(T,{className:r(`size-4`,t?`opacity-100`:`opacity-0`)}),(0,D.jsx)(`span`,{className:`truncate`,title:e.title?`${e.title} <${e.id}>`:`#${e.id}`,children:e.title?`${e.title} <${e.id}>`:`#${e.id}`})]},e.id)})})]})]})})]})]})}var M=(e,t)=>{let[n,r]=E.useState(e);return E.useEffect(()=>{let n=setTimeout(()=>r(e),t);return()=>clearTimeout(n)},[e,t]),n};export{j as i,O as n,A as r,k as t};
2
- //# sourceMappingURL=reference-UuQ6Jts1.js.map
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{t as i}from"./chevrons-up-down-BHCs46XQ.js";import{n as a}from"./pencil-BO-k3yTG.js";import{t as o}from"./x-C3kLunD6.js";import{s}from"./dist-Dpg8xy_r.js";import{K as c,Y as l,et as u,n as d,ot as f,rt as p}from"./router-wFvtgo77.js";import{a as m,i as h,n as g,t as _}from"./useQueries-BCUhWYX4.js";import{t as v}from"./badge-6nyM5Jft.js";import{a as y,i as b,o as x,r as S,s as C,t as w}from"./command-Sb0xL-se.js";import{yt as T}from"./index-BL8keDxQ.js";var E=e(t(),1),D=n();function O({resourceId:e,recordId:t,fallback:n,showIcon:i=!1,className:o,populated:s}){let l=p(),u=t==null?``:String(t),m=!!(u&&s&&s.title),h=c(e),g=h===void 0||h.actions.some(e=>e.name===`show`),{data:_}=f({queryKey:[`modern-admin`,e,`show`,u],queryFn:()=>l.show(e,u),enabled:!!u&&!m&&g,staleTime:3e4});if(!u)return n??null;let y=(m?s.title:_?.record?.title)||`#${u}`;return g?(0,D.jsxs)(d,{to:{name:`show`,resourceId:e,recordId:u},className:r(`inline-flex items-center gap-1 hover:underline`,o),onClick:e=>e.stopPropagation(),children:[(0,D.jsx)(v,{variant:`secondary`,children:y}),i&&(0,D.jsx)(a,{className:`size-3 opacity-50`})]}):(0,D.jsx)(`span`,{className:r(`inline-flex items-center`,o),children:(0,D.jsx)(v,{variant:`secondary`,children:y})})}function k({referenceResourceId:e,value:t,onChange:n,disabled:a,placeholder:o,className:c}){let[d,_]=E.useState(!1),[v,O]=E.useState(``),k=M(v,250),A=p(),{t:j}=u(),N=o??j(`common:select`),P=f({queryKey:[`modern-admin`,e,`show`,t],queryFn:()=>A.show(e,String(t)),enabled:t!=null&&t!==``,staleTime:3e4}),F=l(e,k,d),I=F.data?.records??[],L=P.data?.record?.title,R=L?`${L} <${t}>`:t!=null&&t!==``?`#${t}`:``;return(0,D.jsxs)(g,{open:d,onOpenChange:_,children:[(0,D.jsx)(m,{asChild:!0,children:(0,D.jsxs)(s,{variant:`outline`,role:`combobox`,"aria-expanded":d,disabled:a,className:r(`w-full justify-between font-normal`,c),children:[(0,D.jsx)(`span`,{className:r(`truncate`,!R&&`text-muted-foreground`),title:R||void 0,children:R||N}),(0,D.jsx)(i,{className:`size-4 shrink-0 opacity-50`})]})}),(0,D.jsx)(h,{className:`w-[var(--radix-popover-trigger-width)] p-0`,align:`start`,children:(0,D.jsxs)(w,{shouldFilter:!1,children:[(0,D.jsx)(y,{placeholder:j(`common:searchPlaceholder`),value:v,onValueChange:O}),(0,D.jsxs)(C,{children:[F.isLoading&&(0,D.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:j(`common:loading`)}),!F.isLoading&&I.length===0&&(0,D.jsx)(S,{children:j(`common:noRecords`)}),t!=null&&t!==``&&(0,D.jsx)(b,{children:(0,D.jsxs)(x,{onSelect:()=>{n(null),_(!1)},children:[(0,D.jsx)(T,{className:`size-4 opacity-0`}),(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:j(`common:clearSelection`)})]})}),(0,D.jsx)(b,{children:I.map(e=>{let i=String(e.id)===String(t??``);return(0,D.jsxs)(x,{value:e.id,onSelect:()=>{n(e.id),_(!1)},children:[(0,D.jsx)(T,{className:r(`size-4`,i?`opacity-100`:`opacity-0`)}),(0,D.jsx)(`span`,{className:`truncate`,title:e.title?`${e.title} <${e.id}>`:`#${e.id}`,children:e.title?`${e.title} <${e.id}>`:`#${e.id}`})]},e.id)})})]})]})})]})}function A({resourceId:e,recordIds:t,className:n,populated:i,populatedKeyPrefix:a}){return!t||t.length===0?(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:`—`}):(0,D.jsx)(`div`,{className:r(`flex flex-wrap gap-1`,n),children:t.map(t=>(0,D.jsx)(O,{resourceId:e,recordId:t,populated:i&&a?i[`${a}.${t}`]:void 0},String(t)))})}function j({referenceResourceId:e,value:t,onChange:n,disabled:a,placeholder:c}){let[d,f]=E.useState(!1),[O,k]=E.useState(``),A=M(O,250),j=p(),{t:N}=u(),P=c??N(`common:select`),F=E.useMemo(()=>(t??[]).map(String),[t]),I=_({queries:F.map(t=>({queryKey:[`modern-admin`,e,`show`,t],queryFn:()=>j.show(e,t),staleTime:3e4}))}),L=E.useMemo(()=>F.map((e,t)=>{let n=I[t]?.data?.record?.title;return{id:e,title:n?`${n} <${e}>`:`#${e}`}}),[F,I]),R=l(e,A,d),z=R.data?.records??[],B=e=>{let t=String(e);n(F.includes(t)?F.filter(e=>e!==t):[...F,t])},V=e=>{n(F.filter(t=>t!==e))};return(0,D.jsxs)(`div`,{className:`space-y-2`,children:[L.length>0&&(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:L.map(e=>(0,D.jsxs)(v,{variant:`secondary`,className:`gap-1 pr-1`,children:[e.title,(0,D.jsx)(`button`,{type:`button`,"aria-label":N(`common:removeItem`,{title:e.title}),disabled:a,onClick:()=>V(e.id),className:`rounded-sm opacity-60 hover:opacity-100`,children:(0,D.jsx)(o,{className:`size-3`})})]},e.id))}),(0,D.jsxs)(g,{open:d,onOpenChange:f,children:[(0,D.jsx)(m,{asChild:!0,children:(0,D.jsxs)(s,{variant:`outline`,role:`combobox`,"aria-expanded":d,disabled:a,className:`w-full justify-between font-normal`,children:[(0,D.jsx)(`span`,{className:`truncate text-muted-foreground`,children:F.length>0?N(`common:nSelectedAddMore`,{count:F.length}):P}),(0,D.jsx)(i,{className:`size-4 shrink-0 opacity-50`})]})}),(0,D.jsx)(h,{className:`w-[var(--radix-popover-trigger-width)] p-0`,align:`start`,children:(0,D.jsxs)(w,{shouldFilter:!1,children:[(0,D.jsx)(y,{placeholder:N(`common:searchPlaceholder`),value:O,onValueChange:k}),(0,D.jsxs)(C,{children:[R.isLoading&&(0,D.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:N(`common:loading`)}),!R.isLoading&&z.length===0&&(0,D.jsx)(S,{children:N(`common:noRecords`)}),(0,D.jsx)(b,{children:z.map(e=>{let t=F.includes(String(e.id));return(0,D.jsxs)(x,{value:String(e.id),onSelect:()=>B(e.id),children:[(0,D.jsx)(T,{className:r(`size-4`,t?`opacity-100`:`opacity-0`)}),(0,D.jsx)(`span`,{className:`truncate`,title:e.title?`${e.title} <${e.id}>`:`#${e.id}`,children:e.title?`${e.title} <${e.id}>`:`#${e.id}`})]},e.id)})})]})]})})]})]})}var M=(e,t)=>{let[n,r]=E.useState(e);return E.useEffect(()=>{let n=setTimeout(()=>r(e),t);return()=>clearTimeout(n)},[e,t]),n};export{j as i,O as n,A as r,k as t};
2
+ //# sourceMappingURL=reference-WPaf6IdD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reference-UuQ6Jts1.js","names":[],"sources":["../../../../react/src/reference.tsx"],"sourcesContent":["// Reference-field helpers. Three surfaces:\n// - <ReferenceLink>: read-only display (list/show views) — fetches the\n// referenced record's title and renders it as a hyperlink to its show page.\n// - <ReferenceCombobox>: single-value edit control — Command-driven popover\n// with live search against the referenced resource's `search` action.\n// - <ReferenceMultiCombobox>: multi-value variant for many-to-many fields\n// (an array of foreign IDs); selected items render as removable chips.\n\nimport * as React from 'react'\nimport {\n Badge,\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@modern-admin/ui'\nimport { Check, ChevronsUpDown, ExternalLink, X } from 'lucide-react'\nimport { useQueries, useQuery } from '@tanstack/react-query'\nimport { useAdminClient } from './provider.js'\nimport { useResource, useSearchRecords } from './hooks.js'\nimport { useI18n } from './i18n.js'\nimport { Link } from './router.js'\n\n/** Read-only badge that links to the referenced record's show page.\n *\n * When `populated` is provided (e.g. supplied by the list/show endpoint via\n * `record.populated[propertyPath]`) the title is rendered directly from it\n * and no `show` request is fired — this is what prevents the N+1 fetch\n * storm on list pages with reference columns. */\nexport function ReferenceLink({\n resourceId,\n recordId,\n fallback,\n showIcon = false,\n className,\n populated,\n}: {\n resourceId: string\n recordId: string | number | null | undefined\n fallback?: React.ReactNode\n showIcon?: boolean\n className?: string\n populated?: { id?: string; title?: string } | null\n}): React.ReactElement | null {\n const client = useAdminClient()\n const id = recordId == null ? '' : String(recordId)\n const hasPopulated = !!(id && populated && populated.title)\n const referencedResource = useResource(resourceId)\n // When the SPA config has been loaded, its `actions` list is already\n // filtered against the current admin's access. Missing `show` = no\n // permission to view the referenced record → render plain text instead\n // of a clickable link. While the config is still loading (`undefined`)\n // we default to \"linkable\" so the first paint matches the steady state\n // for the common case.\n const canShow =\n referencedResource === undefined\n ? true\n : referencedResource.actions.some((a) => a.name === 'show')\n const { data } = useQuery({\n queryKey: ['modern-admin', resourceId, 'show', id],\n queryFn: () => client.show(resourceId, id),\n enabled: !!id && !hasPopulated && canShow,\n staleTime: 30_000,\n })\n if (!id) return (fallback as React.ReactElement | null) ?? null\n const title = (hasPopulated ? populated!.title : data?.record?.title) || `#${id}`\n if (!canShow) {\n return (\n <span className={cn('inline-flex items-center', className)}>\n <Badge variant=\"secondary\">{title}</Badge>\n </span>\n )\n }\n return (\n <Link\n to={{ name: 'show', resourceId, recordId: id }}\n className={cn('inline-flex items-center gap-1 hover:underline', className)}\n onClick={(e) => e.stopPropagation()}\n >\n <Badge variant=\"secondary\">{title}</Badge>\n {showIcon && <ExternalLink className=\"size-3 opacity-50\" />}\n </Link>\n )\n}\n\n/** Combobox bound to a referenced resource's `search` action. */\nexport function ReferenceCombobox({\n referenceResourceId,\n value,\n onChange,\n disabled,\n placeholder,\n className,\n}: {\n referenceResourceId: string\n value: string | number | null | undefined\n onChange(next: string | null): void\n disabled?: boolean\n placeholder?: string\n /** Extra classes applied to the trigger button (e.g. height override). */\n className?: string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const debounced = useDebounced(query, 250)\n const client = useAdminClient()\n const { t } = useI18n()\n const resolvedPlaceholder = placeholder ?? t('common:select')\n\n // The currently-selected record (loaded once for the trigger label).\n const selected = useQuery({\n queryKey: ['modern-admin', referenceResourceId, 'show', value],\n queryFn: () => client.show(referenceResourceId, String(value)),\n enabled: value != null && value !== '',\n staleTime: 30_000,\n })\n\n const search = useSearchRecords(referenceResourceId, debounced, open)\n const items = search.data?.records ?? []\n\n const _title = selected.data?.record?.title\n const selectedLabel =\n _title\n ? `${_title} <${value}>`\n : value != null && value !== ''\n ? `#${value}`\n : ''\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn('w-full justify-between font-normal', className)}\n >\n <span\n className={cn('truncate', !selectedLabel && 'text-muted-foreground')}\n title={selectedLabel || undefined}\n >\n {selectedLabel || resolvedPlaceholder}\n </span>\n <ChevronsUpDown className=\"size-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={t('common:searchPlaceholder')}\n value={query}\n onValueChange={setQuery}\n />\n <CommandList>\n {search.isLoading && <div className=\"p-3 text-sm text-muted-foreground\">{t('common:loading')}</div>}\n {!search.isLoading && items.length === 0 && (\n <CommandEmpty>{t('common:noRecords')}</CommandEmpty>\n )}\n {value != null && value !== '' && (\n <CommandGroup>\n <CommandItem\n onSelect={() => {\n onChange(null)\n setOpen(false)\n }}\n >\n <Check className=\"size-4 opacity-0\" />\n <span className=\"text-muted-foreground\">{t('common:clearSelection')}</span>\n </CommandItem>\n </CommandGroup>\n )}\n <CommandGroup>\n {items.map((r) => {\n const isSelected = String(r.id) === String(value ?? '')\n return (\n <CommandItem\n key={r.id}\n value={r.id}\n onSelect={() => {\n onChange(r.id)\n setOpen(false)\n }}\n >\n <Check className={cn('size-4', isSelected ? 'opacity-100' : 'opacity-0')} />\n <span className=\"truncate\" title={r.title ? `${r.title} <${r.id}>` : `#${r.id}`}>\n {r.title ? `${r.title} <${r.id}>` : `#${r.id}`}\n </span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n\n/** Renders a list of comma-separated badge links, one per foreign key.\n *\n * When `populated` + `populatedKeyPrefix` are provided, each item is looked up\n * via `populated[`${prefix}.${id}`]` and threaded into its `<ReferenceLink>`\n * to suppress per-row `show` requests. The key shape matches what the m2m\n * feature's read-hook writes (see `packages/feature-m2m`) and what the list\n * action's `populateReferences` helper writes for array references. */\nexport function ReferenceLinkList({\n resourceId,\n recordIds,\n className,\n populated,\n populatedKeyPrefix,\n}: {\n resourceId: string\n recordIds: ReadonlyArray<string | number>\n className?: string\n populated?: Record<string, unknown>\n populatedKeyPrefix?: string\n}): React.ReactElement {\n if (!recordIds || recordIds.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>\n }\n return (\n <div className={cn('flex flex-wrap gap-1', className)}>\n {recordIds.map((id) => {\n const entry =\n populated && populatedKeyPrefix\n ? (populated[`${populatedKeyPrefix}.${id}`] as\n | { id?: string; title?: string }\n | undefined)\n : undefined\n return (\n <ReferenceLink\n key={String(id)}\n resourceId={resourceId}\n recordId={id}\n populated={entry}\n />\n )\n })}\n </div>\n )\n}\n\n/** Multi-select combobox for many-to-many references. Renders selected items\n * as removable chips and feeds search results into a checkable command list. */\nexport function ReferenceMultiCombobox({\n referenceResourceId,\n value,\n onChange,\n disabled,\n placeholder,\n}: {\n referenceResourceId: string\n value: ReadonlyArray<string | number> | null | undefined\n onChange(next: Array<string | number>): void\n disabled?: boolean\n placeholder?: string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const debounced = useDebounced(query, 250)\n const client = useAdminClient()\n const { t } = useI18n()\n const resolvedPlaceholder = placeholder ?? t('common:select')\n const ids = React.useMemo(() => (value ?? []).map(String), [value])\n\n // Resolve labels per-id so adding/removing one item only fetches the new\n // one. Sharing the cache key with <ReferenceLink>'s single-record query\n // means already-known titles render instantly without flicker.\n const titleQueries = useQueries({\n queries: ids.map((id) => ({\n queryKey: ['modern-admin', referenceResourceId, 'show', id],\n queryFn: () => client.show(referenceResourceId, id),\n staleTime: 30_000,\n })),\n })\n const chips = React.useMemo(\n () =>\n ids.map((id, i) => {\n const t = titleQueries[i]?.data?.record?.title\n return { id, title: t ? `${t} <${id}>` : `#${id}` }\n }),\n [ids, titleQueries],\n )\n\n const search = useSearchRecords(referenceResourceId, debounced, open)\n const items = search.data?.records ?? []\n\n const toggle = (id: string | number): void => {\n const sid = String(id)\n const next = ids.includes(sid) ? ids.filter((x) => x !== sid) : [...ids, sid]\n onChange(next)\n }\n\n const remove = (id: string): void => {\n onChange(ids.filter((x) => x !== id))\n }\n\n return (\n <div className=\"space-y-2\">\n {chips.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {chips.map((s) => (\n <Badge key={s.id} variant=\"secondary\" className=\"gap-1 pr-1\">\n {s.title}\n <button\n type=\"button\"\n aria-label={t('common:removeItem', { title: s.title })}\n disabled={disabled}\n onClick={() => remove(s.id)}\n className=\"rounded-sm opacity-60 hover:opacity-100\"\n >\n <X className=\"size-3\" />\n </button>\n </Badge>\n ))}\n </div>\n )}\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className=\"w-full justify-between font-normal\"\n >\n <span className=\"truncate text-muted-foreground\">\n {ids.length > 0 ? t('common:nSelectedAddMore', { count: ids.length }) : resolvedPlaceholder}\n </span>\n <ChevronsUpDown className=\"size-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <Command shouldFilter={false}>\n <CommandInput placeholder={t('common:searchPlaceholder')} value={query} onValueChange={setQuery} />\n <CommandList>\n {search.isLoading && (\n <div className=\"p-3 text-sm text-muted-foreground\">{t('common:loading')}</div>\n )}\n {!search.isLoading && items.length === 0 && (\n <CommandEmpty>{t('common:noRecords')}</CommandEmpty>\n )}\n <CommandGroup>\n {items.map((r) => {\n const isSelected = ids.includes(String(r.id))\n return (\n <CommandItem\n key={r.id}\n value={String(r.id)}\n onSelect={() => toggle(r.id)}\n >\n <Check\n className={cn('size-4', isSelected ? 'opacity-100' : 'opacity-0')}\n />\n <span className=\"truncate\" title={r.title ? `${r.title} <${r.id}>` : `#${r.id}`}>\n {r.title ? `${r.title} <${r.id}>` : `#${r.id}`}\n </span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n\nconst useDebounced = <T,>(value: T, ms: number): T => {\n const [v, setV] = React.useState(value)\n React.useEffect(() => {\n const id = setTimeout(() => setV(value), ms)\n return () => clearTimeout(id)\n }, [value, ms])\n return v\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reference-WPaf6IdD.js","names":[],"sources":["../../../../react/src/reference.tsx"],"sourcesContent":["// Reference-field helpers. Three surfaces:\n// - <ReferenceLink>: read-only display (list/show views) — fetches the\n// referenced record's title and renders it as a hyperlink to its show page.\n// - <ReferenceCombobox>: single-value edit control — Command-driven popover\n// with live search against the referenced resource's `search` action.\n// - <ReferenceMultiCombobox>: multi-value variant for many-to-many fields\n// (an array of foreign IDs); selected items render as removable chips.\n\nimport * as React from 'react'\nimport {\n Badge,\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@modern-admin/ui'\nimport { Check, ChevronsUpDown, ExternalLink, X } from 'lucide-react'\nimport { useQueries, useQuery } from '@tanstack/react-query'\nimport { useAdminClient } from './provider.js'\nimport { useResource, useSearchRecords } from './hooks.js'\nimport { useI18n } from './i18n.js'\nimport { Link } from './router.js'\n\n/** Read-only badge that links to the referenced record's show page.\n *\n * When `populated` is provided (e.g. supplied by the list/show endpoint via\n * `record.populated[propertyPath]`) the title is rendered directly from it\n * and no `show` request is fired — this is what prevents the N+1 fetch\n * storm on list pages with reference columns. */\nexport function ReferenceLink({\n resourceId,\n recordId,\n fallback,\n showIcon = false,\n className,\n populated,\n}: {\n resourceId: string\n recordId: string | number | null | undefined\n fallback?: React.ReactNode\n showIcon?: boolean\n className?: string\n populated?: { id?: string; title?: string } | null\n}): React.ReactElement | null {\n const client = useAdminClient()\n const id = recordId == null ? '' : String(recordId)\n const hasPopulated = !!(id && populated && populated.title)\n const referencedResource = useResource(resourceId)\n // When the SPA config has been loaded, its `actions` list is already\n // filtered against the current admin's access. Missing `show` = no\n // permission to view the referenced record → render plain text instead\n // of a clickable link. While the config is still loading (`undefined`)\n // we default to \"linkable\" so the first paint matches the steady state\n // for the common case.\n const canShow =\n referencedResource === undefined\n ? true\n : referencedResource.actions.some((a) => a.name === 'show')\n const { data } = useQuery({\n queryKey: ['modern-admin', resourceId, 'show', id],\n queryFn: () => client.show(resourceId, id),\n enabled: !!id && !hasPopulated && canShow,\n staleTime: 30_000,\n })\n if (!id) return (fallback as React.ReactElement | null) ?? null\n const title = (hasPopulated ? populated!.title : data?.record?.title) || `#${id}`\n if (!canShow) {\n return (\n <span className={cn('inline-flex items-center', className)}>\n <Badge variant=\"secondary\">{title}</Badge>\n </span>\n )\n }\n return (\n <Link\n to={{ name: 'show', resourceId, recordId: id }}\n className={cn('inline-flex items-center gap-1 hover:underline', className)}\n onClick={(e) => e.stopPropagation()}\n >\n <Badge variant=\"secondary\">{title}</Badge>\n {showIcon && <ExternalLink className=\"size-3 opacity-50\" />}\n </Link>\n )\n}\n\n/** Combobox bound to a referenced resource's `search` action. */\nexport function ReferenceCombobox({\n referenceResourceId,\n value,\n onChange,\n disabled,\n placeholder,\n className,\n}: {\n referenceResourceId: string\n value: string | number | null | undefined\n onChange(next: string | null): void\n disabled?: boolean\n placeholder?: string\n /** Extra classes applied to the trigger button (e.g. height override). */\n className?: string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const debounced = useDebounced(query, 250)\n const client = useAdminClient()\n const { t } = useI18n()\n const resolvedPlaceholder = placeholder ?? t('common:select')\n\n // The currently-selected record (loaded once for the trigger label).\n const selected = useQuery({\n queryKey: ['modern-admin', referenceResourceId, 'show', value],\n queryFn: () => client.show(referenceResourceId, String(value)),\n enabled: value != null && value !== '',\n staleTime: 30_000,\n })\n\n const search = useSearchRecords(referenceResourceId, debounced, open)\n const items = search.data?.records ?? []\n\n const _title = selected.data?.record?.title\n const selectedLabel =\n _title\n ? `${_title} <${value}>`\n : value != null && value !== ''\n ? `#${value}`\n : ''\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn('w-full justify-between font-normal', className)}\n >\n <span\n className={cn('truncate', !selectedLabel && 'text-muted-foreground')}\n title={selectedLabel || undefined}\n >\n {selectedLabel || resolvedPlaceholder}\n </span>\n <ChevronsUpDown className=\"size-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={t('common:searchPlaceholder')}\n value={query}\n onValueChange={setQuery}\n />\n <CommandList>\n {search.isLoading && <div className=\"p-3 text-sm text-muted-foreground\">{t('common:loading')}</div>}\n {!search.isLoading && items.length === 0 && (\n <CommandEmpty>{t('common:noRecords')}</CommandEmpty>\n )}\n {value != null && value !== '' && (\n <CommandGroup>\n <CommandItem\n onSelect={() => {\n onChange(null)\n setOpen(false)\n }}\n >\n <Check className=\"size-4 opacity-0\" />\n <span className=\"text-muted-foreground\">{t('common:clearSelection')}</span>\n </CommandItem>\n </CommandGroup>\n )}\n <CommandGroup>\n {items.map((r) => {\n const isSelected = String(r.id) === String(value ?? '')\n return (\n <CommandItem\n key={r.id}\n value={r.id}\n onSelect={() => {\n onChange(r.id)\n setOpen(false)\n }}\n >\n <Check className={cn('size-4', isSelected ? 'opacity-100' : 'opacity-0')} />\n <span className=\"truncate\" title={r.title ? `${r.title} <${r.id}>` : `#${r.id}`}>\n {r.title ? `${r.title} <${r.id}>` : `#${r.id}`}\n </span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n\n/** Renders a list of comma-separated badge links, one per foreign key.\n *\n * When `populated` + `populatedKeyPrefix` are provided, each item is looked up\n * via `populated[`${prefix}.${id}`]` and threaded into its `<ReferenceLink>`\n * to suppress per-row `show` requests. The key shape matches what the m2m\n * feature's read-hook writes (see `packages/feature-m2m`) and what the list\n * action's `populateReferences` helper writes for array references. */\nexport function ReferenceLinkList({\n resourceId,\n recordIds,\n className,\n populated,\n populatedKeyPrefix,\n}: {\n resourceId: string\n recordIds: ReadonlyArray<string | number>\n className?: string\n populated?: Record<string, unknown>\n populatedKeyPrefix?: string\n}): React.ReactElement {\n if (!recordIds || recordIds.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>\n }\n return (\n <div className={cn('flex flex-wrap gap-1', className)}>\n {recordIds.map((id) => {\n const entry =\n populated && populatedKeyPrefix\n ? (populated[`${populatedKeyPrefix}.${id}`] as\n | { id?: string; title?: string }\n | undefined)\n : undefined\n return (\n <ReferenceLink\n key={String(id)}\n resourceId={resourceId}\n recordId={id}\n populated={entry}\n />\n )\n })}\n </div>\n )\n}\n\n/** Multi-select combobox for many-to-many references. Renders selected items\n * as removable chips and feeds search results into a checkable command list. */\nexport function ReferenceMultiCombobox({\n referenceResourceId,\n value,\n onChange,\n disabled,\n placeholder,\n}: {\n referenceResourceId: string\n value: ReadonlyArray<string | number> | null | undefined\n onChange(next: Array<string | number>): void\n disabled?: boolean\n placeholder?: string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const debounced = useDebounced(query, 250)\n const client = useAdminClient()\n const { t } = useI18n()\n const resolvedPlaceholder = placeholder ?? t('common:select')\n const ids = React.useMemo(() => (value ?? []).map(String), [value])\n\n // Resolve labels per-id so adding/removing one item only fetches the new\n // one. Sharing the cache key with <ReferenceLink>'s single-record query\n // means already-known titles render instantly without flicker.\n const titleQueries = useQueries({\n queries: ids.map((id) => ({\n queryKey: ['modern-admin', referenceResourceId, 'show', id],\n queryFn: () => client.show(referenceResourceId, id),\n staleTime: 30_000,\n })),\n })\n const chips = React.useMemo(\n () =>\n ids.map((id, i) => {\n const t = titleQueries[i]?.data?.record?.title\n return { id, title: t ? `${t} <${id}>` : `#${id}` }\n }),\n [ids, titleQueries],\n )\n\n const search = useSearchRecords(referenceResourceId, debounced, open)\n const items = search.data?.records ?? []\n\n const toggle = (id: string | number): void => {\n const sid = String(id)\n const next = ids.includes(sid) ? ids.filter((x) => x !== sid) : [...ids, sid]\n onChange(next)\n }\n\n const remove = (id: string): void => {\n onChange(ids.filter((x) => x !== id))\n }\n\n return (\n <div className=\"space-y-2\">\n {chips.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {chips.map((s) => (\n <Badge key={s.id} variant=\"secondary\" className=\"gap-1 pr-1\">\n {s.title}\n <button\n type=\"button\"\n aria-label={t('common:removeItem', { title: s.title })}\n disabled={disabled}\n onClick={() => remove(s.id)}\n className=\"rounded-sm opacity-60 hover:opacity-100\"\n >\n <X className=\"size-3\" />\n </button>\n </Badge>\n ))}\n </div>\n )}\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className=\"w-full justify-between font-normal\"\n >\n <span className=\"truncate text-muted-foreground\">\n {ids.length > 0 ? t('common:nSelectedAddMore', { count: ids.length }) : resolvedPlaceholder}\n </span>\n <ChevronsUpDown className=\"size-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <Command shouldFilter={false}>\n <CommandInput placeholder={t('common:searchPlaceholder')} value={query} onValueChange={setQuery} />\n <CommandList>\n {search.isLoading && (\n <div className=\"p-3 text-sm text-muted-foreground\">{t('common:loading')}</div>\n )}\n {!search.isLoading && items.length === 0 && (\n <CommandEmpty>{t('common:noRecords')}</CommandEmpty>\n )}\n <CommandGroup>\n {items.map((r) => {\n const isSelected = ids.includes(String(r.id))\n return (\n <CommandItem\n key={r.id}\n value={String(r.id)}\n onSelect={() => toggle(r.id)}\n >\n <Check\n className={cn('size-4', isSelected ? 'opacity-100' : 'opacity-0')}\n />\n <span className=\"truncate\" title={r.title ? `${r.title} <${r.id}>` : `#${r.id}`}>\n {r.title ? `${r.title} <${r.id}>` : `#${r.id}`}\n </span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n\nconst useDebounced = <T,>(value: T, ms: number): T => {\n const [v, setV] = React.useState(value)\n React.useEffect(() => {\n const id = setTimeout(() => setV(value), ms)\n return () => clearTimeout(id)\n }, [value, ms])\n return v\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
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{t as i}from"./rotate-ccw-BLr0QLAg.js";import{s as a}from"./dist-Dpg8xy_r.js";import{a as o,i as s,n as c,r as l,t as u}from"./select-B30EsRTA.js";import{J as d,K as f,W as p,et as m}from"./router-wFvtgo77.js";import{a as h,i as g,n as _,r as v}from"./user-directory-9COoW6AO.js";import{H as y,d as b,f as x,i as S,l as C,p as w,r as T,s as E,ut as D}from"./index-C3MuojaM.js";var O=e(t(),1),k=n(),A={create:`Created`,update:`Updated`,delete:`Deleted`,unknownUser:`Unknown user`,changes:`changes`};function j({items:e,selectedId:t,labels:n,className:i,formatDate:a=e=>e,onSelect:o}){let s={...A,...n};return(0,k.jsx)(`div`,{className:r(`space-y-2`,i),children:e.map(e=>(0,k.jsxs)(`button`,{type:`button`,onClick:()=>o?.(e),className:r(`relative flex w-full gap-3 rounded-md border p-3 text-left transition-colors`,e.id===t?`border-primary bg-primary/5`:`border-border bg-card hover:bg-muted/50`),children:[(0,k.jsx)(`span`,{className:`mt-1 size-2.5 shrink-0 rounded-full bg-primary`}),(0,k.jsxs)(`span`,{className:`min-w-0 flex-1 space-y-1`,children:[(0,k.jsxs)(`span`,{className:`flex items-center justify-between gap-2`,children:[(0,k.jsx)(`span`,{className:`truncate text-sm font-medium`,children:M(e.op,s)}),e.changes!==void 0&&(0,k.jsxs)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:[e.changes,` `,s.changes]})]}),(0,k.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:e.userLabel??e.userId??s.unknownUser}),(0,k.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:a(e.createdAt)})]})]},e.id))})}function M(e,t){return e===`create`?t.create:e===`delete`?t.delete:t.update}function N({resourceId:e,recordId:t}){let{t:n,locale:r}=m(),A=f(e),M=p(e,t,{limit:50}),N=d(e,t),F=T(),I=S(),[L,R]=O.useState(!1),z=O.useMemo(()=>M.data?.revisions??[],[M.data?.revisions]),B=_(O.useMemo(()=>Array.from(new Set(z.map(e=>e.userId).filter(e=>!!e))),[z])),V=O.useCallback(e=>e?v(B.get(e),e):void 0,[B]),[H,U]=O.useState(),[W,G]=O.useState(``),K=z.find(e=>e.id===H)??z[0],q=W?z.find(e=>e.id===W):void 0,J=O.useMemo(()=>{let e={};for(let t of A?.properties??[])e[t.path]=t.label;return e},[A]),Y=O.useCallback(e=>e.map(e=>({...e,label:J[e.path]})),[J]),X=K?Y(q?g(q.snapshot,K.snapshot):P(K)):[];O.useEffect(()=>{!H&&z[0]&&U(z[0].id)},[z,H]),O.useEffect(()=>{K?.id&&W===K.id&&G(``)},[W,K?.id]);let Z=O.useCallback(e=>new Intl.DateTimeFormat(r,{dateStyle:`medium`,timeStyle:`short`}).format(new Date(e)),[r]),Q=async e=>{if(await F.confirm({title:n(`history:confirmRevert`),confirmLabel:n(`history:revert`),destructive:!0}))try{await N.mutateAsync({revisionId:e.id}),I.success({key:`history:revertSuccess`}),U(void 0),G(``),R(!1)}catch(e){I.error({key:`history:revertFailed`},{description:e instanceof Error?e.message:String(e)})}};return(0,k.jsxs)(E,{open:L,onOpenChange:R,children:[(0,k.jsx)(w,{asChild:!0,children:(0,k.jsxs)(a,{variant:`outline`,size:`sm`,"aria-label":n(`history:revisions`),children:[(0,k.jsx)(D,{className:`size-4`}),(0,k.jsx)(`span`,{className:`hidden sm:inline`,children:n(`history:revisions`)})]})}),(0,k.jsxs)(C,{side:`right`,className:`w-full overflow-y-auto sm:max-w-5xl`,children:[(0,k.jsx)(b,{children:(0,k.jsx)(x,{children:n(`history:revisions`)})}),M.isLoading?(0,k.jsxs)(`div`,{className:`mt-6 space-y-3`,children:[(0,k.jsx)(y,{className:`h-16 w-full`}),(0,k.jsx)(y,{className:`h-64 w-full`})]}):M.isError?(0,k.jsx)(`div`,{className:`mt-6 rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive`,children:n(`history:loadError`)}):(0,k.jsxs)(`div`,{className:`mt-6 grid gap-4 lg:grid-cols-[20rem_1fr]`,children:[(0,k.jsx)(j,{items:z.map(e=>({id:e.id,op:e.op,userId:e.userId,userLabel:V(e.userId),createdAt:e.createdAt,changes:P(e).length})),selectedId:K?.id,onSelect:e=>U(e.id),formatDate:Z,labels:{create:n(`history:op.create`),update:n(`history:op.update`),delete:n(`history:op.delete`),unknownUser:n(`history:unknownUser`),changes:n(`history:changes`)}}),(0,k.jsx)(`div`,{className:`min-w-0 space-y-4`,children:K?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-card p-3`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`p`,{className:`text-sm font-medium`,children:Z(K.createdAt)}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:V(K.userId)??n(`history:unknownUser`)})]}),(0,k.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,k.jsxs)(u,{value:W||`_none_`,onValueChange:e=>G(e===`_none_`?``:e),children:[(0,k.jsx)(s,{className:`h-8 w-auto text-xs`,"aria-label":n(`history:compareTo`),children:(0,k.jsx)(o,{})}),(0,k.jsxs)(c,{children:[(0,k.jsx)(l,{value:`_none_`,children:n(`history:storedDiff`)}),z.filter(e=>e.id!==K.id).map(e=>(0,k.jsx)(l,{value:e.id,children:Z(e.createdAt)},e.id))]})]}),(0,k.jsxs)(a,{variant:`destructive`,size:`sm`,disabled:N.isPending||K.op===`delete`,onClick:()=>void Q(K),children:[(0,k.jsx)(i,{className:`size-4`}),n(`history:revert`)]})]})]}),(0,k.jsx)(h,{fields:X,labels:{added:n(`diff:added`),changed:n(`diff:changed`),removed:n(`diff:removed`),before:n(`diff:before`),after:n(`diff:after`),noChanges:n(`diff:noChanges`)}})]}):(0,k.jsx)(`div`,{className:`rounded-md border border-dashed p-8 text-center text-sm text-muted-foreground`,children:n(`history:noRevisions`)})})]})]})]})}var P=e=>g(e.snapshotBefore??{},e.snapshot);export{N as t};
2
- //# sourceMappingURL=revisions-button-DHcQjj4r.js.map
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{t as i}from"./rotate-ccw-BLr0QLAg.js";import{s as a}from"./dist-Dpg8xy_r.js";import{a as o,i as s,n as c,r as l,t as u}from"./select-CR4acjX0.js";import{J as d,K as f,W as p,et as m}from"./router-wFvtgo77.js";import{a as h,i as g,n as _,r as v}from"./user-directory-9COoW6AO.js";import{H as y,d as b,f as x,i as S,l as C,p as w,r as T,s as E,ut as D}from"./index-BL8keDxQ.js";var O=e(t(),1),k=n(),A={create:`Created`,update:`Updated`,delete:`Deleted`,unknownUser:`Unknown user`,changes:`changes`};function j({items:e,selectedId:t,labels:n,className:i,formatDate:a=e=>e,onSelect:o}){let s={...A,...n};return(0,k.jsx)(`div`,{className:r(`space-y-2`,i),children:e.map(e=>(0,k.jsxs)(`button`,{type:`button`,onClick:()=>o?.(e),className:r(`relative flex w-full gap-3 rounded-md border p-3 text-left transition-colors`,e.id===t?`border-primary bg-primary/5`:`border-border bg-card hover:bg-muted/50`),children:[(0,k.jsx)(`span`,{className:`mt-1 size-2.5 shrink-0 rounded-full bg-primary`}),(0,k.jsxs)(`span`,{className:`min-w-0 flex-1 space-y-1`,children:[(0,k.jsxs)(`span`,{className:`flex items-center justify-between gap-2`,children:[(0,k.jsx)(`span`,{className:`truncate text-sm font-medium`,children:M(e.op,s)}),e.changes!==void 0&&(0,k.jsxs)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:[e.changes,` `,s.changes]})]}),(0,k.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:e.userLabel??e.userId??s.unknownUser}),(0,k.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:a(e.createdAt)})]})]},e.id))})}function M(e,t){return e===`create`?t.create:e===`delete`?t.delete:t.update}function N({resourceId:e,recordId:t}){let{t:n,locale:r}=m(),A=f(e),M=p(e,t,{limit:50}),N=d(e,t),F=T(),I=S(),[L,R]=O.useState(!1),z=O.useMemo(()=>M.data?.revisions??[],[M.data?.revisions]),B=_(O.useMemo(()=>Array.from(new Set(z.map(e=>e.userId).filter(e=>!!e))),[z])),V=O.useCallback(e=>e?v(B.get(e),e):void 0,[B]),[H,U]=O.useState(),[W,G]=O.useState(``),K=z.find(e=>e.id===H)??z[0],q=W?z.find(e=>e.id===W):void 0,J=O.useMemo(()=>{let e={};for(let t of A?.properties??[])e[t.path]=t.label;return e},[A]),Y=O.useCallback(e=>e.map(e=>({...e,label:J[e.path]})),[J]),X=K?Y(q?g(q.snapshot,K.snapshot):P(K)):[];O.useEffect(()=>{!H&&z[0]&&U(z[0].id)},[z,H]),O.useEffect(()=>{K?.id&&W===K.id&&G(``)},[W,K?.id]);let Z=O.useCallback(e=>new Intl.DateTimeFormat(r,{dateStyle:`medium`,timeStyle:`short`}).format(new Date(e)),[r]),Q=async e=>{if(await F.confirm({title:n(`history:confirmRevert`),confirmLabel:n(`history:revert`),destructive:!0}))try{await N.mutateAsync({revisionId:e.id}),I.success({key:`history:revertSuccess`}),U(void 0),G(``),R(!1)}catch(e){I.error({key:`history:revertFailed`},{description:e instanceof Error?e.message:String(e)})}};return(0,k.jsxs)(E,{open:L,onOpenChange:R,children:[(0,k.jsx)(w,{asChild:!0,children:(0,k.jsxs)(a,{variant:`outline`,size:`sm`,"aria-label":n(`history:revisions`),children:[(0,k.jsx)(D,{className:`size-4`}),(0,k.jsx)(`span`,{className:`hidden sm:inline`,children:n(`history:revisions`)})]})}),(0,k.jsxs)(C,{side:`right`,className:`w-full overflow-y-auto sm:max-w-5xl`,children:[(0,k.jsx)(b,{children:(0,k.jsx)(x,{children:n(`history:revisions`)})}),M.isLoading?(0,k.jsxs)(`div`,{className:`mt-6 space-y-3`,children:[(0,k.jsx)(y,{className:`h-16 w-full`}),(0,k.jsx)(y,{className:`h-64 w-full`})]}):M.isError?(0,k.jsx)(`div`,{className:`mt-6 rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive`,children:n(`history:loadError`)}):(0,k.jsxs)(`div`,{className:`mt-6 grid gap-4 lg:grid-cols-[20rem_1fr]`,children:[(0,k.jsx)(j,{items:z.map(e=>({id:e.id,op:e.op,userId:e.userId,userLabel:V(e.userId),createdAt:e.createdAt,changes:P(e).length})),selectedId:K?.id,onSelect:e=>U(e.id),formatDate:Z,labels:{create:n(`history:op.create`),update:n(`history:op.update`),delete:n(`history:op.delete`),unknownUser:n(`history:unknownUser`),changes:n(`history:changes`)}}),(0,k.jsx)(`div`,{className:`min-w-0 space-y-4`,children:K?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-card p-3`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`p`,{className:`text-sm font-medium`,children:Z(K.createdAt)}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:V(K.userId)??n(`history:unknownUser`)})]}),(0,k.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,k.jsxs)(u,{value:W||`_none_`,onValueChange:e=>G(e===`_none_`?``:e),children:[(0,k.jsx)(s,{className:`h-8 w-auto text-xs`,"aria-label":n(`history:compareTo`),children:(0,k.jsx)(o,{})}),(0,k.jsxs)(c,{children:[(0,k.jsx)(l,{value:`_none_`,children:n(`history:storedDiff`)}),z.filter(e=>e.id!==K.id).map(e=>(0,k.jsx)(l,{value:e.id,children:Z(e.createdAt)},e.id))]})]}),(0,k.jsxs)(a,{variant:`destructive`,size:`sm`,disabled:N.isPending||K.op===`delete`,onClick:()=>void Q(K),children:[(0,k.jsx)(i,{className:`size-4`}),n(`history:revert`)]})]})]}),(0,k.jsx)(h,{fields:X,labels:{added:n(`diff:added`),changed:n(`diff:changed`),removed:n(`diff:removed`),before:n(`diff:before`),after:n(`diff:after`),noChanges:n(`diff:noChanges`)}})]}):(0,k.jsx)(`div`,{className:`rounded-md border border-dashed p-8 text-center text-sm text-muted-foreground`,children:n(`history:noRevisions`)})})]})]})]})}var P=e=>g(e.snapshotBefore??{},e.snapshot);export{N as t};
2
+ //# sourceMappingURL=revisions-button-0WtL6bsZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"revisions-button-DHcQjj4r.js","names":[],"sources":["../../../../ui/src/components/revision-timeline.tsx","../../../../react/src/components/revisions-button.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport interface RevisionTimelineItem {\n id: string\n op: 'create' | 'update' | 'delete'\n userId?: string\n /** Resolved, human-readable label for the user who created the revision\n * (e.g. email or full name). When set, it's shown instead of the raw\n * `userId`. Resolution happens in the React layer so this UI component\n * stays i18n- and data-source-agnostic. */\n userLabel?: string\n createdAt: string\n changes?: number\n}\n\nexport interface RevisionTimelineLabels {\n create?: string\n update?: string\n delete?: string\n unknownUser?: string\n changes?: string\n}\n\nexport interface RevisionTimelineProps {\n items: ReadonlyArray<RevisionTimelineItem>\n selectedId?: string\n labels?: RevisionTimelineLabels\n className?: string\n formatDate?: (value: string) => string\n onSelect?: (item: RevisionTimelineItem) => void\n}\n\nconst DEFAULT_LABELS: Required<RevisionTimelineLabels> = {\n create: 'Created',\n update: 'Updated',\n delete: 'Deleted',\n unknownUser: 'Unknown user',\n changes: 'changes',\n}\n\nexport function RevisionTimeline({\n items,\n selectedId,\n labels,\n className,\n formatDate = (v) => v,\n onSelect,\n}: RevisionTimelineProps): React.ReactElement {\n const l = { ...DEFAULT_LABELS, ...labels }\n return (\n <div className={cn('space-y-2', className)}>\n {items.map((item) => {\n const selected = item.id === selectedId\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => onSelect?.(item)}\n className={cn(\n 'relative flex w-full gap-3 rounded-md border p-3 text-left transition-colors',\n selected ? 'border-primary bg-primary/5' : 'border-border bg-card hover:bg-muted/50',\n )}\n >\n <span className=\"mt-1 size-2.5 shrink-0 rounded-full bg-primary\" />\n <span className=\"min-w-0 flex-1 space-y-1\">\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate text-sm font-medium\">{labelForOp(item.op, l)}</span>\n {item.changes !== undefined && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {item.changes} {l.changes}\n </span>\n )}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {item.userLabel ?? item.userId ?? l.unknownUser}\n </span>\n <span className=\"block text-xs text-muted-foreground\">\n {formatDate(item.createdAt)}\n </span>\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\nfunction labelForOp(op: RevisionTimelineItem['op'], labels: Required<RevisionTimelineLabels>): string {\n if (op === 'create') return labels.create\n if (op === 'delete') return labels.delete\n return labels.update\n}\n","import * as React from 'react'\nimport {\n Button,\n DiffView,\n RevisionTimeline,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n Skeleton,\n} from '@modern-admin/ui'\nimport { History, RotateCcw } from 'lucide-react'\nimport { diffSnapshots } from '@modern-admin/core'\nimport { useRecordHistory, useResource, useRevertRevision } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { useDialogs } from '../dialogs.js'\nimport { useNotify } from '../notify.js'\nimport { useUserDirectory, userLabelOf } from '../user-directory.js'\nimport type { HistoryDiffEntry, HistoryRevision } from '../client.js'\n\nexport interface RevisionsButtonProps {\n resourceId: string\n recordId: string\n}\n\nexport function RevisionsButton({\n resourceId,\n recordId,\n}: RevisionsButtonProps): React.ReactElement {\n const { t, locale } = useI18n()\n const resource = useResource(resourceId)\n const history = useRecordHistory(resourceId, recordId, { limit: 50 })\n const revert = useRevertRevision(resourceId, recordId)\n const dialogs = useDialogs()\n const notify = useNotify()\n const [open, setOpen] = React.useState(false)\n const revisions = React.useMemo(\n () => history.data?.revisions ?? [],\n [history.data?.revisions],\n )\n // Resolve revision authors to human-readable labels (email / name)\n // instead of showing raw user UUIDs.\n const userIds = React.useMemo(\n () => Array.from(new Set(revisions.map((r) => r.userId).filter((v): v is string => !!v))),\n [revisions],\n )\n const users = useUserDirectory(userIds)\n const labelForUser = React.useCallback(\n (userId: string | undefined): string | undefined =>\n userId ? userLabelOf(users.get(userId), userId) : undefined,\n [users],\n )\n const [selectedId, setSelectedId] = React.useState<string | undefined>()\n const [compareToId, setCompareToId] = React.useState<string>('')\n const selected = revisions.find((r) => r.id === selectedId) ?? revisions[0]\n const compareTo = compareToId\n ? revisions.find((r) => r.id === compareToId)\n : undefined\n\n // Build a path → label map from the resource schema so each diff field\n // can show a human-readable name before its technical path.\n const labelByPath = React.useMemo<Record<string, string>>(() => {\n const map: Record<string, string> = {}\n for (const p of resource?.properties ?? []) map[p.path] = p.label\n return map\n }, [resource])\n\n const withLabels = React.useCallback(\n (fields: ReturnType<typeof diffSnapshots>) =>\n fields.map((f) => ({ ...f, label: labelByPath[f.path] })),\n [labelByPath],\n )\n\n const visibleFields = selected\n ? withLabels(\n compareTo\n ? diffSnapshots(compareTo.snapshot, selected.snapshot)\n : fieldsFor(selected),\n )\n : []\n\n React.useEffect(() => {\n if (!selectedId && revisions[0]) setSelectedId(revisions[0].id)\n }, [revisions, selectedId])\n\n React.useEffect(() => {\n if (selected?.id && compareToId === selected.id) setCompareToId('')\n }, [compareToId, selected?.id])\n\n const formatDate = React.useCallback(\n (value: string) => new Intl.DateTimeFormat(locale, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(new Date(value)),\n [locale],\n )\n\n const handleRevert = async (revision: HistoryRevision): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('history:confirmRevert'),\n confirmLabel: t('history:revert'),\n destructive: true,\n })\n if (!ok) return\n try {\n await revert.mutateAsync({ revisionId: revision.id })\n notify.success({ key: 'history:revertSuccess' })\n setSelectedId(undefined)\n setCompareToId('')\n setOpen(false)\n } catch (err) {\n notify.error(\n { key: 'history:revertFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n )\n }\n }\n\n return (\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" aria-label={t('history:revisions')}>\n <History className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('history:revisions')}</span>\n </Button>\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"w-full overflow-y-auto sm:max-w-5xl\">\n <SheetHeader>\n <SheetTitle>{t('history:revisions')}</SheetTitle>\n </SheetHeader>\n {history.isLoading ? (\n <div className=\"mt-6 space-y-3\">\n <Skeleton className=\"h-16 w-full\" />\n <Skeleton className=\"h-64 w-full\" />\n </div>\n ) : history.isError ? (\n <div className=\"mt-6 rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n {t('history:loadError')}\n </div>\n ) : (\n <div className=\"mt-6 grid gap-4 lg:grid-cols-[20rem_1fr]\">\n <RevisionTimeline\n items={revisions.map((r) => ({\n id: r.id,\n op: r.op,\n userId: r.userId,\n userLabel: labelForUser(r.userId),\n createdAt: r.createdAt,\n changes: fieldsFor(r).length,\n }))}\n selectedId={selected?.id}\n onSelect={(item) => setSelectedId(item.id)}\n formatDate={formatDate}\n labels={{\n create: t('history:op.create'),\n update: t('history:op.update'),\n delete: t('history:op.delete'),\n unknownUser: t('history:unknownUser'),\n changes: t('history:changes'),\n }}\n />\n <div className=\"min-w-0 space-y-4\">\n {selected ? (\n <>\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-card p-3\">\n <div>\n <p className=\"text-sm font-medium\">{formatDate(selected.createdAt)}</p>\n <p className=\"text-xs text-muted-foreground\">\n {labelForUser(selected.userId) ?? t('history:unknownUser')}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Select\n value={compareToId || '_none_'}\n onValueChange={(v) => setCompareToId(v === '_none_' ? '' : v)}\n >\n <SelectTrigger\n className=\"h-8 w-auto text-xs\"\n aria-label={t('history:compareTo')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_none_\">{t('history:storedDiff')}</SelectItem>\n {revisions\n .filter((r) => r.id !== selected.id)\n .map((revision) => (\n <SelectItem key={revision.id} value={revision.id}>\n {formatDate(revision.createdAt)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={revert.isPending || selected.op === 'delete'}\n onClick={() => void handleRevert(selected)}\n >\n <RotateCcw className=\"size-4\" />\n {t('history:revert')}\n </Button>\n </div>\n </div>\n <DiffView\n fields={visibleFields}\n labels={{\n added: t('diff:added'),\n changed: t('diff:changed'),\n removed: t('diff:removed'),\n before: t('diff:before'),\n after: t('diff:after'),\n noChanges: t('diff:noChanges'),\n }}\n />\n </>\n ) : (\n <div className=\"rounded-md border border-dashed p-8 text-center text-sm text-muted-foreground\">\n {t('history:noRevisions')}\n </div>\n )}\n </div>\n </div>\n )}\n </SheetContent>\n </Sheet>\n )\n}\n\nconst fieldsFor = (revision: HistoryRevision): HistoryDiffEntry[] =>\n diffSnapshots(revision.snapshotBefore ?? {}, revision.snapshot)\n"],"mappings":"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"}
1
+ {"version":3,"file":"revisions-button-0WtL6bsZ.js","names":[],"sources":["../../../../ui/src/components/revision-timeline.tsx","../../../../react/src/components/revisions-button.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport interface RevisionTimelineItem {\n id: string\n op: 'create' | 'update' | 'delete'\n userId?: string\n /** Resolved, human-readable label for the user who created the revision\n * (e.g. email or full name). When set, it's shown instead of the raw\n * `userId`. Resolution happens in the React layer so this UI component\n * stays i18n- and data-source-agnostic. */\n userLabel?: string\n createdAt: string\n changes?: number\n}\n\nexport interface RevisionTimelineLabels {\n create?: string\n update?: string\n delete?: string\n unknownUser?: string\n changes?: string\n}\n\nexport interface RevisionTimelineProps {\n items: ReadonlyArray<RevisionTimelineItem>\n selectedId?: string\n labels?: RevisionTimelineLabels\n className?: string\n formatDate?: (value: string) => string\n onSelect?: (item: RevisionTimelineItem) => void\n}\n\nconst DEFAULT_LABELS: Required<RevisionTimelineLabels> = {\n create: 'Created',\n update: 'Updated',\n delete: 'Deleted',\n unknownUser: 'Unknown user',\n changes: 'changes',\n}\n\nexport function RevisionTimeline({\n items,\n selectedId,\n labels,\n className,\n formatDate = (v) => v,\n onSelect,\n}: RevisionTimelineProps): React.ReactElement {\n const l = { ...DEFAULT_LABELS, ...labels }\n return (\n <div className={cn('space-y-2', className)}>\n {items.map((item) => {\n const selected = item.id === selectedId\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => onSelect?.(item)}\n className={cn(\n 'relative flex w-full gap-3 rounded-md border p-3 text-left transition-colors',\n selected ? 'border-primary bg-primary/5' : 'border-border bg-card hover:bg-muted/50',\n )}\n >\n <span className=\"mt-1 size-2.5 shrink-0 rounded-full bg-primary\" />\n <span className=\"min-w-0 flex-1 space-y-1\">\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate text-sm font-medium\">{labelForOp(item.op, l)}</span>\n {item.changes !== undefined && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {item.changes} {l.changes}\n </span>\n )}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {item.userLabel ?? item.userId ?? l.unknownUser}\n </span>\n <span className=\"block text-xs text-muted-foreground\">\n {formatDate(item.createdAt)}\n </span>\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\nfunction labelForOp(op: RevisionTimelineItem['op'], labels: Required<RevisionTimelineLabels>): string {\n if (op === 'create') return labels.create\n if (op === 'delete') return labels.delete\n return labels.update\n}\n","import * as React from 'react'\nimport {\n Button,\n DiffView,\n RevisionTimeline,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n Skeleton,\n} from '@modern-admin/ui'\nimport { History, RotateCcw } from 'lucide-react'\nimport { diffSnapshots } from '@modern-admin/core'\nimport { useRecordHistory, useResource, useRevertRevision } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { useDialogs } from '../dialogs.js'\nimport { useNotify } from '../notify.js'\nimport { useUserDirectory, userLabelOf } from '../user-directory.js'\nimport type { HistoryDiffEntry, HistoryRevision } from '../client.js'\n\nexport interface RevisionsButtonProps {\n resourceId: string\n recordId: string\n}\n\nexport function RevisionsButton({\n resourceId,\n recordId,\n}: RevisionsButtonProps): React.ReactElement {\n const { t, locale } = useI18n()\n const resource = useResource(resourceId)\n const history = useRecordHistory(resourceId, recordId, { limit: 50 })\n const revert = useRevertRevision(resourceId, recordId)\n const dialogs = useDialogs()\n const notify = useNotify()\n const [open, setOpen] = React.useState(false)\n const revisions = React.useMemo(\n () => history.data?.revisions ?? [],\n [history.data?.revisions],\n )\n // Resolve revision authors to human-readable labels (email / name)\n // instead of showing raw user UUIDs.\n const userIds = React.useMemo(\n () => Array.from(new Set(revisions.map((r) => r.userId).filter((v): v is string => !!v))),\n [revisions],\n )\n const users = useUserDirectory(userIds)\n const labelForUser = React.useCallback(\n (userId: string | undefined): string | undefined =>\n userId ? userLabelOf(users.get(userId), userId) : undefined,\n [users],\n )\n const [selectedId, setSelectedId] = React.useState<string | undefined>()\n const [compareToId, setCompareToId] = React.useState<string>('')\n const selected = revisions.find((r) => r.id === selectedId) ?? revisions[0]\n const compareTo = compareToId\n ? revisions.find((r) => r.id === compareToId)\n : undefined\n\n // Build a path → label map from the resource schema so each diff field\n // can show a human-readable name before its technical path.\n const labelByPath = React.useMemo<Record<string, string>>(() => {\n const map: Record<string, string> = {}\n for (const p of resource?.properties ?? []) map[p.path] = p.label\n return map\n }, [resource])\n\n const withLabels = React.useCallback(\n (fields: ReturnType<typeof diffSnapshots>) =>\n fields.map((f) => ({ ...f, label: labelByPath[f.path] })),\n [labelByPath],\n )\n\n const visibleFields = selected\n ? withLabels(\n compareTo\n ? diffSnapshots(compareTo.snapshot, selected.snapshot)\n : fieldsFor(selected),\n )\n : []\n\n React.useEffect(() => {\n if (!selectedId && revisions[0]) setSelectedId(revisions[0].id)\n }, [revisions, selectedId])\n\n React.useEffect(() => {\n if (selected?.id && compareToId === selected.id) setCompareToId('')\n }, [compareToId, selected?.id])\n\n const formatDate = React.useCallback(\n (value: string) => new Intl.DateTimeFormat(locale, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(new Date(value)),\n [locale],\n )\n\n const handleRevert = async (revision: HistoryRevision): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('history:confirmRevert'),\n confirmLabel: t('history:revert'),\n destructive: true,\n })\n if (!ok) return\n try {\n await revert.mutateAsync({ revisionId: revision.id })\n notify.success({ key: 'history:revertSuccess' })\n setSelectedId(undefined)\n setCompareToId('')\n setOpen(false)\n } catch (err) {\n notify.error(\n { key: 'history:revertFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n )\n }\n }\n\n return (\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" aria-label={t('history:revisions')}>\n <History className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('history:revisions')}</span>\n </Button>\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"w-full overflow-y-auto sm:max-w-5xl\">\n <SheetHeader>\n <SheetTitle>{t('history:revisions')}</SheetTitle>\n </SheetHeader>\n {history.isLoading ? (\n <div className=\"mt-6 space-y-3\">\n <Skeleton className=\"h-16 w-full\" />\n <Skeleton className=\"h-64 w-full\" />\n </div>\n ) : history.isError ? (\n <div className=\"mt-6 rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n {t('history:loadError')}\n </div>\n ) : (\n <div className=\"mt-6 grid gap-4 lg:grid-cols-[20rem_1fr]\">\n <RevisionTimeline\n items={revisions.map((r) => ({\n id: r.id,\n op: r.op,\n userId: r.userId,\n userLabel: labelForUser(r.userId),\n createdAt: r.createdAt,\n changes: fieldsFor(r).length,\n }))}\n selectedId={selected?.id}\n onSelect={(item) => setSelectedId(item.id)}\n formatDate={formatDate}\n labels={{\n create: t('history:op.create'),\n update: t('history:op.update'),\n delete: t('history:op.delete'),\n unknownUser: t('history:unknownUser'),\n changes: t('history:changes'),\n }}\n />\n <div className=\"min-w-0 space-y-4\">\n {selected ? (\n <>\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-card p-3\">\n <div>\n <p className=\"text-sm font-medium\">{formatDate(selected.createdAt)}</p>\n <p className=\"text-xs text-muted-foreground\">\n {labelForUser(selected.userId) ?? t('history:unknownUser')}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Select\n value={compareToId || '_none_'}\n onValueChange={(v) => setCompareToId(v === '_none_' ? '' : v)}\n >\n <SelectTrigger\n className=\"h-8 w-auto text-xs\"\n aria-label={t('history:compareTo')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_none_\">{t('history:storedDiff')}</SelectItem>\n {revisions\n .filter((r) => r.id !== selected.id)\n .map((revision) => (\n <SelectItem key={revision.id} value={revision.id}>\n {formatDate(revision.createdAt)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={revert.isPending || selected.op === 'delete'}\n onClick={() => void handleRevert(selected)}\n >\n <RotateCcw className=\"size-4\" />\n {t('history:revert')}\n </Button>\n </div>\n </div>\n <DiffView\n fields={visibleFields}\n labels={{\n added: t('diff:added'),\n changed: t('diff:changed'),\n removed: t('diff:removed'),\n before: t('diff:before'),\n after: t('diff:after'),\n noChanges: t('diff:noChanges'),\n }}\n />\n </>\n ) : (\n <div className=\"rounded-md border border-dashed p-8 text-center text-sm text-muted-foreground\">\n {t('history:noRevisions')}\n </div>\n )}\n </div>\n </div>\n )}\n </SheetContent>\n </Sheet>\n )\n}\n\nconst fieldsFor = (revision: HistoryRevision): HistoryDiffEntry[] =>\n diffSnapshots(revision.snapshotBefore ?? {}, revision.snapshot)\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{C as n,S as r,_ as i,b as a,d as o,h as s,i as c,l,m as u,o as d,p as f,r as p,s as m,u as h,x as g}from"./with-selector-NDLhu4dT.js";import{n as _,t as v}from"./dist-BSbFjTlr.js";import{n as y}from"./trash-2-DhyKQCKv.js";import{a as b,i as x,n as S,r as C,t as w}from"./dist-Dpg8xy_r.js";import{Dt as ee,Et as T,Tt as E,wt as D}from"./router-wFvtgo77.js";import{G as O,K as k,vt as A,yt as j}from"./index-C3MuojaM.js";var M=e(n(),1),N=e(t(),1);function P(e){let t=N.useRef({value:e,previous:e});return N.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var F=r(),I=[` `,`Enter`,`ArrowUp`,`ArrowDown`],L=[` `,`Enter`],R=`Select`,[z,B,V]=_(R),[H,U]=g(R,[V,b]),W=b(),[te,G]=H(R),[ne,re]=H(R),ie=`SelectProvider`;function ae(e){let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:u,name:d,autoComplete:p,disabled:m,required:h,form:g,internal_do_not_use_render:_}=e,y=W(t),[b,S]=N.useState(null),[C,w]=N.useState(null),[ee,T]=N.useState(!1),E=v(u),[D,O]=f({prop:r,defaultProp:i??!1,onChange:a,caller:R}),[k,A]=f({prop:o,defaultProp:s,onChange:c,caller:R}),j=N.useRef(null),M=N.useRef(k);N.useEffect(()=>{let e=g?b?.ownerDocument.getElementById(g):b?.form;if(e instanceof HTMLFormElement){let t=()=>A(M.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[g,b,A]);let P=!b||!!g||!!b.closest(`form`),[I,L]=N.useState(new Set),B=l(),V=Array.from(I).map(e=>e.props.value).join(`;`),H=N.useCallback(e=>{L(t=>new Set(t).add(e))},[]),U=N.useCallback(e=>{L(t=>{let n=new Set(t);return n.delete(e),n})},[]),G={required:h,trigger:b,onTriggerChange:S,valueNode:C,onValueNodeChange:w,valueNodeHasChildren:ee,onValueNodeHasChildrenChange:T,contentId:B,value:k,onValueChange:A,open:D,onOpenChange:O,dir:E,triggerPointerDownPosRef:j,disabled:m,name:d,autoComplete:p,form:g,nativeOptions:I,nativeSelectKey:V,isFormControl:P};return(0,F.jsx)(x,{...y,children:(0,F.jsx)(te,{scope:t,...G,children:(0,F.jsx)(z.Provider,{scope:t,children:(0,F.jsx)(ne,{scope:t,onNativeOptionAdd:H,onNativeOptionRemove:U,children:Qe(_)?_(G):n})})})})}ae.displayName=ie;var K=e=>{let{__scopeSelect:t,children:n,...r}=e;return(0,F.jsx)(ae,{__scopeSelect:t,...r,internal_do_not_use_render:({isFormControl:e})=>(0,F.jsxs)(F.Fragment,{children:[n,e?(0,F.jsx)(Ze,{__scopeSelect:t}):null]})})};K.displayName=R;var oe=`SelectTrigger`,se=N.forwardRef((e,t)=>{let{__scopeSelect:n,disabled:r=!1,...i}=e,c=W(n),l=G(oe,n),u=l.disabled||r,d=a(t,l.onTriggerChange),f=B(n),p=N.useRef(`touch`),[m,h,g]=$e(e=>{let t=f().filter(e=>!e.disabled),n=et(t,e,t.find(e=>e.value===l.value));n!==void 0&&l.onValueChange(n.value)}),_=e=>{u||(l.onOpenChange(!0),g()),e&&(l.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})};return(0,F.jsx)(w,{asChild:!0,...c,children:(0,F.jsx)(o.button,{type:`button`,role:`combobox`,"aria-controls":l.open?l.contentId:void 0,"aria-expanded":l.open,"aria-required":l.required,"aria-autocomplete":`none`,dir:l.dir,"data-state":l.open?`open`:`closed`,disabled:u,"data-disabled":u?``:void 0,"data-placeholder":$(l.value)?``:void 0,...i,ref:d,onClick:s(i.onClick,e=>{e.currentTarget.focus(),p.current!==`mouse`&&_(e)}),onPointerDown:s(i.onPointerDown,e=>{p.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(_(e),e.preventDefault())}),onKeyDown:s(i.onKeyDown,e=>{let t=m.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&h(e.key),!(t&&e.key===` `)&&I.includes(e.key)&&(_(),e.preventDefault())})})})});se.displayName=oe;var ce=`SelectValue`,le=N.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,children:s,placeholder:c=``,...l}=e,d=G(ce,n),{onValueNodeHasChildrenChange:f}=d,p=s!==void 0,m=a(t,d.onValueNodeChange);u(()=>{f(p)},[f,p]);let h=$(d.value);return(0,F.jsx)(o.span,{...l,asChild:!h&&l.asChild,ref:m,style:{pointerEvents:`none`},children:(0,F.jsx)(N.Fragment,{children:h?c:s},h?`placeholder`:`value`)})});le.displayName=ce;var ue=`SelectIcon`,de=N.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,...i}=e;return(0,F.jsx)(o.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})});de.displayName=ue;var fe=`SelectPortal`,[pe,me]=H(fe,{forceMount:void 0}),he=e=>{let{__scopeSelect:t,forceMount:n,...r}=e;return(0,F.jsx)(pe,{scope:e.__scopeSelect,forceMount:n,children:(0,F.jsx)(p,{asChild:!0,...r})})};he.displayName=fe;var q=`SelectContent`,ge=N.forwardRef((e,t)=>{let n=me(q,e.__scopeSelect),{forceMount:r=n.forceMount,...i}=e,a=G(q,e.__scopeSelect),[o,s]=N.useState();return u(()=>{s(new DocumentFragment)},[]),(0,F.jsx)(h,{present:r||a.open,children:({present:e})=>e?(0,F.jsx)(xe,{...i,ref:t}):(0,F.jsx)(_e,{...i,fragment:o})})});ge.displayName=q;var _e=N.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,fragment:i}=e;return i?M.createPortal((0,F.jsx)(ve,{scope:n,children:(0,F.jsx)(z.Slot,{scope:n,children:(0,F.jsx)(`div`,{ref:t,children:r})})}),i):null});_e.displayName=`SelectContentFragment`;var J=10,[ve,Y]=H(q),ye=`SelectContentImpl`,be=i(`SelectContent.RemoveScroll`),xe=N.forwardRef((e,t)=>{let{__scopeSelect:n}=e,{position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:o,onPointerDownOutside:l,side:u,sideOffset:d,align:f,alignOffset:p,arrowPadding:m,collisionBoundary:h,collisionPadding:g,sticky:_,hideWhenDetached:v,avoidCollisions:y,...b}=e,x=G(q,n),[S,C]=N.useState(null),[w,O]=N.useState(null),k=a(t,C),[A,j]=N.useState(null),[M,P]=N.useState(null),I=B(n),[L,R]=N.useState(!1),z=N.useRef(!1);N.useEffect(()=>{if(S)return E(S)},[S]),ee();let V=N.useCallback(e=>{let[t,...n]=I().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&w&&(w.scrollTop=0),n===r&&w&&(w.scrollTop=w.scrollHeight),n?.focus(),document.activeElement!==i))return},[I,w]),H=N.useCallback(()=>V([A,S]),[V,A,S]);N.useEffect(()=>{L&&H()},[L,H]);let{onOpenChange:U,triggerPointerDownPosRef:W}=x;N.useEffect(()=>{if(S){let e={x:0,y:0},t=t=>{e={x:Math.abs(Math.round(t.pageX)-(W.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(W.current?.y??0))}},n=n=>{e.x<=10&&e.y<=10?n.preventDefault():n.composedPath().includes(S)||U(!1),document.removeEventListener(`pointermove`,t),W.current=null};return W.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[S,U,W]),N.useEffect(()=>{let e=()=>U(!1);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[U]);let[te,ne]=$e(e=>{let t=I().filter(e=>!e.disabled),n=et(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current?.focus())}),re=N.useCallback((e,t,n)=>{let r=!z.current&&!n;(x.value!==void 0&&x.value===t||r)&&(j(e),r&&(z.current=!0))},[x.value]),ie=N.useCallback(()=>S?.focus(),[S]),ae=N.useCallback((e,t,n)=>{let r=!z.current&&!n;(x.value!==void 0&&x.value===t||r)&&P(e)},[x.value]),K=r===`popper`?Te:Ce,oe=K===Te?{side:u,sideOffset:d,align:f,alignOffset:p,arrowPadding:m,collisionBoundary:h,collisionPadding:g,sticky:_,hideWhenDetached:v,avoidCollisions:y}:{};return(0,F.jsx)(ve,{scope:n,content:S,viewport:w,onViewportChange:O,itemRefCallback:re,selectedItem:A,onItemLeave:ie,itemTextRefCallback:ae,focusSelectedItem:H,selectedItemText:M,position:r,isPositioned:L,searchRef:te,children:(0,F.jsx)(D,{as:be,allowPinchZoom:!0,children:(0,F.jsx)(T,{asChild:!0,trapped:x.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:s(i,e=>{x.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,F.jsx)(c,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:l,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>x.onOpenChange(!1),children:(0,F.jsx)(K,{role:`listbox`,id:x.contentId,"data-state":x.open?`open`:`closed`,dir:x.dir,onContextMenu:e=>e.preventDefault(),...b,...oe,onPlaced:()=>R(!0),ref:k,style:{display:`flex`,flexDirection:`column`,outline:`none`,...b.style},onKeyDown:s(b.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&ne(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=I().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>V(t)),e.preventDefault()}})})})})})})});xe.displayName=ye;var Se=`SelectItemAlignedPosition`,Ce=N.forwardRef((e,t)=>{let{__scopeSelect:n,onPlaced:r,...i}=e,s=G(q,n),c=Y(q,n),[l,d]=N.useState(null),[f,p]=N.useState(null),m=a(t,p),h=B(n),g=N.useRef(!1),_=N.useRef(!0),{viewport:v,selectedItem:y,selectedItemText:b,focusSelectedItem:x}=c,S=N.useCallback(()=>{if(s.trigger&&s.valueNode&&l&&f&&v&&y&&b){let e=s.trigger.getBoundingClientRect(),t=f.getBoundingClientRect(),n=s.valueNode.getBoundingClientRect(),i=b.getBoundingClientRect();if(s.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,s=e.width+o,c=Math.max(s,t.width),u=window.innerWidth-J,d=k(a,[J,Math.max(J,u-c)]);l.style.minWidth=s+`px`,l.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,s=e.width+o,c=Math.max(s,t.width),u=window.innerWidth-J,d=k(a,[J,Math.max(J,u-c)]);l.style.minWidth=s+`px`,l.style.right=d+`px`}let a=h(),o=window.innerHeight-J*2,c=v.scrollHeight,u=window.getComputedStyle(f),d=parseInt(u.borderTopWidth,10),p=parseInt(u.paddingTop,10),m=parseInt(u.borderBottomWidth,10),_=parseInt(u.paddingBottom,10),x=d+p+c+_+m,S=Math.min(y.offsetHeight*5,x),C=window.getComputedStyle(v),w=parseInt(C.paddingTop,10),ee=parseInt(C.paddingBottom,10),T=e.top+e.height/2-J,E=o-T,D=y.offsetHeight/2,O=y.offsetTop+D,A=d+p+O,j=x-A;if(A<=T){let e=a.length>0&&y===a[a.length-1].ref.current;l.style.bottom=`0px`;let t=f.clientHeight-v.offsetTop-v.offsetHeight,n=A+Math.max(E,D+(e?ee:0)+t+m);l.style.height=n+`px`}else{let e=a.length>0&&y===a[0].ref.current;l.style.top=`0px`;let t=Math.max(T,d+v.offsetTop+(e?w:0)+D)+j;l.style.height=t+`px`,v.scrollTop=A-T+v.offsetTop}l.style.margin=`${J}px 0`,l.style.minHeight=S+`px`,l.style.maxHeight=o+`px`,r?.(),requestAnimationFrame(()=>g.current=!0)}},[h,s.trigger,s.valueNode,l,f,v,y,b,s.dir,r]);u(()=>S(),[S]);let[C,w]=N.useState();return u(()=>{f&&w(window.getComputedStyle(f).zIndex)},[f]),(0,F.jsx)(Ee,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:g,onScrollButtonChange:N.useCallback(e=>{e&&_.current===!0&&(S(),x?.(),_.current=!1)},[S,x]),children:(0,F.jsx)(`div`,{ref:d,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:C},children:(0,F.jsx)(o.div,{...i,ref:m,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})});Ce.displayName=Se;var we=`SelectPopperPosition`,Te=N.forwardRef((e,t)=>{let{__scopeSelect:n,align:r=`start`,collisionPadding:i=J,...a}=e,o=W(n);return(0,F.jsx)(C,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})});Te.displayName=we;var[Ee,De]=H(q,{}),Oe=`SelectViewport`,ke=N.forwardRef((e,t)=>{let{__scopeSelect:n,nonce:r,...i}=e,c=Y(Oe,n),l=De(Oe,n),u=a(t,c.onViewportChange),d=N.useRef(0);return(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,F.jsx)(z.Slot,{scope:n,children:(0,F.jsx)(o.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:u,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:s(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=l;if(r?.current&&n){let e=Math.abs(d.current-t.scrollTop);if(e>0){let r=window.innerHeight-J*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}d.current=t.scrollTop})})})]})});ke.displayName=Oe;var Ae=`SelectGroup`,[je,Me]=H(Ae),Ne=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=l();return(0,F.jsx)(je,{scope:n,id:i,children:(0,F.jsx)(o.div,{role:`group`,"aria-labelledby":i,...r,ref:t})})});Ne.displayName=Ae;var Pe=`SelectLabel`,Fe=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=Me(Pe,n);return(0,F.jsx)(o.div,{id:i.id,...r,ref:t})});Fe.displayName=Pe;var X=`SelectItem`,[Ie,Le]=H(X),Re=N.forwardRef((e,t)=>{let{__scopeSelect:n,value:r,disabled:i=!1,textValue:c,...u}=e,f=G(X,n),p=Y(X,n),m=f.value===r,[h,g]=N.useState(c??``),[_,v]=N.useState(!1),y=a(t,d(e=>p.itemRefCallback?.(e,r,i))),b=l(),x=N.useRef(`touch`),S=()=>{i||(f.onValueChange(r),f.onOpenChange(!1))};return(0,F.jsx)(Ie,{scope:n,value:r,disabled:i,textId:b,isSelected:m,onItemTextChange:N.useCallback(e=>{g(t=>t||(e?.textContent??``).trim())},[]),children:(0,F.jsx)(z.ItemSlot,{scope:n,value:r,disabled:i,textValue:h,children:(0,F.jsx)(o.div,{role:`option`,"aria-labelledby":b,"data-highlighted":_?``:void 0,"aria-selected":m&&_,"data-state":m?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...u,ref:y,onFocus:s(u.onFocus,()=>v(!0)),onBlur:s(u.onBlur,()=>v(!1)),onClick:s(u.onClick,()=>{x.current!==`mouse`&&S()}),onPointerUp:s(u.onPointerUp,()=>{x.current===`mouse`&&S()}),onPointerDown:s(u.onPointerDown,e=>{x.current=e.pointerType}),onPointerMove:s(u.onPointerMove,e=>{x.current=e.pointerType,i?p.onItemLeave?.():x.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:s(u.onPointerLeave,e=>{e.currentTarget===document.activeElement&&p.onItemLeave?.()}),onKeyDown:s(u.onKeyDown,e=>{i||e.target!==e.currentTarget||p.searchRef?.current!==``&&e.key===` `||(L.includes(e.key)&&S(),e.key===` `&&e.preventDefault())})})})})});Re.displayName=X;var Z=`SelectItemText`,ze=N.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,...s}=e,c=G(Z,n),l=Y(Z,n),f=Le(Z,n),p=re(Z,n),[m,h]=N.useState(null),g=d(e=>l.itemTextRefCallback?.(e,f.value,f.disabled)),_=a(t,h,f.onItemTextChange,g),v=m?.textContent,y=N.useMemo(()=>(0,F.jsx)(`option`,{value:f.value,disabled:f.disabled,children:v},f.value),[f.disabled,f.value,v]),{onNativeOptionAdd:b,onNativeOptionRemove:x}=p;return u(()=>(b(y),()=>x(y)),[b,x,y]),(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(o.span,{id:f.textId,...s,ref:_}),f.isSelected&&c.valueNode&&!c.valueNodeHasChildren&&!$(c.value)?M.createPortal(s.children,c.valueNode):null]})});ze.displayName=Z;var Be=`SelectItemIndicator`,Ve=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return Le(Be,n).isSelected?(0,F.jsx)(o.span,{"aria-hidden":!0,...r,ref:t}):null});Ve.displayName=Be;var He=`SelectScrollUpButton`,Q=N.forwardRef((e,t)=>{let n=Y(He,e.__scopeSelect),r=De(He,e.__scopeSelect),[i,o]=N.useState(!1),s=a(t,r.onScrollButtonChange);return u(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollTop>0;o(e)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,F.jsx)(Ge,{...e,ref:s,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null});Q.displayName=He;var Ue=`SelectScrollDownButton`,We=N.forwardRef((e,t)=>{let n=Y(Ue,e.__scopeSelect),r=De(Ue,e.__scopeSelect),[i,o]=N.useState(!1),s=a(t,r.onScrollButtonChange);return u(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight,n=Math.ceil(t.scrollTop)<e;o(n)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,F.jsx)(Ge,{...e,ref:s,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null});We.displayName=Ue;var Ge=N.forwardRef((e,t)=>{let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=Y(`SelectScrollButton`,n),c=N.useRef(null),l=B(n),d=N.useCallback(()=>{c.current!==null&&(window.clearInterval(c.current),c.current=null)},[]);return N.useEffect(()=>()=>d(),[d]),u(()=>{l().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[l]),(0,F.jsx)(o.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:s(i.onPointerDown,()=>{c.current===null&&(c.current=window.setInterval(r,50))}),onPointerMove:s(i.onPointerMove,()=>{a.onItemLeave?.(),c.current===null&&(c.current=window.setInterval(r,50))}),onPointerLeave:s(i.onPointerLeave,()=>{d()})})}),Ke=`SelectSeparator`,qe=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return(0,F.jsx)(o.div,{"aria-hidden":!0,...r,ref:t})});qe.displayName=Ke;var Je=`SelectArrow`,Ye=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=W(n);return Y(Je,n).position===`popper`?(0,F.jsx)(S,{...i,...r,ref:t}):null});Ye.displayName=Je;var Xe=`SelectBubbleInput`,Ze=N.forwardRef(({__scopeSelect:e,...t},n)=>{let r=G(Xe,e),{value:i,onValueChange:s,required:c,disabled:l,name:u,autoComplete:d,form:f}=r,{nativeOptions:p,nativeSelectKey:m}=r,h=N.useRef(null),g=a(n,h),_=i??``,v=P(_),y=Array.from(p).some(e=>(e.props.value??``)===``);return N.useEffect(()=>{let e=h.current;if(!e)return;let t=window.HTMLSelectElement.prototype,n=Object.getOwnPropertyDescriptor(t,`value`).set;if(v!==_&&n){let t=new Event(`change`,{bubbles:!0});n.call(e,_),e.dispatchEvent(t)}},[v,_]),(0,F.jsxs)(o.select,{"aria-hidden":!0,required:c,tabIndex:-1,name:u,autoComplete:d,disabled:l,form:f,onChange:e=>s(e.target.value),...t,style:{...O,...t.style},ref:g,defaultValue:_,children:[$(i)&&!y?(0,F.jsx)(`option`,{value:``}):null,Array.from(p)]},m)});Ze.displayName=Xe;function Qe(e){return typeof e==`function`}function $(e){return e===``||e===void 0}function $e(e){let t=d(e),n=N.useRef(``),r=N.useRef(0),i=N.useCallback(e=>{let i=n.current+e;t(i),(function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))})(i)},[t]),a=N.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return N.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}function et(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=tt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function tt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function nt({onValueChange:e,...t}){let n=N.useCallback(t=>{t!==``&&e?.(t)},[e]);return(0,F.jsx)(K,{onValueChange:n,...t})}nt.displayName=`Select`;var rt=nt,it=le,at=N.forwardRef(({className:e,children:t,onMouseEnter:n,...r},i)=>(0,F.jsxs)(se,{ref:i,className:m(`flex h-9 w-full cursor-pointer items-center justify-between rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1`,e),onMouseEnter:e=>{let t=e.currentTarget.querySelector(`span`);t&&t.scrollWidth>t.offsetWidth?e.currentTarget.title=t.textContent??``:e.currentTarget.removeAttribute(`title`),n?.(e)},...r,children:[t,(0,F.jsx)(de,{asChild:!0,children:(0,F.jsx)(A,{className:`h-4 w-4 opacity-50`})})]}));at.displayName=se.displayName;var ot=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(Q,{ref:n,className:m(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,F.jsx)(y,{className:`h-4 w-4`})}));ot.displayName=Q.displayName;var st=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(We,{ref:n,className:m(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,F.jsx)(A,{className:`h-4 w-4`})}));st.displayName=We.displayName;var ct=N.forwardRef(({className:e,children:t,position:n=`popper`,...r},i)=>(0,F.jsx)(he,{children:(0,F.jsxs)(ge,{ref:i,className:m(`relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1`,e),position:n,...r,children:[(0,F.jsx)(ot,{}),(0,F.jsx)(ke,{className:m(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`),children:t}),(0,F.jsx)(st,{})]})}));ct.displayName=ge.displayName;var lt=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(Fe,{ref:n,className:m(`px-2 py-1.5 text-sm font-semibold`,e),...t}));lt.displayName=Fe.displayName;var ut=N.forwardRef(({className:e,children:t,...n},r)=>(0,F.jsxs)(Re,{ref:r,className:m(`relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,e),title:typeof t==`string`?t:void 0,...n,children:[(0,F.jsx)(`span`,{className:`absolute left-2 flex h-3.5 w-3.5 items-center justify-center`,children:(0,F.jsx)(Ve,{children:(0,F.jsx)(j,{className:`h-4 w-4`})})}),(0,F.jsx)(ze,{children:(0,F.jsx)(`span`,{className:`block truncate`,children:t})})]}));ut.displayName=Re.displayName;var dt=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(qe,{ref:n,className:m(`-mx-1 my-1 h-px bg-muted`,e),...t}));dt.displayName=qe.displayName;var ft=N.forwardRef(({className:e,children:t,...n},r)=>(0,F.jsx)(`select`,{ref:r,className:m(`flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`,e),...n,children:t}));ft.displayName=`NativeSelect`;export{it as a,at as i,ct as n,P as o,ut as r,rt as t};
2
- //# sourceMappingURL=select-B30EsRTA.js.map
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{C as n,S as r,_ as i,b as a,d as o,h as s,i as c,l,m as u,o as d,p as f,r as p,s as m,u as h,x as g}from"./with-selector-NDLhu4dT.js";import{n as _,t as v}from"./dist-BSbFjTlr.js";import{n as y}from"./trash-2-DhyKQCKv.js";import{a as b,i as x,n as S,r as C,t as w}from"./dist-Dpg8xy_r.js";import{Dt as ee,Et as T,Tt as E,wt as D}from"./router-wFvtgo77.js";import{G as O,K as k,vt as A,yt as j}from"./index-BL8keDxQ.js";var M=e(n(),1),N=e(t(),1);function P(e){let t=N.useRef({value:e,previous:e});return N.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var F=r(),I=[` `,`Enter`,`ArrowUp`,`ArrowDown`],L=[` `,`Enter`],R=`Select`,[z,B,V]=_(R),[H,U]=g(R,[V,b]),W=b(),[te,G]=H(R),[ne,re]=H(R),ie=`SelectProvider`;function ae(e){let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:u,name:d,autoComplete:p,disabled:m,required:h,form:g,internal_do_not_use_render:_}=e,y=W(t),[b,S]=N.useState(null),[C,w]=N.useState(null),[ee,T]=N.useState(!1),E=v(u),[D,O]=f({prop:r,defaultProp:i??!1,onChange:a,caller:R}),[k,A]=f({prop:o,defaultProp:s,onChange:c,caller:R}),j=N.useRef(null),M=N.useRef(k);N.useEffect(()=>{let e=g?b?.ownerDocument.getElementById(g):b?.form;if(e instanceof HTMLFormElement){let t=()=>A(M.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[g,b,A]);let P=!b||!!g||!!b.closest(`form`),[I,L]=N.useState(new Set),B=l(),V=Array.from(I).map(e=>e.props.value).join(`;`),H=N.useCallback(e=>{L(t=>new Set(t).add(e))},[]),U=N.useCallback(e=>{L(t=>{let n=new Set(t);return n.delete(e),n})},[]),G={required:h,trigger:b,onTriggerChange:S,valueNode:C,onValueNodeChange:w,valueNodeHasChildren:ee,onValueNodeHasChildrenChange:T,contentId:B,value:k,onValueChange:A,open:D,onOpenChange:O,dir:E,triggerPointerDownPosRef:j,disabled:m,name:d,autoComplete:p,form:g,nativeOptions:I,nativeSelectKey:V,isFormControl:P};return(0,F.jsx)(x,{...y,children:(0,F.jsx)(te,{scope:t,...G,children:(0,F.jsx)(z.Provider,{scope:t,children:(0,F.jsx)(ne,{scope:t,onNativeOptionAdd:H,onNativeOptionRemove:U,children:Qe(_)?_(G):n})})})})}ae.displayName=ie;var K=e=>{let{__scopeSelect:t,children:n,...r}=e;return(0,F.jsx)(ae,{__scopeSelect:t,...r,internal_do_not_use_render:({isFormControl:e})=>(0,F.jsxs)(F.Fragment,{children:[n,e?(0,F.jsx)(Ze,{__scopeSelect:t}):null]})})};K.displayName=R;var oe=`SelectTrigger`,se=N.forwardRef((e,t)=>{let{__scopeSelect:n,disabled:r=!1,...i}=e,c=W(n),l=G(oe,n),u=l.disabled||r,d=a(t,l.onTriggerChange),f=B(n),p=N.useRef(`touch`),[m,h,g]=$e(e=>{let t=f().filter(e=>!e.disabled),n=et(t,e,t.find(e=>e.value===l.value));n!==void 0&&l.onValueChange(n.value)}),_=e=>{u||(l.onOpenChange(!0),g()),e&&(l.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})};return(0,F.jsx)(w,{asChild:!0,...c,children:(0,F.jsx)(o.button,{type:`button`,role:`combobox`,"aria-controls":l.open?l.contentId:void 0,"aria-expanded":l.open,"aria-required":l.required,"aria-autocomplete":`none`,dir:l.dir,"data-state":l.open?`open`:`closed`,disabled:u,"data-disabled":u?``:void 0,"data-placeholder":$(l.value)?``:void 0,...i,ref:d,onClick:s(i.onClick,e=>{e.currentTarget.focus(),p.current!==`mouse`&&_(e)}),onPointerDown:s(i.onPointerDown,e=>{p.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(_(e),e.preventDefault())}),onKeyDown:s(i.onKeyDown,e=>{let t=m.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&h(e.key),!(t&&e.key===` `)&&I.includes(e.key)&&(_(),e.preventDefault())})})})});se.displayName=oe;var ce=`SelectValue`,le=N.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,children:s,placeholder:c=``,...l}=e,d=G(ce,n),{onValueNodeHasChildrenChange:f}=d,p=s!==void 0,m=a(t,d.onValueNodeChange);u(()=>{f(p)},[f,p]);let h=$(d.value);return(0,F.jsx)(o.span,{...l,asChild:!h&&l.asChild,ref:m,style:{pointerEvents:`none`},children:(0,F.jsx)(N.Fragment,{children:h?c:s},h?`placeholder`:`value`)})});le.displayName=ce;var ue=`SelectIcon`,de=N.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,...i}=e;return(0,F.jsx)(o.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})});de.displayName=ue;var fe=`SelectPortal`,[pe,me]=H(fe,{forceMount:void 0}),he=e=>{let{__scopeSelect:t,forceMount:n,...r}=e;return(0,F.jsx)(pe,{scope:e.__scopeSelect,forceMount:n,children:(0,F.jsx)(p,{asChild:!0,...r})})};he.displayName=fe;var q=`SelectContent`,ge=N.forwardRef((e,t)=>{let n=me(q,e.__scopeSelect),{forceMount:r=n.forceMount,...i}=e,a=G(q,e.__scopeSelect),[o,s]=N.useState();return u(()=>{s(new DocumentFragment)},[]),(0,F.jsx)(h,{present:r||a.open,children:({present:e})=>e?(0,F.jsx)(xe,{...i,ref:t}):(0,F.jsx)(_e,{...i,fragment:o})})});ge.displayName=q;var _e=N.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,fragment:i}=e;return i?M.createPortal((0,F.jsx)(ve,{scope:n,children:(0,F.jsx)(z.Slot,{scope:n,children:(0,F.jsx)(`div`,{ref:t,children:r})})}),i):null});_e.displayName=`SelectContentFragment`;var J=10,[ve,Y]=H(q),ye=`SelectContentImpl`,be=i(`SelectContent.RemoveScroll`),xe=N.forwardRef((e,t)=>{let{__scopeSelect:n}=e,{position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:o,onPointerDownOutside:l,side:u,sideOffset:d,align:f,alignOffset:p,arrowPadding:m,collisionBoundary:h,collisionPadding:g,sticky:_,hideWhenDetached:v,avoidCollisions:y,...b}=e,x=G(q,n),[S,C]=N.useState(null),[w,O]=N.useState(null),k=a(t,C),[A,j]=N.useState(null),[M,P]=N.useState(null),I=B(n),[L,R]=N.useState(!1),z=N.useRef(!1);N.useEffect(()=>{if(S)return E(S)},[S]),ee();let V=N.useCallback(e=>{let[t,...n]=I().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&w&&(w.scrollTop=0),n===r&&w&&(w.scrollTop=w.scrollHeight),n?.focus(),document.activeElement!==i))return},[I,w]),H=N.useCallback(()=>V([A,S]),[V,A,S]);N.useEffect(()=>{L&&H()},[L,H]);let{onOpenChange:U,triggerPointerDownPosRef:W}=x;N.useEffect(()=>{if(S){let e={x:0,y:0},t=t=>{e={x:Math.abs(Math.round(t.pageX)-(W.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(W.current?.y??0))}},n=n=>{e.x<=10&&e.y<=10?n.preventDefault():n.composedPath().includes(S)||U(!1),document.removeEventListener(`pointermove`,t),W.current=null};return W.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[S,U,W]),N.useEffect(()=>{let e=()=>U(!1);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[U]);let[te,ne]=$e(e=>{let t=I().filter(e=>!e.disabled),n=et(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current?.focus())}),re=N.useCallback((e,t,n)=>{let r=!z.current&&!n;(x.value!==void 0&&x.value===t||r)&&(j(e),r&&(z.current=!0))},[x.value]),ie=N.useCallback(()=>S?.focus(),[S]),ae=N.useCallback((e,t,n)=>{let r=!z.current&&!n;(x.value!==void 0&&x.value===t||r)&&P(e)},[x.value]),K=r===`popper`?Te:Ce,oe=K===Te?{side:u,sideOffset:d,align:f,alignOffset:p,arrowPadding:m,collisionBoundary:h,collisionPadding:g,sticky:_,hideWhenDetached:v,avoidCollisions:y}:{};return(0,F.jsx)(ve,{scope:n,content:S,viewport:w,onViewportChange:O,itemRefCallback:re,selectedItem:A,onItemLeave:ie,itemTextRefCallback:ae,focusSelectedItem:H,selectedItemText:M,position:r,isPositioned:L,searchRef:te,children:(0,F.jsx)(D,{as:be,allowPinchZoom:!0,children:(0,F.jsx)(T,{asChild:!0,trapped:x.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:s(i,e=>{x.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,F.jsx)(c,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:l,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>x.onOpenChange(!1),children:(0,F.jsx)(K,{role:`listbox`,id:x.contentId,"data-state":x.open?`open`:`closed`,dir:x.dir,onContextMenu:e=>e.preventDefault(),...b,...oe,onPlaced:()=>R(!0),ref:k,style:{display:`flex`,flexDirection:`column`,outline:`none`,...b.style},onKeyDown:s(b.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&ne(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=I().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>V(t)),e.preventDefault()}})})})})})})});xe.displayName=ye;var Se=`SelectItemAlignedPosition`,Ce=N.forwardRef((e,t)=>{let{__scopeSelect:n,onPlaced:r,...i}=e,s=G(q,n),c=Y(q,n),[l,d]=N.useState(null),[f,p]=N.useState(null),m=a(t,p),h=B(n),g=N.useRef(!1),_=N.useRef(!0),{viewport:v,selectedItem:y,selectedItemText:b,focusSelectedItem:x}=c,S=N.useCallback(()=>{if(s.trigger&&s.valueNode&&l&&f&&v&&y&&b){let e=s.trigger.getBoundingClientRect(),t=f.getBoundingClientRect(),n=s.valueNode.getBoundingClientRect(),i=b.getBoundingClientRect();if(s.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,s=e.width+o,c=Math.max(s,t.width),u=window.innerWidth-J,d=k(a,[J,Math.max(J,u-c)]);l.style.minWidth=s+`px`,l.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,s=e.width+o,c=Math.max(s,t.width),u=window.innerWidth-J,d=k(a,[J,Math.max(J,u-c)]);l.style.minWidth=s+`px`,l.style.right=d+`px`}let a=h(),o=window.innerHeight-J*2,c=v.scrollHeight,u=window.getComputedStyle(f),d=parseInt(u.borderTopWidth,10),p=parseInt(u.paddingTop,10),m=parseInt(u.borderBottomWidth,10),_=parseInt(u.paddingBottom,10),x=d+p+c+_+m,S=Math.min(y.offsetHeight*5,x),C=window.getComputedStyle(v),w=parseInt(C.paddingTop,10),ee=parseInt(C.paddingBottom,10),T=e.top+e.height/2-J,E=o-T,D=y.offsetHeight/2,O=y.offsetTop+D,A=d+p+O,j=x-A;if(A<=T){let e=a.length>0&&y===a[a.length-1].ref.current;l.style.bottom=`0px`;let t=f.clientHeight-v.offsetTop-v.offsetHeight,n=A+Math.max(E,D+(e?ee:0)+t+m);l.style.height=n+`px`}else{let e=a.length>0&&y===a[0].ref.current;l.style.top=`0px`;let t=Math.max(T,d+v.offsetTop+(e?w:0)+D)+j;l.style.height=t+`px`,v.scrollTop=A-T+v.offsetTop}l.style.margin=`${J}px 0`,l.style.minHeight=S+`px`,l.style.maxHeight=o+`px`,r?.(),requestAnimationFrame(()=>g.current=!0)}},[h,s.trigger,s.valueNode,l,f,v,y,b,s.dir,r]);u(()=>S(),[S]);let[C,w]=N.useState();return u(()=>{f&&w(window.getComputedStyle(f).zIndex)},[f]),(0,F.jsx)(Ee,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:g,onScrollButtonChange:N.useCallback(e=>{e&&_.current===!0&&(S(),x?.(),_.current=!1)},[S,x]),children:(0,F.jsx)(`div`,{ref:d,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:C},children:(0,F.jsx)(o.div,{...i,ref:m,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})});Ce.displayName=Se;var we=`SelectPopperPosition`,Te=N.forwardRef((e,t)=>{let{__scopeSelect:n,align:r=`start`,collisionPadding:i=J,...a}=e,o=W(n);return(0,F.jsx)(C,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})});Te.displayName=we;var[Ee,De]=H(q,{}),Oe=`SelectViewport`,ke=N.forwardRef((e,t)=>{let{__scopeSelect:n,nonce:r,...i}=e,c=Y(Oe,n),l=De(Oe,n),u=a(t,c.onViewportChange),d=N.useRef(0);return(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,F.jsx)(z.Slot,{scope:n,children:(0,F.jsx)(o.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:u,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:s(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=l;if(r?.current&&n){let e=Math.abs(d.current-t.scrollTop);if(e>0){let r=window.innerHeight-J*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}d.current=t.scrollTop})})})]})});ke.displayName=Oe;var Ae=`SelectGroup`,[je,Me]=H(Ae),Ne=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=l();return(0,F.jsx)(je,{scope:n,id:i,children:(0,F.jsx)(o.div,{role:`group`,"aria-labelledby":i,...r,ref:t})})});Ne.displayName=Ae;var Pe=`SelectLabel`,Fe=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=Me(Pe,n);return(0,F.jsx)(o.div,{id:i.id,...r,ref:t})});Fe.displayName=Pe;var X=`SelectItem`,[Ie,Le]=H(X),Re=N.forwardRef((e,t)=>{let{__scopeSelect:n,value:r,disabled:i=!1,textValue:c,...u}=e,f=G(X,n),p=Y(X,n),m=f.value===r,[h,g]=N.useState(c??``),[_,v]=N.useState(!1),y=a(t,d(e=>p.itemRefCallback?.(e,r,i))),b=l(),x=N.useRef(`touch`),S=()=>{i||(f.onValueChange(r),f.onOpenChange(!1))};return(0,F.jsx)(Ie,{scope:n,value:r,disabled:i,textId:b,isSelected:m,onItemTextChange:N.useCallback(e=>{g(t=>t||(e?.textContent??``).trim())},[]),children:(0,F.jsx)(z.ItemSlot,{scope:n,value:r,disabled:i,textValue:h,children:(0,F.jsx)(o.div,{role:`option`,"aria-labelledby":b,"data-highlighted":_?``:void 0,"aria-selected":m&&_,"data-state":m?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...u,ref:y,onFocus:s(u.onFocus,()=>v(!0)),onBlur:s(u.onBlur,()=>v(!1)),onClick:s(u.onClick,()=>{x.current!==`mouse`&&S()}),onPointerUp:s(u.onPointerUp,()=>{x.current===`mouse`&&S()}),onPointerDown:s(u.onPointerDown,e=>{x.current=e.pointerType}),onPointerMove:s(u.onPointerMove,e=>{x.current=e.pointerType,i?p.onItemLeave?.():x.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:s(u.onPointerLeave,e=>{e.currentTarget===document.activeElement&&p.onItemLeave?.()}),onKeyDown:s(u.onKeyDown,e=>{i||e.target!==e.currentTarget||p.searchRef?.current!==``&&e.key===` `||(L.includes(e.key)&&S(),e.key===` `&&e.preventDefault())})})})})});Re.displayName=X;var Z=`SelectItemText`,ze=N.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,...s}=e,c=G(Z,n),l=Y(Z,n),f=Le(Z,n),p=re(Z,n),[m,h]=N.useState(null),g=d(e=>l.itemTextRefCallback?.(e,f.value,f.disabled)),_=a(t,h,f.onItemTextChange,g),v=m?.textContent,y=N.useMemo(()=>(0,F.jsx)(`option`,{value:f.value,disabled:f.disabled,children:v},f.value),[f.disabled,f.value,v]),{onNativeOptionAdd:b,onNativeOptionRemove:x}=p;return u(()=>(b(y),()=>x(y)),[b,x,y]),(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(o.span,{id:f.textId,...s,ref:_}),f.isSelected&&c.valueNode&&!c.valueNodeHasChildren&&!$(c.value)?M.createPortal(s.children,c.valueNode):null]})});ze.displayName=Z;var Be=`SelectItemIndicator`,Ve=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return Le(Be,n).isSelected?(0,F.jsx)(o.span,{"aria-hidden":!0,...r,ref:t}):null});Ve.displayName=Be;var He=`SelectScrollUpButton`,Q=N.forwardRef((e,t)=>{let n=Y(He,e.__scopeSelect),r=De(He,e.__scopeSelect),[i,o]=N.useState(!1),s=a(t,r.onScrollButtonChange);return u(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollTop>0;o(e)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,F.jsx)(Ge,{...e,ref:s,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null});Q.displayName=He;var Ue=`SelectScrollDownButton`,We=N.forwardRef((e,t)=>{let n=Y(Ue,e.__scopeSelect),r=De(Ue,e.__scopeSelect),[i,o]=N.useState(!1),s=a(t,r.onScrollButtonChange);return u(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight,n=Math.ceil(t.scrollTop)<e;o(n)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,F.jsx)(Ge,{...e,ref:s,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null});We.displayName=Ue;var Ge=N.forwardRef((e,t)=>{let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=Y(`SelectScrollButton`,n),c=N.useRef(null),l=B(n),d=N.useCallback(()=>{c.current!==null&&(window.clearInterval(c.current),c.current=null)},[]);return N.useEffect(()=>()=>d(),[d]),u(()=>{l().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[l]),(0,F.jsx)(o.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:s(i.onPointerDown,()=>{c.current===null&&(c.current=window.setInterval(r,50))}),onPointerMove:s(i.onPointerMove,()=>{a.onItemLeave?.(),c.current===null&&(c.current=window.setInterval(r,50))}),onPointerLeave:s(i.onPointerLeave,()=>{d()})})}),Ke=`SelectSeparator`,qe=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return(0,F.jsx)(o.div,{"aria-hidden":!0,...r,ref:t})});qe.displayName=Ke;var Je=`SelectArrow`,Ye=N.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=W(n);return Y(Je,n).position===`popper`?(0,F.jsx)(S,{...i,...r,ref:t}):null});Ye.displayName=Je;var Xe=`SelectBubbleInput`,Ze=N.forwardRef(({__scopeSelect:e,...t},n)=>{let r=G(Xe,e),{value:i,onValueChange:s,required:c,disabled:l,name:u,autoComplete:d,form:f}=r,{nativeOptions:p,nativeSelectKey:m}=r,h=N.useRef(null),g=a(n,h),_=i??``,v=P(_),y=Array.from(p).some(e=>(e.props.value??``)===``);return N.useEffect(()=>{let e=h.current;if(!e)return;let t=window.HTMLSelectElement.prototype,n=Object.getOwnPropertyDescriptor(t,`value`).set;if(v!==_&&n){let t=new Event(`change`,{bubbles:!0});n.call(e,_),e.dispatchEvent(t)}},[v,_]),(0,F.jsxs)(o.select,{"aria-hidden":!0,required:c,tabIndex:-1,name:u,autoComplete:d,disabled:l,form:f,onChange:e=>s(e.target.value),...t,style:{...O,...t.style},ref:g,defaultValue:_,children:[$(i)&&!y?(0,F.jsx)(`option`,{value:``}):null,Array.from(p)]},m)});Ze.displayName=Xe;function Qe(e){return typeof e==`function`}function $(e){return e===``||e===void 0}function $e(e){let t=d(e),n=N.useRef(``),r=N.useRef(0),i=N.useCallback(e=>{let i=n.current+e;t(i),(function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))})(i)},[t]),a=N.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return N.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}function et(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=tt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function tt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function nt({onValueChange:e,...t}){let n=N.useCallback(t=>{t!==``&&e?.(t)},[e]);return(0,F.jsx)(K,{onValueChange:n,...t})}nt.displayName=`Select`;var rt=nt,it=le,at=N.forwardRef(({className:e,children:t,onMouseEnter:n,...r},i)=>(0,F.jsxs)(se,{ref:i,className:m(`flex h-9 w-full cursor-pointer items-center justify-between rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1`,e),onMouseEnter:e=>{let t=e.currentTarget.querySelector(`span`);t&&t.scrollWidth>t.offsetWidth?e.currentTarget.title=t.textContent??``:e.currentTarget.removeAttribute(`title`),n?.(e)},...r,children:[t,(0,F.jsx)(de,{asChild:!0,children:(0,F.jsx)(A,{className:`h-4 w-4 opacity-50`})})]}));at.displayName=se.displayName;var ot=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(Q,{ref:n,className:m(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,F.jsx)(y,{className:`h-4 w-4`})}));ot.displayName=Q.displayName;var st=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(We,{ref:n,className:m(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,F.jsx)(A,{className:`h-4 w-4`})}));st.displayName=We.displayName;var ct=N.forwardRef(({className:e,children:t,position:n=`popper`,...r},i)=>(0,F.jsx)(he,{children:(0,F.jsxs)(ge,{ref:i,className:m(`relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1`,e),position:n,...r,children:[(0,F.jsx)(ot,{}),(0,F.jsx)(ke,{className:m(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`),children:t}),(0,F.jsx)(st,{})]})}));ct.displayName=ge.displayName;var lt=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(Fe,{ref:n,className:m(`px-2 py-1.5 text-sm font-semibold`,e),...t}));lt.displayName=Fe.displayName;var ut=N.forwardRef(({className:e,children:t,...n},r)=>(0,F.jsxs)(Re,{ref:r,className:m(`relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,e),title:typeof t==`string`?t:void 0,...n,children:[(0,F.jsx)(`span`,{className:`absolute left-2 flex h-3.5 w-3.5 items-center justify-center`,children:(0,F.jsx)(Ve,{children:(0,F.jsx)(j,{className:`h-4 w-4`})})}),(0,F.jsx)(ze,{children:(0,F.jsx)(`span`,{className:`block truncate`,children:t})})]}));ut.displayName=Re.displayName;var dt=N.forwardRef(({className:e,...t},n)=>(0,F.jsx)(qe,{ref:n,className:m(`-mx-1 my-1 h-px bg-muted`,e),...t}));dt.displayName=qe.displayName;var ft=N.forwardRef(({className:e,children:t,...n},r)=>(0,F.jsx)(`select`,{ref:r,className:m(`flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`,e),...n,children:t}));ft.displayName=`NativeSelect`;export{it as a,at as i,ct as n,P as o,ut as r,rt as t};
2
+ //# sourceMappingURL=select-CR4acjX0.js.map