@shapio/cms 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 (156) hide show
  1. package/dist/admin/assets/{AssetTile-C-Mu0BRF.js → AssetTile-CoNClUYS.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-C-Mu0BRF.js.map → AssetTile-CoNClUYS.js.map} +1 -1
  3. package/dist/admin/assets/{AssistError-B-bnaHhJ.js → AssistError-BoejyShH.js} +2 -2
  4. package/dist/admin/assets/{AssistError-B-bnaHhJ.js.map → AssistError-BoejyShH.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-Dn9WULjL.js → BlockMenuItems-B2Jugisa.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-Dn9WULjL.js.map → BlockMenuItems-B2Jugisa.js.map} +1 -1
  7. package/dist/admin/assets/{Body-C0SwduLi.js → Body-D3GwLGaB.js} +2 -2
  8. package/dist/admin/assets/{Body-C0SwduLi.js.map → Body-D3GwLGaB.js.map} +1 -1
  9. package/dist/admin/assets/Builder-CmT5-8hI.js +2 -0
  10. package/dist/admin/assets/Builder-CmT5-8hI.js.map +1 -0
  11. package/dist/admin/assets/{ConfirmDialog-BfpN2MQx.js → ConfirmDialog-HS8Gc2t3.js} +2 -2
  12. package/dist/admin/assets/{ConfirmDialog-BfpN2MQx.js.map → ConfirmDialog-HS8Gc2t3.js.map} +1 -1
  13. package/dist/admin/assets/{CopyButton-Dxbzp7hC.js → CopyButton-DS-bAA23.js} +2 -2
  14. package/dist/admin/assets/{CopyButton-Dxbzp7hC.js.map → CopyButton-DS-bAA23.js.map} +1 -1
  15. package/dist/admin/assets/{CursorPager-DkZs6rPg.js → CursorPager-C6PyD3wE.js} +2 -2
  16. package/dist/admin/assets/{CursorPager-DkZs6rPg.js.map → CursorPager-C6PyD3wE.js.map} +1 -1
  17. package/dist/admin/assets/{FocalPoint-r1MG_y-r.js → FocalPoint-C62fRhmM.js} +2 -2
  18. package/dist/admin/assets/{FocalPoint-r1MG_y-r.js.map → FocalPoint-C62fRhmM.js.map} +1 -1
  19. package/dist/admin/assets/{Form-D8vp4Kd_.js → Form-CLEr5Csd.js} +2 -2
  20. package/dist/admin/assets/{Form-D8vp4Kd_.js.map → Form-CLEr5Csd.js.map} +1 -1
  21. package/dist/admin/assets/{FormCheckboxGroup-8ObPh9cH.js → FormCheckboxGroup-BrXY6qBg.js} +2 -2
  22. package/dist/admin/assets/{FormCheckboxGroup-8ObPh9cH.js.map → FormCheckboxGroup-BrXY6qBg.js.map} +1 -1
  23. package/dist/admin/assets/{FormRadioGroup-CAB3qzVS.js → FormRadioGroup-BjE1Jhar.js} +2 -2
  24. package/dist/admin/assets/{FormRadioGroup-CAB3qzVS.js.map → FormRadioGroup-BjE1Jhar.js.map} +1 -1
  25. package/dist/admin/assets/{FormSelectField-C7hE05Wq.js → FormSelectField-g4zrUlhv.js} +2 -2
  26. package/dist/admin/assets/{FormSelectField-C7hE05Wq.js.map → FormSelectField-g4zrUlhv.js.map} +1 -1
  27. package/dist/admin/assets/{FormSwitchField-7EEYkGOH.js → FormSwitchField-gciThNGV.js} +2 -2
  28. package/dist/admin/assets/{FormSwitchField-7EEYkGOH.js.map → FormSwitchField-gciThNGV.js.map} +1 -1
  29. package/dist/admin/assets/{FormTextareaField-BasuRoXW.js → FormTextareaField-tsS-UXym.js} +2 -2
  30. package/dist/admin/assets/{FormTextareaField-BasuRoXW.js.map → FormTextareaField-tsS-UXym.js.map} +1 -1
  31. package/dist/admin/assets/{HintedLabel-BDV81kIT.js → HintedLabel-CVe-PIyv.js} +2 -2
  32. package/dist/admin/assets/{HintedLabel-BDV81kIT.js.map → HintedLabel-CVe-PIyv.js.map} +1 -1
  33. package/dist/admin/assets/{InfoHint-DWn9kLf1.js → InfoHint-DtaHU1Cg.js} +2 -2
  34. package/dist/admin/assets/{InfoHint-DWn9kLf1.js.map → InfoHint-DtaHU1Cg.js.map} +1 -1
  35. package/dist/admin/assets/{InsertMenuItem-DhJk5BeH.js → InsertMenuItem-DlzaD9zr.js} +2 -2
  36. package/dist/admin/assets/{InsertMenuItem-DhJk5BeH.js.map → InsertMenuItem-DlzaD9zr.js.map} +1 -1
  37. package/dist/admin/assets/{Match-Zu4pwfCC.js → Match-ErAxnNAY.js} +2 -2
  38. package/dist/admin/assets/{Match-Zu4pwfCC.js.map → Match-ErAxnNAY.js.map} +1 -1
  39. package/dist/admin/assets/{QueryView-Cu-KPtQI.js → QueryView-C630REML.js} +2 -2
  40. package/dist/admin/assets/{QueryView-Cu-KPtQI.js.map → QueryView-C630REML.js.map} +1 -1
  41. package/dist/admin/assets/{RadioTile-Ci0LucKI.js → RadioTile-CD4mel7U.js} +2 -2
  42. package/dist/admin/assets/{RadioTile-Ci0LucKI.js.map → RadioTile-CD4mel7U.js.map} +1 -1
  43. package/dist/admin/assets/{RichTextField-BcYOFkeW.js → RichTextField-CxeVX6C-.js} +2 -2
  44. package/dist/admin/assets/{RichTextField-BcYOFkeW.js.map → RichTextField-CxeVX6C-.js.map} +1 -1
  45. package/dist/admin/assets/{RowTitle-BdDgA5Lb.js → RowTitle-B-7RptyN.js} +2 -2
  46. package/dist/admin/assets/{RowTitle-BdDgA5Lb.js.map → RowTitle-B-7RptyN.js.map} +1 -1
  47. package/dist/admin/assets/{SecretReveal-ai1uMW_b.js → SecretReveal-Dhw_dYxe.js} +2 -2
  48. package/dist/admin/assets/{SecretReveal-ai1uMW_b.js.map → SecretReveal-Dhw_dYxe.js.map} +1 -1
  49. package/dist/admin/assets/{SharedGlyph-y6ZsA_gz.js → SharedGlyph-97RaO6Bh.js} +2 -2
  50. package/dist/admin/assets/{SharedGlyph-y6ZsA_gz.js.map → SharedGlyph-97RaO6Bh.js.map} +1 -1
  51. package/dist/admin/assets/{StepList-xmD9CPZl.js → StepList--0Fiqsq-.js} +2 -2
  52. package/dist/admin/assets/{StepList-xmD9CPZl.js.map → StepList--0Fiqsq-.js.map} +1 -1
  53. package/dist/admin/assets/Structure-CoO3iah3.js +2 -0
  54. package/dist/admin/assets/{Structure-DGt-TDk5.js.map → Structure-CoO3iah3.js.map} +1 -1
  55. package/dist/admin/assets/{SuggestAltButton-D1-v_0wB.js → SuggestAltButton-Dlyxoypu.js} +2 -2
  56. package/dist/admin/assets/{SuggestAltButton-D1-v_0wB.js.map → SuggestAltButton-Dlyxoypu.js.map} +1 -1
  57. package/dist/admin/assets/{Thumbnail-cjA7fSWh.js → Thumbnail-BUYOr4XJ.js} +2 -2
  58. package/dist/admin/assets/{Thumbnail-cjA7fSWh.js.map → Thumbnail-BUYOr4XJ.js.map} +1 -1
  59. package/dist/admin/assets/{UnsavedChangesGuard-B57D0278.js → UnsavedChangesGuard-BfzHgUkF.js} +2 -2
  60. package/dist/admin/assets/{UnsavedChangesGuard-B57D0278.js.map → UnsavedChangesGuard-BfzHgUkF.js.map} +1 -1
  61. package/dist/admin/assets/{UserAvatar--pMv2i3c.js → UserAvatar-DNOWhSWS.js} +2 -2
  62. package/dist/admin/assets/{UserAvatar--pMv2i3c.js.map → UserAvatar-DNOWhSWS.js.map} +1 -1
  63. package/dist/admin/assets/{badge-C5oMRtwJ.js → badge-lJ4Ih_Zn.js} +2 -2
  64. package/dist/admin/assets/{badge-C5oMRtwJ.js.map → badge-lJ4Ih_Zn.js.map} +1 -1
  65. package/dist/admin/assets/{changeSets-CObZV8H2.js → changeSets-JmSyu3tu.js} +2 -2
  66. package/dist/admin/assets/{changeSets-CObZV8H2.js.map → changeSets-JmSyu3tu.js.map} +1 -1
  67. package/dist/admin/assets/{constants-DT4WPUvz.js → constants-ahk0YSYl.js} +2 -2
  68. package/dist/admin/assets/{constants-DT4WPUvz.js.map → constants-ahk0YSYl.js.map} +1 -1
  69. package/dist/admin/assets/content-DcvNzKGe.js +3 -0
  70. package/dist/admin/assets/content-DcvNzKGe.js.map +1 -0
  71. package/dist/admin/assets/{contentTypes-ArLEfM29.js → contentTypes-YAd-AzOF.js} +2 -2
  72. package/dist/admin/assets/{contentTypes-ArLEfM29.js.map → contentTypes-YAd-AzOF.js.map} +1 -1
  73. package/dist/admin/assets/{develop-DvKYqVeK.js → develop-DYwiTd6R.js} +3 -3
  74. package/dist/admin/assets/{develop-DvKYqVeK.js.map → develop-DYwiTd6R.js.map} +1 -1
  75. package/dist/admin/assets/{dropdown-menu-DPzDthV7.js → dropdown-menu-DiYSm-g3.js} +2 -2
  76. package/dist/admin/assets/{dropdown-menu-DPzDthV7.js.map → dropdown-menu-DiYSm-g3.js.map} +1 -1
  77. package/dist/admin/assets/{fileRoute-sJvv4Ipn.js → fileRoute-CVQpW8cj.js} +2 -2
  78. package/dist/admin/assets/{fileRoute-sJvv4Ipn.js.map → fileRoute-CVQpW8cj.js.map} +1 -1
  79. package/dist/admin/assets/{followPlural-tOh6gDgT.js → followPlural-BdqfEe48.js} +2 -2
  80. package/dist/admin/assets/{followPlural-tOh6gDgT.js.map → followPlural-BdqfEe48.js.map} +1 -1
  81. package/dist/admin/assets/{inbox-nfR2K7f6.js → inbox-CnzNfqt9.js} +2 -2
  82. package/dist/admin/assets/{inbox-nfR2K7f6.js.map → inbox-CnzNfqt9.js.map} +1 -1
  83. package/dist/admin/assets/index-6iVBpUhu.css +2 -0
  84. package/dist/admin/assets/index-D9KL7arJ.js +4 -0
  85. package/dist/admin/assets/index-D9KL7arJ.js.map +1 -0
  86. package/dist/admin/assets/{media-BzivlEh2.js → media-Cs9LCQcz.js} +2 -2
  87. package/dist/admin/assets/{media-BzivlEh2.js.map → media-Cs9LCQcz.js.map} +1 -1
  88. package/dist/admin/assets/{network-Cj04CpFi.js → network-DS8MW3AZ.js} +2 -2
  89. package/dist/admin/assets/{network-Cj04CpFi.js.map → network-DS8MW3AZ.js.map} +1 -1
  90. package/dist/admin/assets/{publishing-ChHkrwvr.js → publishing-C4YQ4XKt.js} +2 -2
  91. package/dist/admin/assets/{publishing-ChHkrwvr.js.map → publishing-C4YQ4XKt.js.map} +1 -1
  92. package/dist/admin/assets/{radio-group-DSK5LPaM.js → radio-group-zOsGAYRP.js} +2 -2
  93. package/dist/admin/assets/{radio-group-DSK5LPaM.js.map → radio-group-zOsGAYRP.js.map} +1 -1
  94. package/dist/admin/assets/{searchSchemas-BdwAFaVO.js → searchSchemas-BCRZ1jyL.js} +2 -2
  95. package/dist/admin/assets/{searchSchemas-BdwAFaVO.js.map → searchSchemas-BCRZ1jyL.js.map} +1 -1
  96. package/dist/admin/assets/{sections-iNOzo7pL.js → sections-v5Flaor9.js} +2 -2
  97. package/dist/admin/assets/{sections-iNOzo7pL.js.map → sections-v5Flaor9.js.map} +1 -1
  98. package/dist/admin/assets/{select-DyD7qIkJ.js → select-CpHp3YOH.js} +2 -2
  99. package/dist/admin/assets/{select-DyD7qIkJ.js.map → select-CpHp3YOH.js.map} +1 -1
  100. package/dist/admin/assets/{seo-uMm2fGPB.js → seo-1n9s7YuX.js} +2 -2
  101. package/dist/admin/assets/{seo-uMm2fGPB.js.map → seo-1n9s7YuX.js.map} +1 -1
  102. package/dist/admin/assets/{settings-CJVORrIV.js → settings-CuEO5l07.js} +2 -2
  103. package/dist/admin/assets/{settings-CJVORrIV.js.map → settings-CuEO5l07.js.map} +1 -1
  104. package/dist/admin/assets/{skeleton-B5GJgv7y.js → skeleton-DElTumgk.js} +2 -2
  105. package/dist/admin/assets/skeleton-DElTumgk.js.map +1 -0
  106. package/dist/admin/assets/src-Be3Ds5Dc.js +4 -0
  107. package/dist/admin/assets/src-Be3Ds5Dc.js.map +1 -0
  108. package/dist/admin/assets/{switch-DbIrjP3h.js → switch-CijNGYkG.js} +2 -2
  109. package/dist/admin/assets/{switch-DbIrjP3h.js.map → switch-CijNGYkG.js.map} +1 -1
  110. package/dist/admin/assets/tabs-CSqGW9Du.js +5 -0
  111. package/dist/admin/assets/tabs-CSqGW9Du.js.map +1 -0
  112. package/dist/admin/assets/{theme-C0Tv6M38.js → theme-CHHVK8Ps.js} +2 -2
  113. package/dist/admin/assets/{theme-C0Tv6M38.js.map → theme-CHHVK8Ps.js.map} +1 -1
  114. package/dist/admin/assets/{titles-uL13bpi8.js → titles-CQYc9nDQ.js} +2 -2
  115. package/dist/admin/assets/{titles-uL13bpi8.js.map → titles-CQYc9nDQ.js.map} +1 -1
  116. package/dist/admin/assets/{tooltip-BK5FqmJ0.js → tooltip-BXqFQv9N.js} +2 -2
  117. package/dist/admin/assets/{tooltip-BK5FqmJ0.js.map → tooltip-BXqFQv9N.js.map} +1 -1
  118. package/dist/admin/assets/{useContentSchema-BCdLYsKa.js → useContentSchema-Cvtes34f.js} +2 -2
  119. package/dist/admin/assets/{useContentSchema-BCdLYsKa.js.map → useContentSchema-Cvtes34f.js.map} +1 -1
  120. package/dist/admin/assets/{useDiscardGuard-CGFgC3xY.js → useDiscardGuard-BAEGkGK9.js} +2 -2
  121. package/dist/admin/assets/{useDiscardGuard-CGFgC3xY.js.map → useDiscardGuard-BAEGkGK9.js.map} +1 -1
  122. package/dist/admin/assets/{useMediaPickerDialog-BOkGEyG7.js → useMediaPickerDialog-CiN_pias.js} +2 -2
  123. package/dist/admin/assets/{useMediaPickerDialog-BOkGEyG7.js.map → useMediaPickerDialog-CiN_pias.js.map} +1 -1
  124. package/dist/admin/assets/{useMediaUploader-D1ouV8jc.js → useMediaUploader-CapEHBIt.js} +2 -2
  125. package/dist/admin/assets/{useMediaUploader-D1ouV8jc.js.map → useMediaUploader-CapEHBIt.js.map} +1 -1
  126. package/dist/admin/assets/usePaletteItems-wpn3ms6o.js +2 -0
  127. package/dist/admin/assets/usePaletteItems-wpn3ms6o.js.map +1 -0
  128. package/dist/admin/assets/{useResolvedScheme-D0moXjaP.js → useResolvedScheme-i1EwGHuF.js} +2 -2
  129. package/dist/admin/assets/{useResolvedScheme-D0moXjaP.js.map → useResolvedScheme-i1EwGHuF.js.map} +1 -1
  130. package/dist/admin/assets/{zod-CS0EvbwG.js → zod-79xzBIrW.js} +2 -2
  131. package/dist/admin/assets/{zod-CS0EvbwG.js.map → zod-79xzBIrW.js.map} +1 -1
  132. package/dist/admin/index.html +27 -27
  133. package/dist/cli.js +1 -1
  134. package/dist/config.d.ts +1 -1
  135. package/dist/index.d.ts +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/{public-BSbOGbK-.d.ts → public-CTK82y3t.d.ts} +2 -1
  138. package/dist/{worker-i1rY2TIZ.js → worker-BDYDbaea.js} +404 -201
  139. package/dist/worker-BDYDbaea.js.map +1 -0
  140. package/package.json +5 -5
  141. package/dist/admin/assets/Builder-C11yUgu9.js +0 -2
  142. package/dist/admin/assets/Builder-C11yUgu9.js.map +0 -1
  143. package/dist/admin/assets/Structure-DGt-TDk5.js +0 -2
  144. package/dist/admin/assets/content-HvisCB5m.js +0 -3
  145. package/dist/admin/assets/content-HvisCB5m.js.map +0 -1
  146. package/dist/admin/assets/index-Bbb2ER3l.css +0 -2
  147. package/dist/admin/assets/index-C6FrF34G.js +0 -4
  148. package/dist/admin/assets/index-C6FrF34G.js.map +0 -1
  149. package/dist/admin/assets/skeleton-B5GJgv7y.js.map +0 -1
  150. package/dist/admin/assets/src-B2qcqjNM.js +0 -4
  151. package/dist/admin/assets/src-B2qcqjNM.js.map +0 -1
  152. package/dist/admin/assets/tabs-BJhfL-lw.js +0 -5
  153. package/dist/admin/assets/tabs-BJhfL-lw.js.map +0 -1
  154. package/dist/admin/assets/usePaletteItems-neKzBlys.js +0 -2
  155. package/dist/admin/assets/usePaletteItems-neKzBlys.js.map +0 -1
  156. package/dist/worker-i1rY2TIZ.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{A as e,k as t,p as n}from"./cn-CL1YHRrS.js";import{n as r,r as i}from"./src-B2qcqjNM.js";var a=(e,t)=>t.includes(e)?e:t[0]??e,o=(e,t)=>`${e}:${t}`,s=[{key:`shapio`,variants:[`dark`]},{key:`classic`,variants:[`dark`]},{key:`murdered-out`,variants:[`dark`]},{key:`forest`,variants:[`dark`]},{key:`snowed`,variants:[`light`]},{key:`butter`,variants:[`light`]}],c=`shapio`,l=[`dark`],u=`shapio.theme`,d=3,f={theme:c,appearance:`dark`,variants:l},p={theme:`classic`,appearance:`dark`,variants:[`dark`]},m=e=>typeof e==`object`&&!!e,h=e=>typeof e==`string`&&i.includes(e),g=(e,t)=>t<2?p:_(m(e)?e:{}),_=e=>{let t=typeof e.theme==`string`&&r.test(e.theme)?e.theme:f.theme,n=Array.isArray(e.variants)?i.filter(t=>e.variants.includes(t)):[],o=s.find(e=>e.key===t)?.variants??(n.length>0?n:f.variants);return{theme:t,appearance:a(h(e.appearance)?e.appearance:o[0]??`dark`,o),variants:o}},v=n()(e(e=>({...f,setLook:(t,n,r)=>e({theme:t,appearance:n,variants:r})}),{name:u,storage:t,version:d,migrate:g,partialize:({theme:e,appearance:t,variants:n})=>({theme:e,appearance:t,variants:n}),merge:(e,t)=>({...t,..._(m(e)?e:{})})}));export{o as a,l as i,s as n,a as o,c as r,v as t};
