@techzyapp/ui-library 1.0.43 → 1.0.44

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 (625) hide show
  1. package/README.md +15 -14
  2. package/dist/{Accordion-B4vdZXIu.cjs → Accordion-CFyeLfPT.cjs} +2 -2
  3. package/dist/{Accordion-B4vdZXIu.cjs.map → Accordion-CFyeLfPT.cjs.map} +1 -1
  4. package/dist/{Accordion-DhFZ25KV.js → Accordion-DOrTQJB9.js} +2 -2
  5. package/dist/{Accordion-DhFZ25KV.js.map → Accordion-DOrTQJB9.js.map} +1 -1
  6. package/dist/{AdminRoot-BLHvXCvL.js → AdminRoot-9KE3ll-D.js} +8 -8
  7. package/dist/{AdminRoot-BLHvXCvL.js.map → AdminRoot-9KE3ll-D.js.map} +1 -1
  8. package/dist/{AdminRoot-D_g_TW30.cjs → AdminRoot-BMzHo0n7.cjs} +2 -2
  9. package/dist/{AdminRoot-D_g_TW30.cjs.map → AdminRoot-BMzHo0n7.cjs.map} +1 -1
  10. package/dist/Alert-BFfzpPNd.js +70 -0
  11. package/dist/{Alert-D5E1PLkV.js.map → Alert-BFfzpPNd.js.map} +1 -1
  12. package/dist/Alert-DS8TzpIS.cjs +2 -0
  13. package/dist/{Alert-B4XZDk16.cjs.map → Alert-DS8TzpIS.cjs.map} +1 -1
  14. package/dist/{AuthLayout-q8pbCGdt.js → AuthLayout-BI1wLuDl.js} +2 -2
  15. package/dist/{AuthLayout-q8pbCGdt.js.map → AuthLayout-BI1wLuDl.js.map} +1 -1
  16. package/dist/{AuthLayout-exuNQicH.cjs → AuthLayout-Bzlsvicf.cjs} +2 -2
  17. package/dist/{AuthLayout-exuNQicH.cjs.map → AuthLayout-Bzlsvicf.cjs.map} +1 -1
  18. package/dist/{Avatar-l48Ice6t.cjs → Avatar-BBqX1732.cjs} +2 -2
  19. package/dist/{Avatar-l48Ice6t.cjs.map → Avatar-BBqX1732.cjs.map} +1 -1
  20. package/dist/{Avatar-ClcmN0ba.js → Avatar-CaYyv5wk.js} +2 -2
  21. package/dist/{Avatar-ClcmN0ba.js.map → Avatar-CaYyv5wk.js.map} +1 -1
  22. package/dist/{AvatarGroup-l-KV3wdl.js → AvatarGroup-6fhm-van.js} +2 -2
  23. package/dist/{AvatarGroup-l-KV3wdl.js.map → AvatarGroup-6fhm-van.js.map} +1 -1
  24. package/dist/{AvatarGroup-CuvFX4di.cjs → AvatarGroup-DrkzAt1-.cjs} +2 -2
  25. package/dist/{AvatarGroup-CuvFX4di.cjs.map → AvatarGroup-DrkzAt1-.cjs.map} +1 -1
  26. package/dist/Breadcrumbs-CloqFpp1.js +34 -0
  27. package/dist/{Breadcrumbs-M31xyok8.js.map → Breadcrumbs-CloqFpp1.js.map} +1 -1
  28. package/dist/Breadcrumbs-N2-sZWW5.cjs +2 -0
  29. package/dist/{Breadcrumbs-DSUxcp6u.cjs.map → Breadcrumbs-N2-sZWW5.cjs.map} +1 -1
  30. package/dist/Button-5LQtDA9d.js +72 -0
  31. package/dist/{Button-CtADzomU.js.map → Button-5LQtDA9d.js.map} +1 -1
  32. package/dist/Button-Bxztlybi.cjs +2 -0
  33. package/dist/{Button-Q_5uA-zc.cjs.map → Button-Bxztlybi.cjs.map} +1 -1
  34. package/dist/{Calendar-CHLCv2s9.js → Calendar-BIKo_aus.js} +5 -5
  35. package/dist/{Calendar-CHLCv2s9.js.map → Calendar-BIKo_aus.js.map} +1 -1
  36. package/dist/{Calendar-BbbtMsZs.cjs → Calendar-CsBgaKZ-.cjs} +2 -2
  37. package/dist/{Calendar-BbbtMsZs.cjs.map → Calendar-CsBgaKZ-.cjs.map} +1 -1
  38. package/dist/{Card-CntRsQfm.cjs → Card-Csn3FaMl.cjs} +2 -2
  39. package/dist/{Card-CntRsQfm.cjs.map → Card-Csn3FaMl.cjs.map} +1 -1
  40. package/dist/{Card-Br9IB0yM.js → Card-DMwQ7rMk.js} +4 -4
  41. package/dist/{Card-Br9IB0yM.js.map → Card-DMwQ7rMk.js.map} +1 -1
  42. package/dist/Chip-BdCZ44I8.cjs +2 -0
  43. package/dist/{Chip-CrBizrvG.cjs.map → Chip-BdCZ44I8.cjs.map} +1 -1
  44. package/dist/Chip-C7IkFuM1.js +92 -0
  45. package/dist/{Chip-DYZ5w7VM.js.map → Chip-C7IkFuM1.js.map} +1 -1
  46. package/dist/ChoiceCardGroup-Cj_YFj6C.cjs +2 -0
  47. package/dist/{ChoiceCardGroup-C7Eengyd.cjs.map → ChoiceCardGroup-Cj_YFj6C.cjs.map} +1 -1
  48. package/dist/ChoiceCardGroup-D37XREKV.js +180 -0
  49. package/dist/{ChoiceCardGroup-q0yN-TeQ.js.map → ChoiceCardGroup-D37XREKV.js.map} +1 -1
  50. package/dist/CodeBlock-BnXxxqAW.cjs +2 -0
  51. package/dist/{CodeBlock-DW4uaZXM.cjs.map → CodeBlock-BnXxxqAW.cjs.map} +1 -1
  52. package/dist/CodeBlock-C10JN6DR.js +96 -0
  53. package/dist/{CodeBlock-B6Eqc4HR.js.map → CodeBlock-C10JN6DR.js.map} +1 -1
  54. package/dist/{ColorPicker-nhWd_nOW.cjs → ColorPicker-CVddGc-n.cjs} +2 -2
  55. package/dist/{ColorPicker-nhWd_nOW.cjs.map → ColorPicker-CVddGc-n.cjs.map} +1 -1
  56. package/dist/{ColorPicker-GsKIqJu8.js → ColorPicker-z8_-77LO.js} +3 -3
  57. package/dist/{ColorPicker-GsKIqJu8.js.map → ColorPicker-z8_-77LO.js.map} +1 -1
  58. package/dist/{ColorPickerPanel-BeAu83S6.cjs → ColorPickerPanel-DJY6-EqO.cjs} +2 -2
  59. package/dist/{ColorPickerPanel-BeAu83S6.cjs.map → ColorPickerPanel-DJY6-EqO.cjs.map} +1 -1
  60. package/dist/{ColorPickerPanel-BEcZePcT.js → ColorPickerPanel-y4A2LLLf.js} +3 -3
  61. package/dist/{ColorPickerPanel-BEcZePcT.js.map → ColorPickerPanel-y4A2LLLf.js.map} +1 -1
  62. package/dist/{ColorRamp-C-zRPhHj.cjs → ColorRamp-DvRsdOWy.cjs} +2 -2
  63. package/dist/{ColorRamp-C-zRPhHj.cjs.map → ColorRamp-DvRsdOWy.cjs.map} +1 -1
  64. package/dist/{ColorRamp-CeNgd8wF.js → ColorRamp-Dvit8yoP.js} +2 -2
  65. package/dist/{ColorRamp-CeNgd8wF.js.map → ColorRamp-Dvit8yoP.js.map} +1 -1
  66. package/dist/{ConfigProvider-Dqfu7UBU.js → ConfigProvider-CYgmMH4j.js} +2 -2
  67. package/dist/{ConfigProvider-Dqfu7UBU.js.map → ConfigProvider-CYgmMH4j.js.map} +1 -1
  68. package/dist/{ConfigProvider-Ci9Q2HLF.cjs → ConfigProvider-Cf-awvZs.cjs} +2 -2
  69. package/dist/{ConfigProvider-Ci9Q2HLF.cjs.map → ConfigProvider-Cf-awvZs.cjs.map} +1 -1
  70. package/dist/{CopyButton-Chr7SP5i.cjs → CopyButton-BOp7waEt.cjs} +2 -2
  71. package/dist/{CopyButton-Chr7SP5i.cjs.map → CopyButton-BOp7waEt.cjs.map} +1 -1
  72. package/dist/{CopyButton-Bidt2Vgp.js → CopyButton-_iMBE4q_.js} +4 -4
  73. package/dist/{CopyButton-Bidt2Vgp.js.map → CopyButton-_iMBE4q_.js.map} +1 -1
  74. package/dist/DashedButton-BX8hfY1x.cjs +2 -0
  75. package/dist/{DashedButton-Dw7xHgIp.cjs.map → DashedButton-BX8hfY1x.cjs.map} +1 -1
  76. package/dist/DashedButton-wcmXTYBw.js +58 -0
  77. package/dist/{DashedButton-csz6Jt_K.js.map → DashedButton-wcmXTYBw.js.map} +1 -1
  78. package/dist/{DatePicker-4rb34nPR.cjs → DatePicker-UQwpH-rw.cjs} +2 -2
  79. package/dist/{DatePicker-4rb34nPR.cjs.map → DatePicker-UQwpH-rw.cjs.map} +1 -1
  80. package/dist/{DatePicker-D7ZMOhWn.js → DatePicker-X5hZVSW6.js} +6 -6
  81. package/dist/{DatePicker-D7ZMOhWn.js.map → DatePicker-X5hZVSW6.js.map} +1 -1
  82. package/dist/DatePicker.module-BaQyKOUM.cjs +2 -0
  83. package/dist/{DatePicker.module-BDtTsg8M.cjs.map → DatePicker.module-BaQyKOUM.cjs.map} +1 -1
  84. package/dist/DatePicker.module-DoywSvLu.js +138 -0
  85. package/dist/{DatePicker.module-CMMQyEhG.js.map → DatePicker.module-DoywSvLu.js.map} +1 -1
  86. package/dist/{DateTimePicker-gDxM2CGy.js → DateTimePicker-Ch1kUHEb.js} +9 -9
  87. package/dist/{DateTimePicker-gDxM2CGy.js.map → DateTimePicker-Ch1kUHEb.js.map} +1 -1
  88. package/dist/{DateTimePicker-CVFzKzyA.cjs → DateTimePicker-ClTZGMON.cjs} +2 -2
  89. package/dist/{DateTimePicker-CVFzKzyA.cjs.map → DateTimePicker-ClTZGMON.cjs.map} +1 -1
  90. package/dist/{DescriptionList-Die3lRBW.js → DescriptionList-Cque-iYk.js} +69 -69
  91. package/dist/{DescriptionList-Die3lRBW.js.map → DescriptionList-Cque-iYk.js.map} +1 -1
  92. package/dist/DescriptionList-IVAvgpEL.cjs +2 -0
  93. package/dist/{DescriptionList-BBvfABps.cjs.map → DescriptionList-IVAvgpEL.cjs.map} +1 -1
  94. package/dist/Dropdown-C_y9_dVn.cjs +2 -0
  95. package/dist/Dropdown-C_y9_dVn.cjs.map +1 -0
  96. package/dist/Dropdown-D-D_Z1Jo.js +154 -0
  97. package/dist/Dropdown-D-D_Z1Jo.js.map +1 -0
  98. package/dist/{EmptyState-D5EKQjX1.cjs → EmptyState-C84B-E8a.cjs} +2 -2
  99. package/dist/{EmptyState-D5EKQjX1.cjs.map → EmptyState-C84B-E8a.cjs.map} +1 -1
  100. package/dist/{EmptyState-DRgER10x.js → EmptyState-Yts_p-jZ.js} +3 -3
  101. package/dist/{EmptyState-DRgER10x.js.map → EmptyState-Yts_p-jZ.js.map} +1 -1
  102. package/dist/{ErrorBoundary-CLfE2NjU.js → ErrorBoundary-BgMOPle0.js} +3 -3
  103. package/dist/{ErrorBoundary-CLfE2NjU.js.map → ErrorBoundary-BgMOPle0.js.map} +1 -1
  104. package/dist/{ErrorBoundary-DVcGWZd8.cjs → ErrorBoundary-DtYswKp3.cjs} +2 -2
  105. package/dist/{ErrorBoundary-DVcGWZd8.cjs.map → ErrorBoundary-DtYswKp3.cjs.map} +1 -1
  106. package/dist/{ErrorState-DJDQbHZY.cjs → ErrorState-Aa8LVjkl.cjs} +2 -2
  107. package/dist/{ErrorState-DJDQbHZY.cjs.map → ErrorState-Aa8LVjkl.cjs.map} +1 -1
  108. package/dist/{ErrorState-Dqw0AvmB.js → ErrorState-BE9Rcmht.js} +8 -8
  109. package/dist/{ErrorState-Dqw0AvmB.js.map → ErrorState-BE9Rcmht.js.map} +1 -1
  110. package/dist/FileCard-Chfx0QdF.cjs +2 -0
  111. package/dist/{FileCard-BqMproT9.cjs.map → FileCard-Chfx0QdF.cjs.map} +1 -1
  112. package/dist/{FileCard-kVnjcSlk.js → FileCard-m3i_8yKR.js} +33 -33
  113. package/dist/{FileCard-kVnjcSlk.js.map → FileCard-m3i_8yKR.js.map} +1 -1
  114. package/dist/FileUploader-B27Y4rak.js +706 -0
  115. package/dist/FileUploader-B27Y4rak.js.map +1 -0
  116. package/dist/FileUploader-DkvFO0N_.cjs +2 -0
  117. package/dist/FileUploader-DkvFO0N_.cjs.map +1 -0
  118. package/dist/{Flag-B1ZvZVXi.cjs → Flag-BvZB3295.cjs} +2 -2
  119. package/dist/{Flag-B1ZvZVXi.cjs.map → Flag-BvZB3295.cjs.map} +1 -1
  120. package/dist/{Flag-BEIqYQZg.js → Flag-C1HwnZXJ.js} +2 -2
  121. package/dist/{Flag-BEIqYQZg.js.map → Flag-C1HwnZXJ.js.map} +1 -1
  122. package/dist/{FullscreenToggle-BuQonKW8.js → FullscreenToggle-B4ynXdCP.js} +4 -4
  123. package/dist/{FullscreenToggle-BuQonKW8.js.map → FullscreenToggle-B4ynXdCP.js.map} +1 -1
  124. package/dist/{FullscreenToggle-CWlOXLss.cjs → FullscreenToggle-CEFZQ5OC.cjs} +2 -2
  125. package/dist/{FullscreenToggle-CWlOXLss.cjs.map → FullscreenToggle-CEFZQ5OC.cjs.map} +1 -1
  126. package/dist/Icon-B7DJn8Tw.js +5418 -0
  127. package/dist/Icon-B7DJn8Tw.js.map +1 -0
  128. package/dist/Icon-CBg21lKA.cjs +2 -0
  129. package/dist/Icon-CBg21lKA.cjs.map +1 -0
  130. package/dist/IconButton-EaExCXRq.js +68 -0
  131. package/dist/{IconButton-BoURJOUD.js.map → IconButton-EaExCXRq.js.map} +1 -1
  132. package/dist/IconButton-wW1o4HHw.cjs +2 -0
  133. package/dist/{IconButton-CiDPeKM4.cjs.map → IconButton-wW1o4HHw.cjs.map} +1 -1
  134. package/dist/ImageEditor-DTFQZ6ON.js +2709 -0
  135. package/dist/ImageEditor-DTFQZ6ON.js.map +1 -0
  136. package/dist/ImageEditor-D_HKfDbx.cjs +60 -0
  137. package/dist/ImageEditor-D_HKfDbx.cjs.map +1 -0
  138. package/dist/Link-BZjolIAF.js +48 -0
  139. package/dist/{Link-BQlvsu9V.js.map → Link-BZjolIAF.js.map} +1 -1
  140. package/dist/Link-CtttVM6w.cjs +2 -0
  141. package/dist/{Link-GZT51mKx.cjs.map → Link-CtttVM6w.cjs.map} +1 -1
  142. package/dist/{List-CKoNx21F.cjs → List-CLUXeaXS.cjs} +2 -2
  143. package/dist/{List-CKoNx21F.cjs.map → List-CLUXeaXS.cjs.map} +1 -1
  144. package/dist/{List-2Y3ktTcF.js → List-DS91CZUt.js} +2 -2
  145. package/dist/{List-2Y3ktTcF.js.map → List-DS91CZUt.js.map} +1 -1
  146. package/dist/ListItem-CguNjf-u.cjs +2 -0
  147. package/dist/{ListItem-DkCYXucd.cjs.map → ListItem-CguNjf-u.cjs.map} +1 -1
  148. package/dist/ListItem-Ezmdk7q-.js +76 -0
  149. package/dist/{ListItem-2Lr5_NRY.js.map → ListItem-Ezmdk7q-.js.map} +1 -1
  150. package/dist/{Loader-CAmRn8Oj.cjs → Loader-DNR2_YHm.cjs} +2 -2
  151. package/dist/{Loader-CAmRn8Oj.cjs.map → Loader-DNR2_YHm.cjs.map} +1 -1
  152. package/dist/{Loader-CnTuddK7.js → Loader-D_Foo6Hj.js} +2 -2
  153. package/dist/{Loader-CnTuddK7.js.map → Loader-D_Foo6Hj.js.map} +1 -1
  154. package/dist/{LocationPicker-BwQ6ULMF.cjs → LocationPicker-CdO37PKg.cjs} +2 -2
  155. package/dist/{LocationPicker-BwQ6ULMF.cjs.map → LocationPicker-CdO37PKg.cjs.map} +1 -1
  156. package/dist/{LocationPicker-Cns3fkYI.js → LocationPicker-DGbnbTW9.js} +8 -8
  157. package/dist/{LocationPicker-Cns3fkYI.js.map → LocationPicker-DGbnbTW9.js.map} +1 -1
  158. package/dist/Modal-1rIBMvKH.js +154 -0
  159. package/dist/Modal-1rIBMvKH.js.map +1 -0
  160. package/dist/Modal-Du-uVpYw.cjs +2 -0
  161. package/dist/Modal-Du-uVpYw.cjs.map +1 -0
  162. package/dist/MultiSelect-BoqunsM9.js +219 -0
  163. package/dist/{MultiSelect-svEVZNbp.js.map → MultiSelect-BoqunsM9.js.map} +1 -1
  164. package/dist/MultiSelect-lAAaD0uL.cjs +2 -0
  165. package/dist/{MultiSelect-DJ6tRseY.cjs.map → MultiSelect-lAAaD0uL.cjs.map} +1 -1
  166. package/dist/{NumberField-sokUuuBR.cjs → NumberField-CyUA6eob.cjs} +2 -2
  167. package/dist/{NumberField-sokUuuBR.cjs.map → NumberField-CyUA6eob.cjs.map} +1 -1
  168. package/dist/{NumberField-9ekoB1wS.js → NumberField-DHFGNQjZ.js} +4 -4
  169. package/dist/{NumberField-9ekoB1wS.js.map → NumberField-DHFGNQjZ.js.map} +1 -1
  170. package/dist/OtpField-CIy5OtXI.cjs +2 -0
  171. package/dist/{OtpField-DlkGju72.cjs.map → OtpField-CIy5OtXI.cjs.map} +1 -1
  172. package/dist/{OtpField-DA7zJwy9.js → OtpField-pL9nj4AW.js} +61 -61
  173. package/dist/{OtpField-DA7zJwy9.js.map → OtpField-pL9nj4AW.js.map} +1 -1
  174. package/dist/Overlay-CywFQfjm.cjs +2 -0
  175. package/dist/Overlay-CywFQfjm.cjs.map +1 -0
  176. package/dist/Overlay-DiL0ZARH.js +60 -0
  177. package/dist/Overlay-DiL0ZARH.js.map +1 -0
  178. package/dist/{PageError-vD8Dpfns.js → PageError-C5SO0mVJ.js} +5 -5
  179. package/dist/{PageError-vD8Dpfns.js.map → PageError-C5SO0mVJ.js.map} +1 -1
  180. package/dist/{PageError-DUN5PzDF.cjs → PageError-DbokLmOY.cjs} +2 -2
  181. package/dist/{PageError-DUN5PzDF.cjs.map → PageError-DbokLmOY.cjs.map} +1 -1
  182. package/dist/{PageLayout-BesuKuX6.cjs → PageLayout-B7ZDiNq8.cjs} +2 -2
  183. package/dist/{PageLayout-BesuKuX6.cjs.map → PageLayout-B7ZDiNq8.cjs.map} +1 -1
  184. package/dist/{PageLayout-CdObvxt7.js → PageLayout-Du-D6Pd4.js} +5 -5
  185. package/dist/{PageLayout-CdObvxt7.js.map → PageLayout-Du-D6Pd4.js.map} +1 -1
  186. package/dist/{PageNotFound-Cc5eZ6w3.js → PageNotFound-DSkoMfed.js} +5 -5
  187. package/dist/{PageNotFound-Cc5eZ6w3.js.map → PageNotFound-DSkoMfed.js.map} +1 -1
  188. package/dist/{PageNotFound-CfOAhmJ-.cjs → PageNotFound-DfNwdtgJ.cjs} +2 -2
  189. package/dist/{PageNotFound-CfOAhmJ-.cjs.map → PageNotFound-DfNwdtgJ.cjs.map} +1 -1
  190. package/dist/Pagination-BH8ACaAC.js +139 -0
  191. package/dist/{Pagination-CX0S1RrF.js.map → Pagination-BH8ACaAC.js.map} +1 -1
  192. package/dist/Pagination-DO2Os4an.cjs +2 -0
  193. package/dist/{Pagination-CAD9_Nr_.cjs.map → Pagination-DO2Os4an.cjs.map} +1 -1
  194. package/dist/{PaletteField-CVIwl2nV.js → PaletteField-BFb0PQ-S.js} +3 -3
  195. package/dist/{PaletteField-CVIwl2nV.js.map → PaletteField-BFb0PQ-S.js.map} +1 -1
  196. package/dist/{PaletteField-CpiEkXcB.cjs → PaletteField-BfvcJvGM.cjs} +2 -2
  197. package/dist/{PaletteField-CpiEkXcB.cjs.map → PaletteField-BfvcJvGM.cjs.map} +1 -1
  198. package/dist/PhoneField-C-wOm7g5.cjs +2 -0
  199. package/dist/{PhoneField-Dlnnv4DU.cjs.map → PhoneField-C-wOm7g5.cjs.map} +1 -1
  200. package/dist/{PhoneField-xHLTU-o5.js → PhoneField-DFhGWgbK.js} +106 -106
  201. package/dist/{PhoneField-xHLTU-o5.js.map → PhoneField-DFhGWgbK.js.map} +1 -1
  202. package/dist/{Popconfirm-Chlm_M5T.cjs → Popconfirm-_53vtMI0.cjs} +2 -2
  203. package/dist/{Popconfirm-Chlm_M5T.cjs.map → Popconfirm-_53vtMI0.cjs.map} +1 -1
  204. package/dist/{Popconfirm-DIlygJY8.js → Popconfirm-o5da44ra.js} +4 -4
  205. package/dist/{Popconfirm-DIlygJY8.js.map → Popconfirm-o5da44ra.js.map} +1 -1
  206. package/dist/{Progress-DqvKmyQW.cjs → Progress-BSinoQ8t.cjs} +2 -2
  207. package/dist/{Progress-DqvKmyQW.cjs.map → Progress-BSinoQ8t.cjs.map} +1 -1
  208. package/dist/{Progress-BAEhawtj.js → Progress-CHzNwegP.js} +2 -2
  209. package/dist/{Progress-BAEhawtj.js.map → Progress-CHzNwegP.js.map} +1 -1
  210. package/dist/{QrCode-D7BTYcW2.js → QrCode-C3hAfNP6.js} +2 -2
  211. package/dist/{QrCode-D7BTYcW2.js.map → QrCode-C3hAfNP6.js.map} +1 -1
  212. package/dist/{QrCode-Dqsk49vX.cjs → QrCode-tNNnsbHM.cjs} +2 -2
  213. package/dist/{QrCode-Dqsk49vX.cjs.map → QrCode-tNNnsbHM.cjs.map} +1 -1
  214. package/dist/{RemoveDialog-CQIm9GTH.js → RemoveDialog-CXy-PY-G.js} +6 -6
  215. package/dist/{RemoveDialog-CQIm9GTH.js.map → RemoveDialog-CXy-PY-G.js.map} +1 -1
  216. package/dist/{RemoveDialog-DZ-EqIfS.cjs → RemoveDialog-Hi_gV-8A.cjs} +2 -2
  217. package/dist/{RemoveDialog-DZ-EqIfS.cjs.map → RemoveDialog-Hi_gV-8A.cjs.map} +1 -1
  218. package/dist/RichTextEditor-BhVE1q4U.cjs +2 -0
  219. package/dist/RichTextEditor-BhVE1q4U.cjs.map +1 -0
  220. package/dist/RichTextEditor-DQz9jGD3.js +1011 -0
  221. package/dist/RichTextEditor-DQz9jGD3.js.map +1 -0
  222. package/dist/{RootLayout-Cl98ghy1.js → RootLayout-CjT5uHlt.js} +21 -21
  223. package/dist/{RootLayout-Cl98ghy1.js.map → RootLayout-CjT5uHlt.js.map} +1 -1
  224. package/dist/{RootLayout-s_Q_kSoS.cjs → RootLayout-iSGY4MsS.cjs} +2 -2
  225. package/dist/{RootLayout-s_Q_kSoS.cjs.map → RootLayout-iSGY4MsS.cjs.map} +1 -1
  226. package/dist/Select-DVoL547R.cjs +2 -0
  227. package/dist/{Select-BrjXCXtl.cjs.map → Select-DVoL547R.cjs.map} +1 -1
  228. package/dist/{Select-CG8UJL9R.js → Select-DuLDLnnb.js} +47 -47
  229. package/dist/{Select-CG8UJL9R.js.map → Select-DuLDLnnb.js.map} +1 -1
  230. package/dist/Sidebar-DRQo4zAF.cjs +2 -0
  231. package/dist/{Sidebar-DLlqHvQJ.cjs.map → Sidebar-DRQo4zAF.cjs.map} +1 -1
  232. package/dist/{Sidebar-CbPr34jd.js → Sidebar-DvQmuBNK.js} +59 -59
  233. package/dist/{Sidebar-CbPr34jd.js.map → Sidebar-DvQmuBNK.js.map} +1 -1
  234. package/dist/{Slider-B5iG-HSw.js → Slider-D-QjclQJ.js} +2 -2
  235. package/dist/{Slider-B5iG-HSw.js.map → Slider-D-QjclQJ.js.map} +1 -1
  236. package/dist/{Slider-DTnui01g.cjs → Slider-DxnCQRSH.cjs} +2 -2
  237. package/dist/{Slider-DTnui01g.cjs.map → Slider-DxnCQRSH.cjs.map} +1 -1
  238. package/dist/{SpeedDial-i5kxikmt.cjs → SpeedDial-37OMwj9C.cjs} +2 -2
  239. package/dist/{SpeedDial-i5kxikmt.cjs.map → SpeedDial-37OMwj9C.cjs.map} +1 -1
  240. package/dist/{SpeedDial-Be3SHkzw.js → SpeedDial-BBQ9y6lm.js} +3 -3
  241. package/dist/{SpeedDial-Be3SHkzw.js.map → SpeedDial-BBQ9y6lm.js.map} +1 -1
  242. package/dist/Stepper-CU5Y0kfj.js +168 -0
  243. package/dist/{Stepper-BDQt-oVG.js.map → Stepper-CU5Y0kfj.js.map} +1 -1
  244. package/dist/Stepper-WqkfGPnQ.cjs +2 -0
  245. package/dist/{Stepper-e8qBsKYW.cjs.map → Stepper-WqkfGPnQ.cjs.map} +1 -1
  246. package/dist/{SwatchPicker-0gnOvv7U.cjs → SwatchPicker-DCjE0T80.cjs} +2 -2
  247. package/dist/{SwatchPicker-0gnOvv7U.cjs.map → SwatchPicker-DCjE0T80.cjs.map} +1 -1
  248. package/dist/{SwatchPicker-BZHRELA-.js → SwatchPicker-DS4WY2eM.js} +2 -2
  249. package/dist/{SwatchPicker-BZHRELA-.js.map → SwatchPicker-DS4WY2eM.js.map} +1 -1
  250. package/dist/{Table-ChdM_vyi.js → Table-BECUUZtf.js} +346 -346
  251. package/dist/Table-BECUUZtf.js.map +1 -0
  252. package/dist/Table-BnlvrRMr.cjs +2 -0
  253. package/dist/Table-BnlvrRMr.cjs.map +1 -0
  254. package/dist/Tabs-BXAHddi7.js +193 -0
  255. package/dist/{Tabs-BxZrgozI.js.map → Tabs-BXAHddi7.js.map} +1 -1
  256. package/dist/Tabs-DiL1vNW3.cjs +2 -0
  257. package/dist/{Tabs-C4kB1yfG.cjs.map → Tabs-DiL1vNW3.cjs.map} +1 -1
  258. package/dist/{TagsField-Bg5BcQU-.cjs → TagsField-BsV_6dff.cjs} +2 -2
  259. package/dist/{TagsField-Bg5BcQU-.cjs.map → TagsField-BsV_6dff.cjs.map} +1 -1
  260. package/dist/{TagsField-DWlIt7XO.js → TagsField-C1SgykAj.js} +5 -5
  261. package/dist/{TagsField-DWlIt7XO.js.map → TagsField-C1SgykAj.js.map} +1 -1
  262. package/dist/{TextField-B-xqoDZR.cjs → TextField-DUv689u2.cjs} +2 -2
  263. package/dist/{TextField-B-xqoDZR.cjs.map → TextField-DUv689u2.cjs.map} +1 -1
  264. package/dist/{TextField-Dwx5GPxz.js → TextField-oZI7thoU.js} +4 -4
  265. package/dist/{TextField-Dwx5GPxz.js.map → TextField-oZI7thoU.js.map} +1 -1
  266. package/dist/{ThemeToggle-CK2USfgx.js → ThemeToggle-5uHCUsX7.js} +4 -4
  267. package/dist/{ThemeToggle-CK2USfgx.js.map → ThemeToggle-5uHCUsX7.js.map} +1 -1
  268. package/dist/{ThemeToggle-DFgv1bsh.cjs → ThemeToggle-xn3roH0u.cjs} +2 -2
  269. package/dist/{ThemeToggle-DFgv1bsh.cjs.map → ThemeToggle-xn3roH0u.cjs.map} +1 -1
  270. package/dist/TimeColumns-By23LHZw.cjs +2 -0
  271. package/dist/{TimeColumns-B8KTj-tc.cjs.map → TimeColumns-By23LHZw.cjs.map} +1 -1
  272. package/dist/TimeColumns-lO33mhX7.js +147 -0
  273. package/dist/{TimeColumns-BWcuu3l7.js.map → TimeColumns-lO33mhX7.js.map} +1 -1
  274. package/dist/{TimePicker-DjL15hz1.cjs → TimePicker-BHFNH8LR.cjs} +2 -2
  275. package/dist/{TimePicker-DjL15hz1.cjs.map → TimePicker-BHFNH8LR.cjs.map} +1 -1
  276. package/dist/{TimePicker-YMVHevpZ.js → TimePicker-Dl5p833O.js} +7 -7
  277. package/dist/{TimePicker-YMVHevpZ.js.map → TimePicker-Dl5p833O.js.map} +1 -1
  278. package/dist/Timeline-DOojNvLG.cjs +2 -0
  279. package/dist/Timeline-DOojNvLG.cjs.map +1 -0
  280. package/dist/Timeline-Dg03dwTN.js +87 -0
  281. package/dist/Timeline-Dg03dwTN.js.map +1 -0
  282. package/dist/{Toaster-pHN2pxrU.js → Toaster-BPBFZiTr.js} +3 -3
  283. package/dist/{Toaster-pHN2pxrU.js.map → Toaster-BPBFZiTr.js.map} +1 -1
  284. package/dist/{Toaster-9hZ5MuW7.cjs → Toaster-D4T89N1S.cjs} +2 -2
  285. package/dist/{Toaster-9hZ5MuW7.cjs.map → Toaster-D4T89N1S.cjs.map} +1 -1
  286. package/dist/ToggleButtonGroup-CGNRLxjg.cjs +2 -0
  287. package/dist/{ToggleButtonGroup-Ci_DFvdt.cjs.map → ToggleButtonGroup-CGNRLxjg.cjs.map} +1 -1
  288. package/dist/{ToggleButtonGroup-Mdskkjdh.js → ToggleButtonGroup-K6ZcrTZT.js} +37 -37
  289. package/dist/{ToggleButtonGroup-Mdskkjdh.js.map → ToggleButtonGroup-K6ZcrTZT.js.map} +1 -1
  290. package/dist/{TranslatedFields-BpWU5ZcG.js → TranslatedFields-Clsr84XC.js} +5 -5
  291. package/dist/{TranslatedFields-BpWU5ZcG.js.map → TranslatedFields-Clsr84XC.js.map} +1 -1
  292. package/dist/{TranslatedFields-SvS37hab.cjs → TranslatedFields-LdeJeHEp.cjs} +2 -2
  293. package/dist/{TranslatedFields-SvS37hab.cjs.map → TranslatedFields-LdeJeHEp.cjs.map} +1 -1
  294. package/dist/{UserCard-VPaexedS.cjs → UserCard-CQOiWppq.cjs} +2 -2
  295. package/dist/{UserCard-VPaexedS.cjs.map → UserCard-CQOiWppq.cjs.map} +1 -1
  296. package/dist/{UserCard-cmZrMvwL.js → UserCard-Cr75RwZb.js} +5 -5
  297. package/dist/{UserCard-cmZrMvwL.js.map → UserCard-Cr75RwZb.js.map} +1 -1
  298. package/dist/chunks/icons/{25-knEB8mSp.js → 25-BMMPtr_E.js} +4 -5
  299. package/dist/chunks/icons/{25-Dho_3EHD.cjs → 25-uATZNfXE.cjs} +1 -1
  300. package/dist/chunks/icons/{2b-CQJdcF1h.js → 2b-Brkug4c-.js} +10 -11
  301. package/dist/chunks/icons/{2b-C2_97u16.cjs → 2b-CIVRGp1R.cjs} +1 -1
  302. package/dist/chunks/icons/57-BLoIUlhF.js +27 -0
  303. package/dist/chunks/icons/57-D4zLdDZ1.cjs +1 -0
  304. package/dist/chunks/icons/{75-DqLkMUyj.cjs → 75-C2eJ2Tvr.cjs} +1 -1
  305. package/dist/chunks/icons/{75-D5RQw6IJ.js → 75-D16WojvG.js} +6 -7
  306. package/dist/chunks/icons/{7c-DpnA_JOJ.js → 7c-0j5Sno5_.js} +6 -7
  307. package/dist/chunks/icons/{7c-DEaFwltT.cjs → 7c-LUfAyp72.cjs} +1 -1
  308. package/dist/chunks/icons/8a-BJ_LOjmW.js +26 -0
  309. package/dist/chunks/icons/8a-CYkhOibI.cjs +1 -0
  310. package/dist/chunks/icons/97-Bx7FkkGJ.js +12 -0
  311. package/dist/chunks/icons/97-D7pUHrOX.cjs +1 -0
  312. package/dist/chunks/icons/{b7-BtHkI92Y.js → b7-DmmkevXf.js} +17 -18
  313. package/dist/chunks/icons/{b7-B-dB5jrV.cjs → b7-rI1GpsxW.cjs} +1 -1
  314. package/dist/chunks/icons/b8-De0yKEKv.js +28 -0
  315. package/dist/chunks/icons/b8-eR814BVJ.cjs +1 -0
  316. package/dist/chunks/icons/{b9-Bw942fE3.js → b9-CJO6ZdSw.js} +10 -11
  317. package/dist/chunks/icons/{b9-Be-J4RIp.cjs → b9-DZdWz9qg.cjs} +1 -1
  318. package/dist/chunks/icons/d5-BAPeb6B0.cjs +1 -0
  319. package/dist/chunks/icons/d5-BJJanOLe.js +21 -0
  320. package/dist/chunks/icons/d8--vRkIVal.js +19 -0
  321. package/dist/chunks/icons/d8-BfMys92X.cjs +1 -0
  322. package/dist/chunks/icons/dd-CARhkHmU.js +21 -0
  323. package/dist/chunks/icons/dd-D61yllMP.cjs +1 -0
  324. package/dist/components/Accordion/index.cjs +1 -1
  325. package/dist/components/Accordion/index.js +1 -1
  326. package/dist/components/Alert/index.cjs +1 -1
  327. package/dist/components/Alert/index.js +1 -1
  328. package/dist/components/AuthLayout/index.cjs +1 -1
  329. package/dist/components/AuthLayout/index.js +1 -1
  330. package/dist/components/Avatar/index.cjs +1 -1
  331. package/dist/components/Avatar/index.js +2 -2
  332. package/dist/components/Breadcrumbs/index.cjs +1 -1
  333. package/dist/components/Breadcrumbs/index.js +1 -1
  334. package/dist/components/Button/index.cjs +1 -1
  335. package/dist/components/Button/index.js +1 -1
  336. package/dist/components/Card/index.cjs +1 -1
  337. package/dist/components/Card/index.js +1 -1
  338. package/dist/components/Chip/index.cjs +1 -1
  339. package/dist/components/Chip/index.js +1 -1
  340. package/dist/components/ChoiceCard/index.cjs +1 -1
  341. package/dist/components/ChoiceCard/index.js +1 -1
  342. package/dist/components/CodeBlock/index.cjs +1 -1
  343. package/dist/components/CodeBlock/index.js +1 -1
  344. package/dist/components/ColorPicker/index.cjs +1 -1
  345. package/dist/components/ColorPicker/index.js +1 -1
  346. package/dist/components/ColorRamp/index.cjs +1 -1
  347. package/dist/components/ColorRamp/index.js +1 -1
  348. package/dist/components/CopyButton/index.cjs +1 -1
  349. package/dist/components/CopyButton/index.js +1 -1
  350. package/dist/components/DashedButton/index.cjs +1 -1
  351. package/dist/components/DashedButton/index.js +1 -1
  352. package/dist/components/DatePicker/index.cjs +1 -1
  353. package/dist/components/DatePicker/index.js +1 -1
  354. package/dist/components/DateTimePicker/index.cjs +1 -1
  355. package/dist/components/DateTimePicker/index.js +1 -1
  356. package/dist/components/DescriptionList/index.cjs +1 -1
  357. package/dist/components/DescriptionList/index.js +1 -1
  358. package/dist/components/Dropdown/index.cjs +1 -1
  359. package/dist/components/Dropdown/index.js +1 -1
  360. package/dist/components/EmptyState/index.cjs +1 -1
  361. package/dist/components/EmptyState/index.js +1 -1
  362. package/dist/components/ErrorState/index.cjs +1 -1
  363. package/dist/components/ErrorState/index.js +2 -2
  364. package/dist/components/FileCard/index.cjs +1 -1
  365. package/dist/components/FileCard/index.js +1 -1
  366. package/dist/components/FileUploader/FileUploader.d.cts +33 -5
  367. package/dist/components/FileUploader/FileUploader.d.ts +33 -5
  368. package/dist/components/FileUploader/FileUploaderEditDialog.d.cts +8 -18
  369. package/dist/components/FileUploader/FileUploaderEditDialog.d.ts +8 -18
  370. package/dist/components/FileUploader/index.cjs +1 -1
  371. package/dist/components/FileUploader/index.js +1 -1
  372. package/dist/components/Flag/index.cjs +1 -1
  373. package/dist/components/Flag/index.js +1 -1
  374. package/dist/components/FullscreenToggle/index.cjs +1 -1
  375. package/dist/components/FullscreenToggle/index.js +1 -1
  376. package/dist/components/Icon/index.cjs +1 -1
  377. package/dist/components/Icon/index.js +1 -1
  378. package/dist/components/IconButton/index.cjs +1 -1
  379. package/dist/components/IconButton/index.js +1 -1
  380. package/dist/components/ImageEditor/CropShapeMenu.d.cts +17 -0
  381. package/dist/components/ImageEditor/CropShapeMenu.d.ts +17 -0
  382. package/dist/components/ImageEditor/EditorStage.d.cts +27 -0
  383. package/dist/components/ImageEditor/EditorStage.d.ts +27 -0
  384. package/dist/components/ImageEditor/FilterStrip.d.cts +14 -0
  385. package/dist/components/ImageEditor/FilterStrip.d.ts +14 -0
  386. package/dist/components/ImageEditor/ImageEditor.d.cts +30 -0
  387. package/dist/components/ImageEditor/ImageEditor.d.ts +30 -0
  388. package/dist/components/ImageEditor/ResizePanel.d.cts +19 -0
  389. package/dist/components/ImageEditor/ResizePanel.d.ts +19 -0
  390. package/dist/components/ImageEditor/RulerSlider.d.cts +37 -0
  391. package/dist/components/ImageEditor/RulerSlider.d.ts +37 -0
  392. package/dist/components/ImageEditor/core/affine.d.cts +11 -0
  393. package/dist/components/ImageEditor/core/affine.d.ts +11 -0
  394. package/dist/components/ImageEditor/core/editor.d.cts +69 -0
  395. package/dist/components/ImageEditor/core/editor.d.ts +69 -0
  396. package/dist/components/ImageEditor/core/geometry.d.cts +112 -0
  397. package/dist/components/ImageEditor/core/geometry.d.ts +112 -0
  398. package/dist/components/ImageEditor/core/load.d.cts +26 -0
  399. package/dist/components/ImageEditor/core/load.d.ts +26 -0
  400. package/dist/components/ImageEditor/core/matrix.d.cts +55 -0
  401. package/dist/components/ImageEditor/core/matrix.d.ts +55 -0
  402. package/dist/components/ImageEditor/core/pixels.d.cts +24 -0
  403. package/dist/components/ImageEditor/core/pixels.d.ts +24 -0
  404. package/dist/components/ImageEditor/core/redact.d.cts +37 -0
  405. package/dist/components/ImageEditor/core/redact.d.ts +37 -0
  406. package/dist/components/ImageEditor/core/render.d.cts +19 -0
  407. package/dist/components/ImageEditor/core/render.d.ts +19 -0
  408. package/dist/components/ImageEditor/core/scene.d.cts +47 -0
  409. package/dist/components/ImageEditor/core/scene.d.ts +47 -0
  410. package/dist/components/ImageEditor/core/spring.d.cts +17 -0
  411. package/dist/components/ImageEditor/core/spring.d.ts +17 -0
  412. package/dist/components/ImageEditor/core/types.d.cts +104 -0
  413. package/dist/components/ImageEditor/core/types.d.ts +104 -0
  414. package/dist/components/ImageEditor/core/webgl.d.cts +55 -0
  415. package/dist/components/ImageEditor/core/webgl.d.ts +55 -0
  416. package/dist/components/ImageEditor/index.cjs +2 -0
  417. package/dist/components/ImageEditor/index.cjs.map +1 -0
  418. package/dist/components/ImageEditor/index.d.cts +6 -0
  419. package/dist/components/ImageEditor/index.d.ts +6 -0
  420. package/dist/components/ImageEditor/index.js +9 -0
  421. package/dist/components/ImageEditor/index.js.map +1 -0
  422. package/dist/components/Link/index.cjs +1 -1
  423. package/dist/components/Link/index.js +1 -1
  424. package/dist/components/List/index.cjs +1 -1
  425. package/dist/components/List/index.js +2 -2
  426. package/dist/components/Loader/index.cjs +1 -1
  427. package/dist/components/Loader/index.js +1 -1
  428. package/dist/components/LocationPicker/index.cjs +1 -1
  429. package/dist/components/LocationPicker/index.js +1 -1
  430. package/dist/components/Modal/index.cjs +1 -1
  431. package/dist/components/Modal/index.js +1 -1
  432. package/dist/components/MultiSelect/index.cjs +1 -1
  433. package/dist/components/MultiSelect/index.js +1 -1
  434. package/dist/components/NumberField/index.cjs +1 -1
  435. package/dist/components/NumberField/index.js +1 -1
  436. package/dist/components/OtpField/index.cjs +1 -1
  437. package/dist/components/OtpField/index.js +1 -1
  438. package/dist/components/PageError/index.cjs +1 -1
  439. package/dist/components/PageError/index.js +1 -1
  440. package/dist/components/PageLayout/index.cjs +1 -1
  441. package/dist/components/PageLayout/index.js +1 -1
  442. package/dist/components/PageNotFound/index.cjs +1 -1
  443. package/dist/components/PageNotFound/index.js +1 -1
  444. package/dist/components/Pagination/index.cjs +1 -1
  445. package/dist/components/Pagination/index.js +1 -1
  446. package/dist/components/PaletteField/index.cjs +1 -1
  447. package/dist/components/PaletteField/index.js +1 -1
  448. package/dist/components/PhoneField/index.cjs +1 -1
  449. package/dist/components/PhoneField/index.js +1 -1
  450. package/dist/components/Popconfirm/index.cjs +1 -1
  451. package/dist/components/Popconfirm/index.js +1 -1
  452. package/dist/components/Progress/index.cjs +1 -1
  453. package/dist/components/Progress/index.js +1 -1
  454. package/dist/components/QrCode/index.cjs +1 -1
  455. package/dist/components/QrCode/index.js +1 -1
  456. package/dist/components/RemoveDialog/index.cjs +1 -1
  457. package/dist/components/RemoveDialog/index.js +1 -1
  458. package/dist/components/RichTextEditor/RichTextEditor.d.cts +3 -2
  459. package/dist/components/RichTextEditor/RichTextEditor.d.ts +3 -2
  460. package/dist/components/RichTextEditor/index.cjs +1 -1
  461. package/dist/components/RichTextEditor/index.js +1 -1
  462. package/dist/components/RichTextEditor/nodes/ImageNode.d.cts +8 -5
  463. package/dist/components/RichTextEditor/nodes/ImageNode.d.ts +8 -5
  464. package/dist/components/RichTextEditor/nodes/VideoNode.d.cts +4 -4
  465. package/dist/components/RichTextEditor/nodes/VideoNode.d.ts +4 -4
  466. package/dist/components/RootLayout/index.cjs +1 -1
  467. package/dist/components/RootLayout/index.js +1 -1
  468. package/dist/components/Select/index.cjs +1 -1
  469. package/dist/components/Select/index.js +1 -1
  470. package/dist/components/Sidebar/index.cjs +1 -1
  471. package/dist/components/Sidebar/index.js +1 -1
  472. package/dist/components/Slider/index.cjs +1 -1
  473. package/dist/components/Slider/index.js +1 -1
  474. package/dist/components/SpeedDial/index.cjs +1 -1
  475. package/dist/components/SpeedDial/index.js +1 -1
  476. package/dist/components/Stepper/index.cjs +1 -1
  477. package/dist/components/Stepper/index.js +1 -1
  478. package/dist/components/SwatchPicker/index.cjs +1 -1
  479. package/dist/components/SwatchPicker/index.js +1 -1
  480. package/dist/components/Table/index.cjs +1 -1
  481. package/dist/components/Table/index.js +1 -1
  482. package/dist/components/Tabs/index.cjs +1 -1
  483. package/dist/components/Tabs/index.js +1 -1
  484. package/dist/components/TagsField/index.cjs +1 -1
  485. package/dist/components/TagsField/index.js +1 -1
  486. package/dist/components/TextField/index.cjs +1 -1
  487. package/dist/components/TextField/index.js +1 -1
  488. package/dist/components/ThemeToggle/index.cjs +1 -1
  489. package/dist/components/ThemeToggle/index.js +1 -1
  490. package/dist/components/TimePicker/index.cjs +1 -1
  491. package/dist/components/TimePicker/index.js +1 -1
  492. package/dist/components/Timeline/Timeline.d.cts +16 -4
  493. package/dist/components/Timeline/Timeline.d.ts +16 -4
  494. package/dist/components/Timeline/TimelineItem.d.cts +12 -6
  495. package/dist/components/Timeline/TimelineItem.d.ts +12 -6
  496. package/dist/components/Timeline/index.cjs +1 -1
  497. package/dist/components/Timeline/index.d.cts +1 -1
  498. package/dist/components/Timeline/index.d.ts +1 -1
  499. package/dist/components/Timeline/index.js +1 -1
  500. package/dist/components/Timeline/timelineContext.d.cts +3 -2
  501. package/dist/components/Timeline/timelineContext.d.ts +3 -2
  502. package/dist/components/Toast/index.cjs +1 -1
  503. package/dist/components/Toast/index.js +1 -1
  504. package/dist/components/ToggleButton/index.cjs +1 -1
  505. package/dist/components/ToggleButton/index.js +1 -1
  506. package/dist/components/TranslatedFields/index.cjs +1 -1
  507. package/dist/components/TranslatedFields/index.js +1 -1
  508. package/dist/components/UserCard/index.cjs +1 -1
  509. package/dist/components/UserCard/index.js +1 -1
  510. package/dist/components/index.d.cts +1 -0
  511. package/dist/components/index.d.ts +1 -0
  512. package/dist/entries/app.cjs +1 -1
  513. package/dist/entries/app.js +1 -1
  514. package/dist/entries/components.cjs +1 -1
  515. package/dist/entries/components.js +164 -159
  516. package/dist/entries/components.js.map +1 -1
  517. package/dist/entries/i18n.cjs +1 -1
  518. package/dist/entries/i18n.js +2 -2
  519. package/dist/entries/icons.cjs +1 -1
  520. package/dist/entries/icons.js +1 -1
  521. package/dist/entries/theme.cjs +1 -1
  522. package/dist/entries/theme.js +1 -1
  523. package/dist/i18n/messages.d.cts +61 -4
  524. package/dist/i18n/messages.d.ts +61 -4
  525. package/dist/icons/names.d.cts +3 -3
  526. package/dist/icons/names.d.ts +3 -3
  527. package/dist/index.cjs +1 -1
  528. package/dist/index.css +1 -1
  529. package/dist/index.js +161 -156
  530. package/dist/index.js.map +1 -1
  531. package/dist/{messages-BiRLMy1E.js → messages-BZYBZ3GR.js} +101 -44
  532. package/dist/messages-BZYBZ3GR.js.map +1 -0
  533. package/dist/{messages-C_fRRCg6.cjs → messages-CTHjpVJq.cjs} +9 -9
  534. package/dist/messages-CTHjpVJq.cjs.map +1 -0
  535. package/dist/{useHomeTo-DdmOGy09.js → useHomeTo-Biyc-Un8.js} +2 -2
  536. package/dist/{useHomeTo-DdmOGy09.js.map → useHomeTo-Biyc-Un8.js.map} +1 -1
  537. package/dist/{useHomeTo-HCkVzGTu.cjs → useHomeTo-D7wcH6aw.cjs} +2 -2
  538. package/dist/{useHomeTo-HCkVzGTu.cjs.map → useHomeTo-D7wcH6aw.cjs.map} +1 -1
  539. package/dist/{useOptionMenu-BqCj10_a.cjs → useOptionMenu-B40OOVsO.cjs} +2 -2
  540. package/dist/{useOptionMenu-BqCj10_a.cjs.map → useOptionMenu-B40OOVsO.cjs.map} +1 -1
  541. package/dist/{useOptionMenu-EiyIkC3E.js → useOptionMenu-BTt8t9SM.js} +6 -6
  542. package/dist/{useOptionMenu-EiyIkC3E.js.map → useOptionMenu-BTt8t9SM.js.map} +1 -1
  543. package/package.json +1 -6
  544. package/dist/Alert-B4XZDk16.cjs +0 -2
  545. package/dist/Alert-D5E1PLkV.js +0 -70
  546. package/dist/Breadcrumbs-DSUxcp6u.cjs +0 -2
  547. package/dist/Breadcrumbs-M31xyok8.js +0 -34
  548. package/dist/Button-CtADzomU.js +0 -72
  549. package/dist/Button-Q_5uA-zc.cjs +0 -2
  550. package/dist/Chip-CrBizrvG.cjs +0 -2
  551. package/dist/Chip-DYZ5w7VM.js +0 -92
  552. package/dist/ChoiceCardGroup-C7Eengyd.cjs +0 -2
  553. package/dist/ChoiceCardGroup-q0yN-TeQ.js +0 -180
  554. package/dist/CodeBlock-B6Eqc4HR.js +0 -96
  555. package/dist/CodeBlock-DW4uaZXM.cjs +0 -2
  556. package/dist/DashedButton-Dw7xHgIp.cjs +0 -2
  557. package/dist/DashedButton-csz6Jt_K.js +0 -58
  558. package/dist/DatePicker.module-BDtTsg8M.cjs +0 -2
  559. package/dist/DatePicker.module-CMMQyEhG.js +0 -138
  560. package/dist/DescriptionList-BBvfABps.cjs +0 -2
  561. package/dist/Dropdown-CMjURWYd.cjs +0 -2
  562. package/dist/Dropdown-CMjURWYd.cjs.map +0 -1
  563. package/dist/Dropdown-CnDBlB02.js +0 -146
  564. package/dist/Dropdown-CnDBlB02.js.map +0 -1
  565. package/dist/FileCard-BqMproT9.cjs +0 -2
  566. package/dist/FileUploader-BimFH5d8.cjs +0 -2
  567. package/dist/FileUploader-BimFH5d8.cjs.map +0 -1
  568. package/dist/FileUploader-LJIMh5_b.js +0 -707
  569. package/dist/FileUploader-LJIMh5_b.js.map +0 -1
  570. package/dist/Icon-B6lz-V0A.cjs +0 -2
  571. package/dist/Icon-B6lz-V0A.cjs.map +0 -1
  572. package/dist/Icon-D5TxgfCc.js +0 -5404
  573. package/dist/Icon-D5TxgfCc.js.map +0 -1
  574. package/dist/IconButton-BoURJOUD.js +0 -68
  575. package/dist/IconButton-CiDPeKM4.cjs +0 -2
  576. package/dist/Link-BQlvsu9V.js +0 -48
  577. package/dist/Link-GZT51mKx.cjs +0 -2
  578. package/dist/ListItem-2Lr5_NRY.js +0 -76
  579. package/dist/ListItem-DkCYXucd.cjs +0 -2
  580. package/dist/Modal-CYcVOzID.js +0 -206
  581. package/dist/Modal-CYcVOzID.js.map +0 -1
  582. package/dist/Modal-DwY3jGHE.cjs +0 -2
  583. package/dist/Modal-DwY3jGHE.cjs.map +0 -1
  584. package/dist/MultiSelect-DJ6tRseY.cjs +0 -2
  585. package/dist/MultiSelect-svEVZNbp.js +0 -219
  586. package/dist/OtpField-DlkGju72.cjs +0 -2
  587. package/dist/Pagination-CAD9_Nr_.cjs +0 -2
  588. package/dist/Pagination-CX0S1RrF.js +0 -139
  589. package/dist/PhoneField-Dlnnv4DU.cjs +0 -2
  590. package/dist/RichTextEditor-Ba1G_qXu.cjs +0 -2
  591. package/dist/RichTextEditor-Ba1G_qXu.cjs.map +0 -1
  592. package/dist/RichTextEditor-CJcbxQ6H.js +0 -916
  593. package/dist/RichTextEditor-CJcbxQ6H.js.map +0 -1
  594. package/dist/Select-BrjXCXtl.cjs +0 -2
  595. package/dist/Sidebar-DLlqHvQJ.cjs +0 -2
  596. package/dist/Stepper-BDQt-oVG.js +0 -168
  597. package/dist/Stepper-e8qBsKYW.cjs +0 -2
  598. package/dist/Table-C14fRX1U.cjs +0 -2
  599. package/dist/Table-C14fRX1U.cjs.map +0 -1
  600. package/dist/Table-ChdM_vyi.js.map +0 -1
  601. package/dist/Tabs-BxZrgozI.js +0 -193
  602. package/dist/Tabs-C4kB1yfG.cjs +0 -2
  603. package/dist/TimeColumns-B8KTj-tc.cjs +0 -2
  604. package/dist/TimeColumns-BWcuu3l7.js +0 -147
  605. package/dist/Timeline-Cb1krSlo.js +0 -70
  606. package/dist/Timeline-Cb1krSlo.js.map +0 -1
  607. package/dist/Timeline-CmluHBIT.cjs +0 -2
  608. package/dist/Timeline-CmluHBIT.cjs.map +0 -1
  609. package/dist/ToggleButtonGroup-Ci_DFvdt.cjs +0 -2
  610. package/dist/chunks/icons/57-Bxh2lSz-.cjs +0 -1
  611. package/dist/chunks/icons/57-CkmrDM9A.js +0 -28
  612. package/dist/chunks/icons/8a-CThAqelS.js +0 -27
  613. package/dist/chunks/icons/8a-DRBAtpxY.cjs +0 -1
  614. package/dist/chunks/icons/97-J9NBhX2o.js +0 -14
  615. package/dist/chunks/icons/97-r2YXIQ_T.cjs +0 -1
  616. package/dist/chunks/icons/b8-CyIivk3C.cjs +0 -1
  617. package/dist/chunks/icons/b8-DcK0w8WM.js +0 -29
  618. package/dist/chunks/icons/d5-3fWtNlXW.js +0 -20
  619. package/dist/chunks/icons/d5-CoG_Hfw9.cjs +0 -1
  620. package/dist/chunks/icons/d8-DsebfeMy.cjs +0 -1
  621. package/dist/chunks/icons/d8-DtOvDDrr.js +0 -20
  622. package/dist/chunks/icons/dd-BXVES9Ib.js +0 -22
  623. package/dist/chunks/icons/dd-beaqCKss.cjs +0 -1
  624. package/dist/messages-BiRLMy1E.js.map +0 -1
  625. package/dist/messages-C_fRRCg6.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextEditor-DQz9jGD3.js","sources":["../src/components/RichTextEditor/urlSafety.ts","../src/components/RichTextEditor/nodes/ImageNode.tsx","../src/components/RichTextEditor/nodes/VideoNode.tsx","../src/components/RichTextEditor/Toolbar.tsx","../src/components/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["/**\n * URL-scheme allowlist for the RichTextEditor — the single defense against script-URL XSS\n * (`javascript:`, `vbscript:`, `data:text/html`, …) reaching the exported HTML value, whether a URL\n * arrives via the toolbar dialogs, a paste, or a loaded value. Rejected URLs are neutralized (an\n * empty `src`, or a `'#'` `href`) rather than executed.\n */\n\n// Link schemes we trust, plus relative/anchor/query starts (which carry no scheme at all).\nconst SAFE_LINK = /^(?:https?:|mailto:|tel:|ftp:|#|\\/|\\?|\\.)/i\n// Does the string begin with an explicit `scheme:` at all? (Anything schemeless is treated as relative.)\nconst HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i\n\n/**\n * Sanitize a link `href`: allow `http(s)`/`mailto`/`tel`/`ftp` and relative/anchor/query URLs; any\n * other explicit scheme (`javascript:`, `data:`, `vbscript:`, …) collapses to `'#'`.\n */\nexport function sanitizeLinkUrl(url: string): string {\n const trimmed = url.trim()\n if (trimmed === '') return ''\n if (SAFE_LINK.test(trimmed)) return trimmed\n if (!HAS_SCHEME.test(trimmed)) return trimmed // schemeless (e.g. `example.com/x`) → relative, safe\n return '#' // a disallowed scheme\n}\n\n/**\n * Sanitize an image/video `src`: like {@link sanitizeLinkUrl}, but also permits inline\n * `data:image`/`data:video` (upload embeds) and `blob:` object URLs. A disallowed scheme yields `''`.\n */\nexport function sanitizeMediaUrl(url: string): string {\n const trimmed = url.trim()\n if (/^data:(?:image|video)\\//i.test(trimmed) || /^blob:/i.test(trimmed)) return trimmed\n const safe = sanitizeLinkUrl(trimmed)\n return safe === '#' ? '' : safe\n}\n","import {\n $applyNodeReplacement,\n $getNodeByKey,\n DecoratorNode,\n type DOMConversionMap,\n type DOMConversionOutput,\n type DOMExportOutput,\n type LexicalNode,\n type NodeKey,\n type SerializedLexicalNode,\n type Spread,\n} from 'lexical'\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { useT } from '../../../theme'\nimport { Button } from '../../Button'\nimport { Icon } from '../../Icon'\nimport { Modal } from '../../Modal'\nimport { TextField } from '../../TextField'\nimport { sanitizeMediaUrl } from '../urlSafety'\nimport styles from '../RichTextEditor.module.css'\n\n/** Serialized shape of an {@link ImageNode} (editor-state JSON). */\nexport type SerializedImageNode = Spread<{ src: string; alt: string }, SerializedLexicalNode>\n\n/** Rebuilds an `ImageNode` from a pasted/loaded `<img>` element. */\nfunction convertImageElement(domNode: HTMLElement): DOMConversionOutput | null {\n if (domNode instanceof HTMLImageElement && domNode.src) {\n return { node: $createImageNode(domNode.getAttribute('src') ?? domNode.src, domNode.alt) }\n }\n return null\n}\n\n/**\n * An inline image node — it lives inside a paragraph (`<p><img></p>`). Renders through `ImageView` (the\n * `<img>` in a block frame + the Alt Text button while editable); the `src` may be a remote URL or a\n * base64 `data:` URL when inserted via upload. Serializes to a clean `<img src alt>` for the HTML value\n * and parses back from any `<img>` on paste/load.\n */\nexport class ImageNode extends DecoratorNode<ReactNode> {\n __src: string\n __alt: string\n\n static getType(): string {\n return 'tz-image'\n }\n\n static clone(node: ImageNode): ImageNode {\n return new ImageNode(node.__src, node.__alt, node.__key)\n }\n\n constructor(src: string, alt = '', key?: NodeKey) {\n super(key)\n // sanitize here so every path (insert, paste import, JSON load, clone) gets a safe scheme\n this.__src = sanitizeMediaUrl(src)\n this.__alt = alt\n }\n\n static importJSON(json: SerializedImageNode): ImageNode {\n return $createImageNode(json.src, json.alt)\n }\n\n exportJSON(): SerializedImageNode {\n return { ...super.exportJSON(), type: 'tz-image', version: 1, src: this.__src, alt: this.__alt }\n }\n\n static importDOM(): DOMConversionMap | null {\n return { img: () => ({ conversion: convertImageElement, priority: 0 }) }\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n element.setAttribute('src', this.__src)\n element.setAttribute('alt', this.__alt)\n return { element }\n }\n\n /** A `display: contents` wrapper; the image itself is rendered by {@link decorate}. */\n createDOM(): HTMLElement {\n const div = document.createElement('div')\n div.style.display = 'contents'\n return div\n }\n\n updateDOM(): false {\n return false\n }\n\n getSrc(): string {\n return this.__src\n }\n\n getAltText(): string {\n return this.__alt\n }\n\n /** Set the image's alt text (use inside an `editor.update`). */\n setAltText(alt: string): void {\n this.getWritable().__alt = alt\n }\n\n decorate(): ReactNode {\n return <ImageView nodeKey={this.getKey()} src={this.__src} alt={this.__alt} />\n }\n}\n\n/**\n * The image as the editor shows it: the `<img>` plus — while the editor is editable — an **Alt Text**\n * button on its corner (revealed on hover / keyboard focus, always shown on touch screens) that opens a\n * one-field modal to write the image's alt text (it lands in the HTML value's `<img alt>`).\n */\nfunction ImageView({ nodeKey, src, alt }: { nodeKey: NodeKey; src: string; alt: string }) {\n const [editor] = useLexicalComposerContext()\n const editable = useLexicalEditable()\n const t = useT()\n const formId = useId()\n const [open, setOpen] = useState(false)\n const [draft, setDraft] = useState(alt)\n // the button sits inside the contenteditable: keep its keys (Enter, Space) from Lexical's root listener,\n // which would act on the editor's caret (split the line) and cancel the button's own activation\n const buttonRef = useRef<HTMLButtonElement>(null)\n useEffect(() => {\n const button = buttonRef.current\n if (!button) return\n const stop = (e: KeyboardEvent) => e.stopPropagation()\n button.addEventListener('keydown', stop)\n return () => button.removeEventListener('keydown', stop)\n }, [editable])\n\n const save = () => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if ($isImageNode(node)) node.setAltText(draft.trim())\n })\n setOpen(false)\n }\n\n return (\n <span className={styles.imageFrame} contentEditable={false}>\n <img src={src} alt={alt} draggable={false} />\n {editable && (\n <button\n ref={buttonRef}\n type=\"button\"\n className={styles.imageAltButton}\n aria-label={t('rte.editAlt')}\n title={alt || t('rte.editAlt')}\n // keep the editor's selection where it is (the image would grab it on mousedown)\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onClick={() => {\n setDraft(alt)\n setOpen(true)\n }}\n >\n <Icon name=\"Text\" size=\"sm\" />\n <span>{t('rte.altText')}</span>\n </button>\n )}\n <Modal\n open={open}\n onClose={() => setOpen(false)}\n size=\"sm\"\n icon=\"Text\"\n title={t('rte.altText')}\n footer={\n <>\n <Button variant=\"text\" size=\"sm\" onClick={() => setOpen(false)}>\n {t('common.cancel')}\n </Button>\n <Button type=\"submit\" size=\"sm\" form={formId}>\n {t('common.save')}\n </Button>\n </>\n }\n >\n <form\n id={formId}\n onSubmit={(e) => {\n e.preventDefault()\n // the modal is portaled, but the submit still bubbles up the React tree — keep it from an\n // enclosing app <Form> (it would submit that too)\n e.stopPropagation()\n save()\n }}\n >\n <TextField\n label={t('rte.altText')}\n placeholder={t('rte.altPlaceholder')}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n autoFocus\n />\n </form>\n </Modal>\n </span>\n )\n}\n\n/** Creates an `ImageNode` (use inside an `editor.update`). */\nexport function $createImageNode(src: string, alt = ''): ImageNode {\n return $applyNodeReplacement(new ImageNode(src, alt))\n}\n\n/** Type guard for `ImageNode`. */\nexport function $isImageNode(node: LexicalNode | null | undefined): node is ImageNode {\n return node instanceof ImageNode\n}\n","import {\n $applyNodeReplacement,\n DecoratorNode,\n type DOMConversionMap,\n type DOMConversionOutput,\n type DOMExportOutput,\n type LexicalNode,\n type NodeKey,\n type SerializedLexicalNode,\n type Spread,\n} from 'lexical'\nimport type { ReactNode } from 'react'\nimport { useT } from '../../../theme'\nimport { sanitizeMediaUrl } from '../urlSafety'\n\n/** Serialized shape of a {@link VideoNode} (editor-state JSON). */\nexport type SerializedVideoNode = Spread<{ src: string }, SerializedLexicalNode>\n\n/** A direct video file (rendered with `<video controls>` rather than an embed `<iframe>`). */\nfunction isFileVideo(src: string): boolean {\n return /\\.(mp4|webm|ogg|ogv|mov|m4v)(\\?.*)?$/i.test(src)\n}\n\n/**\n * Normalizes a pasted video URL into an embeddable one — YouTube/Vimeo watch links become their\n * `embed` form; everything else (incl. already-embed URLs and direct files) is returned unchanged,\n * so the conversion is idempotent across HTML round-trips.\n */\nexport function toVideoEmbedSrc(raw: string): string {\n const youtube = raw.match(\n /(?:youtube\\.com\\/(?:watch\\?(?:.*&)?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([\\w-]{11})/,\n )\n if (youtube) return `https://www.youtube.com/embed/${youtube[1]}`\n const vimeo = raw.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/)\n if (vimeo) return `https://player.vimeo.com/video/${vimeo[1]}`\n return raw\n}\n\n/** Rebuilds a `VideoNode` from a pasted/loaded `<iframe>` or `<video>` element. */\nfunction convertVideoElement(domNode: HTMLElement): DOMConversionOutput | null {\n const src = domNode.getAttribute('src') || domNode.querySelector('source')?.getAttribute('src')\n if (src) return { node: $createVideoNode(src) }\n return null\n}\n\n/**\n * An inline video node — it lives inside a paragraph, like the image. Direct media files render with\n * `<video controls>`; everything else is treated as an embed and renders in a responsive `<iframe>`\n * (YouTube/Vimeo links are normalized to their embed URL). Serializes to a clean `<video>` / `<iframe>` for the HTML value.\n */\nexport class VideoNode extends DecoratorNode<ReactNode> {\n __src: string\n\n static getType(): string {\n return 'tz-video'\n }\n\n static clone(node: VideoNode): VideoNode {\n return new VideoNode(node.__src, node.__key)\n }\n\n constructor(src: string, key?: NodeKey) {\n super(key)\n // sanitize here so every path (insert, paste import, JSON load, clone) gets a safe scheme\n this.__src = sanitizeMediaUrl(src)\n }\n\n static importJSON(json: SerializedVideoNode): VideoNode {\n return $createVideoNode(json.src)\n }\n\n exportJSON(): SerializedVideoNode {\n return { ...super.exportJSON(), type: 'tz-video', version: 1, src: this.__src }\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n iframe: () => ({ conversion: convertVideoElement, priority: 0 }),\n video: () => ({ conversion: convertVideoElement, priority: 0 }),\n }\n }\n\n exportDOM(): DOMExportOutput {\n if (isFileVideo(this.__src)) {\n const video = document.createElement('video')\n video.setAttribute('src', this.__src)\n video.setAttribute('controls', 'true')\n return { element: video }\n }\n const iframe = document.createElement('iframe')\n iframe.setAttribute('src', this.__src)\n iframe.setAttribute('frameborder', '0')\n iframe.setAttribute('allowfullscreen', 'true')\n iframe.setAttribute(\n 'allow',\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\n )\n return { element: iframe }\n }\n\n /** A `display: contents` wrapper; the media element itself is rendered by {@link decorate}. */\n createDOM(): HTMLElement {\n const div = document.createElement('div')\n div.style.display = 'contents'\n return div\n }\n\n updateDOM(): false {\n return false\n }\n\n getSrc(): string {\n return this.__src\n }\n\n decorate(): ReactNode {\n if (isFileVideo(this.__src)) return <video src={this.__src} controls />\n return <VideoEmbed src={this.__src} />\n }\n}\n\n/** The in-editor embed `<iframe>` — a component so its `title` can be localized via `useT()`. */\nfunction VideoEmbed({ src }: { src: string }) {\n const t = useT()\n return (\n <div className=\"tz-rte-embed\">\n <iframe\n src={src}\n title={t('rte.embeddedVideo')}\n frameBorder={0}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n </div>\n )\n}\n\n/** Creates a `VideoNode`, normalizing the URL to an embeddable one (use inside an `editor.update`). */\nexport function $createVideoNode(src: string): VideoNode {\n return $applyNodeReplacement(new VideoNode(toVideoEmbedSrc(src)))\n}\n\n/** Type guard for `VideoNode`. */\nexport function $isVideoNode(node: LexicalNode | null | undefined): node is VideoNode {\n return node instanceof VideoNode\n}\n","import { useCallback, useEffect, useRef, useState, type ChangeEvent } from 'react'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport {\n $createParagraphNode,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isParagraphNode,\n $isRangeSelection,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_LOW,\n FORMAT_ELEMENT_COMMAND,\n FORMAT_TEXT_COMMAND,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n UNDO_COMMAND,\n type ElementFormatType,\n type LexicalNode,\n type TextFormatType,\n} from 'lexical'\nimport {\n $createHeadingNode,\n $createQuoteNode,\n $isHeadingNode,\n $isQuoteNode,\n type HeadingTagType,\n} from '@lexical/rich-text'\nimport {\n INSERT_CHECK_LIST_COMMAND,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n ListNode,\n REMOVE_LIST_COMMAND,\n} from '@lexical/list'\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link'\nimport { sanitizeLinkUrl } from './urlSafety'\nimport { toast } from '../Toast/toastStore'\nimport { useT, type MessageKey } from '../../theme'\nimport {\n $getSelectionStyleValueForProperty,\n $patchStyleText,\n $setBlocksType,\n} from '@lexical/selection'\nimport { $findMatchingParent, $getNearestNodeOfType, mergeRegister } from '@lexical/utils'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport type { IconName } from '../../icons/names'\nimport { Button } from '../Button'\nimport { ColorPickerPanel, DEFAULT_SWATCHES } from '../ColorPicker/ColorPickerPanel'\nimport { Divider } from '../Divider'\nimport { Dropdown } from '../Dropdown'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ListItem } from '../List'\nimport { Modal } from '../Modal'\nimport { TextField } from '../TextField'\nimport { $createImageNode } from './nodes/ImageNode'\nimport { $createVideoNode } from './nodes/VideoNode'\nimport styles from './RichTextEditor.module.css'\n\ntype Size = 'sm' | 'md' | 'lg'\ntype BlockType = 'paragraph' | HeadingTagType | 'quote' | 'bullet' | 'number' | 'check'\n\n// Block-type labels stay **English in every language** by design — \"Paragraph\" / \"Heading\" are\n// editor-standard terms the maintainer prefers untranslated, so these are literals, not i18n keys.\nconst BLOCK_LABEL: Partial<Record<BlockType, string>> = {\n paragraph: 'Paragraph',\n h1: 'Heading 1',\n h2: 'Heading 2',\n h3: 'Heading 3',\n quote: 'Quote',\n bullet: 'Bullet List',\n number: 'Numbered List',\n check: 'Check List',\n}\n\n/** Items in the block-type dropdown — lists & quote are standalone toolbar buttons; check lists are excluded. */\nconst BLOCKS: { type: BlockType; icon?: IconName }[] = [\n { type: 'paragraph', icon: 'Text' },\n { type: 'h1', icon: 'Hashtag' },\n { type: 'h2', icon: 'Hashtag' },\n { type: 'h3', icon: 'Hashtag' },\n]\n\n/** Text-alignment controls (set the block element's `text-align`); `labelKey` resolves via `t`. */\nconst ALIGNS: { value: ElementFormatType; labelKey: MessageKey; icon: IconName }[] = [\n { value: 'left', labelKey: 'rte.alignLeft', icon: 'TextalignLeft' },\n { value: 'center', labelKey: 'rte.alignCenter', icon: 'TextalignCenter' },\n { value: 'right', labelKey: 'rte.alignRight', icon: 'TextalignRight' },\n]\n\n/** Font-size options (the `font-size` style value). */\nconst FONT_SIZES = ['10px', '12px', '13px', '14px', '16px', '18px', '20px']\n\n/** The editor's default content size per `size` — mirrors `.content`'s `--tz-font-size-sm` / `-md` / `-lg`\n * (12 / 13 / 16px in theme.css) — shown active when the selection has no explicit `font-size`. */\nconst DEFAULT_FONT_SIZE: Record<Size, string> = { sm: '12px', md: '13px', lg: '16px' }\n\n/** Config for the shared URL-input `Modal` (link / image-by-URL / video) — replaces `window.prompt`. */\ntype UrlDialog = {\n icon: IconName\n title: string\n label: string\n placeholder: string\n confirmLabel: string\n onConfirm: (url: string) => void\n}\n\n/** The text-color button glyph — a brush icon with a corner triangle tinted with the current text\n * color (so the selected color is always visible). Accepts the `size` `IconButton` injects so it\n * doesn't hit the DOM. */\nfunction ColorGlyph({ color, size }: { color: string; size?: Size }) {\n return (\n <span className={styles.colorGlyph}>\n <Icon name=\"Brush\" size={size} />\n <span\n className={styles.colorBar}\n style={{ borderColor: `transparent transparent ${color || 'currentColor'} transparent` }}\n aria-hidden=\"true\"\n />\n </span>\n )\n}\n\nexport interface ToolbarProps {\n size: Size\n disabled: boolean\n /** Optional async upload — when set, an inserted image uses the returned URL instead of a base64 data URL. */\n onImageUpload?: (file: File) => Promise<string>\n}\n\n/** The editor toolbar — reads the live selection and dispatches Lexical commands. */\nexport function Toolbar({ size, disabled, onImageUpload }: ToolbarProps) {\n const t = useT()\n const blockLabel = (b: BlockType): string => BLOCK_LABEL[b] ?? b // h4–h6 aren't offered by the editor\n const [editor] = useLexicalComposerContext()\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const [isBold, setIsBold] = useState(false)\n const [isItalic, setIsItalic] = useState(false)\n const [isUnderline, setIsUnderline] = useState(false)\n const [isLink, setIsLink] = useState(false)\n const [linkUrl, setLinkUrl] = useState('')\n const [blockType, setBlockType] = useState<BlockType>('paragraph')\n const [elementFormat, setElementFormat] = useState<ElementFormatType>('left')\n const [fontSize, setFontSize] = useState('')\n const [textColor, setTextColor] = useState('')\n const [colorOpen, setColorOpen] = useState(false)\n const colorTriggerRef = useRef<HTMLButtonElement | null>(null)\n const [canUndo, setCanUndo] = useState(false)\n const [canRedo, setCanRedo] = useState(false)\n // shared URL-input modal (link / image-by-URL / video)\n const [urlDialog, setUrlDialog] = useState<UrlDialog | null>(null)\n const [urlValue, setUrlValue] = useState('')\n\n const syncState = useCallback(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) return\n setIsBold(selection.hasFormat('bold'))\n setIsItalic(selection.hasFormat('italic'))\n setIsUnderline(selection.hasFormat('underline'))\n setTextColor($getSelectionStyleValueForProperty(selection, 'color', ''))\n setFontSize($getSelectionStyleValueForProperty(selection, 'font-size', ''))\n\n const anchorNode = selection.anchor.getNode()\n const parent = anchorNode.getParent()\n const linkNode = $isLinkNode(anchorNode) ? anchorNode : $isLinkNode(parent) ? parent : null\n setIsLink(linkNode !== null)\n setLinkUrl(linkNode?.getURL() ?? '')\n\n // the block element under the cursor — drives both the alignment and block-type state\n const element =\n anchorNode.getKey() === 'root'\n ? anchorNode\n : ($findMatchingParent(anchorNode, (e) => {\n const parent = e.getParent()\n return parent === null || parent.getKey() === 'root'\n }) ?? anchorNode.getTopLevelElement())\n\n setElementFormat(($isElementNode(element) && element.getFormatType()) || 'left')\n\n const listNode = $getNearestNodeOfType(anchorNode, ListNode)\n if (listNode) setBlockType(listNode.getListType())\n else if ($isHeadingNode(element)) setBlockType(element.getTag())\n else if ($isQuoteNode(element)) setBlockType('quote')\n else setBlockType('paragraph')\n }, [])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => editorState.read(syncState)),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n syncState()\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n setCanUndo(payload)\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n setCanRedo(payload)\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, syncState])\n\n const format = (type: TextFormatType) => editor.dispatchCommand(FORMAT_TEXT_COMMAND, type)\n\n const applyAlign = (fmt: ElementFormatType) => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, fmt)\n\n // apply the picked color to the (retained) selection; `''` clears it back to the default\n const applyColor = (color: string) => {\n setTextColor(color)\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) $patchStyleText(selection, { color: color || null })\n })\n }\n\n // apply a font size to the (retained) selection; `''` clears it back to the editor default\n const applyFontSize = (value: string) => {\n setFontSize(value)\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) $patchStyleText(selection, { 'font-size': value || null })\n })\n }\n\n const applyBlock = (type: BlockType) => {\n if (type === 'bullet' || type === 'number' || type === 'check') {\n if (blockType === type) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined)\n } else {\n const command =\n type === 'bullet'\n ? INSERT_UNORDERED_LIST_COMMAND\n : type === 'number'\n ? INSERT_ORDERED_LIST_COMMAND\n : INSERT_CHECK_LIST_COMMAND\n editor.dispatchCommand(command, undefined)\n }\n return\n }\n editor.update(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) return\n if (type === 'paragraph') $setBlocksType(selection, () => $createParagraphNode())\n else if (type === 'quote') $setBlocksType(selection, () => $createQuoteNode())\n else $setBlocksType(selection, () => $createHeadingNode(type))\n })\n }\n\n const toggleQuote = () => applyBlock(blockType === 'quote' ? 'paragraph' : 'quote')\n\n // open the shared URL modal (prefilled value + handler differ per action)\n const openUrlDialog = (config: UrlDialog, initial = '') => {\n setUrlValue(initial)\n setUrlDialog(config)\n }\n const closeUrlDialog = () => setUrlDialog(null)\n const confirmUrlDialog = () => {\n urlDialog?.onConfirm(urlValue.trim())\n setUrlDialog(null)\n }\n\n const insertLink = () =>\n openUrlDialog(\n {\n icon: 'Link2',\n title: t('rte.linkTitle'),\n label: t('rte.linkUrl'),\n placeholder: 'https://example.com',\n confirmLabel: isLink ? t('common.update') : t('common.insert'),\n // an empty value removes the link (matches the old prompt behavior); sanitize the scheme\n onConfirm: (url) =>\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url === '' ? null : sanitizeLinkUrl(url)),\n },\n linkUrl, // prefill the current link's URL when the cursor sits in one\n )\n\n const insertImageByUrl = () =>\n openUrlDialog({\n icon: 'GalleryAdd',\n title: t('rte.imageTitle'),\n label: t('rte.imageUrl'),\n placeholder: 'https://example.com/image.jpg',\n confirmLabel: t('common.insert'),\n onConfirm: (url) => {\n if (url) editor.update(() => $insertMediaParagraph($createImageNode(url)))\n },\n })\n\n const onImageFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n event.target.value = '' // allow re-picking the same file\n if (!file) return\n try {\n const url = onImageUpload ? await onImageUpload(file) : await fileToDataUrl(file)\n // no alt text yet (a file name isn't one) — it's written through the image's Alt Text button\n editor.update(() => $insertMediaParagraph($createImageNode(url)))\n } catch {\n // a rejecting consumer upload handler (or a failed data-URL read) shouldn't fail silently\n toast.error(t('rte.imageError'))\n }\n }\n\n const insertVideo = () =>\n openUrlDialog({\n icon: 'VideoSquare',\n title: t('rte.videoTitle'),\n label: t('rte.videoUrl'),\n placeholder: t('rte.videoUrlPlaceholder'),\n confirmLabel: t('common.insert'),\n onConfirm: (url) => {\n if (url) editor.update(() => $insertMediaParagraph($createVideoNode(url)))\n },\n })\n\n /** A format toggle — soft-filled while active. */\n const fmtBtn = (\n active: boolean,\n label: string,\n onClick: () => void,\n child: React.ReactNode,\n key?: string,\n ) => (\n <IconButton\n key={key}\n variant={active ? 'filled' : 'text'}\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={label}\n aria-pressed={active}\n onMouseDown={(e) => e.preventDefault()} // keep focus/selection in the editor\n onClick={onClick}\n >\n {child}\n </IconButton>\n )\n\n // the block dropdown only manages Paragraph / Headings — lists & quote are separate toggle buttons,\n // so when the cursor is in a list/quote/check the trigger shows \"Paragraph\", not e.g. \"Bullet List\".\n const dropdownBlock: BlockType = blockType.startsWith('h') ? blockType : 'paragraph'\n\n // font-size shown active: the selection's explicit size, else the editor's default for this `size`\n const effectiveFontSize = fontSize || DEFAULT_FONT_SIZE[size]\n\n return (\n <div\n className={styles.toolbar}\n role=\"toolbar\"\n aria-label={t('rte.formatting')}\n aria-orientation=\"horizontal\"\n >\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled || !canUndo}\n aria-label={t('rte.undo')}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\n >\n <Icon name=\"UndoArrow\" />\n </IconButton>\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled || !canRedo}\n aria-label={t('rte.redo')}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\n >\n <Icon name=\"RedoArrow\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" />\n\n <Dropdown\n size={size}\n disabled={disabled}\n minWidth={false}\n trigger={\n <Button\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n endIcon={<Icon name=\"ArrowDown4\" />}\n aria-label={t('rte.fontSize')}\n onMouseDown={(e) => e.preventDefault()} // keep the selection while opening\n >\n {effectiveFontSize}\n </Button>\n }\n >\n {FONT_SIZES.map((f) => (\n <ListItem\n key={f}\n clickable\n selected={f === effectiveFontSize}\n onClick={() => applyFontSize(f)}\n >\n {f}\n </ListItem>\n ))}\n </Dropdown>\n\n <Divider orientation=\"vertical\" />\n\n <Dropdown\n size={size}\n disabled={disabled}\n trigger={\n <Button\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n endIcon={<Icon name=\"ArrowDown4\" />}\n onMouseDown={(e) => e.preventDefault()} // keep the selection while opening\n >\n {blockLabel(dropdownBlock)}\n </Button>\n }\n >\n {BLOCKS.map((b) => (\n <ListItem\n key={b.type}\n clickable\n selected={dropdownBlock === b.type}\n icon={b.icon}\n onClick={() => applyBlock(b.type)}\n >\n {blockLabel(b.type)}\n </ListItem>\n ))}\n </Dropdown>\n\n <Divider orientation=\"vertical\" />\n\n {fmtBtn(isBold, t('rte.bold'), () => format('bold'), <Icon name=\"TextBold\" />)}\n {fmtBtn(isItalic, t('rte.italic'), () => format('italic'), <Icon name=\"TextItalic\" />)}\n {fmtBtn(\n isUnderline,\n t('rte.underline'),\n () => format('underline'),\n <Icon name=\"TextUnderline\" />,\n )}\n\n <Divider orientation=\"vertical\" />\n\n {fmtBtn(\n blockType === 'bullet',\n t('rte.bulletList'),\n () => applyBlock('bullet'),\n <Icon name=\"ListBullet\" />,\n )}\n {fmtBtn(\n blockType === 'number',\n t('rte.numberedList'),\n () => applyBlock('number'),\n <Icon name=\"ListNumber\" />,\n )}\n {fmtBtn(blockType === 'quote', t('rte.quote'), toggleQuote, <Icon name=\"QuoteUp\" />)}\n\n <Divider orientation=\"vertical\" />\n\n {ALIGNS.map((a) =>\n fmtBtn(\n elementFormat === a.value,\n t(a.labelKey),\n () => applyAlign(a.value),\n <Icon name={a.icon} />,\n a.value,\n ),\n )}\n\n <Divider orientation=\"vertical\" />\n\n <IconButton\n ref={colorTriggerRef}\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('rte.textColor')}\n aria-expanded={colorOpen}\n onMouseDown={(e) => e.preventDefault()} // keep the editor's selection while opening\n onClick={() => setColorOpen((o) => !o)}\n >\n <ColorGlyph color={textColor} />\n </IconButton>\n <FloatingPanel\n open={colorOpen}\n triggerRef={colorTriggerRef}\n onClose={(refocus) => {\n setColorOpen(false)\n if (refocus) colorTriggerRef.current?.focus()\n }}\n role=\"dialog\"\n ariaLabel={t('rte.textColor')}\n width={232}\n >\n {/* no \"no color\" swatch; with no explicit color the accent default (first swatch) shows selected */}\n <ColorPickerPanel\n value={textColor || DEFAULT_SWATCHES[0]}\n onChange={applyColor}\n clearable={false}\n />\n </FloatingPanel>\n\n {fmtBtn(isLink, t('rte.link'), insertLink, <Icon name=\"Link2\" />)}\n\n <Dropdown\n size={size}\n disabled={disabled}\n minWidth={false}\n trigger={\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('rte.insertImage')}\n >\n <Icon name=\"GalleryAdd\" />\n </IconButton>\n }\n >\n <ListItem clickable icon=\"GalleryImport\" onClick={() => fileInputRef.current?.click()}>\n {t('rte.uploadImage')}\n </ListItem>\n <ListItem clickable icon=\"Link\" onClick={insertImageByUrl}>\n {t('rte.imageByUrl')}\n </ListItem>\n </Dropdown>\n\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('rte.insertVideo')}\n onClick={insertVideo}\n >\n <Icon name=\"VideoSquare\" />\n </IconButton>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={onImageFile}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {/* shared URL-input dialog for link / image-by-URL / video (replaces window.prompt). The footer\n Submit drives the body <form> via the `form` attribute (works across the modal's portal). */}\n <Modal\n open={urlDialog !== null}\n onClose={closeUrlDialog}\n size=\"sm\"\n icon={urlDialog?.icon}\n title={urlDialog?.title}\n footer={\n <>\n <Button variant=\"text\" size=\"sm\" onClick={closeUrlDialog}>\n {t('common.cancel')}\n </Button>\n <Button type=\"submit\" size=\"sm\" form=\"rte-url-form\">\n {urlDialog?.confirmLabel ?? t('common.insert')}\n </Button>\n </>\n }\n >\n <form\n id=\"rte-url-form\"\n onSubmit={(e) => {\n e.preventDefault()\n // the modal is portaled, but the submit still bubbles up the React tree — keep it from an\n // enclosing app <Form> (it would submit that too)\n e.stopPropagation()\n confirmUrlDialog()\n }}\n >\n <TextField\n label={urlDialog?.label}\n placeholder={urlDialog?.placeholder}\n value={urlValue}\n onChange={(e) => setUrlValue(e.target.value)}\n />\n </form>\n </Modal>\n </div>\n )\n}\n\n/**\n * Insert an image / video as a paragraph of its own (`<p><img></p>`) at the caret — the shape a loaded\n * value's media takes too, so the value round-trips; the paragraph holds the caret before / after it.\n */\nfunction $insertMediaParagraph(media: LexicalNode) {\n // the caret's line is empty (a blank editor, a fresh line) — the media takes that paragraph\n const selection = $getSelection()\n const block = $isRangeSelection(selection)\n ? selection.anchor.getNode().getTopLevelElement()\n : $getRoot().getLastChild()\n if ($isParagraphNode(block) && block.isEmpty()) {\n block.append(media)\n block.selectEnd()\n return\n }\n const paragraph = $createParagraphNode()\n paragraph.append(media)\n $insertNodeToNearestRoot(paragraph)\n // inserting at a line's end / start leaves the split's empty half behind (a paragraph, heading, quote …)\n // — drop it; the caret goes after the media, in its own paragraph\n const next = paragraph.getNextSibling()\n if ($isElementNode(next) && next.isEmpty()) {\n next.remove()\n paragraph.selectEnd()\n }\n const prev = paragraph.getPreviousSibling()\n if ($isElementNode(prev) && prev.isEmpty()) prev.remove()\n}\n\n/** Reads a picked file into a base64 `data:` URL (the no-backend default for image upload). */\nfunction fileToDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport {\n $createParagraphNode,\n $getRoot,\n $insertNodes,\n $isParagraphNode,\n $isTextNode,\n $setSelection,\n TextNode,\n getStyleObjectFromCSS,\n type DOMConversionMap,\n type EditorThemeClasses,\n} from 'lexical'\nimport { LexicalComposer } from '@lexical/react/LexicalComposer'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable'\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin'\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin'\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'\nimport { MarkdownShortcutPlugin } from '@lexical/react/LexicalMarkdownShortcutPlugin'\nimport {\n ELEMENT_TRANSFORMERS,\n TEXT_FORMAT_TRANSFORMERS,\n TEXT_MATCH_TRANSFORMERS,\n} from '@lexical/markdown'\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text'\nimport { ListItemNode, ListNode } from '@lexical/list'\nimport { LinkNode } from '@lexical/link'\nimport { sanitizeLinkUrl } from './urlSafety'\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { Typography } from '../Typography'\nimport { Toolbar } from './Toolbar'\nimport { ImageNode } from './nodes/ImageNode'\nimport { VideoNode } from './nodes/VideoNode'\nimport styles from './RichTextEditor.module.css'\n\nexport type RichTextEditorSize = 'sm' | 'md' | 'lg'\n\n/** Lexical node-type → CSS-module class map (so content is styled with `--tz-*` tokens). */\nconst THEME: EditorThemeClasses = {\n paragraph: styles.paragraph,\n heading: {\n h1: styles.h1,\n h2: styles.h2,\n h3: styles.h3,\n h4: styles.h4,\n h5: styles.h5,\n h6: styles.h6,\n },\n quote: styles.quote,\n list: {\n ul: styles.ul,\n ol: styles.ol,\n listitem: styles.li,\n listitemChecked: styles.liChecked,\n listitemUnchecked: styles.liUnchecked,\n nested: { listitem: styles.nestedLi },\n },\n link: styles.link,\n text: {\n bold: styles.bold,\n italic: styles.italic,\n underline: styles.underline,\n strikethrough: styles.strike,\n code: styles.codeInline,\n },\n}\n\nconst EDITOR_NODES = [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n ImageNode,\n VideoNode,\n]\n\n/**\n * Markdown shortcuts for headings/quote/lists + inline formats + links. Excludes the multiline\n * fenced-code-block transformer (it needs `CodeNode`, which is out of scope for v1).\n */\nconst MARKDOWN_TRANSFORMERS = [\n ...ELEMENT_TRANSFORMERS,\n ...TEXT_FORMAT_TRANSFORMERS,\n ...TEXT_MATCH_TRANSFORMERS,\n]\n\n/** The inline text styles the toolbar writes (`$patchStyleText`), which must survive a re-import. */\nconst IMPORTED_TEXT_STYLES = ['color', 'font-size'] as const\n\n/**\n * HTML import override for `<span>`: Lexical's own span conversion reads only bold / italic / underline /\n * strikethrough / sub / sup back from a span's `style` and drops the rest — so a saved **color** or **font\n * size** vanished when the value was loaded again (and the next save stripped it for good). This runs the\n * default conversion, then carries the toolbar's styles onto the imported text nodes (an inner span wins).\n */\nconst HTML_IMPORT: DOMConversionMap = {\n span: (span: HTMLElement) => {\n const base = TextNode.importDOM()?.span?.(span)\n return {\n priority: 1,\n conversion: (element: HTMLElement) => {\n const output = base?.conversion(element) ?? { node: null }\n const picked = IMPORTED_TEXT_STYLES.flatMap((property) => {\n const styleValue = element.style.getPropertyValue(property)\n return styleValue ? [[property, styleValue] as const] : []\n })\n if (picked.length === 0) return output\n const inner = output.forChild\n return {\n ...output,\n forChild: (node, parent) => {\n const converted = inner ? inner(node, parent) : node\n if ($isTextNode(converted)) {\n const merged: Record<string, string> = {\n ...getStyleObjectFromCSS(converted.getStyle()),\n }\n for (const [property, styleValue] of picked) merged[property] = styleValue\n converted.setStyle(\n Object.entries(merged)\n .map(([property, styleValue]) => `${property}: ${styleValue};`)\n .join(' '),\n )\n }\n return converted\n },\n }\n },\n }\n },\n}\n\n/** Inline elements a line of text flows through — anything else (blocks, `<br>`, media) ends a line. */\nconst INLINE_TAGS = new Set([\n 'A',\n 'B',\n 'CODE',\n 'EM',\n 'I',\n 'MARK',\n 'S',\n 'SPAN',\n 'STRONG',\n 'SUB',\n 'SUP',\n 'U',\n])\n\n/**\n * Drops Lexical's `white-space: pre-wrap` from a `style` attribute value, keeping every other declaration\n * (color, font-size, text-align, …) verbatim. Returns `null` when nothing is left.\n */\nfunction stripPreWrap(style: string): string | null {\n const kept = style\n .split(';')\n .map((declaration) => declaration.trim())\n .filter((declaration) => declaration && !/^white-space\\s*:\\s*pre-wrap$/i.test(declaration))\n return kept.length ? `${kept.join('; ')};` : null\n}\n\n/**\n * Keeps the text's spaces visible once `pre-wrap` is gone: a space that normal HTML whitespace would\n * collapse — a second space in a run, one at the start or end of a line — becomes a non-breaking space,\n * alternating (`a \\u00A0 b`) so long runs still wrap. Walks text in document order and treats every\n * non-inline element (block, `<br>`, media) as a line boundary, so spaces split across formatted runs\n * (`<b>a </b>b`) keep their normal, breakable space.\n */\nfunction preserveSpaces(root: DocumentFragment) {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT)\n let lineStart = true // the next space is at the start of a line (would collapse)\n let prevSpace = false // the last character emitted was a collapsible space\n let lastText: Text | null = null // the line's last text node, for its trailing space\n const endLine = () => {\n if (lastText && lastText.data.endsWith(' ')) {\n lastText.data = `${lastText.data.slice(0, -1)}\\u00A0`\n }\n lastText = null\n lineStart = true\n prevSpace = false\n }\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (!INLINE_TAGS.has((node as Element).tagName)) endLine()\n continue\n }\n const text = node as Text\n if (!text.data) continue\n let out = ''\n for (const ch of text.data) {\n if (ch === ' ' && (lineStart || prevSpace)) {\n out += '\\u00A0'\n prevSpace = false\n } else {\n out += ch\n prevSpace = ch === ' '\n }\n lineStart = false\n }\n text.data = out\n lastText = text\n }\n endLine()\n}\n\n/**\n * Cleans the exported HTML into portable markup:\n * - strips the editor's (hashed, CSS-module) `class` attributes (`<h2>` not `<h2 class=\"_h2_ab12\">`);\n * - drops Lexical's `white-space: pre-wrap` from every `style` (an editor rendering detail, not\n * formatting the user chose — so a backend sanitizer that reports removed styles sees only real ones),\n * removing the attribute when nothing else is left and unwrapping the then-bare `<span>`s. Runs of\n * spaces stay visible via non-breaking spaces ({@link preserveSpaces}); a run holding a tab keeps its\n * `pre-wrap`, since a tab can't be expressed otherwise.\n *\n * Re-import keys off tag names and styles, and reads non-breaking spaces back as-is, so this round-trips:\n * loading the value shows the same text and formatting, and re-exporting it yields the same HTML.\n */\nfunction cleanExportedHtml(html: string): string {\n if (typeof document === 'undefined') return html\n const template = document.createElement('template')\n template.innerHTML = html\n const content = template.content\n content.querySelectorAll('[class]').forEach((el) => el.removeAttribute('class'))\n content.querySelectorAll('[style]').forEach((el) => {\n if (el.textContent?.includes('\\t')) return\n const style = stripPreWrap(el.getAttribute('style') ?? '')\n if (style) el.setAttribute('style', style)\n else el.removeAttribute('style')\n })\n content.querySelectorAll('span').forEach((span) => {\n if (span.attributes.length === 0) span.replaceWith(...span.childNodes)\n })\n content.normalize()\n preserveSpaces(content)\n return template.innerHTML\n}\n\n/**\n * True when the editor holds nothing but an empty paragraph (Lexical's \"blank\" state, which serializes\n * to `<p><br></p>`). Lets the value emit `''` instead, so a cleared editor reads as truly empty (and a\n * `required` rule fires). Call inside an `editor.read`/`update`.\n */\nfunction $isEditorEmpty(): boolean {\n const root = $getRoot()\n const first = root.getFirstChild()\n return (\n root.getChildrenSize() <= 1 &&\n (first === null || ($isParagraphNode(first) && first.getChildrenSize() === 0))\n )\n}\n\n/** Replaces the editor's content with the nodes parsed from an HTML string (call inside `editor.update`). */\nfunction $setRootFromHtml(editor: Parameters<typeof $generateNodesFromDOM>[0], html: string) {\n const root = $getRoot()\n root.clear()\n if (html) {\n const dom = new DOMParser().parseFromString(html, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n root.select()\n $insertNodes(nodes)\n }\n if (root.getChildrenSize() === 0) root.append($createParagraphNode())\n // clear the caret the insert left at the end of the content — otherwise Lexical scrolls it into\n // view when setting the initial/controlled value on mount, dragging the whole page down to a\n // below-the-fold editor (e.g. the prefilled RTEs on the Edit form). Focus re-places it later.\n $setSelection(null)\n}\n\n/**\n * Update tag for content the editor is *given* (the initial `defaultValue`, a controlled `value`, a\n * `<Form>` value) rather than typed — its serialization becomes the new baseline instead of an `onChange`.\n */\nconst EXTERNAL_VALUE_TAG = 'tz-external-value'\n\ninterface ValuePluginProps {\n value?: string\n defaultValue?: string\n onChange: (html: string) => void\n onReady?: (html: string) => void\n disabled: boolean\n}\n\n/** Serializes the editor to the emitted HTML (`''` when blank). Call inside `editor.read`/`update`. */\nfunction $readHtml(editor: Parameters<typeof $generateHtmlFromNodes>[0]): string {\n return $isEditorEmpty() ? '' : cleanExportedHtml($generateHtmlFromNodes(editor, null))\n}\n\n/**\n * Bridges the HTML `value` ↔ the Lexical editor state, and toggles read-only mode. `onChange` fires only\n * for the user's edits: content written in from outside is tagged {@link EXTERNAL_VALUE_TAG}, and its\n * (normalized) serialization is recorded as the baseline without emitting.\n */\nfunction ValuePlugin({ value, defaultValue, onChange, onReady, disabled }: ValuePluginProps) {\n const [editor] = useLexicalComposerContext()\n // the HTML the editor last held — as loaded (normalized) or as emitted. Guards the controlled-sync ↔\n // onChange feedback loop and suppresses emits that don't change the serialized value.\n const lastHtml = useRef<string | undefined>(undefined)\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n const onReadyRef = useRef(onReady)\n onReadyRef.current = onReady\n const ready = useRef(false)\n const markReady = (html: string) => {\n if (ready.current) return\n ready.current = true\n onReadyRef.current?.(html)\n }\n\n useEffect(() => editor.setEditable(!disabled), [editor, disabled])\n\n // neutralize unsafe link schemes (javascript:, data:, …) on every LinkNode — covers pasted anchors\n // as well as toolbar inserts (which are also pre-sanitized), so no script URL survives into the value\n useEffect(\n () =>\n editor.registerNodeTransform(LinkNode, (node) => {\n const url = node.getURL()\n const safe = sanitizeLinkUrl(url)\n if (safe !== url) node.setURL(safe)\n }),\n [editor],\n )\n\n // initial defaultValue (uncontrolled) — once. Nothing to load → the blank editor is the baseline.\n useEffect(() => {\n if (value !== undefined) return\n if (!defaultValue) {\n lastHtml.current = ''\n markReady('')\n return\n }\n lastHtml.current = defaultValue\n editor.update(() => $setRootFromHtml(editor, defaultValue), {\n tag: ['history-merge', EXTERNAL_VALUE_TAG],\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // controlled value → editor (only on a genuine external change, not our own echo)\n useEffect(() => {\n if (value === undefined || value === lastHtml.current) return\n lastHtml.current = value\n editor.update(() => $setRootFromHtml(editor, value), {\n tag: ['history-merge', EXTERNAL_VALUE_TAG],\n })\n }, [editor, value])\n\n // editor → HTML out. NB: must be `editor.read` (not `editorState.read`) so the active editor is\n // bound — `$generateHtmlFromNodes` → node `createDOM` needs it, else it throws \"no active editor\".\n useEffect(\n () =>\n editor.registerUpdateListener(({ dirtyElements, dirtyLeaves, tags }) => {\n if (tags.has(EXTERNAL_VALUE_TAG)) {\n // a load, not an edit: record what the editor actually holds (Lexical normalizes the input)\n // as the baseline — so the echo guard compares against it — and never emit\n editor.read(() => {\n const html = $readHtml(editor)\n lastHtml.current = html\n markReady(html)\n })\n return\n }\n if (dirtyElements.size === 0 && dirtyLeaves.size === 0) return\n editor.read(() => {\n const html = $readHtml(editor)\n if (html === lastHtml.current) return\n lastHtml.current = html\n onChangeRef.current(html)\n })\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [editor],\n )\n\n return null\n}\n\nexport interface RichTextEditorProps {\n /** Label rendered above the editor. */\n label?: ReactNode\n /** Preset size — drives toolbar density, content font size and min-height. */\n size?: RichTextEditorSize\n /** Marks the field invalid: red border/ring and `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the editor. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label (visual hint). */\n required?: boolean\n /** Read-only mode — the toolbar disables and the content isn't editable. */\n disabled?: boolean\n /** Placeholder shown while the editor is empty. */\n placeholder?: string\n /** Form field name — auto-binds value/validation to a surrounding `<Form>` (value = the HTML string). */\n name?: string\n /** Controlled HTML value. */\n value?: string\n /** Initial HTML value (uncontrolled). */\n defaultValue?: string\n /**\n * Fires with the serialized **HTML** on every **user edit** (typing, paste, toolbar actions, drag and\n * drop, undo / redo). Loading content never emits: the initial `defaultValue`, a controlled `value`\n * change, or a `<Form>` value (`setValue` / `reset` / `setValues`) updates the editor silently.\n */\n onChange?: (html: string) => void\n /**\n * Called **once**, after the initial content has loaded, with the editor's **normalized** HTML — the\n * exact string `onChange` would emit for that content (Lexical re-serializes what it's given). Compare\n * later `onChange` values against it for a reliable \"unsaved changes\" check. `''` for a blank editor.\n */\n onReady?: (html: string) => void\n /**\n * Async image upload. When provided, an uploaded image is sent through this and the returned URL is\n * inserted; when omitted, the image is embedded inline as a base64 `data:` URL (no backend needed).\n */\n onImageUpload?: (file: File) => Promise<string>\n /** Min height of the editable area in px. Defaults to `220`. */\n minHeight?: number\n /** Accessible label for the editable region. Defaults to the localized `rte.label` (\"Rich text editor\"). */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A rich text editor built on **Lexical** (an optional peer — install `lexical` + `@lexical/*`). Its\n * value is an **HTML string**: bold/italic/underline/strikethrough/inline-code, headings, lists\n * (bullet/ordered/check), links, block quote, plus **images** (insert by URL or upload — embedded as a\n * base64 `data:` URL unless an `onImageUpload` handler is given; each image's **Alt Text** button writes\n * its `<img alt>`) and **video** embeds (paste a YouTube/Vimeo/file URL); media goes into a paragraph of\n * its own at the caret. Markdown shortcuts work while typing (`# `, `- `, `> `, …). The toolbar is\n * built from the library's own `IconButton`/`Button`/`Dropdown`, and the content is styled entirely\n * with `--tz-*` tokens. Controlled (`value` + `onChange`) or uncontrolled (`defaultValue`); inside a\n * `<Form>`, a `name` prop auto-binds the HTML value (validate with e.g. `z.string().min(1)`).\n *\n * Value contract: the HTML is clean, class- and `pre-wrap`-free markup (only styles the user chose —\n * color, font size, alignment — remain; repeated spaces are kept as `&nbsp;`), and `onChange` fires\n * **only for user edits** — loading `defaultValue`, a controlled `value` or a form value never emits.\n * `onReady` reports the normalized initial HTML once, for \"unsaved changes\" comparisons.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n disabled = false,\n placeholder,\n name,\n value,\n defaultValue,\n onChange,\n onReady,\n onImageUpload,\n minHeight = 220,\n 'aria-label': ariaLabelProp,\n className,\n style,\n },\n ref,\n ) {\n const t = useT()\n const ariaLabel = ariaLabelProp ?? t('rte.label')\n const form = useFormContext()\n const bound = form && name ? form.field(name) : undefined\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const formValue = form && name ? (form.values as Record<string, unknown>)[name] : undefined\n const effValue =\n value !== undefined ? value : form && name ? String(formValue ?? '') : undefined\n\n const handleChange = useCallback(\n (html: string) => {\n if (form && name) form.setValue(name, html as never)\n onChange?.(html)\n },\n [form, name, onChange],\n )\n\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => bound?.onBlur(event as never)\n\n // Mirror the form `name` onto the editable DOM node so a `<Form>`'s scroll-to-error can find and\n // focus it — the contenteditable isn't an `<input>`, and Lexical's `ContentEditable` doesn't take\n // a `name` prop, so set the attribute imperatively via a ref.\n const contentRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n const el = contentRef.current\n if (!el) return\n if (name) el.setAttribute('name', name)\n else el.removeAttribute('name')\n }, [name])\n\n const initialConfig = {\n namespace: 'tz-rich-text-editor',\n theme: THEME,\n nodes: EDITOR_NODES,\n html: { import: HTML_IMPORT },\n editable: !disabled,\n onError: (e: Error) => {\n throw e\n },\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n styles.editor,\n styles[size],\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={{ '--tz-rte-min-height': `${minHeight}px`, ...style } as CSSProperties}\n >\n {label != null && (\n <div className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n <div className={styles.control}>\n <LexicalComposer initialConfig={initialConfig}>\n <Toolbar size={size} disabled={disabled} onImageUpload={onImageUpload} />\n <div className={styles.shell}>\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n ref={contentRef}\n className={styles.content}\n aria-label={ariaLabel}\n aria-invalid={resolvedError || undefined}\n onBlur={handleBlur}\n />\n }\n placeholder={\n <div className={styles.placeholder}>{placeholder ?? t('rte.placeholder')}</div>\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </div>\n <HistoryPlugin />\n <ListPlugin />\n <CheckListPlugin />\n <LinkPlugin />\n <MarkdownShortcutPlugin transformers={MARKDOWN_TRANSFORMERS} />\n <ValuePlugin\n value={effValue}\n defaultValue={defaultValue}\n onChange={handleChange}\n onReady={onReady}\n disabled={disabled}\n />\n </LexicalComposer>\n </div>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n },\n)\n"],"names":["SAFE_LINK","HAS_SCHEME","sanitizeLinkUrl","url","trimmed","sanitizeMediaUrl","safe","convertImageElement","domNode","$createImageNode","ImageNode","DecoratorNode","node","src","alt","key","json","element","div","jsx","ImageView","nodeKey","editor","useLexicalComposerContext","editable","useLexicalEditable","t","useT","formId","useId","open","setOpen","useState","draft","setDraft","buttonRef","useRef","useEffect","button","stop","e","save","$getNodeByKey","$isImageNode","styles","jsxs","Icon","Modal","Fragment","Button","TextField","$applyNodeReplacement","isFileVideo","toVideoEmbedSrc","raw","youtube","vimeo","convertVideoElement","_a","$createVideoNode","VideoNode","video","iframe","VideoEmbed","BLOCK_LABEL","BLOCKS","ALIGNS","FONT_SIZES","DEFAULT_FONT_SIZE","ColorGlyph","color","size","Toolbar","disabled","onImageUpload","blockLabel","b","fileInputRef","isBold","setIsBold","isItalic","setIsItalic","isUnderline","setIsUnderline","isLink","setIsLink","linkUrl","setLinkUrl","blockType","setBlockType","elementFormat","setElementFormat","fontSize","setFontSize","textColor","setTextColor","colorOpen","setColorOpen","colorTriggerRef","canUndo","setCanUndo","canRedo","setCanRedo","urlDialog","setUrlDialog","urlValue","setUrlValue","syncState","useCallback","selection","$getSelection","$isRangeSelection","$getSelectionStyleValueForProperty","anchorNode","parent","linkNode","$isLinkNode","$findMatchingParent","$isElementNode","listNode","$getNearestNodeOfType","ListNode","$isHeadingNode","$isQuoteNode","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CAN_UNDO_COMMAND","payload","CAN_REDO_COMMAND","format","type","FORMAT_TEXT_COMMAND","applyAlign","fmt","FORMAT_ELEMENT_COMMAND","applyColor","$patchStyleText","applyFontSize","value","applyBlock","REMOVE_LIST_COMMAND","command","INSERT_UNORDERED_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_CHECK_LIST_COMMAND","$setBlocksType","$createParagraphNode","$createQuoteNode","$createHeadingNode","toggleQuote","openUrlDialog","config","initial","closeUrlDialog","confirmUrlDialog","insertLink","TOGGLE_LINK_COMMAND","insertImageByUrl","$insertMediaParagraph","onImageFile","event","file","fileToDataUrl","toast","insertVideo","fmtBtn","active","label","onClick","child","IconButton","dropdownBlock","effectiveFontSize","UNDO_COMMAND","REDO_COMMAND","Divider","Dropdown","f","ListItem","a","o","FloatingPanel","refocus","ColorPickerPanel","DEFAULT_SWATCHES","media","block","$getRoot","$isParagraphNode","paragraph","$insertNodeToNearestRoot","next","prev","resolve","reject","reader","THEME","EDITOR_NODES","HeadingNode","QuoteNode","ListItemNode","LinkNode","MARKDOWN_TRANSFORMERS","ELEMENT_TRANSFORMERS","TEXT_FORMAT_TRANSFORMERS","TEXT_MATCH_TRANSFORMERS","IMPORTED_TEXT_STYLES","HTML_IMPORT","span","base","_b","TextNode","output","picked","property","styleValue","inner","converted","$isTextNode","merged","getStyleObjectFromCSS","INLINE_TAGS","stripPreWrap","style","kept","declaration","preserveSpaces","root","walker","lineStart","prevSpace","lastText","endLine","text","out","ch","cleanExportedHtml","html","template","content","el","$isEditorEmpty","first","$setRootFromHtml","dom","nodes","$generateNodesFromDOM","$insertNodes","$setSelection","EXTERNAL_VALUE_TAG","$readHtml","$generateHtmlFromNodes","ValuePlugin","defaultValue","onChange","onReady","lastHtml","onChangeRef","onReadyRef","ready","markReady","dirtyElements","dirtyLeaves","tags","RichTextEditor","forwardRef","error","helperText","required","placeholder","name","minHeight","ariaLabelProp","className","ref","ariaLabel","form","useFormContext","bound","resolvedError","resolvedHelperText","formValue","effValue","handleChange","handleBlur","contentRef","initialConfig","clsx","Typography","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","HistoryPlugin","ListPlugin","CheckListPlugin","LinkPlugin","MarkdownShortcutPlugin"],"mappings":"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"}
@@ -4,32 +4,32 @@ import { useRouterState as se, useNavigate as _e, Link as ne } from "@tanstack/r
4
4
  import { clsx as re } from "clsx";
5
5
  import { a as oe } from "./useMediaQuery-DrDUrkmJ.js";
6
6
  import { u as Ce } from "./useLockBodyScroll-DwBILLPK.js";
7
- import { A as le } from "./Avatar-ClcmN0ba.js";
7
+ import { A as le } from "./Avatar-CaYyv5wk.js";
8
8
  import { B as ye } from "./Badge-BmFgusOa.js";
9
- import { C as ie } from "./Chip-DYZ5w7VM.js";
9
+ import { C as ie } from "./Chip-C7IkFuM1.js";
10
10
  import { C as me, R as Se } from "./Col-B51RlwWP.js";
11
11
  import { D as f } from "./Divider-LtH3dLgw.js";
12
- import { D as ce } from "./Dropdown-CnDBlB02.js";
13
- import { b } from "./Icon-D5TxgfCc.js";
14
- import { I as D } from "./IconButton-BoURJOUD.js";
15
- import { L as N } from "./ListItem-2Lr5_NRY.js";
16
- import { F as ke } from "./FullscreenToggle-BuQonKW8.js";
17
- import { T as Te } from "./ThemeToggle-CK2USfgx.js";
12
+ import { D as ce } from "./Dropdown-D-D_Z1Jo.js";
13
+ import { b } from "./Icon-B7DJn8Tw.js";
14
+ import { I as D } from "./IconButton-EaExCXRq.js";
15
+ import { L as N } from "./ListItem-Ezmdk7q-.js";
16
+ import { F as ke } from "./FullscreenToggle-B4ynXdCP.js";
17
+ import { T as Te } from "./ThemeToggle-5uHCUsX7.js";
18
18
  import { T as xe } from "./Tooltip-BbT0uNzy.js";
19
- import { U as ze } from "./UserCard-cmZrMvwL.js";
19
+ import { U as ze } from "./UserCard-Cr75RwZb.js";
20
20
  import { T as i } from "./Typography-ChSuxgkc.js";
21
- import { B as qe } from "./Breadcrumbs-M31xyok8.js";
22
- import { T as De } from "./Toaster-pHN2pxrU.js";
23
- import { a as Ne, N as de, S as Le } from "./Sidebar-CbPr34jd.js";
24
- import { F as we } from "./Flag-BEIqYQZg.js";
21
+ import { B as qe } from "./Breadcrumbs-CloqFpp1.js";
22
+ import { T as De } from "./Toaster-BPBFZiTr.js";
23
+ import { a as Ne, N as de, S as Le } from "./Sidebar-DvQmuBNK.js";
24
+ import { F as we } from "./Flag-C1HwnZXJ.js";
25
25
  import { B as Fe } from "./Blockquote-Ma-2naET.js";
26
- import { B as Ie } from "./Button-CtADzomU.js";
27
- import { M as Ae } from "./Modal-CYcVOzID.js";
28
- import { P as Be } from "./Popconfirm-DIlygJY8.js";
29
- import { a as R } from "./ChoiceCardGroup-q0yN-TeQ.js";
30
- import { S as Ee } from "./Select-CG8UJL9R.js";
31
- import { S as Me } from "./SwatchPicker-BZHRELA-.js";
32
- import { p as he, a as ue, D as P, u as Re, h as Pe, l as We } from "./ConfigProvider-Dqfu7UBU.js";
26
+ import { B as Ie } from "./Button-5LQtDA9d.js";
27
+ import { M as Ae } from "./Modal-1rIBMvKH.js";
28
+ import { P as Be } from "./Popconfirm-o5da44ra.js";
29
+ import { a as R } from "./ChoiceCardGroup-D37XREKV.js";
30
+ import { S as Ee } from "./Select-DuLDLnnb.js";
31
+ import { S as Me } from "./SwatchPicker-DS4WY2eM.js";
32
+ import { p as he, a as ue, D as P, u as Re, h as Pe, l as We } from "./ConfigProvider-CYgmMH4j.js";
33
33
  import { f as $e } from "./errorMessage-C83fB2h5.js";
34
34
  const He = {
35
35
  light: [
@@ -644,4 +644,4 @@ function Xt({
644
644
  export {
645
645
  Xt as R
646
646
  };
647
- //# sourceMappingURL=RootLayout-Cl98ghy1.js.map
647
+ //# sourceMappingURL=RootLayout-CjT5uHlt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RootLayout-Cl98ghy1.js","sources":["../src/components/RootLayout/SettingsDrawer.tsx","../src/components/RootLayout/RootLayout.tsx"],"sourcesContent":["import { useRef, useState } from 'react'\nimport { DEFAULT_FONT_FAMILY, useT, useTheme } from '../../theme'\nimport { Blockquote } from '../Blockquote'\nimport { Button } from '../Button'\nimport { Col } from '../Flex'\nimport { Icon } from '../Icon'\nimport { Divider } from '../Divider'\nimport { Modal } from '../Modal'\nimport { Popconfirm } from '../Popconfirm'\nimport { ChoiceCardGroup } from '../ChoiceCard'\nimport { Select } from '../Select'\nimport { SwatchPicker } from '../SwatchPicker'\nimport { Typography } from '../Typography'\n\n// Accent choices offered alongside the provider's default (which leads each list) — 15 per mode, so\n// each theme shows 16 total. Tuned PER MODE (deeper tones for light, brighter for dark) and paired by\n// hue (red → violet + a neutral) so a color keeps its identity across themes.\nconst ALT_SWATCHES: Record<'light' | 'dark', string[]> = {\n light: [\n '#dc2626', // red\n '#ea580c', // orange\n '#d97706', // amber\n '#ca8a04', // yellow\n '#65a30d', // lime\n '#16a34a', // green\n '#059669', // emerald\n '#0891b2', // cyan\n '#0284c7', // sky\n '#2563eb', // blue\n '#4f46e5', // indigo\n '#7c3aed', // violet\n '#c026d3', // fuchsia\n '#db2777', // pink\n '#475569', // slate\n ],\n dark: [\n '#f87171', // red\n '#fb923c', // orange\n '#fbbf24', // amber\n '#facc15', // yellow\n '#a3e635', // lime\n '#4ade80', // green\n '#34d399', // emerald\n '#22d3ee', // cyan\n '#38bdf8', // sky\n '#60a5fa', // blue\n '#818cf8', // indigo\n '#a78bfa', // violet\n '#e879f9', // fuchsia\n '#f472b6', // pink\n '#94a3b8', // slate\n ],\n}\n\nexport interface SettingsDrawerProps {\n /** Whether the drawer is open. */\n open: boolean\n /** Close handler. */\n onClose: () => void\n /** Show the light/dark **Theme** section (gated by the shell's `header.theme`, the same flag as the header toggle). */\n showTheme?: boolean\n /**\n * Show the **Sidebar** section (Floating / Docked). The shell hides it when its `sidebarVariant` prop pins the\n * look — the user's choice wouldn't apply there. Default `true`.\n */\n showSidebar?: boolean\n}\n\n/**\n * The header user-menu **Settings** drawer (a right-side `Modal`), top to bottom: a **Theme** section — an\n * exclusive `ChoiceCardGroup` (**Light** / **Dark** cards) driving `useTheme().setMode`, shown only when\n * **`showTheme`** (the shell's `header.theme`, so the header toggle + this section appear/disappear\n * together); **Accent Color** — **two `SwatchPicker`s** (Light + Dark) so both accents are chosen\n * independently, each with a per-mode set (deeper tones for light, brighter for dark), calling\n * `setAccentColor(color, mode)` and persisting it — each list leads with the provider's default for that\n * mode (`defaultAccentColors[mode]`), selected when there's no override (picking it clears the override).\n * When `showTheme` is off the panel is locked to one mode, so **only the active mode's accent picker**\n * shows (the other is pointless without a theme switch);\n * a **Font** section (a searchable `Select` — Inter preset + type any Google Font — driving\n * `setFontFamily`); and a **Header** section (an exclusive `ChoiceCardGroup` **Scrollable** / **Fixed**\n * driving `setHeaderSticky`); a **Sidebar** section (an exclusive `ChoiceCardGroup` **Floating** / **Docked**\n * driving `setSidebarVariant`; hidden when `showSidebar` is off); and a **Shape** section (an exclusive `ChoiceCardGroup` **Rounded** /\n * **Square** driving `setShape` — `square` flattens every corner in the panel to `border-radius: 0`). A\n * note on top (a `Blockquote`) says changes apply and save instantly — there's no Save step; a\n * footer **Reset to Defaults** button (`filled` `error`, behind a `Popconfirm`) (`useTheme().resetPreferences`, disabled while nothing differs) puts\n * every one of them back to the app's configured defaults.\n * Internal to the admin shell — not a public export.\n */\nexport function SettingsDrawer({\n open,\n onClose,\n showTheme = true,\n showSidebar = true,\n}: SettingsDrawerProps) {\n const {\n mode,\n setMode,\n accentColors,\n defaultAccentColors,\n setAccentColor,\n headerSticky,\n setHeaderSticky,\n sidebarVariant,\n setSidebarVariant,\n fontFamily,\n setFontFamily,\n shape,\n setShape,\n hasCustomPreferences,\n resetPreferences,\n } = useTheme()\n const t = useT()\n // the drawer content — after a Reset the (now disabled) footer button drops focus to <body>, outside the\n // drawer's focus trap, so focus is moved back onto the first section's selected control\n const contentRef = useRef<HTMLDivElement | null>(null)\n const handleReset = () => {\n resetPreferences()\n requestAnimationFrame(() => {\n const root = contentRef.current\n const target =\n root?.querySelector<HTMLElement>('input:checked, [aria-checked=\"true\"]') ??\n root?.querySelector<HTMLElement>('input, button, [tabindex]:not([tabindex=\"-1\"])')\n target?.focus()\n })\n }\n\n // One searchable Select doubles as a \"type any Google Font\" field. Base = Inter (the only preset) +\n // the active font (so a custom pick stays visible/selectable). While searching, the typed query is\n // offered as its own option — picking it applies + loads that family. Base is always kept in the\n // list (never filtered out) so `value` always resolves in the trigger, even mid-search.\n const [fontQuery, setFontQuery] = useState('')\n const q = fontQuery.trim()\n const base =\n fontFamily !== DEFAULT_FONT_FAMILY ? [DEFAULT_FONT_FAMILY, fontFamily] : [DEFAULT_FONT_FAMILY]\n const showTyped = q.length > 0 && !base.some((f) => f.toLowerCase() === q.toLowerCase())\n const fontOptions = (showTyped ? [q, ...base] : base).map((f) => ({\n value: f,\n label: f === DEFAULT_FONT_FAMILY ? t('settings.fontDefault', { font: f }) : f,\n }))\n\n const picker = (mode: 'light' | 'dark', label: string) => {\n const def = defaultAccentColors[mode]\n // the provider's default (per mode) leads the list; then the mode's alts (minus any collision)\n const colors = [def, ...ALT_SWATCHES[mode].filter((c) => c.toLowerCase() !== def.toLowerCase())]\n return (\n <SwatchPicker\n label={label}\n colors={colors}\n // with no override, this mode's default swatch reads as selected\n value={accentColors[mode] ?? def}\n // the default swatch clears this mode's override; the rest set it\n onChange={(color) =>\n setAccentColor(color.toLowerCase() === def.toLowerCase() ? null : color, mode)\n }\n labels={{ [def]: t('settings.accentDefault', { color: def }) }}\n aria-label={String(label)}\n />\n )\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n placement=\"right\"\n size=\"sm\"\n title={t('settings.label')}\n icon=\"Setting5\"\n footer={\n // one action: put every appearance choice back to the app's defaults (disabled while unchanged),\n // behind a quick confirm — it undoes several choices at once\n <Popconfirm\n title={t('settings.resetConfirmTitle')}\n description={t('settings.resetConfirmDesc')}\n confirmLabel={t('settings.resetConfirm')}\n icon=\"RotateLeft\"\n disabled={!hasCustomPreferences}\n onConfirm={handleReset}\n >\n <Button\n variant=\"filled\"\n size=\"sm\"\n color=\"error\"\n fullWidth\n startIcon={<Icon name=\"RotateLeft\" />}\n disabled={!hasCustomPreferences}\n >\n {t('settings.reset')}\n </Button>\n </Popconfirm>\n }\n >\n <div ref={contentRef}>\n {/* no Save step: every choice below applies instantly and is persisted on change */}\n <Blockquote size=\"sm\" style={{ marginBottom: 'var(--tz-space-md)' }}>\n {t('settings.autoSaveNote')}\n </Blockquote>\n {showTheme && (\n <>\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.themeTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.themeDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={mode}\n onChange={(v) => {\n if (typeof v === 'string') setMode(v as 'light' | 'dark')\n }}\n options={[\n {\n value: 'light',\n label: t('settings.light'),\n description: t('settings.lightDesc'),\n icon: 'Sun',\n },\n {\n value: 'dark',\n label: t('settings.dark'),\n description: t('settings.darkDesc'),\n icon: 'Moon',\n },\n ]}\n aria-label={t('settings.themeTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n </>\n )}\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.accentTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.accentDesc')}\n </Typography>\n <Col gap=\"md\" style={{ marginTop: 'var(--tz-space-sm)' }}>\n {showTheme ? (\n <>\n {picker('light', t('settings.lightTheme'))}\n {picker('dark', t('settings.darkTheme'))}\n </>\n ) : (\n // theme switching is off → the panel stays in one mode, so only that mode's accent matters\n picker(mode, mode === 'light' ? t('settings.lightTheme') : t('settings.darkTheme'))\n )}\n </Col>\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.fontTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.fontDesc')}\n </Typography>\n <Select\n label={t('settings.fontFamily')}\n searchable\n searchPlaceholder={t('settings.fontSearch')}\n value={fontFamily}\n options={fontOptions}\n onSearchChange={setFontQuery}\n onChange={(v) => {\n setFontFamily(v)\n setFontQuery('')\n }}\n aria-label={t('settings.fontFamily')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.headerTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.headerDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={headerSticky ? 'fixed' : 'static'}\n // exclusive (radio) → always a string; set sticky from the picked card\n onChange={(v) => {\n if (typeof v === 'string') setHeaderSticky(v === 'fixed')\n }}\n options={[\n {\n value: 'static',\n label: t('settings.scrollable'),\n description: t('settings.scrollableDesc'),\n },\n { value: 'fixed', label: t('settings.fixed'), description: t('settings.fixedDesc') },\n ]}\n aria-label={t('settings.headerTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n {showSidebar && (\n <>\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.sidebarTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.sidebarDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={sidebarVariant}\n // exclusive (radio) → always a string; the two values are exactly the SidebarVariant union\n onChange={(v) => {\n if (v === 'floating' || v === 'docked') setSidebarVariant(v)\n }}\n options={[\n {\n value: 'floating',\n label: t('settings.floating'),\n description: t('settings.floatingDesc'),\n },\n {\n value: 'docked',\n label: t('settings.docked'),\n description: t('settings.dockedDesc'),\n },\n ]}\n aria-label={t('settings.sidebarTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n </>\n )}\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.shapeTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.shapeDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={shape}\n // exclusive (radio) → always a string; the two values are exactly the ThemeShape union\n onChange={(v) => {\n if (v === 'rounded' || v === 'square') setShape(v)\n }}\n options={[\n {\n value: 'rounded',\n label: t('settings.rounded'),\n description: t('settings.roundedDesc'),\n },\n { value: 'square', label: t('settings.square'), description: t('settings.squareDesc') },\n ]}\n aria-label={t('settings.shapeTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n </div>\n </Modal>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Link, useNavigate, useRouterState, type LinkProps } from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { useMediaQuery } from '../../hooks/useMediaQuery'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport {\n useHeaderConfig,\n useLanguage,\n useSidebarConfig,\n useT,\n useTheme,\n type HeaderAction,\n type HeaderConfig,\n type HeaderEnvironment,\n type HeaderMenuItem,\n type HeaderUser,\n type SidebarVariant,\n} from '../../theme'\nimport { Avatar } from '../Avatar'\nimport { Badge } from '../Badge'\nimport { Chip } from '../Chip'\nimport { Col, Row } from '../Flex'\nimport { Divider } from '../Divider'\nimport { Dropdown } from '../Dropdown'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ListItem, type ListItemProps } from '../List'\nimport { FullscreenToggle } from '../FullscreenToggle'\nimport { ThemeToggle } from '../ThemeToggle'\nimport { Tooltip } from '../Tooltip'\nimport { UserCard } from '../UserCard'\nimport { Typography } from '../Typography'\nimport { Breadcrumbs } from '../Breadcrumbs'\nimport { Toaster, type ToasterProps } from '../Toast'\nimport { NavSearch, Sidebar, useFirstNavTo } from '../Sidebar/Sidebar'\nimport { Flag } from '../Flag'\nimport { SettingsDrawer } from './SettingsDrawer'\nimport { isDev } from '../ErrorState/errorMessage'\nimport styles from './RootLayout.module.css'\n\n/**\n * `header.environment` → the chip to show, or `null` for none (empty, or production). A string gets its first\n * letter capitalized, the `warning` tint and the `Code` icon; an object is used as given. Exported for tests.\n */\nexport function resolveEnvironment(\n environment: HeaderConfig['environment'],\n): Required<HeaderEnvironment> | null {\n if (environment == null) return null\n const env = typeof environment === 'string' ? { label: environment } : environment\n const label = env.label.trim()\n if (!label || /^prod(uction)?$/i.test(label)) return null\n return {\n label: typeof environment === 'string' ? label.charAt(0).toUpperCase() + label.slice(1) : label,\n color: env.color ?? 'warning',\n icon: env.icon ?? 'Code',\n }\n}\n\n// `ListItem as={Link}` — `to` / `params` / `search` are router props ListItem doesn't type itself\nconst MenuLink = ListItem as unknown as (\n props: ListItemProps & Pick<HeaderMenuItem, 'to' | 'params' | 'search'>,\n) => ReactNode\n\n/**\n * The shell header config + its user shape now live in the theme layer (so `config.header` can carry\n * them app-wide). These aliases keep the historical `RootLayout*` names importable.\n */\nexport type RootLayoutUser = HeaderUser\nexport type RootLayoutHeader = HeaderConfig\n\n/** How the sidebar sits in the shell (the theme layer's `SidebarVariant`, under the historical `RootLayout*` name). */\nexport type RootLayoutSidebarVariant = SidebarVariant\n\nexport interface RootLayoutProps {\n /** Brand logo at the top of the sidebar card — pass an `<img>`, an `<Icon>`, or any node. */\n logo?: ReactNode\n /**\n * Where clicking the logo goes. Defaults to the **first page in the menu** the user may open (the same\n * \"home\" as the breadcrumbs' first crumb and `FirstRouteRedirect`) — so the logo always leads back to the\n * page the panel opens on. Pass a path to send it elsewhere, or `false` for a plain, non-clickable logo.\n */\n logoTo?: LinkProps['to'] | false\n /** Optional content pinned to the **bottom of the sidebar** (e.g. a promo / \"Need help?\" card). */\n sidebarFooter?: ReactNode\n /**\n * Show a **`UserCard`** at the bottom of the sidebar (below `sidebarFooter`), built from `header.user` and\n * `header.onLogout` (its **Sign Out** button). Unset, the app-wide `config.sidebar.userCard` applies — default\n * **`false`** (hidden).\n */\n showUserCard?: boolean\n /**\n * The sidebar's look. `'floating'` (default): a rounded, bordered card inset from the window edges.\n * `'docked'`: flush against the top, left and bottom edges, no radius, a single border on its right —\n * the content keeps its inset — desktop (≥1280px) only: below 1280px, where the sidebar is an overlay drawer,\n * `'docked'` looks exactly like `'floating'`. **Unset (recommended)**, the user picks it in the header Settings drawer\n * (persisted), defaulting to the app-wide `config.sidebar.variant`; **set**, it pins this shell's look and the\n * Settings drawer's Sidebar section is hidden.\n */\n sidebarVariant?: RootLayoutSidebarVariant\n /**\n * Header config for **this** shell — merged **over** the app-wide `config.header` (the prop wins).\n * Fields: the built-in `theme` / `search` / `settings` / `languages` toggles (default `true`),\n * `fullscreen` (default `false`), `breadcrumbs` (default `true`), and the account (`onLogout` / `user`).\n */\n header?: RootLayoutHeader\n /**\n * The built-in toast viewport, mounted for you so `toast.*()` works app-wide with no extra setup.\n * Defaults to `true` (a `<Toaster>` following the app-wide `config.toast`, else its built-in defaults). Pass\n * `ToasterProps` (`{ position, duration }`) to override it for this shell — anything unset still falls back to\n * `config.toast` — or `false` to opt out, e.g. when you mount your own `<Toaster>`.\n */\n toaster?: boolean | ToasterProps\n /** Routed content — the consumer passes `<Outlet />`. */\n children: ReactNode\n}\n\n/**\n * The admin-panel shell — a **floating** layout: the whole app sits on a soft `--tz-color-background`\n * canvas, with a rounded, bordered `--tz-color-surface` **sidebar card** (`logo` + auto-generated `Sidebar` + an optional\n * `sidebarFooter`, then an optional `UserCard` from `header.user` + `header.onLogout` — `showUserCard` ??\n * `config.sidebar.userCard`, default hidden) beside the header + content — or, with the `'docked'` look (the user's Settings choice,\n * seeded from `config.sidebar.variant`, or pinned by the `sidebarVariant` prop), a sidebar flush to the\n * window edges. Set it as the root route's component and pass\n * `<Outlet />` as `children`; the `Sidebar` builds itself from the routes' `staticData`. The header\n * holds an optional `ThemeToggle` (on by default), a **Settings** button (opens a right-side drawer to\n * pick + persist the appearance — theme, accent colors, font, header, sidebar, shape), plus an account\n * `Avatar` whose menu has a **Sign out** item when `header.onLogout` is given. The content area stacks **`Breadcrumbs` → `children`**; each page wraps its\n * body in `PageLayout`, which owns the page heading (`pageTitle`), the back button (`back`) and the\n * title-row actions (`pageActions`). On a 404 the breadcrumbs are suppressed automatically (a partial route\n * match would otherwise show a stale section), regardless of `header.breadcrumbs`. A `<Toaster>` is **mounted by default** so\n * `toast.*()` works app-wide with no extra setup (configure via `toaster`, or `toaster={false}` to opt\n * out). Styling is token-based, so it follows the active `ConfigProvider` mode. Requires\n * `@tanstack/react-router` (peer).\n */\nexport function RootLayout({\n logo,\n logoTo,\n sidebarFooter,\n showUserCard,\n sidebarVariant,\n header,\n toaster = true,\n children,\n}: RootLayoutProps) {\n // the user's persisted header + sidebar choices (seeded from config.header.sticky / config.sidebar.variant)\n const { headerSticky, sidebarVariant: chosenSidebarVariant } = useTheme()\n const { language, setLanguage, languages } = useLanguage()\n const t = useT()\n // the logo links \"home\" — the first menu page the user may open, unless the app points it elsewhere\n const firstNavTo = useFirstNavTo()\n const logoHref = logoTo === false ? undefined : (logoTo ?? firstNavTo)\n // app-wide header config (config.header) as the base; this shell's `header` prop wins over it\n const configHeader = useHeaderConfig()\n // sidebar look: this shell's prop pins it; otherwise the user's choice (Settings), seeded from config\n const variant = sidebarVariant ?? chosenSidebarVariant\n const h: HeaderConfig = { ...configHeader, ...header }\n const showTheme = h.theme ?? true\n const showFullscreen = h.fullscreen ?? false\n const showSettings = h.settings ?? true\n const showSearch = h.search ?? true\n const showLanguages = h.languages ?? true\n const showBreadcrumbs = h.breadcrumbs ?? true\n const toasterProps = typeof toaster === 'object' ? toaster : undefined\n const onLogout = h.onLogout\n const user = h.user\n // the sidebar's user card: this shell's prop → app-wide config.sidebar.userCard → hidden. It needs someone\n // to show (a user) or something to do (Sign Out), else it would be an empty \"Welcome\" box.\n const configSidebar = useSidebarConfig()\n const userCard =\n (showUserCard ?? configSidebar.userCard ?? false) && (user != null || onLogout != null) ? (\n <UserCard name={user?.name} email={user?.email} avatar={user?.avatar} onLogout={onLogout} />\n ) : null\n const environment = resolveEnvironment(h.environment)\n const accountMenu = h.menu ?? [] // custom account-menu items (between the user block and Sign out)\n // app header actions: inline IconButtons — on xs they fold into the account menu (when there is one)\n const headerActions = h.actions ?? []\n const isXs = useMediaQuery('xs')\n const actionsInMenu = isXs && onLogout != null\n const runAction = (a: HeaderAction) => {\n a.onClick?.()\n if (a.to) navigate({ to: a.to as LinkProps['to'], params: a.params, search: a.search } as never)\n }\n // an account-menu item with nothing to do is almost always a config slip — say so in development\n const inertMenuItems = accountMenu\n .filter((item) => !item.to && !item.onClick)\n .map((item) => item.label)\n .join(', ')\n useEffect(() => {\n if (inertMenuItems && isDev())\n console.warn(\n `[RootLayout] header.menu items without \\`to\\` or \\`onClick\\`: ${inertMenuItems}`,\n )\n }, [inertMenuItems])\n // below 1280px the sidebar auto-collapses (and auto-expands again above it); a manual toggle holds\n // until the next breakpoint cross. `useMediaQuery` is correct on the first client render, so no flash.\n const isNarrow = useMediaQuery('md') // ≤ 1279.98px — the shared `md` breakpoint\n const [collapsed, setCollapsed] = useState(isNarrow)\n useEffect(() => {\n setCollapsed(isNarrow)\n }, [isNarrow])\n // while the sidebar overlays the content (narrow + open), lock page scroll so scrolling inside the\n // drawer doesn't scroll the content behind it\n useLockBodyScroll(isNarrow && !collapsed)\n // navigating from the overlay drawer (a nav link or a search suggestion — both change the route) auto-\n // closes it, so you land on the page instead of the still-open sidebar; desktop navigation is untouched\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n useEffect(() => {\n if (isNarrow) setCollapsed(true)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname])\n // on a 404 the URL often partially matches a named layout route (e.g. `/core/xxx` still resolves\n // \"Core\" as the active section), so the breadcrumbs would show a stale, wrong trail.\n // suppress them when the router is in a notFound state — automatic, no opt-out needed. `statusCode ===\n // 404` is the primary signal; a `notFound` match status is the fallback.\n const isNotFound = useRouterState({\n select: (s) => s.statusCode === 404 || s.matches.some((m) => m.status === 'notFound'),\n })\n const [settingsOpen, setSettingsOpen] = useState(false)\n const navigate = useNavigate()\n\n return (\n <div\n className={clsx(\n styles.shell,\n variant === 'docked' && styles.shellDocked,\n collapsed && styles.shellCollapsed,\n )}\n >\n <aside className={styles.sidebar}>\n {/* fixed-width inner: the outer <aside> animates its width to 0 (and clips via overflow),\n while this keeps the sidebar's real width so the content never reflows mid-collapse */}\n <div className={styles.sidebarInner}>\n {logo ? (\n <div className={styles.brand}>\n {logoHref ? (\n <Link to={logoHref} className={styles.brandLink} aria-label={t('sidebar.home')}>\n {logo}\n </Link>\n ) : (\n logo\n )}\n {/* in-drawer close — only shown when the sidebar overlays (narrow), where the header\n toggle is behind the backdrop; closes the drawer */}\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n className={styles.sidebarClose}\n aria-label={t('common.close')}\n onClick={() => setCollapsed(true)}\n >\n <Icon name=\"Close\" />\n </IconButton>\n </div>\n ) : null}\n {/* the search lives in the header on desktop; below 576px (full-width drawer) it moves here,\n between the logo and the menu (CSS toggles which instance shows) */}\n {showSearch ? (\n <div className={styles.sidebarSearch}>\n <NavSearch />\n </div>\n ) : null}\n <div className={styles.navScroll}>\n <Sidebar />\n </div>\n {sidebarFooter || userCard ? (\n <div className={styles.sidebarFooter}>\n {/* the app's content keeps its own (block) flow; only it and the card are spaced */}\n {sidebarFooter ? <div>{sidebarFooter}</div> : null}\n {userCard}\n </div>\n ) : null}\n </div>\n </aside>\n {/* dim backdrop behind the overlay sidebar — a sibling of the sidebar (same stacking context, so the\n sidebar reliably sits above it, unlike a body-portaled Overlay). Only shown/interactive below\n 1280px while open (CSS); clicking it closes the drawer. On desktop the sidebar is a grid column. */}\n <div className={styles.backdrop} onClick={() => setCollapsed(true)} aria-hidden=\"true\" />\n <div className={styles.main}>\n <header className={clsx(styles.topbar, headerSticky && styles.topbarSticky)}>\n <div className={styles.headerStart}>\n <IconButton\n aria-label={t(collapsed ? 'sidebar.show' : 'sidebar.hide')}\n aria-expanded={!collapsed}\n variant=\"filled\"\n size=\"sm\"\n onClick={() => setCollapsed((c) => !c)}\n >\n <Icon name=\"Menu\" />\n </IconButton>\n {showSearch ? (\n <div className={styles.headerSearch}>\n <NavSearch />\n </div>\n ) : null}\n </div>\n <div className={styles.headerEnd}>\n {/* the environment badge — on every screen size, unlike `extra` */}\n {environment ? (\n <Chip\n size=\"sm\"\n color={environment.color}\n startIcon={environment.icon ? <Icon name={environment.icon} /> : undefined}\n className={styles.environment}\n >\n {environment.label}\n </Chip>\n ) : null}\n {h.extra != null && !isXs ? <div className={styles.headerExtra}>{h.extra}</div> : null}\n {!actionsInMenu\n ? headerActions.map((a, i) => (\n <Badge\n key={`${a.label}-${i}`}\n content={a.dot ? undefined : a.badge}\n dot={a.dot}\n color={a.badgeColor ?? 'error'}\n >\n <Tooltip content={a.label} placement=\"bottom\">\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n color={a.color}\n aria-label={a.label}\n disabled={a.disabled}\n onClick={() => runAction(a)}\n >\n <Icon name={a.icon} />\n </IconButton>\n </Tooltip>\n </Badge>\n ))\n : null}\n {showFullscreen ? <FullscreenToggle variant=\"filled\" size=\"sm\" /> : null}\n {showTheme ? <ThemeToggle variant=\"filled\" size=\"sm\" /> : null}\n {showLanguages && languages.length > 1 ? (\n <Dropdown\n placement=\"bottom-end\"\n trigger={\n <IconButton variant=\"filled\" size=\"sm\" aria-label={t('language.label')}>\n <Icon name=\"Global\" />\n </IconButton>\n }\n >\n {languages.map((l) => (\n <ListItem\n key={l.code}\n clickable\n selected={l.code === language}\n onClick={() => setLanguage(l.code)}\n icon={<Flag code={l.code} />}\n >\n {l.label ?? l.code}\n </ListItem>\n ))}\n </Dropdown>\n ) : null}\n {showSettings ? (\n <IconButton\n aria-label={t('settings.label')}\n variant=\"text\"\n size=\"sm\"\n className={styles.settings}\n onClick={() => setSettingsOpen(true)}\n >\n <Icon name=\"Setting5\" />\n </IconButton>\n ) : null}\n {onLogout ? (\n <Dropdown\n placement=\"bottom-end\"\n style={{ minWidth: 230 }}\n trigger={\n <button type=\"button\" className={styles.account} aria-label={t('account.label')}>\n <Avatar size=\"md\" name={user?.name} src={user?.avatar} color=\"primary\" />\n </button>\n }\n >\n {user ? (\n <>\n <Row gap={8} align=\"center\" padding=\"var(--tz-space-xxs) var(--tz-space-xs)\">\n <Avatar size=\"md\" name={user.name} src={user.avatar} color=\"primary\" />\n <Col gap={2}>\n {/* name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"body\">{user.name ?? t('userCard.welcome')}</Typography>\n {user.email ? (\n <Typography variant=\"bodySmall\" color=\"muted\">\n {user.email}\n </Typography>\n ) : null}\n </Col>\n </Row>\n <Divider />\n </>\n ) : null}\n {/* on xs the header actions fold in here, above the app's own menu items */}\n {actionsInMenu\n ? headerActions.map((a, i) => (\n <ListItem\n key={`action-${a.label}-${i}`}\n icon={<Icon name={a.icon} color={a.color} />}\n clickable\n disabled={a.disabled}\n onClick={() => runAction(a)}\n trailing={\n a.dot ? (\n <span\n className={styles.menuDot}\n style={{ background: `var(--tz-color-${a.badgeColor ?? 'error'})` }}\n aria-hidden=\"true\"\n />\n ) : a.badge != null && a.badge !== 0 && a.badge !== '' ? (\n <Chip size=\"sm\" color={a.badgeColor ?? 'error'}>\n {typeof a.badge === 'number' && a.badge > 99 ? '99+' : a.badge}\n </Chip>\n ) : undefined\n }\n >\n {a.label}\n </ListItem>\n ))\n : null}\n {actionsInMenu && headerActions.length > 0 ? <Divider /> : null}\n {/* app-supplied items (e.g. \"Account\"), between the user block and Sign out */}\n {accountMenu.map((item, i) => {\n const itemProps = {\n icon: item.icon ? <Icon name={item.icon} color={item.color} /> : undefined,\n color: item.color,\n clickable: true,\n disabled: item.disabled,\n onClick: item.onClick,\n children: item.label,\n }\n // `to` → a real router link (href, new-tab clicks); the Dropdown still closes on select\n // and roves to it (`a[href]`). Link runs `onClick` first, then navigates.\n return item.to && !item.disabled ? (\n <MenuLink\n key={i}\n {...itemProps}\n as={Link}\n to={item.to}\n params={item.params}\n search={item.search}\n />\n ) : (\n <ListItem key={i} {...itemProps} />\n )\n })}\n {/* keep the destructive Sign out visually separated from the custom items */}\n {accountMenu.length > 0 ? <Divider /> : null}\n <ListItem icon={<Icon name=\"Logout2\" color=\"error\" />} clickable onClick={onLogout}>\n {t('userCard.signOut')}\n </ListItem>\n </Dropdown>\n ) : null}\n </div>\n </header>\n <main className={styles.content}>\n {showBreadcrumbs && !isNotFound ? <Breadcrumbs /> : null}\n {children}\n </main>\n </div>\n {toaster !== false && <Toaster {...toasterProps} />}\n {showSettings ? (\n <SettingsDrawer\n open={settingsOpen}\n onClose={() => setSettingsOpen(false)}\n showTheme={showTheme}\n showSidebar={sidebarVariant === undefined}\n />\n ) : null}\n </div>\n )\n}\n"],"names":["ALT_SWATCHES","SettingsDrawer","open","onClose","showTheme","showSidebar","mode","setMode","accentColors","defaultAccentColors","setAccentColor","headerSticky","setHeaderSticky","sidebarVariant","setSidebarVariant","fontFamily","setFontFamily","shape","setShape","hasCustomPreferences","resetPreferences","useTheme","t","useT","contentRef","useRef","handleReset","root","target","fontQuery","setFontQuery","useState","q","base","DEFAULT_FONT_FAMILY","fontOptions","f","picker","label","def","colors","c","jsx","SwatchPicker","color","Modal","Popconfirm","Button","Icon","jsxs","Blockquote","Fragment","Typography","ChoiceCardGroup","v","Divider","Col","Select","resolveEnvironment","environment","env","MenuLink","ListItem","RootLayout","logo","logoTo","sidebarFooter","showUserCard","header","toaster","children","chosenSidebarVariant","language","setLanguage","languages","useLanguage","firstNavTo","useFirstNavTo","logoHref","configHeader","useHeaderConfig","variant","h","showFullscreen","showSettings","showSearch","showLanguages","showBreadcrumbs","toasterProps","onLogout","user","configSidebar","useSidebarConfig","userCard","UserCard","accountMenu","headerActions","isXs","useMediaQuery","actionsInMenu","runAction","a","_a","navigate","inertMenuItems","item","useEffect","isDev","isNarrow","collapsed","setCollapsed","useLockBodyScroll","pathname","useRouterState","s","isNotFound","m","settingsOpen","setSettingsOpen","useNavigate","clsx","styles","Link","IconButton","NavSearch","Sidebar","Chip","i","Badge","Tooltip","FullscreenToggle","ThemeToggle","Dropdown","l","Flag","Avatar","Row","itemProps","Breadcrumbs","Toaster"],"mappings":"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"}
1
+ {"version":3,"file":"RootLayout-CjT5uHlt.js","sources":["../src/components/RootLayout/SettingsDrawer.tsx","../src/components/RootLayout/RootLayout.tsx"],"sourcesContent":["import { useRef, useState } from 'react'\nimport { DEFAULT_FONT_FAMILY, useT, useTheme } from '../../theme'\nimport { Blockquote } from '../Blockquote'\nimport { Button } from '../Button'\nimport { Col } from '../Flex'\nimport { Icon } from '../Icon'\nimport { Divider } from '../Divider'\nimport { Modal } from '../Modal'\nimport { Popconfirm } from '../Popconfirm'\nimport { ChoiceCardGroup } from '../ChoiceCard'\nimport { Select } from '../Select'\nimport { SwatchPicker } from '../SwatchPicker'\nimport { Typography } from '../Typography'\n\n// Accent choices offered alongside the provider's default (which leads each list) — 15 per mode, so\n// each theme shows 16 total. Tuned PER MODE (deeper tones for light, brighter for dark) and paired by\n// hue (red → violet + a neutral) so a color keeps its identity across themes.\nconst ALT_SWATCHES: Record<'light' | 'dark', string[]> = {\n light: [\n '#dc2626', // red\n '#ea580c', // orange\n '#d97706', // amber\n '#ca8a04', // yellow\n '#65a30d', // lime\n '#16a34a', // green\n '#059669', // emerald\n '#0891b2', // cyan\n '#0284c7', // sky\n '#2563eb', // blue\n '#4f46e5', // indigo\n '#7c3aed', // violet\n '#c026d3', // fuchsia\n '#db2777', // pink\n '#475569', // slate\n ],\n dark: [\n '#f87171', // red\n '#fb923c', // orange\n '#fbbf24', // amber\n '#facc15', // yellow\n '#a3e635', // lime\n '#4ade80', // green\n '#34d399', // emerald\n '#22d3ee', // cyan\n '#38bdf8', // sky\n '#60a5fa', // blue\n '#818cf8', // indigo\n '#a78bfa', // violet\n '#e879f9', // fuchsia\n '#f472b6', // pink\n '#94a3b8', // slate\n ],\n}\n\nexport interface SettingsDrawerProps {\n /** Whether the drawer is open. */\n open: boolean\n /** Close handler. */\n onClose: () => void\n /** Show the light/dark **Theme** section (gated by the shell's `header.theme`, the same flag as the header toggle). */\n showTheme?: boolean\n /**\n * Show the **Sidebar** section (Floating / Docked). The shell hides it when its `sidebarVariant` prop pins the\n * look — the user's choice wouldn't apply there. Default `true`.\n */\n showSidebar?: boolean\n}\n\n/**\n * The header user-menu **Settings** drawer (a right-side `Modal`), top to bottom: a **Theme** section — an\n * exclusive `ChoiceCardGroup` (**Light** / **Dark** cards) driving `useTheme().setMode`, shown only when\n * **`showTheme`** (the shell's `header.theme`, so the header toggle + this section appear/disappear\n * together); **Accent Color** — **two `SwatchPicker`s** (Light + Dark) so both accents are chosen\n * independently, each with a per-mode set (deeper tones for light, brighter for dark), calling\n * `setAccentColor(color, mode)` and persisting it — each list leads with the provider's default for that\n * mode (`defaultAccentColors[mode]`), selected when there's no override (picking it clears the override).\n * When `showTheme` is off the panel is locked to one mode, so **only the active mode's accent picker**\n * shows (the other is pointless without a theme switch);\n * a **Font** section (a searchable `Select` — Inter preset + type any Google Font — driving\n * `setFontFamily`); and a **Header** section (an exclusive `ChoiceCardGroup` **Scrollable** / **Fixed**\n * driving `setHeaderSticky`); a **Sidebar** section (an exclusive `ChoiceCardGroup` **Floating** / **Docked**\n * driving `setSidebarVariant`; hidden when `showSidebar` is off); and a **Shape** section (an exclusive `ChoiceCardGroup` **Rounded** /\n * **Square** driving `setShape` — `square` flattens every corner in the panel to `border-radius: 0`). A\n * note on top (a `Blockquote`) says changes apply and save instantly — there's no Save step; a\n * footer **Reset to Defaults** button (`filled` `error`, behind a `Popconfirm`) (`useTheme().resetPreferences`, disabled while nothing differs) puts\n * every one of them back to the app's configured defaults.\n * Internal to the admin shell — not a public export.\n */\nexport function SettingsDrawer({\n open,\n onClose,\n showTheme = true,\n showSidebar = true,\n}: SettingsDrawerProps) {\n const {\n mode,\n setMode,\n accentColors,\n defaultAccentColors,\n setAccentColor,\n headerSticky,\n setHeaderSticky,\n sidebarVariant,\n setSidebarVariant,\n fontFamily,\n setFontFamily,\n shape,\n setShape,\n hasCustomPreferences,\n resetPreferences,\n } = useTheme()\n const t = useT()\n // the drawer content — after a Reset the (now disabled) footer button drops focus to <body>, outside the\n // drawer's focus trap, so focus is moved back onto the first section's selected control\n const contentRef = useRef<HTMLDivElement | null>(null)\n const handleReset = () => {\n resetPreferences()\n requestAnimationFrame(() => {\n const root = contentRef.current\n const target =\n root?.querySelector<HTMLElement>('input:checked, [aria-checked=\"true\"]') ??\n root?.querySelector<HTMLElement>('input, button, [tabindex]:not([tabindex=\"-1\"])')\n target?.focus()\n })\n }\n\n // One searchable Select doubles as a \"type any Google Font\" field. Base = Inter (the only preset) +\n // the active font (so a custom pick stays visible/selectable). While searching, the typed query is\n // offered as its own option — picking it applies + loads that family. Base is always kept in the\n // list (never filtered out) so `value` always resolves in the trigger, even mid-search.\n const [fontQuery, setFontQuery] = useState('')\n const q = fontQuery.trim()\n const base =\n fontFamily !== DEFAULT_FONT_FAMILY ? [DEFAULT_FONT_FAMILY, fontFamily] : [DEFAULT_FONT_FAMILY]\n const showTyped = q.length > 0 && !base.some((f) => f.toLowerCase() === q.toLowerCase())\n const fontOptions = (showTyped ? [q, ...base] : base).map((f) => ({\n value: f,\n label: f === DEFAULT_FONT_FAMILY ? t('settings.fontDefault', { font: f }) : f,\n }))\n\n const picker = (mode: 'light' | 'dark', label: string) => {\n const def = defaultAccentColors[mode]\n // the provider's default (per mode) leads the list; then the mode's alts (minus any collision)\n const colors = [def, ...ALT_SWATCHES[mode].filter((c) => c.toLowerCase() !== def.toLowerCase())]\n return (\n <SwatchPicker\n label={label}\n colors={colors}\n // with no override, this mode's default swatch reads as selected\n value={accentColors[mode] ?? def}\n // the default swatch clears this mode's override; the rest set it\n onChange={(color) =>\n setAccentColor(color.toLowerCase() === def.toLowerCase() ? null : color, mode)\n }\n labels={{ [def]: t('settings.accentDefault', { color: def }) }}\n aria-label={String(label)}\n />\n )\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n placement=\"right\"\n size=\"sm\"\n title={t('settings.label')}\n icon=\"Setting5\"\n footer={\n // one action: put every appearance choice back to the app's defaults (disabled while unchanged),\n // behind a quick confirm — it undoes several choices at once\n <Popconfirm\n title={t('settings.resetConfirmTitle')}\n description={t('settings.resetConfirmDesc')}\n confirmLabel={t('settings.resetConfirm')}\n icon=\"RotateLeft\"\n disabled={!hasCustomPreferences}\n onConfirm={handleReset}\n >\n <Button\n variant=\"filled\"\n size=\"sm\"\n color=\"error\"\n fullWidth\n startIcon={<Icon name=\"RotateLeft\" />}\n disabled={!hasCustomPreferences}\n >\n {t('settings.reset')}\n </Button>\n </Popconfirm>\n }\n >\n <div ref={contentRef}>\n {/* no Save step: every choice below applies instantly and is persisted on change */}\n <Blockquote size=\"sm\" style={{ marginBottom: 'var(--tz-space-md)' }}>\n {t('settings.autoSaveNote')}\n </Blockquote>\n {showTheme && (\n <>\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.themeTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.themeDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={mode}\n onChange={(v) => {\n if (typeof v === 'string') setMode(v as 'light' | 'dark')\n }}\n options={[\n {\n value: 'light',\n label: t('settings.light'),\n description: t('settings.lightDesc'),\n icon: 'Sun',\n },\n {\n value: 'dark',\n label: t('settings.dark'),\n description: t('settings.darkDesc'),\n icon: 'Moon',\n },\n ]}\n aria-label={t('settings.themeTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n </>\n )}\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.accentTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.accentDesc')}\n </Typography>\n <Col gap=\"md\" style={{ marginTop: 'var(--tz-space-sm)' }}>\n {showTheme ? (\n <>\n {picker('light', t('settings.lightTheme'))}\n {picker('dark', t('settings.darkTheme'))}\n </>\n ) : (\n // theme switching is off → the panel stays in one mode, so only that mode's accent matters\n picker(mode, mode === 'light' ? t('settings.lightTheme') : t('settings.darkTheme'))\n )}\n </Col>\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.fontTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.fontDesc')}\n </Typography>\n <Select\n label={t('settings.fontFamily')}\n searchable\n searchPlaceholder={t('settings.fontSearch')}\n value={fontFamily}\n options={fontOptions}\n onSearchChange={setFontQuery}\n onChange={(v) => {\n setFontFamily(v)\n setFontQuery('')\n }}\n aria-label={t('settings.fontFamily')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.headerTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.headerDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={headerSticky ? 'fixed' : 'static'}\n // exclusive (radio) → always a string; set sticky from the picked card\n onChange={(v) => {\n if (typeof v === 'string') setHeaderSticky(v === 'fixed')\n }}\n options={[\n {\n value: 'static',\n label: t('settings.scrollable'),\n description: t('settings.scrollableDesc'),\n },\n { value: 'fixed', label: t('settings.fixed'), description: t('settings.fixedDesc') },\n ]}\n aria-label={t('settings.headerTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n {showSidebar && (\n <>\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.sidebarTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.sidebarDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={sidebarVariant}\n // exclusive (radio) → always a string; the two values are exactly the SidebarVariant union\n onChange={(v) => {\n if (v === 'floating' || v === 'docked') setSidebarVariant(v)\n }}\n options={[\n {\n value: 'floating',\n label: t('settings.floating'),\n description: t('settings.floatingDesc'),\n },\n {\n value: 'docked',\n label: t('settings.docked'),\n description: t('settings.dockedDesc'),\n },\n ]}\n aria-label={t('settings.sidebarTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n </>\n )}\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.shapeTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.shapeDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={shape}\n // exclusive (radio) → always a string; the two values are exactly the ThemeShape union\n onChange={(v) => {\n if (v === 'rounded' || v === 'square') setShape(v)\n }}\n options={[\n {\n value: 'rounded',\n label: t('settings.rounded'),\n description: t('settings.roundedDesc'),\n },\n { value: 'square', label: t('settings.square'), description: t('settings.squareDesc') },\n ]}\n aria-label={t('settings.shapeTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n </div>\n </Modal>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Link, useNavigate, useRouterState, type LinkProps } from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { useMediaQuery } from '../../hooks/useMediaQuery'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport {\n useHeaderConfig,\n useLanguage,\n useSidebarConfig,\n useT,\n useTheme,\n type HeaderAction,\n type HeaderConfig,\n type HeaderEnvironment,\n type HeaderMenuItem,\n type HeaderUser,\n type SidebarVariant,\n} from '../../theme'\nimport { Avatar } from '../Avatar'\nimport { Badge } from '../Badge'\nimport { Chip } from '../Chip'\nimport { Col, Row } from '../Flex'\nimport { Divider } from '../Divider'\nimport { Dropdown } from '../Dropdown'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ListItem, type ListItemProps } from '../List'\nimport { FullscreenToggle } from '../FullscreenToggle'\nimport { ThemeToggle } from '../ThemeToggle'\nimport { Tooltip } from '../Tooltip'\nimport { UserCard } from '../UserCard'\nimport { Typography } from '../Typography'\nimport { Breadcrumbs } from '../Breadcrumbs'\nimport { Toaster, type ToasterProps } from '../Toast'\nimport { NavSearch, Sidebar, useFirstNavTo } from '../Sidebar/Sidebar'\nimport { Flag } from '../Flag'\nimport { SettingsDrawer } from './SettingsDrawer'\nimport { isDev } from '../ErrorState/errorMessage'\nimport styles from './RootLayout.module.css'\n\n/**\n * `header.environment` → the chip to show, or `null` for none (empty, or production). A string gets its first\n * letter capitalized, the `warning` tint and the `Code` icon; an object is used as given. Exported for tests.\n */\nexport function resolveEnvironment(\n environment: HeaderConfig['environment'],\n): Required<HeaderEnvironment> | null {\n if (environment == null) return null\n const env = typeof environment === 'string' ? { label: environment } : environment\n const label = env.label.trim()\n if (!label || /^prod(uction)?$/i.test(label)) return null\n return {\n label: typeof environment === 'string' ? label.charAt(0).toUpperCase() + label.slice(1) : label,\n color: env.color ?? 'warning',\n icon: env.icon ?? 'Code',\n }\n}\n\n// `ListItem as={Link}` — `to` / `params` / `search` are router props ListItem doesn't type itself\nconst MenuLink = ListItem as unknown as (\n props: ListItemProps & Pick<HeaderMenuItem, 'to' | 'params' | 'search'>,\n) => ReactNode\n\n/**\n * The shell header config + its user shape now live in the theme layer (so `config.header` can carry\n * them app-wide). These aliases keep the historical `RootLayout*` names importable.\n */\nexport type RootLayoutUser = HeaderUser\nexport type RootLayoutHeader = HeaderConfig\n\n/** How the sidebar sits in the shell (the theme layer's `SidebarVariant`, under the historical `RootLayout*` name). */\nexport type RootLayoutSidebarVariant = SidebarVariant\n\nexport interface RootLayoutProps {\n /** Brand logo at the top of the sidebar card — pass an `<img>`, an `<Icon>`, or any node. */\n logo?: ReactNode\n /**\n * Where clicking the logo goes. Defaults to the **first page in the menu** the user may open (the same\n * \"home\" as the breadcrumbs' first crumb and `FirstRouteRedirect`) — so the logo always leads back to the\n * page the panel opens on. Pass a path to send it elsewhere, or `false` for a plain, non-clickable logo.\n */\n logoTo?: LinkProps['to'] | false\n /** Optional content pinned to the **bottom of the sidebar** (e.g. a promo / \"Need help?\" card). */\n sidebarFooter?: ReactNode\n /**\n * Show a **`UserCard`** at the bottom of the sidebar (below `sidebarFooter`), built from `header.user` and\n * `header.onLogout` (its **Sign Out** button). Unset, the app-wide `config.sidebar.userCard` applies — default\n * **`false`** (hidden).\n */\n showUserCard?: boolean\n /**\n * The sidebar's look. `'floating'` (default): a rounded, bordered card inset from the window edges.\n * `'docked'`: flush against the top, left and bottom edges, no radius, a single border on its right —\n * the content keeps its inset — desktop (≥1280px) only: below 1280px, where the sidebar is an overlay drawer,\n * `'docked'` looks exactly like `'floating'`. **Unset (recommended)**, the user picks it in the header Settings drawer\n * (persisted), defaulting to the app-wide `config.sidebar.variant`; **set**, it pins this shell's look and the\n * Settings drawer's Sidebar section is hidden.\n */\n sidebarVariant?: RootLayoutSidebarVariant\n /**\n * Header config for **this** shell — merged **over** the app-wide `config.header` (the prop wins).\n * Fields: the built-in `theme` / `search` / `settings` / `languages` toggles (default `true`),\n * `fullscreen` (default `false`), `breadcrumbs` (default `true`), and the account (`onLogout` / `user`).\n */\n header?: RootLayoutHeader\n /**\n * The built-in toast viewport, mounted for you so `toast.*()` works app-wide with no extra setup.\n * Defaults to `true` (a `<Toaster>` following the app-wide `config.toast`, else its built-in defaults). Pass\n * `ToasterProps` (`{ position, duration }`) to override it for this shell — anything unset still falls back to\n * `config.toast` — or `false` to opt out, e.g. when you mount your own `<Toaster>`.\n */\n toaster?: boolean | ToasterProps\n /** Routed content — the consumer passes `<Outlet />`. */\n children: ReactNode\n}\n\n/**\n * The admin-panel shell — a **floating** layout: the whole app sits on a soft `--tz-color-background`\n * canvas, with a rounded, bordered `--tz-color-surface` **sidebar card** (`logo` + auto-generated `Sidebar` + an optional\n * `sidebarFooter`, then an optional `UserCard` from `header.user` + `header.onLogout` — `showUserCard` ??\n * `config.sidebar.userCard`, default hidden) beside the header + content — or, with the `'docked'` look (the user's Settings choice,\n * seeded from `config.sidebar.variant`, or pinned by the `sidebarVariant` prop), a sidebar flush to the\n * window edges. Set it as the root route's component and pass\n * `<Outlet />` as `children`; the `Sidebar` builds itself from the routes' `staticData`. The header\n * holds an optional `ThemeToggle` (on by default), a **Settings** button (opens a right-side drawer to\n * pick + persist the appearance — theme, accent colors, font, header, sidebar, shape), plus an account\n * `Avatar` whose menu has a **Sign out** item when `header.onLogout` is given. The content area stacks **`Breadcrumbs` → `children`**; each page wraps its\n * body in `PageLayout`, which owns the page heading (`pageTitle`), the back button (`back`) and the\n * title-row actions (`pageActions`). On a 404 the breadcrumbs are suppressed automatically (a partial route\n * match would otherwise show a stale section), regardless of `header.breadcrumbs`. A `<Toaster>` is **mounted by default** so\n * `toast.*()` works app-wide with no extra setup (configure via `toaster`, or `toaster={false}` to opt\n * out). Styling is token-based, so it follows the active `ConfigProvider` mode. Requires\n * `@tanstack/react-router` (peer).\n */\nexport function RootLayout({\n logo,\n logoTo,\n sidebarFooter,\n showUserCard,\n sidebarVariant,\n header,\n toaster = true,\n children,\n}: RootLayoutProps) {\n // the user's persisted header + sidebar choices (seeded from config.header.sticky / config.sidebar.variant)\n const { headerSticky, sidebarVariant: chosenSidebarVariant } = useTheme()\n const { language, setLanguage, languages } = useLanguage()\n const t = useT()\n // the logo links \"home\" — the first menu page the user may open, unless the app points it elsewhere\n const firstNavTo = useFirstNavTo()\n const logoHref = logoTo === false ? undefined : (logoTo ?? firstNavTo)\n // app-wide header config (config.header) as the base; this shell's `header` prop wins over it\n const configHeader = useHeaderConfig()\n // sidebar look: this shell's prop pins it; otherwise the user's choice (Settings), seeded from config\n const variant = sidebarVariant ?? chosenSidebarVariant\n const h: HeaderConfig = { ...configHeader, ...header }\n const showTheme = h.theme ?? true\n const showFullscreen = h.fullscreen ?? false\n const showSettings = h.settings ?? true\n const showSearch = h.search ?? true\n const showLanguages = h.languages ?? true\n const showBreadcrumbs = h.breadcrumbs ?? true\n const toasterProps = typeof toaster === 'object' ? toaster : undefined\n const onLogout = h.onLogout\n const user = h.user\n // the sidebar's user card: this shell's prop → app-wide config.sidebar.userCard → hidden. It needs someone\n // to show (a user) or something to do (Sign Out), else it would be an empty \"Welcome\" box.\n const configSidebar = useSidebarConfig()\n const userCard =\n (showUserCard ?? configSidebar.userCard ?? false) && (user != null || onLogout != null) ? (\n <UserCard name={user?.name} email={user?.email} avatar={user?.avatar} onLogout={onLogout} />\n ) : null\n const environment = resolveEnvironment(h.environment)\n const accountMenu = h.menu ?? [] // custom account-menu items (between the user block and Sign out)\n // app header actions: inline IconButtons — on xs they fold into the account menu (when there is one)\n const headerActions = h.actions ?? []\n const isXs = useMediaQuery('xs')\n const actionsInMenu = isXs && onLogout != null\n const runAction = (a: HeaderAction) => {\n a.onClick?.()\n if (a.to) navigate({ to: a.to as LinkProps['to'], params: a.params, search: a.search } as never)\n }\n // an account-menu item with nothing to do is almost always a config slip — say so in development\n const inertMenuItems = accountMenu\n .filter((item) => !item.to && !item.onClick)\n .map((item) => item.label)\n .join(', ')\n useEffect(() => {\n if (inertMenuItems && isDev())\n console.warn(\n `[RootLayout] header.menu items without \\`to\\` or \\`onClick\\`: ${inertMenuItems}`,\n )\n }, [inertMenuItems])\n // below 1280px the sidebar auto-collapses (and auto-expands again above it); a manual toggle holds\n // until the next breakpoint cross. `useMediaQuery` is correct on the first client render, so no flash.\n const isNarrow = useMediaQuery('md') // ≤ 1279.98px — the shared `md` breakpoint\n const [collapsed, setCollapsed] = useState(isNarrow)\n useEffect(() => {\n setCollapsed(isNarrow)\n }, [isNarrow])\n // while the sidebar overlays the content (narrow + open), lock page scroll so scrolling inside the\n // drawer doesn't scroll the content behind it\n useLockBodyScroll(isNarrow && !collapsed)\n // navigating from the overlay drawer (a nav link or a search suggestion — both change the route) auto-\n // closes it, so you land on the page instead of the still-open sidebar; desktop navigation is untouched\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n useEffect(() => {\n if (isNarrow) setCollapsed(true)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname])\n // on a 404 the URL often partially matches a named layout route (e.g. `/core/xxx` still resolves\n // \"Core\" as the active section), so the breadcrumbs would show a stale, wrong trail.\n // suppress them when the router is in a notFound state — automatic, no opt-out needed. `statusCode ===\n // 404` is the primary signal; a `notFound` match status is the fallback.\n const isNotFound = useRouterState({\n select: (s) => s.statusCode === 404 || s.matches.some((m) => m.status === 'notFound'),\n })\n const [settingsOpen, setSettingsOpen] = useState(false)\n const navigate = useNavigate()\n\n return (\n <div\n className={clsx(\n styles.shell,\n variant === 'docked' && styles.shellDocked,\n collapsed && styles.shellCollapsed,\n )}\n >\n <aside className={styles.sidebar}>\n {/* fixed-width inner: the outer <aside> animates its width to 0 (and clips via overflow),\n while this keeps the sidebar's real width so the content never reflows mid-collapse */}\n <div className={styles.sidebarInner}>\n {logo ? (\n <div className={styles.brand}>\n {logoHref ? (\n <Link to={logoHref} className={styles.brandLink} aria-label={t('sidebar.home')}>\n {logo}\n </Link>\n ) : (\n logo\n )}\n {/* in-drawer close — only shown when the sidebar overlays (narrow), where the header\n toggle is behind the backdrop; closes the drawer */}\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n className={styles.sidebarClose}\n aria-label={t('common.close')}\n onClick={() => setCollapsed(true)}\n >\n <Icon name=\"Close\" />\n </IconButton>\n </div>\n ) : null}\n {/* the search lives in the header on desktop; below 576px (full-width drawer) it moves here,\n between the logo and the menu (CSS toggles which instance shows) */}\n {showSearch ? (\n <div className={styles.sidebarSearch}>\n <NavSearch />\n </div>\n ) : null}\n <div className={styles.navScroll}>\n <Sidebar />\n </div>\n {sidebarFooter || userCard ? (\n <div className={styles.sidebarFooter}>\n {/* the app's content keeps its own (block) flow; only it and the card are spaced */}\n {sidebarFooter ? <div>{sidebarFooter}</div> : null}\n {userCard}\n </div>\n ) : null}\n </div>\n </aside>\n {/* dim backdrop behind the overlay sidebar — a sibling of the sidebar (same stacking context, so the\n sidebar reliably sits above it, unlike a body-portaled Overlay). Only shown/interactive below\n 1280px while open (CSS); clicking it closes the drawer. On desktop the sidebar is a grid column. */}\n <div className={styles.backdrop} onClick={() => setCollapsed(true)} aria-hidden=\"true\" />\n <div className={styles.main}>\n <header className={clsx(styles.topbar, headerSticky && styles.topbarSticky)}>\n <div className={styles.headerStart}>\n <IconButton\n aria-label={t(collapsed ? 'sidebar.show' : 'sidebar.hide')}\n aria-expanded={!collapsed}\n variant=\"filled\"\n size=\"sm\"\n onClick={() => setCollapsed((c) => !c)}\n >\n <Icon name=\"Menu\" />\n </IconButton>\n {showSearch ? (\n <div className={styles.headerSearch}>\n <NavSearch />\n </div>\n ) : null}\n </div>\n <div className={styles.headerEnd}>\n {/* the environment badge — on every screen size, unlike `extra` */}\n {environment ? (\n <Chip\n size=\"sm\"\n color={environment.color}\n startIcon={environment.icon ? <Icon name={environment.icon} /> : undefined}\n className={styles.environment}\n >\n {environment.label}\n </Chip>\n ) : null}\n {h.extra != null && !isXs ? <div className={styles.headerExtra}>{h.extra}</div> : null}\n {!actionsInMenu\n ? headerActions.map((a, i) => (\n <Badge\n key={`${a.label}-${i}`}\n content={a.dot ? undefined : a.badge}\n dot={a.dot}\n color={a.badgeColor ?? 'error'}\n >\n <Tooltip content={a.label} placement=\"bottom\">\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n color={a.color}\n aria-label={a.label}\n disabled={a.disabled}\n onClick={() => runAction(a)}\n >\n <Icon name={a.icon} />\n </IconButton>\n </Tooltip>\n </Badge>\n ))\n : null}\n {showFullscreen ? <FullscreenToggle variant=\"filled\" size=\"sm\" /> : null}\n {showTheme ? <ThemeToggle variant=\"filled\" size=\"sm\" /> : null}\n {showLanguages && languages.length > 1 ? (\n <Dropdown\n placement=\"bottom-end\"\n trigger={\n <IconButton variant=\"filled\" size=\"sm\" aria-label={t('language.label')}>\n <Icon name=\"Global\" />\n </IconButton>\n }\n >\n {languages.map((l) => (\n <ListItem\n key={l.code}\n clickable\n selected={l.code === language}\n onClick={() => setLanguage(l.code)}\n icon={<Flag code={l.code} />}\n >\n {l.label ?? l.code}\n </ListItem>\n ))}\n </Dropdown>\n ) : null}\n {showSettings ? (\n <IconButton\n aria-label={t('settings.label')}\n variant=\"text\"\n size=\"sm\"\n className={styles.settings}\n onClick={() => setSettingsOpen(true)}\n >\n <Icon name=\"Setting5\" />\n </IconButton>\n ) : null}\n {onLogout ? (\n <Dropdown\n placement=\"bottom-end\"\n style={{ minWidth: 230 }}\n trigger={\n <button type=\"button\" className={styles.account} aria-label={t('account.label')}>\n <Avatar size=\"md\" name={user?.name} src={user?.avatar} color=\"primary\" />\n </button>\n }\n >\n {user ? (\n <>\n <Row gap={8} align=\"center\" padding=\"var(--tz-space-xxs) var(--tz-space-xs)\">\n <Avatar size=\"md\" name={user.name} src={user.avatar} color=\"primary\" />\n <Col gap={2}>\n {/* name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"body\">{user.name ?? t('userCard.welcome')}</Typography>\n {user.email ? (\n <Typography variant=\"bodySmall\" color=\"muted\">\n {user.email}\n </Typography>\n ) : null}\n </Col>\n </Row>\n <Divider />\n </>\n ) : null}\n {/* on xs the header actions fold in here, above the app's own menu items */}\n {actionsInMenu\n ? headerActions.map((a, i) => (\n <ListItem\n key={`action-${a.label}-${i}`}\n icon={<Icon name={a.icon} color={a.color} />}\n clickable\n disabled={a.disabled}\n onClick={() => runAction(a)}\n trailing={\n a.dot ? (\n <span\n className={styles.menuDot}\n style={{ background: `var(--tz-color-${a.badgeColor ?? 'error'})` }}\n aria-hidden=\"true\"\n />\n ) : a.badge != null && a.badge !== 0 && a.badge !== '' ? (\n <Chip size=\"sm\" color={a.badgeColor ?? 'error'}>\n {typeof a.badge === 'number' && a.badge > 99 ? '99+' : a.badge}\n </Chip>\n ) : undefined\n }\n >\n {a.label}\n </ListItem>\n ))\n : null}\n {actionsInMenu && headerActions.length > 0 ? <Divider /> : null}\n {/* app-supplied items (e.g. \"Account\"), between the user block and Sign out */}\n {accountMenu.map((item, i) => {\n const itemProps = {\n icon: item.icon ? <Icon name={item.icon} color={item.color} /> : undefined,\n color: item.color,\n clickable: true,\n disabled: item.disabled,\n onClick: item.onClick,\n children: item.label,\n }\n // `to` → a real router link (href, new-tab clicks); the Dropdown still closes on select\n // and roves to it (`a[href]`). Link runs `onClick` first, then navigates.\n return item.to && !item.disabled ? (\n <MenuLink\n key={i}\n {...itemProps}\n as={Link}\n to={item.to}\n params={item.params}\n search={item.search}\n />\n ) : (\n <ListItem key={i} {...itemProps} />\n )\n })}\n {/* keep the destructive Sign out visually separated from the custom items */}\n {accountMenu.length > 0 ? <Divider /> : null}\n <ListItem icon={<Icon name=\"Logout2\" color=\"error\" />} clickable onClick={onLogout}>\n {t('userCard.signOut')}\n </ListItem>\n </Dropdown>\n ) : null}\n </div>\n </header>\n <main className={styles.content}>\n {showBreadcrumbs && !isNotFound ? <Breadcrumbs /> : null}\n {children}\n </main>\n </div>\n {toaster !== false && <Toaster {...toasterProps} />}\n {showSettings ? (\n <SettingsDrawer\n open={settingsOpen}\n onClose={() => setSettingsOpen(false)}\n showTheme={showTheme}\n showSidebar={sidebarVariant === undefined}\n />\n ) : null}\n </div>\n )\n}\n"],"names":["ALT_SWATCHES","SettingsDrawer","open","onClose","showTheme","showSidebar","mode","setMode","accentColors","defaultAccentColors","setAccentColor","headerSticky","setHeaderSticky","sidebarVariant","setSidebarVariant","fontFamily","setFontFamily","shape","setShape","hasCustomPreferences","resetPreferences","useTheme","t","useT","contentRef","useRef","handleReset","root","target","fontQuery","setFontQuery","useState","q","base","DEFAULT_FONT_FAMILY","fontOptions","f","picker","label","def","colors","c","jsx","SwatchPicker","color","Modal","Popconfirm","Button","Icon","jsxs","Blockquote","Fragment","Typography","ChoiceCardGroup","v","Divider","Col","Select","resolveEnvironment","environment","env","MenuLink","ListItem","RootLayout","logo","logoTo","sidebarFooter","showUserCard","header","toaster","children","chosenSidebarVariant","language","setLanguage","languages","useLanguage","firstNavTo","useFirstNavTo","logoHref","configHeader","useHeaderConfig","variant","h","showFullscreen","showSettings","showSearch","showLanguages","showBreadcrumbs","toasterProps","onLogout","user","configSidebar","useSidebarConfig","userCard","UserCard","accountMenu","headerActions","isXs","useMediaQuery","actionsInMenu","runAction","a","_a","navigate","inertMenuItems","item","useEffect","isDev","isNarrow","collapsed","setCollapsed","useLockBodyScroll","pathname","useRouterState","s","isNotFound","m","settingsOpen","setSettingsOpen","useNavigate","clsx","styles","Link","IconButton","NavSearch","Sidebar","Chip","i","Badge","Tooltip","FullscreenToggle","ThemeToggle","Dropdown","l","Flag","Avatar","Row","itemProps","Breadcrumbs","Toaster"],"mappings":"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"}