@techzyapp/ui-library 1.0.42 → 1.0.43

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 (371) hide show
  1. package/dist/AdminRoot-BLHvXCvL.js +101 -0
  2. package/dist/AdminRoot-BLHvXCvL.js.map +1 -0
  3. package/dist/AdminRoot-D_g_TW30.cjs +2 -0
  4. package/dist/AdminRoot-D_g_TW30.cjs.map +1 -0
  5. package/dist/{Alert-C8BBxL_7.cjs → Alert-B4XZDk16.cjs} +2 -2
  6. package/dist/{Alert-C8BBxL_7.cjs.map → Alert-B4XZDk16.cjs.map} +1 -1
  7. package/dist/{Alert-D6oBxBdP.js → Alert-D5E1PLkV.js} +3 -3
  8. package/dist/{Alert-D6oBxBdP.js.map → Alert-D5E1PLkV.js.map} +1 -1
  9. package/dist/{Breadcrumbs-B-olYVdw.cjs → Breadcrumbs-DSUxcp6u.cjs} +2 -2
  10. package/dist/{Breadcrumbs-B-olYVdw.cjs.map → Breadcrumbs-DSUxcp6u.cjs.map} +1 -1
  11. package/dist/{Breadcrumbs-cXET6OM5.js → Breadcrumbs-M31xyok8.js} +3 -3
  12. package/dist/{Breadcrumbs-cXET6OM5.js.map → Breadcrumbs-M31xyok8.js.map} +1 -1
  13. package/dist/{Button-0ZgdNjX-.js → Button-CtADzomU.js} +2 -2
  14. package/dist/{Button-0ZgdNjX-.js.map → Button-CtADzomU.js.map} +1 -1
  15. package/dist/{Button-CwrDiZek.cjs → Button-Q_5uA-zc.cjs} +2 -2
  16. package/dist/{Button-CwrDiZek.cjs.map → Button-Q_5uA-zc.cjs.map} +1 -1
  17. package/dist/{Calendar-d3CX5UJp.cjs → Calendar-BbbtMsZs.cjs} +2 -2
  18. package/dist/{Calendar-d3CX5UJp.cjs.map → Calendar-BbbtMsZs.cjs.map} +1 -1
  19. package/dist/{Calendar-CxzdnzdK.js → Calendar-CHLCv2s9.js} +3 -3
  20. package/dist/{Calendar-CxzdnzdK.js.map → Calendar-CHLCv2s9.js.map} +1 -1
  21. package/dist/{Card-CjqStov5.js → Card-Br9IB0yM.js} +3 -3
  22. package/dist/{Card-CjqStov5.js.map → Card-Br9IB0yM.js.map} +1 -1
  23. package/dist/{Card-CxnUoWsi.cjs → Card-CntRsQfm.cjs} +2 -2
  24. package/dist/{Card-CxnUoWsi.cjs.map → Card-CntRsQfm.cjs.map} +1 -1
  25. package/dist/{Chip-BkU3yx6G.cjs → Chip-CrBizrvG.cjs} +2 -2
  26. package/dist/{Chip-BkU3yx6G.cjs.map → Chip-CrBizrvG.cjs.map} +1 -1
  27. package/dist/{Chip-CzJjbaKx.js → Chip-DYZ5w7VM.js} +2 -2
  28. package/dist/{Chip-CzJjbaKx.js.map → Chip-DYZ5w7VM.js.map} +1 -1
  29. package/dist/{CodeBlock-BHcvQrs9.js → CodeBlock-B6Eqc4HR.js} +3 -3
  30. package/dist/{CodeBlock-BHcvQrs9.js.map → CodeBlock-B6Eqc4HR.js.map} +1 -1
  31. package/dist/{CodeBlock-DRBQ_S5t.cjs → CodeBlock-DW4uaZXM.cjs} +2 -2
  32. package/dist/{CodeBlock-DRBQ_S5t.cjs.map → CodeBlock-DW4uaZXM.cjs.map} +1 -1
  33. package/dist/{ColorPicker-BQKFdTNr.js → ColorPicker-GsKIqJu8.js} +3 -3
  34. package/dist/{ColorPicker-BQKFdTNr.js.map → ColorPicker-GsKIqJu8.js.map} +1 -1
  35. package/dist/{ColorPicker-BzCEMN7B.cjs → ColorPicker-nhWd_nOW.cjs} +2 -2
  36. package/dist/{ColorPicker-BzCEMN7B.cjs.map → ColorPicker-nhWd_nOW.cjs.map} +1 -1
  37. package/dist/{ColorPickerPanel-DKTKC9KH.js → ColorPickerPanel-BEcZePcT.js} +2 -2
  38. package/dist/{ColorPickerPanel-DKTKC9KH.js.map → ColorPickerPanel-BEcZePcT.js.map} +1 -1
  39. package/dist/{ColorPickerPanel-kl2jUix-.cjs → ColorPickerPanel-BeAu83S6.cjs} +2 -2
  40. package/dist/{ColorPickerPanel-kl2jUix-.cjs.map → ColorPickerPanel-BeAu83S6.cjs.map} +1 -1
  41. package/dist/{ColorRamp-n7muILK3.cjs → ColorRamp-C-zRPhHj.cjs} +2 -2
  42. package/dist/{ColorRamp-n7muILK3.cjs.map → ColorRamp-C-zRPhHj.cjs.map} +1 -1
  43. package/dist/{ColorRamp-yfMyJCyx.js → ColorRamp-CeNgd8wF.js} +2 -2
  44. package/dist/{ColorRamp-yfMyJCyx.js.map → ColorRamp-CeNgd8wF.js.map} +1 -1
  45. package/dist/ConfigProvider-Ci9Q2HLF.cjs +2 -0
  46. package/dist/ConfigProvider-Ci9Q2HLF.cjs.map +1 -0
  47. package/dist/{ConfigProvider-D61cpCz-.js → ConfigProvider-Dqfu7UBU.js} +133 -126
  48. package/dist/ConfigProvider-Dqfu7UBU.js.map +1 -0
  49. package/dist/{CopyButton-ecxn-ghi.js → CopyButton-Bidt2Vgp.js} +3 -3
  50. package/dist/{CopyButton-ecxn-ghi.js.map → CopyButton-Bidt2Vgp.js.map} +1 -1
  51. package/dist/{CopyButton-DlSi82gv.cjs → CopyButton-Chr7SP5i.cjs} +2 -2
  52. package/dist/{CopyButton-DlSi82gv.cjs.map → CopyButton-Chr7SP5i.cjs.map} +1 -1
  53. package/dist/{DatePicker-BjZ_P21i.cjs → DatePicker-4rb34nPR.cjs} +2 -2
  54. package/dist/{DatePicker-BjZ_P21i.cjs.map → DatePicker-4rb34nPR.cjs.map} +1 -1
  55. package/dist/{DatePicker-CAGpJbDi.js → DatePicker-D7ZMOhWn.js} +4 -4
  56. package/dist/{DatePicker-CAGpJbDi.js.map → DatePicker-D7ZMOhWn.js.map} +1 -1
  57. package/dist/{DateTimePicker-DZqWQeUL.cjs → DateTimePicker-CVFzKzyA.cjs} +2 -2
  58. package/dist/{DateTimePicker-DZqWQeUL.cjs.map → DateTimePicker-CVFzKzyA.cjs.map} +1 -1
  59. package/dist/{DateTimePicker-BJmF0Su6.js → DateTimePicker-gDxM2CGy.js} +7 -7
  60. package/dist/{DateTimePicker-BJmF0Su6.js.map → DateTimePicker-gDxM2CGy.js.map} +1 -1
  61. package/dist/{DescriptionList-CvPDn-kh.cjs → DescriptionList-BBvfABps.cjs} +2 -2
  62. package/dist/{DescriptionList-CvPDn-kh.cjs.map → DescriptionList-BBvfABps.cjs.map} +1 -1
  63. package/dist/{DescriptionList-Knq5eCiY.js → DescriptionList-Die3lRBW.js} +4 -4
  64. package/dist/{DescriptionList-Knq5eCiY.js.map → DescriptionList-Die3lRBW.js.map} +1 -1
  65. package/dist/{EmptyState-CX1g47y_.cjs → EmptyState-D5EKQjX1.cjs} +2 -2
  66. package/dist/{EmptyState-CX1g47y_.cjs.map → EmptyState-D5EKQjX1.cjs.map} +1 -1
  67. package/dist/{EmptyState-Dqtpmtje.js → EmptyState-DRgER10x.js} +2 -2
  68. package/dist/{EmptyState-Dqtpmtje.js.map → EmptyState-DRgER10x.js.map} +1 -1
  69. package/dist/{ErrorBoundary-Dos7VLb-.js → ErrorBoundary-CLfE2NjU.js} +3 -3
  70. package/dist/{ErrorBoundary-Dos7VLb-.js.map → ErrorBoundary-CLfE2NjU.js.map} +1 -1
  71. package/dist/{ErrorBoundary-B8KwWXXp.cjs → ErrorBoundary-DVcGWZd8.cjs} +2 -2
  72. package/dist/{ErrorBoundary-B8KwWXXp.cjs.map → ErrorBoundary-DVcGWZd8.cjs.map} +1 -1
  73. package/dist/{ErrorState-CwCqd2PU.cjs → ErrorState-DJDQbHZY.cjs} +2 -2
  74. package/dist/{ErrorState-CwCqd2PU.cjs.map → ErrorState-DJDQbHZY.cjs.map} +1 -1
  75. package/dist/{ErrorState-KhzrGIJ-.js → ErrorState-Dqw0AvmB.js} +7 -7
  76. package/dist/{ErrorState-KhzrGIJ-.js.map → ErrorState-Dqw0AvmB.js.map} +1 -1
  77. package/dist/{FileCard-DEc10T2G.cjs → FileCard-BqMproT9.cjs} +2 -2
  78. package/dist/{FileCard-DEc10T2G.cjs.map → FileCard-BqMproT9.cjs.map} +1 -1
  79. package/dist/{FileCard-SSuFS13E.js → FileCard-kVnjcSlk.js} +3 -3
  80. package/dist/{FileCard-SSuFS13E.js.map → FileCard-kVnjcSlk.js.map} +1 -1
  81. package/dist/{FileUploader-D58_6kDA.cjs → FileUploader-BimFH5d8.cjs} +2 -2
  82. package/dist/{FileUploader-D58_6kDA.cjs.map → FileUploader-BimFH5d8.cjs.map} +1 -1
  83. package/dist/{FileUploader-DfYOBFa4.js → FileUploader-LJIMh5_b.js} +5 -5
  84. package/dist/{FileUploader-DfYOBFa4.js.map → FileUploader-LJIMh5_b.js.map} +1 -1
  85. package/dist/{FullscreenToggle-I_In47BB.js → FullscreenToggle-BuQonKW8.js} +3 -3
  86. package/dist/{FullscreenToggle-I_In47BB.js.map → FullscreenToggle-BuQonKW8.js.map} +1 -1
  87. package/dist/{FullscreenToggle-Po769CoC.cjs → FullscreenToggle-CWlOXLss.cjs} +2 -2
  88. package/dist/{FullscreenToggle-Po769CoC.cjs.map → FullscreenToggle-CWlOXLss.cjs.map} +1 -1
  89. package/dist/{IconButton-D9MCwRK_.js → IconButton-BoURJOUD.js} +2 -2
  90. package/dist/{IconButton-D9MCwRK_.js.map → IconButton-BoURJOUD.js.map} +1 -1
  91. package/dist/{IconButton-CxSXEYce.cjs → IconButton-CiDPeKM4.cjs} +2 -2
  92. package/dist/{IconButton-CxSXEYce.cjs.map → IconButton-CiDPeKM4.cjs.map} +1 -1
  93. package/dist/{Loader-5zp2MPm5.cjs → Loader-CAmRn8Oj.cjs} +2 -2
  94. package/dist/{Loader-5zp2MPm5.cjs.map → Loader-CAmRn8Oj.cjs.map} +1 -1
  95. package/dist/{Loader-Bluu6z0-.js → Loader-CnTuddK7.js} +2 -2
  96. package/dist/{Loader-Bluu6z0-.js.map → Loader-CnTuddK7.js.map} +1 -1
  97. package/dist/{LocationPicker-CGHXTIml.cjs → LocationPicker-BwQ6ULMF.cjs} +2 -2
  98. package/dist/{LocationPicker-CGHXTIml.cjs.map → LocationPicker-BwQ6ULMF.cjs.map} +1 -1
  99. package/dist/{LocationPicker-hULpHBVG.js → LocationPicker-Cns3fkYI.js} +6 -6
  100. package/dist/{LocationPicker-hULpHBVG.js.map → LocationPicker-Cns3fkYI.js.map} +1 -1
  101. package/dist/{Modal-C6Zgwz_6.js → Modal-CYcVOzID.js} +3 -3
  102. package/dist/{Modal-C6Zgwz_6.js.map → Modal-CYcVOzID.js.map} +1 -1
  103. package/dist/{Modal-D9_OG53G.cjs → Modal-DwY3jGHE.cjs} +2 -2
  104. package/dist/{Modal-D9_OG53G.cjs.map → Modal-DwY3jGHE.cjs.map} +1 -1
  105. package/dist/{MultiSelect-BdPvjiTj.cjs → MultiSelect-DJ6tRseY.cjs} +2 -2
  106. package/dist/{MultiSelect-BdPvjiTj.cjs.map → MultiSelect-DJ6tRseY.cjs.map} +1 -1
  107. package/dist/{MultiSelect-CHLMpim4.js → MultiSelect-svEVZNbp.js} +4 -4
  108. package/dist/{MultiSelect-CHLMpim4.js.map → MultiSelect-svEVZNbp.js.map} +1 -1
  109. package/dist/{NumberField-BlpFmetF.js → NumberField-9ekoB1wS.js} +3 -3
  110. package/dist/{NumberField-BlpFmetF.js.map → NumberField-9ekoB1wS.js.map} +1 -1
  111. package/dist/{NumberField-C-FZ-uRI.cjs → NumberField-sokUuuBR.cjs} +2 -2
  112. package/dist/{NumberField-C-FZ-uRI.cjs.map → NumberField-sokUuuBR.cjs.map} +1 -1
  113. package/dist/{OtpField-D4-r7I0A.js → OtpField-DA7zJwy9.js} +2 -2
  114. package/dist/{OtpField-D4-r7I0A.js.map → OtpField-DA7zJwy9.js.map} +1 -1
  115. package/dist/{OtpField-Drjy2wwq.cjs → OtpField-DlkGju72.cjs} +2 -2
  116. package/dist/{OtpField-Drjy2wwq.cjs.map → OtpField-DlkGju72.cjs.map} +1 -1
  117. package/dist/{PageError-DXUOkE14.cjs → PageError-DUN5PzDF.cjs} +2 -2
  118. package/dist/{PageError-DXUOkE14.cjs.map → PageError-DUN5PzDF.cjs.map} +1 -1
  119. package/dist/{PageError-DyDj1wQZ.js → PageError-vD8Dpfns.js} +5 -5
  120. package/dist/{PageError-DyDj1wQZ.js.map → PageError-vD8Dpfns.js.map} +1 -1
  121. package/dist/{PageLayout-CoG0AaUs.cjs → PageLayout-BesuKuX6.cjs} +2 -2
  122. package/dist/{PageLayout-CoG0AaUs.cjs.map → PageLayout-BesuKuX6.cjs.map} +1 -1
  123. package/dist/{PageLayout-nsJa8CbT.js → PageLayout-CdObvxt7.js} +4 -4
  124. package/dist/{PageLayout-nsJa8CbT.js.map → PageLayout-CdObvxt7.js.map} +1 -1
  125. package/dist/{PageNotFound-BNNwMkwE.js → PageNotFound-Cc5eZ6w3.js} +5 -5
  126. package/dist/{PageNotFound-BNNwMkwE.js.map → PageNotFound-Cc5eZ6w3.js.map} +1 -1
  127. package/dist/{PageNotFound-CGSxT_n9.cjs → PageNotFound-CfOAhmJ-.cjs} +2 -2
  128. package/dist/{PageNotFound-CGSxT_n9.cjs.map → PageNotFound-CfOAhmJ-.cjs.map} +1 -1
  129. package/dist/{Pagination-CZtewveA.cjs → Pagination-CAD9_Nr_.cjs} +2 -2
  130. package/dist/{Pagination-CZtewveA.cjs.map → Pagination-CAD9_Nr_.cjs.map} +1 -1
  131. package/dist/{Pagination-tuWRnGwR.js → Pagination-CX0S1RrF.js} +2 -2
  132. package/dist/{Pagination-tuWRnGwR.js.map → Pagination-CX0S1RrF.js.map} +1 -1
  133. package/dist/{PaletteField-CTPl3D43.js → PaletteField-CVIwl2nV.js} +3 -3
  134. package/dist/{PaletteField-CTPl3D43.js.map → PaletteField-CVIwl2nV.js.map} +1 -1
  135. package/dist/{PaletteField-PDcu2vUp.cjs → PaletteField-CpiEkXcB.cjs} +2 -2
  136. package/dist/{PaletteField-PDcu2vUp.cjs.map → PaletteField-CpiEkXcB.cjs.map} +1 -1
  137. package/dist/{PhoneField-BPYg5ZHW.cjs → PhoneField-Dlnnv4DU.cjs} +2 -2
  138. package/dist/{PhoneField-BPYg5ZHW.cjs.map → PhoneField-Dlnnv4DU.cjs.map} +1 -1
  139. package/dist/{PhoneField-pdWDCszb.js → PhoneField-xHLTU-o5.js} +4 -4
  140. package/dist/{PhoneField-pdWDCszb.js.map → PhoneField-xHLTU-o5.js.map} +1 -1
  141. package/dist/{Popconfirm-cNpJmkuR.cjs → Popconfirm-Chlm_M5T.cjs} +2 -2
  142. package/dist/{Popconfirm-cNpJmkuR.cjs.map → Popconfirm-Chlm_M5T.cjs.map} +1 -1
  143. package/dist/{Popconfirm-CMVzLaC_.js → Popconfirm-DIlygJY8.js} +3 -3
  144. package/dist/{Popconfirm-CMVzLaC_.js.map → Popconfirm-DIlygJY8.js.map} +1 -1
  145. package/dist/{Progress-BNEFGn-O.js → Progress-BAEhawtj.js} +2 -2
  146. package/dist/{Progress-BNEFGn-O.js.map → Progress-BAEhawtj.js.map} +1 -1
  147. package/dist/{Progress-x12Rkh06.cjs → Progress-DqvKmyQW.cjs} +2 -2
  148. package/dist/{Progress-x12Rkh06.cjs.map → Progress-DqvKmyQW.cjs.map} +1 -1
  149. package/dist/{QrCode-CrNJZV_8.js → QrCode-D7BTYcW2.js} +2 -2
  150. package/dist/{QrCode-CrNJZV_8.js.map → QrCode-D7BTYcW2.js.map} +1 -1
  151. package/dist/{QrCode-TcQQE0h7.cjs → QrCode-Dqsk49vX.cjs} +2 -2
  152. package/dist/{QrCode-TcQQE0h7.cjs.map → QrCode-Dqsk49vX.cjs.map} +1 -1
  153. package/dist/{RemoveDialog-ARFp1UJM.js → RemoveDialog-CQIm9GTH.js} +5 -5
  154. package/dist/{RemoveDialog-ARFp1UJM.js.map → RemoveDialog-CQIm9GTH.js.map} +1 -1
  155. package/dist/{RemoveDialog-IWOAQFNK.cjs → RemoveDialog-DZ-EqIfS.cjs} +2 -2
  156. package/dist/{RemoveDialog-IWOAQFNK.cjs.map → RemoveDialog-DZ-EqIfS.cjs.map} +1 -1
  157. package/dist/{RichTextEditor-C9jT2cLl.cjs → RichTextEditor-Ba1G_qXu.cjs} +2 -2
  158. package/dist/{RichTextEditor-C9jT2cLl.cjs.map → RichTextEditor-Ba1G_qXu.cjs.map} +1 -1
  159. package/dist/{RichTextEditor-DrwJUEYz.js → RichTextEditor-CJcbxQ6H.js} +7 -7
  160. package/dist/{RichTextEditor-DrwJUEYz.js.map → RichTextEditor-CJcbxQ6H.js.map} +1 -1
  161. package/dist/{RootLayout-CZ2GQ8XA.js → RootLayout-Cl98ghy1.js} +14 -14
  162. package/dist/RootLayout-Cl98ghy1.js.map +1 -0
  163. package/dist/{RootLayout-DStUP263.cjs → RootLayout-s_Q_kSoS.cjs} +2 -2
  164. package/dist/RootLayout-s_Q_kSoS.cjs.map +1 -0
  165. package/dist/{Select-C2DIfuoB.cjs → Select-BrjXCXtl.cjs} +2 -2
  166. package/dist/{Select-C2DIfuoB.cjs.map → Select-BrjXCXtl.cjs.map} +1 -1
  167. package/dist/{Select-KGsA8PbI.js → Select-CG8UJL9R.js} +3 -3
  168. package/dist/{Select-KGsA8PbI.js.map → Select-CG8UJL9R.js.map} +1 -1
  169. package/dist/{Sidebar-_pcwxdd8.js → Sidebar-CbPr34jd.js} +3 -3
  170. package/dist/{Sidebar-_pcwxdd8.js.map → Sidebar-CbPr34jd.js.map} +1 -1
  171. package/dist/{Sidebar-wK1_xaY_.cjs → Sidebar-DLlqHvQJ.cjs} +2 -2
  172. package/dist/{Sidebar-wK1_xaY_.cjs.map → Sidebar-DLlqHvQJ.cjs.map} +1 -1
  173. package/dist/{Slider-Cpc5_dPl.js → Slider-B5iG-HSw.js} +2 -2
  174. package/dist/{Slider-Cpc5_dPl.js.map → Slider-B5iG-HSw.js.map} +1 -1
  175. package/dist/{Slider-CXAz9SUY.cjs → Slider-DTnui01g.cjs} +2 -2
  176. package/dist/{Slider-CXAz9SUY.cjs.map → Slider-DTnui01g.cjs.map} +1 -1
  177. package/dist/{SpeedDial-SMMfes9f.js → SpeedDial-Be3SHkzw.js} +2 -2
  178. package/dist/{SpeedDial-SMMfes9f.js.map → SpeedDial-Be3SHkzw.js.map} +1 -1
  179. package/dist/{SpeedDial-BT_boD06.cjs → SpeedDial-i5kxikmt.cjs} +2 -2
  180. package/dist/{SpeedDial-BT_boD06.cjs.map → SpeedDial-i5kxikmt.cjs.map} +1 -1
  181. package/dist/{Stepper-CR0Mlkq7.js → Stepper-BDQt-oVG.js} +2 -2
  182. package/dist/{Stepper-CR0Mlkq7.js.map → Stepper-BDQt-oVG.js.map} +1 -1
  183. package/dist/{Stepper-BmA_DjTS.cjs → Stepper-e8qBsKYW.cjs} +2 -2
  184. package/dist/{Stepper-BmA_DjTS.cjs.map → Stepper-e8qBsKYW.cjs.map} +1 -1
  185. package/dist/{Table-BkjY1Lwt.cjs → Table-C14fRX1U.cjs} +2 -2
  186. package/dist/{Table-BkjY1Lwt.cjs.map → Table-C14fRX1U.cjs.map} +1 -1
  187. package/dist/{Table-D-F68lcm.js → Table-ChdM_vyi.js} +16 -16
  188. package/dist/{Table-D-F68lcm.js.map → Table-ChdM_vyi.js.map} +1 -1
  189. package/dist/{Tabs-DP0aZ5TB.js → Tabs-BxZrgozI.js} +2 -2
  190. package/dist/{Tabs-DP0aZ5TB.js.map → Tabs-BxZrgozI.js.map} +1 -1
  191. package/dist/{Tabs-Cgp6D1WP.cjs → Tabs-C4kB1yfG.cjs} +2 -2
  192. package/dist/{Tabs-Cgp6D1WP.cjs.map → Tabs-C4kB1yfG.cjs.map} +1 -1
  193. package/dist/{TagsField-9nKu6ZW4.cjs → TagsField-Bg5BcQU-.cjs} +2 -2
  194. package/dist/{TagsField-9nKu6ZW4.cjs.map → TagsField-Bg5BcQU-.cjs.map} +1 -1
  195. package/dist/{TagsField-CcY9MTMw.js → TagsField-DWlIt7XO.js} +4 -4
  196. package/dist/{TagsField-CcY9MTMw.js.map → TagsField-DWlIt7XO.js.map} +1 -1
  197. package/dist/{TextField-C5MgCQIV.cjs → TextField-B-xqoDZR.cjs} +2 -2
  198. package/dist/{TextField-C5MgCQIV.cjs.map → TextField-B-xqoDZR.cjs.map} +1 -1
  199. package/dist/{TextField-0WvJsHhA.js → TextField-Dwx5GPxz.js} +3 -3
  200. package/dist/{TextField-0WvJsHhA.js.map → TextField-Dwx5GPxz.js.map} +1 -1
  201. package/dist/{ThemeToggle-DmCePuTy.js → ThemeToggle-CK2USfgx.js} +3 -3
  202. package/dist/{ThemeToggle-DmCePuTy.js.map → ThemeToggle-CK2USfgx.js.map} +1 -1
  203. package/dist/{ThemeToggle-BvcCxRpF.cjs → ThemeToggle-DFgv1bsh.cjs} +2 -2
  204. package/dist/{ThemeToggle-BvcCxRpF.cjs.map → ThemeToggle-DFgv1bsh.cjs.map} +1 -1
  205. package/dist/{TimeColumns-Q-vsHFZU.cjs → TimeColumns-B8KTj-tc.cjs} +2 -2
  206. package/dist/{TimeColumns-Q-vsHFZU.cjs.map → TimeColumns-B8KTj-tc.cjs.map} +1 -1
  207. package/dist/{TimeColumns-WJRHQuFv.js → TimeColumns-BWcuu3l7.js} +2 -2
  208. package/dist/{TimeColumns-WJRHQuFv.js.map → TimeColumns-BWcuu3l7.js.map} +1 -1
  209. package/dist/{TimePicker-CvbQFzBf.cjs → TimePicker-DjL15hz1.cjs} +2 -2
  210. package/dist/{TimePicker-CvbQFzBf.cjs.map → TimePicker-DjL15hz1.cjs.map} +1 -1
  211. package/dist/{TimePicker-DJDuSxAg.js → TimePicker-YMVHevpZ.js} +5 -5
  212. package/dist/{TimePicker-DJDuSxAg.js.map → TimePicker-YMVHevpZ.js.map} +1 -1
  213. package/dist/Toaster-9hZ5MuW7.cjs +2 -0
  214. package/dist/Toaster-9hZ5MuW7.cjs.map +1 -0
  215. package/dist/Toaster-pHN2pxrU.js +64 -0
  216. package/dist/Toaster-pHN2pxrU.js.map +1 -0
  217. package/dist/{TranslatedFields-DKXznBtD.js → TranslatedFields-BpWU5ZcG.js} +11 -11
  218. package/dist/{TranslatedFields-DKXznBtD.js.map → TranslatedFields-BpWU5ZcG.js.map} +1 -1
  219. package/dist/{TranslatedFields-CuK5KKzE.cjs → TranslatedFields-SvS37hab.cjs} +2 -2
  220. package/dist/{TranslatedFields-CuK5KKzE.cjs.map → TranslatedFields-SvS37hab.cjs.map} +1 -1
  221. package/dist/{UserCard-DbudGMvG.cjs → UserCard-VPaexedS.cjs} +2 -2
  222. package/dist/{UserCard-DbudGMvG.cjs.map → UserCard-VPaexedS.cjs.map} +1 -1
  223. package/dist/{UserCard-UG_Cwe-Y.js → UserCard-cmZrMvwL.js} +3 -3
  224. package/dist/{UserCard-UG_Cwe-Y.js.map → UserCard-cmZrMvwL.js.map} +1 -1
  225. package/dist/app/AdminRoot.d.cts +11 -3
  226. package/dist/app/AdminRoot.d.ts +11 -3
  227. package/dist/components/Alert/index.cjs +1 -1
  228. package/dist/components/Alert/index.js +1 -1
  229. package/dist/components/Breadcrumbs/index.cjs +1 -1
  230. package/dist/components/Breadcrumbs/index.js +1 -1
  231. package/dist/components/Button/index.cjs +1 -1
  232. package/dist/components/Button/index.js +1 -1
  233. package/dist/components/Card/index.cjs +1 -1
  234. package/dist/components/Card/index.js +1 -1
  235. package/dist/components/Chip/index.cjs +1 -1
  236. package/dist/components/Chip/index.js +1 -1
  237. package/dist/components/CodeBlock/index.cjs +1 -1
  238. package/dist/components/CodeBlock/index.js +1 -1
  239. package/dist/components/ColorPicker/index.cjs +1 -1
  240. package/dist/components/ColorPicker/index.js +1 -1
  241. package/dist/components/ColorRamp/index.cjs +1 -1
  242. package/dist/components/ColorRamp/index.js +1 -1
  243. package/dist/components/CopyButton/index.cjs +1 -1
  244. package/dist/components/CopyButton/index.js +1 -1
  245. package/dist/components/DatePicker/index.cjs +1 -1
  246. package/dist/components/DatePicker/index.js +1 -1
  247. package/dist/components/DateTimePicker/index.cjs +1 -1
  248. package/dist/components/DateTimePicker/index.js +1 -1
  249. package/dist/components/DescriptionList/index.cjs +1 -1
  250. package/dist/components/DescriptionList/index.js +1 -1
  251. package/dist/components/EmptyState/index.cjs +1 -1
  252. package/dist/components/EmptyState/index.js +1 -1
  253. package/dist/components/ErrorState/ErrorBoundary.d.cts +1 -1
  254. package/dist/components/ErrorState/ErrorBoundary.d.ts +1 -1
  255. package/dist/components/ErrorState/index.cjs +1 -1
  256. package/dist/components/ErrorState/index.js +2 -2
  257. package/dist/components/FileCard/index.cjs +1 -1
  258. package/dist/components/FileCard/index.js +1 -1
  259. package/dist/components/FileUploader/index.cjs +1 -1
  260. package/dist/components/FileUploader/index.js +1 -1
  261. package/dist/components/FullscreenToggle/index.cjs +1 -1
  262. package/dist/components/FullscreenToggle/index.js +1 -1
  263. package/dist/components/IconButton/index.cjs +1 -1
  264. package/dist/components/IconButton/index.js +1 -1
  265. package/dist/components/Loader/index.cjs +1 -1
  266. package/dist/components/Loader/index.js +1 -1
  267. package/dist/components/LocationPicker/index.cjs +1 -1
  268. package/dist/components/LocationPicker/index.js +1 -1
  269. package/dist/components/Modal/index.cjs +1 -1
  270. package/dist/components/Modal/index.js +1 -1
  271. package/dist/components/MultiSelect/index.cjs +1 -1
  272. package/dist/components/MultiSelect/index.js +1 -1
  273. package/dist/components/NumberField/index.cjs +1 -1
  274. package/dist/components/NumberField/index.js +1 -1
  275. package/dist/components/OtpField/index.cjs +1 -1
  276. package/dist/components/OtpField/index.js +1 -1
  277. package/dist/components/PageError/index.cjs +1 -1
  278. package/dist/components/PageError/index.js +1 -1
  279. package/dist/components/PageLayout/index.cjs +1 -1
  280. package/dist/components/PageLayout/index.js +1 -1
  281. package/dist/components/PageNotFound/index.cjs +1 -1
  282. package/dist/components/PageNotFound/index.js +1 -1
  283. package/dist/components/Pagination/index.cjs +1 -1
  284. package/dist/components/Pagination/index.js +1 -1
  285. package/dist/components/PaletteField/index.cjs +1 -1
  286. package/dist/components/PaletteField/index.js +1 -1
  287. package/dist/components/PhoneField/index.cjs +1 -1
  288. package/dist/components/PhoneField/index.js +1 -1
  289. package/dist/components/Popconfirm/index.cjs +1 -1
  290. package/dist/components/Popconfirm/index.js +1 -1
  291. package/dist/components/Progress/index.cjs +1 -1
  292. package/dist/components/Progress/index.js +1 -1
  293. package/dist/components/QrCode/index.cjs +1 -1
  294. package/dist/components/QrCode/index.js +1 -1
  295. package/dist/components/RemoveDialog/index.cjs +1 -1
  296. package/dist/components/RemoveDialog/index.js +1 -1
  297. package/dist/components/RichTextEditor/index.cjs +1 -1
  298. package/dist/components/RichTextEditor/index.js +1 -1
  299. package/dist/components/RootLayout/RootLayout.d.cts +3 -2
  300. package/dist/components/RootLayout/RootLayout.d.ts +3 -2
  301. package/dist/components/RootLayout/index.cjs +1 -1
  302. package/dist/components/RootLayout/index.js +1 -1
  303. package/dist/components/Select/index.cjs +1 -1
  304. package/dist/components/Select/index.js +1 -1
  305. package/dist/components/Sidebar/index.cjs +1 -1
  306. package/dist/components/Sidebar/index.js +1 -1
  307. package/dist/components/Slider/index.cjs +1 -1
  308. package/dist/components/Slider/index.js +1 -1
  309. package/dist/components/SpeedDial/index.cjs +1 -1
  310. package/dist/components/SpeedDial/index.js +1 -1
  311. package/dist/components/Stepper/index.cjs +1 -1
  312. package/dist/components/Stepper/index.js +1 -1
  313. package/dist/components/Table/index.cjs +1 -1
  314. package/dist/components/Table/index.js +1 -1
  315. package/dist/components/Tabs/index.cjs +1 -1
  316. package/dist/components/Tabs/index.js +1 -1
  317. package/dist/components/TagsField/index.cjs +1 -1
  318. package/dist/components/TagsField/index.js +1 -1
  319. package/dist/components/TextField/index.cjs +1 -1
  320. package/dist/components/TextField/index.js +1 -1
  321. package/dist/components/ThemeToggle/index.cjs +1 -1
  322. package/dist/components/ThemeToggle/index.js +1 -1
  323. package/dist/components/TimePicker/index.cjs +1 -1
  324. package/dist/components/TimePicker/index.js +1 -1
  325. package/dist/components/Toast/Toaster.d.cts +10 -4
  326. package/dist/components/Toast/Toaster.d.ts +10 -4
  327. package/dist/components/Toast/index.cjs +1 -1
  328. package/dist/components/Toast/index.js +1 -1
  329. package/dist/components/TranslatedFields/index.cjs +1 -1
  330. package/dist/components/TranslatedFields/index.js +1 -1
  331. package/dist/components/UserCard/index.cjs +1 -1
  332. package/dist/components/UserCard/index.js +1 -1
  333. package/dist/entries/app.cjs +1 -1
  334. package/dist/entries/app.js +1 -1
  335. package/dist/entries/components.cjs +1 -1
  336. package/dist/entries/components.js +51 -51
  337. package/dist/entries/i18n.cjs +1 -1
  338. package/dist/entries/i18n.js +1 -1
  339. package/dist/entries/theme.cjs +1 -1
  340. package/dist/entries/theme.d.cts +2 -2
  341. package/dist/entries/theme.d.ts +2 -2
  342. package/dist/entries/theme.js +14 -13
  343. package/dist/index.cjs +1 -1
  344. package/dist/index.css +1 -1
  345. package/dist/index.js +236 -235
  346. package/dist/theme/ConfigProvider.d.cts +20 -0
  347. package/dist/theme/ConfigProvider.d.ts +20 -0
  348. package/dist/theme/index.d.cts +2 -2
  349. package/dist/theme/index.d.ts +2 -2
  350. package/dist/{useHomeTo-DQj9tVZI.js → useHomeTo-DdmOGy09.js} +2 -2
  351. package/dist/{useHomeTo-DQj9tVZI.js.map → useHomeTo-DdmOGy09.js.map} +1 -1
  352. package/dist/{useHomeTo-BaM7kBDh.cjs → useHomeTo-HCkVzGTu.cjs} +2 -2
  353. package/dist/{useHomeTo-BaM7kBDh.cjs.map → useHomeTo-HCkVzGTu.cjs.map} +1 -1
  354. package/dist/{useOptionMenu-BKC1y6oj.cjs → useOptionMenu-BqCj10_a.cjs} +2 -2
  355. package/dist/{useOptionMenu-BKC1y6oj.cjs.map → useOptionMenu-BqCj10_a.cjs.map} +1 -1
  356. package/dist/{useOptionMenu-Dom1-bqm.js → useOptionMenu-EiyIkC3E.js} +3 -3
  357. package/dist/{useOptionMenu-Dom1-bqm.js.map → useOptionMenu-EiyIkC3E.js.map} +1 -1
  358. package/package.json +1 -1
  359. package/dist/AdminRoot-DufZpgdm.js +0 -100
  360. package/dist/AdminRoot-DufZpgdm.js.map +0 -1
  361. package/dist/AdminRoot-DwJ5jdXr.cjs +0 -2
  362. package/dist/AdminRoot-DwJ5jdXr.cjs.map +0 -1
  363. package/dist/ConfigProvider-BaiTKZKC.cjs +0 -2
  364. package/dist/ConfigProvider-BaiTKZKC.cjs.map +0 -1
  365. package/dist/ConfigProvider-D61cpCz-.js.map +0 -1
  366. package/dist/RootLayout-CZ2GQ8XA.js.map +0 -1
  367. package/dist/RootLayout-DStUP263.cjs.map +0 -1
  368. package/dist/Toaster-Bb5YEN5j.js +0 -63
  369. package/dist/Toaster-Bb5YEN5j.js.map +0 -1
  370. package/dist/Toaster-Dy1AonLa.cjs +0 -2
  371. package/dist/Toaster-Dy1AonLa.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar-wK1_xaY_.cjs","sources":["../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport {\n Link,\n Navigate,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n type StaticDataRouteOption,\n} from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { List, ListItem, type ListItemProps } from '../List'\nimport { TextField } from '../TextField'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Typography } from '../Typography'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport styles from './Sidebar.module.css'\n\n// `ListItem` rendered as a TanStack `Link` — it forwards unrecognized props (like `to`) to the\n// element, so this typed alias lets us pass `to` while keeping `ListItem`'s look + behavior.\nconst NavLink = ListItem as unknown as (props: ListItemProps & { to: string }) => ReactNode\n\nexport type { IconName }\n\n// Typed `staticData` for consumers — every route describes its own menu entry.\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n /** Menu label. A route with no `name` never appears in the menu. */\n name?: string\n /**\n * Explicit **breadcrumb** crumb for **this** route — a string, or a **function of the route `params`**\n * (e.g. `breadcrumb: ({ id }) => \\`Order #${id}\\``), so a dynamic detail route that has no `name` still gets\n * its own crumb. The current-page crumb resolves `breadcrumb` → `name`. Does **not** affect the sidebar.\n * (The page's own heading, back button and title-row actions are `PageLayout` props — `pageTitle`,\n * `back`, `pageActions` — not route data.)\n */\n breadcrumb?: string | ((params: Record<string, string>) => ReactNode)\n /** Optional menu icon (the library's `IconName` union). */\n icon?: IconName\n /** Sort order within the parent (ascending); falls back to alphabetical. */\n order?: number\n /** Routed but hidden from the menu. */\n hidden?: boolean\n /** Allowed accessKeys (OR — user needs any one). Omitted/empty = public. */\n roles?: string[]\n /** Small text label (e.g. `\"New\"`) shown as a pill on the menu row. */\n badge?: string\n /** Theme color of a small dot indicator on the menu row (e.g. `\"error\"`). */\n dot?: ThemeColor\n }\n}\n\nexport interface NavLeaf {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n}\nexport interface NavGroup {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n children?: NavLeaf[]\n}\nexport interface NavModule {\n module: string\n icon?: IconName\n groups: NavGroup[]\n}\n/**\n * One **top-level** sidebar entry, in the unified order — either a standalone page `link` or a `module`.\n * Top links and modules share a single `staticData.order` scale, so a module can sit before, after, or\n * between the standalone page links (not always after them). Produced by `buildNavTree` as `items`.\n */\nexport type NavItem = { kind: 'link'; link: NavLeaf } | { kind: 'module'; module: NavModule }\n\nconst prettify = (seg: string) =>\n seg\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\nconst trimSlashes = (p: string) => p.replace(/^\\/+|\\/+$/g, '')\n/** Normalize a pathname for comparison — drop a single trailing slash (but keep the root `/`). */\nconst normalizePath = (p: string) => (p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p)\nconst byOrderThenLabel = (\n a: { order: number; label: string },\n b: { order: number; label: string },\n) => a.order - b.order || a.label.localeCompare(b.label)\n\ninterface LeafAcc {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n order: number\n}\ninterface GroupAcc {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n order: number\n leaves: LeafAcc[]\n isContainer: boolean\n}\ninterface ModuleAcc {\n label: string\n icon?: IconName\n order: number\n groups: Map<string, GroupAcc>\n}\n\n/** A single route, reduced to what the menu needs. */\nexport interface NavRoute {\n fullPath: string\n staticData?: StaticDataRouteOption\n}\n\n/**\n * Pure menu builder — derives the 3-level nav tree (module → group → page) from a flat route list.\n * Kept router-free so it's unit-testable; `useNavTree` feeds it the live routes.\n */\nexport function buildNavTree(routes: NavRoute[]): {\n items: NavItem[]\n links: NavLeaf[]\n modules: NavModule[]\n} {\n const entries: Array<{ path: string; name: string; sd: StaticDataRouteOption }> = []\n for (const route of routes) {\n const sd = route.staticData\n const path = trimSlashes(route.fullPath)\n if (!sd?.name || !path) continue\n entries.push({ path, name: sd.name, sd })\n }\n\n const metaByPath = new Map(entries.map((e) => [e.path, e]))\n const paths = entries.map((e) => e.path)\n // A path is a \"container\" only when it has a **non-hidden** descendant — a hidden child must not turn\n // its parent into a container (which would drop the parent's own row and, if every child is hidden,\n // make the whole parent vanish from the menu).\n const isContainer = (p: string) =>\n paths.some((o) => o !== p && o.startsWith(`${p}/`) && !metaByPath.get(o)?.sd.hidden)\n const rawFullPaths = new Set(routes.map((r) => r.fullPath))\n const groupHasOwnPage = (groupKey: string) => rawFullPaths.has(`/${groupKey}/`)\n\n const chrome = (key: string, seg: string) => {\n const e = metaByPath.get(key)\n return {\n label: e?.name ?? prettify(seg),\n icon: e?.sd.icon,\n badge: e?.sd.badge,\n dot: e?.sd.dot,\n order: e?.sd.order ?? Number.POSITIVE_INFINITY,\n }\n }\n\n const modules = new Map<string, ModuleAcc>()\n const getModule = (seg: string) => {\n let mod = modules.get(seg)\n if (!mod) {\n const c = chrome(seg, seg)\n mod = { label: c.label, icon: c.icon, order: c.order, groups: new Map() }\n modules.set(seg, mod)\n }\n return mod\n }\n\n const topLinks: LeafAcc[] = []\n for (const { path, name, sd } of entries) {\n const segs = path.split('/')\n // The menu is 3 levels deep by design (module → group → page). A path only counts as a\n // \"container\" (holds children instead of being its own row) at the module/group levels; a\n // depth-3+ route is always a leaf, so a named page with even-deeper children isn't dropped.\n // Routes deeper than 3 segments still appear — flattened as leaves under their depth-2 group\n // (their `to` stays correct) — the nav just can't nest beyond level 3.\n if ((segs.length <= 2 && isContainer(path)) || sd.hidden) continue\n if (segs.length === 1) {\n topLinks.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n continue\n }\n const mod = getModule(segs[0])\n if (segs.length === 2) {\n mod.groups.set(path, {\n label: name,\n icon: sd.icon,\n to: `/${path}`,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n leaves: [],\n isContainer: false,\n })\n } else {\n const groupKey = segs.slice(0, 2).join('/')\n let group = mod.groups.get(groupKey)\n if (!group) {\n const c = chrome(groupKey, segs[1])\n group = {\n label: c.label,\n icon: c.icon,\n badge: c.badge,\n dot: c.dot,\n order: c.order,\n to: groupHasOwnPage(groupKey) ? `/${groupKey}` : undefined,\n leaves: [],\n isContainer: true,\n }\n mod.groups.set(groupKey, group)\n }\n group.leaves.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n }\n }\n\n // Top-level entries — standalone page links AND modules — share ONE `order` scale, so a module can sit\n // before / after / between the page links (not always after them). Build an ordered union, then derive\n // `links` / `modules` as its order-preserving subsets (still used by search / breadcrumbs / firstNavTo).\n const linkEntries = topLinks.map((l) => ({\n order: l.order,\n label: l.label,\n item: {\n kind: 'link' as const,\n link: { label: l.label, to: l.to, icon: l.icon, badge: l.badge, dot: l.dot },\n },\n }))\n const moduleEntries = [...modules.values()].map((mod) => ({\n order: mod.order,\n label: mod.label,\n item: {\n kind: 'module' as const,\n module: {\n module: mod.label,\n icon: mod.icon,\n groups: [...mod.groups.values()].sort(byOrderThenLabel).map(\n (g): NavGroup => ({\n label: g.label,\n icon: g.icon,\n to: g.to,\n badge: g.badge,\n dot: g.dot,\n children: g.isContainer\n ? g.leaves.sort(byOrderThenLabel).map((l) => ({\n label: l.label,\n to: l.to,\n icon: l.icon,\n badge: l.badge,\n dot: l.dot,\n }))\n : undefined,\n }),\n ),\n } satisfies NavModule,\n },\n }))\n const items: NavItem[] = [...linkEntries, ...moduleEntries]\n .sort(byOrderThenLabel)\n .map((e) => e.item)\n\n return {\n items,\n links: items.flatMap((i) => (i.kind === 'link' ? [i.link] : [])),\n modules: items.flatMap((i) => (i.kind === 'module' ? [i.module] : [])),\n }\n}\n\nfunction useNavTree(): { items: NavItem[]; links: NavLeaf[]; modules: NavModule[] } {\n const router = useRouter()\n const accessKeys = useAccessKeys() // re-render the menu when the user's roles change (login/logout)\n return useMemo(\n () =>\n buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n }))\n // Drop pages the current user can't access — empty groups/modules then vanish on their own.\n .filter((route) => hasAccess(route.staticData?.roles)),\n ),\n [router, accessKeys],\n )\n}\n\n/**\n * The first menu destination, following the **unified top-level order** (`items`) — so a module ordered\n * ahead of the page links wins. A link resolves to itself; a module to its first group page / leaf. Used\n * by `FirstRouteRedirect`.\n */\nexport function firstNavTo(tree: { items: NavItem[] }): string | undefined {\n for (const item of tree.items) {\n if (item.kind === 'link') return item.link.to\n for (const group of item.module.groups) {\n if (group.to) return group.to\n const firstChild = group.children?.[0]\n if (firstChild) return firstChild.to\n }\n }\n return undefined\n}\n\n/** The first page in the menu the user may open (the shell's \"home\": the logo link + `FirstRouteRedirect`). */\nexport function useFirstNavTo() {\n return firstNavTo(useNavTree())\n}\n\n/**\n * A `normalized fullPath → staticData.name` map from **all** routes (index routes included), the same\n * route source the `Sidebar` walks. The key drops a single trailing slash (`/core/list/` → `/core/list`),\n * so a list's **index route** (which carries the name) resolves under the plain path too. A named route\n * never loses its slot to an unnamed one. Pure + router-free, so it's unit-testable.\n */\nexport function buildNameMap(routes: NavRoute[]): Map<string, string> {\n const map = new Map<string, string>()\n for (const route of routes) {\n const name = route.staticData?.name\n if (!name) continue\n const key = normalizePath(route.fullPath)\n if (!map.has(key)) map.set(key, name)\n }\n return map\n}\n\n/**\n * Resolve a pathname's name crumbs from its **cumulative path prefixes** (not the matched-route chain),\n * so a dynamic/detail leaf (e.g. `/core/list/$id`) inherits its named ancestors. Each prefix is looked\n * up in `nameMap` (trailing slashes already normalized on both sides); a prefix with no name is simply\n * **skipped** — it never breaks the chain. Returns the recognized crumbs in order, each with its `to`.\n */\nexport function resolvePathNames(\n pathname: string,\n nameMap: Map<string, string>,\n): Array<{ name: string; to: string }> {\n const out: Array<{ name: string; to: string }> = []\n let prefix = ''\n for (const seg of trimSlashes(pathname).split('/').filter(Boolean)) {\n prefix += `/${seg}` // accumulates `/core`, `/core/list`, … — never trailing-slashed\n const name = nameMap.get(prefix)\n if (name) out.push({ name, to: prefix })\n }\n return out\n}\n\nfunction useNameMap(): Map<string, string> {\n const router = useRouter()\n return useMemo(\n () =>\n buildNameMap(\n Object.values(router.looseRoutesById).map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n })),\n ),\n [router],\n )\n}\n\n/**\n * The **breadcrumb** crumb label from a route's `staticData.breadcrumb`: a function is called with the route\n * `params`, a string is used as-is, nullish yields `undefined`. Pure, so it's unit-testable.\n */\nexport function resolveBreadcrumbLabel(\n breadcrumb: string | ((params: Record<string, string>) => ReactNode) | undefined,\n params: Record<string, string>,\n): ReactNode | undefined {\n if (breadcrumb == null) return undefined\n return typeof breadcrumb === 'function' ? breadcrumb(params) : breadcrumb\n}\n\n/**\n * The deepest matched route's **breadcrumb** crumb override (`staticData.breadcrumb`), resolved from the live\n * match chain with that route's `params`.\n */\nfunction useLeafBreadcrumb(): ReactNode | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const resolved = resolveBreadcrumbLabel(\n matches[i].staticData?.breadcrumb,\n (matches[i].params ?? {}) as Record<string, string>,\n )\n if (resolved) return resolved\n }\n return undefined\n}\n\n/** One breadcrumb. `to` is set only when the crumb points at a real, navigable menu page. */\nexport interface Breadcrumb {\n label: ReactNode\n to?: string\n}\n\n/** Every `to` that the menu actually navigates to (top links, group pages, leaves). */\nfunction navigablePaths(tree: { links: NavLeaf[]; modules: NavModule[] }): Set<string> {\n const set = new Set<string>()\n for (const link of tree.links) set.add(link.to)\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) set.add(group.to)\n for (const leaf of group.children ?? []) set.add(leaf.to)\n }\n return set\n}\n\n/**\n * Assemble the breadcrumb items from the resolved prefix names. A crumb links when it maps to a real\n * navigable page **and is not the current page itself** (`to === leafPath` — you're already there, so it\n * stays plain text); this is the key difference from a blanket \"last crumb is never a link\" — an\n * **ancestor** crumb (e.g. the parent list while you're on its detail child) keeps its link. `leafLabel`\n * (the leaf route's `staticData.breadcrumb`) overrides the current page's label when the leaf is itself a\n * named prefix, otherwise it's appended as the trailing current-page crumb. Pure, so it's unit-testable.\n */\nexport function buildBreadcrumbItems(\n resolved: Array<{ name: string; to: string }>,\n opts: { leafPath: string; leafLabel?: ReactNode; navigable: Set<string> },\n): Breadcrumb[] {\n const { leafPath, leafLabel, navigable } = opts\n const items: Breadcrumb[] = resolved.map(({ name, to }) => ({\n label: name,\n to: to !== leafPath && navigable.has(to) ? to : undefined,\n }))\n if (leafLabel) {\n if (resolved.length > 0 && resolved[resolved.length - 1].to === leafPath) {\n // the leaf is itself a named prefix (the current page) — its breadcrumb overrides the name\n items[items.length - 1] = { label: leafLabel }\n } else {\n // a dynamic / deeper leaf with no prefix name — its breadcrumb is the trailing current-page crumb\n items.push({ label: leafLabel })\n }\n }\n return items\n}\n\n/**\n * Breadcrumb trail for the current route, derived from the current pathname's **cumulative prefixes**\n * (via `resolvePathNames`) rather than the matched-route chain — so a dynamic/detail route (e.g.\n * `/core/list/$id`) still shows its named ancestors (Core › List) instead of collapsing to the nearest\n * named one. The current-page crumb label is the leaf route's **`staticData.breadcrumb`** (via\n * `useLeafBreadcrumb`), else its `name`: it overrides the leaf's own label when the leaf is a named prefix,\n * else it's appended as the trailing current-page crumb\n * (so a dynamic detail reads Core › List › <breadcrumb>). `homeTo` is the first allowed menu page (same\n * target as `FirstRouteRedirect`). A crumb links only when it maps to a real navigable page **and isn't\n * the current page** — so an ancestor crumb (the parent list while you're on its detail child) stays a\n * link, while the page you're already on is plain text.\n */\nexport function useBreadcrumbs(): { homeTo?: string; items: Breadcrumb[] } {\n const tree = useNavTree()\n const nameMap = useNameMap()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n const leafLabel = useLeafBreadcrumb()\n const homeTo = firstNavTo(tree)\n const items = buildBreadcrumbItems(resolvePathNames(pathname, nameMap), {\n leafPath: normalizePath(pathname),\n leafLabel,\n navigable: navigablePaths(tree),\n })\n return { homeTo, items }\n}\n\n/** Drop-in component for the `/` route: forwards to whatever sits FIRST in the menu. */\nexport function FirstRouteRedirect() {\n const to = useFirstNavTo()\n return to ? <Navigate to={to as LinkProps['to']} /> : null\n}\n\n/** Auto-generated navigation, derived from the routes' `staticData`. Rendered inside `RootLayout`. */\nexport function Sidebar() {\n const { items } = useNavTree()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n\n // Walk the unified order once. Consecutive standalone links share a single `<List>` (so their spacing\n // reads as one block); a module breaks the run and renders as its own labeled block. A module can thus\n // appear before / between / after the page links, wherever its `order` places it.\n const blocks: ReactNode[] = []\n let run: NavLeaf[] = []\n const flushRun = () => {\n if (run.length === 0) return\n const links = run\n run = []\n blocks.push(\n <List key={`links-${links[0].to}`}>\n {links.map((link) => (\n <NavLink\n key={link.to}\n as={Link}\n to={link.to}\n icon={link.icon}\n selected={isActivePath(pathname, link.to)}\n clickable\n trailing={navTrailing(link.badge, link.dot)}\n >\n {link.label}\n </NavLink>\n ))}\n </List>,\n )\n }\n for (const item of items) {\n if (item.kind === 'link') {\n run.push(item.link)\n continue\n }\n flushRun()\n const mod = item.module\n blocks.push(\n <div className={styles.module} key={`mod-${mod.module}`}>\n <Typography\n as=\"div\"\n variant=\"caption\"\n color=\"muted\"\n uppercase\n className={styles.moduleLabel}\n >\n {mod.module}\n </Typography>\n <List>\n {mod.groups.map((group) => (\n <NavGroupItem key={group.label} group={group} pathname={pathname} />\n ))}\n </List>\n </div>,\n )\n }\n flushRun()\n\n return <nav className={styles.nav}>{blocks}</nav>\n}\n\n/** A single searchable destination — a nav page flattened out of the tree, with a breadcrumb context. */\ninterface NavPage {\n label: string\n to: string\n /** Where it lives — e.g. `\"Components · Forms\"` — shown as the muted second line. */\n context?: string\n}\n\n/** Flatten the nav tree into every navigable page (top links + group pages + leaves). */\nfunction flattenPages(tree: { links: NavLeaf[]; modules: NavModule[] }): NavPage[] {\n const pages: NavPage[] = []\n for (const link of tree.links) pages.push({ label: link.label, to: link.to })\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) pages.push({ label: group.label, to: group.to, context: mod.module })\n for (const leaf of group.children ?? [])\n pages.push({\n label: leaf.label,\n to: leaf.to,\n context: `${mod.module} · ${group.label}`,\n })\n }\n return pages\n}\n\nconst MAX_SEARCH_RESULTS = 8\n\n/**\n * Header search over the sidebar's pages — type to filter the nav (by page name or its section) and\n * pick a suggestion to jump there. Data comes from the same `useNavTree` the sidebar uses (so it\n * respects RBAC). Keyboard: Up/Down move, Enter opens, Escape closes. Rendered by `RootLayout`'s header.\n */\nexport function NavSearch() {\n const t = useT()\n const tree = useNavTree()\n const navigate = useNavigate()\n const pages = useMemo(() => flattenPages(tree), [tree])\n\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return []\n return pages\n .filter(\n (p) => p.label.toLowerCase().includes(q) || (p.context?.toLowerCase().includes(q) ?? false),\n )\n .slice(0, MAX_SEARCH_RESULTS)\n }, [pages, query])\n\n const showList = open && results.length > 0\n\n // reset the highlighted row whenever the query changes\n useEffect(() => setActive(0), [query])\n\n // clamp the highlight if the result set shrinks without a query change (e.g. RBAC pages update)\n useEffect(() => {\n setActive((a) => (a > results.length - 1 ? Math.max(0, results.length - 1) : a))\n }, [results.length])\n\n // close the suggestions on an outside pointerdown\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onDown)\n return () => document.removeEventListener('pointerdown', onDown)\n }, [open])\n\n const go = (to: string) => {\n navigate({ to: to as LinkProps['to'] })\n setQuery('')\n setOpen(false)\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!showList) return\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActive((i) => (i + 1) % results.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActive((i) => (i - 1 + results.length) % results.length)\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const hit = results[active]\n if (hit) go(hit.to)\n } else if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div\n ref={rootRef}\n className={styles.search}\n role=\"combobox\"\n aria-expanded={showList}\n aria-haspopup=\"listbox\"\n >\n <TextField\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n adornment={<Icon name=\"SearchNormal\" />}\n placeholder={t('sidebar.searchPages')}\n aria-label={t('sidebar.searchPages')}\n autoComplete=\"off\"\n />\n {showList ? (\n <div className={styles.searchPanel}>\n <List role=\"listbox\">\n {results.map((page, i) => (\n <ListItem\n key={page.to}\n description={page.context}\n clickable\n selected={i === active}\n // keep the input focused through the click so blur doesn't close the list first\n onMouseDown={(event: MouseEvent) => event.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => go(page.to)}\n >\n {page.label}\n </ListItem>\n ))}\n </List>\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Is `to` the active nav target for `currentPath`? True on an **exact** match or when `currentPath` is a\n * **descendant** of `to` (so a parent row highlights for its child routes, e.g. `/core/page` stays active\n * on `/core/page/edit`). Trailing slashes are normalized on both sides (`/x/` === `/x`). The root `/`\n * matches **only exactly** — otherwise every route would count as its descendant.\n */\nexport function isActivePath(currentPath: string, to: string): boolean {\n const a = normalizePath(currentPath)\n const b = normalizePath(to)\n if (b === '/') return a === '/'\n return a === b || a.startsWith(b + '/')\n}\n\nfunction groupIsActive(group: NavGroup, pathname: string): boolean {\n if (group.to && isActivePath(pathname, group.to)) return true\n return group.children?.some((leaf) => isActivePath(pathname, leaf.to)) ?? false\n}\n\n/** A small \"New\"-style pill rendered on a menu row from `staticData.badge`. */\nfunction navBadge(text?: string) {\n return text ? <span className={styles.navBadge}>{text}</span> : null\n}\n\n/** A small colored dot indicator on a menu row from `staticData.dot`. */\nfunction navDot(color?: ThemeColor) {\n return color ? (\n <span className={styles.navDot} style={{ background: `var(--tz-color-${color})` }} />\n ) : null\n}\n\n/** The menu row's trailing slot: dot + badge + an optional chevron (omitted entirely when empty). */\nfunction navTrailing(badge?: string, dot?: ThemeColor, chevron?: ReactNode): ReactNode {\n if (badge == null && dot == null && chevron == null) return undefined\n return (\n <>\n {navBadge(badge)}\n {navDot(dot)}\n {chevron}\n </>\n )\n}\n\nfunction NavGroupItem({ group, pathname }: { group: NavGroup; pathname: string }) {\n const t = useT()\n const active = groupIsActive(group, pathname)\n const hasChildren = !!group.children?.length\n const [open, setOpen] = useState(active)\n\n // re-open when navigation makes this group active via a path the mount-time seed missed\n // (NavSearch, Breadcrumbs, back/forward) — collapsing an active group hides the current page\n useEffect(() => {\n if (active) setOpen(true)\n }, [active])\n\n // a plain level-2 page (no children) — just a link row\n if (!hasChildren && group.to) {\n return (\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n trailing={navTrailing(group.badge, group.dot)}\n >\n {group.label}\n </NavLink>\n )\n }\n\n const chevron = (\n <Icon\n name=\"ArrowDown4\"\n size=\"sm\"\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n )\n\n return (\n <>\n {hasChildren && group.to ? (\n // \"Case B\": the row navigates (and expands); a separate chevron only toggles.\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n onClick={() => setOpen(true)}\n trailing={navTrailing(\n group.badge,\n group.dot,\n <button\n type=\"button\"\n className={styles.chevronButton}\n aria-label={t(open ? 'sidebar.collapseGroup' : 'sidebar.expandGroup', {\n group: group.label,\n })}\n aria-expanded={open}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setOpen((o) => !o)\n }}\n >\n {chevron}\n </button>,\n )}\n >\n {group.label}\n </NavLink>\n ) : (\n // a pure container — the whole row toggles its children\n <ListItem\n icon={group.icon}\n selected={active}\n clickable\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n trailing={navTrailing(group.badge, group.dot, chevron)}\n >\n {group.label}\n </ListItem>\n )}\n {hasChildren ? (\n // smooth collapse, same grid-template-rows technique as Card\n <div className={clsx(styles.collapsible, !open && styles.collapsibleClosed)}>\n <div className={styles.collapsibleInner}>\n <List className={styles.leaves}>\n {group.children?.map((leaf) => (\n <NavLink\n key={leaf.to}\n as={Link}\n to={leaf.to}\n icon={<span className={styles.leafDot} />}\n selected={isActivePath(pathname, leaf.to)}\n size=\"md\"\n clickable\n trailing={navTrailing(leaf.badge, leaf.dot)}\n >\n {leaf.label}\n </NavLink>\n ))}\n </List>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n"],"names":["NavLink","ListItem","prettify","seg","w","trimSlashes","p","normalizePath","byOrderThenLabel","a","b","buildNavTree","routes","entries","route","sd","path","metaByPath","e","paths","isContainer","o","_a","rawFullPaths","r","groupHasOwnPage","groupKey","chrome","key","modules","getModule","mod","c","topLinks","name","segs","group","linkEntries","moduleEntries","g","l","items","i","useNavTree","router","useRouter","accessKeys","useAccessKeys","useMemo","hasAccess","firstNavTo","tree","item","firstChild","useFirstNavTo","buildNameMap","map","resolvePathNames","pathname","nameMap","out","prefix","useNameMap","resolveBreadcrumbLabel","breadcrumb","params","useLeafBreadcrumb","matches","useRouterState","s","resolved","navigablePaths","set","link","leaf","buildBreadcrumbItems","opts","leafPath","leafLabel","navigable","to","useBreadcrumbs","homeTo","FirstRouteRedirect","jsx","Navigate","Sidebar","blocks","run","flushRun","links","List","Link","isActivePath","navTrailing","jsxs","styles","Typography","NavGroupItem","flattenPages","pages","MAX_SEARCH_RESULTS","NavSearch","t","useT","navigate","useNavigate","query","setQuery","useState","open","setOpen","active","setActive","rootRef","useRef","results","q","showList","useEffect","onDown","event","go","onKeyDown","hit","TextField","Icon","page","currentPath","groupIsActive","navBadge","text","navDot","color","badge","dot","chevron","Fragment","hasChildren","clsx","_b"],"mappings":"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"}