2
- //# sourceMappingURL=theme-C0Tv6M38.js.map
1
+ import{A as e,k as t,p as n}from"./cn-CL1YHRrS.js";import{n as r,r as i}from"./src-Be3Ds5Dc.js";var a=(e,t)=>t.includes(e)?e:t[0]??e,o=(e,t)=>`${e}:${t}`,s=[{key:`shapio`,variants:[`dark`]},{key:`classic`,variants:[`dark`]},{key:`murdered-out`,variants:[`dark`]},{key:`forest`,variants:[`dark`]},{key:`snowed`,variants:[`light`]},{key:`butter`,variants:[`light`]}],c=`shapio`,l=[`dark`],u=`shapio.theme`,d=3,f={theme:c,appearance:`dark`,variants:l},p={theme:`classic`,appearance:`dark`,variants:[`dark`]},m=e=>typeof e==`object`&&!!e,h=e=>typeof e==`string`&&i.includes(e),g=(e,t)=>t<2?p:_(m(e)?e:{}),_=e=>{let t=typeof e.theme==`string`&&r.test(e.theme)?e.theme:f.theme,n=Array.isArray(e.variants)?i.filter(t=>e.variants.includes(t)):[],o=s.find(e=>e.key===t)?.variants??(n.length>0?n:f.variants);return{theme:t,appearance:a(h(e.appearance)?e.appearance:o[0]??`dark`,o),variants:o}},v=n()(e(e=>({...f,setLook:(t,n,r)=>e({theme:t,appearance:n,variants:r})}),{name:u,storage:t,version:d,migrate:g,partialize:({theme:e,appearance:t,variants:n})=>({theme:e,appearance:t,variants:n}),merge:(e,t)=>({...t,..._(m(e)?e:{})})}));export{o as a,l as i,s as n,a as o,c as r,v as t};
2
+ //# sourceMappingURL=theme-CHHVK8Ps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-C0Tv6M38.js","names":["persist","persistentStorage","create","THEME_KEY_PATTERN","THEME_VARIANTS","resolveScheme","variants","appearance","lookValue","theme","variant","BUILT_IN_THEMES","DEFAULT_THEME_KEY","DEFAULT_THEME_VARIANTS","THEME_STORAGE_KEY","THEME_STORAGE_VERSION","DEFAULT_THEME_STATE","LEGACY_THEME_STATE","isRecord","value","isThemeVariant","migrateThemeState","version","sanitizeThemeState","persisted","state","cached","meta","useThemeStore","set","current"],"sources":["../../src/helpers/theme.ts","../../src/constants/themes.ts","../../src/stores/theme.ts"],"sourcesContent":["import type { ThemeVariant } from '@shapio/schema';\n\n/**\n * The variant actually rendered: the saved one when the theme has it, else the theme's first. Nothing follows\n * the operating system. public/theme-init.js repeats this before first paint (test/themeInit.test.ts keeps\n * the two in step).\n */\nexport const resolveScheme = (appearance: ThemeVariant, variants: readonly ThemeVariant[]): ThemeVariant =>\n variants.includes(appearance) ? appearance : (variants[0] ?? appearance);\n\n/** A look is one variant of one theme; its radio value is `<theme key>:<variant>` (keys never hold a colon). */\nexport const lookValue = (theme: string, variant: ThemeVariant) => `${theme}:${variant}`;\n","import type { BuiltInThemeKey, ThemeVariant } from '@shapio/schema';\n\nexport type BuiltInThemeMeta = {\n key: BuiltInThemeKey;\n /** The one variant the theme defines (styles/themes/<key>.css): every built-in theme is a single look. */\n variants: readonly ThemeVariant[];\n};\n\n/** The admin's own looks, in menu order: dark, then light. Names and descriptions: `appearance.themes.<key>.*`. */\nexport const BUILT_IN_THEMES: readonly BuiltInThemeMeta[] = [\n { key: 'shapio', variants: ['dark'] },\n { key: 'classic', variants: ['dark'] },\n { key: 'murdered-out', variants: ['dark'] },\n { key: 'forest', variants: ['dark'] },\n { key: 'snowed', variants: ['light'] },\n { key: 'butter', variants: ['light'] },\n];\n\nexport const DEFAULT_THEME_KEY: BuiltInThemeKey = 'shapio';\n\nexport const DEFAULT_THEME_VARIANTS: readonly ThemeVariant[] = ['dark'];\n","import { THEME_KEY_PATTERN, THEME_VARIANTS, type ThemeVariant } from '@shapio/schema';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { BUILT_IN_THEMES, DEFAULT_THEME_KEY, DEFAULT_THEME_VARIANTS } from '@/constants/themes';\nimport { persistentStorage } from '@/helpers/safeStorage';\nimport { resolveScheme } from '@/helpers/theme';\n\ntype ThemeState = {\n /** A theme key: built in (constants/themes.ts) or declared by an extension. */\n theme: string;\n /** The variant of that theme the person picked (a look is one theme in one variant). */\n appearance: ThemeVariant;\n /**\n * The chosen theme's variants, cached so public/theme-init.js can render an extension theme's look before\n * the admin has loaded the theme list.\n */\n variants: readonly ThemeVariant[];\n setLook: (theme: string, appearance: ThemeVariant, variants: readonly ThemeVariant[]) => void;\n};\n\n/** Key and shape are read before first paint by public/theme-init.js; keep them in sync. */\nexport const THEME_STORAGE_KEY = 'shapio.theme';\n\n/** 1: `{ preference }`, before themes. 2: themes plus System / Light / Dark. 3: one look, nothing follows the OS. */\nconst THEME_STORAGE_VERSION = 3;\n\ntype PersistedTheme = Pick<ThemeState, 'theme' | 'appearance' | 'variants'>;\n\nexport const DEFAULT_THEME_STATE: PersistedTheme = {\n theme: DEFAULT_THEME_KEY,\n appearance: 'dark',\n variants: DEFAULT_THEME_VARIANTS,\n};\n\n/** Version 1 (the original palette, any colour mode) becomes Cobalt, the original dark look. */\nconst LEGACY_THEME_STATE: PersistedTheme = { theme: 'classic', appearance: 'dark', variants: ['dark'] };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst isThemeVariant = (value: unknown): value is ThemeVariant =>\n typeof value === 'string' && (THEME_VARIANTS as readonly string[]).includes(value);\n\nexport const migrateThemeState = (persisted: unknown, version: number): PersistedTheme =>\n version < 2 ? LEGACY_THEME_STATE : sanitizeThemeState(isRecord(persisted) ? persisted : {});\n\n/**\n * Drops anything malformed (edited storage, an older admin) back to the defaults, field by field. A built-in\n * theme's variants come from the registry, not the cache (they changed in version 3), and the appearance is\n * always a variant the theme has: version 2's \"system\", or a variant a theme lost, becomes its first.\n */\nconst sanitizeThemeState = (state: Record<string, unknown>): PersistedTheme => {\n const theme =\n typeof state.theme === 'string' && THEME_KEY_PATTERN.test(state.theme)\n ? state.theme\n : DEFAULT_THEME_STATE.theme;\n const cached = Array.isArray(state.variants)\n ? THEME_VARIANTS.filter((variant) => (state.variants as unknown[]).includes(variant))\n : [];\n const variants =\n BUILT_IN_THEMES.find((meta) => meta.key === theme)?.variants ??\n (cached.length > 0 ? cached : DEFAULT_THEME_STATE.variants);\n const appearance = isThemeVariant(state.appearance) ? state.appearance : (variants[0] ?? 'dark');\n return { theme, appearance: resolveScheme(appearance, variants), variants };\n};\n\nexport const useThemeStore = create<ThemeState>()(\n persist(\n (set) => ({\n ...DEFAULT_THEME_STATE,\n setLook: (theme, appearance, variants) => set({ theme, appearance, variants }),\n }),\n {\n name: THEME_STORAGE_KEY,\n storage: persistentStorage,\n version: THEME_STORAGE_VERSION,\n migrate: migrateThemeState,\n partialize: ({ theme, appearance, variants }) => ({ theme, appearance, variants }),\n merge: (persisted, current) => ({\n ...current,\n ...sanitizeThemeState(isRecord(persisted) ? persisted : {}),\n }),\n },\n ),\n);\n"],"mappings":"gGAOA,IAAaK,GAAiB,EAA0B,IACtDC,EAAS,SAASC,CAAU,EAAIA,EAAcD,EAAS,IAAMC,EAGlDC,GAAa,EAAe,IAA0B,GAAGC,EAAM,GAAGC,ICFlEC,EAA+C,CAC1D,CAAE,IAAK,SAAU,SAAU,CAAC,MAAM,CAAE,EACpC,CAAE,IAAK,UAAW,SAAU,CAAC,MAAM,CAAE,EACrC,CAAE,IAAK,eAAgB,SAAU,CAAC,MAAM,CAAE,EAC1C,CAAE,IAAK,SAAU,SAAU,CAAC,MAAM,CAAE,EACpC,CAAE,IAAK,SAAU,SAAU,CAAC,OAAO,CAAE,EACrC,CAAE,IAAK,SAAU,SAAU,CAAC,OAAO,CAAE,CACvC,EAEaC,EAAqC,SAErCC,EAAkD,CAAC,MAAM,ECCzDC,EAAoB,eAG3BC,EAAwB,EAIjBC,EAAsC,CACjD,MAAOJ,EACP,WAAY,OACZ,SAAUC,CACZ,EAGMI,EAAqC,CAAE,MAAO,UAAW,WAAY,OAAQ,SAAU,CAAC,MAAM,CAAE,EAEhGC,EAAY,GAChB,OAAOC,GAAU,YAAYA,EAEzBC,EAAkB,GACtB,OAAOD,GAAU,UAAaf,EAAqC,SAASe,CAAK,EAEtEE,GAAqB,EAAoB,IACpDC,EAAU,EAAIL,EAAqBM,EAAmBL,EAASM,CAAS,EAAIA,EAAY,CAAC,CAAC,EAOtFD,EAAsB,GAAmD,CAC7E,IAAMd,EACJ,OAAOgB,EAAM,OAAU,UAAYtB,EAAkB,KAAKsB,EAAM,KAAK,EACjEA,EAAM,MACNT,EAAoB,MACpBU,EAAS,MAAM,QAAQD,EAAM,QAAQ,EACvCrB,EAAe,OAAQ,GAAaqB,EAAM,SAAuB,SAASf,CAAO,CAAC,EAClF,CAAC,EACCJ,EACJK,EAAgB,KAAM,GAASgB,EAAK,MAAQlB,CAAK,CAAC,EAAE,WACnDiB,EAAO,OAAS,EAAIA,EAASV,EAAoB,UAEpD,MAAO,CAAE,QAAO,WAAYX,EADTe,EAAeK,EAAM,UAAU,EAAIA,EAAM,WAAcnB,EAAS,IAAM,OACnCA,CAAQ,EAAG,UAAS,CAC5E,EAEasB,EAAgB1B,EAAmB,CAAC,CAC/CF,EACG,IAAS,CACR,GAAGgB,EACH,SAAU,EAAO,EAAY,IAAaa,EAAI,CAAE,QAAO,aAAY,UAAS,CAAC,CAC/E,GACA,CACE,KAAMf,EACN,QAASb,EACT,QAASc,EACT,QAASM,EACT,YAAa,CAAE,QAAO,aAAY,eAAgB,CAAE,QAAO,aAAY,UAAS,GAChF,OAAQ,EAAW,KAAa,CAC9B,GAAGS,EACH,GAAGP,EAAmBL,EAASM,CAAS,EAAIA,EAAY,CAAC,CAAC,CAC5D,EACF,CACF,CACF"}
1
+ {"version":3,"file":"theme-CHHVK8Ps.js","names":["persist","persistentStorage","create","THEME_KEY_PATTERN","THEME_VARIANTS","resolveScheme","variants","appearance","lookValue","theme","variant","BUILT_IN_THEMES","DEFAULT_THEME_KEY","DEFAULT_THEME_VARIANTS","THEME_STORAGE_KEY","THEME_STORAGE_VERSION","DEFAULT_THEME_STATE","LEGACY_THEME_STATE","isRecord","value","isThemeVariant","migrateThemeState","version","sanitizeThemeState","persisted","state","cached","meta","useThemeStore","set","current"],"sources":["../../src/helpers/theme.ts","../../src/constants/themes.ts","../../src/stores/theme.ts"],"sourcesContent":["import type { ThemeVariant } from '@shapio/schema';\n\n/**\n * The variant actually rendered: the saved one when the theme has it, else the theme's first. Nothing follows\n * the operating system. public/theme-init.js repeats this before first paint (test/themeInit.test.ts keeps\n * the two in step).\n */\nexport const resolveScheme = (appearance: ThemeVariant, variants: readonly ThemeVariant[]): ThemeVariant =>\n variants.includes(appearance) ? appearance : (variants[0] ?? appearance);\n\n/** A look is one variant of one theme; its radio value is `<theme key>:<variant>` (keys never hold a colon). */\nexport const lookValue = (theme: string, variant: ThemeVariant) => `${theme}:${variant}`;\n","import type { BuiltInThemeKey, ThemeVariant } from '@shapio/schema';\n\nexport type BuiltInThemeMeta = {\n key: BuiltInThemeKey;\n /** The one variant the theme defines (styles/themes/<key>.css): every built-in theme is a single look. */\n variants: readonly ThemeVariant[];\n};\n\n/** The admin's own looks, in menu order: dark, then light. Names and descriptions: `appearance.themes.<key>.*`. */\nexport const BUILT_IN_THEMES: readonly BuiltInThemeMeta[] = [\n { key: 'shapio', variants: ['dark'] },\n { key: 'classic', variants: ['dark'] },\n { key: 'murdered-out', variants: ['dark'] },\n { key: 'forest', variants: ['dark'] },\n { key: 'snowed', variants: ['light'] },\n { key: 'butter', variants: ['light'] },\n];\n\nexport const DEFAULT_THEME_KEY: BuiltInThemeKey = 'shapio';\n\nexport const DEFAULT_THEME_VARIANTS: readonly ThemeVariant[] = ['dark'];\n","import { THEME_KEY_PATTERN, THEME_VARIANTS, type ThemeVariant } from '@shapio/schema';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { BUILT_IN_THEMES, DEFAULT_THEME_KEY, DEFAULT_THEME_VARIANTS } from '@/constants/themes';\nimport { persistentStorage } from '@/helpers/safeStorage';\nimport { resolveScheme } from '@/helpers/theme';\n\ntype ThemeState = {\n /** A theme key: built in (constants/themes.ts) or declared by an extension. */\n theme: string;\n /** The variant of that theme the person picked (a look is one theme in one variant). */\n appearance: ThemeVariant;\n /**\n * The chosen theme's variants, cached so public/theme-init.js can render an extension theme's look before\n * the admin has loaded the theme list.\n */\n variants: readonly ThemeVariant[];\n setLook: (theme: string, appearance: ThemeVariant, variants: readonly ThemeVariant[]) => void;\n};\n\n/** Key and shape are read before first paint by public/theme-init.js; keep them in sync. */\nexport const THEME_STORAGE_KEY = 'shapio.theme';\n\n/** 1: `{ preference }`, before themes. 2: themes plus System / Light / Dark. 3: one look, nothing follows the OS. */\nconst THEME_STORAGE_VERSION = 3;\n\ntype PersistedTheme = Pick<ThemeState, 'theme' | 'appearance' | 'variants'>;\n\nexport const DEFAULT_THEME_STATE: PersistedTheme = {\n theme: DEFAULT_THEME_KEY,\n appearance: 'dark',\n variants: DEFAULT_THEME_VARIANTS,\n};\n\n/** Version 1 (the original palette, any colour mode) becomes Cobalt, the original dark look. */\nconst LEGACY_THEME_STATE: PersistedTheme = { theme: 'classic', appearance: 'dark', variants: ['dark'] };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst isThemeVariant = (value: unknown): value is ThemeVariant =>\n typeof value === 'string' && (THEME_VARIANTS as readonly string[]).includes(value);\n\nexport const migrateThemeState = (persisted: unknown, version: number): PersistedTheme =>\n version < 2 ? LEGACY_THEME_STATE : sanitizeThemeState(isRecord(persisted) ? persisted : {});\n\n/**\n * Drops anything malformed (edited storage, an older admin) back to the defaults, field by field. A built-in\n * theme's variants come from the registry, not the cache (they changed in version 3), and the appearance is\n * always a variant the theme has: version 2's \"system\", or a variant a theme lost, becomes its first.\n */\nconst sanitizeThemeState = (state: Record<string, unknown>): PersistedTheme => {\n const theme =\n typeof state.theme === 'string' && THEME_KEY_PATTERN.test(state.theme)\n ? state.theme\n : DEFAULT_THEME_STATE.theme;\n const cached = Array.isArray(state.variants)\n ? THEME_VARIANTS.filter((variant) => (state.variants as unknown[]).includes(variant))\n : [];\n const variants =\n BUILT_IN_THEMES.find((meta) => meta.key === theme)?.variants ??\n (cached.length > 0 ? cached : DEFAULT_THEME_STATE.variants);\n const appearance = isThemeVariant(state.appearance) ? state.appearance : (variants[0] ?? 'dark');\n return { theme, appearance: resolveScheme(appearance, variants), variants };\n};\n\nexport const useThemeStore = create<ThemeState>()(\n persist(\n (set) => ({\n ...DEFAULT_THEME_STATE,\n setLook: (theme, appearance, variants) => set({ theme, appearance, variants }),\n }),\n {\n name: THEME_STORAGE_KEY,\n storage: persistentStorage,\n version: THEME_STORAGE_VERSION,\n migrate: migrateThemeState,\n partialize: ({ theme, appearance, variants }) => ({ theme, appearance, variants }),\n merge: (persisted, current) => ({\n ...current,\n ...sanitizeThemeState(isRecord(persisted) ? persisted : {}),\n }),\n },\n ),\n);\n"],"mappings":"gGAOA,IAAaK,GAAiB,EAA0B,IACtDC,EAAS,SAASC,CAAU,EAAIA,EAAcD,EAAS,IAAMC,EAGlDC,GAAa,EAAe,IAA0B,GAAGC,EAAM,GAAGC,ICFlEC,EAA+C,CAC1D,CAAE,IAAK,SAAU,SAAU,CAAC,MAAM,CAAE,EACpC,CAAE,IAAK,UAAW,SAAU,CAAC,MAAM,CAAE,EACrC,CAAE,IAAK,eAAgB,SAAU,CAAC,MAAM,CAAE,EAC1C,CAAE,IAAK,SAAU,SAAU,CAAC,MAAM,CAAE,EACpC,CAAE,IAAK,SAAU,SAAU,CAAC,OAAO,CAAE,EACrC,CAAE,IAAK,SAAU,SAAU,CAAC,OAAO,CAAE,CACvC,EAEaC,EAAqC,SAErCC,EAAkD,CAAC,MAAM,ECCzDC,EAAoB,eAG3BC,EAAwB,EAIjBC,EAAsC,CACjD,MAAOJ,EACP,WAAY,OACZ,SAAUC,CACZ,EAGMI,EAAqC,CAAE,MAAO,UAAW,WAAY,OAAQ,SAAU,CAAC,MAAM,CAAE,EAEhGC,EAAY,GAChB,OAAOC,GAAU,YAAYA,EAEzBC,EAAkB,GACtB,OAAOD,GAAU,UAAaf,EAAqC,SAASe,CAAK,EAEtEE,GAAqB,EAAoB,IACpDC,EAAU,EAAIL,EAAqBM,EAAmBL,EAASM,CAAS,EAAIA,EAAY,CAAC,CAAC,EAOtFD,EAAsB,GAAmD,CAC7E,IAAMd,EACJ,OAAOgB,EAAM,OAAU,UAAYtB,EAAkB,KAAKsB,EAAM,KAAK,EACjEA,EAAM,MACNT,EAAoB,MACpBU,EAAS,MAAM,QAAQD,EAAM,QAAQ,EACvCrB,EAAe,OAAQ,GAAaqB,EAAM,SAAuB,SAASf,CAAO,CAAC,EAClF,CAAC,EACCJ,EACJK,EAAgB,KAAM,GAASgB,EAAK,MAAQlB,CAAK,CAAC,EAAE,WACnDiB,EAAO,OAAS,EAAIA,EAASV,EAAoB,UAEpD,MAAO,CAAE,QAAO,WAAYX,EADTe,EAAeK,EAAM,UAAU,EAAIA,EAAM,WAAcnB,EAAS,IAAM,OACnCA,CAAQ,EAAG,UAAS,CAC5E,EAEasB,EAAgB1B,EAAmB,CAAC,CAC/CF,EACG,IAAS,CACR,GAAGgB,EACH,SAAU,EAAO,EAAY,IAAaa,EAAI,CAAE,QAAO,aAAY,UAAS,CAAC,CAC/E,GACA,CACE,KAAMf,EACN,QAASb,EACT,QAASc,EACT,QAASM,EACT,YAAa,CAAE,QAAO,aAAY,eAAgB,CAAE,QAAO,aAAY,UAAS,GAChF,OAAQ,EAAW,KAAa,CAC9B,GAAGS,EACH,GAAGP,EAAmBL,EAASM,CAAS,EAAIA,EAAY,CAAC,CAAC,CAC5D,EACF,CACF,CACF"}
@@ -1,2 +1,2 @@
1
- import{H as e,P as t,V as n,bt as r,l as i,s as a,ut as o}from"./cn-CL1YHRrS.js";import{et as s}from"./auth-YVfK3SxF.js";import{E as c,T as l}from"./src-B2qcqjNM.js";var u={silent:!0},d=(e,n)=>s({queryKey:t.content.list(e,n),queryFn:()=>i.content.list(e,n),placeholderData:o,meta:u}),f=(t,n,r=!0)=>e({...d(t,n),enabled:r}),p=(e,n,r)=>s({queryKey:t.content.entry(e,n,r),queryFn:()=>i.content.get(e,n,r?{locale:r}:{}),staleTime:1/0,meta:u}),m=(t,n,r,i=!0)=>e({...p(t,n,r),enabled:i}),h=(e,n,r)=>(e.setQueryData(t.content.entry(n,r.id,r.locale),r),e.invalidateQueries({predicate:e=>e.queryKey[0]===`content`&&e.queryKey[1]===n&&(e.queryKey[2]===`list`||e.queryKey[2]===`revisions`)})),g=e=>{let t=r();return n({mutationKey:[`content`,e,`create`],meta:u,mutationFn:t=>a(()=>i.content.create(e,t)),onSuccess:n=>h(t,e,n)})},_=e=>{let t=r();return n({mutationKey:[`content`,e,`save`],meta:u,mutationFn:({id:t,input:n})=>a(()=>i.content.update(e,t,n)),onSuccess:n=>h(t,e,n)})},v=e=>e&&e.length>0?{locales:e}:{},y=e=>{let t=r();return n({mutationKey:[`content`,e,`publish`],meta:u,mutationFn:({id:t,locales:n})=>a(()=>i.content.publish(e,t,v(n))),onSuccess:n=>h(t,e,n)})},b=e=>{let t=r();return n({mutationKey:[`content`,e,`unpublish`],meta:u,mutationFn:({id:t,locales:n})=>a(()=>i.content.unpublish(e,t,v(n))),onSuccess:n=>h(t,e,n)})},x=e=>{let t=r();return n({mutationKey:[`content`,e,`duplicate`],mutationFn:t=>a(()=>i.content.duplicate(e,t)),onSuccess:n=>h(t,e,n)})},S=e=>{let o=r();return n({mutationKey:[`content`,e,`delete`],meta:u,mutationFn:t=>a(()=>i.content.remove(e,t)),onSuccess:()=>o.invalidateQueries({queryKey:t.content.model(e)})})},C=(n,r,a,o)=>e({queryKey:t.content.revisions(n,r,a),queryFn:()=>i.content.revisions(n,r,a?{locale:a}:{}),enabled:o,staleTime:0,meta:u}),w=(n,r,a)=>e({queryKey:t.content.revision(n,r,a??``),queryFn:()=>i.content.revision(n,r,a??``),enabled:a!==void 0,staleTime:1/0,meta:u}),T=e=>{let t=r();return n({mutationKey:[`content`,e,`restore`],meta:u,mutationFn:({id:t,revisionId:n,expectedVersion:r})=>a(()=>i.content.restore(e,t,n,r)),onSuccess:n=>h(t,e,n)})},E=e=>c(e),D=e=>{let t=E(e);return t!==void 0&&l.has(t.type)},O=(e,t)=>{let n=E(e),r=n?t[n.apiKey]:void 0;return typeof r==`string`&&r.trim()!==``?r:typeof r==`number`?String(r):void 0},k=e=>e.slice(0,8),A=(e,t,n)=>O(e,t.data)??`${n} · ${k(t.id)}`;export{_,E as a,g as c,m as d,f,C as g,w as h,k as i,S as l,T as m,D as n,d as o,y as p,A as r,p as s,O as t,x as u,b as v};
2
- //# sourceMappingURL=titles-uL13bpi8.js.map
1
+ import{H as e,P as t,V as n,bt as r,l as i,s as a,ut as o}from"./cn-CL1YHRrS.js";import{et as s}from"./auth-YVfK3SxF.js";import{D as c,E as l}from"./src-Be3Ds5Dc.js";var u={silent:!0},d=(e,n)=>s({queryKey:t.content.list(e,n),queryFn:()=>i.content.list(e,n),placeholderData:o,meta:u}),f=(t,n,r=!0)=>e({...d(t,n),enabled:r}),p=(e,n,r)=>s({queryKey:t.content.entry(e,n,r),queryFn:()=>i.content.get(e,n,r?{locale:r}:{}),staleTime:1/0,meta:u}),m=(t,n,r,i=!0)=>e({...p(t,n,r),enabled:i}),h=(e,n,r)=>(e.setQueryData(t.content.entry(n,r.id,r.locale),r),e.invalidateQueries({predicate:e=>e.queryKey[0]===`content`&&e.queryKey[1]===n&&(e.queryKey[2]===`list`||e.queryKey[2]===`revisions`)})),g=e=>{let t=r();return n({mutationKey:[`content`,e,`create`],meta:u,mutationFn:t=>a(()=>i.content.create(e,t)),onSuccess:n=>h(t,e,n)})},_=e=>{let t=r();return n({mutationKey:[`content`,e,`save`],meta:u,mutationFn:({id:t,input:n})=>a(()=>i.content.update(e,t,n)),onSuccess:n=>h(t,e,n)})},v=e=>e&&e.length>0?{locales:e}:{},y=e=>{let t=r();return n({mutationKey:[`content`,e,`publish`],meta:u,mutationFn:({id:t,locales:n})=>a(()=>i.content.publish(e,t,v(n))),onSuccess:n=>h(t,e,n)})},b=e=>{let t=r();return n({mutationKey:[`content`,e,`unpublish`],meta:u,mutationFn:({id:t,locales:n})=>a(()=>i.content.unpublish(e,t,v(n))),onSuccess:n=>h(t,e,n)})},x=e=>{let t=r();return n({mutationKey:[`content`,e,`duplicate`],mutationFn:t=>a(()=>i.content.duplicate(e,t)),onSuccess:n=>h(t,e,n)})},S=e=>{let o=r();return n({mutationKey:[`content`,e,`delete`],meta:u,mutationFn:t=>a(()=>i.content.remove(e,t)),onSuccess:()=>o.invalidateQueries({queryKey:t.content.model(e)})})},C=(n,r,a,o)=>e({queryKey:t.content.revisions(n,r,a),queryFn:()=>i.content.revisions(n,r,a?{locale:a}:{}),enabled:o,staleTime:0,meta:u}),w=(n,r,a)=>e({queryKey:t.content.revision(n,r,a??``),queryFn:()=>i.content.revision(n,r,a??``),enabled:a!==void 0,staleTime:1/0,meta:u}),T=e=>{let t=r();return n({mutationKey:[`content`,e,`restore`],meta:u,mutationFn:({id:t,revisionId:n,expectedVersion:r})=>a(()=>i.content.restore(e,t,n,r)),onSuccess:n=>h(t,e,n)})},E=e=>c(e),D=e=>{let t=E(e);return t!==void 0&&l.has(t.type)},O=(e,t)=>{let n=E(e),r=n?t[n.apiKey]:void 0;return typeof r==`string`&&r.trim()!==``?r:typeof r==`number`?String(r):void 0},k=e=>e.slice(0,8),A=(e,t,n)=>O(e,t.data)??`${n} · ${k(t.id)}`;export{_,E as a,g as c,m as d,f,C as g,w as h,k as i,S as l,T as m,D as n,d as o,y as p,A as r,p as s,O as t,x as u,b as v};
2
+ //# sourceMappingURL=titles-CQYc9nDQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"titles-uL13bpi8.js","names":["useQuery","queryKeys","useMutation","useQueryClient","adminApi","withCsrf","keepPreviousData","queryOptions","effectiveTitleField","TEXT_TITLE_FIELD_TYPES","silent","entryListQueryOptions","modelKey","query","useEntryList","entryQueryOptions","id","locale","useEntry","rememberEntry","queryClient","entry","useCreateEntry","input","useSaveEntry","localesBody","locales","usePublishEntry","useUnpublishEntry","useDuplicateEntry","useDeleteEntry","useRevisions","useRevision","revisionId","useRestoreRevision","expectedVersion","titleFieldOf","model","isSearchable","title","entryTitle","value","data","shortId","labelOf","item","untitled"],"sources":["../../src/api/content.ts","../../src/fields/helpers/titles.ts"],"sourcesContent":["import type { AdminEntry, ContentListQuery, CreateEntryInput, UpdateEntryInput } from '@shapio/client';\nimport {\n keepPreviousData,\n queryOptions,\n useMutation,\n useQuery,\n useQueryClient,\n type QueryClient,\n} from '@tanstack/react-query';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\n/**\n * Content of any model (`/api/admin/content/:modelKey`). Mutations are silent: the entry form and list\n * show failures themselves (inline issues, the conflict dialog, the \"still referenced\" explanation).\n */\nconst silent = { silent: true } as const;\n\nexport const entryListQueryOptions = (modelKey: string, query: ContentListQuery) =>\n queryOptions({\n queryKey: queryKeys.content.list(modelKey, query),\n queryFn: () => adminApi.content.list(modelKey, query),\n placeholderData: keepPreviousData,\n meta: silent,\n });\n\nexport const useEntryList = (modelKey: string, query: ContentListQuery, enabled = true) =>\n useQuery({ ...entryListQueryOptions(modelKey, query), enabled });\n\nexport const entryQueryOptions = (modelKey: string, id: string, locale: string | undefined) =>\n queryOptions({\n queryKey: queryKeys.content.entry(modelKey, id, locale),\n queryFn: () => adminApi.content.get(modelKey, id, locale ? { locale } : {}),\n // The form owns the values once loaded; it is refreshed explicitly (conflicts, restores, locales).\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useEntry = (modelKey: string, id: string, locale: string | undefined, enabled = true) =>\n useQuery({ ...entryQueryOptions(modelKey, id, locale), enabled });\n\n/** Remembers a write's result as the entry's latest state and refreshes that model's lists. */\nconst rememberEntry = (queryClient: QueryClient, modelKey: string, entry: AdminEntry) => {\n queryClient.setQueryData(queryKeys.content.entry(modelKey, entry.id, entry.locale), entry);\n return queryClient.invalidateQueries({\n predicate: (query) =>\n query.queryKey[0] === 'content' &&\n query.queryKey[1] === modelKey &&\n (query.queryKey[2] === 'list' || query.queryKey[2] === 'revisions'),\n });\n};\n\nexport const useCreateEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'create'],\n meta: silent,\n mutationFn: (input: CreateEntryInput) => withCsrf(() => adminApi.content.create(modelKey, input)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useSaveEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'save'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateEntryInput }) =>\n withCsrf(() => adminApi.content.update(modelKey, id, input)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\n/** Omitting `locales` targets the request's default locale; it is the only form a non-localized model accepts. */\ntype LocalesVariables = { id: string; locales?: string[] };\n\n/** The body never carries an empty `locales` array: the API requires at least one locale when it is sent. */\nconst localesBody = (locales?: string[]) => (locales && locales.length > 0 ? { locales } : {});\n\nexport const usePublishEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'publish'],\n meta: silent,\n mutationFn: ({ id, locales }: LocalesVariables) =>\n withCsrf(() => adminApi.content.publish(modelKey, id, localesBody(locales))),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useUnpublishEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'unpublish'],\n meta: silent,\n mutationFn: ({ id, locales }: LocalesVariables) =>\n withCsrf(() => adminApi.content.unpublish(modelKey, id, localesBody(locales))),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useDuplicateEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'duplicate'],\n mutationFn: (id: string) => withCsrf(() => adminApi.content.duplicate(modelKey, id)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\n/** 409 ENTRY_REFERENCED comes back to the caller, which explains what still points at the entry. */\nexport const useDeleteEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'delete'],\n meta: silent,\n mutationFn: (id: string) => withCsrf(() => adminApi.content.remove(modelKey, id)),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.content.model(modelKey) }),\n });\n};\n\nexport const useRevisions = (modelKey: string, id: string, locale: string | undefined, enabled: boolean) =>\n useQuery({\n queryKey: queryKeys.content.revisions(modelKey, id, locale),\n queryFn: () => adminApi.content.revisions(modelKey, id, locale ? { locale } : {}),\n enabled,\n staleTime: 0,\n meta: silent,\n });\n\nexport const useRevision = (modelKey: string, id: string, revisionId: string | undefined) =>\n useQuery({\n queryKey: queryKeys.content.revision(modelKey, id, revisionId ?? ''),\n queryFn: () => adminApi.content.revision(modelKey, id, revisionId ?? ''),\n enabled: revisionId !== undefined,\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useRestoreRevision = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'restore'],\n meta: silent,\n mutationFn: ({\n id,\n revisionId,\n expectedVersion,\n }: {\n id: string;\n revisionId: string;\n expectedVersion: number;\n }) => withCsrf(() => adminApi.content.restore(modelKey, id, revisionId, expectedVersion)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n","import type { AdminEntryListItem } from '@shapio/client';\nimport {\n effectiveTitleField,\n TEXT_TITLE_FIELD_TYPES,\n type FieldDefinition,\n type ModelDefinition,\n} from '@shapio/schema';\n\n/**\n * The field that labels a model's entries in lists, pickers and relation summaries: the configured title\n * field, or the first text field when none is set (the same rule the API's `q` search uses).\n */\nexport const titleFieldOf = (model: ModelDefinition): FieldDefinition | undefined =>\n effectiveTitleField(model);\n\n/** Whether the list API's `q` search works for this model (it searches the title field, if it is text). */\nexport const isSearchable = (model: ModelDefinition): boolean => {\n const title = titleFieldOf(model);\n return title !== undefined && TEXT_TITLE_FIELD_TYPES.has(title.type);\n};\n\n/** An entry's label: its title field's text, or undefined (callers show \"Untitled\"). */\nexport const entryTitle = (\n model: ModelDefinition,\n data: Readonly<Record<string, unknown>>,\n): string | undefined => {\n const title = titleFieldOf(model);\n const value = title ? data[title.apiKey] : undefined;\n return typeof value === 'string' && value.trim() !== ''\n ? value\n : typeof value === 'number'\n ? String(value)\n : undefined;\n};\n\nexport const shortId = (id: string) => id.slice(0, 8);\n\nexport const labelOf = (\n model: ModelDefinition,\n item: Pick<AdminEntryListItem, 'id' | 'data'>,\n untitled: string,\n) => entryTitle(model, item.data) ?? `${untitled} · ${shortId(item.id)}`;\n"],"mappings":"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"}
1
+ {"version":3,"file":"titles-CQYc9nDQ.js","names":["useQuery","queryKeys","useMutation","useQueryClient","adminApi","withCsrf","keepPreviousData","queryOptions","effectiveTitleField","TEXT_TITLE_FIELD_TYPES","silent","entryListQueryOptions","modelKey","query","useEntryList","entryQueryOptions","id","locale","useEntry","rememberEntry","queryClient","entry","useCreateEntry","input","useSaveEntry","localesBody","locales","usePublishEntry","useUnpublishEntry","useDuplicateEntry","useDeleteEntry","useRevisions","useRevision","revisionId","useRestoreRevision","expectedVersion","titleFieldOf","model","isSearchable","title","entryTitle","value","data","shortId","labelOf","item","untitled"],"sources":["../../src/api/content.ts","../../src/fields/helpers/titles.ts"],"sourcesContent":["import type { AdminEntry, ContentListQuery, CreateEntryInput, UpdateEntryInput } from '@shapio/client';\nimport {\n keepPreviousData,\n queryOptions,\n useMutation,\n useQuery,\n useQueryClient,\n type QueryClient,\n} from '@tanstack/react-query';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\n/**\n * Content of any model (`/api/admin/content/:modelKey`). Mutations are silent: the entry form and list\n * show failures themselves (inline issues, the conflict dialog, the \"still referenced\" explanation).\n */\nconst silent = { silent: true } as const;\n\nexport const entryListQueryOptions = (modelKey: string, query: ContentListQuery) =>\n queryOptions({\n queryKey: queryKeys.content.list(modelKey, query),\n queryFn: () => adminApi.content.list(modelKey, query),\n placeholderData: keepPreviousData,\n meta: silent,\n });\n\nexport const useEntryList = (modelKey: string, query: ContentListQuery, enabled = true) =>\n useQuery({ ...entryListQueryOptions(modelKey, query), enabled });\n\nexport const entryQueryOptions = (modelKey: string, id: string, locale: string | undefined) =>\n queryOptions({\n queryKey: queryKeys.content.entry(modelKey, id, locale),\n queryFn: () => adminApi.content.get(modelKey, id, locale ? { locale } : {}),\n // The form owns the values once loaded; it is refreshed explicitly (conflicts, restores, locales).\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useEntry = (modelKey: string, id: string, locale: string | undefined, enabled = true) =>\n useQuery({ ...entryQueryOptions(modelKey, id, locale), enabled });\n\n/** Remembers a write's result as the entry's latest state and refreshes that model's lists. */\nconst rememberEntry = (queryClient: QueryClient, modelKey: string, entry: AdminEntry) => {\n queryClient.setQueryData(queryKeys.content.entry(modelKey, entry.id, entry.locale), entry);\n return queryClient.invalidateQueries({\n predicate: (query) =>\n query.queryKey[0] === 'content' &&\n query.queryKey[1] === modelKey &&\n (query.queryKey[2] === 'list' || query.queryKey[2] === 'revisions'),\n });\n};\n\nexport const useCreateEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'create'],\n meta: silent,\n mutationFn: (input: CreateEntryInput) => withCsrf(() => adminApi.content.create(modelKey, input)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useSaveEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'save'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateEntryInput }) =>\n withCsrf(() => adminApi.content.update(modelKey, id, input)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\n/** Omitting `locales` targets the request's default locale; it is the only form a non-localized model accepts. */\ntype LocalesVariables = { id: string; locales?: string[] };\n\n/** The body never carries an empty `locales` array: the API requires at least one locale when it is sent. */\nconst localesBody = (locales?: string[]) => (locales && locales.length > 0 ? { locales } : {});\n\nexport const usePublishEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'publish'],\n meta: silent,\n mutationFn: ({ id, locales }: LocalesVariables) =>\n withCsrf(() => adminApi.content.publish(modelKey, id, localesBody(locales))),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useUnpublishEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'unpublish'],\n meta: silent,\n mutationFn: ({ id, locales }: LocalesVariables) =>\n withCsrf(() => adminApi.content.unpublish(modelKey, id, localesBody(locales))),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useDuplicateEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'duplicate'],\n mutationFn: (id: string) => withCsrf(() => adminApi.content.duplicate(modelKey, id)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\n/** 409 ENTRY_REFERENCED comes back to the caller, which explains what still points at the entry. */\nexport const useDeleteEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'delete'],\n meta: silent,\n mutationFn: (id: string) => withCsrf(() => adminApi.content.remove(modelKey, id)),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.content.model(modelKey) }),\n });\n};\n\nexport const useRevisions = (modelKey: string, id: string, locale: string | undefined, enabled: boolean) =>\n useQuery({\n queryKey: queryKeys.content.revisions(modelKey, id, locale),\n queryFn: () => adminApi.content.revisions(modelKey, id, locale ? { locale } : {}),\n enabled,\n staleTime: 0,\n meta: silent,\n });\n\nexport const useRevision = (modelKey: string, id: string, revisionId: string | undefined) =>\n useQuery({\n queryKey: queryKeys.content.revision(modelKey, id, revisionId ?? ''),\n queryFn: () => adminApi.content.revision(modelKey, id, revisionId ?? ''),\n enabled: revisionId !== undefined,\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useRestoreRevision = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'restore'],\n meta: silent,\n mutationFn: ({\n id,\n revisionId,\n expectedVersion,\n }: {\n id: string;\n revisionId: string;\n expectedVersion: number;\n }) => withCsrf(() => adminApi.content.restore(modelKey, id, revisionId, expectedVersion)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n","import type { AdminEntryListItem } from '@shapio/client';\nimport {\n effectiveTitleField,\n TEXT_TITLE_FIELD_TYPES,\n type FieldDefinition,\n type ModelDefinition,\n} from '@shapio/schema';\n\n/**\n * The field that labels a model's entries in lists, pickers and relation summaries: the configured title\n * field, or the first text field when none is set (the same rule the API's `q` search uses).\n */\nexport const titleFieldOf = (model: ModelDefinition): FieldDefinition | undefined =>\n effectiveTitleField(model);\n\n/** Whether the list API's `q` search works for this model (it searches the title field, if it is text). */\nexport const isSearchable = (model: ModelDefinition): boolean => {\n const title = titleFieldOf(model);\n return title !== undefined && TEXT_TITLE_FIELD_TYPES.has(title.type);\n};\n\n/** An entry's label: its title field's text, or undefined (callers show \"Untitled\"). */\nexport const entryTitle = (\n model: ModelDefinition,\n data: Readonly<Record<string, unknown>>,\n): string | undefined => {\n const title = titleFieldOf(model);\n const value = title ? data[title.apiKey] : undefined;\n return typeof value === 'string' && value.trim() !== ''\n ? value\n : typeof value === 'number'\n ? String(value)\n : undefined;\n};\n\nexport const shortId = (id: string) => id.slice(0, 8);\n\nexport const labelOf = (\n model: ModelDefinition,\n item: Pick<AdminEntryListItem, 'id' | 'data'>,\n untitled: string,\n) => entryTitle(model, item.data) ?? `${untitled} · ${shortId(item.id)}`;\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{t as r}from"./cn-CL1YHRrS.js";import{I as i,S as a,b as o,v as s,x as c,y as l}from"./InfoHint-DWn9kLf1.js";import{T as u,_ as d,b as f,d as p,g as m,h,l as g,m as _,v,w as y,y as b}from"./skeleton-B5GJgv7y.js";var x=e(t(),1),S=e(n(),1),C=Object.defineProperty,w=(e,t)=>C(e,`name`,{value:t,configurable:!0}),[T,E]=b(`Tooltip`,[a]),D=a(),O=`TooltipProvider`,k=700,A=`tooltip.open`,[j,M]=T(O),N=w(e=>{let{__scopeTooltip:t,delayDuration:n=k,skipDelayDuration:r=300,disableHoverableContent:i=!1,children:a}=e,o=x.useRef(!0),s=x.useRef(!1),c=x.useRef(0);return x.useEffect(()=>{let e=c.current;return()=>window.clearTimeout(e)},[]),(0,S.jsx)(j,{scope:t,isOpenDelayedRef:o,delayDuration:n,onOpen:x.useCallback(()=>{r<=0||(window.clearTimeout(c.current),o.current=!1)},[r]),onClose:x.useCallback(()=>{r<=0||(window.clearTimeout(c.current),c.current=window.setTimeout(()=>o.current=!0,r))},[r]),isPointerInTransitRef:s,onPointerInTransitChange:x.useCallback(e=>{s.current=e},[]),disableHoverableContent:i,children:a})},`TooltipProvider`),P=`Tooltip`,[ee,F]=T(P),I=w(e=>{let{__scopeTooltip:t,children:n,open:r,defaultOpen:i,onOpenChange:a,disableHoverableContent:o,delayDuration:s}=e,l=M(P,e.__scopeTooltip),u=D(t),[d,f]=x.useState(null),[p,h]=x.useState(void 0),g=_(),v=x.useRef(0),y=o??l.disableHoverableContent,b=s??l.delayDuration,C=x.useRef(!1),[T,E]=m({prop:r,defaultProp:i??!1,onChange:w(e=>{e?(l.onOpen(),document.dispatchEvent(new CustomEvent(A))):l.onClose(),a?.(e)},`onChange`),caller:P}),O=x.useMemo(()=>T?C.current?`delayed-open`:`instant-open`:`closed`,[T]),k=x.useCallback(()=>{window.clearTimeout(v.current),v.current=0,C.current=!1,E(!0)},[E]),j=x.useCallback(()=>{window.clearTimeout(v.current),v.current=0,E(!1)},[E]),N=x.useCallback(()=>{window.clearTimeout(v.current),v.current=window.setTimeout(()=>{C.current=!0,E(!0),v.current=0},b)},[b,E]);x.useEffect(()=>()=>{v.current&&=(window.clearTimeout(v.current),0)},[]);let F=p??g;return(0,S.jsx)(c,{...u,children:(0,S.jsx)(ee,{scope:t,contentId:F,setContentId:h,open:T,stateAttribute:O,trigger:d,onTriggerChange:f,onTriggerEnter:x.useCallback(()=>{l.isOpenDelayedRef.current?N():k()},[l.isOpenDelayedRef,N,k]),onTriggerLeave:x.useCallback(()=>{y?j():(window.clearTimeout(v.current),v.current=0)},[j,y]),onOpen:k,onClose:j,disableHoverableContent:y,children:n})})},`Tooltip`),L=`TooltipTrigger`,R=x.forwardRef(w(function(e,t){let{__scopeTooltip:n,...r}=e,i=F(L,n),a=M(L,n),o=D(n),c=x.useRef(null),l=u(t,c,i.onTriggerChange),d=x.useRef(!1),p=x.useRef(!1),m=x.useCallback(()=>d.current=!1,[]);return x.useEffect(()=>()=>document.removeEventListener(`pointerup`,m),[m]),(0,S.jsx)(s,{asChild:!0,...o,children:(0,S.jsx)(f.button,{"aria-describedby":i.open?i.contentId:void 0,"data-state":i.stateAttribute,...r,ref:l,onPointerMove:v(e.onPointerMove,e=>{e.pointerType!==`touch`&&!p.current&&!a.isPointerInTransitRef.current&&(i.onTriggerEnter(),p.current=!0)}),onPointerLeave:v(e.onPointerLeave,()=>{i.onTriggerLeave(),p.current=!1}),onPointerDown:v(e.onPointerDown,()=>{i.open&&i.onClose(),d.current=!0,document.addEventListener(`pointerup`,m,{once:!0})}),onFocus:v(e.onFocus,()=>{d.current||i.onOpen()}),onBlur:v(e.onBlur,i.onClose),onClick:v(e.onClick,i.onClose)})})},`TooltipTrigger`)),z=`TooltipPortal`,[B,V]=T(z,{forceMount:void 0}),H=w(e=>{let{__scopeTooltip:t,forceMount:n,children:r,container:i}=e,a=F(z,t);return(0,S.jsx)(B,{scope:t,forceMount:n,children:(0,S.jsx)(h,{present:n||a.open,children:(0,S.jsx)(g,{asChild:!0,container:i,children:r})})})},`TooltipPortal`),U=`TooltipContent`,te=x.forwardRef(w(function(e,t){let n=V(U,e.__scopeTooltip),{forceMount:r=n.forceMount,side:i=`top`,...a}=e,o=F(U,e.__scopeTooltip);return(0,S.jsx)(h,{present:r||o.open,children:o.disableHoverableContent?(0,S.jsx)(K,{side:i,...a,ref:t}):(0,S.jsx)(W,{side:i,...a,ref:t})})},`TooltipContent`)),W=x.forwardRef(w(function(e,t){let n=F(U,e.__scopeTooltip),r=M(U,e.__scopeTooltip),i=x.useRef(null),a=u(t,i),[o,s]=x.useState(null),{trigger:c,onClose:l}=n,d=i.current,{onPointerInTransitChange:f}=r,p=x.useCallback(()=>{s(null),f(!1)},[f]),m=x.useCallback((e,t)=>{let n=e.currentTarget,r={x:e.clientX,y:e.clientY},i=Y(r,J(r,n.getBoundingClientRect())),a=X(t.getBoundingClientRect()),o=Q([...i,...a]);s(o),f(!0)},[f]);return x.useEffect(()=>()=>p(),[p]),x.useEffect(()=>{if(c&&d){let e=w(e=>m(e,d),`handleTriggerLeave`),t=w(e=>m(e,c),`handleContentLeave`);return c.addEventListener(`pointerleave`,e),d.addEventListener(`pointerleave`,t),()=>{c.removeEventListener(`pointerleave`,e),d.removeEventListener(`pointerleave`,t)}}},[c,d,m,p]),x.useEffect(()=>{if(o){let e=w(e=>{let t=e.target,n={x:e.clientX,y:e.clientY},r=c?.contains(t)||d?.contains(t),i=!Z(n,o);r?p():i&&(p(),l())},`handleTrackPointerGrace`);return document.addEventListener(`pointermove`,e),()=>document.removeEventListener(`pointermove`,e)}},[c,d,o,l,p]),(0,S.jsx)(K,{...e,ref:a})},`TooltipContentHoverable`)),G=y(`TooltipContent`),K=x.forwardRef(w(function(e,t){let{__scopeTooltip:n,children:r,"aria-label":a,id:s,onEscapeKeyDown:c,onPointerDownOutside:l,...u}=e,f=F(U,n),m=D(n),{onClose:h}=f;x.useEffect(()=>(document.addEventListener(A,h),()=>document.removeEventListener(A,h)),[h]),x.useEffect(()=>{if(f.trigger){let e=w(e=>{e.target instanceof Node&&e.target.contains(f.trigger)&&h()},`handleScroll`);return window.addEventListener(`scroll`,e,{capture:!0}),()=>window.removeEventListener(`scroll`,e,{capture:!0})}},[f.trigger,h]);let{setContentId:g}=f;return d(()=>(g(s),()=>{g(void 0)}),[s,g]),(0,S.jsx)(p,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:c,onPointerDownOutside:l,onFocusOutside:e=>e.preventDefault(),onDismiss:h,children:(0,S.jsxs)(o,{"data-state":f.stateAttribute,role:a?void 0:`tooltip`,id:a?void 0:f.contentId,...m,...u,ref:t,style:{...u.style,"--radix-tooltip-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-tooltip-content-available-width":`var(--radix-popper-available-width)`,"--radix-tooltip-content-available-height":`var(--radix-popper-available-height)`,"--radix-tooltip-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-tooltip-trigger-height":`var(--radix-popper-anchor-height)`},children:[(0,S.jsx)(G,{children:r}),a?(0,S.jsx)(i,{id:f.contentId,role:`tooltip`,children:a}):null]})})},`TooltipContentImpl`)),q=x.forwardRef(w(function(e,t){let{__scopeTooltip:n,...r}=e,i=D(n);return(0,S.jsx)(l,{...i,...r,ref:t})},`TooltipArrow`));function J(e,t){let n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),i=Math.abs(t.right-e.x),a=Math.abs(t.left-e.x);switch(Math.min(n,r,i,a)){case a:return`left`;case i:return`right`;case n:return`top`;case r:return`bottom`;default:throw Error(`unreachable`)}}w(J,`getExitSideFromRect`);function Y(e,t,n=5){let r=[];switch(t){case`top`:r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case`bottom`:r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case`left`:r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case`right`:r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n})}return r}w(Y,`getPaddedExitPoints`);function X(e){let{top:t,right:n,bottom:r,left:i}=e;return[{x:i,y:t},{x:n,y:t},{x:n,y:r},{x:i,y:r}]}w(X,`getPointsFromRect`);function Z(e,t){let{x:n,y:r}=e,i=!1;for(let e=0,a=t.length-1;e<t.length;a=e++){let o=t[e],s=t[a],c=o.x,l=o.y,u=s.x,d=s.y;l>r!=d>r&&n<(u-c)*(r-l)/(d-l)+c&&(i=!i)}return i}w(Z,`isPointInPolygon`);function Q(e){let t=e.slice();return t.sort((e,t)=>e.x<t.x?-1:e.x>t.x?1:e.y<t.y?-1:+(e.y>t.y)),$(t)}w(Q,`getHull`);function $(e){if(e.length<=1)return e.slice();let t=[];for(let n=0;n<e.length;n++){let r=e[n];for(;t.length>=2;){let e=t[t.length-1],n=t[t.length-2];if((e.x-n.x)*(r.y-n.y)>=(e.y-n.y)*(r.x-n.x))t.pop();else break}t.push(r)}t.pop();let n=[];for(let t=e.length-1;t>=0;t--){let r=e[t];for(;n.length>=2;){let e=n[n.length-1],t=n[n.length-2];if((e.x-t.x)*(r.y-t.y)>=(e.y-t.y)*(r.x-t.x))n.pop();else break}n.push(r)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}w($,`getHullPresorted`);var ne=N,re=I,ie=R,ae=H,oe=te,se=q;function ce({delayDuration:e=0,...t}){return(0,S.jsx)(ne,{"data-slot":`tooltip-provider`,delayDuration:e,...t})}function le({...e}){return(0,S.jsx)(re,{"data-slot":`tooltip`,...e})}function ue({...e}){return(0,S.jsx)(ie,{"data-slot":`tooltip-trigger`,...e})}function de({className:e,sideOffset:t=0,children:n,...i}){return(0,S.jsx)(ae,{children:(0,S.jsxs)(oe,{"data-slot":`tooltip-content`,sideOffset:t,className:r(`z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95`,e),...i,children:[n,(0,S.jsx)(se,{className:`z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground`})]})})}export{ue as i,de as n,ce as r,le as t};
2
- //# sourceMappingURL=tooltip-BK5FqmJ0.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{t as r}from"./cn-CL1YHRrS.js";import{I as i,S as a,b as o,v as s,x as c,y as l}from"./InfoHint-DtaHU1Cg.js";import{T as u,_ as d,b as f,d as p,g as m,h,l as g,m as _,v,w as y,y as b}from"./skeleton-DElTumgk.js";var x=e(t(),1),S=e(n(),1),C=Object.defineProperty,w=(e,t)=>C(e,`name`,{value:t,configurable:!0}),[T,E]=b(`Tooltip`,[a]),D=a(),O=`TooltipProvider`,k=700,A=`tooltip.open`,[j,M]=T(O),N=w(e=>{let{__scopeTooltip:t,delayDuration:n=k,skipDelayDuration:r=300,disableHoverableContent:i=!1,children:a}=e,o=x.useRef(!0),s=x.useRef(!1),c=x.useRef(0);return x.useEffect(()=>{let e=c.current;return()=>window.clearTimeout(e)},[]),(0,S.jsx)(j,{scope:t,isOpenDelayedRef:o,delayDuration:n,onOpen:x.useCallback(()=>{r<=0||(window.clearTimeout(c.current),o.current=!1)},[r]),onClose:x.useCallback(()=>{r<=0||(window.clearTimeout(c.current),c.current=window.setTimeout(()=>o.current=!0,r))},[r]),isPointerInTransitRef:s,onPointerInTransitChange:x.useCallback(e=>{s.current=e},[]),disableHoverableContent:i,children:a})},`TooltipProvider`),P=`Tooltip`,[ee,F]=T(P),I=w(e=>{let{__scopeTooltip:t,children:n,open:r,defaultOpen:i,onOpenChange:a,disableHoverableContent:o,delayDuration:s}=e,l=M(P,e.__scopeTooltip),u=D(t),[d,f]=x.useState(null),[p,h]=x.useState(void 0),g=_(),v=x.useRef(0),y=o??l.disableHoverableContent,b=s??l.delayDuration,C=x.useRef(!1),[T,E]=m({prop:r,defaultProp:i??!1,onChange:w(e=>{e?(l.onOpen(),document.dispatchEvent(new CustomEvent(A))):l.onClose(),a?.(e)},`onChange`),caller:P}),O=x.useMemo(()=>T?C.current?`delayed-open`:`instant-open`:`closed`,[T]),k=x.useCallback(()=>{window.clearTimeout(v.current),v.current=0,C.current=!1,E(!0)},[E]),j=x.useCallback(()=>{window.clearTimeout(v.current),v.current=0,E(!1)},[E]),N=x.useCallback(()=>{window.clearTimeout(v.current),v.current=window.setTimeout(()=>{C.current=!0,E(!0),v.current=0},b)},[b,E]);x.useEffect(()=>()=>{v.current&&=(window.clearTimeout(v.current),0)},[]);let F=p??g;return(0,S.jsx)(c,{...u,children:(0,S.jsx)(ee,{scope:t,contentId:F,setContentId:h,open:T,stateAttribute:O,trigger:d,onTriggerChange:f,onTriggerEnter:x.useCallback(()=>{l.isOpenDelayedRef.current?N():k()},[l.isOpenDelayedRef,N,k]),onTriggerLeave:x.useCallback(()=>{y?j():(window.clearTimeout(v.current),v.current=0)},[j,y]),onOpen:k,onClose:j,disableHoverableContent:y,children:n})})},`Tooltip`),L=`TooltipTrigger`,R=x.forwardRef(w(function(e,t){let{__scopeTooltip:n,...r}=e,i=F(L,n),a=M(L,n),o=D(n),c=x.useRef(null),l=u(t,c,i.onTriggerChange),d=x.useRef(!1),p=x.useRef(!1),m=x.useCallback(()=>d.current=!1,[]);return x.useEffect(()=>()=>document.removeEventListener(`pointerup`,m),[m]),(0,S.jsx)(s,{asChild:!0,...o,children:(0,S.jsx)(f.button,{"aria-describedby":i.open?i.contentId:void 0,"data-state":i.stateAttribute,...r,ref:l,onPointerMove:v(e.onPointerMove,e=>{e.pointerType!==`touch`&&!p.current&&!a.isPointerInTransitRef.current&&(i.onTriggerEnter(),p.current=!0)}),onPointerLeave:v(e.onPointerLeave,()=>{i.onTriggerLeave(),p.current=!1}),onPointerDown:v(e.onPointerDown,()=>{i.open&&i.onClose(),d.current=!0,document.addEventListener(`pointerup`,m,{once:!0})}),onFocus:v(e.onFocus,()=>{d.current||i.onOpen()}),onBlur:v(e.onBlur,i.onClose),onClick:v(e.onClick,i.onClose)})})},`TooltipTrigger`)),z=`TooltipPortal`,[B,V]=T(z,{forceMount:void 0}),H=w(e=>{let{__scopeTooltip:t,forceMount:n,children:r,container:i}=e,a=F(z,t);return(0,S.jsx)(B,{scope:t,forceMount:n,children:(0,S.jsx)(h,{present:n||a.open,children:(0,S.jsx)(g,{asChild:!0,container:i,children:r})})})},`TooltipPortal`),U=`TooltipContent`,te=x.forwardRef(w(function(e,t){let n=V(U,e.__scopeTooltip),{forceMount:r=n.forceMount,side:i=`top`,...a}=e,o=F(U,e.__scopeTooltip);return(0,S.jsx)(h,{present:r||o.open,children:o.disableHoverableContent?(0,S.jsx)(K,{side:i,...a,ref:t}):(0,S.jsx)(W,{side:i,...a,ref:t})})},`TooltipContent`)),W=x.forwardRef(w(function(e,t){let n=F(U,e.__scopeTooltip),r=M(U,e.__scopeTooltip),i=x.useRef(null),a=u(t,i),[o,s]=x.useState(null),{trigger:c,onClose:l}=n,d=i.current,{onPointerInTransitChange:f}=r,p=x.useCallback(()=>{s(null),f(!1)},[f]),m=x.useCallback((e,t)=>{let n=e.currentTarget,r={x:e.clientX,y:e.clientY},i=Y(r,J(r,n.getBoundingClientRect())),a=X(t.getBoundingClientRect()),o=Q([...i,...a]);s(o),f(!0)},[f]);return x.useEffect(()=>()=>p(),[p]),x.useEffect(()=>{if(c&&d){let e=w(e=>m(e,d),`handleTriggerLeave`),t=w(e=>m(e,c),`handleContentLeave`);return c.addEventListener(`pointerleave`,e),d.addEventListener(`pointerleave`,t),()=>{c.removeEventListener(`pointerleave`,e),d.removeEventListener(`pointerleave`,t)}}},[c,d,m,p]),x.useEffect(()=>{if(o){let e=w(e=>{let t=e.target,n={x:e.clientX,y:e.clientY},r=c?.contains(t)||d?.contains(t),i=!Z(n,o);r?p():i&&(p(),l())},`handleTrackPointerGrace`);return document.addEventListener(`pointermove`,e),()=>document.removeEventListener(`pointermove`,e)}},[c,d,o,l,p]),(0,S.jsx)(K,{...e,ref:a})},`TooltipContentHoverable`)),G=y(`TooltipContent`),K=x.forwardRef(w(function(e,t){let{__scopeTooltip:n,children:r,"aria-label":a,id:s,onEscapeKeyDown:c,onPointerDownOutside:l,...u}=e,f=F(U,n),m=D(n),{onClose:h}=f;x.useEffect(()=>(document.addEventListener(A,h),()=>document.removeEventListener(A,h)),[h]),x.useEffect(()=>{if(f.trigger){let e=w(e=>{e.target instanceof Node&&e.target.contains(f.trigger)&&h()},`handleScroll`);return window.addEventListener(`scroll`,e,{capture:!0}),()=>window.removeEventListener(`scroll`,e,{capture:!0})}},[f.trigger,h]);let{setContentId:g}=f;return d(()=>(g(s),()=>{g(void 0)}),[s,g]),(0,S.jsx)(p,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:c,onPointerDownOutside:l,onFocusOutside:e=>e.preventDefault(),onDismiss:h,children:(0,S.jsxs)(o,{"data-state":f.stateAttribute,role:a?void 0:`tooltip`,id:a?void 0:f.contentId,...m,...u,ref:t,style:{...u.style,"--radix-tooltip-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-tooltip-content-available-width":`var(--radix-popper-available-width)`,"--radix-tooltip-content-available-height":`var(--radix-popper-available-height)`,"--radix-tooltip-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-tooltip-trigger-height":`var(--radix-popper-anchor-height)`},children:[(0,S.jsx)(G,{children:r}),a?(0,S.jsx)(i,{id:f.contentId,role:`tooltip`,children:a}):null]})})},`TooltipContentImpl`)),q=x.forwardRef(w(function(e,t){let{__scopeTooltip:n,...r}=e,i=D(n);return(0,S.jsx)(l,{...i,...r,ref:t})},`TooltipArrow`));function J(e,t){let n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),i=Math.abs(t.right-e.x),a=Math.abs(t.left-e.x);switch(Math.min(n,r,i,a)){case a:return`left`;case i:return`right`;case n:return`top`;case r:return`bottom`;default:throw Error(`unreachable`)}}w(J,`getExitSideFromRect`);function Y(e,t,n=5){let r=[];switch(t){case`top`:r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case`bottom`:r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case`left`:r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case`right`:r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n})}return r}w(Y,`getPaddedExitPoints`);function X(e){let{top:t,right:n,bottom:r,left:i}=e;return[{x:i,y:t},{x:n,y:t},{x:n,y:r},{x:i,y:r}]}w(X,`getPointsFromRect`);function Z(e,t){let{x:n,y:r}=e,i=!1;for(let e=0,a=t.length-1;e<t.length;a=e++){let o=t[e],s=t[a],c=o.x,l=o.y,u=s.x,d=s.y;l>r!=d>r&&n<(u-c)*(r-l)/(d-l)+c&&(i=!i)}return i}w(Z,`isPointInPolygon`);function Q(e){let t=e.slice();return t.sort((e,t)=>e.x<t.x?-1:e.x>t.x?1:e.y<t.y?-1:+(e.y>t.y)),$(t)}w(Q,`getHull`);function $(e){if(e.length<=1)return e.slice();let t=[];for(let n=0;n<e.length;n++){let r=e[n];for(;t.length>=2;){let e=t[t.length-1],n=t[t.length-2];if((e.x-n.x)*(r.y-n.y)>=(e.y-n.y)*(r.x-n.x))t.pop();else break}t.push(r)}t.pop();let n=[];for(let t=e.length-1;t>=0;t--){let r=e[t];for(;n.length>=2;){let e=n[n.length-1],t=n[n.length-2];if((e.x-t.x)*(r.y-t.y)>=(e.y-t.y)*(r.x-t.x))n.pop();else break}n.push(r)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}w($,`getHullPresorted`);var ne=N,re=I,ie=R,ae=H,oe=te,se=q;function ce({delayDuration:e=0,...t}){return(0,S.jsx)(ne,{"data-slot":`tooltip-provider`,delayDuration:e,...t})}function le({...e}){return(0,S.jsx)(re,{"data-slot":`tooltip`,...e})}function ue({...e}){return(0,S.jsx)(ie,{"data-slot":`tooltip-trigger`,...e})}function de({className:e,sideOffset:t=0,children:n,...i}){return(0,S.jsx)(ae,{children:(0,S.jsxs)(oe,{"data-slot":`tooltip-content`,sideOffset:t,className:r(`z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95`,e),...i,children:[n,(0,S.jsx)(se,{className:`z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground`})]})})}export{ue as i,de as n,ce as r,le as t};
2
+ //# sourceMappingURL=tooltip-BXqFQv9N.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-BK5FqmJ0.js","names":["TooltipProvider","Tooltip","PopperPrimitive.Root","TooltipTrigger","PopperPrimitive.Anchor","PortalPrimitive","TooltipContent","PopperPrimitive.Content","VisuallyHiddenPrimitive.Root","PopperPrimitive.Arrow","TooltipPrimitive.Provider","TooltipPrimitive.Root","TooltipPrimitive.Trigger","TooltipPrimitive.Portal","TooltipPrimitive.Content","TooltipPrimitive.Arrow","__toESM","require_jsx_runtime","cn","Root","createPopperScope","Content","Anchor","Root2","Arrow","useComposedRefs","useLayoutEffect2","Primitive","DismissableLayer","useControllableState","Portal$1","useId","createSlottable","createContextScope","import_react","require_react","import_jsx_runtime","__defProp","__name","target","createTooltipContext","createTooltipScope","usePopperScope","PROVIDER_NAME","DEFAULT_DELAY_DURATION","TOOLTIP_OPEN","TooltipProviderContextProvider","useTooltipProviderContext","TooltipProvider$1","props","isOpenDelayedRef","isPointerInTransitRef","skipDelayTimerRef","skipDelayTimer","__scopeTooltip","skipDelayDuration","inTransit","TOOLTIP_NAME","TooltipContextProvider","useTooltipContext","Tooltip$1","openProp","disableHoverableContentProp","delayDurationProp","providerContext","popperScope","trigger","setTrigger","contentIdState","setContentId","generatedContentId","openTimerRef","disableHoverableContent","delayDuration","wasOpenDelayedRef","open","setOpen","defaultOpen","open2","onOpenChange","stateAttribute","handleOpen","handleClose","handleDelayedOpen","contentId","TRIGGER_NAME","TooltipTrigger$1","triggerProps","context","ref","composedRefs","forwardedRef","isPointerDownRef","hasPointerMoveOpenedRef","handlePointerUp","composeEventHandlers","event","PORTAL_NAME","PortalProvider","usePortalContext","TooltipPortal","Presence","forceMount","CONTENT_NAME","TooltipContent$1","portalContext","contentProps","TooltipContentImpl","TooltipContentHoverable","pointerGraceArea","setPointerGraceArea","content","handleRemoveGraceArea","onPointerInTransitChange","handleCreateGraceArea","currentTarget","exitPoint","paddedExitPoints","getPaddedExitPoints","getExitSideFromRect","hoverTargetPoints","getPointsFromRect","hoverTarget","graceArea","getHull","handleTriggerLeave","handleContentLeave","handleTrackPointerGrace","pointerPosition","hasEnteredTarget","isPointerOutsideGraceArea","isPointInPolygon","onClose","Slottable","ariaLabel","idProp","handleScroll","TooltipArrow","arrowProps","top","rect","point","bottom","right","left","exitSide","padding","inside","i","j","polygon","ii","jj","xi","yi","xj","yj","y","x","newPoints","points","a","b","getHullPresorted","upperHull","p","q","r","lowerHull","Provider","Root3","Trigger","Portal","Content2","Arrow2","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","className","children"],"sources":["../../../../node_modules/.pnpm/@radix-ui+react-tooltip@1.2.16_@types+react-dom@19.3.0_@types+react@19.3.0__@types+reac_410793db862c85b741943c612cdfda62/node_modules/@radix-ui/react-tooltip/dist/index.mjs","../../src/components/ui/tooltip.tsx"],"sourcesContent":["\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/tooltip.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlottable } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport * as VisuallyHiddenPrimitive from \"@radix-ui/react-visually-hidden\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar [createTooltipContext, createTooltipScope] = createContextScope(\"Tooltip\", [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar PROVIDER_NAME = \"TooltipProvider\";\nvar DEFAULT_DELAY_DURATION = 700;\nvar TOOLTIP_OPEN = \"tooltip.open\";\nvar [TooltipProviderContextProvider, useTooltipProviderContext] = createTooltipContext(PROVIDER_NAME);\nvar TooltipProvider = /* @__PURE__ */ __name((props) => {\n const {\n __scopeTooltip,\n delayDuration = DEFAULT_DELAY_DURATION,\n skipDelayDuration = 300,\n disableHoverableContent = false,\n children\n } = props;\n const isOpenDelayedRef = React.useRef(true);\n const isPointerInTransitRef = React.useRef(false);\n const skipDelayTimerRef = React.useRef(0);\n React.useEffect(() => {\n const skipDelayTimer = skipDelayTimerRef.current;\n return () => window.clearTimeout(skipDelayTimer);\n }, []);\n return /* @__PURE__ */ jsx(\n TooltipProviderContextProvider,\n {\n scope: __scopeTooltip,\n isOpenDelayedRef,\n delayDuration,\n onOpen: React.useCallback(() => {\n if (skipDelayDuration <= 0) return;\n window.clearTimeout(skipDelayTimerRef.current);\n isOpenDelayedRef.current = false;\n }, [skipDelayDuration]),\n onClose: React.useCallback(() => {\n if (skipDelayDuration <= 0) return;\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(\n () => isOpenDelayedRef.current = true,\n skipDelayDuration\n );\n }, [skipDelayDuration]),\n isPointerInTransitRef,\n onPointerInTransitChange: React.useCallback((inTransit) => {\n isPointerInTransitRef.current = inTransit;\n }, []),\n disableHoverableContent,\n children\n }\n );\n}, \"TooltipProvider\");\nvar TOOLTIP_NAME = \"Tooltip\";\nvar [TooltipContextProvider, useTooltipContext] = createTooltipContext(TOOLTIP_NAME);\nvar Tooltip = /* @__PURE__ */ __name((props) => {\n const {\n __scopeTooltip,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n disableHoverableContent: disableHoverableContentProp,\n delayDuration: delayDurationProp\n } = props;\n const providerContext = useTooltipProviderContext(TOOLTIP_NAME, props.__scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const [trigger, setTrigger] = React.useState(null);\n const [contentIdState, setContentId] = React.useState(void 0);\n const generatedContentId = useId();\n const openTimerRef = React.useRef(0);\n const disableHoverableContent = disableHoverableContentProp ?? providerContext.disableHoverableContent;\n const delayDuration = delayDurationProp ?? providerContext.delayDuration;\n const wasOpenDelayedRef = React.useRef(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: /* @__PURE__ */ __name((open2) => {\n if (open2) {\n providerContext.onOpen();\n document.dispatchEvent(new CustomEvent(TOOLTIP_OPEN));\n } else {\n providerContext.onClose();\n }\n onOpenChange?.(open2);\n }, \"onChange\"),\n caller: TOOLTIP_NAME\n });\n const stateAttribute = React.useMemo(() => {\n return open ? wasOpenDelayedRef.current ? \"delayed-open\" : \"instant-open\" : \"closed\";\n }, [open]);\n const handleOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n wasOpenDelayedRef.current = false;\n setOpen(true);\n }, [setOpen]);\n const handleClose = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }, [setOpen]);\n const handleDelayedOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = window.setTimeout(() => {\n wasOpenDelayedRef.current = true;\n setOpen(true);\n openTimerRef.current = 0;\n }, delayDuration);\n }, [delayDuration, setOpen]);\n React.useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n const contentId = contentIdState ?? generatedContentId;\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n TooltipContextProvider,\n {\n scope: __scopeTooltip,\n contentId,\n setContentId,\n open,\n stateAttribute,\n trigger,\n onTriggerChange: setTrigger,\n onTriggerEnter: React.useCallback(() => {\n if (providerContext.isOpenDelayedRef.current) handleDelayedOpen();\n else handleOpen();\n }, [providerContext.isOpenDelayedRef, handleDelayedOpen, handleOpen]),\n onTriggerLeave: React.useCallback(() => {\n if (disableHoverableContent) {\n handleClose();\n } else {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n }, [handleClose, disableHoverableContent]),\n onOpen: handleOpen,\n onClose: handleClose,\n disableHoverableContent,\n children\n }\n ) });\n}, \"Tooltip\");\nvar TRIGGER_NAME = \"TooltipTrigger\";\nvar TooltipTrigger = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function TooltipTrigger2(props, forwardedRef) {\n const { __scopeTooltip, ...triggerProps } = props;\n const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);\n const providerContext = useTooltipProviderContext(TRIGGER_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onTriggerChange);\n const isPointerDownRef = React.useRef(false);\n const hasPointerMoveOpenedRef = React.useRef(false);\n const handlePointerUp = React.useCallback(() => isPointerDownRef.current = false, []);\n React.useEffect(() => {\n return () => document.removeEventListener(\"pointerup\", handlePointerUp);\n }, [handlePointerUp]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n \"aria-describedby\": context.open ? context.contentId : void 0,\n \"data-state\": context.stateAttribute,\n ...triggerProps,\n ref: composedRefs,\n onPointerMove: composeEventHandlers(props.onPointerMove, (event) => {\n if (event.pointerType === \"touch\") return;\n if (!hasPointerMoveOpenedRef.current && !providerContext.isPointerInTransitRef.current) {\n context.onTriggerEnter();\n hasPointerMoveOpenedRef.current = true;\n }\n }),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => {\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n }),\n onPointerDown: composeEventHandlers(props.onPointerDown, () => {\n if (context.open) {\n context.onClose();\n }\n isPointerDownRef.current = true;\n document.addEventListener(\"pointerup\", handlePointerUp, { once: true });\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n if (!isPointerDownRef.current) context.onOpen();\n }),\n onBlur: composeEventHandlers(props.onBlur, context.onClose),\n onClick: composeEventHandlers(props.onClick, context.onClose)\n }\n ) });\n }, \"TooltipTrigger\")\n);\nvar PORTAL_NAME = \"TooltipPortal\";\nvar [PortalProvider, usePortalContext] = createTooltipContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar TooltipPortal = /* @__PURE__ */ __name((props) => {\n const { __scopeTooltip, forceMount, children, container } = props;\n const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeTooltip, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n}, \"TooltipPortal\");\nvar CONTENT_NAME = \"TooltipContent\";\nvar TooltipContent = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function TooltipContent2(props, forwardedRef) {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);\n const { forceMount = portalContext.forceMount, side = \"top\", ...contentProps } = props;\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.disableHoverableContent ? /* @__PURE__ */ jsx(TooltipContentImpl, { side, ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(TooltipContentHoverable, { side, ...contentProps, ref: forwardedRef }) });\n }, \"TooltipContent\")\n);\nvar TooltipContentHoverable = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function TooltipContentHoverable2(props, forwardedRef) {\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n const providerContext = useTooltipProviderContext(CONTENT_NAME, props.__scopeTooltip);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [pointerGraceArea, setPointerGraceArea] = React.useState(null);\n const { trigger, onClose } = context;\n const content = ref.current;\n const { onPointerInTransitChange } = providerContext;\n const handleRemoveGraceArea = React.useCallback(() => {\n setPointerGraceArea(null);\n onPointerInTransitChange(false);\n }, [onPointerInTransitChange]);\n const handleCreateGraceArea = React.useCallback(\n (event, hoverTarget) => {\n const currentTarget = event.currentTarget;\n const exitPoint = { x: event.clientX, y: event.clientY };\n const exitSide = getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect());\n const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);\n const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());\n const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);\n setPointerGraceArea(graceArea);\n onPointerInTransitChange(true);\n },\n [onPointerInTransitChange]\n );\n React.useEffect(() => {\n return () => handleRemoveGraceArea();\n }, [handleRemoveGraceArea]);\n React.useEffect(() => {\n if (trigger && content) {\n const handleTriggerLeave = /* @__PURE__ */ __name((event) => handleCreateGraceArea(event, content), \"handleTriggerLeave\");\n const handleContentLeave = /* @__PURE__ */ __name((event) => handleCreateGraceArea(event, trigger), \"handleContentLeave\");\n trigger.addEventListener(\"pointerleave\", handleTriggerLeave);\n content.addEventListener(\"pointerleave\", handleContentLeave);\n return () => {\n trigger.removeEventListener(\"pointerleave\", handleTriggerLeave);\n content.removeEventListener(\"pointerleave\", handleContentLeave);\n };\n }\n }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]);\n React.useEffect(() => {\n if (pointerGraceArea) {\n const handleTrackPointerGrace = /* @__PURE__ */ __name((event) => {\n const target = event.target;\n const pointerPosition = { x: event.clientX, y: event.clientY };\n const hasEnteredTarget = trigger?.contains(target) || content?.contains(target);\n const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);\n if (hasEnteredTarget) {\n handleRemoveGraceArea();\n } else if (isPointerOutsideGraceArea) {\n handleRemoveGraceArea();\n onClose();\n }\n }, \"handleTrackPointerGrace\");\n document.addEventListener(\"pointermove\", handleTrackPointerGrace);\n return () => document.removeEventListener(\"pointermove\", handleTrackPointerGrace);\n }\n }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]);\n return /* @__PURE__ */ jsx(TooltipContentImpl, { ...props, ref: composedRefs });\n}, \"TooltipContentHoverable\"));\nvar Slottable = createSlottable(\"TooltipContent\");\nvar TooltipContentImpl = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function TooltipContentImpl2(props, forwardedRef) {\n const {\n __scopeTooltip,\n children,\n \"aria-label\": ariaLabel,\n id: idProp,\n onEscapeKeyDown,\n onPointerDownOutside,\n ...contentProps\n } = props;\n const context = useTooltipContext(CONTENT_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const { onClose } = context;\n React.useEffect(() => {\n document.addEventListener(TOOLTIP_OPEN, onClose);\n return () => document.removeEventListener(TOOLTIP_OPEN, onClose);\n }, [onClose]);\n React.useEffect(() => {\n if (context.trigger) {\n const handleScroll = /* @__PURE__ */ __name((event) => {\n if (event.target instanceof Node && event.target.contains(context.trigger)) {\n onClose();\n }\n }, \"handleScroll\");\n window.addEventListener(\"scroll\", handleScroll, { capture: true });\n return () => window.removeEventListener(\"scroll\", handleScroll, { capture: true });\n }\n }, [context.trigger, onClose]);\n const { setContentId } = context;\n useLayoutEffect(() => {\n setContentId(idProp);\n return () => {\n setContentId(void 0);\n };\n }, [idProp, setContentId]);\n return /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents: false,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside: (event) => event.preventDefault(),\n onDismiss: onClose,\n children: /* @__PURE__ */ jsxs(\n PopperPrimitive.Content,\n {\n \"data-state\": context.stateAttribute,\n role: ariaLabel ? void 0 : \"tooltip\",\n id: ariaLabel ? void 0 : context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-tooltip-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-tooltip-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-tooltip-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-tooltip-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-tooltip-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n },\n children: [\n /* @__PURE__ */ jsx(Slottable, { children }),\n ariaLabel ? /* @__PURE__ */ jsx(VisuallyHiddenPrimitive.Root, { id: context.contentId, role: \"tooltip\", children: ariaLabel }) : null\n ]\n }\n )\n }\n );\n }, \"TooltipContentImpl\")\n);\nvar TooltipArrow = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function TooltipArrow2(props, forwardedRef) {\n const { __scopeTooltip, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeTooltip);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }, \"TooltipArrow\")\n);\nfunction getExitSideFromRect(point, rect) {\n const top = Math.abs(rect.top - point.y);\n const bottom = Math.abs(rect.bottom - point.y);\n const right = Math.abs(rect.right - point.x);\n const left = Math.abs(rect.left - point.x);\n switch (Math.min(top, bottom, right, left)) {\n case left:\n return \"left\";\n case right:\n return \"right\";\n case top:\n return \"top\";\n case bottom:\n return \"bottom\";\n default:\n throw new Error(\"unreachable\");\n }\n}\n__name(getExitSideFromRect, \"getExitSideFromRect\");\nfunction getPaddedExitPoints(exitPoint, exitSide, padding = 5) {\n const paddedExitPoints = [];\n switch (exitSide) {\n case \"top\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case \"bottom\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y - padding }\n );\n break;\n case \"left\":\n paddedExitPoints.push(\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case \"right\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x - padding, y: exitPoint.y + padding }\n );\n break;\n }\n return paddedExitPoints;\n}\n__name(getPaddedExitPoints, \"getPaddedExitPoints\");\nfunction getPointsFromRect(rect) {\n const { top, right, bottom, left } = rect;\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom }\n ];\n}\n__name(getPointsFromRect, \"getPointsFromRect\");\nfunction isPointInPolygon(point, polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i];\n const jj = polygon[j];\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\n__name(isPointInPolygon, \"isPointInPolygon\");\nfunction getHull(points) {\n const newPoints = points.slice();\n newPoints.sort((a, b) => {\n if (a.x < b.x) return -1;\n else if (a.x > b.x) return 1;\n else if (a.y < b.y) return -1;\n else if (a.y > b.y) return 1;\n else return 0;\n });\n return getHullPresorted(newPoints);\n}\n__name(getHull, \"getHull\");\nfunction getHullPresorted(points) {\n if (points.length <= 1) return points.slice();\n const upperHull = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1];\n const r = upperHull[upperHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop();\n else break;\n }\n upperHull.push(p);\n }\n upperHull.pop();\n const lowerHull = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i];\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1];\n const r = lowerHull[lowerHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop();\n else break;\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n if (upperHull.length === 1 && lowerHull.length === 1 && upperHull[0].x === lowerHull[0].x && upperHull[0].y === lowerHull[0].y) {\n return upperHull;\n } else {\n return upperHull.concat(lowerHull);\n }\n}\n__name(getHullPresorted, \"getHullPresorted\");\nvar Provider = TooltipProvider;\nvar Root3 = Tooltip;\nvar Trigger = TooltipTrigger;\nvar Portal = TooltipPortal;\nvar Content2 = TooltipContent;\nvar Arrow2 = TooltipArrow;\nexport {\n Arrow2 as Arrow,\n Content2 as Content,\n Portal,\n Provider,\n Root3 as Root,\n Tooltip,\n TooltipArrow,\n TooltipContent,\n TooltipPortal,\n TooltipProvider,\n TooltipTrigger,\n Trigger,\n createTooltipScope\n};\n//# sourceMappingURL=index.mjs.map\n","import { Tooltip as TooltipPrimitive } from 'radix-ui';\nimport * as React from 'react';\nimport { cn } from '@/helpers/cn';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />;\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n"],"ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"tooltip-BXqFQv9N.js","names":["TooltipProvider","Tooltip","PopperPrimitive.Root","TooltipTrigger","PopperPrimitive.Anchor","PortalPrimitive","TooltipContent","PopperPrimitive.Content","VisuallyHiddenPrimitive.Root","PopperPrimitive.Arrow","TooltipPrimitive.Provider","TooltipPrimitive.Root","TooltipPrimitive.Trigger","TooltipPrimitive.Portal","TooltipPrimitive.Content","TooltipPrimitive.Arrow","__toESM","require_jsx_runtime","cn","Root","createPopperScope","Content","Anchor","Root2","Arrow","useComposedRefs","useLayoutEffect2","Primitive","DismissableLayer","useControllableState","Portal$1","useId","createSlottable","createContextScope","import_react","require_react","import_jsx_runtime","__defProp","__name","target","createTooltipContext","createTooltipScope","usePopperScope","PROVIDER_NAME","DEFAULT_DELAY_DURATION","TOOLTIP_OPEN","TooltipProviderContextProvider","useTooltipProviderContext","TooltipProvider$1","props","isOpenDelayedRef","isPointerInTransitRef","skipDelayTimerRef","skipDelayTimer","__scopeTooltip","skipDelayDuration","inTransit","TOOLTIP_NAME","TooltipContextProvider","useTooltipContext","Tooltip$1","openProp","disableHoverableContentProp","delayDurationProp","providerContext","popperScope","trigger","setTrigger","contentIdState","setContentId","generatedContentId","openTimerRef","disableHoverableContent","delayDuration","wasOpenDelayedRef","open","setOpen","defaultOpen","open2","onOpenChange","stateAttribute","handleOpen","handleClose","handleDelayedOpen","contentId","TRIGGER_NAME","TooltipTrigger$1","triggerProps","context","ref","composedRefs","forwardedRef","isPointerDownRef","hasPointerMoveOpenedRef","handlePointerUp","composeEventHandlers","event","PORTAL_NAME","PortalProvider","usePortalContext","TooltipPortal","Presence","forceMount","CONTENT_NAME","TooltipContent$1","portalContext","contentProps","TooltipContentImpl","TooltipContentHoverable","pointerGraceArea","setPointerGraceArea","content","handleRemoveGraceArea","onPointerInTransitChange","handleCreateGraceArea","currentTarget","exitPoint","paddedExitPoints","getPaddedExitPoints","getExitSideFromRect","hoverTargetPoints","getPointsFromRect","hoverTarget","graceArea","getHull","handleTriggerLeave","handleContentLeave","handleTrackPointerGrace","pointerPosition","hasEnteredTarget","isPointerOutsideGraceArea","isPointInPolygon","onClose","Slottable","ariaLabel","idProp","handleScroll","TooltipArrow","arrowProps","top","rect","point","bottom","right","left","exitSide","padding","inside","i","j","polygon","ii","jj","xi","yi","xj","yj","y","x","newPoints","points","a","b","getHullPresorted","upperHull","p","q","r","lowerHull","Provider","Root3","Trigger","Portal","Content2","Arrow2","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","className","children"],"sources":["../../../../node_modules/.pnpm/@radix-ui+react-tooltip@1.2.16_@types+react-dom@19.3.0_@types+react@19.3.0__@types+reac_410793db862c85b741943c612cdfda62/node_modules/@radix-ui/react-tooltip/dist/index.mjs","../../src/components/ui/tooltip.tsx"],"sourcesContent":["\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/tooltip.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlottable } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport * as VisuallyHiddenPrimitive from \"@radix-ui/react-visually-hidden\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar [createTooltipContext, createTooltipScope] = createContextScope(\"Tooltip\", [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar PROVIDER_NAME = \"TooltipProvider\";\nvar DEFAULT_DELAY_DURATION = 700;\nvar TOOLTIP_OPEN = \"tooltip.open\";\nvar [TooltipProviderContextProvider, useTooltipProviderContext] = createTooltipContext(PROVIDER_NAME);\nvar TooltipProvider = /* @__PURE__ */ __name((props) => {\n const {\n __scopeTooltip,\n delayDuration = DEFAULT_DELAY_DURATION,\n skipDelayDuration = 300,\n disableHoverableContent = false,\n children\n } = props;\n const isOpenDelayedRef = React.useRef(true);\n const isPointerInTransitRef = React.useRef(false);\n const skipDelayTimerRef = React.useRef(0);\n React.useEffect(() => {\n const skipDelayTimer = skipDelayTimerRef.current;\n return () => window.clearTimeout(skipDelayTimer);\n }, []);\n return /* @__PURE__ */ jsx(\n TooltipProviderContextProvider,\n {\n scope: __scopeTooltip,\n isOpenDelayedRef,\n delayDuration,\n onOpen: React.useCallback(() => {\n if (skipDelayDuration <= 0) return;\n window.clearTimeout(skipDelayTimerRef.current);\n isOpenDelayedRef.current = false;\n }, [skipDelayDuration]),\n onClose: React.useCallback(() => {\n if (skipDelayDuration <= 0) return;\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(\n () => isOpenDelayedRef.current = true,\n skipDelayDuration\n );\n }, [skipDelayDuration]),\n isPointerInTransitRef,\n onPointerInTransitChange: React.useCallback((inTransit) => {\n isPointerInTransitRef.current = inTransit;\n }, []),\n disableHoverableContent,\n children\n }\n );\n}, \"TooltipProvider\");\nvar TOOLTIP_NAME = \"Tooltip\";\nvar [TooltipContextProvider, useTooltipContext] = createTooltipContext(TOOLTIP_NAME);\nvar Tooltip = /* @__PURE__ */ __name((props) => {\n const {\n __scopeTooltip,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n disableHoverableContent: disableHoverableContentProp,\n delayDuration: delayDurationProp\n } = props;\n const providerContext = useTooltipProviderContext(TOOLTIP_NAME, props.__scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const [trigger, setTrigger] = React.useState(null);\n const [contentIdState, setContentId] = React.useState(void 0);\n const generatedContentId = useId();\n const openTimerRef = React.useRef(0);\n const disableHoverableContent = disableHoverableContentProp ?? providerContext.disableHoverableContent;\n const delayDuration = delayDurationProp ?? providerContext.delayDuration;\n const wasOpenDelayedRef = React.useRef(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: /* @__PURE__ */ __name((open2) => {\n if (open2) {\n providerContext.onOpen();\n document.dispatchEvent(new CustomEvent(TOOLTIP_OPEN));\n } else {\n providerContext.onClose();\n }\n onOpenChange?.(open2);\n }, \"onChange\"),\n caller: TOOLTIP_NAME\n });\n const stateAttribute = React.useMemo(() => {\n return open ? wasOpenDelayedRef.current ? \"delayed-open\" : \"instant-open\" : \"closed\";\n }, [open]);\n const handleOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n wasOpenDelayedRef.current = false;\n setOpen(true);\n }, [setOpen]);\n const handleClose = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }, [setOpen]);\n const handleDelayedOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = window.setTimeout(() => {\n wasOpenDelayedRef.current = true;\n setOpen(true);\n openTimerRef.current = 0;\n }, delayDuration);\n }, [delayDuration, setOpen]);\n React.useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n const contentId = contentIdState ?? generatedContentId;\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n TooltipContextProvider,\n {\n scope: __scopeTooltip,\n contentId,\n setContentId,\n open,\n stateAttribute,\n trigger,\n onTriggerChange: setTrigger,\n onTriggerEnter: React.useCallback(() => {\n if (providerContext.isOpenDelayedRef.current) handleDelayedOpen();\n else handleOpen();\n }, [providerContext.isOpenDelayedRef, handleDelayedOpen, handleOpen]),\n onTriggerLeave: React.useCallback(() => {\n if (disableHoverableContent) {\n handleClose();\n } else {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n }, [handleClose, disableHoverableContent]),\n onOpen: handleOpen,\n onClose: handleClose,\n disableHoverableContent,\n children\n }\n ) });\n}, \"Tooltip\");\nvar TRIGGER_NAME = \"TooltipTrigger\";\nvar TooltipTrigger = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function TooltipTrigger2(props, forwardedRef) {\n const { __scopeTooltip, ...triggerProps } = props;\n const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);\n const providerContext = useTooltipProviderContext(TRIGGER_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onTriggerChange);\n const isPointerDownRef = React.useRef(false);\n const hasPointerMoveOpenedRef = React.useRef(false);\n const handlePointerUp = React.useCallback(() => isPointerDownRef.current = false, []);\n React.useEffect(() => {\n return () => document.removeEventListener(\"pointerup\", handlePointerUp);\n }, [handlePointerUp]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n \"aria-describedby\": context.open ? context.contentId : void 0,\n \"data-state\": context.stateAttribute,\n ...triggerProps,\n ref: composedRefs,\n onPointerMove: composeEventHandlers(props.onPointerMove, (event) => {\n if (event.pointerType === \"touch\") return;\n if (!hasPointerMoveOpenedRef.current && !providerContext.isPointerInTransitRef.current) {\n context.onTriggerEnter();\n hasPointerMoveOpenedRef.current = true;\n }\n }),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => {\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n }),\n onPointerDown: composeEventHandlers(props.onPointerDown, () => {\n if (context.open) {\n context.onClose();\n }\n isPointerDownRef.current = true;\n document.addEventListener(\"pointerup\", handlePointerUp, { once: true });\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n if (!isPointerDownRef.current) context.onOpen();\n }),\n onBlur: composeEventHandlers(props.onBlur, context.onClose),\n onClick: composeEventHandlers(props.onClick, context.onClose)\n }\n ) });\n }, \"TooltipTrigger\")\n);\nvar PORTAL_NAME = \"TooltipPortal\";\nvar [PortalProvider, usePortalContext] = createTooltipContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar TooltipPortal = /* @__PURE__ */ __name((props) => {\n const { __scopeTooltip, forceMount, children, container } = props;\n const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeTooltip, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n}, \"TooltipPortal\");\nvar CONTENT_NAME = \"TooltipContent\";\nvar TooltipContent = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function TooltipContent2(props, forwardedRef) {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);\n const { forceMount = portalContext.forceMount, side = \"top\", ...contentProps } = props;\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.disableHoverableContent ? /* @__PURE__ */ jsx(TooltipContentImpl, { side, ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(TooltipContentHoverable, { side, ...contentProps, ref: forwardedRef }) });\n }, \"TooltipContent\")\n);\nvar TooltipContentHoverable = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function TooltipContentHoverable2(props, forwardedRef) {\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n const providerContext = useTooltipProviderContext(CONTENT_NAME, props.__scopeTooltip);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [pointerGraceArea, setPointerGraceArea] = React.useState(null);\n const { trigger, onClose } = context;\n const content = ref.current;\n const { onPointerInTransitChange } = providerContext;\n const handleRemoveGraceArea = React.useCallback(() => {\n setPointerGraceArea(null);\n onPointerInTransitChange(false);\n }, [onPointerInTransitChange]);\n const handleCreateGraceArea = React.useCallback(\n (event, hoverTarget) => {\n const currentTarget = event.currentTarget;\n const exitPoint = { x: event.clientX, y: event.clientY };\n const exitSide = getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect());\n const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);\n const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());\n const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);\n setPointerGraceArea(graceArea);\n onPointerInTransitChange(true);\n },\n [onPointerInTransitChange]\n );\n React.useEffect(() => {\n return () => handleRemoveGraceArea();\n }, [handleRemoveGraceArea]);\n React.useEffect(() => {\n if (trigger && content) {\n const handleTriggerLeave = /* @__PURE__ */ __name((event) => handleCreateGraceArea(event, content), \"handleTriggerLeave\");\n const handleContentLeave = /* @__PURE__ */ __name((event) => handleCreateGraceArea(event, trigger), \"handleContentLeave\");\n trigger.addEventListener(\"pointerleave\", handleTriggerLeave);\n content.addEventListener(\"pointerleave\", handleContentLeave);\n return () => {\n trigger.removeEventListener(\"pointerleave\", handleTriggerLeave);\n content.removeEventListener(\"pointerleave\", handleContentLeave);\n };\n }\n }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]);\n React.useEffect(() => {\n if (pointerGraceArea) {\n const handleTrackPointerGrace = /* @__PURE__ */ __name((event) => {\n const target = event.target;\n const pointerPosition = { x: event.clientX, y: event.clientY };\n const hasEnteredTarget = trigger?.contains(target) || content?.contains(target);\n const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);\n if (hasEnteredTarget) {\n handleRemoveGraceArea();\n } else if (isPointerOutsideGraceArea) {\n handleRemoveGraceArea();\n onClose();\n }\n }, \"handleTrackPointerGrace\");\n document.addEventListener(\"pointermove\", handleTrackPointerGrace);\n return () => document.removeEventListener(\"pointermove\", handleTrackPointerGrace);\n }\n }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]);\n return /* @__PURE__ */ jsx(TooltipContentImpl, { ...props, ref: composedRefs });\n}, \"TooltipContentHoverable\"));\nvar Slottable = createSlottable(\"TooltipContent\");\nvar TooltipContentImpl = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function TooltipContentImpl2(props, forwardedRef) {\n const {\n __scopeTooltip,\n children,\n \"aria-label\": ariaLabel,\n id: idProp,\n onEscapeKeyDown,\n onPointerDownOutside,\n ...contentProps\n } = props;\n const context = useTooltipContext(CONTENT_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const { onClose } = context;\n React.useEffect(() => {\n document.addEventListener(TOOLTIP_OPEN, onClose);\n return () => document.removeEventListener(TOOLTIP_OPEN, onClose);\n }, [onClose]);\n React.useEffect(() => {\n if (context.trigger) {\n const handleScroll = /* @__PURE__ */ __name((event) => {\n if (event.target instanceof Node && event.target.contains(context.trigger)) {\n onClose();\n }\n }, \"handleScroll\");\n window.addEventListener(\"scroll\", handleScroll, { capture: true });\n return () => window.removeEventListener(\"scroll\", handleScroll, { capture: true });\n }\n }, [context.trigger, onClose]);\n const { setContentId } = context;\n useLayoutEffect(() => {\n setContentId(idProp);\n return () => {\n setContentId(void 0);\n };\n }, [idProp, setContentId]);\n return /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents: false,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside: (event) => event.preventDefault(),\n onDismiss: onClose,\n children: /* @__PURE__ */ jsxs(\n PopperPrimitive.Content,\n {\n \"data-state\": context.stateAttribute,\n role: ariaLabel ? void 0 : \"tooltip\",\n id: ariaLabel ? void 0 : context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-tooltip-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-tooltip-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-tooltip-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-tooltip-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-tooltip-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n },\n children: [\n /* @__PURE__ */ jsx(Slottable, { children }),\n ariaLabel ? /* @__PURE__ */ jsx(VisuallyHiddenPrimitive.Root, { id: context.contentId, role: \"tooltip\", children: ariaLabel }) : null\n ]\n }\n )\n }\n );\n }, \"TooltipContentImpl\")\n);\nvar TooltipArrow = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function TooltipArrow2(props, forwardedRef) {\n const { __scopeTooltip, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeTooltip);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }, \"TooltipArrow\")\n);\nfunction getExitSideFromRect(point, rect) {\n const top = Math.abs(rect.top - point.y);\n const bottom = Math.abs(rect.bottom - point.y);\n const right = Math.abs(rect.right - point.x);\n const left = Math.abs(rect.left - point.x);\n switch (Math.min(top, bottom, right, left)) {\n case left:\n return \"left\";\n case right:\n return \"right\";\n case top:\n return \"top\";\n case bottom:\n return \"bottom\";\n default:\n throw new Error(\"unreachable\");\n }\n}\n__name(getExitSideFromRect, \"getExitSideFromRect\");\nfunction getPaddedExitPoints(exitPoint, exitSide, padding = 5) {\n const paddedExitPoints = [];\n switch (exitSide) {\n case \"top\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case \"bottom\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y - padding }\n );\n break;\n case \"left\":\n paddedExitPoints.push(\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case \"right\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x - padding, y: exitPoint.y + padding }\n );\n break;\n }\n return paddedExitPoints;\n}\n__name(getPaddedExitPoints, \"getPaddedExitPoints\");\nfunction getPointsFromRect(rect) {\n const { top, right, bottom, left } = rect;\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom }\n ];\n}\n__name(getPointsFromRect, \"getPointsFromRect\");\nfunction isPointInPolygon(point, polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i];\n const jj = polygon[j];\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\n__name(isPointInPolygon, \"isPointInPolygon\");\nfunction getHull(points) {\n const newPoints = points.slice();\n newPoints.sort((a, b) => {\n if (a.x < b.x) return -1;\n else if (a.x > b.x) return 1;\n else if (a.y < b.y) return -1;\n else if (a.y > b.y) return 1;\n else return 0;\n });\n return getHullPresorted(newPoints);\n}\n__name(getHull, \"getHull\");\nfunction getHullPresorted(points) {\n if (points.length <= 1) return points.slice();\n const upperHull = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1];\n const r = upperHull[upperHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop();\n else break;\n }\n upperHull.push(p);\n }\n upperHull.pop();\n const lowerHull = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i];\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1];\n const r = lowerHull[lowerHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop();\n else break;\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n if (upperHull.length === 1 && lowerHull.length === 1 && upperHull[0].x === lowerHull[0].x && upperHull[0].y === lowerHull[0].y) {\n return upperHull;\n } else {\n return upperHull.concat(lowerHull);\n }\n}\n__name(getHullPresorted, \"getHullPresorted\");\nvar Provider = TooltipProvider;\nvar Root3 = Tooltip;\nvar Trigger = TooltipTrigger;\nvar Portal = TooltipPortal;\nvar Content2 = TooltipContent;\nvar Arrow2 = TooltipArrow;\nexport {\n Arrow2 as Arrow,\n Content2 as Content,\n Portal,\n Provider,\n Root3 as Root,\n Tooltip,\n TooltipArrow,\n TooltipContent,\n TooltipPortal,\n TooltipProvider,\n TooltipTrigger,\n Trigger,\n createTooltipScope\n};\n//# sourceMappingURL=index.mjs.map\n","import { Tooltip as TooltipPrimitive } from 'radix-ui';\nimport * as React from 'react';\nimport { cn } from '@/helpers/cn';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />;\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n"],"ignoreList":[0],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{G as n}from"./src-B2qcqjNM.js";import{r}from"./schema-B7L9OJrX.js";var i=e(t(),1),a=()=>{let{definitions:e,error:t}=r();return{schema:(0,i.useMemo)(()=>{if(!e)return;let t=new Map,r=new Map;for(let{definition:i}of e)n(i)?r.set(i.id,i):t.set(i.id,i);return{models:t,components:r,sortedModels:[...t.values()].sort((e,t)=>e.label.localeCompare(t.label))}},[e]),error:t}},o=(e,t)=>e.sortedModels.find(e=>e.apiKey===t);export{a as n,o as t};
2
- //# sourceMappingURL=useContentSchema-BCdLYsKa.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{K as n}from"./src-Be3Ds5Dc.js";import{r}from"./schema-B7L9OJrX.js";var i=e(t(),1),a=()=>{let{definitions:e,error:t}=r();return{schema:(0,i.useMemo)(()=>{if(!e)return;let t=new Map,r=new Map;for(let{definition:i}of e)n(i)?r.set(i.id,i):t.set(i.id,i);return{models:t,components:r,sortedModels:[...t.values()].sort((e,t)=>e.label.localeCompare(t.label))}},[e]),error:t}},o=(e,t)=>e.sortedModels.find(e=>e.apiKey===t);export{a as n,o as t};
2
+ //# sourceMappingURL=useContentSchema-Cvtes34f.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useContentSchema-BCdLYsKa.js","names":["useMemo","__toESM","isComponentDefinition","import_react","require_react","useContentSchema","useAllDefinitions","definitions","models","components","definition","a","b","findModelByKey","schema","model","modelKey"],"sources":["../../src/features/Content/hooks/useContentSchema.ts"],"sourcesContent":["import { isComponentDefinition, type ComponentDefinition, type ModelDefinition } from '@shapio/schema';\nimport { useMemo } from 'react';\nimport { useAllDefinitions } from '@/api/schema';\n\nexport type ContentSchema = {\n models: ReadonlyMap<string, ModelDefinition>;\n components: ReadonlyMap<string, ComponentDefinition>;\n /** Collections and singletons, in label order (for navigation). */\n sortedModels: readonly ModelDefinition[];\n};\n\n/**\n * The active schema as the content screens need it. Models are data (CONTRIBUTING.md rule 2): routes carry a\n * model's API key and resolve it here at render time, so a model created a moment ago works at once.\n */\nexport const useContentSchema = (): { schema: ContentSchema | undefined; error: unknown } => {\n const { definitions, error } = useAllDefinitions();\n const schema = useMemo(() => {\n if (!definitions) {\n return undefined;\n }\n const models = new Map<string, ModelDefinition>();\n const components = new Map<string, ComponentDefinition>();\n for (const { definition } of definitions) {\n if (isComponentDefinition(definition)) {\n components.set(definition.id, definition);\n } else {\n models.set(definition.id, definition);\n }\n }\n const sortedModels = [...models.values()].sort((a, b) => a.label.localeCompare(b.label));\n return { models, components, sortedModels };\n }, [definitions]);\n return { schema, error };\n};\n\nexport const findModelByKey = (schema: ContentSchema, modelKey: string): ModelDefinition | undefined =>\n schema.sortedModels.find((model) => model.apiKey === modelKey);\n"],"mappings":"+KAeaK,MAAgF,CAC3F,GAAM,CAAE,cAAa,SAAUC,EAAkB,EAiBjD,MAAO,CAAE,QAAA,EAhBMN,EAAAA,QAAAA,KAAc,CAC3B,GAAI,CAACO,EACH,OAEF,IAAMC,EAAS,IAAI,IACbC,EAAa,IAAI,IACvB,IAAK,GAAM,CAAE,gBAAgBF,EACvBL,EAAsBQ,CAAU,EAClCD,EAAW,IAAIC,EAAW,GAAIA,CAAU,EAExCF,EAAO,IAAIE,EAAW,GAAIA,CAAU,EAIxC,MAAO,CAAE,SAAQ,aAAY,aADR,CAAC,GAAGF,EAAO,OAAO,CAAC,CAAC,CAAC,MAAM,EAAG,IAAMG,EAAE,MAAM,cAAcC,EAAE,KAAK,CACzD,CAAa,CAC5C,EAAG,CAACL,CAAW,CACN,EAAQ,OAAM,CACzB,EAEaM,GAAkB,EAAuB,IACpDC,EAAO,aAAa,KAAM,GAAUC,EAAM,SAAWC,CAAQ"}
1
+ {"version":3,"file":"useContentSchema-Cvtes34f.js","names":["useMemo","__toESM","isComponentDefinition","import_react","require_react","useContentSchema","useAllDefinitions","definitions","models","components","definition","a","b","findModelByKey","schema","model","modelKey"],"sources":["../../src/features/Content/hooks/useContentSchema.ts"],"sourcesContent":["import { isComponentDefinition, type ComponentDefinition, type ModelDefinition } from '@shapio/schema';\nimport { useMemo } from 'react';\nimport { useAllDefinitions } from '@/api/schema';\n\nexport type ContentSchema = {\n models: ReadonlyMap<string, ModelDefinition>;\n components: ReadonlyMap<string, ComponentDefinition>;\n /** Collections and singletons, in label order (for navigation). */\n sortedModels: readonly ModelDefinition[];\n};\n\n/**\n * The active schema as the content screens need it. Models are data (CONTRIBUTING.md rule 2): routes carry a\n * model's API key and resolve it here at render time, so a model created a moment ago works at once.\n */\nexport const useContentSchema = (): { schema: ContentSchema | undefined; error: unknown } => {\n const { definitions, error } = useAllDefinitions();\n const schema = useMemo(() => {\n if (!definitions) {\n return undefined;\n }\n const models = new Map<string, ModelDefinition>();\n const components = new Map<string, ComponentDefinition>();\n for (const { definition } of definitions) {\n if (isComponentDefinition(definition)) {\n components.set(definition.id, definition);\n } else {\n models.set(definition.id, definition);\n }\n }\n const sortedModels = [...models.values()].sort((a, b) => a.label.localeCompare(b.label));\n return { models, components, sortedModels };\n }, [definitions]);\n return { schema, error };\n};\n\nexport const findModelByKey = (schema: ContentSchema, modelKey: string): ModelDefinition | undefined =>\n schema.sortedModels.find((model) => model.apiKey === modelKey);\n"],"mappings":"+KAeaK,MAAgF,CAC3F,GAAM,CAAE,cAAa,SAAUC,EAAkB,EAiBjD,MAAO,CAAE,QAAA,EAhBMN,EAAAA,QAAAA,KAAc,CAC3B,GAAI,CAACO,EACH,OAEF,IAAMC,EAAS,IAAI,IACbC,EAAa,IAAI,IACvB,IAAK,GAAM,CAAE,gBAAgBF,EACvBL,EAAsBQ,CAAU,EAClCD,EAAW,IAAIC,EAAW,GAAIA,CAAU,EAExCF,EAAO,IAAIE,EAAW,GAAIA,CAAU,EAIxC,MAAO,CAAE,SAAQ,aAAY,aADR,CAAC,GAAGF,EAAO,OAAO,CAAC,CAAC,CAAC,MAAM,EAAG,IAAMG,EAAE,MAAM,cAAcC,EAAE,KAAK,CACzD,CAAa,CAC5C,EAAG,CAACL,CAAW,CACN,EAAQ,OAAM,CACzB,EAEaM,GAAkB,EAAuB,IACpDC,EAAO,aAAa,KAAM,GAAUC,EAAM,SAAWC,CAAQ"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{j as r}from"./cn-CL1YHRrS.js";import{t as i}from"./ConfirmDialog-BfpN2MQx.js";var a=e(t(),1),o=e(n(),1),s=({dirty:e,pending:t=!1,onOpenChange:n})=>{let{t:s}=r(),[c,l]=(0,a.useState)(!1);return{requestOpenChange:r=>{if(!r&&e&&!t){l(!0);return}n(r)},discardPrompt:(0,o.jsx)(i,{open:c,onOpenChange:l,title:s(`unsaved.title`),description:s(`unsaved.description`),cancelLabel:s(`unsaved.stay`),confirmLabel:s(`unsaved.leave`),destructive:!0,onConfirm:()=>{l(!1),n(!1)}})}};export{s as t};
2
- //# sourceMappingURL=useDiscardGuard-CGFgC3xY.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{j as r}from"./cn-CL1YHRrS.js";import{t as i}from"./ConfirmDialog-HS8Gc2t3.js";var a=e(t(),1),o=e(n(),1),s=({dirty:e,pending:t=!1,onOpenChange:n})=>{let{t:s}=r(),[c,l]=(0,a.useState)(!1);return{requestOpenChange:r=>{if(!r&&e&&!t){l(!0);return}n(r)},discardPrompt:(0,o.jsx)(i,{open:c,onOpenChange:l,title:s(`unsaved.title`),description:s(`unsaved.description`),cancelLabel:s(`unsaved.stay`),confirmLabel:s(`unsaved.leave`),destructive:!0,onConfirm:()=>{l(!1),n(!1)}})}};export{s as t};
2
+ //# sourceMappingURL=useDiscardGuard-BAEGkGK9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDiscardGuard-CGFgC3xY.js","names":["useState","_jsx","__toESM","require_jsx_runtime","useTranslation","ConfirmDialog","import_react","require_react","import_jsx_runtime","useDiscardGuard","confirmingDiscard","setConfirmingDiscard","open","dirty","pending","onOpenChange","t"],"sources":["../../src/hooks/useDiscardGuard.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ConfirmDialog } from '@/components/ConfirmDialog';\n\ntype UseDiscardGuardOptions = {\n /** Unsaved edits: closing asks before discarding them. */\n dirty: boolean;\n /** While a save runs, closing is not intercepted (the caller blocks it or lets it finish). */\n pending?: boolean;\n /** The overlay's own open/close handler, called once closing is allowed. */\n onOpenChange: (open: boolean) => void;\n};\n\n/**\n * Dirty-close protection for a sheet (or any overlay with `onOpenChange`). Pass `requestOpenChange` to the\n * overlay instead of `onOpenChange` and render `discardPrompt` beside it: Escape, the overlay, the close\n * button and Cancel then ask \"Discard unsaved changes?\" before closing over unsaved edits.\n */\nexport const useDiscardGuard = ({\n dirty,\n pending = false,\n onOpenChange,\n}: UseDiscardGuardOptions): { requestOpenChange: (open: boolean) => void; discardPrompt: ReactNode } => {\n const { t } = useTranslation();\n const [confirmingDiscard, setConfirmingDiscard] = useState(false);\n const requestOpenChange = (open: boolean) => {\n if (!open && dirty && !pending) {\n setConfirmingDiscard(true);\n return;\n }\n onOpenChange(open);\n };\n const discardPrompt = (\n <ConfirmDialog\n open={confirmingDiscard}\n onOpenChange={setConfirmingDiscard}\n title={t('unsaved.title')}\n description={t('unsaved.description')}\n cancelLabel={t('unsaved.stay')}\n confirmLabel={t('unsaved.leave')}\n destructive\n onConfirm={() => {\n setConfirmingDiscard(false);\n onOpenChange(false);\n }}\n />\n );\n return { requestOpenChange, discardPrompt };\n};\n"],"mappings":"mPAkBaS,GAAmB,CAC9B,QACA,UAAU,GACV,kBACsG,CACtG,GAAM,CAAE,KAAML,EAAe,EACvB,CAACM,EAAmBC,IAAA,EAAwBX,EAAAA,SAAAA,CAAS,EAAK,EAuBhE,MAAO,CAAE,kBAtBkB,GAAkB,CAC3C,GAAI,CAACY,GAAQC,GAAS,CAACC,EAAS,CAC9BH,EAAqB,EAAI,EACzB,MACF,CACAI,EAAaH,CAAI,CACnB,EAgB4B,eAAA,EAd1BX,EAAAA,IAAAA,CAACI,EAAD,CACE,KAAMK,EACN,aAAcC,EACd,MAAOK,EAAE,eAAe,EACxB,YAAaA,EAAE,qBAAqB,EACpC,YAAaA,EAAE,cAAc,EAC7B,aAAcA,EAAE,eAAe,EAC/B,YAAA,GACA,cAAiB,CACfL,EAAqB,EAAK,EAC1BI,EAAa,EAAK,CACpB,CACD,CAEyB,CAAc,CAC5C"}
1
+ {"version":3,"file":"useDiscardGuard-BAEGkGK9.js","names":["useState","_jsx","__toESM","require_jsx_runtime","useTranslation","ConfirmDialog","import_react","require_react","import_jsx_runtime","useDiscardGuard","confirmingDiscard","setConfirmingDiscard","open","dirty","pending","onOpenChange","t"],"sources":["../../src/hooks/useDiscardGuard.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ConfirmDialog } from '@/components/ConfirmDialog';\n\ntype UseDiscardGuardOptions = {\n /** Unsaved edits: closing asks before discarding them. */\n dirty: boolean;\n /** While a save runs, closing is not intercepted (the caller blocks it or lets it finish). */\n pending?: boolean;\n /** The overlay's own open/close handler, called once closing is allowed. */\n onOpenChange: (open: boolean) => void;\n};\n\n/**\n * Dirty-close protection for a sheet (or any overlay with `onOpenChange`). Pass `requestOpenChange` to the\n * overlay instead of `onOpenChange` and render `discardPrompt` beside it: Escape, the overlay, the close\n * button and Cancel then ask \"Discard unsaved changes?\" before closing over unsaved edits.\n */\nexport const useDiscardGuard = ({\n dirty,\n pending = false,\n onOpenChange,\n}: UseDiscardGuardOptions): { requestOpenChange: (open: boolean) => void; discardPrompt: ReactNode } => {\n const { t } = useTranslation();\n const [confirmingDiscard, setConfirmingDiscard] = useState(false);\n const requestOpenChange = (open: boolean) => {\n if (!open && dirty && !pending) {\n setConfirmingDiscard(true);\n return;\n }\n onOpenChange(open);\n };\n const discardPrompt = (\n <ConfirmDialog\n open={confirmingDiscard}\n onOpenChange={setConfirmingDiscard}\n title={t('unsaved.title')}\n description={t('unsaved.description')}\n cancelLabel={t('unsaved.stay')}\n confirmLabel={t('unsaved.leave')}\n destructive\n onConfirm={() => {\n setConfirmingDiscard(false);\n onOpenChange(false);\n }}\n />\n );\n return { requestOpenChange, discardPrompt };\n};\n"],"mappings":"mPAkBaS,GAAmB,CAC9B,QACA,UAAU,GACV,kBACsG,CACtG,GAAM,CAAE,KAAML,EAAe,EACvB,CAACM,EAAmBC,IAAA,EAAwBX,EAAAA,SAAAA,CAAS,EAAK,EAuBhE,MAAO,CAAE,kBAtBkB,GAAkB,CAC3C,GAAI,CAACY,GAAQC,GAAS,CAACC,EAAS,CAC9BH,EAAqB,EAAI,EACzB,MACF,CACAI,EAAaH,CAAI,CACnB,EAgB4B,eAAA,EAd1BX,EAAAA,IAAAA,CAACI,EAAD,CACE,KAAMK,EACN,aAAcC,EACd,MAAOK,EAAE,eAAe,EACxB,YAAaA,EAAE,qBAAqB,EACpC,YAAaA,EAAE,cAAc,EAC7B,aAAcA,EAAE,eAAe,EAC/B,YAAA,GACA,cAAiB,CACfL,EAAqB,EAAK,EAC1BI,EAAa,EAAK,CACpB,CACD,CAEyB,CAAc,CAC5C"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{P as r,bt as i,j as a,l as o,t as s}from"./cn-CL1YHRrS.js";import{c,d as l,f as u,l as d,m as f,p,u as m}from"./badge-C5oMRtwJ.js";import{U as h}from"./InfoHint-DWn9kLf1.js";import{i as g}from"./skeleton-B5GJgv7y.js";import{a as _,i as v,n as y,r as b,t as x}from"./select-DyD7qIkJ.js";import{c as S}from"./Thumbnail-cjA7fSWh.js";import{a as C,i as w,n as T,r as E,t as D}from"./useMediaUploader-D1ouV8jc.js";import{t as O}from"./languages-eh7U4anI.js";import{r as k}from"./constants-DCtq_UOe.js";var A={draft:`content.status.draft`,published:`content.status.published`,modified:`content.status.modified`},j={draft:`neutral`,published:`success`,modified:`warning`},M=e(n(),1),N=({locales:e,value:t,onChange:n,states:r,size:i,id:o,className:c})=>{let{t:l}=a(),u=e=>{if(!r)return;let t=r.find(t=>t.locale===e);return l(t?A[t.status]:`content.locales.notCreated`)};return(0,M.jsxs)(x,{value:t,onValueChange:n,children:[(0,M.jsxs)(v,{id:o,size:i,"aria-label":o?void 0:l(`content.locales.label`),className:s(`w-full`,c),children:[(0,M.jsx)(O,{"aria-hidden":`true`}),(0,M.jsx)(_,{})]}),(0,M.jsx)(y,{children:e.map(e=>{let t=u(e.code);return(0,M.jsxs)(b,{value:e.code,children:[(0,M.jsx)(`span`,{children:e.label}),(0,M.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:e.code}),t?(0,M.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`· `,t]}):null]},e.code)})})]})},P=e(t(),1),F=e=>e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:e===`application/pdf`||e.startsWith(`text/`)||e.includes(`officedocument`)||e.includes(`opendocument`)||e===`application/msword`?`document`:`other`,I=e=>({id:e.id,filename:e.filename,mimeType:e.mimeType,url:e.url,alt:e.alt,width:e.width,height:e.height}),L=e=>{if(e?.length!==1)return;let[t]=e;return t===`image`||t===`video`||t===`audio`?`${t}/*`:void 0},R=({open:e,options:t,onPick:n,onCancel:s})=>{let{t:_}=a(),v=i(),{canWrite:y}=S(),b=D(),[x,O]=(0,P.useState)(),[A,j]=(0,P.useState)(),[N,I]=(0,P.useState)(`grid`),[R,z]=(0,P.useState)([]),[B,V]=(0,P.useState)(!1),H=t.multiple===!0,U=L(t.allowedKinds),W={...x?{search:x}:{},...U?{mimeType:U}:A?{mimeType:k[A]}:{}},G=(e,t)=>z(n=>t?H?[...n.filter(t=>t!==e),e]:[e]:n.filter(t=>t!==e)),K=()=>{z([]),s()},q=async()=>{V(!0);try{let e=(await Promise.all(R.map(e=>v.fetchQuery({queryKey:r.media.asset(e),queryFn:()=>o.media.assets.get(e)})))).filter(e=>!t.allowedKinds||t.allowedKinds.includes(F(e.mimeType)));z([]),n(e)}catch(e){h(e,`choosing media`)}finally{V(!1)}};return(0,M.jsx)(c,{open:e,onOpenChange:e=>e?void 0:K(),children:(0,M.jsxs)(m,{size:`lg`,...t.allowedKinds?{}:{"aria-describedby":void 0},children:[(0,M.jsxs)(p,{className:`pr-14`,children:[(0,M.jsx)(f,{children:_(H?`content.media.pickTitleMultiple`:`content.media.pickTitle`)}),t.allowedKinds?(0,M.jsx)(l,{children:_(`content.media.allowedKinds`,{kinds:t.allowedKinds.join(`, `)})}):null]}),(0,M.jsxs)(`div`,{className:`space-y-4 px-6 pb-4`,children:[(0,M.jsxs)(`div`,{className:`flex flex-wrap items-start gap-2`,children:[(0,M.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,M.jsx)(w,{query:x,type:U?void 0:A,view:N,onQueryChange:O,onTypeChange:j,onViewChange:I})}),y?(0,M.jsx)(E,{variant:`outline`,label:_(`media.upload.action`),multiple:H,onFiles:e=>b.enqueue(e,{folderId:null,visibility:`public`})}):null]}),(0,M.jsx)(T,{onRetry:b.retry,onDismiss:b.dismiss})]}),(0,M.jsx)(d,{className:`pt-1`,children:(0,M.jsx)(C,{query:W,filtered:!!(x||A),view:N,selected:new Set(R),selectable:!0,activeId:void 0,onSelectChange:G,onOpen:e=>G(e.id,!R.includes(e.id))})}),(0,M.jsxs)(u,{children:[(0,M.jsx)(`span`,{role:`status`,className:`mr-auto text-sm text-muted-foreground`,children:_(`content.media.selectedCount`,{count:R.length})}),(0,M.jsx)(g,{type:`button`,variant:`outline`,onClick:K,children:_(`common.cancel`)}),(0,M.jsx)(g,{type:`button`,disabled:R.length===0||B,onClick:()=>void q(),children:_(`content.media.choose`,{count:R.length})})]})]})})},z=()=>{let[e,t]=(0,P.useState)(null),n=(0,P.useRef)(null),r=(0,P.useCallback)(e=>{n.current?.resolve(e),n.current=null,t(null)},[]);return{pickMedia:(0,P.useCallback)((e={})=>new Promise(r=>{n.current?.resolve(null);let i={options:e,resolve:r};n.current=i,t(i)}),[]),dialog:(0,M.jsx)(R,{open:e!==null,options:e?.options??{},onPick:e=>r(e.map(I)),onCancel:()=>r(null)})}};export{j as i,N as n,A as r,z as t};
2
- //# sourceMappingURL=useMediaPickerDialog-BOkGEyG7.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{P as r,bt as i,j as a,l as o,t as s}from"./cn-CL1YHRrS.js";import{c,d as l,f as u,l as d,m as f,p,u as m}from"./badge-lJ4Ih_Zn.js";import{U as h}from"./InfoHint-DtaHU1Cg.js";import{i as g}from"./skeleton-DElTumgk.js";import{a as _,i as v,n as y,r as b,t as x}from"./select-CpHp3YOH.js";import{c as S}from"./Thumbnail-BUYOr4XJ.js";import{a as C,i as w,n as T,r as E,t as D}from"./useMediaUploader-CapEHBIt.js";import{t as O}from"./languages-eh7U4anI.js";import{r as k}from"./constants-DCtq_UOe.js";var A={draft:`content.status.draft`,published:`content.status.published`,modified:`content.status.modified`},j={draft:`neutral`,published:`success`,modified:`warning`},M=e(n(),1),N=({locales:e,value:t,onChange:n,states:r,size:i,id:o,className:c})=>{let{t:l}=a(),u=e=>{if(!r)return;let t=r.find(t=>t.locale===e);return l(t?A[t.status]:`content.locales.notCreated`)};return(0,M.jsxs)(x,{value:t,onValueChange:n,children:[(0,M.jsxs)(v,{id:o,size:i,"aria-label":o?void 0:l(`content.locales.label`),className:s(`w-full`,c),children:[(0,M.jsx)(O,{"aria-hidden":`true`}),(0,M.jsx)(_,{})]}),(0,M.jsx)(y,{children:e.map(e=>{let t=u(e.code);return(0,M.jsxs)(b,{value:e.code,children:[(0,M.jsx)(`span`,{children:e.label}),(0,M.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:e.code}),t?(0,M.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`· `,t]}):null]},e.code)})})]})},P=e(t(),1),F=e=>e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:e===`application/pdf`||e.startsWith(`text/`)||e.includes(`officedocument`)||e.includes(`opendocument`)||e===`application/msword`?`document`:`other`,I=e=>({id:e.id,filename:e.filename,mimeType:e.mimeType,url:e.url,alt:e.alt,width:e.width,height:e.height}),L=e=>{if(e?.length!==1)return;let[t]=e;return t===`image`||t===`video`||t===`audio`?`${t}/*`:void 0},R=({open:e,options:t,onPick:n,onCancel:s})=>{let{t:_}=a(),v=i(),{canWrite:y}=S(),b=D(),[x,O]=(0,P.useState)(),[A,j]=(0,P.useState)(),[N,I]=(0,P.useState)(`grid`),[R,z]=(0,P.useState)([]),[B,V]=(0,P.useState)(!1),H=t.multiple===!0,U=L(t.allowedKinds),W={...x?{search:x}:{},...U?{mimeType:U}:A?{mimeType:k[A]}:{}},G=(e,t)=>z(n=>t?H?[...n.filter(t=>t!==e),e]:[e]:n.filter(t=>t!==e)),K=()=>{z([]),s()},q=async()=>{V(!0);try{let e=(await Promise.all(R.map(e=>v.fetchQuery({queryKey:r.media.asset(e),queryFn:()=>o.media.assets.get(e)})))).filter(e=>!t.allowedKinds||t.allowedKinds.includes(F(e.mimeType)));z([]),n(e)}catch(e){h(e,`choosing media`)}finally{V(!1)}};return(0,M.jsx)(c,{open:e,onOpenChange:e=>e?void 0:K(),children:(0,M.jsxs)(m,{size:`lg`,...t.allowedKinds?{}:{"aria-describedby":void 0},children:[(0,M.jsxs)(p,{className:`pr-14`,children:[(0,M.jsx)(f,{children:_(H?`content.media.pickTitleMultiple`:`content.media.pickTitle`)}),t.allowedKinds?(0,M.jsx)(l,{children:_(`content.media.allowedKinds`,{kinds:t.allowedKinds.join(`, `)})}):null]}),(0,M.jsxs)(`div`,{className:`space-y-4 px-6 pb-4`,children:[(0,M.jsxs)(`div`,{className:`flex flex-wrap items-start gap-2`,children:[(0,M.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,M.jsx)(w,{query:x,type:U?void 0:A,view:N,onQueryChange:O,onTypeChange:j,onViewChange:I})}),y?(0,M.jsx)(E,{variant:`outline`,label:_(`media.upload.action`),multiple:H,onFiles:e=>b.enqueue(e,{folderId:null,visibility:`public`})}):null]}),(0,M.jsx)(T,{onRetry:b.retry,onDismiss:b.dismiss})]}),(0,M.jsx)(d,{className:`pt-1`,children:(0,M.jsx)(C,{query:W,filtered:!!(x||A),view:N,selected:new Set(R),selectable:!0,activeId:void 0,onSelectChange:G,onOpen:e=>G(e.id,!R.includes(e.id))})}),(0,M.jsxs)(u,{children:[(0,M.jsx)(`span`,{role:`status`,className:`mr-auto text-sm text-muted-foreground`,children:_(`content.media.selectedCount`,{count:R.length})}),(0,M.jsx)(g,{type:`button`,variant:`outline`,onClick:K,children:_(`common.cancel`)}),(0,M.jsx)(g,{type:`button`,disabled:R.length===0||B,onClick:()=>void q(),children:_(`content.media.choose`,{count:R.length})})]})]})})},z=()=>{let[e,t]=(0,P.useState)(null),n=(0,P.useRef)(null),r=(0,P.useCallback)(e=>{n.current?.resolve(e),n.current=null,t(null)},[]);return{pickMedia:(0,P.useCallback)((e={})=>new Promise(r=>{n.current?.resolve(null);let i={options:e,resolve:r};n.current=i,t(i)}),[]),dialog:(0,M.jsx)(R,{open:e!==null,options:e?.options??{},onPick:e=>r(e.map(I)),onCancel:()=>r(null)})}};export{j as i,N as n,A as r,z as t};
2
+ //# sourceMappingURL=useMediaPickerDialog-CiN_pias.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaPickerDialog-BOkGEyG7.js","names":["useState","useState","useRef","useCallback","_jsx","__toESM","require_jsx_runtime","queryKeys","useQueryClient","useTranslation","adminApi","cn","SheetDescription","SheetFooter","SheetBody","SheetTitle","SheetContent","reportError","Button","SelectValue","SelectTrigger","SelectContent","SelectItem","Select","useMediaPermissions","Library","Toolbar","UploadQueue","UploadButton","useMediaUploader","Languages","MIME_FILTER_BY_TYPE","ENTRY_STATUS_LABEL_KEYS","ENTRY_STATUS_TONES","import_jsx_runtime","LocaleSelect","statusOf","states","state","item","code","t","onChange","id","className","locales","status","locale","import_react","require_react","mediaKindOf","mimeType","toPickedMedia","asset","mimeFilterFor","kinds","kind","MediaPickerSheet","queryClient","uploader","search","setSearch","type","setType","view","setView","selected","setSelected","confirming","setConfirming","multiple","options","forcedMime","query","select","checked","current","close","onCancel","confirm","allowed","onPick","error","Sheet","next","SheetHeader","canWrite","files","useMediaPickerDialog","pending","setPending","pendingRef","settle","assets"],"sources":["../../src/features/Content/helpers/entryStatus.ts","../../src/features/Content/LocaleSelect/index.tsx","../../src/fields/helpers/media.ts","../../src/fields/MediaPickerSheet/index.tsx","../../src/fields/hooks/useMediaPickerDialog.tsx"],"sourcesContent":["import type { EntryStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\nexport const ENTRY_STATUS_LABEL_KEYS = {\n draft: 'content.status.draft',\n published: 'content.status.published',\n modified: 'content.status.modified',\n} as const satisfies Record<EntryStatus, string>;\n\n/** Draft is neutral, published is live (success), published with newer draft changes needs attention. */\nexport const ENTRY_STATUS_TONES = {\n draft: 'neutral',\n published: 'success',\n modified: 'warning',\n} as const satisfies Record<EntryStatus, StatusTone>;\n","import type { EntryLocaleState, Locale } from '@shapio/client';\nimport { Languages } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { cn } from '@/helpers/cn';\nimport { ENTRY_STATUS_LABEL_KEYS } from '../helpers/entryStatus';\n\ntype LocaleSelectProps = {\n locales: readonly Locale[];\n value: string;\n onChange: (code: string) => void;\n /** Per-locale status of an entry; locales without a version are marked \"not created\". */\n states?: readonly EntryLocaleState[];\n /** `sm` (36px) in page headers and toolbars, `default` (40px) in panels. */\n size?: 'default' | 'sm';\n id?: string;\n className?: string;\n};\n\n/** Chooses the content locale (with each locale's status when editing an entry). */\nexport const LocaleSelect = ({\n locales,\n value,\n onChange,\n states,\n size,\n id,\n className,\n}: LocaleSelectProps) => {\n const { t } = useTranslation();\n const statusOf = (code: string) => {\n if (!states) {\n return undefined;\n }\n const state = states.find((item) => item.locale === code);\n return state ? t(ENTRY_STATUS_LABEL_KEYS[state.status]) : t('content.locales.notCreated');\n };\n return (\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger\n id={id}\n size={size}\n aria-label={id ? undefined : t('content.locales.label')}\n className={cn('w-full', className)}\n >\n <Languages aria-hidden=\"true\" />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {locales.map((locale) => {\n const status = statusOf(locale.code);\n return (\n <SelectItem key={locale.code} value={locale.code}>\n <span>{locale.label}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{locale.code}</span>\n {status ? <span className=\"text-xs text-muted-foreground\">· {status}</span> : null}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport type { MediaKind, PickedMedia } from '@shapio/editor-sdk';\n\n/** The media kind of a MIME type (the server's `allowedKinds` buckets). */\nexport const mediaKindOf = (mimeType: string): MediaKind => {\n if (mimeType.startsWith('image/')) {\n return 'image';\n }\n if (mimeType.startsWith('video/')) {\n return 'video';\n }\n if (mimeType.startsWith('audio/')) {\n return 'audio';\n }\n if (\n mimeType === 'application/pdf' ||\n mimeType.startsWith('text/') ||\n mimeType.includes('officedocument') ||\n mimeType.includes('opendocument') ||\n mimeType === 'application/msword'\n ) {\n return 'document';\n }\n return 'other';\n};\n\n/** What an editor gets back from the picker: never storage keys or attribution. */\nexport const toPickedMedia = (asset: MediaAsset): PickedMedia => ({\n id: asset.id,\n filename: asset.filename,\n mimeType: asset.mimeType,\n url: asset.url,\n alt: asset.alt,\n width: asset.width,\n height: asset.height,\n});\n\n/** The library's server-side type filter for a set of allowed kinds (only when it is one MIME family). */\nexport const mimeFilterFor = (kinds: readonly MediaKind[] | undefined): string | undefined => {\n if (kinds?.length !== 1) {\n return undefined;\n }\n const [kind] = kinds;\n return kind === 'image' || kind === 'video' || kind === 'audio' ? `${kind}/*` : undefined;\n};\n","import type { MediaAsset } from '@shapio/client';\nimport type { MediaPickOptions } from '@shapio/editor-sdk';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { adminApi } from '@/api/client';\nimport { queryKeys } from '@/api/queryKeys';\nimport { Button } from '@/components/ui/button';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { MIME_FILTER_BY_TYPE, type MediaTypeFilter, type MediaView } from '@/features/Media/constants';\nimport { Library } from '@/features/Media/Library';\nimport { Toolbar } from '@/features/Media/Toolbar';\nimport { UploadButton } from '@/features/Media/UploadButton';\nimport { UploadQueue } from '@/features/Media/UploadQueue';\nimport { reportError } from '@/helpers/reportError';\nimport { useMediaPermissions } from '@/hooks/useMediaPermissions';\nimport { useMediaUploader } from '@/hooks/useMediaUploader';\nimport { mediaKindOf, mimeFilterFor } from '../helpers/media';\n\ntype MediaPickerSheetProps = {\n open: boolean;\n options: MediaPickOptions;\n onPick: (assets: MediaAsset[]) => void;\n onCancel: () => void;\n};\n\n/**\n * The media library's components in a large right-hand sheet, so the entry stays in view: search, filter,\n * upload, and choose one or several files. Files of kinds the field does not allow can be seen but not\n * chosen.\n */\nexport const MediaPickerSheet = ({ open, options, onPick, onCancel }: MediaPickerSheetProps) => {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { canWrite } = useMediaPermissions();\n const uploader = useMediaUploader();\n const [search, setSearch] = useState<string | undefined>();\n const [type, setType] = useState<MediaTypeFilter | undefined>();\n const [view, setView] = useState<MediaView>('grid');\n const [selected, setSelected] = useState<string[]>([]);\n const [confirming, setConfirming] = useState(false);\n const multiple = options.multiple === true;\n const forcedMime = mimeFilterFor(options.allowedKinds);\n const query = {\n ...(search ? { search } : {}),\n ...(forcedMime ? { mimeType: forcedMime } : type ? { mimeType: MIME_FILTER_BY_TYPE[type] } : {}),\n };\n const select = (id: string, checked: boolean) =>\n setSelected((current) => {\n if (!checked) {\n return current.filter((item) => item !== id);\n }\n return multiple ? [...current.filter((item) => item !== id), id] : [id];\n });\n const close = () => {\n setSelected([]);\n onCancel();\n };\n const confirm = async () => {\n setConfirming(true);\n try {\n const assets = await Promise.all(\n selected.map((id) =>\n queryClient.fetchQuery({\n queryKey: queryKeys.media.asset(id),\n queryFn: () => adminApi.media.assets.get(id),\n }),\n ),\n );\n const allowed = assets.filter(\n (asset) => !options.allowedKinds || options.allowedKinds.includes(mediaKindOf(asset.mimeType)),\n );\n setSelected([]);\n onPick(allowed);\n } catch (error) {\n reportError(error, 'choosing media');\n } finally {\n setConfirming(false);\n }\n };\n return (\n <Sheet open={open} onOpenChange={(next) => (next ? undefined : close())}>\n <SheetContent size=\"lg\" {...(options.allowedKinds ? {} : { 'aria-describedby': undefined })}>\n <SheetHeader className=\"pr-14\">\n <SheetTitle>\n {multiple ? t('content.media.pickTitleMultiple') : t('content.media.pickTitle')}\n </SheetTitle>\n {options.allowedKinds ? (\n <SheetDescription>\n {t('content.media.allowedKinds', { kinds: options.allowedKinds.join(', ') })}\n </SheetDescription>\n ) : null}\n </SheetHeader>\n <div className=\"space-y-4 px-6 pb-4\">\n <div className=\"flex flex-wrap items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <Toolbar\n query={search}\n type={forcedMime ? undefined : type}\n view={view}\n onQueryChange={setSearch}\n onTypeChange={setType}\n onViewChange={setView}\n />\n </div>\n {canWrite ? (\n <UploadButton\n variant=\"outline\"\n label={t('media.upload.action')}\n multiple={multiple}\n onFiles={(files) => uploader.enqueue(files, { folderId: null, visibility: 'public' })}\n />\n ) : null}\n </div>\n <UploadQueue onRetry={uploader.retry} onDismiss={uploader.dismiss} />\n </div>\n {/* A little top padding so the selected tiles' rings aren't clipped by the scroll area. */}\n <SheetBody className=\"pt-1\">\n <Library\n query={query}\n filtered={Boolean(search || type)}\n view={view}\n selected={new Set(selected)}\n selectable\n activeId={undefined}\n onSelectChange={select}\n onOpen={(asset) => select(asset.id, !selected.includes(asset.id))}\n />\n </SheetBody>\n <SheetFooter>\n <span role=\"status\" className=\"mr-auto text-sm text-muted-foreground\">\n {t('content.media.selectedCount', { count: selected.length })}\n </span>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {t('common.cancel')}\n </Button>\n <Button type=\"button\" disabled={selected.length === 0 || confirming} onClick={() => void confirm()}>\n {t('content.media.choose', { count: selected.length })}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n};\n","import type { MediaPickOptions, PickedMedia } from '@shapio/editor-sdk';\nimport { useCallback, useRef, useState } from 'react';\nimport { toPickedMedia } from '../helpers/media';\nimport { MediaPickerSheet } from '../MediaPickerSheet';\n\ntype PendingPick = { options: MediaPickOptions; resolve: (assets: PickedMedia[] | null) => void };\n\n/**\n * `pickMedia` for editors (the editor contract's media capability): opens the library in a sheet and resolves\n * with the chosen assets, or null when cancelled. Render `dialog` once in the form.\n */\nexport const useMediaPickerDialog = () => {\n const [pending, setPending] = useState<PendingPick | null>(null);\n const pendingRef = useRef<PendingPick | null>(null);\n const settle = useCallback((assets: PickedMedia[] | null) => {\n pendingRef.current?.resolve(assets);\n pendingRef.current = null;\n setPending(null);\n }, []);\n const pickMedia = useCallback(\n (options: MediaPickOptions = {}) =>\n new Promise<PickedMedia[] | null>((resolve) => {\n pendingRef.current?.resolve(null);\n const next = { options, resolve };\n pendingRef.current = next;\n setPending(next);\n }),\n [],\n );\n const dialog = (\n <MediaPickerSheet\n open={pending !== null}\n options={pending?.options ?? {}}\n onPick={(assets) => settle(assets.map(toPickedMedia))}\n onCancel={() => settle(null)}\n />\n );\n return { pickMedia, dialog };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useMediaPickerDialog-CiN_pias.js","names":["useState","useState","useRef","useCallback","_jsx","__toESM","require_jsx_runtime","queryKeys","useQueryClient","useTranslation","adminApi","cn","SheetDescription","SheetFooter","SheetBody","SheetTitle","SheetContent","reportError","Button","SelectValue","SelectTrigger","SelectContent","SelectItem","Select","useMediaPermissions","Library","Toolbar","UploadQueue","UploadButton","useMediaUploader","Languages","MIME_FILTER_BY_TYPE","ENTRY_STATUS_LABEL_KEYS","ENTRY_STATUS_TONES","import_jsx_runtime","LocaleSelect","statusOf","states","state","item","code","t","onChange","id","className","locales","status","locale","import_react","require_react","mediaKindOf","mimeType","toPickedMedia","asset","mimeFilterFor","kinds","kind","MediaPickerSheet","queryClient","uploader","search","setSearch","type","setType","view","setView","selected","setSelected","confirming","setConfirming","multiple","options","forcedMime","query","select","checked","current","close","onCancel","confirm","allowed","onPick","error","Sheet","next","SheetHeader","canWrite","files","useMediaPickerDialog","pending","setPending","pendingRef","settle","assets"],"sources":["../../src/features/Content/helpers/entryStatus.ts","../../src/features/Content/LocaleSelect/index.tsx","../../src/fields/helpers/media.ts","../../src/fields/MediaPickerSheet/index.tsx","../../src/fields/hooks/useMediaPickerDialog.tsx"],"sourcesContent":["import type { EntryStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\nexport const ENTRY_STATUS_LABEL_KEYS = {\n draft: 'content.status.draft',\n published: 'content.status.published',\n modified: 'content.status.modified',\n} as const satisfies Record<EntryStatus, string>;\n\n/** Draft is neutral, published is live (success), published with newer draft changes needs attention. */\nexport const ENTRY_STATUS_TONES = {\n draft: 'neutral',\n published: 'success',\n modified: 'warning',\n} as const satisfies Record<EntryStatus, StatusTone>;\n","import type { EntryLocaleState, Locale } from '@shapio/client';\nimport { Languages } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { cn } from '@/helpers/cn';\nimport { ENTRY_STATUS_LABEL_KEYS } from '../helpers/entryStatus';\n\ntype LocaleSelectProps = {\n locales: readonly Locale[];\n value: string;\n onChange: (code: string) => void;\n /** Per-locale status of an entry; locales without a version are marked \"not created\". */\n states?: readonly EntryLocaleState[];\n /** `sm` (36px) in page headers and toolbars, `default` (40px) in panels. */\n size?: 'default' | 'sm';\n id?: string;\n className?: string;\n};\n\n/** Chooses the content locale (with each locale's status when editing an entry). */\nexport const LocaleSelect = ({\n locales,\n value,\n onChange,\n states,\n size,\n id,\n className,\n}: LocaleSelectProps) => {\n const { t } = useTranslation();\n const statusOf = (code: string) => {\n if (!states) {\n return undefined;\n }\n const state = states.find((item) => item.locale === code);\n return state ? t(ENTRY_STATUS_LABEL_KEYS[state.status]) : t('content.locales.notCreated');\n };\n return (\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger\n id={id}\n size={size}\n aria-label={id ? undefined : t('content.locales.label')}\n className={cn('w-full', className)}\n >\n <Languages aria-hidden=\"true\" />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {locales.map((locale) => {\n const status = statusOf(locale.code);\n return (\n <SelectItem key={locale.code} value={locale.code}>\n <span>{locale.label}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{locale.code}</span>\n {status ? <span className=\"text-xs text-muted-foreground\">· {status}</span> : null}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport type { MediaKind, PickedMedia } from '@shapio/editor-sdk';\n\n/** The media kind of a MIME type (the server's `allowedKinds` buckets). */\nexport const mediaKindOf = (mimeType: string): MediaKind => {\n if (mimeType.startsWith('image/')) {\n return 'image';\n }\n if (mimeType.startsWith('video/')) {\n return 'video';\n }\n if (mimeType.startsWith('audio/')) {\n return 'audio';\n }\n if (\n mimeType === 'application/pdf' ||\n mimeType.startsWith('text/') ||\n mimeType.includes('officedocument') ||\n mimeType.includes('opendocument') ||\n mimeType === 'application/msword'\n ) {\n return 'document';\n }\n return 'other';\n};\n\n/** What an editor gets back from the picker: never storage keys or attribution. */\nexport const toPickedMedia = (asset: MediaAsset): PickedMedia => ({\n id: asset.id,\n filename: asset.filename,\n mimeType: asset.mimeType,\n url: asset.url,\n alt: asset.alt,\n width: asset.width,\n height: asset.height,\n});\n\n/** The library's server-side type filter for a set of allowed kinds (only when it is one MIME family). */\nexport const mimeFilterFor = (kinds: readonly MediaKind[] | undefined): string | undefined => {\n if (kinds?.length !== 1) {\n return undefined;\n }\n const [kind] = kinds;\n return kind === 'image' || kind === 'video' || kind === 'audio' ? `${kind}/*` : undefined;\n};\n","import type { MediaAsset } from '@shapio/client';\nimport type { MediaPickOptions } from '@shapio/editor-sdk';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { adminApi } from '@/api/client';\nimport { queryKeys } from '@/api/queryKeys';\nimport { Button } from '@/components/ui/button';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { MIME_FILTER_BY_TYPE, type MediaTypeFilter, type MediaView } from '@/features/Media/constants';\nimport { Library } from '@/features/Media/Library';\nimport { Toolbar } from '@/features/Media/Toolbar';\nimport { UploadButton } from '@/features/Media/UploadButton';\nimport { UploadQueue } from '@/features/Media/UploadQueue';\nimport { reportError } from '@/helpers/reportError';\nimport { useMediaPermissions } from '@/hooks/useMediaPermissions';\nimport { useMediaUploader } from '@/hooks/useMediaUploader';\nimport { mediaKindOf, mimeFilterFor } from '../helpers/media';\n\ntype MediaPickerSheetProps = {\n open: boolean;\n options: MediaPickOptions;\n onPick: (assets: MediaAsset[]) => void;\n onCancel: () => void;\n};\n\n/**\n * The media library's components in a large right-hand sheet, so the entry stays in view: search, filter,\n * upload, and choose one or several files. Files of kinds the field does not allow can be seen but not\n * chosen.\n */\nexport const MediaPickerSheet = ({ open, options, onPick, onCancel }: MediaPickerSheetProps) => {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { canWrite } = useMediaPermissions();\n const uploader = useMediaUploader();\n const [search, setSearch] = useState<string | undefined>();\n const [type, setType] = useState<MediaTypeFilter | undefined>();\n const [view, setView] = useState<MediaView>('grid');\n const [selected, setSelected] = useState<string[]>([]);\n const [confirming, setConfirming] = useState(false);\n const multiple = options.multiple === true;\n const forcedMime = mimeFilterFor(options.allowedKinds);\n const query = {\n ...(search ? { search } : {}),\n ...(forcedMime ? { mimeType: forcedMime } : type ? { mimeType: MIME_FILTER_BY_TYPE[type] } : {}),\n };\n const select = (id: string, checked: boolean) =>\n setSelected((current) => {\n if (!checked) {\n return current.filter((item) => item !== id);\n }\n return multiple ? [...current.filter((item) => item !== id), id] : [id];\n });\n const close = () => {\n setSelected([]);\n onCancel();\n };\n const confirm = async () => {\n setConfirming(true);\n try {\n const assets = await Promise.all(\n selected.map((id) =>\n queryClient.fetchQuery({\n queryKey: queryKeys.media.asset(id),\n queryFn: () => adminApi.media.assets.get(id),\n }),\n ),\n );\n const allowed = assets.filter(\n (asset) => !options.allowedKinds || options.allowedKinds.includes(mediaKindOf(asset.mimeType)),\n );\n setSelected([]);\n onPick(allowed);\n } catch (error) {\n reportError(error, 'choosing media');\n } finally {\n setConfirming(false);\n }\n };\n return (\n <Sheet open={open} onOpenChange={(next) => (next ? undefined : close())}>\n <SheetContent size=\"lg\" {...(options.allowedKinds ? {} : { 'aria-describedby': undefined })}>\n <SheetHeader className=\"pr-14\">\n <SheetTitle>\n {multiple ? t('content.media.pickTitleMultiple') : t('content.media.pickTitle')}\n </SheetTitle>\n {options.allowedKinds ? (\n <SheetDescription>\n {t('content.media.allowedKinds', { kinds: options.allowedKinds.join(', ') })}\n </SheetDescription>\n ) : null}\n </SheetHeader>\n <div className=\"space-y-4 px-6 pb-4\">\n <div className=\"flex flex-wrap items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <Toolbar\n query={search}\n type={forcedMime ? undefined : type}\n view={view}\n onQueryChange={setSearch}\n onTypeChange={setType}\n onViewChange={setView}\n />\n </div>\n {canWrite ? (\n <UploadButton\n variant=\"outline\"\n label={t('media.upload.action')}\n multiple={multiple}\n onFiles={(files) => uploader.enqueue(files, { folderId: null, visibility: 'public' })}\n />\n ) : null}\n </div>\n <UploadQueue onRetry={uploader.retry} onDismiss={uploader.dismiss} />\n </div>\n {/* A little top padding so the selected tiles' rings aren't clipped by the scroll area. */}\n <SheetBody className=\"pt-1\">\n <Library\n query={query}\n filtered={Boolean(search || type)}\n view={view}\n selected={new Set(selected)}\n selectable\n activeId={undefined}\n onSelectChange={select}\n onOpen={(asset) => select(asset.id, !selected.includes(asset.id))}\n />\n </SheetBody>\n <SheetFooter>\n <span role=\"status\" className=\"mr-auto text-sm text-muted-foreground\">\n {t('content.media.selectedCount', { count: selected.length })}\n </span>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {t('common.cancel')}\n </Button>\n <Button type=\"button\" disabled={selected.length === 0 || confirming} onClick={() => void confirm()}>\n {t('content.media.choose', { count: selected.length })}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n};\n","import type { MediaPickOptions, PickedMedia } from '@shapio/editor-sdk';\nimport { useCallback, useRef, useState } from 'react';\nimport { toPickedMedia } from '../helpers/media';\nimport { MediaPickerSheet } from '../MediaPickerSheet';\n\ntype PendingPick = { options: MediaPickOptions; resolve: (assets: PickedMedia[] | null) => void };\n\n/**\n * `pickMedia` for editors (the editor contract's media capability): opens the library in a sheet and resolves\n * with the chosen assets, or null when cancelled. Render `dialog` once in the form.\n */\nexport const useMediaPickerDialog = () => {\n const [pending, setPending] = useState<PendingPick | null>(null);\n const pendingRef = useRef<PendingPick | null>(null);\n const settle = useCallback((assets: PickedMedia[] | null) => {\n pendingRef.current?.resolve(assets);\n pendingRef.current = null;\n setPending(null);\n }, []);\n const pickMedia = useCallback(\n (options: MediaPickOptions = {}) =>\n new Promise<PickedMedia[] | null>((resolve) => {\n pendingRef.current?.resolve(null);\n const next = { options, resolve };\n pendingRef.current = next;\n setPending(next);\n }),\n [],\n );\n const dialog = (\n <MediaPickerSheet\n open={pending !== null}\n options={pending?.options ?? {}}\n onPick={(assets) => settle(assets.map(toPickedMedia))}\n onCancel={() => settle(null)}\n />\n );\n return { pickMedia, dialog };\n};\n"],"mappings":"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"}