1
+ {"version":3,"file":"Sidebar-DLlqHvQJ.cjs","sources":["../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport {\n Link,\n Navigate,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n type StaticDataRouteOption,\n} from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { List, ListItem, type ListItemProps } from '../List'\nimport { TextField } from '../TextField'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Typography } from '../Typography'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport styles from './Sidebar.module.css'\n\n// `ListItem` rendered as a TanStack `Link` — it forwards unrecognized props (like `to`) to the\n// element, so this typed alias lets us pass `to` while keeping `ListItem`'s look + behavior.\nconst NavLink = ListItem as unknown as (props: ListItemProps & { to: string }) => ReactNode\n\nexport type { IconName }\n\n// Typed `staticData` for consumers — every route describes its own menu entry.\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n /** Menu label. A route with no `name` never appears in the menu. */\n name?: string\n /**\n * Explicit **breadcrumb** crumb for **this** route — a string, or a **function of the route `params`**\n * (e.g. `breadcrumb: ({ id }) => \\`Order #${id}\\``), so a dynamic detail route that has no `name` still gets\n * its own crumb. The current-page crumb resolves `breadcrumb` → `name`. Does **not** affect the sidebar.\n * (The page's own heading, back button and title-row actions are `PageLayout` props — `pageTitle`,\n * `back`, `pageActions` — not route data.)\n */\n breadcrumb?: string | ((params: Record<string, string>) => ReactNode)\n /** Optional menu icon (the library's `IconName` union). */\n icon?: IconName\n /** Sort order within the parent (ascending); falls back to alphabetical. */\n order?: number\n /** Routed but hidden from the menu. */\n hidden?: boolean\n /** Allowed accessKeys (OR — user needs any one). Omitted/empty = public. */\n roles?: string[]\n /** Small text label (e.g. `\"New\"`) shown as a pill on the menu row. */\n badge?: string\n /** Theme color of a small dot indicator on the menu row (e.g. `\"error\"`). */\n dot?: ThemeColor\n }\n}\n\nexport interface NavLeaf {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n}\nexport interface NavGroup {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n children?: NavLeaf[]\n}\nexport interface NavModule {\n module: string\n icon?: IconName\n groups: NavGroup[]\n}\n/**\n * One **top-level** sidebar entry, in the unified order — either a standalone page `link` or a `module`.\n * Top links and modules share a single `staticData.order` scale, so a module can sit before, after, or\n * between the standalone page links (not always after them). Produced by `buildNavTree` as `items`.\n */\nexport type NavItem = { kind: 'link'; link: NavLeaf } | { kind: 'module'; module: NavModule }\n\nconst prettify = (seg: string) =>\n seg\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\nconst trimSlashes = (p: string) => p.replace(/^\\/+|\\/+$/g, '')\n/** Normalize a pathname for comparison — drop a single trailing slash (but keep the root `/`). */\nconst normalizePath = (p: string) => (p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p)\nconst byOrderThenLabel = (\n a: { order: number; label: string },\n b: { order: number; label: string },\n) => a.order - b.order || a.label.localeCompare(b.label)\n\ninterface LeafAcc {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n order: number\n}\ninterface GroupAcc {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n order: number\n leaves: LeafAcc[]\n isContainer: boolean\n}\ninterface ModuleAcc {\n label: string\n icon?: IconName\n order: number\n groups: Map<string, GroupAcc>\n}\n\n/** A single route, reduced to what the menu needs. */\nexport interface NavRoute {\n fullPath: string\n staticData?: StaticDataRouteOption\n}\n\n/**\n * Pure menu builder — derives the 3-level nav tree (module → group → page) from a flat route list.\n * Kept router-free so it's unit-testable; `useNavTree` feeds it the live routes.\n */\nexport function buildNavTree(routes: NavRoute[]): {\n items: NavItem[]\n links: NavLeaf[]\n modules: NavModule[]\n} {\n const entries: Array<{ path: string; name: string; sd: StaticDataRouteOption }> = []\n for (const route of routes) {\n const sd = route.staticData\n const path = trimSlashes(route.fullPath)\n if (!sd?.name || !path) continue\n entries.push({ path, name: sd.name, sd })\n }\n\n const metaByPath = new Map(entries.map((e) => [e.path, e]))\n const paths = entries.map((e) => e.path)\n // A path is a \"container\" only when it has a **non-hidden** descendant — a hidden child must not turn\n // its parent into a container (which would drop the parent's own row and, if every child is hidden,\n // make the whole parent vanish from the menu).\n const isContainer = (p: string) =>\n paths.some((o) => o !== p && o.startsWith(`${p}/`) && !metaByPath.get(o)?.sd.hidden)\n const rawFullPaths = new Set(routes.map((r) => r.fullPath))\n const groupHasOwnPage = (groupKey: string) => rawFullPaths.has(`/${groupKey}/`)\n\n const chrome = (key: string, seg: string) => {\n const e = metaByPath.get(key)\n return {\n label: e?.name ?? prettify(seg),\n icon: e?.sd.icon,\n badge: e?.sd.badge,\n dot: e?.sd.dot,\n order: e?.sd.order ?? Number.POSITIVE_INFINITY,\n }\n }\n\n const modules = new Map<string, ModuleAcc>()\n const getModule = (seg: string) => {\n let mod = modules.get(seg)\n if (!mod) {\n const c = chrome(seg, seg)\n mod = { label: c.label, icon: c.icon, order: c.order, groups: new Map() }\n modules.set(seg, mod)\n }\n return mod\n }\n\n const topLinks: LeafAcc[] = []\n for (const { path, name, sd } of entries) {\n const segs = path.split('/')\n // The menu is 3 levels deep by design (module → group → page). A path only counts as a\n // \"container\" (holds children instead of being its own row) at the module/group levels; a\n // depth-3+ route is always a leaf, so a named page with even-deeper children isn't dropped.\n // Routes deeper than 3 segments still appear — flattened as leaves under their depth-2 group\n // (their `to` stays correct) — the nav just can't nest beyond level 3.\n if ((segs.length <= 2 && isContainer(path)) || sd.hidden) continue\n if (segs.length === 1) {\n topLinks.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n continue\n }\n const mod = getModule(segs[0])\n if (segs.length === 2) {\n mod.groups.set(path, {\n label: name,\n icon: sd.icon,\n to: `/${path}`,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n leaves: [],\n isContainer: false,\n })\n } else {\n const groupKey = segs.slice(0, 2).join('/')\n let group = mod.groups.get(groupKey)\n if (!group) {\n const c = chrome(groupKey, segs[1])\n group = {\n label: c.label,\n icon: c.icon,\n badge: c.badge,\n dot: c.dot,\n order: c.order,\n to: groupHasOwnPage(groupKey) ? `/${groupKey}` : undefined,\n leaves: [],\n isContainer: true,\n }\n mod.groups.set(groupKey, group)\n }\n group.leaves.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n }\n }\n\n // Top-level entries — standalone page links AND modules — share ONE `order` scale, so a module can sit\n // before / after / between the page links (not always after them). Build an ordered union, then derive\n // `links` / `modules` as its order-preserving subsets (still used by search / breadcrumbs / firstNavTo).\n const linkEntries = topLinks.map((l) => ({\n order: l.order,\n label: l.label,\n item: {\n kind: 'link' as const,\n link: { label: l.label, to: l.to, icon: l.icon, badge: l.badge, dot: l.dot },\n },\n }))\n const moduleEntries = [...modules.values()].map((mod) => ({\n order: mod.order,\n label: mod.label,\n item: {\n kind: 'module' as const,\n module: {\n module: mod.label,\n icon: mod.icon,\n groups: [...mod.groups.values()].sort(byOrderThenLabel).map(\n (g): NavGroup => ({\n label: g.label,\n icon: g.icon,\n to: g.to,\n badge: g.badge,\n dot: g.dot,\n children: g.isContainer\n ? g.leaves.sort(byOrderThenLabel).map((l) => ({\n label: l.label,\n to: l.to,\n icon: l.icon,\n badge: l.badge,\n dot: l.dot,\n }))\n : undefined,\n }),\n ),\n } satisfies NavModule,\n },\n }))\n const items: NavItem[] = [...linkEntries, ...moduleEntries]\n .sort(byOrderThenLabel)\n .map((e) => e.item)\n\n return {\n items,\n links: items.flatMap((i) => (i.kind === 'link' ? [i.link] : [])),\n modules: items.flatMap((i) => (i.kind === 'module' ? [i.module] : [])),\n }\n}\n\nfunction useNavTree(): { items: NavItem[]; links: NavLeaf[]; modules: NavModule[] } {\n const router = useRouter()\n const accessKeys = useAccessKeys() // re-render the menu when the user's roles change (login/logout)\n return useMemo(\n () =>\n buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n }))\n // Drop pages the current user can't access — empty groups/modules then vanish on their own.\n .filter((route) => hasAccess(route.staticData?.roles)),\n ),\n [router, accessKeys],\n )\n}\n\n/**\n * The first menu destination, following the **unified top-level order** (`items`) — so a module ordered\n * ahead of the page links wins. A link resolves to itself; a module to its first group page / leaf. Used\n * by `FirstRouteRedirect`.\n */\nexport function firstNavTo(tree: { items: NavItem[] }): string | undefined {\n for (const item of tree.items) {\n if (item.kind === 'link') return item.link.to\n for (const group of item.module.groups) {\n if (group.to) return group.to\n const firstChild = group.children?.[0]\n if (firstChild) return firstChild.to\n }\n }\n return undefined\n}\n\n/** The first page in the menu the user may open (the shell's \"home\": the logo link + `FirstRouteRedirect`). */\nexport function useFirstNavTo() {\n return firstNavTo(useNavTree())\n}\n\n/**\n * A `normalized fullPath → staticData.name` map from **all** routes (index routes included), the same\n * route source the `Sidebar` walks. The key drops a single trailing slash (`/core/list/` → `/core/list`),\n * so a list's **index route** (which carries the name) resolves under the plain path too. A named route\n * never loses its slot to an unnamed one. Pure + router-free, so it's unit-testable.\n */\nexport function buildNameMap(routes: NavRoute[]): Map<string, string> {\n const map = new Map<string, string>()\n for (const route of routes) {\n const name = route.staticData?.name\n if (!name) continue\n const key = normalizePath(route.fullPath)\n if (!map.has(key)) map.set(key, name)\n }\n return map\n}\n\n/**\n * Resolve a pathname's name crumbs from its **cumulative path prefixes** (not the matched-route chain),\n * so a dynamic/detail leaf (e.g. `/core/list/$id`) inherits its named ancestors. Each prefix is looked\n * up in `nameMap` (trailing slashes already normalized on both sides); a prefix with no name is simply\n * **skipped** — it never breaks the chain. Returns the recognized crumbs in order, each with its `to`.\n */\nexport function resolvePathNames(\n pathname: string,\n nameMap: Map<string, string>,\n): Array<{ name: string; to: string }> {\n const out: Array<{ name: string; to: string }> = []\n let prefix = ''\n for (const seg of trimSlashes(pathname).split('/').filter(Boolean)) {\n prefix += `/${seg}` // accumulates `/core`, `/core/list`, … — never trailing-slashed\n const name = nameMap.get(prefix)\n if (name) out.push({ name, to: prefix })\n }\n return out\n}\n\nfunction useNameMap(): Map<string, string> {\n const router = useRouter()\n return useMemo(\n () =>\n buildNameMap(\n Object.values(router.looseRoutesById).map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n })),\n ),\n [router],\n )\n}\n\n/**\n * The **breadcrumb** crumb label from a route's `staticData.breadcrumb`: a function is called with the route\n * `params`, a string is used as-is, nullish yields `undefined`. Pure, so it's unit-testable.\n */\nexport function resolveBreadcrumbLabel(\n breadcrumb: string | ((params: Record<string, string>) => ReactNode) | undefined,\n params: Record<string, string>,\n): ReactNode | undefined {\n if (breadcrumb == null) return undefined\n return typeof breadcrumb === 'function' ? breadcrumb(params) : breadcrumb\n}\n\n/**\n * The deepest matched route's **breadcrumb** crumb override (`staticData.breadcrumb`), resolved from the live\n * match chain with that route's `params`.\n */\nfunction useLeafBreadcrumb(): ReactNode | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const resolved = resolveBreadcrumbLabel(\n matches[i].staticData?.breadcrumb,\n (matches[i].params ?? {}) as Record<string, string>,\n )\n if (resolved) return resolved\n }\n return undefined\n}\n\n/** One breadcrumb. `to` is set only when the crumb points at a real, navigable menu page. */\nexport interface Breadcrumb {\n label: ReactNode\n to?: string\n}\n\n/** Every `to` that the menu actually navigates to (top links, group pages, leaves). */\nfunction navigablePaths(tree: { links: NavLeaf[]; modules: NavModule[] }): Set<string> {\n const set = new Set<string>()\n for (const link of tree.links) set.add(link.to)\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) set.add(group.to)\n for (const leaf of group.children ?? []) set.add(leaf.to)\n }\n return set\n}\n\n/**\n * Assemble the breadcrumb items from the resolved prefix names. A crumb links when it maps to a real\n * navigable page **and is not the current page itself** (`to === leafPath` — you're already there, so it\n * stays plain text); this is the key difference from a blanket \"last crumb is never a link\" — an\n * **ancestor** crumb (e.g. the parent list while you're on its detail child) keeps its link. `leafLabel`\n * (the leaf route's `staticData.breadcrumb`) overrides the current page's label when the leaf is itself a\n * named prefix, otherwise it's appended as the trailing current-page crumb. Pure, so it's unit-testable.\n */\nexport function buildBreadcrumbItems(\n resolved: Array<{ name: string; to: string }>,\n opts: { leafPath: string; leafLabel?: ReactNode; navigable: Set<string> },\n): Breadcrumb[] {\n const { leafPath, leafLabel, navigable } = opts\n const items: Breadcrumb[] = resolved.map(({ name, to }) => ({\n label: name,\n to: to !== leafPath && navigable.has(to) ? to : undefined,\n }))\n if (leafLabel) {\n if (resolved.length > 0 && resolved[resolved.length - 1].to === leafPath) {\n // the leaf is itself a named prefix (the current page) — its breadcrumb overrides the name\n items[items.length - 1] = { label: leafLabel }\n } else {\n // a dynamic / deeper leaf with no prefix name — its breadcrumb is the trailing current-page crumb\n items.push({ label: leafLabel })\n }\n }\n return items\n}\n\n/**\n * Breadcrumb trail for the current route, derived from the current pathname's **cumulative prefixes**\n * (via `resolvePathNames`) rather than the matched-route chain — so a dynamic/detail route (e.g.\n * `/core/list/$id`) still shows its named ancestors (Core › List) instead of collapsing to the nearest\n * named one. The current-page crumb label is the leaf route's **`staticData.breadcrumb`** (via\n * `useLeafBreadcrumb`), else its `name`: it overrides the leaf's own label when the leaf is a named prefix,\n * else it's appended as the trailing current-page crumb\n * (so a dynamic detail reads Core › List › <breadcrumb>). `homeTo` is the first allowed menu page (same\n * target as `FirstRouteRedirect`). A crumb links only when it maps to a real navigable page **and isn't\n * the current page** — so an ancestor crumb (the parent list while you're on its detail child) stays a\n * link, while the page you're already on is plain text.\n */\nexport function useBreadcrumbs(): { homeTo?: string; items: Breadcrumb[] } {\n const tree = useNavTree()\n const nameMap = useNameMap()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n const leafLabel = useLeafBreadcrumb()\n const homeTo = firstNavTo(tree)\n const items = buildBreadcrumbItems(resolvePathNames(pathname, nameMap), {\n leafPath: normalizePath(pathname),\n leafLabel,\n navigable: navigablePaths(tree),\n })\n return { homeTo, items }\n}\n\n/** Drop-in component for the `/` route: forwards to whatever sits FIRST in the menu. */\nexport function FirstRouteRedirect() {\n const to = useFirstNavTo()\n return to ? <Navigate to={to as LinkProps['to']} /> : null\n}\n\n/** Auto-generated navigation, derived from the routes' `staticData`. Rendered inside `RootLayout`. */\nexport function Sidebar() {\n const { items } = useNavTree()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n\n // Walk the unified order once. Consecutive standalone links share a single `<List>` (so their spacing\n // reads as one block); a module breaks the run and renders as its own labeled block. A module can thus\n // appear before / between / after the page links, wherever its `order` places it.\n const blocks: ReactNode[] = []\n let run: NavLeaf[] = []\n const flushRun = () => {\n if (run.length === 0) return\n const links = run\n run = []\n blocks.push(\n <List key={`links-${links[0].to}`}>\n {links.map((link) => (\n <NavLink\n key={link.to}\n as={Link}\n to={link.to}\n icon={link.icon}\n selected={isActivePath(pathname, link.to)}\n clickable\n trailing={navTrailing(link.badge, link.dot)}\n >\n {link.label}\n </NavLink>\n ))}\n </List>,\n )\n }\n for (const item of items) {\n if (item.kind === 'link') {\n run.push(item.link)\n continue\n }\n flushRun()\n const mod = item.module\n blocks.push(\n <div className={styles.module} key={`mod-${mod.module}`}>\n <Typography\n as=\"div\"\n variant=\"caption\"\n color=\"muted\"\n uppercase\n className={styles.moduleLabel}\n >\n {mod.module}\n </Typography>\n <List>\n {mod.groups.map((group) => (\n <NavGroupItem key={group.label} group={group} pathname={pathname} />\n ))}\n </List>\n </div>,\n )\n }\n flushRun()\n\n return <nav className={styles.nav}>{blocks}</nav>\n}\n\n/** A single searchable destination — a nav page flattened out of the tree, with a breadcrumb context. */\ninterface NavPage {\n label: string\n to: string\n /** Where it lives — e.g. `\"Components · Forms\"` — shown as the muted second line. */\n context?: string\n}\n\n/** Flatten the nav tree into every navigable page (top links + group pages + leaves). */\nfunction flattenPages(tree: { links: NavLeaf[]; modules: NavModule[] }): NavPage[] {\n const pages: NavPage[] = []\n for (const link of tree.links) pages.push({ label: link.label, to: link.to })\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) pages.push({ label: group.label, to: group.to, context: mod.module })\n for (const leaf of group.children ?? [])\n pages.push({\n label: leaf.label,\n to: leaf.to,\n context: `${mod.module} · ${group.label}`,\n })\n }\n return pages\n}\n\nconst MAX_SEARCH_RESULTS = 8\n\n/**\n * Header search over the sidebar's pages — type to filter the nav (by page name or its section) and\n * pick a suggestion to jump there. Data comes from the same `useNavTree` the sidebar uses (so it\n * respects RBAC). Keyboard: Up/Down move, Enter opens, Escape closes. Rendered by `RootLayout`'s header.\n */\nexport function NavSearch() {\n const t = useT()\n const tree = useNavTree()\n const navigate = useNavigate()\n const pages = useMemo(() => flattenPages(tree), [tree])\n\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return []\n return pages\n .filter(\n (p) => p.label.toLowerCase().includes(q) || (p.context?.toLowerCase().includes(q) ?? false),\n )\n .slice(0, MAX_SEARCH_RESULTS)\n }, [pages, query])\n\n const showList = open && results.length > 0\n\n // reset the highlighted row whenever the query changes\n useEffect(() => setActive(0), [query])\n\n // clamp the highlight if the result set shrinks without a query change (e.g. RBAC pages update)\n useEffect(() => {\n setActive((a) => (a > results.length - 1 ? Math.max(0, results.length - 1) : a))\n }, [results.length])\n\n // close the suggestions on an outside pointerdown\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onDown)\n return () => document.removeEventListener('pointerdown', onDown)\n }, [open])\n\n const go = (to: string) => {\n navigate({ to: to as LinkProps['to'] })\n setQuery('')\n setOpen(false)\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!showList) return\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActive((i) => (i + 1) % results.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActive((i) => (i - 1 + results.length) % results.length)\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const hit = results[active]\n if (hit) go(hit.to)\n } else if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div\n ref={rootRef}\n className={styles.search}\n role=\"combobox\"\n aria-expanded={showList}\n aria-haspopup=\"listbox\"\n >\n <TextField\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n adornment={<Icon name=\"SearchNormal\" />}\n placeholder={t('sidebar.searchPages')}\n aria-label={t('sidebar.searchPages')}\n autoComplete=\"off\"\n />\n {showList ? (\n <div className={styles.searchPanel}>\n <List role=\"listbox\">\n {results.map((page, i) => (\n <ListItem\n key={page.to}\n description={page.context}\n clickable\n selected={i === active}\n // keep the input focused through the click so blur doesn't close the list first\n onMouseDown={(event: MouseEvent) => event.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => go(page.to)}\n >\n {page.label}\n </ListItem>\n ))}\n </List>\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Is `to` the active nav target for `currentPath`? True on an **exact** match or when `currentPath` is a\n * **descendant** of `to` (so a parent row highlights for its child routes, e.g. `/core/page` stays active\n * on `/core/page/edit`). Trailing slashes are normalized on both sides (`/x/` === `/x`). The root `/`\n * matches **only exactly** — otherwise every route would count as its descendant.\n */\nexport function isActivePath(currentPath: string, to: string): boolean {\n const a = normalizePath(currentPath)\n const b = normalizePath(to)\n if (b === '/') return a === '/'\n return a === b || a.startsWith(b + '/')\n}\n\nfunction groupIsActive(group: NavGroup, pathname: string): boolean {\n if (group.to && isActivePath(pathname, group.to)) return true\n return group.children?.some((leaf) => isActivePath(pathname, leaf.to)) ?? false\n}\n\n/** A small \"New\"-style pill rendered on a menu row from `staticData.badge`. */\nfunction navBadge(text?: string) {\n return text ? <span className={styles.navBadge}>{text}</span> : null\n}\n\n/** A small colored dot indicator on a menu row from `staticData.dot`. */\nfunction navDot(color?: ThemeColor) {\n return color ? (\n <span className={styles.navDot} style={{ background: `var(--tz-color-${color})` }} />\n ) : null\n}\n\n/** The menu row's trailing slot: dot + badge + an optional chevron (omitted entirely when empty). */\nfunction navTrailing(badge?: string, dot?: ThemeColor, chevron?: ReactNode): ReactNode {\n if (badge == null && dot == null && chevron == null) return undefined\n return (\n <>\n {navBadge(badge)}\n {navDot(dot)}\n {chevron}\n </>\n )\n}\n\nfunction NavGroupItem({ group, pathname }: { group: NavGroup; pathname: string }) {\n const t = useT()\n const active = groupIsActive(group, pathname)\n const hasChildren = !!group.children?.length\n const [open, setOpen] = useState(active)\n\n // re-open when navigation makes this group active via a path the mount-time seed missed\n // (NavSearch, Breadcrumbs, back/forward) — collapsing an active group hides the current page\n useEffect(() => {\n if (active) setOpen(true)\n }, [active])\n\n // a plain level-2 page (no children) — just a link row\n if (!hasChildren && group.to) {\n return (\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n trailing={navTrailing(group.badge, group.dot)}\n >\n {group.label}\n </NavLink>\n )\n }\n\n const chevron = (\n <Icon\n name=\"ArrowDown4\"\n size=\"sm\"\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n )\n\n return (\n <>\n {hasChildren && group.to ? (\n // \"Case B\": the row navigates (and expands); a separate chevron only toggles.\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n onClick={() => setOpen(true)}\n trailing={navTrailing(\n group.badge,\n group.dot,\n <button\n type=\"button\"\n className={styles.chevronButton}\n aria-label={t(open ? 'sidebar.collapseGroup' : 'sidebar.expandGroup', {\n group: group.label,\n })}\n aria-expanded={open}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setOpen((o) => !o)\n }}\n >\n {chevron}\n </button>,\n )}\n >\n {group.label}\n </NavLink>\n ) : (\n // a pure container — the whole row toggles its children\n <ListItem\n icon={group.icon}\n selected={active}\n clickable\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n trailing={navTrailing(group.badge, group.dot, chevron)}\n >\n {group.label}\n </ListItem>\n )}\n {hasChildren ? (\n // smooth collapse, same grid-template-rows technique as Card\n <div className={clsx(styles.collapsible, !open && styles.collapsibleClosed)}>\n <div className={styles.collapsibleInner}>\n <List className={styles.leaves}>\n {group.children?.map((leaf) => (\n <NavLink\n key={leaf.to}\n as={Link}\n to={leaf.to}\n icon={<span className={styles.leafDot} />}\n selected={isActivePath(pathname, leaf.to)}\n size=\"md\"\n clickable\n trailing={navTrailing(leaf.badge, leaf.dot)}\n >\n {leaf.label}\n </NavLink>\n ))}\n </List>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n"],"names":["NavLink","ListItem","prettify","seg","w","trimSlashes","p","normalizePath","byOrderThenLabel","a","b","buildNavTree","routes","entries","route","sd","path","metaByPath","e","paths","isContainer","o","_a","rawFullPaths","r","groupHasOwnPage","groupKey","chrome","key","modules","getModule","mod","c","topLinks","name","segs","group","linkEntries","moduleEntries","g","l","items","i","useNavTree","router","useRouter","accessKeys","useAccessKeys","useMemo","hasAccess","firstNavTo","tree","item","firstChild","useFirstNavTo","buildNameMap","map","resolvePathNames","pathname","nameMap","out","prefix","useNameMap","resolveBreadcrumbLabel","breadcrumb","params","useLeafBreadcrumb","matches","useRouterState","s","resolved","navigablePaths","set","link","leaf","buildBreadcrumbItems","opts","leafPath","leafLabel","navigable","to","useBreadcrumbs","homeTo","FirstRouteRedirect","jsx","Navigate","Sidebar","blocks","run","flushRun","links","List","Link","isActivePath","navTrailing","jsxs","styles","Typography","NavGroupItem","flattenPages","pages","MAX_SEARCH_RESULTS","NavSearch","t","useT","navigate","useNavigate","query","setQuery","useState","open","setOpen","active","setActive","rootRef","useRef","results","q","showList","useEffect","onDown","event","go","onKeyDown","hit","TextField","Icon","page","currentPath","groupIsActive","navBadge","text","navDot","color","badge","dot","chevron","Fragment","hasChildren","clsx","_b"],"mappings":"s4BA+BMA,EAAUC,EAAAA,SA2DVC,GAAYC,GAChBA,EACG,MAAM,GAAG,EACT,IAAKC,GAAMA,EAAE,OAAO,CAAC,EAAE,cAAgBA,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,GAAG,EACPC,EAAeC,GAAcA,EAAE,QAAQ,aAAc,EAAE,EAEvDC,EAAiBD,GAAeA,EAAE,OAAS,GAAKA,EAAE,SAAS,GAAG,EAAIA,EAAE,MAAM,EAAG,EAAE,EAAIA,EACnFE,EAAmB,CACvBC,EACAC,IACGD,EAAE,MAAQC,EAAE,OAASD,EAAE,MAAM,cAAcC,EAAE,KAAK,EAqChD,SAASC,EAAaC,EAI3B,CACA,MAAMC,EAA4E,CAAA,EAClF,UAAWC,KAASF,EAAQ,CAC1B,MAAMG,EAAKD,EAAM,WACXE,EAAOX,EAAYS,EAAM,QAAQ,EACnC,EAACC,GAAA,MAAAA,EAAI,OAAQ,CAACC,GAClBH,EAAQ,KAAK,CAAE,KAAAG,EAAM,KAAMD,EAAG,KAAM,GAAAA,EAAI,CAC1C,CAEA,MAAME,EAAa,IAAI,IAAIJ,EAAQ,IAAKK,GAAM,CAACA,EAAE,KAAMA,CAAC,CAAC,CAAC,EACpDC,EAAQN,EAAQ,IAAKK,GAAMA,EAAE,IAAI,EAIjCE,EAAed,GACnBa,EAAM,KAAME,GAAA,OAAM,OAAAA,IAAMf,GAAKe,EAAE,WAAW,GAAGf,CAAC,GAAG,GAAK,GAACgB,EAAAL,EAAW,IAAII,CAAC,IAAhB,MAAAC,EAAmB,GAAG,QAAM,EAC/EC,EAAe,IAAI,IAAIX,EAAO,IAAKY,GAAMA,EAAE,QAAQ,CAAC,EACpDC,EAAmBC,GAAqBH,EAAa,IAAI,IAAIG,CAAQ,GAAG,EAExEC,EAAS,CAACC,EAAazB,IAAgB,CAC3C,MAAMe,EAAID,EAAW,IAAIW,CAAG,EAC5B,MAAO,CACL,OAAOV,GAAA,YAAAA,EAAG,OAAQhB,GAASC,CAAG,EAC9B,KAAMe,GAAA,YAAAA,EAAG,GAAG,KACZ,MAAOA,GAAA,YAAAA,EAAG,GAAG,MACb,IAAKA,GAAA,YAAAA,EAAG,GAAG,IACX,OAAOA,GAAA,YAAAA,EAAG,GAAG,QAAS,OAAO,iBAAA,CAEjC,EAEMW,MAAc,IACdC,EAAa3B,GAAgB,CACjC,IAAI4B,EAAMF,EAAQ,IAAI1B,CAAG,EACzB,GAAI,CAAC4B,EAAK,CACR,MAAMC,EAAIL,EAAOxB,EAAKA,CAAG,EACzB4B,EAAM,CAAE,MAAOC,EAAE,MAAO,KAAMA,EAAE,KAAM,MAAOA,EAAE,MAAO,OAAQ,IAAI,GAAI,EACtEH,EAAQ,IAAI1B,EAAK4B,CAAG,CACtB,CACA,OAAOA,CACT,EAEME,EAAsB,CAAA,EAC5B,SAAW,CAAE,KAAAjB,EAAM,KAAAkB,EAAM,GAAAnB,CAAA,IAAQF,EAAS,CACxC,MAAMsB,EAAOnB,EAAK,MAAM,GAAG,EAM3B,GAAKmB,EAAK,QAAU,GAAKf,EAAYJ,CAAI,GAAMD,EAAG,OAAQ,SAC1D,GAAIoB,EAAK,SAAW,EAAG,CACrBF,EAAS,KAAK,CACZ,MAAOC,EACP,GAAI,IAAIlB,CAAI,GACZ,KAAMD,EAAG,KACT,MAAOA,EAAG,MACV,IAAKA,EAAG,IACR,MAAOA,EAAG,OAAS,OAAO,iBAAA,CAC3B,EACD,QACF,CACA,MAAMgB,EAAMD,EAAUK,EAAK,CAAC,CAAC,EAC7B,GAAIA,EAAK,SAAW,EAClBJ,EAAI,OAAO,IAAIf,EAAM,CACnB,MAAOkB,EACP,KAAMnB,EAAG,KACT,GAAI,IAAIC,CAAI,GACZ,MAAOD,EAAG,MACV,IAAKA,EAAG,IACR,MAAOA,EAAG,OAAS,OAAO,kBAC1B,OAAQ,CAAA,EACR,YAAa,EAAA,CACd,MACI,CACL,MAAMW,EAAWS,EAAK,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAC1C,IAAIC,EAAQL,EAAI,OAAO,IAAIL,CAAQ,EACnC,GAAI,CAACU,EAAO,CACV,MAAMJ,EAAIL,EAAOD,EAAUS,EAAK,CAAC,CAAC,EAClCC,EAAQ,CACN,MAAOJ,EAAE,MACT,KAAMA,EAAE,KACR,MAAOA,EAAE,MACT,IAAKA,EAAE,IACP,MAAOA,EAAE,MACT,GAAIP,EAAgBC,CAAQ,EAAI,IAAIA,CAAQ,GAAK,OACjD,OAAQ,CAAA,EACR,YAAa,EAAA,EAEfK,EAAI,OAAO,IAAIL,EAAUU,CAAK,CAChC,CACAA,EAAM,OAAO,KAAK,CAChB,MAAOF,EACP,GAAI,IAAIlB,CAAI,GACZ,KAAMD,EAAG,KACT,MAAOA,EAAG,MACV,IAAKA,EAAG,IACR,MAAOA,EAAG,OAAS,OAAO,iBAAA,CAC3B,CACH,CACF,CAKA,MAAMsB,EAAcJ,EAAS,IAAK,IAAO,CACvC,MAAO,EAAE,MACT,MAAO,EAAE,MACT,KAAM,CACJ,KAAM,OACN,KAAM,CAAE,MAAO,EAAE,MAAO,GAAI,EAAE,GAAI,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,IAAK,EAAE,GAAA,CAAI,CAC7E,EACA,EACIK,EAAgB,CAAC,GAAGT,EAAQ,QAAQ,EAAE,IAAKE,IAAS,CACxD,MAAOA,EAAI,MACX,MAAOA,EAAI,MACX,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,OAAQA,EAAI,MACZ,KAAMA,EAAI,KACV,OAAQ,CAAC,GAAGA,EAAI,OAAO,QAAQ,EAAE,KAAKvB,CAAgB,EAAE,IACrD+B,IAAiB,CAChB,MAAOA,EAAE,MACT,KAAMA,EAAE,KACR,GAAIA,EAAE,GACN,MAAOA,EAAE,MACT,IAAKA,EAAE,IACP,SAAUA,EAAE,YACRA,EAAE,OAAO,KAAK/B,CAAgB,EAAE,IAAKgC,IAAO,CAC1C,MAAOA,EAAE,MACT,GAAIA,EAAE,GACN,KAAMA,EAAE,KACR,MAAOA,EAAE,MACT,IAAKA,EAAE,GAAA,EACP,EACF,MAAA,EACN,CACF,CACF,CACF,EACA,EACIC,EAAmB,CAAC,GAAGJ,EAAa,GAAGC,CAAa,EACvD,KAAK9B,CAAgB,EACrB,IAAKU,GAAMA,EAAE,IAAI,EAEpB,MAAO,CACL,MAAAuB,EACA,MAAOA,EAAM,QAASC,GAAOA,EAAE,OAAS,OAAS,CAACA,EAAE,IAAI,EAAI,CAAA,CAAG,EAC/D,QAASD,EAAM,QAASC,GAAOA,EAAE,OAAS,SAAW,CAACA,EAAE,MAAM,EAAI,CAAA,CAAG,CAAA,CAEzE,CAEA,SAASC,GAA2E,CAClF,MAAMC,EAASC,EAAAA,UAAA,EACTC,EAAaC,EAAAA,cAAA,EACnB,OAAOC,EAAAA,QACL,IACErC,EACE,OAAO,OAAOiC,EAAO,eAAe,EACjC,IAAK9B,GAAA,OAAW,OACf,SAAUA,EAAM,SAChB,YAAYQ,EAAAR,EAAM,UAAN,YAAAQ,EAAe,UAAA,EAC3B,EAED,OAAQR,UAAUmC,OAAAA,EAAAA,WAAU3B,EAAAR,EAAM,aAAN,YAAAQ,EAAkB,KAAK,EAAC,CAAA,EAE3D,CAACsB,EAAQE,CAAU,CAAA,CAEvB,CAOO,SAASI,EAAWC,EAAgD,OACzE,UAAWC,KAAQD,EAAK,MAAO,CAC7B,GAAIC,EAAK,OAAS,OAAQ,OAAOA,EAAK,KAAK,GAC3C,UAAWhB,KAASgB,EAAK,OAAO,OAAQ,CACtC,GAAIhB,EAAM,GAAI,OAAOA,EAAM,GAC3B,MAAMiB,GAAa/B,EAAAc,EAAM,WAAN,YAAAd,EAAiB,GACpC,GAAI+B,SAAmBA,EAAW,EACpC,CACF,CAEF,CAGO,SAASC,GAAgB,CAC9B,OAAOJ,EAAWP,GAAY,CAChC,CAQO,SAASY,GAAa3C,EAAyC,OACpE,MAAM4C,MAAU,IAChB,UAAW1C,KAASF,EAAQ,CAC1B,MAAMsB,GAAOZ,EAAAR,EAAM,aAAN,YAAAQ,EAAkB,KAC/B,GAAI,CAACY,EAAM,SACX,MAAMN,EAAMrB,EAAcO,EAAM,QAAQ,EACnC0C,EAAI,IAAI5B,CAAG,GAAG4B,EAAI,IAAI5B,EAAKM,CAAI,CACtC,CACA,OAAOsB,CACT,CAQO,SAASC,GACdC,EACAC,EACqC,CACrC,MAAMC,EAA2C,CAAA,EACjD,IAAIC,EAAS,GACb,UAAW1D,KAAOE,EAAYqD,CAAQ,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAG,CAClEG,GAAU,IAAI1D,CAAG,GACjB,MAAM+B,EAAOyB,EAAQ,IAAIE,CAAM,EAC3B3B,GAAM0B,EAAI,KAAK,CAAE,KAAA1B,EAAM,GAAI2B,EAAQ,CACzC,CACA,OAAOD,CACT,CAEA,SAASE,IAAkC,CACzC,MAAMlB,EAASC,EAAAA,UAAA,EACf,OAAOG,EAAAA,QACL,IACEO,GACE,OAAO,OAAOX,EAAO,eAAe,EAAE,IAAK9B,GAAA,OAAW,OACpD,SAAUA,EAAM,SAChB,YAAYQ,EAAAR,EAAM,UAAN,YAAAQ,EAAe,UAAA,EAC3B,CAAA,EAEN,CAACsB,CAAM,CAAA,CAEX,CAMO,SAASmB,GACdC,EACAC,EACuB,CACvB,GAAID,GAAc,KAClB,OAAO,OAAOA,GAAe,WAAaA,EAAWC,CAAM,EAAID,CACjE,CAMA,SAASE,IAA2C,OAClD,MAAMC,EAAUC,EAAAA,eAAe,CAAE,OAASC,GAAMA,EAAE,QAAS,EAC3D,QAAS3B,EAAIyB,EAAQ,OAAS,EAAGzB,GAAK,EAAGA,IAAK,CAC5C,MAAM4B,EAAWP,IACfzC,EAAA6C,EAAQzB,CAAC,EAAE,aAAX,YAAApB,EAAuB,WACtB6C,EAAQzB,CAAC,EAAE,QAAU,CAAA,CAAC,EAEzB,GAAI4B,EAAU,OAAOA,CACvB,CAEF,CASA,SAASC,GAAepB,EAA+D,CACrF,MAAMqB,MAAU,IAChB,UAAWC,KAAQtB,EAAK,MAAOqB,EAAI,IAAIC,EAAK,EAAE,EAC9C,UAAW1C,KAAOoB,EAAK,QACrB,UAAWf,KAASL,EAAI,OAAQ,CAC1BK,EAAM,IAAIoC,EAAI,IAAIpC,EAAM,EAAE,EAC9B,UAAWsC,KAAQtC,EAAM,UAAY,CAAA,EAAIoC,EAAI,IAAIE,EAAK,EAAE,CAC1D,CACF,OAAOF,CACT,CAUO,SAASG,GACdL,EACAM,EACc,CACd,KAAM,CAAE,SAAAC,EAAU,UAAAC,EAAW,UAAAC,CAAA,EAAcH,EACrCnC,EAAsB6B,EAAS,IAAI,CAAC,CAAE,KAAApC,EAAM,GAAA8C,MAAU,CAC1D,MAAO9C,EACP,GAAI8C,IAAOH,GAAYE,EAAU,IAAIC,CAAE,EAAIA,EAAK,MAAA,EAChD,EACF,OAAIF,IACER,EAAS,OAAS,GAAKA,EAASA,EAAS,OAAS,CAAC,EAAE,KAAOO,EAE9DpC,EAAMA,EAAM,OAAS,CAAC,EAAI,CAAE,MAAOqC,CAAA,EAGnCrC,EAAM,KAAK,CAAE,MAAOqC,CAAA,CAAW,GAG5BrC,CACT,CAcO,SAASwC,IAA2D,CACzE,MAAM9B,EAAOR,EAAA,EACPgB,EAAUG,GAAA,EACVJ,EAAWU,EAAAA,eAAe,CAAE,OAASC,GAAMA,EAAE,SAAS,SAAU,EAChES,EAAYZ,GAAA,EACZgB,EAAShC,EAAWC,CAAI,EACxBV,EAAQkC,GAAqBlB,GAAiBC,EAAUC,CAAO,EAAG,CACtE,SAAUpD,EAAcmD,CAAQ,EAChC,UAAAoB,EACA,UAAWP,GAAepB,CAAI,CAAA,CAC/B,EACD,MAAO,CAAE,OAAA+B,EAAQ,MAAAzC,CAAA,CACnB,CAGO,SAAS0C,IAAqB,CACnC,MAAMH,EAAK1B,EAAA,EACX,OAAO0B,EAAKI,EAAAA,IAACC,EAAAA,SAAA,CAAS,GAAAL,CAAA,CAA2B,EAAK,IACxD,CAGO,SAASM,IAAU,CACxB,KAAM,CAAE,MAAA7C,CAAA,EAAUE,EAAA,EACZe,EAAWU,EAAAA,eAAe,CAAE,OAASC,GAAMA,EAAE,SAAS,SAAU,EAKhEkB,EAAsB,CAAA,EAC5B,IAAIC,EAAiB,CAAA,EACrB,MAAMC,EAAW,IAAM,CACrB,GAAID,EAAI,SAAW,EAAG,OACtB,MAAME,EAAQF,EACdA,EAAM,CAAA,EACND,EAAO,KACLH,EAAAA,IAACO,EAAAA,KAAA,CACE,SAAAD,EAAM,IAAKjB,GACVW,EAAAA,IAACpF,EAAA,CAEC,GAAI4F,EAAAA,KACJ,GAAInB,EAAK,GACT,KAAMA,EAAK,KACX,SAAUoB,EAAanC,EAAUe,EAAK,EAAE,EACxC,UAAS,GACT,SAAUqB,EAAYrB,EAAK,MAAOA,EAAK,GAAG,EAEzC,SAAAA,EAAK,KAAA,EARDA,EAAK,EAAA,CAUb,CAAA,EAbQ,SAASiB,EAAM,CAAC,EAAE,EAAE,EAc/B,CAAA,CAEJ,EACA,UAAWtC,KAAQX,EAAO,CACxB,GAAIW,EAAK,OAAS,OAAQ,CACxBoC,EAAI,KAAKpC,EAAK,IAAI,EAClB,QACF,CACAqC,EAAA,EACA,MAAM1D,EAAMqB,EAAK,OACjBmC,EAAO,KACLQ,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,OACrB,SAAA,CAAAZ,EAAAA,IAACa,EAAAA,WAAA,CACC,GAAG,MACH,QAAQ,UACR,MAAM,QACN,UAAS,GACT,UAAWD,EAAO,YAEjB,SAAAjE,EAAI,MAAA,CAAA,EAEPqD,EAAAA,IAACO,EAAAA,KAAA,CACE,SAAA5D,EAAI,OAAO,IAAKK,GACfgD,EAAAA,IAACc,GAAA,CAA+B,MAAA9D,EAAc,SAAAsB,CAAA,EAA3BtB,EAAM,KAAyC,CACnE,CAAA,CACH,CAAA,CAAA,EAdkC,OAAOL,EAAI,MAAM,EAerD,CAAA,CAEJ,CACA,OAAA0D,EAAA,EAEOL,EAAAA,IAAC,MAAA,CAAI,UAAWY,EAAO,IAAM,SAAAT,EAAO,CAC7C,CAWA,SAASY,GAAahD,EAA6D,CACjF,MAAMiD,EAAmB,CAAA,EACzB,UAAW3B,KAAQtB,EAAK,MAAOiD,EAAM,KAAK,CAAE,MAAO3B,EAAK,MAAO,GAAIA,EAAK,EAAA,CAAI,EAC5E,UAAW1C,KAAOoB,EAAK,QACrB,UAAWf,KAASL,EAAI,OAAQ,CAC1BK,EAAM,IAAIgE,EAAM,KAAK,CAAE,MAAOhE,EAAM,MAAO,GAAIA,EAAM,GAAI,QAASL,EAAI,OAAQ,EAClF,UAAW2C,KAAQtC,EAAM,UAAY,CAAA,EACnCgE,EAAM,KAAK,CACT,MAAO1B,EAAK,MACZ,GAAIA,EAAK,GACT,QAAS,GAAG3C,EAAI,MAAM,MAAMK,EAAM,KAAK,EAAA,CACxC,CACL,CACF,OAAOgE,CACT,CAEA,MAAMC,GAAqB,EAOpB,SAASC,IAAY,CAC1B,MAAMC,EAAIC,EAAAA,KAAA,EACJrD,EAAOR,EAAA,EACP8D,EAAWC,EAAAA,YAAA,EACXN,EAAQpD,EAAAA,QAAQ,IAAMmD,GAAahD,CAAI,EAAG,CAACA,CAAI,CAAC,EAEhD,CAACwD,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/B,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAS,EAAK,EAChC,CAACG,EAAQC,CAAS,EAAIJ,EAAAA,SAAS,CAAC,EAChCK,EAAUC,EAAAA,OAA8B,IAAI,EAE5CC,EAAUpE,EAAAA,QAAQ,IAAM,CAC5B,MAAMqE,EAAIV,EAAM,KAAA,EAAO,YAAA,EACvB,OAAKU,EACEjB,EACJ,OACE9F,GAAA,OAAM,OAAAA,EAAE,MAAM,cAAc,SAAS+G,CAAC,MAAM/F,EAAAhB,EAAE,UAAF,YAAAgB,EAAW,cAAc,SAAS+F,KAAM,IAAA,EAEtF,MAAM,EAAGhB,EAAkB,EALf,CAAA,CAMjB,EAAG,CAACD,EAAOO,CAAK,CAAC,EAEXW,EAAWR,GAAQM,EAAQ,OAAS,EAG1CG,EAAAA,UAAU,IAAMN,EAAU,CAAC,EAAG,CAACN,CAAK,CAAC,EAGrCY,EAAAA,UAAU,IAAM,CACdN,EAAW,GAAO,EAAIG,EAAQ,OAAS,EAAI,KAAK,IAAI,EAAGA,EAAQ,OAAS,CAAC,EAAI,CAAE,CACjF,EAAG,CAACA,EAAQ,MAAM,CAAC,EAGnBG,EAAAA,UAAU,IAAM,CACd,GAAI,CAACT,EAAM,OACX,MAAMU,EAAUC,GAAwB,CAClCP,EAAQ,SAAW,CAACA,EAAQ,QAAQ,SAASO,EAAM,MAAc,GAAGV,EAAQ,EAAK,CACvF,EACA,gBAAS,iBAAiB,cAAeS,CAAM,EACxC,IAAM,SAAS,oBAAoB,cAAeA,CAAM,CACjE,EAAG,CAACV,CAAI,CAAC,EAET,MAAMY,EAAM1C,GAAe,CACzByB,EAAS,CAAE,GAAAzB,EAA2B,EACtC4B,EAAS,EAAE,EACXG,EAAQ,EAAK,CACf,EAEMY,EAAaF,GAA2C,CAC5D,GAAKH,EACL,GAAIG,EAAM,MAAQ,YAChBA,EAAM,eAAA,EACNR,EAAWvE,IAAOA,EAAI,GAAK0E,EAAQ,MAAM,UAChCK,EAAM,MAAQ,UACvBA,EAAM,eAAA,EACNR,EAAWvE,IAAOA,EAAI,EAAI0E,EAAQ,QAAUA,EAAQ,MAAM,UACjDK,EAAM,MAAQ,QAAS,CAChCA,EAAM,eAAA,EACN,MAAMG,EAAMR,EAAQJ,CAAM,EACtBY,GAAKF,EAAGE,EAAI,EAAE,CACpB,MAAWH,EAAM,MAAQ,UACvBV,EAAQ,EAAK,CAEjB,EAEA,OACEhB,EAAAA,KAAC,MAAA,CACC,IAAKmB,EACL,UAAWlB,EAAO,OAClB,KAAK,WACL,gBAAesB,EACf,gBAAc,UAEd,SAAA,CAAAlC,EAAAA,IAACyC,EAAAA,UAAA,CACC,MAAOlB,EACP,SAAWc,GAAyC,CAClDb,EAASa,EAAM,OAAO,KAAK,EAC3BV,EAAQ,EAAI,CACd,EACA,QAAS,IAAMA,EAAQ,EAAI,EAC3B,UAAAY,EACA,UAAWvC,EAAAA,IAAC0C,EAAAA,KAAA,CAAK,KAAK,cAAA,CAAe,EACrC,YAAavB,EAAE,qBAAqB,EACpC,aAAYA,EAAE,qBAAqB,EACnC,aAAa,KAAA,CAAA,EAEde,EACClC,EAAAA,IAAC,MAAA,CAAI,UAAWY,EAAO,YACrB,SAAAZ,EAAAA,IAACO,EAAAA,KAAA,CAAK,KAAK,UACR,SAAAyB,EAAQ,IAAI,CAACW,EAAMrF,IAClB0C,EAAAA,IAACnF,EAAAA,SAAA,CAEC,YAAa8H,EAAK,QAClB,UAAS,GACT,SAAUrF,IAAMsE,EAEhB,YAAcS,GAAsBA,EAAM,eAAA,EAC1C,aAAc,IAAMR,EAAUvE,CAAC,EAC/B,QAAS,IAAMgF,EAAGK,EAAK,EAAE,EAExB,SAAAA,EAAK,KAAA,EATDA,EAAK,EAAA,CAWb,CAAA,CACH,CAAA,CACF,EACE,IAAA,CAAA,CAAA,CAGV,CAQO,SAASlC,EAAamC,EAAqBhD,EAAqB,CACrE,MAAMvE,EAAIF,EAAcyH,CAAW,EAC7BtH,EAAIH,EAAcyE,CAAE,EAC1B,OAAItE,IAAM,IAAYD,IAAM,IACrBA,IAAMC,GAAKD,EAAE,WAAWC,EAAI,GAAG,CACxC,CAEA,SAASuH,GAAc7F,EAAiBsB,EAA2B,OACjE,OAAItB,EAAM,IAAMyD,EAAanC,EAAUtB,EAAM,EAAE,EAAU,KAClDd,EAAAc,EAAM,WAAN,YAAAd,EAAgB,KAAMoD,GAASmB,EAAanC,EAAUgB,EAAK,EAAE,KAAM,EAC5E,CAGA,SAASwD,GAASC,EAAe,CAC/B,OAAOA,EAAO/C,EAAAA,IAAC,OAAA,CAAK,UAAWY,EAAO,SAAW,WAAK,EAAU,IAClE,CAGA,SAASoC,GAAOC,EAAoB,CAClC,OAAOA,EACLjD,EAAAA,IAAC,OAAA,CAAK,UAAWY,EAAO,OAAQ,MAAO,CAAE,WAAY,kBAAkBqC,CAAK,GAAA,EAAO,EACjF,IACN,CAGA,SAASvC,EAAYwC,EAAgBC,EAAkBC,EAAgC,CACrF,GAAI,EAAAF,GAAS,MAAQC,GAAO,MAAQC,GAAW,MAC/C,OACEzC,EAAAA,KAAA0C,WAAA,CACG,SAAA,CAAAP,GAASI,CAAK,EACdF,GAAOG,CAAG,EACVC,CAAA,EACH,CAEJ,CAEA,SAAStC,GAAa,CAAE,MAAA9D,EAAO,SAAAsB,GAAmD,SAChF,MAAM,EAAI8C,EAAAA,KAAA,EACJQ,EAASiB,GAAc7F,EAAOsB,CAAQ,EACtCgF,EAAc,CAAC,GAACpH,EAAAc,EAAM,WAAN,MAAAd,EAAgB,QAChC,CAACwF,EAAMC,CAAO,EAAIF,EAAAA,SAASG,CAAM,EASvC,GALAO,EAAAA,UAAU,IAAM,CACVP,KAAgB,EAAI,CAC1B,EAAG,CAACA,CAAM,CAAC,EAGP,CAAC0B,GAAetG,EAAM,GACxB,OACEgD,EAAAA,IAACpF,EAAA,CACC,GAAI4F,EAAAA,KACJ,GAAIxD,EAAM,GACV,KAAMA,EAAM,KACZ,SAAU4E,EACV,UAAS,GACT,SAAUlB,EAAY1D,EAAM,MAAOA,EAAM,GAAG,EAE3C,SAAAA,EAAM,KAAA,CAAA,EAKb,MAAMoG,EACJpD,EAAAA,IAAC0C,EAAAA,KAAA,CACC,KAAK,aACL,KAAK,KACL,UAAW9B,EAAO,QAClB,YAAWc,EAAO,OAAS,OAAA,CAAA,EAI/B,OACEf,EAAAA,KAAA0C,WAAA,CACG,SAAA,CAAAC,GAAetG,EAAM,GAEpBgD,EAAAA,IAACpF,EAAA,CACC,GAAI4F,EAAAA,KACJ,GAAIxD,EAAM,GACV,KAAMA,EAAM,KACZ,SAAU4E,EACV,UAAS,GACT,QAAS,IAAMD,EAAQ,EAAI,EAC3B,SAAUjB,EACR1D,EAAM,MACNA,EAAM,IACNgD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWY,EAAO,cAClB,aAAY,EAAEc,EAAO,wBAA0B,sBAAuB,CACpE,MAAO1E,EAAM,KAAA,CACd,EACD,gBAAe0E,EACf,QAAUW,GAAsB,CAC9BA,EAAM,eAAA,EACNA,EAAM,gBAAA,EACNV,EAAS1F,GAAM,CAACA,CAAC,CACnB,EAEC,SAAAmH,CAAA,CAAA,CACH,EAGD,SAAApG,EAAM,KAAA,CAAA,EAITgD,EAAAA,IAACnF,EAAAA,SAAA,CACC,KAAMmC,EAAM,KACZ,SAAU4E,EACV,UAAS,GACT,gBAAeF,EACf,QAAS,IAAMC,EAAS1F,GAAM,CAACA,CAAC,EAChC,SAAUyE,EAAY1D,EAAM,MAAOA,EAAM,IAAKoG,CAAO,EAEpD,SAAApG,EAAM,KAAA,CAAA,EAGVsG,EAECtD,EAAAA,IAAC,MAAA,CAAI,UAAWuD,EAAAA,KAAK3C,EAAO,YAAa,CAACc,GAAQd,EAAO,iBAAiB,EACxE,SAAAZ,EAAAA,IAAC,OAAI,UAAWY,EAAO,iBACrB,SAAAZ,EAAAA,IAACO,EAAAA,KAAA,CAAK,UAAWK,EAAO,OACrB,UAAA4C,EAAAxG,EAAM,WAAN,YAAAwG,EAAgB,IAAKlE,GACpBU,EAAAA,IAACpF,EAAA,CAEC,GAAI4F,EAAAA,KACJ,GAAIlB,EAAK,GACT,KAAMU,EAAAA,IAAC,OAAA,CAAK,UAAWY,EAAO,QAAS,EACvC,SAAUH,EAAanC,EAAUgB,EAAK,EAAE,EACxC,KAAK,KACL,UAAS,GACT,SAAUoB,EAAYpB,EAAK,MAAOA,EAAK,GAAG,EAEzC,SAAAA,EAAK,KAAA,EATDA,EAAK,EAAA,EAWb,CACH,CAAA,CACF,CAAA,CACF,EACE,IAAA,EACN,CAEJ"}
@@ -4,7 +4,7 @@ import { clsx as g } from "clsx";
4
4
  import { u as _e } from "./formContext-B7ln1Miy.js";
5
5
  import { T as B } from "./Typography-ChSuxgkc.js";
6
6
  import { f as c } from "./TextField.module-6gYcR9TL.js";
7
- import { a as fe } from "./ConfigProvider-D61cpCz-.js";
7
+ import { a as fe } from "./ConfigProvider-Dqfu7UBU.js";
8
8
  const pe = "_sm_s0efw_5", he = "_md_s0efw_9", me = "_lg_s0efw_13", ve = "_labelRow_s0efw_18", ge = "_value_s0efw_24", ye = "_track_s0efw_30", we = "_hasMarks_s0efw_37", ke = "_input_s0efw_42", Ne = "_marks_s0efw_109", be = "_mark_s0efw_109", Me = "_tick_s0efw_128", Ie = "_markLabel_s0efw_134", Se = "_rangeTrack_s0efw_141", Te = "_rail_s0efw_146", $e = "_rangeFill_s0efw_147", Fe = "_rangeInput_s0efw_164", a = {
9
9
  sm: pe,
10
10
  md: he,
@@ -182,4 +182,4 @@ const pe = "_sm_s0efw_5", he = "_md_s0efw_9", me = "_lg_s0efw_13", ve = "_labelR
182
182
  export {
183
183
  Le as S
184
184
  };
185
- //# sourceMappingURL=Slider-Cpc5_dPl.js.map
185
+ //# sourceMappingURL=Slider-B5iG-HSw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Slider-Cpc5_dPl.js","sources":["../src/components/Slider/Slider.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type CSSProperties,\n type ChangeEvent,\n type FocusEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { Typography } from '../Typography'\nimport { useT, type ThemeColor } from '../../theme'\n// shared field chrome (wrapper / label / helper / required / error / sizes)\nimport fieldStyles from '../TextField/TextField.module.css'\nimport styles from './Slider.module.css'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n/** A single value, or a `[start, end]` tuple when `range`. */\nexport type SliderValue = number | [number, number]\n\n/** A labeled tick under the track. */\nexport interface SliderMark {\n value: number\n label?: ReactNode\n}\n\nexport interface SliderProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'type' | 'min' | 'max' | 'step' | 'color'\n> {\n /** Label rendered above the track. */\n label?: ReactNode\n /** Preset size — drives the track + thumb dimensions and the label/helper font. */\n size?: SliderSize\n /** Marks the field invalid: red focus ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the track. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the slider to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Two-thumb range mode — pick a `[start, end]` span (e.g. 5–10). The value becomes a tuple. */\n range?: boolean\n /** Controlled value — a `number`, or a `[start, end]` tuple when `range`. */\n value?: SliderValue\n /** Initial value for uncontrolled use. Defaults to `min` (or `[min, max]` when `range`). */\n defaultValue?: SliderValue\n /** Fires with the next value (a `number`, or a `[start, end]` tuple when `range`). */\n onChange?: (value: SliderValue) => void\n /** Minimum value. Defaults to `0`. */\n min?: number\n /** Maximum value. Defaults to `100`. */\n max?: number\n /** Increment the thumb snaps to (arrow keys + drag). Defaults to `1`. */\n step?: number\n /** Theme palette token that tints the fill + thumb. Defaults to `accent`. */\n color?: ThemeColor\n /** Disables the slider. */\n disabled?: boolean\n /**\n * Show the current value at the end of the label row. Defaults to `true`. Pass a function to format\n * it (receives the `number` or `[start, end]`), or `false` to hide it.\n */\n valueLabel?: boolean | ((value: SliderValue) => ReactNode)\n /** Optional labeled ticks under the track (e.g. `[{ value: 0, label: 'Min' }, …]`). Single mode only — ignored with `range`. */\n marks?: SliderMark[]\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\nconst toPercent = (v: number, min: number, max: number) =>\n max > min ? ((v - min) / (max - min)) * 100 : 0\n\n/**\n * A range slider — drag (or arrow-key / Home / End) a thumb along the track to pick a number, snapping\n * to `step`. Built on a native `<input type=\"range\">`, so keyboard, dragging, step/min/max, and a11y\n * come for free; the track / fill / thumb are styled with `--tz-*` tokens and tinted by `color`. Pass\n * **`range`** for a two-thumb span (the value becomes a `[start, end]` tuple). Controlled (`value` +\n * `onChange`) or uncontrolled (`defaultValue`); a `name` binds it to a surrounding `<Form>` — the form\n * value is a real `number` (or `[start, end]`), validated with `z.number()` / `z.tuple([…])`.\n */\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n range = false,\n value,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n color = 'accent',\n disabled = false,\n valueLabel = true,\n marks,\n name,\n onBlur,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is a real number (or tuple); the\n // touched/error state comes from field(), the raw value from values[name] (tuples must not be coerced).\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const fallback: SliderValue = range ? [min, max] : min\n const externalValue: SliderValue | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as SliderValue | undefined) ?? fallback)\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<SliderValue>(defaultValue ?? fallback)\n const raw = isControlled ? externalValue! : internal\n\n // Normalize to the active shape (clamped, and — for a range — ordered low ≤ high).\n const tuple = Array.isArray(raw) ? raw : [min, raw]\n const lo = clamp(Math.min(tuple[0], tuple[1]), min, max)\n const hi = clamp(Math.max(tuple[0], tuple[1]), min, max)\n const single = clamp(Array.isArray(raw) ? raw[0] : raw, min, max)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (next: SliderValue) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n const commitRange = (nextLo: number, nextHi: number) => {\n const l = clamp(nextLo, min, max)\n const h = clamp(nextHi, min, max)\n commit([Math.min(l, h), Math.max(l, h)])\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n const showValue = valueLabel !== false\n const currentValue: SliderValue = range ? [lo, hi] : single\n const renderedValue =\n typeof valueLabel === 'function' ? valueLabel(currentValue) : range ? `${lo} – ${hi}` : single\n\n const loPct = toPercent(lo, min, max)\n const hiPct = toPercent(hi, min, max)\n\n return (\n <div\n className={clsx(\n fieldStyles.field,\n fieldStyles[size],\n styles[size],\n fullWidth && fieldStyles.fullWidth,\n resolvedError && fieldStyles.error,\n disabled && fieldStyles.disabled,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-slider-fill': `${toPercent(single, min, max)}%`,\n ...style,\n } as CSSProperties\n }\n >\n {(label != null || showValue) && (\n <div className={styles.labelRow}>\n {label != null ? (\n <label htmlFor={id} className={fieldStyles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={fieldStyles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : (\n <span />\n )}\n {showValue && (\n <Typography as=\"span\" variant=\"bodySmall\" className={styles.value}>\n {renderedValue}\n </Typography>\n )}\n </div>\n )}\n\n {range ? (\n <div className={clsx(styles.track, styles.rangeTrack)}>\n <span className={styles.rail} aria-hidden />\n <span\n className={styles.rangeFill}\n aria-hidden\n style={{ left: `${loPct}%`, width: `${hiPct - loPct}%` }}\n />\n {/* start thumb — can't pass the end thumb */}\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={lo}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(Math.min(Number(e.target.value), hi), hi)\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n // end thumb sits on top by default (z 4); raise the start above it (z 5) only when both pile\n // at max, so whichever thumb needs grabbing is always reachable\n style={{ zIndex: lo >= max ? 5 : 3 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelStart', { label }) : t('slider.rangeStart')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {/* end thumb — can't pass the start thumb */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={hi}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(lo, Math.max(Number(e.target.value), lo))\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n style={{ zIndex: 4 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelEnd', { label }) : t('slider.rangeEnd')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n />\n </div>\n ) : (\n <div className={clsx(styles.track, marks != null && marks.length > 0 && styles.hasMarks)}>\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={single}\n onChange={(e: ChangeEvent<HTMLInputElement>) => commit(Number(e.target.value))}\n onBlur={handleBlur}\n disabled={disabled}\n className={styles.input}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {marks != null && marks.length > 0 && (\n <div className={styles.marks} aria-hidden>\n {marks.map((mark) => (\n <span\n key={mark.value}\n className={styles.mark}\n style={{ left: `${toPercent(mark.value, min, max)}%` }}\n >\n <span className={styles.tick} />\n {mark.label != null && <span className={styles.markLabel}>{mark.label}</span>}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={fieldStyles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["clamp","n","lo","hi","toPercent","v","min","max","Slider","forwardRef","label","size","error","helperText","required","fullWidth","range","value","defaultValue","onChange","step","color","disabled","valueLabel","marks","name","onBlur","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","fallback","externalValue","isControlled","internal","setInternal","useState","raw","tuple","single","resolvedError","resolvedHelperText","commit","next","commitRange","nextLo","nextHi","l","h","handleBlur","event","showValue","renderedValue","loPct","hiPct","jsxs","clsx","fieldStyles","styles","jsx","Typography","mark"],"mappings":"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"}
1
+ {"version":3,"file":"Slider-B5iG-HSw.js","sources":["../src/components/Slider/Slider.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type CSSProperties,\n type ChangeEvent,\n type FocusEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { Typography } from '../Typography'\nimport { useT, type ThemeColor } from '../../theme'\n// shared field chrome (wrapper / label / helper / required / error / sizes)\nimport fieldStyles from '../TextField/TextField.module.css'\nimport styles from './Slider.module.css'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n/** A single value, or a `[start, end]` tuple when `range`. */\nexport type SliderValue = number | [number, number]\n\n/** A labeled tick under the track. */\nexport interface SliderMark {\n value: number\n label?: ReactNode\n}\n\nexport interface SliderProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'type' | 'min' | 'max' | 'step' | 'color'\n> {\n /** Label rendered above the track. */\n label?: ReactNode\n /** Preset size — drives the track + thumb dimensions and the label/helper font. */\n size?: SliderSize\n /** Marks the field invalid: red focus ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the track. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the slider to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Two-thumb range mode — pick a `[start, end]` span (e.g. 5–10). The value becomes a tuple. */\n range?: boolean\n /** Controlled value — a `number`, or a `[start, end]` tuple when `range`. */\n value?: SliderValue\n /** Initial value for uncontrolled use. Defaults to `min` (or `[min, max]` when `range`). */\n defaultValue?: SliderValue\n /** Fires with the next value (a `number`, or a `[start, end]` tuple when `range`). */\n onChange?: (value: SliderValue) => void\n /** Minimum value. Defaults to `0`. */\n min?: number\n /** Maximum value. Defaults to `100`. */\n max?: number\n /** Increment the thumb snaps to (arrow keys + drag). Defaults to `1`. */\n step?: number\n /** Theme palette token that tints the fill + thumb. Defaults to `accent`. */\n color?: ThemeColor\n /** Disables the slider. */\n disabled?: boolean\n /**\n * Show the current value at the end of the label row. Defaults to `true`. Pass a function to format\n * it (receives the `number` or `[start, end]`), or `false` to hide it.\n */\n valueLabel?: boolean | ((value: SliderValue) => ReactNode)\n /** Optional labeled ticks under the track (e.g. `[{ value: 0, label: 'Min' }, …]`). Single mode only — ignored with `range`. */\n marks?: SliderMark[]\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\nconst toPercent = (v: number, min: number, max: number) =>\n max > min ? ((v - min) / (max - min)) * 100 : 0\n\n/**\n * A range slider — drag (or arrow-key / Home / End) a thumb along the track to pick a number, snapping\n * to `step`. Built on a native `<input type=\"range\">`, so keyboard, dragging, step/min/max, and a11y\n * come for free; the track / fill / thumb are styled with `--tz-*` tokens and tinted by `color`. Pass\n * **`range`** for a two-thumb span (the value becomes a `[start, end]` tuple). Controlled (`value` +\n * `onChange`) or uncontrolled (`defaultValue`); a `name` binds it to a surrounding `<Form>` — the form\n * value is a real `number` (or `[start, end]`), validated with `z.number()` / `z.tuple([…])`.\n */\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n range = false,\n value,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n color = 'accent',\n disabled = false,\n valueLabel = true,\n marks,\n name,\n onBlur,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is a real number (or tuple); the\n // touched/error state comes from field(), the raw value from values[name] (tuples must not be coerced).\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const fallback: SliderValue = range ? [min, max] : min\n const externalValue: SliderValue | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as SliderValue | undefined) ?? fallback)\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<SliderValue>(defaultValue ?? fallback)\n const raw = isControlled ? externalValue! : internal\n\n // Normalize to the active shape (clamped, and — for a range — ordered low ≤ high).\n const tuple = Array.isArray(raw) ? raw : [min, raw]\n const lo = clamp(Math.min(tuple[0], tuple[1]), min, max)\n const hi = clamp(Math.max(tuple[0], tuple[1]), min, max)\n const single = clamp(Array.isArray(raw) ? raw[0] : raw, min, max)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (next: SliderValue) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n const commitRange = (nextLo: number, nextHi: number) => {\n const l = clamp(nextLo, min, max)\n const h = clamp(nextHi, min, max)\n commit([Math.min(l, h), Math.max(l, h)])\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n const showValue = valueLabel !== false\n const currentValue: SliderValue = range ? [lo, hi] : single\n const renderedValue =\n typeof valueLabel === 'function' ? valueLabel(currentValue) : range ? `${lo} – ${hi}` : single\n\n const loPct = toPercent(lo, min, max)\n const hiPct = toPercent(hi, min, max)\n\n return (\n <div\n className={clsx(\n fieldStyles.field,\n fieldStyles[size],\n styles[size],\n fullWidth && fieldStyles.fullWidth,\n resolvedError && fieldStyles.error,\n disabled && fieldStyles.disabled,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-slider-fill': `${toPercent(single, min, max)}%`,\n ...style,\n } as CSSProperties\n }\n >\n {(label != null || showValue) && (\n <div className={styles.labelRow}>\n {label != null ? (\n <label htmlFor={id} className={fieldStyles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={fieldStyles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : (\n <span />\n )}\n {showValue && (\n <Typography as=\"span\" variant=\"bodySmall\" className={styles.value}>\n {renderedValue}\n </Typography>\n )}\n </div>\n )}\n\n {range ? (\n <div className={clsx(styles.track, styles.rangeTrack)}>\n <span className={styles.rail} aria-hidden />\n <span\n className={styles.rangeFill}\n aria-hidden\n style={{ left: `${loPct}%`, width: `${hiPct - loPct}%` }}\n />\n {/* start thumb — can't pass the end thumb */}\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={lo}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(Math.min(Number(e.target.value), hi), hi)\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n // end thumb sits on top by default (z 4); raise the start above it (z 5) only when both pile\n // at max, so whichever thumb needs grabbing is always reachable\n style={{ zIndex: lo >= max ? 5 : 3 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelStart', { label }) : t('slider.rangeStart')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {/* end thumb — can't pass the start thumb */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={hi}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(lo, Math.max(Number(e.target.value), lo))\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n style={{ zIndex: 4 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelEnd', { label }) : t('slider.rangeEnd')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n />\n </div>\n ) : (\n <div className={clsx(styles.track, marks != null && marks.length > 0 && styles.hasMarks)}>\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={single}\n onChange={(e: ChangeEvent<HTMLInputElement>) => commit(Number(e.target.value))}\n onBlur={handleBlur}\n disabled={disabled}\n className={styles.input}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {marks != null && marks.length > 0 && (\n <div className={styles.marks} aria-hidden>\n {marks.map((mark) => (\n <span\n key={mark.value}\n className={styles.mark}\n style={{ left: `${toPercent(mark.value, min, max)}%` }}\n >\n <span className={styles.tick} />\n {mark.label != null && <span className={styles.markLabel}>{mark.label}</span>}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={fieldStyles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["clamp","n","lo","hi","toPercent","v","min","max","Slider","forwardRef","label","size","error","helperText","required","fullWidth","range","value","defaultValue","onChange","step","color","disabled","valueLabel","marks","name","onBlur","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","fallback","externalValue","isControlled","internal","setInternal","useState","raw","tuple","single","resolvedError","resolvedHelperText","commit","next","commitRange","nextLo","nextHi","l","h","handleBlur","event","showValue","renderedValue","loPct","hiPct","jsxs","clsx","fieldStyles","styles","jsx","Typography","mark"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;GAuEMA,IAAQ,CAACC,GAAWC,GAAYC,MAAe,KAAK,IAAI,KAAK,IAAIF,GAAGC,CAAE,GAAGC,CAAE,GAC3EC,IAAY,CAACC,GAAWC,GAAaC,MACzCA,IAAMD,KAAQD,IAAIC,MAAQC,IAAMD,KAAQ,MAAM,GAUnCE,KAASC,GAA0C,SAC9D;AAAA,EACE,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,KAAAb,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,MAAAa,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,YAAAC,IAAa;AAAA,EACb,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,GAAA,GACJC,KAAUC,GAAA,GACVC,IAAKT,MAAUO,IACfG,IAAW,GAAGD,CAAE,WAIhBE,IAAOC,GAAA,GACPC,IAAc,GAAQF,KAAQb,IAC9BgB,IAAQH,KAAQb,IAAOa,EAAK,MAAMb,CAAI,IAAI,QAE1CiB,IAAwB1B,IAAQ,CAACV,GAAKC,CAAG,IAAID,GAC7CqC,IACJ1B,MAAU,SACNA,IACAuB,IACIF,EAAM,OAAOb,CAAK,KAAiCiB,IACrD,QACFE,IAAeD,MAAkB,QACjC,CAACE,IAAUC,EAAW,IAAIC,GAAsB7B,KAAgBwB,CAAQ,GACxEM,IAAMJ,IAAeD,IAAiBE,IAGtCI,IAAQ,MAAM,QAAQD,CAAG,IAAIA,IAAM,CAAC1C,GAAK0C,CAAG,GAC5C9C,IAAKF,EAAM,KAAK,IAAIiD,EAAM,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAG3C,GAAKC,CAAG,GACjDJ,IAAKH,EAAM,KAAK,IAAIiD,EAAM,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAG3C,GAAKC,CAAG,GACjD2C,IAASlD,EAAM,MAAM,QAAQgD,CAAG,IAAIA,EAAI,CAAC,IAAIA,GAAK1C,GAAKC,CAAG,GAE1D4C,IAAgBvC,MAAS6B,KAAA,gBAAAA,EAAO,UAAS,IACzCW,IAAqBvC,MAAc4B,KAAA,gBAAAA,EAAO,aAE1CY,IAAS,CAACC,MAAsB;AACpC,IAAKV,KAAcE,GAAYQ,CAAI,GAC/Bd,KAAaF,EAAM,SAASb,GAAO6B,CAAI,GAC3CnC,KAAA,QAAAA,EAAWmC;AAAA,EACb,GACMC,IAAc,CAACC,GAAgBC,OAAmB;AACtD,UAAMC,IAAI1D,EAAMwD,GAAQlD,GAAKC,CAAG,GAC1BoD,IAAI3D,EAAMyD,IAAQnD,GAAKC,CAAG;AAChC,IAAA8C,EAAO,CAAC,KAAK,IAAIK,GAAGC,CAAC,GAAG,KAAK,IAAID,GAAGC,CAAC,CAAC,CAAC;AAAA,EACzC,GAEMC,IAAa,CAACC,MAAwC;AAC1D,IAAApB,KAAA,QAAAA,EAAO,OAAOoB,IACdnC,KAAA,QAAAA,EAASmC;AAAA,EACX,GAEMC,IAAYvC,MAAe,IAE3BwC,KACJ,OAAOxC,KAAe,aAAaA,EAFHP,IAAQ,CAACd,GAAIC,CAAE,IAAI+C,CAEO,IAAIlC,IAAQ,GAAGd,CAAE,MAAMC,CAAE,KAAK+C,GAEpFc,IAAQ5D,EAAUF,GAAII,GAAKC,CAAG,GAC9B0D,KAAQ7D,EAAUD,GAAIG,GAAKC,CAAG;AAEpC,SACE,gBAAA2D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACTC,EAAY;AAAA,QACZA,EAAYzD,CAAI;AAAA,QAChB0D,EAAO1D,CAAI;AAAA,QACXI,KAAaqD,EAAY;AAAA,QACzBjB,KAAiBiB,EAAY;AAAA,QAC7B9C,KAAY8C,EAAY;AAAA,QACxBxC;AAAA,MAAA;AAAA,MAEF,OACE;AAAA,QACE,gBAAgB,kBAAkBP,CAAK;AAAA,QACvC,oBAAoB,GAAGjB,EAAU8C,GAAQ5C,GAAKC,CAAG,CAAC;AAAA,QAClD,GAAGsB;AAAA,MAAA;AAAA,MAIL,UAAA;AAAA,SAAAnB,KAAS,QAAQoD,MACjB,gBAAAI,EAAC,OAAA,EAAI,WAAWG,EAAO,UACpB,UAAA;AAAA,UAAA3D,KAAS,OACR,gBAAAwD,EAAC,SAAA,EAAM,SAAS9B,GAAI,WAAWgC,EAAY,OACzC,UAAA;AAAA,YAAA,gBAAAE,EAACC,KAAW,IAAG,QAAO,SAAQ,aAAY,OAAM,SAC7C,UAAA7D,EAAA,CACH;AAAA,YACCI,uBACE,QAAA,EAAK,WAAWsD,EAAY,UAAU,eAAY,QAAO,UAAA,IAAA,CAE1D;AAAA,UAAA,EAAA,CAEJ,sBAEC,QAAA,EAAK;AAAA,UAEPN,KACC,gBAAAQ,EAACC,GAAA,EAAW,IAAG,QAAO,SAAQ,aAAY,WAAWF,EAAO,OACzD,UAAAN,GAAA,CACH;AAAA,QAAA,GAEJ;AAAA,QAGD/C,sBACE,OAAA,EAAI,WAAWmD,EAAKE,EAAO,OAAOA,EAAO,UAAU,GAClD,UAAA;AAAA,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,MAAM,eAAW,IAAC;AAAA,UAC1C,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,EAAO;AAAA,cAClB,eAAW;AAAA,cACX,OAAO,EAAE,MAAM,GAAGL,CAAK,KAAK,OAAO,GAAGC,KAAQD,CAAK,IAAA;AAAA,YAAI;AAAA,UAAA;AAAA,UAGzD,gBAAAM;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAvC;AAAA,cACA,IAAAK;AAAA,cACA,MAAAX;AAAA,cACA,MAAK;AAAA,cACL,KAAAnB;AAAA,cACA,KAAAC;AAAA,cACA,MAAAa;AAAA,cACA,OAAOlB;AAAA,cACP,UAAU,CAAC,MACTqD,EAAY,KAAK,IAAI,OAAO,EAAE,OAAO,KAAK,GAAGpD,CAAE,GAAGA,CAAE;AAAA,cAEtD,QAAQyD;AAAA,cACR,UAAAtC;AAAA,cACA,WAAW6C,EAAKE,EAAO,OAAOA,EAAO,UAAU;AAAA,cAG/C,OAAO,EAAE,QAAQnE,KAAMK,IAAM,IAAI,EAAA;AAAA,cACjC,cACE,OAAOG,KAAU,WAAWsB,EAAE,qBAAqB,EAAE,OAAAtB,EAAA,CAAO,IAAIsB,EAAE,mBAAmB;AAAA,cAEvF,gBAAcmB,KAAiB;AAAA,cAC/B,oBAAkBC,KAAsB,OAAOf,IAAW;AAAA,cACzD,GAAGP;AAAA,YAAA;AAAA,UAAA;AAAA,UAGN,gBAAAwC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAAhE;AAAA,cACA,KAAAC;AAAA,cACA,MAAAa;AAAA,cACA,OAAOjB;AAAA,cACP,UAAU,CAAC,MACToD,EAAYrD,GAAI,KAAK,IAAI,OAAO,EAAE,OAAO,KAAK,GAAGA,CAAE,CAAC;AAAA,cAEtD,QAAQ0D;AAAA,cACR,UAAAtC;AAAA,cACA,WAAW6C,EAAKE,EAAO,OAAOA,EAAO,UAAU;AAAA,cAC/C,OAAO,EAAE,QAAQ,EAAA;AAAA,cACjB,cACE,OAAO3D,KAAU,WAAWsB,EAAE,mBAAmB,EAAE,OAAAtB,EAAA,CAAO,IAAIsB,EAAE,iBAAiB;AAAA,cAEnF,gBAAcmB,KAAiB;AAAA,cAC/B,oBAAkBC,KAAsB,OAAOf,IAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QAC5D,EAAA,CACF,IAEA,gBAAA6B,EAAC,OAAA,EAAI,WAAWC,EAAKE,EAAO,OAAO7C,KAAS,QAAQA,EAAM,SAAS,KAAK6C,EAAO,QAAQ,GACrF,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAvC;AAAA,cACA,IAAAK;AAAA,cACA,MAAAX;AAAA,cACA,MAAK;AAAA,cACL,KAAAnB;AAAA,cACA,KAAAC;AAAA,cACA,MAAAa;AAAA,cACA,OAAO8B;AAAA,cACP,UAAU,CAAC,MAAqCG,EAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,cAC7E,QAAQO;AAAA,cACR,UAAAtC;AAAA,cACA,WAAW+C,EAAO;AAAA,cAClB,gBAAclB,KAAiB;AAAA,cAC/B,oBAAkBC,KAAsB,OAAOf,IAAW;AAAA,cACzD,GAAGP;AAAA,YAAA;AAAA,UAAA;AAAA,UAELN,KAAS,QAAQA,EAAM,SAAS,KAC/B,gBAAA8C,EAAC,OAAA,EAAI,WAAWD,EAAO,OAAO,eAAW,IACtC,UAAA7C,EAAM,IAAI,CAACgD,MACV,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWG,EAAO;AAAA,cAClB,OAAO,EAAE,MAAM,GAAGjE,EAAUoE,EAAK,OAAOlE,GAAKC,CAAG,CAAC,IAAA;AAAA,cAEjD,UAAA;AAAA,gBAAA,gBAAA+D,EAAC,QAAA,EAAK,WAAWD,EAAO,KAAA,CAAM;AAAA,gBAC7BG,EAAK,SAAS,QAAQ,gBAAAF,EAAC,UAAK,WAAWD,EAAO,WAAY,UAAAG,EAAK,MAAA,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YALjEA,EAAK;AAAA,UAAA,CAOb,EAAA,CACH;AAAA,QAAA,GAEJ;AAAA,QAGDpB,KAAsB,QACrB,gBAAAkB;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAIlC;AAAA,YACJ,SAAQ;AAAA,YACR,OAAOc,IAAgB,UAAU;AAAA,YACjC,WAAWiB,EAAY;AAAA,YAEtB,UAAAhB;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";const s=require("react/jsx-runtime"),R=require("react"),v=require("clsx"),oe=require("./formContext-bTWrqdEV.cjs"),V=require("./Typography-d97DdbNd.cjs"),c=require("./TextField.module-DsNCo8vN.cjs"),de=require("./ConfigProvider-BaiTKZKC.cjs"),ue="_sm_s0efw_5",_e="_md_s0efw_9",fe="_lg_s0efw_13",he="_labelRow_s0efw_18",pe="_value_s0efw_24",ye="_track_s0efw_30",ve="_hasMarks_s0efw_37",ge="_input_s0efw_42",we="_marks_s0efw_109",ke="_mark_s0efw_109",me="_tick_s0efw_128",xe="_markLabel_s0efw_134",je="_rangeTrack_s0efw_141",Ne="_rail_s0efw_146",be="_rangeFill_s0efw_147",Se="_rangeInput_s0efw_164",l={sm:ue,md:_e,lg:fe,labelRow:he,value:pe,track:ye,hasMarks:ve,input:ge,marks:we,mark:ke,tick:me,markLabel:xe,rangeTrack:je,rail:Ne,rangeFill:be,rangeInput:Se},g=(w,t,i)=>Math.min(Math.max(w,t),i),M=(w,t,i)=>i>t?(w-t)/(i-t)*100:0,Me=R.forwardRef(function({label:t,size:i="md",error:O,helperText:Q,required:U=!1,fullWidth:X=!0,range:k=!1,value:z,defaultValue:Y,onChange:T,min:a=0,max:r=100,step:I=1,color:Z="accent",disabled:m=!1,valueLabel:q=!0,marks:f,name:o,onBlur:F,id:ee,className:se,style:le,...A},P){const x=de.useT(),ae=R.useId(),j=ee??ae,N=`${j}-helper`,h=oe.useFormContext(),B=!!(h&&o),n=h&&o?h.field(o):void 0,C=k?[a,r]:a,E=z!==void 0?z:B?h.values[o]??C:void 0,L=E!==void 0,[re,te]=R.useState(Y??C),u=L?E:re,b=Array.isArray(u)?u:[a,u],d=g(Math.min(b[0],b[1]),a,r),_=g(Math.max(b[0],b[1]),a,r),S=g(Array.isArray(u)?u[0]:u,a,r),p=O??(n==null?void 0:n.error)??!1,y=Q??(n==null?void 0:n.helperText),H=e=>{L||te(e),B&&h.setValue(o,e),T==null||T(e)},W=(e,ie)=>{const J=g(e,a,r),K=g(ie,a,r);H([Math.min(J,K),Math.max(J,K)])},$=e=>{n==null||n.onBlur(e),F==null||F(e)},D=q!==!1,ne=typeof q=="function"?q(k?[d,_]:S):k?`${d} – ${_}`:S,G=M(d,a,r),ce=M(_,a,r);return s.jsxs("div",{className:v.clsx(c.fieldStyles.field,c.fieldStyles[i],l[i],X&&c.fieldStyles.fullWidth,p&&c.fieldStyles.error,m&&c.fieldStyles.disabled,se),style:{"--tz-btn-rgb":`var(--tz-color-${Z}-rgb)`,"--tz-slider-fill":`${M(S,a,r)}%`,...le},children:[(t!=null||D)&&s.jsxs("div",{className:l.labelRow,children:[t!=null?s.jsxs("label",{htmlFor:j,className:c.fieldStyles.label,children:[s.jsx(V.Typography,{as:"span",variant:"bodySmall",color:"muted",children:t}),U&&s.jsx("span",{className:c.fieldStyles.required,"aria-hidden":"true",children:"*"})]}):s.jsx("span",{}),D&&s.jsx(V.Typography,{as:"span",variant:"bodySmall",className:l.value,children:ne})]}),k?s.jsxs("div",{className:v.clsx(l.track,l.rangeTrack),children:[s.jsx("span",{className:l.rail,"aria-hidden":!0}),s.jsx("span",{className:l.rangeFill,"aria-hidden":!0,style:{left:`${G}%`,width:`${ce-G}%`}}),s.jsx("input",{ref:P,id:j,name:o,type:"range",min:a,max:r,step:I,value:d,onChange:e=>W(Math.min(Number(e.target.value),_),_),onBlur:$,disabled:m,className:v.clsx(l.input,l.rangeInput),style:{zIndex:d>=r?5:3},"aria-label":typeof t=="string"?x("slider.labelStart",{label:t}):x("slider.rangeStart"),"aria-invalid":p||void 0,"aria-describedby":y!=null?N:void 0,...A}),s.jsx("input",{type:"range",min:a,max:r,step:I,value:_,onChange:e=>W(d,Math.max(Number(e.target.value),d)),onBlur:$,disabled:m,className:v.clsx(l.input,l.rangeInput),style:{zIndex:4},"aria-label":typeof t=="string"?x("slider.labelEnd",{label:t}):x("slider.rangeEnd"),"aria-invalid":p||void 0,"aria-describedby":y!=null?N:void 0})]}):s.jsxs("div",{className:v.clsx(l.track,f!=null&&f.length>0&&l.hasMarks),children:[s.jsx("input",{ref:P,id:j,name:o,type:"range",min:a,max:r,step:I,value:S,onChange:e=>H(Number(e.target.value)),onBlur:$,disabled:m,className:l.input,"aria-invalid":p||void 0,"aria-describedby":y!=null?N:void 0,...A}),f!=null&&f.length>0&&s.jsx("div",{className:l.marks,"aria-hidden":!0,children:f.map(e=>s.jsxs("span",{className:l.mark,style:{left:`${M(e.value,a,r)}%`},children:[s.jsx("span",{className:l.tick}),e.label!=null&&s.jsx("span",{className:l.markLabel,children:e.label})]},e.value))})]}),y!=null&&s.jsx(V.Typography,{as:"span",id:N,variant:"bodySmall",color:p?"error":"muted",className:c.fieldStyles.helper,children:y})]})});exports.Slider=Me;
2
- //# sourceMappingURL=Slider-CXAz9SUY.cjs.map
1
+ "use strict";const s=require("react/jsx-runtime"),R=require("react"),v=require("clsx"),oe=require("./formContext-bTWrqdEV.cjs"),V=require("./Typography-d97DdbNd.cjs"),c=require("./TextField.module-DsNCo8vN.cjs"),de=require("./ConfigProvider-Ci9Q2HLF.cjs"),ue="_sm_s0efw_5",_e="_md_s0efw_9",fe="_lg_s0efw_13",he="_labelRow_s0efw_18",pe="_value_s0efw_24",ye="_track_s0efw_30",ve="_hasMarks_s0efw_37",ge="_input_s0efw_42",we="_marks_s0efw_109",ke="_mark_s0efw_109",me="_tick_s0efw_128",xe="_markLabel_s0efw_134",je="_rangeTrack_s0efw_141",Ne="_rail_s0efw_146",be="_rangeFill_s0efw_147",Se="_rangeInput_s0efw_164",l={sm:ue,md:_e,lg:fe,labelRow:he,value:pe,track:ye,hasMarks:ve,input:ge,marks:we,mark:ke,tick:me,markLabel:xe,rangeTrack:je,rail:Ne,rangeFill:be,rangeInput:Se},g=(w,t,i)=>Math.min(Math.max(w,t),i),M=(w,t,i)=>i>t?(w-t)/(i-t)*100:0,Me=R.forwardRef(function({label:t,size:i="md",error:O,helperText:Q,required:U=!1,fullWidth:X=!0,range:k=!1,value:z,defaultValue:Y,onChange:T,min:a=0,max:r=100,step:I=1,color:Z="accent",disabled:m=!1,valueLabel:q=!0,marks:f,name:o,onBlur:F,id:ee,className:se,style:le,...A},P){const x=de.useT(),ae=R.useId(),j=ee??ae,N=`${j}-helper`,h=oe.useFormContext(),B=!!(h&&o),n=h&&o?h.field(o):void 0,C=k?[a,r]:a,E=z!==void 0?z:B?h.values[o]??C:void 0,L=E!==void 0,[re,te]=R.useState(Y??C),u=L?E:re,b=Array.isArray(u)?u:[a,u],d=g(Math.min(b[0],b[1]),a,r),_=g(Math.max(b[0],b[1]),a,r),S=g(Array.isArray(u)?u[0]:u,a,r),p=O??(n==null?void 0:n.error)??!1,y=Q??(n==null?void 0:n.helperText),H=e=>{L||te(e),B&&h.setValue(o,e),T==null||T(e)},W=(e,ie)=>{const J=g(e,a,r),K=g(ie,a,r);H([Math.min(J,K),Math.max(J,K)])},$=e=>{n==null||n.onBlur(e),F==null||F(e)},D=q!==!1,ne=typeof q=="function"?q(k?[d,_]:S):k?`${d} – ${_}`:S,G=M(d,a,r),ce=M(_,a,r);return s.jsxs("div",{className:v.clsx(c.fieldStyles.field,c.fieldStyles[i],l[i],X&&c.fieldStyles.fullWidth,p&&c.fieldStyles.error,m&&c.fieldStyles.disabled,se),style:{"--tz-btn-rgb":`var(--tz-color-${Z}-rgb)`,"--tz-slider-fill":`${M(S,a,r)}%`,...le},children:[(t!=null||D)&&s.jsxs("div",{className:l.labelRow,children:[t!=null?s.jsxs("label",{htmlFor:j,className:c.fieldStyles.label,children:[s.jsx(V.Typography,{as:"span",variant:"bodySmall",color:"muted",children:t}),U&&s.jsx("span",{className:c.fieldStyles.required,"aria-hidden":"true",children:"*"})]}):s.jsx("span",{}),D&&s.jsx(V.Typography,{as:"span",variant:"bodySmall",className:l.value,children:ne})]}),k?s.jsxs("div",{className:v.clsx(l.track,l.rangeTrack),children:[s.jsx("span",{className:l.rail,"aria-hidden":!0}),s.jsx("span",{className:l.rangeFill,"aria-hidden":!0,style:{left:`${G}%`,width:`${ce-G}%`}}),s.jsx("input",{ref:P,id:j,name:o,type:"range",min:a,max:r,step:I,value:d,onChange:e=>W(Math.min(Number(e.target.value),_),_),onBlur:$,disabled:m,className:v.clsx(l.input,l.rangeInput),style:{zIndex:d>=r?5:3},"aria-label":typeof t=="string"?x("slider.labelStart",{label:t}):x("slider.rangeStart"),"aria-invalid":p||void 0,"aria-describedby":y!=null?N:void 0,...A}),s.jsx("input",{type:"range",min:a,max:r,step:I,value:_,onChange:e=>W(d,Math.max(Number(e.target.value),d)),onBlur:$,disabled:m,className:v.clsx(l.input,l.rangeInput),style:{zIndex:4},"aria-label":typeof t=="string"?x("slider.labelEnd",{label:t}):x("slider.rangeEnd"),"aria-invalid":p||void 0,"aria-describedby":y!=null?N:void 0})]}):s.jsxs("div",{className:v.clsx(l.track,f!=null&&f.length>0&&l.hasMarks),children:[s.jsx("input",{ref:P,id:j,name:o,type:"range",min:a,max:r,step:I,value:S,onChange:e=>H(Number(e.target.value)),onBlur:$,disabled:m,className:l.input,"aria-invalid":p||void 0,"aria-describedby":y!=null?N:void 0,...A}),f!=null&&f.length>0&&s.jsx("div",{className:l.marks,"aria-hidden":!0,children:f.map(e=>s.jsxs("span",{className:l.mark,style:{left:`${M(e.value,a,r)}%`},children:[s.jsx("span",{className:l.tick}),e.label!=null&&s.jsx("span",{className:l.markLabel,children:e.label})]},e.value))})]}),y!=null&&s.jsx(V.Typography,{as:"span",id:N,variant:"bodySmall",color:p?"error":"muted",className:c.fieldStyles.helper,children:y})]})});exports.Slider=Me;
2
+ //# sourceMappingURL=Slider-DTnui01g.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Slider-CXAz9SUY.cjs","sources":["../src/components/Slider/Slider.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type CSSProperties,\n type ChangeEvent,\n type FocusEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { Typography } from '../Typography'\nimport { useT, type ThemeColor } from '../../theme'\n// shared field chrome (wrapper / label / helper / required / error / sizes)\nimport fieldStyles from '../TextField/TextField.module.css'\nimport styles from './Slider.module.css'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n/** A single value, or a `[start, end]` tuple when `range`. */\nexport type SliderValue = number | [number, number]\n\n/** A labeled tick under the track. */\nexport interface SliderMark {\n value: number\n label?: ReactNode\n}\n\nexport interface SliderProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'type' | 'min' | 'max' | 'step' | 'color'\n> {\n /** Label rendered above the track. */\n label?: ReactNode\n /** Preset size — drives the track + thumb dimensions and the label/helper font. */\n size?: SliderSize\n /** Marks the field invalid: red focus ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the track. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the slider to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Two-thumb range mode — pick a `[start, end]` span (e.g. 5–10). The value becomes a tuple. */\n range?: boolean\n /** Controlled value — a `number`, or a `[start, end]` tuple when `range`. */\n value?: SliderValue\n /** Initial value for uncontrolled use. Defaults to `min` (or `[min, max]` when `range`). */\n defaultValue?: SliderValue\n /** Fires with the next value (a `number`, or a `[start, end]` tuple when `range`). */\n onChange?: (value: SliderValue) => void\n /** Minimum value. Defaults to `0`. */\n min?: number\n /** Maximum value. Defaults to `100`. */\n max?: number\n /** Increment the thumb snaps to (arrow keys + drag). Defaults to `1`. */\n step?: number\n /** Theme palette token that tints the fill + thumb. Defaults to `accent`. */\n color?: ThemeColor\n /** Disables the slider. */\n disabled?: boolean\n /**\n * Show the current value at the end of the label row. Defaults to `true`. Pass a function to format\n * it (receives the `number` or `[start, end]`), or `false` to hide it.\n */\n valueLabel?: boolean | ((value: SliderValue) => ReactNode)\n /** Optional labeled ticks under the track (e.g. `[{ value: 0, label: 'Min' }, …]`). Single mode only — ignored with `range`. */\n marks?: SliderMark[]\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\nconst toPercent = (v: number, min: number, max: number) =>\n max > min ? ((v - min) / (max - min)) * 100 : 0\n\n/**\n * A range slider — drag (or arrow-key / Home / End) a thumb along the track to pick a number, snapping\n * to `step`. Built on a native `<input type=\"range\">`, so keyboard, dragging, step/min/max, and a11y\n * come for free; the track / fill / thumb are styled with `--tz-*` tokens and tinted by `color`. Pass\n * **`range`** for a two-thumb span (the value becomes a `[start, end]` tuple). Controlled (`value` +\n * `onChange`) or uncontrolled (`defaultValue`); a `name` binds it to a surrounding `<Form>` — the form\n * value is a real `number` (or `[start, end]`), validated with `z.number()` / `z.tuple([…])`.\n */\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n range = false,\n value,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n color = 'accent',\n disabled = false,\n valueLabel = true,\n marks,\n name,\n onBlur,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is a real number (or tuple); the\n // touched/error state comes from field(), the raw value from values[name] (tuples must not be coerced).\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const fallback: SliderValue = range ? [min, max] : min\n const externalValue: SliderValue | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as SliderValue | undefined) ?? fallback)\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<SliderValue>(defaultValue ?? fallback)\n const raw = isControlled ? externalValue! : internal\n\n // Normalize to the active shape (clamped, and — for a range — ordered low ≤ high).\n const tuple = Array.isArray(raw) ? raw : [min, raw]\n const lo = clamp(Math.min(tuple[0], tuple[1]), min, max)\n const hi = clamp(Math.max(tuple[0], tuple[1]), min, max)\n const single = clamp(Array.isArray(raw) ? raw[0] : raw, min, max)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (next: SliderValue) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n const commitRange = (nextLo: number, nextHi: number) => {\n const l = clamp(nextLo, min, max)\n const h = clamp(nextHi, min, max)\n commit([Math.min(l, h), Math.max(l, h)])\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n const showValue = valueLabel !== false\n const currentValue: SliderValue = range ? [lo, hi] : single\n const renderedValue =\n typeof valueLabel === 'function' ? valueLabel(currentValue) : range ? `${lo} – ${hi}` : single\n\n const loPct = toPercent(lo, min, max)\n const hiPct = toPercent(hi, min, max)\n\n return (\n <div\n className={clsx(\n fieldStyles.field,\n fieldStyles[size],\n styles[size],\n fullWidth && fieldStyles.fullWidth,\n resolvedError && fieldStyles.error,\n disabled && fieldStyles.disabled,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-slider-fill': `${toPercent(single, min, max)}%`,\n ...style,\n } as CSSProperties\n }\n >\n {(label != null || showValue) && (\n <div className={styles.labelRow}>\n {label != null ? (\n <label htmlFor={id} className={fieldStyles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={fieldStyles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : (\n <span />\n )}\n {showValue && (\n <Typography as=\"span\" variant=\"bodySmall\" className={styles.value}>\n {renderedValue}\n </Typography>\n )}\n </div>\n )}\n\n {range ? (\n <div className={clsx(styles.track, styles.rangeTrack)}>\n <span className={styles.rail} aria-hidden />\n <span\n className={styles.rangeFill}\n aria-hidden\n style={{ left: `${loPct}%`, width: `${hiPct - loPct}%` }}\n />\n {/* start thumb — can't pass the end thumb */}\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={lo}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(Math.min(Number(e.target.value), hi), hi)\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n // end thumb sits on top by default (z 4); raise the start above it (z 5) only when both pile\n // at max, so whichever thumb needs grabbing is always reachable\n style={{ zIndex: lo >= max ? 5 : 3 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelStart', { label }) : t('slider.rangeStart')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {/* end thumb — can't pass the start thumb */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={hi}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(lo, Math.max(Number(e.target.value), lo))\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n style={{ zIndex: 4 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelEnd', { label }) : t('slider.rangeEnd')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n />\n </div>\n ) : (\n <div className={clsx(styles.track, marks != null && marks.length > 0 && styles.hasMarks)}>\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={single}\n onChange={(e: ChangeEvent<HTMLInputElement>) => commit(Number(e.target.value))}\n onBlur={handleBlur}\n disabled={disabled}\n className={styles.input}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {marks != null && marks.length > 0 && (\n <div className={styles.marks} aria-hidden>\n {marks.map((mark) => (\n <span\n key={mark.value}\n className={styles.mark}\n style={{ left: `${toPercent(mark.value, min, max)}%` }}\n >\n <span className={styles.tick} />\n {mark.label != null && <span className={styles.markLabel}>{mark.label}</span>}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={fieldStyles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["clamp","n","lo","hi","toPercent","v","min","max","Slider","forwardRef","label","size","error","helperText","required","fullWidth","range","value","defaultValue","onChange","step","color","disabled","valueLabel","marks","name","onBlur","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","fallback","externalValue","isControlled","internal","setInternal","useState","raw","tuple","single","resolvedError","resolvedHelperText","commit","next","commitRange","nextLo","nextHi","l","h","handleBlur","event","showValue","renderedValue","loPct","hiPct","jsxs","clsx","fieldStyles","styles","jsx","Typography","mark"],"mappings":"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"}
1
+ {"version":3,"file":"Slider-DTnui01g.cjs","sources":["../src/components/Slider/Slider.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type CSSProperties,\n type ChangeEvent,\n type FocusEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { Typography } from '../Typography'\nimport { useT, type ThemeColor } from '../../theme'\n// shared field chrome (wrapper / label / helper / required / error / sizes)\nimport fieldStyles from '../TextField/TextField.module.css'\nimport styles from './Slider.module.css'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n/** A single value, or a `[start, end]` tuple when `range`. */\nexport type SliderValue = number | [number, number]\n\n/** A labeled tick under the track. */\nexport interface SliderMark {\n value: number\n label?: ReactNode\n}\n\nexport interface SliderProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'type' | 'min' | 'max' | 'step' | 'color'\n> {\n /** Label rendered above the track. */\n label?: ReactNode\n /** Preset size — drives the track + thumb dimensions and the label/helper font. */\n size?: SliderSize\n /** Marks the field invalid: red focus ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the track. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the slider to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Two-thumb range mode — pick a `[start, end]` span (e.g. 5–10). The value becomes a tuple. */\n range?: boolean\n /** Controlled value — a `number`, or a `[start, end]` tuple when `range`. */\n value?: SliderValue\n /** Initial value for uncontrolled use. Defaults to `min` (or `[min, max]` when `range`). */\n defaultValue?: SliderValue\n /** Fires with the next value (a `number`, or a `[start, end]` tuple when `range`). */\n onChange?: (value: SliderValue) => void\n /** Minimum value. Defaults to `0`. */\n min?: number\n /** Maximum value. Defaults to `100`. */\n max?: number\n /** Increment the thumb snaps to (arrow keys + drag). Defaults to `1`. */\n step?: number\n /** Theme palette token that tints the fill + thumb. Defaults to `accent`. */\n color?: ThemeColor\n /** Disables the slider. */\n disabled?: boolean\n /**\n * Show the current value at the end of the label row. Defaults to `true`. Pass a function to format\n * it (receives the `number` or `[start, end]`), or `false` to hide it.\n */\n valueLabel?: boolean | ((value: SliderValue) => ReactNode)\n /** Optional labeled ticks under the track (e.g. `[{ value: 0, label: 'Min' }, …]`). Single mode only — ignored with `range`. */\n marks?: SliderMark[]\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\nconst toPercent = (v: number, min: number, max: number) =>\n max > min ? ((v - min) / (max - min)) * 100 : 0\n\n/**\n * A range slider — drag (or arrow-key / Home / End) a thumb along the track to pick a number, snapping\n * to `step`. Built on a native `<input type=\"range\">`, so keyboard, dragging, step/min/max, and a11y\n * come for free; the track / fill / thumb are styled with `--tz-*` tokens and tinted by `color`. Pass\n * **`range`** for a two-thumb span (the value becomes a `[start, end]` tuple). Controlled (`value` +\n * `onChange`) or uncontrolled (`defaultValue`); a `name` binds it to a surrounding `<Form>` — the form\n * value is a real `number` (or `[start, end]`), validated with `z.number()` / `z.tuple([…])`.\n */\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n range = false,\n value,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n color = 'accent',\n disabled = false,\n valueLabel = true,\n marks,\n name,\n onBlur,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — the form value is a real number (or tuple); the\n // touched/error state comes from field(), the raw value from values[name] (tuples must not be coerced).\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const fallback: SliderValue = range ? [min, max] : min\n const externalValue: SliderValue | undefined =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as SliderValue | undefined) ?? fallback)\n : undefined\n const isControlled = externalValue !== undefined\n const [internal, setInternal] = useState<SliderValue>(defaultValue ?? fallback)\n const raw = isControlled ? externalValue! : internal\n\n // Normalize to the active shape (clamped, and — for a range — ordered low ≤ high).\n const tuple = Array.isArray(raw) ? raw : [min, raw]\n const lo = clamp(Math.min(tuple[0], tuple[1]), min, max)\n const hi = clamp(Math.max(tuple[0], tuple[1]), min, max)\n const single = clamp(Array.isArray(raw) ? raw[0] : raw, min, max)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const commit = (next: SliderValue) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n const commitRange = (nextLo: number, nextHi: number) => {\n const l = clamp(nextLo, min, max)\n const h = clamp(nextHi, min, max)\n commit([Math.min(l, h), Math.max(l, h)])\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n const showValue = valueLabel !== false\n const currentValue: SliderValue = range ? [lo, hi] : single\n const renderedValue =\n typeof valueLabel === 'function' ? valueLabel(currentValue) : range ? `${lo} – ${hi}` : single\n\n const loPct = toPercent(lo, min, max)\n const hiPct = toPercent(hi, min, max)\n\n return (\n <div\n className={clsx(\n fieldStyles.field,\n fieldStyles[size],\n styles[size],\n fullWidth && fieldStyles.fullWidth,\n resolvedError && fieldStyles.error,\n disabled && fieldStyles.disabled,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-slider-fill': `${toPercent(single, min, max)}%`,\n ...style,\n } as CSSProperties\n }\n >\n {(label != null || showValue) && (\n <div className={styles.labelRow}>\n {label != null ? (\n <label htmlFor={id} className={fieldStyles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={fieldStyles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : (\n <span />\n )}\n {showValue && (\n <Typography as=\"span\" variant=\"bodySmall\" className={styles.value}>\n {renderedValue}\n </Typography>\n )}\n </div>\n )}\n\n {range ? (\n <div className={clsx(styles.track, styles.rangeTrack)}>\n <span className={styles.rail} aria-hidden />\n <span\n className={styles.rangeFill}\n aria-hidden\n style={{ left: `${loPct}%`, width: `${hiPct - loPct}%` }}\n />\n {/* start thumb — can't pass the end thumb */}\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={lo}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(Math.min(Number(e.target.value), hi), hi)\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n // end thumb sits on top by default (z 4); raise the start above it (z 5) only when both pile\n // at max, so whichever thumb needs grabbing is always reachable\n style={{ zIndex: lo >= max ? 5 : 3 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelStart', { label }) : t('slider.rangeStart')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {/* end thumb — can't pass the start thumb */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={hi}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n commitRange(lo, Math.max(Number(e.target.value), lo))\n }\n onBlur={handleBlur}\n disabled={disabled}\n className={clsx(styles.input, styles.rangeInput)}\n style={{ zIndex: 4 }}\n aria-label={\n typeof label === 'string' ? t('slider.labelEnd', { label }) : t('slider.rangeEnd')\n }\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n />\n </div>\n ) : (\n <div className={clsx(styles.track, marks != null && marks.length > 0 && styles.hasMarks)}>\n <input\n ref={ref}\n id={id}\n name={name}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={single}\n onChange={(e: ChangeEvent<HTMLInputElement>) => commit(Number(e.target.value))}\n onBlur={handleBlur}\n disabled={disabled}\n className={styles.input}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n {...props}\n />\n {marks != null && marks.length > 0 && (\n <div className={styles.marks} aria-hidden>\n {marks.map((mark) => (\n <span\n key={mark.value}\n className={styles.mark}\n style={{ left: `${toPercent(mark.value, min, max)}%` }}\n >\n <span className={styles.tick} />\n {mark.label != null && <span className={styles.markLabel}>{mark.label}</span>}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={fieldStyles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["clamp","n","lo","hi","toPercent","v","min","max","Slider","forwardRef","label","size","error","helperText","required","fullWidth","range","value","defaultValue","onChange","step","color","disabled","valueLabel","marks","name","onBlur","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","isFormBound","bound","fallback","externalValue","isControlled","internal","setInternal","useState","raw","tuple","single","resolvedError","resolvedHelperText","commit","next","commitRange","nextLo","nextHi","l","h","handleBlur","event","showValue","renderedValue","loPct","hiPct","jsxs","clsx","fieldStyles","styles","jsx","Typography","mark"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as o, jsxs as M } from "react/jsx-runtime";
2
2
  import { createContext as H, useContext as J, forwardRef as g, useRef as T, useId as Q, useState as U, useEffect as V } from "react";
3
3
  import { clsx as u } from "clsx";
4
4
  import { b as P, a as R } from "./Icon-D5TxgfCc.js";
5
- import { I as W } from "./IconButton-D9MCwRK_.js";
5
+ import { I as W } from "./IconButton-BoURJOUD.js";
6
6
  import { T as X } from "./Tooltip-BbT0uNzy.js";
7
7
  const z = H(null);
8
8
  function Y() {
@@ -174,4 +174,4 @@ export {
174
174
  he as S,
175
175
  me as a
176
176
  };
177
- //# sourceMappingURL=SpeedDial-SMMfes9f.js.map
177
+ //# sourceMappingURL=SpeedDial-Be3SHkzw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpeedDial-SMMfes9f.js","sources":["../src/components/SpeedDial/speedDialContext.ts","../src/components/SpeedDial/SpeedDialAction.tsx","../src/components/SpeedDial/SpeedDial.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { TooltipPlacement } from '../Tooltip'\n\n/** Action button size — one step smaller than the dial's FAB. */\nexport type SpeedDialActionSize = 'sm' | 'md' | 'lg'\n\n/** Shared state a `<SpeedDial>` hands down to its `<SpeedDialAction>` children via context. */\nexport interface SpeedDialContextValue {\n /** Size for the action FABs. */\n size: SpeedDialActionSize\n /** Where each action's tooltip label sits (derived from the dial `direction`). */\n placement: TooltipPlacement\n /** Close the dial after an action is clicked. */\n closeOnClick: boolean\n /** Show every action's label persistently (no hover needed) while the dial is open. */\n persistentLabels: boolean\n /** Request the dial to close (called by an action on click). */\n requestClose: () => void\n}\n\nexport const SpeedDialContext = createContext<SpeedDialContextValue | null>(null)\n\n/** Read the surrounding `<SpeedDial>` (or `null` when an action is rendered standalone). */\nexport function useSpeedDial(): SpeedDialContextValue | null {\n return useContext(SpeedDialContext)\n}\n","import { forwardRef, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport type { ThemeColor } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Tooltip } from '../Tooltip'\nimport { useSpeedDial } from './speedDialContext'\nimport styles from './SpeedDial.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface SpeedDialActionProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'color'\n> {\n /** Action icon — a known `IconName` or any node. */\n icon: IconName | ReactNode\n /** Label shown as a tooltip beside the action (also its `aria-label` when a string). */\n label?: ReactNode\n /** Show the label persistently (no hover) while the dial is open — overrides the dial's `tooltipOpen`. */\n tooltipOpen?: boolean\n /** Hide the tooltip / persistent label (still used for `aria-label`). */\n hideTooltip?: boolean\n /**\n * Tints the **icon** (the circle stays the neutral surface button) — e.g. `error` for a destructive action.\n * Omit for the default text color.\n */\n color?: ThemeColor\n}\n\n/**\n * One action inside a `<SpeedDial>` — a small circular `IconButton` (surface-tinted) with a tooltip\n * `label`. It reads the dial via context for its size, tooltip placement and close-on-click; clicking\n * runs `onClick` then closes the dial. The ref points at the `<button>`.\n */\nexport const SpeedDialAction = forwardRef<HTMLButtonElement, SpeedDialActionProps>(\n function SpeedDialAction(\n {\n icon,\n label,\n tooltipOpen,\n hideTooltip = false,\n color,\n onClick,\n disabled,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const dial = useSpeedDial()\n const iconNode =\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? <Icon name={icon as IconName} /> : icon\n\n const button = (\n <IconButton\n ref={ref}\n rounded\n variant=\"contained\"\n color=\"surface\"\n size={dial?.size ?? 'sm'}\n disabled={disabled}\n aria-label={typeof label === 'string' ? label : undefined}\n className={clsx(styles.action, className)}\n // the icon follows `color` (currentColor); the circle keeps its surface fill\n style={color ? { color: `var(--tz-color-${color})`, ...style } : style}\n onClick={(event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (dial?.closeOnClick) dial.requestClose()\n }}\n {...props}\n >\n {iconNode}\n </IconButton>\n )\n\n if (label == null || hideTooltip) return button\n\n const placement = dial?.placement ?? 'left'\n // persistent label: render a static label beside the button (no hover) — like MUI's tooltipOpen\n const persistent = tooltipOpen ?? dial?.persistentLabels ?? false\n if (persistent) {\n return (\n <span\n className={clsx(\n styles.actionWrap,\n placement === 'top' ? styles.labelTop : styles.labelLeft,\n )}\n >\n {button}\n <span className={styles.actionLabel}>{label}</span>\n </span>\n )\n }\n\n return (\n <Tooltip content={label} placement={placement}>\n {button}\n </Tooltip>\n )\n },\n)\n","import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport type { ThemeColor } from '../../theme'\nimport type { TooltipPlacement } from '../Tooltip'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { SpeedDialAction } from './SpeedDialAction'\nimport {\n SpeedDialContext,\n type SpeedDialActionSize,\n type SpeedDialContextValue,\n} from './speedDialContext'\nimport styles from './SpeedDial.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type SpeedDialSize = 'sm' | 'md' | 'lg'\nexport type SpeedDialDirection = 'up' | 'down' | 'left' | 'right'\n\n/** The FAB size → the (smaller) action-button size. */\nconst ACTION_SIZE: Record<SpeedDialSize, SpeedDialActionSize> = { sm: 'sm', md: 'sm', lg: 'md' }\n/** Tooltip side per direction — labels sit left of a vertical dial, above a horizontal one. */\nconst TOOLTIP_PLACEMENT: Record<SpeedDialDirection, TooltipPlacement> = {\n up: 'left',\n down: 'left',\n left: 'top',\n right: 'top',\n}\n\n/** A data-driven action for the `actions` prop. */\nexport interface SpeedDialActionItem {\n /** Stable key (falls back to the index). */\n key?: string\n icon: IconName | ReactNode\n label?: ReactNode\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void\n disabled?: boolean\n /** Tints the action's icon (e.g. `error` for a destructive one); the circle stays neutral. */\n color?: ThemeColor\n}\n\nexport interface SpeedDialProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color' | 'onChange'> {\n /** Accessible label for the FAB (required — it's icon-only). */\n ariaLabel: string\n /** FAB icon. Defaults to `Add` (a `+`). */\n icon?: IconName | ReactNode\n /** Icon shown while open. Omit to rotate the `icon` 45° instead (a `+` becomes a `×`). */\n openIcon?: IconName | ReactNode\n /** Which way the actions fan out. Defaults to `up`. */\n direction?: SpeedDialDirection\n /** Theme palette token tinting the FAB. Defaults to `primary`. */\n color?: ThemeColor\n /** FAB size (actions render one step smaller). Defaults to `md`. */\n size?: SpeedDialSize\n /** Controlled open state. */\n open?: boolean\n /** Initial open state for uncontrolled use. Defaults to `false`. */\n defaultOpen?: boolean\n /** Fires with the next open state. */\n onOpenChange?: (open: boolean) => void\n /** Open on hover (also opens on click). Defaults to `true`. */\n openOnHover?: boolean\n /** Close the dial after an action is clicked. Defaults to `true`. */\n closeOnActionClick?: boolean\n /** Show every action's label persistently while open (no hover needed) — like MUI's `tooltipOpen`. */\n tooltipOpen?: boolean\n /** Data-driven actions — an alternative to `<SpeedDialAction>` children. */\n actions?: SpeedDialActionItem[]\n /** Disables the FAB (and hover-opening). */\n disabled?: boolean\n /** `<SpeedDialAction>` children (used when `actions` is not given). */\n children?: ReactNode\n}\n\n/**\n * A floating action button that reveals a set of related actions on hover / click — fanning out in\n * `direction` (`up` default). The FAB icon rotates 45° when open (a `+` → `×`) unless an `openIcon` is\n * given. Each `<SpeedDialAction>` is a small circular button with a tooltip label; supply them via the\n * data-driven `actions` prop or as children. Opens on hover (`openOnHover`) and click; closes on\n * outside-pointerdown, Escape (refocusing the FAB), or selecting an action. Controlled (`open` +\n * `onOpenChange`) or uncontrolled (`defaultOpen`). The ref points at the root; position it (e.g.\n * `fixed` bottom-right) via `style`/`className`. The FAB carries `aria-expanded`/`aria-controls`.\n */\nexport const SpeedDial = forwardRef<HTMLDivElement, SpeedDialProps>(function SpeedDial(\n {\n ariaLabel,\n icon = 'Add',\n openIcon,\n direction = 'up',\n color = 'primary',\n size = 'md',\n open,\n defaultOpen = false,\n onOpenChange,\n openOnHover = true,\n closeOnActionClick = true,\n tooltipOpen = false,\n actions,\n disabled = false,\n children,\n className,\n style,\n ...props\n },\n forwardedRef,\n) {\n const rootRef = useRef<HTMLDivElement | null>(null)\n const fabRef = useRef<HTMLButtonElement | null>(null)\n const actionsId = useId()\n\n const isControlled = open !== undefined\n const [internal, setInternal] = useState(defaultOpen)\n const isOpen = isControlled ? open : internal\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setInternal(next)\n onOpenChange?.(next)\n }\n // keep a stable reference for the document listeners below\n const setOpenRef = useRef(setOpen)\n setOpenRef.current = setOpen\n\n // while open: close on outside pointerdown / Escape (Escape refocuses the FAB)\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setOpenRef.current(false)\n }\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpenRef.current(false)\n fabRef.current?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [isOpen])\n\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n }\n\n const renderIcon = (value: IconName | ReactNode) =>\n typeof value === 'string' && ICON_NAME_SET.has(value) ? (\n <Icon name={value as IconName} />\n ) : (\n value\n )\n\n const ctx: SpeedDialContextValue = {\n size: ACTION_SIZE[size],\n placement: TOOLTIP_PLACEMENT[direction],\n closeOnClick: closeOnActionClick,\n persistentLabels: tooltipOpen,\n requestClose: () => setOpen(false),\n }\n\n const hoverProps =\n openOnHover && !disabled\n ? { onMouseEnter: () => setOpen(true), onMouseLeave: () => setOpen(false) }\n : {}\n\n return (\n <div\n ref={setRootRef}\n className={clsx(styles.speedDial, className)}\n style={style as CSSProperties}\n {...hoverProps}\n {...props}\n >\n <div\n id={actionsId}\n className={clsx(styles.actions, styles[direction])}\n data-open={isOpen ? 'true' : 'false'}\n >\n <SpeedDialContext.Provider value={ctx}>\n {actions\n ? actions.map((action, index) => (\n <SpeedDialAction\n key={action.key ?? index}\n icon={action.icon}\n label={action.label}\n onClick={action.onClick}\n disabled={action.disabled}\n color={action.color}\n />\n ))\n : children}\n </SpeedDialContext.Provider>\n </div>\n\n <IconButton\n ref={fabRef}\n rounded\n variant=\"contained\"\n color={color}\n size={size}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n aria-controls={actionsId}\n className={styles.fab}\n onClick={() => setOpen(!isOpen)}\n >\n <span className={clsx(styles.fabIcon, !openIcon && isOpen && styles.fabIconOpen)}>\n {isOpen && openIcon != null ? renderIcon(openIcon) : renderIcon(icon)}\n </span>\n </IconButton>\n </div>\n )\n})\n"],"names":["SpeedDialContext","createContext","useSpeedDial","useContext","ICON_NAME_SET","ICON_NAMES","SpeedDialAction","forwardRef","icon","label","tooltipOpen","hideTooltip","color","onClick","disabled","className","style","props","ref","dial","iconNode","jsx","Icon","button","IconButton","clsx","styles","event","placement","jsxs","Tooltip","ACTION_SIZE","TOOLTIP_PLACEMENT","SpeedDial","ariaLabel","openIcon","direction","size","open","defaultOpen","onOpenChange","openOnHover","closeOnActionClick","actions","children","forwardedRef","rootRef","useRef","fabRef","actionsId","useId","isControlled","internal","setInternal","useState","isOpen","setOpen","next","setOpenRef","useEffect","onPointerDown","onKeyDown","_a","setRootRef","node","renderIcon","value","ctx","hoverProps","action","index"],"mappings":"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"}
1
+ {"version":3,"file":"SpeedDial-Be3SHkzw.js","sources":["../src/components/SpeedDial/speedDialContext.ts","../src/components/SpeedDial/SpeedDialAction.tsx","../src/components/SpeedDial/SpeedDial.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { TooltipPlacement } from '../Tooltip'\n\n/** Action button size — one step smaller than the dial's FAB. */\nexport type SpeedDialActionSize = 'sm' | 'md' | 'lg'\n\n/** Shared state a `<SpeedDial>` hands down to its `<SpeedDialAction>` children via context. */\nexport interface SpeedDialContextValue {\n /** Size for the action FABs. */\n size: SpeedDialActionSize\n /** Where each action's tooltip label sits (derived from the dial `direction`). */\n placement: TooltipPlacement\n /** Close the dial after an action is clicked. */\n closeOnClick: boolean\n /** Show every action's label persistently (no hover needed) while the dial is open. */\n persistentLabels: boolean\n /** Request the dial to close (called by an action on click). */\n requestClose: () => void\n}\n\nexport const SpeedDialContext = createContext<SpeedDialContextValue | null>(null)\n\n/** Read the surrounding `<SpeedDial>` (or `null` when an action is rendered standalone). */\nexport function useSpeedDial(): SpeedDialContextValue | null {\n return useContext(SpeedDialContext)\n}\n","import { forwardRef, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport type { ThemeColor } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Tooltip } from '../Tooltip'\nimport { useSpeedDial } from './speedDialContext'\nimport styles from './SpeedDial.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface SpeedDialActionProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'color'\n> {\n /** Action icon — a known `IconName` or any node. */\n icon: IconName | ReactNode\n /** Label shown as a tooltip beside the action (also its `aria-label` when a string). */\n label?: ReactNode\n /** Show the label persistently (no hover) while the dial is open — overrides the dial's `tooltipOpen`. */\n tooltipOpen?: boolean\n /** Hide the tooltip / persistent label (still used for `aria-label`). */\n hideTooltip?: boolean\n /**\n * Tints the **icon** (the circle stays the neutral surface button) — e.g. `error` for a destructive action.\n * Omit for the default text color.\n */\n color?: ThemeColor\n}\n\n/**\n * One action inside a `<SpeedDial>` — a small circular `IconButton` (surface-tinted) with a tooltip\n * `label`. It reads the dial via context for its size, tooltip placement and close-on-click; clicking\n * runs `onClick` then closes the dial. The ref points at the `<button>`.\n */\nexport const SpeedDialAction = forwardRef<HTMLButtonElement, SpeedDialActionProps>(\n function SpeedDialAction(\n {\n icon,\n label,\n tooltipOpen,\n hideTooltip = false,\n color,\n onClick,\n disabled,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const dial = useSpeedDial()\n const iconNode =\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? <Icon name={icon as IconName} /> : icon\n\n const button = (\n <IconButton\n ref={ref}\n rounded\n variant=\"contained\"\n color=\"surface\"\n size={dial?.size ?? 'sm'}\n disabled={disabled}\n aria-label={typeof label === 'string' ? label : undefined}\n className={clsx(styles.action, className)}\n // the icon follows `color` (currentColor); the circle keeps its surface fill\n style={color ? { color: `var(--tz-color-${color})`, ...style } : style}\n onClick={(event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (dial?.closeOnClick) dial.requestClose()\n }}\n {...props}\n >\n {iconNode}\n </IconButton>\n )\n\n if (label == null || hideTooltip) return button\n\n const placement = dial?.placement ?? 'left'\n // persistent label: render a static label beside the button (no hover) — like MUI's tooltipOpen\n const persistent = tooltipOpen ?? dial?.persistentLabels ?? false\n if (persistent) {\n return (\n <span\n className={clsx(\n styles.actionWrap,\n placement === 'top' ? styles.labelTop : styles.labelLeft,\n )}\n >\n {button}\n <span className={styles.actionLabel}>{label}</span>\n </span>\n )\n }\n\n return (\n <Tooltip content={label} placement={placement}>\n {button}\n </Tooltip>\n )\n },\n)\n","import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport type { ThemeColor } from '../../theme'\nimport type { TooltipPlacement } from '../Tooltip'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { SpeedDialAction } from './SpeedDialAction'\nimport {\n SpeedDialContext,\n type SpeedDialActionSize,\n type SpeedDialContextValue,\n} from './speedDialContext'\nimport styles from './SpeedDial.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type SpeedDialSize = 'sm' | 'md' | 'lg'\nexport type SpeedDialDirection = 'up' | 'down' | 'left' | 'right'\n\n/** The FAB size → the (smaller) action-button size. */\nconst ACTION_SIZE: Record<SpeedDialSize, SpeedDialActionSize> = { sm: 'sm', md: 'sm', lg: 'md' }\n/** Tooltip side per direction — labels sit left of a vertical dial, above a horizontal one. */\nconst TOOLTIP_PLACEMENT: Record<SpeedDialDirection, TooltipPlacement> = {\n up: 'left',\n down: 'left',\n left: 'top',\n right: 'top',\n}\n\n/** A data-driven action for the `actions` prop. */\nexport interface SpeedDialActionItem {\n /** Stable key (falls back to the index). */\n key?: string\n icon: IconName | ReactNode\n label?: ReactNode\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void\n disabled?: boolean\n /** Tints the action's icon (e.g. `error` for a destructive one); the circle stays neutral. */\n color?: ThemeColor\n}\n\nexport interface SpeedDialProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color' | 'onChange'> {\n /** Accessible label for the FAB (required — it's icon-only). */\n ariaLabel: string\n /** FAB icon. Defaults to `Add` (a `+`). */\n icon?: IconName | ReactNode\n /** Icon shown while open. Omit to rotate the `icon` 45° instead (a `+` becomes a `×`). */\n openIcon?: IconName | ReactNode\n /** Which way the actions fan out. Defaults to `up`. */\n direction?: SpeedDialDirection\n /** Theme palette token tinting the FAB. Defaults to `primary`. */\n color?: ThemeColor\n /** FAB size (actions render one step smaller). Defaults to `md`. */\n size?: SpeedDialSize\n /** Controlled open state. */\n open?: boolean\n /** Initial open state for uncontrolled use. Defaults to `false`. */\n defaultOpen?: boolean\n /** Fires with the next open state. */\n onOpenChange?: (open: boolean) => void\n /** Open on hover (also opens on click). Defaults to `true`. */\n openOnHover?: boolean\n /** Close the dial after an action is clicked. Defaults to `true`. */\n closeOnActionClick?: boolean\n /** Show every action's label persistently while open (no hover needed) — like MUI's `tooltipOpen`. */\n tooltipOpen?: boolean\n /** Data-driven actions — an alternative to `<SpeedDialAction>` children. */\n actions?: SpeedDialActionItem[]\n /** Disables the FAB (and hover-opening). */\n disabled?: boolean\n /** `<SpeedDialAction>` children (used when `actions` is not given). */\n children?: ReactNode\n}\n\n/**\n * A floating action button that reveals a set of related actions on hover / click — fanning out in\n * `direction` (`up` default). The FAB icon rotates 45° when open (a `+` → `×`) unless an `openIcon` is\n * given. Each `<SpeedDialAction>` is a small circular button with a tooltip label; supply them via the\n * data-driven `actions` prop or as children. Opens on hover (`openOnHover`) and click; closes on\n * outside-pointerdown, Escape (refocusing the FAB), or selecting an action. Controlled (`open` +\n * `onOpenChange`) or uncontrolled (`defaultOpen`). The ref points at the root; position it (e.g.\n * `fixed` bottom-right) via `style`/`className`. The FAB carries `aria-expanded`/`aria-controls`.\n */\nexport const SpeedDial = forwardRef<HTMLDivElement, SpeedDialProps>(function SpeedDial(\n {\n ariaLabel,\n icon = 'Add',\n openIcon,\n direction = 'up',\n color = 'primary',\n size = 'md',\n open,\n defaultOpen = false,\n onOpenChange,\n openOnHover = true,\n closeOnActionClick = true,\n tooltipOpen = false,\n actions,\n disabled = false,\n children,\n className,\n style,\n ...props\n },\n forwardedRef,\n) {\n const rootRef = useRef<HTMLDivElement | null>(null)\n const fabRef = useRef<HTMLButtonElement | null>(null)\n const actionsId = useId()\n\n const isControlled = open !== undefined\n const [internal, setInternal] = useState(defaultOpen)\n const isOpen = isControlled ? open : internal\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setInternal(next)\n onOpenChange?.(next)\n }\n // keep a stable reference for the document listeners below\n const setOpenRef = useRef(setOpen)\n setOpenRef.current = setOpen\n\n // while open: close on outside pointerdown / Escape (Escape refocuses the FAB)\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setOpenRef.current(false)\n }\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpenRef.current(false)\n fabRef.current?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [isOpen])\n\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n }\n\n const renderIcon = (value: IconName | ReactNode) =>\n typeof value === 'string' && ICON_NAME_SET.has(value) ? (\n <Icon name={value as IconName} />\n ) : (\n value\n )\n\n const ctx: SpeedDialContextValue = {\n size: ACTION_SIZE[size],\n placement: TOOLTIP_PLACEMENT[direction],\n closeOnClick: closeOnActionClick,\n persistentLabels: tooltipOpen,\n requestClose: () => setOpen(false),\n }\n\n const hoverProps =\n openOnHover && !disabled\n ? { onMouseEnter: () => setOpen(true), onMouseLeave: () => setOpen(false) }\n : {}\n\n return (\n <div\n ref={setRootRef}\n className={clsx(styles.speedDial, className)}\n style={style as CSSProperties}\n {...hoverProps}\n {...props}\n >\n <div\n id={actionsId}\n className={clsx(styles.actions, styles[direction])}\n data-open={isOpen ? 'true' : 'false'}\n >\n <SpeedDialContext.Provider value={ctx}>\n {actions\n ? actions.map((action, index) => (\n <SpeedDialAction\n key={action.key ?? index}\n icon={action.icon}\n label={action.label}\n onClick={action.onClick}\n disabled={action.disabled}\n color={action.color}\n />\n ))\n : children}\n </SpeedDialContext.Provider>\n </div>\n\n <IconButton\n ref={fabRef}\n rounded\n variant=\"contained\"\n color={color}\n size={size}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n aria-controls={actionsId}\n className={styles.fab}\n onClick={() => setOpen(!isOpen)}\n >\n <span className={clsx(styles.fabIcon, !openIcon && isOpen && styles.fabIconOpen)}>\n {isOpen && openIcon != null ? renderIcon(openIcon) : renderIcon(icon)}\n </span>\n </IconButton>\n </div>\n )\n})\n"],"names":["SpeedDialContext","createContext","useSpeedDial","useContext","ICON_NAME_SET","ICON_NAMES","SpeedDialAction","forwardRef","icon","label","tooltipOpen","hideTooltip","color","onClick","disabled","className","style","props","ref","dial","iconNode","jsx","Icon","button","IconButton","clsx","styles","event","placement","jsxs","Tooltip","ACTION_SIZE","TOOLTIP_PLACEMENT","SpeedDial","ariaLabel","openIcon","direction","size","open","defaultOpen","onOpenChange","openOnHover","closeOnActionClick","actions","children","forwardedRef","rootRef","useRef","fabRef","actionsId","useId","isControlled","internal","setInternal","useState","isOpen","setOpen","next","setOpenRef","useEffect","onPointerDown","onKeyDown","_a","setRootRef","node","renderIcon","value","ctx","hoverProps","action","index"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const n=require("react/jsx-runtime"),o=require("react"),d=require("clsx"),N=require("./Icon-B6lz-V0A.cjs"),M=require("./IconButton-CxSXEYce.cjs"),F=require("./Tooltip-DmMq5R1x.cjs"),k=o.createContext(null);function G(){return o.useContext(k)}const H="_speedDial_1qwl9_4",J="_fab_1qwl9_9",Q="_fabIcon_1qwl9_17",U="_fabIconOpen_1qwl9_21",V="_actions_1qwl9_26",X="_up_1qwl9_47",Y="_down_1qwl9_53",ee="_left_1qwl9_59",te="_right_1qwl9_65",ne="_action_1qwl9_26",se="_actionWrap_1qwl9_91",oe="_actionLabel_1qwl9_95",ce="_labelLeft_1qwl9_110",re="_labelTop_1qwl9_117",s={speedDial:H,fab:J,fabIcon:Q,fabIconOpen:U,actions:V,up:X,down:Y,left:ee,right:te,action:ne,actionWrap:se,actionLabel:oe,labelLeft:ce,labelTop:re},le=new Set(N.ICON_NAMES),g=o.forwardRef(function({icon:l,label:c,tooltipOpen:p,hideTooltip:_=!1,color:b,onClick:a,disabled:m,className:L,style:i,...E},S){const t=G(),w=typeof l=="string"&&le.has(l)?n.jsx(N.Icon,{name:l}):l,u=n.jsx(M.IconButton,{ref:S,rounded:!0,variant:"contained",color:"surface",size:(t==null?void 0:t.size)??"sm",disabled:m,"aria-label":typeof c=="string"?c:void 0,className:d.clsx(s.action,L),style:b?{color:`var(--tz-color-${b})`,...i}:i,onClick:v=>{a==null||a(v),t!=null&&t.closeOnClick&&t.requestClose()},...E,children:w});if(c==null||_)return u;const x=(t==null?void 0:t.placement)??"left";return p??(t==null?void 0:t.persistentLabels)??!1?n.jsxs("span",{className:d.clsx(s.actionWrap,x==="top"?s.labelTop:s.labelLeft),children:[u,n.jsx("span",{className:s.actionLabel,children:c})]}):n.jsx(F.Tooltip,{content:c,placement:x,children:u})}),ae=new Set(N.ICON_NAMES),ie={sm:"sm",md:"sm",lg:"md"},ue={up:"left",down:"left",left:"top",right:"top"},fe=o.forwardRef(function({ariaLabel:l,icon:c="Add",openIcon:p,direction:_="up",color:b="primary",size:a="md",open:m,defaultOpen:L=!1,onOpenChange:i,openOnHover:E=!0,closeOnActionClick:S=!0,tooltipOpen:t=!1,actions:w,disabled:u=!1,children:x,className:O,style:v,...W},I){const D=o.useRef(null),T=o.useRef(null),y=o.useId(),A=m!==void 0,[z,B]=o.useState(L),r=A?m:z,f=e=>{A||B(e),i==null||i(e)},h=o.useRef(f);h.current=f,o.useEffect(()=>{if(!r)return;const e=j=>{D.current&&!D.current.contains(j.target)&&h.current(!1)},q=j=>{var R;j.key==="Escape"&&(h.current(!1),(R=T.current)==null||R.focus())};return document.addEventListener("pointerdown",e),document.addEventListener("keydown",q),()=>{document.removeEventListener("pointerdown",e),document.removeEventListener("keydown",q)}},[r]);const $=e=>{D.current=e,typeof I=="function"?I(e):I&&(I.current=e)},C=e=>typeof e=="string"&&ae.has(e)?n.jsx(N.Icon,{name:e}):e,K={size:ie[a],placement:ue[_],closeOnClick:S,persistentLabels:t,requestClose:()=>f(!1)},Z=E&&!u?{onMouseEnter:()=>f(!0),onMouseLeave:()=>f(!1)}:{};return n.jsxs("div",{ref:$,className:d.clsx(s.speedDial,O),style:v,...Z,...W,children:[n.jsx("div",{id:y,className:d.clsx(s.actions,s[_]),"data-open":r?"true":"false",children:n.jsx(k.Provider,{value:K,children:w?w.map((e,q)=>n.jsx(g,{icon:e.icon,label:e.label,onClick:e.onClick,disabled:e.disabled,color:e.color},e.key??q)):x})}),n.jsx(M.IconButton,{ref:T,rounded:!0,variant:"contained",color:b,size:a,disabled:u,"aria-label":l,"aria-haspopup":"true","aria-expanded":r,"aria-controls":y,className:s.fab,onClick:()=>f(!r),children:n.jsx("span",{className:d.clsx(s.fabIcon,!p&&r&&s.fabIconOpen),children:r&&p!=null?C(p):C(c)})})]})});exports.SpeedDial=fe;exports.SpeedDialAction=g;
2
- //# sourceMappingURL=SpeedDial-BT_boD06.cjs.map
1
+ "use strict";const n=require("react/jsx-runtime"),o=require("react"),d=require("clsx"),N=require("./Icon-B6lz-V0A.cjs"),M=require("./IconButton-CiDPeKM4.cjs"),F=require("./Tooltip-DmMq5R1x.cjs"),k=o.createContext(null);function G(){return o.useContext(k)}const H="_speedDial_1qwl9_4",J="_fab_1qwl9_9",Q="_fabIcon_1qwl9_17",U="_fabIconOpen_1qwl9_21",V="_actions_1qwl9_26",X="_up_1qwl9_47",Y="_down_1qwl9_53",ee="_left_1qwl9_59",te="_right_1qwl9_65",ne="_action_1qwl9_26",se="_actionWrap_1qwl9_91",oe="_actionLabel_1qwl9_95",ce="_labelLeft_1qwl9_110",re="_labelTop_1qwl9_117",s={speedDial:H,fab:J,fabIcon:Q,fabIconOpen:U,actions:V,up:X,down:Y,left:ee,right:te,action:ne,actionWrap:se,actionLabel:oe,labelLeft:ce,labelTop:re},le=new Set(N.ICON_NAMES),g=o.forwardRef(function({icon:l,label:c,tooltipOpen:p,hideTooltip:_=!1,color:b,onClick:a,disabled:m,className:L,style:i,...E},S){const t=G(),w=typeof l=="string"&&le.has(l)?n.jsx(N.Icon,{name:l}):l,u=n.jsx(M.IconButton,{ref:S,rounded:!0,variant:"contained",color:"surface",size:(t==null?void 0:t.size)??"sm",disabled:m,"aria-label":typeof c=="string"?c:void 0,className:d.clsx(s.action,L),style:b?{color:`var(--tz-color-${b})`,...i}:i,onClick:v=>{a==null||a(v),t!=null&&t.closeOnClick&&t.requestClose()},...E,children:w});if(c==null||_)return u;const x=(t==null?void 0:t.placement)??"left";return p??(t==null?void 0:t.persistentLabels)??!1?n.jsxs("span",{className:d.clsx(s.actionWrap,x==="top"?s.labelTop:s.labelLeft),children:[u,n.jsx("span",{className:s.actionLabel,children:c})]}):n.jsx(F.Tooltip,{content:c,placement:x,children:u})}),ae=new Set(N.ICON_NAMES),ie={sm:"sm",md:"sm",lg:"md"},ue={up:"left",down:"left",left:"top",right:"top"},fe=o.forwardRef(function({ariaLabel:l,icon:c="Add",openIcon:p,direction:_="up",color:b="primary",size:a="md",open:m,defaultOpen:L=!1,onOpenChange:i,openOnHover:E=!0,closeOnActionClick:S=!0,tooltipOpen:t=!1,actions:w,disabled:u=!1,children:x,className:O,style:v,...W},I){const D=o.useRef(null),T=o.useRef(null),y=o.useId(),A=m!==void 0,[z,B]=o.useState(L),r=A?m:z,f=e=>{A||B(e),i==null||i(e)},h=o.useRef(f);h.current=f,o.useEffect(()=>{if(!r)return;const e=j=>{D.current&&!D.current.contains(j.target)&&h.current(!1)},q=j=>{var R;j.key==="Escape"&&(h.current(!1),(R=T.current)==null||R.focus())};return document.addEventListener("pointerdown",e),document.addEventListener("keydown",q),()=>{document.removeEventListener("pointerdown",e),document.removeEventListener("keydown",q)}},[r]);const $=e=>{D.current=e,typeof I=="function"?I(e):I&&(I.current=e)},C=e=>typeof e=="string"&&ae.has(e)?n.jsx(N.Icon,{name:e}):e,K={size:ie[a],placement:ue[_],closeOnClick:S,persistentLabels:t,requestClose:()=>f(!1)},Z=E&&!u?{onMouseEnter:()=>f(!0),onMouseLeave:()=>f(!1)}:{};return n.jsxs("div",{ref:$,className:d.clsx(s.speedDial,O),style:v,...Z,...W,children:[n.jsx("div",{id:y,className:d.clsx(s.actions,s[_]),"data-open":r?"true":"false",children:n.jsx(k.Provider,{value:K,children:w?w.map((e,q)=>n.jsx(g,{icon:e.icon,label:e.label,onClick:e.onClick,disabled:e.disabled,color:e.color},e.key??q)):x})}),n.jsx(M.IconButton,{ref:T,rounded:!0,variant:"contained",color:b,size:a,disabled:u,"aria-label":l,"aria-haspopup":"true","aria-expanded":r,"aria-controls":y,className:s.fab,onClick:()=>f(!r),children:n.jsx("span",{className:d.clsx(s.fabIcon,!p&&r&&s.fabIconOpen),children:r&&p!=null?C(p):C(c)})})]})});exports.SpeedDial=fe;exports.SpeedDialAction=g;
2
+ //# sourceMappingURL=SpeedDial-i5kxikmt.cjs.map