@feugene/granularity 0.9.4 → 0.11.0

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 (457) hide show
  1. package/README.md +44 -45
  2. package/dist/GrButtonGroup.css +1 -1
  3. package/dist/GrFormFile.css +1 -1
  4. package/dist/GrIcon.css +1 -1
  5. package/dist/GrLoading.css +1 -1
  6. package/dist/GrSkeleton.css +1 -1
  7. package/dist/GrToaster.css +1 -0
  8. package/dist/GrTree.css +1 -1
  9. package/dist/chunks/{adapter-BqqjEZGU.js.map → adapter-CAOxmn2G.js.map} +1 -1
  10. package/dist/chunks/arrow-up-C_G4jg8M.js.map +1 -0
  11. package/dist/chunks/{classTokens-BPeBXNzu.js.map → classTokens-BzazaERD.js.map} +1 -1
  12. package/dist/chunks/{config-B_nSBc7W.js → config-1uSYl98Y.js} +5 -5
  13. package/dist/chunks/{config-B_nSBc7W.js.map → config-1uSYl98Y.js.map} +1 -1
  14. package/dist/chunks/{config-DaHI5bD_2.js.map → config-8Pcutu1j2.js.map} +1 -1
  15. package/dist/chunks/{config-DoBk_CzG.js.map → config-B0qIpo8m.js.map} +1 -1
  16. package/dist/chunks/{config-BY81UKv0.js → config-B7IIWGt_2.js} +3 -3
  17. package/dist/chunks/config-B7IIWGt_2.js.map +1 -0
  18. package/dist/chunks/{config-DbghHyY_.js.map → config-BEegFP74.js.map} +1 -1
  19. package/dist/chunks/{config-72sW9Bag2.js → config-BIRO0vDJ2.js} +6 -6
  20. package/dist/chunks/{config-72sW9Bag2.js.map → config-BIRO0vDJ2.js.map} +1 -1
  21. package/dist/chunks/{config-Dzd6BzIN2.js.map → config-BLHqZhy-2.js.map} +1 -1
  22. package/dist/chunks/{config-BV4vBzdm.js.map → config-BNu8lFQB.js.map} +1 -1
  23. package/dist/chunks/config-BOlr7qw7.js +106 -0
  24. package/dist/chunks/config-BOlr7qw7.js.map +1 -0
  25. package/dist/chunks/{config-B1kFmhpM.js.map → config-BUHuGBik.js.map} +1 -1
  26. package/dist/chunks/{config-DF_RlCIO.js.map → config-BWGGp7uV.js.map} +1 -1
  27. package/dist/chunks/config-BX1JTrkV2.js +14 -0
  28. package/dist/chunks/config-BX1JTrkV2.js.map +1 -0
  29. package/dist/chunks/{config-BduXEXjt.js.map → config-BXtAmU3s.js.map} +1 -1
  30. package/dist/chunks/{config-O1_FTqD3.js.map → config-Bah4oHwL.js.map} +1 -1
  31. package/dist/chunks/{config-Br_qI3Za.js → config-C49QUoJL.js} +3 -3
  32. package/dist/chunks/config-C49QUoJL.js.map +1 -0
  33. package/dist/chunks/{config-3I3vqDW4.js → config-C4snOIXg.js} +1 -1
  34. package/dist/chunks/{config-3I3vqDW4.js.map → config-C4snOIXg.js.map} +1 -1
  35. package/dist/chunks/{config-CdJpnjDj.js → config-C7NpDrfO.js} +5 -5
  36. package/dist/chunks/{config-CdJpnjDj.js.map → config-C7NpDrfO.js.map} +1 -1
  37. package/dist/chunks/{config-DSBlHQVa.js.map → config-C86UzUYf.js.map} +1 -1
  38. package/dist/chunks/{config-BgBWt9-A.js.map → config-C9AcVDkv.js.map} +1 -1
  39. package/dist/chunks/{config-BeQuykDk2.js.map → config-CGHLoBlH2.js.map} +1 -1
  40. package/dist/chunks/{config-ChQxl75m.js.map → config-CThzliFi.js.map} +1 -1
  41. package/dist/chunks/{config-DmjwIqx1.js.map → config-Cb2PAlSD.js.map} +1 -1
  42. package/dist/chunks/{config-BnWSHTEU.js → config-ClhKPJvg.js} +5 -5
  43. package/dist/chunks/{config-BnWSHTEU.js.map → config-ClhKPJvg.js.map} +1 -1
  44. package/dist/chunks/{config-d386uO3O.js → config-Cpi9Mh2J.js} +3 -3
  45. package/dist/chunks/{config-d386uO3O.js.map → config-Cpi9Mh2J.js.map} +1 -1
  46. package/dist/chunks/{config-Cp_XHsze.js → config-CrG1XiE7.js} +4 -4
  47. package/dist/chunks/{config-Cp_XHsze.js.map → config-CrG1XiE7.js.map} +1 -1
  48. package/dist/chunks/{config-C5OwJM3-.js → config-CziwTDDL.js} +3 -3
  49. package/dist/chunks/{config-C5OwJM3-.js.map → config-CziwTDDL.js.map} +1 -1
  50. package/dist/chunks/{config-BbKroFtR.js.map → config-D7GZO-Dx.js.map} +1 -1
  51. package/dist/chunks/{config-CUwF4E4R.js.map → config-DBmdgoVf.js.map} +1 -1
  52. package/dist/chunks/{config-C9MblwGq.js.map → config-DICOd-2X.js.map} +1 -1
  53. package/dist/chunks/{config-C6zT56Jc2.js → config-DUcu1D68.js} +3 -3
  54. package/dist/chunks/config-DUcu1D68.js.map +1 -0
  55. package/dist/chunks/{config-D4s_QWVP.js → config-D_R56_gT.js} +5 -5
  56. package/dist/chunks/{config-D4s_QWVP.js.map → config-D_R56_gT.js.map} +1 -1
  57. package/dist/chunks/{config-_3De4HFf.js → config-DezDih8_.js} +4 -4
  58. package/dist/chunks/config-DezDih8_.js.map +1 -0
  59. package/dist/chunks/{config-CFf7xaG1.js → config-DnvPqu4g.js} +3 -3
  60. package/dist/chunks/{config-CFf7xaG1.js.map → config-DnvPqu4g.js.map} +1 -1
  61. package/dist/chunks/{config-D6Oe3blW2.js.map → config-DpqOnJiz2.js.map} +1 -1
  62. package/dist/chunks/{config-V3LF-b_F.js.map → config-Dxuwwepq.js.map} +1 -1
  63. package/dist/chunks/{config-CvGdaXvH.js.map → config-HZto2PVy.js.map} +1 -1
  64. package/dist/chunks/{config-BOdu-O_B.js.map → config-JOtB4mzs.js.map} +1 -1
  65. package/dist/chunks/{config-iuMz79Mg.js.map → config-JpHA4Xx0.js.map} +1 -1
  66. package/dist/chunks/{config-CetsgpaZ2.js → config-LGrZIdaZ2.js} +1 -1
  67. package/dist/chunks/{config-CetsgpaZ2.js.map → config-LGrZIdaZ2.js.map} +1 -1
  68. package/dist/chunks/{config-Dcb7xK-C.js.map → config-PFg39mYo.js.map} +1 -1
  69. package/dist/chunks/{config-CU_CBd0k.js → config-QYGvEBu5.js} +2 -2
  70. package/dist/chunks/{config-CU_CBd0k.js.map → config-QYGvEBu5.js.map} +1 -1
  71. package/dist/chunks/{config-BU0olrvr.js.map → config-QaIc_gRa.js.map} +1 -1
  72. package/dist/chunks/{config-vcDVCYXo.js.map → config-U4m9PSql.js.map} +1 -1
  73. package/dist/chunks/{config-Ci9nXGUV.js.map → config-ZiXWIRBX.js.map} +1 -1
  74. package/dist/chunks/{config-B2YTEe_h.js → config-eYLZYOUS2.js} +63 -63
  75. package/dist/chunks/config-eYLZYOUS2.js.map +1 -0
  76. package/dist/chunks/{config-Bcf-8XlK2.js.map → config-ipvU0lzP2.js.map} +1 -1
  77. package/dist/chunks/{config-B61cX08u.js → config-jBp9wVv-.js} +4 -4
  78. package/dist/chunks/{config-B61cX08u.js.map → config-jBp9wVv-.js.map} +1 -1
  79. package/dist/chunks/{config-D5ek7VSi.js.map → config-xR4XVmcy.js.map} +1 -1
  80. package/dist/chunks/{dialogShared-BtXUk6Zc.js.map → dialogShared-CxW62PQE.js.map} +1 -1
  81. package/dist/chunks/en-BdtiS2d3.js +138 -0
  82. package/dist/chunks/en-BdtiS2d3.js.map +1 -0
  83. package/dist/chunks/es-BGRMZbe9.js +138 -0
  84. package/dist/chunks/es-BGRMZbe9.js.map +1 -0
  85. package/dist/chunks/{es-Bx3Kuy6z.js → es-DBhctWg-.js} +3 -3
  86. package/dist/chunks/{es-Bx3Kuy6z.js.map → es-DBhctWg-.js.map} +1 -1
  87. package/dist/chunks/{fileValidation-c_iBg74s.js → fileValidation-C3WFaWU2.js} +2 -1
  88. package/dist/chunks/{fileValidation-c_iBg74s.js.map → fileValidation-C3WFaWU2.js.map} +1 -1
  89. package/dist/chunks/{grBadgeStyles-Cq0hH2Ls.js → grBadgeStyles-DrycBuKT.js} +13 -13
  90. package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +1 -0
  91. package/dist/chunks/grButtonStyles-C7Yga_Q1.js +191 -0
  92. package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +1 -0
  93. package/dist/chunks/grDropdownStyles-B_-DKytw.js +35 -0
  94. package/dist/chunks/grDropdownStyles-B_-DKytw.js.map +1 -0
  95. package/dist/chunks/{grLoadingStyles-DmI-SJ3i.js.map → grLoadingStyles-R5sreH__.js.map} +1 -1
  96. package/dist/chunks/{grModalStyles-DS1Vl6EW.js → grModalStyles-DWd3i05Q.js} +7 -7
  97. package/dist/chunks/grModalStyles-DWd3i05Q.js.map +1 -0
  98. package/dist/chunks/{grSelectStyles-pUt19VGy.js → grSelectStyles-CLK5hRd3.js} +3 -3
  99. package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +1 -0
  100. package/dist/chunks/{grStyle-CUaTmpyW.js → grStyle-Blc9otAx.js} +6 -6
  101. package/dist/chunks/grStyle-Blc9otAx.js.map +1 -0
  102. package/dist/chunks/{granularityI18n-LcJ88Vce.js → granularityI18n-DoV7Ca2m.js} +18 -3
  103. package/dist/chunks/granularityI18n-DoV7Ca2m.js.map +1 -0
  104. package/dist/chunks/info-Be2OccTu.js.map +1 -0
  105. package/dist/chunks/loader-circle-CfVLz7lb.js.map +1 -0
  106. package/dist/chunks/ru-BFCnOiML.js +138 -0
  107. package/dist/chunks/ru-BFCnOiML.js.map +1 -0
  108. package/dist/chunks/{safelist-_UVzJrgE2.js → safelist-CkF4v7DC.js} +3 -3
  109. package/dist/chunks/safelist-CkF4v7DC.js.map +1 -0
  110. package/dist/chunks/{safelist-DccvJqCE.js → safelist-Do2RtzLB.js} +3 -3
  111. package/dist/chunks/{safelist-DccvJqCE.js.map → safelist-Do2RtzLB.js.map} +1 -1
  112. package/dist/chunks/shared-ChvcQgDl.js +168 -0
  113. package/dist/chunks/shared-ChvcQgDl.js.map +1 -0
  114. package/dist/chunks/{transition-mJ3PZCHH.js → transition-TLFw4KBn.js} +26 -12
  115. package/dist/chunks/{transition-mJ3PZCHH.js.map → transition-TLFw4KBn.js.map} +1 -1
  116. package/dist/chunks/useAddonMeasurement-DM0akF4C.js +65 -0
  117. package/dist/chunks/useAddonMeasurement-DM0akF4C.js.map +1 -0
  118. package/dist/chunks/useEscapeToClose-C2t_S1gh.js +27 -0
  119. package/dist/chunks/useEscapeToClose-C2t_S1gh.js.map +1 -0
  120. package/dist/chunks/useFloating-DtM6TyE4.js +1249 -0
  121. package/dist/chunks/useFloating-DtM6TyE4.js.map +1 -0
  122. package/dist/chunks/x-2KXnqxiD.js.map +1 -0
  123. package/dist/chunks/x-circle-BCBURwyX.js.map +1 -0
  124. package/dist/components/GrAlert/chunks/{GrAlert-HyCjYJeL.js → GrAlert-DPJSU_fG.js} +40 -37
  125. package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +1 -0
  126. package/dist/components/GrAlert/index.js +2 -2
  127. package/dist/components/GrAvatar/chunks/{GrAvatar-BjnPKNAL.js → GrAvatar-96CpTCq5.js} +2 -2
  128. package/dist/components/GrAvatar/chunks/{GrAvatar-BjnPKNAL.js.map → GrAvatar-96CpTCq5.js.map} +1 -1
  129. package/dist/components/GrAvatar/index.js +2 -2
  130. package/dist/components/GrBadge/chunks/{GrBadge-Cs_cVfuO.js → GrBadge-B77XlaqE.js} +3 -3
  131. package/dist/components/GrBadge/chunks/{GrBadge-Cs_cVfuO.js.map → GrBadge-B77XlaqE.js.map} +1 -1
  132. package/dist/components/GrBadge/index.js +2 -2
  133. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-BEnE9DyJ.js → GrBadgeWrap-CcktMOdg.js} +2 -2
  134. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-BEnE9DyJ.js.map → GrBadgeWrap-CcktMOdg.js.map} +1 -1
  135. package/dist/components/GrBadgeWrap/index.js +2 -2
  136. package/dist/components/GrBottomNav/chunks/{GrBottomNav-XPHwd7UQ.js.map → GrBottomNav-usuMgG8_.js.map} +1 -1
  137. package/dist/components/GrBottomNav/index.js +2 -2
  138. package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js +124 -0
  139. package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +1 -0
  140. package/dist/components/GrButton/index.js +4 -4
  141. package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-CPOH6V-P.js → GrButtonGroup-Bs9dEKfA.js} +1 -1
  142. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-Bs9dEKfA.js.map +1 -0
  143. package/dist/components/GrButtonGroup/index.js +2 -2
  144. package/dist/components/GrCard/chunks/{GrCard-6yk1RRAQ.js → GrCard-DUNMkuHW.js} +3 -3
  145. package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +1 -0
  146. package/dist/components/GrCard/index.js +2 -2
  147. package/dist/components/GrCheckbox/chunks/{GrCheckbox-Bt3d7ckE.js → GrCheckbox-DJhzZZdO.js} +66 -18
  148. package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +1 -0
  149. package/dist/components/GrCheckbox/index.js +2 -2
  150. package/dist/components/GrCollapse/chunks/{GrCollapse-CU94BTAR.js → GrCollapse-CPPLh_xU.js} +12 -12
  151. package/dist/components/GrCollapse/chunks/{GrCollapse-CU94BTAR.js.map → GrCollapse-CPPLh_xU.js.map} +1 -1
  152. package/dist/components/GrCollapse/index.js +2 -2
  153. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Br6WJkLE.js → GrConfirmDialog-BWYKCsHd.js} +20 -14
  154. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-BWYKCsHd.js.map +1 -0
  155. package/dist/components/GrConfirmDialog/index.js +2 -2
  156. package/dist/components/GrDataTable/chunks/{GrDataTable-ClcYiyc8.js → GrDataTable-ptbARmJ3.js} +7 -7
  157. package/dist/components/GrDataTable/chunks/{GrDataTable-ClcYiyc8.js.map → GrDataTable-ptbARmJ3.js.map} +1 -1
  158. package/dist/components/GrDataTable/index.js +2 -2
  159. package/dist/components/GrDialog/chunks/{GrDialog-C7XLxp8e.js → GrDialog-5DAS-1Lb.js} +14 -12
  160. package/dist/components/GrDialog/chunks/GrDialog-5DAS-1Lb.js.map +1 -0
  161. package/dist/components/GrDialog/index.js +3 -3
  162. package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js +425 -0
  163. package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js.map +1 -0
  164. package/dist/components/GrDialogService/index.js +3 -0
  165. package/dist/components/GrDrawer/chunks/{GrDrawer-BW3wtI7h.js → GrDrawer-D1kzsjXN.js} +19 -15
  166. package/dist/components/GrDrawer/chunks/GrDrawer-D1kzsjXN.js.map +1 -0
  167. package/dist/components/GrDrawer/index.js +2 -2
  168. package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js +95 -0
  169. package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js.map +1 -0
  170. package/dist/components/GrDropdown/index.js +2 -2
  171. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-CLPwbiyG.js → GrDropdownMenu-DFEJLPcV.js} +10 -10
  172. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-CLPwbiyG.js.map → GrDropdownMenu-DFEJLPcV.js.map} +1 -1
  173. package/dist/components/GrDropdownMenu/index.js +2 -2
  174. package/dist/components/GrEmptyState/chunks/{GrEmptyState-Dj2V5GaX.js → GrEmptyState-CA3BiTV7.js} +3 -3
  175. package/dist/components/GrEmptyState/chunks/{GrEmptyState-Dj2V5GaX.js.map → GrEmptyState-CA3BiTV7.js.map} +1 -1
  176. package/dist/components/GrEmptyState/index.js +2 -2
  177. package/dist/components/GrFileUpload/chunks/{GrFileUpload-BEKNB1RM.js → GrFileUpload-DvWPpiJS.js} +26 -23
  178. package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +1 -0
  179. package/dist/components/GrFileUpload/index.js +3 -3
  180. package/dist/components/GrFormField/chunks/{GrFormField-U7c_aDPJ.js → GrFormField-BujNQrw8.js} +1 -1
  181. package/dist/components/GrFormField/chunks/{GrFormField-U7c_aDPJ.js.map → GrFormField-BujNQrw8.js.map} +1 -1
  182. package/dist/components/GrFormField/index.js +2 -2
  183. package/dist/components/GrFormFile/chunks/{GrFormFile-CIleXnfr.js → GrFormFile-CXcqqdvV.js} +38 -31
  184. package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +1 -0
  185. package/dist/components/GrFormFile/index.js +2 -2
  186. package/dist/components/GrFormSection/chunks/{GrFormSection-DpGhY7MX.js → GrFormSection-Ce21jcgo.js} +1 -1
  187. package/dist/components/GrFormSection/chunks/{GrFormSection-DpGhY7MX.js.map → GrFormSection-Ce21jcgo.js.map} +1 -1
  188. package/dist/components/GrFormSection/index.js +2 -2
  189. package/dist/components/GrIcon/chunks/{GrIcon-BV7RBU_0.js → GrIcon-D9AWQLk2.js} +3 -3
  190. package/dist/components/GrIcon/chunks/{GrIcon-BV7RBU_0.js.map → GrIcon-D9AWQLk2.js.map} +1 -1
  191. package/dist/components/GrIcon/index.js +2 -2
  192. package/dist/components/GrImageViewer/chunks/{GrImageViewer-CsvXQHM9.js → GrImageViewer-OCUIrNh2.js} +44 -33
  193. package/dist/components/GrImageViewer/chunks/GrImageViewer-OCUIrNh2.js.map +1 -0
  194. package/dist/components/GrImageViewer/index.js +2 -2
  195. package/dist/components/GrInput/chunks/{GrInput-gwFQ1sk4.js → GrInput-C8pOJgCi.js} +43 -66
  196. package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js.map +1 -0
  197. package/dist/components/GrInput/index.js +2 -2
  198. package/dist/components/GrInputTag/chunks/{GrInputTag-Dcj3F6rQ.js → GrInputTag-zMgFqp2g.js} +27 -24
  199. package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +1 -0
  200. package/dist/components/GrInputTag/index.js +2 -2
  201. package/dist/components/GrLink/chunks/{GrLink-BMwn2iJ9.js → GrLink-CYUe-Q8k.js} +14 -7
  202. package/dist/components/GrLink/chunks/GrLink-CYUe-Q8k.js.map +1 -0
  203. package/dist/components/GrLink/index.js +2 -2
  204. package/dist/components/GrList/chunks/{GrList-D8nM1FuV.js → GrList-Dx772Ns4.js} +1 -1
  205. package/dist/components/GrList/chunks/{GrList-D8nM1FuV.js.map → GrList-Dx772Ns4.js.map} +1 -1
  206. package/dist/components/GrList/index.js +2 -2
  207. package/dist/components/GrLoading/chunks/{GrLoading-mfyfghxs.js → GrLoading--X_7rdbb.js} +7 -7
  208. package/dist/components/GrLoading/chunks/{GrLoading-mfyfghxs.js.map → GrLoading--X_7rdbb.js.map} +1 -1
  209. package/dist/components/GrLoading/index.js +2 -2
  210. package/dist/components/GrModal/chunks/{GrModal-lh0lOmoi.js → GrModal-BkjW9jZS.js} +7 -7
  211. package/dist/components/GrModal/chunks/{GrModal-lh0lOmoi.js.map → GrModal-BkjW9jZS.js.map} +1 -1
  212. package/dist/components/GrModal/index.js +3 -3
  213. package/dist/components/GrNavbar/chunks/{GrNavbar-BH7XiF9q.js → GrNavbar-DW3MiIIf.js} +6 -6
  214. package/dist/components/GrNavbar/chunks/{GrNavbar-BH7XiF9q.js.map → GrNavbar-DW3MiIIf.js.map} +1 -1
  215. package/dist/components/GrNavbar/index.js +2 -2
  216. package/dist/components/GrNumberInput/chunks/{GrNumberInput-YIWhV85S.js → GrNumberInput-CldPIWQx.js} +51 -61
  217. package/dist/components/GrNumberInput/chunks/GrNumberInput-CldPIWQx.js.map +1 -0
  218. package/dist/components/GrNumberInput/index.js +2 -2
  219. package/dist/components/GrPagination/chunks/GrPagination-Bu9wv6it.js +165 -0
  220. package/dist/components/GrPagination/chunks/GrPagination-Bu9wv6it.js.map +1 -0
  221. package/dist/components/GrPagination/index.js +2 -2
  222. package/dist/components/GrProgressBar/chunks/{GrProgressBar-C2HdYjp4.js → GrProgressBar-CC3z-Zqp.js} +3 -3
  223. package/dist/components/GrProgressBar/chunks/{GrProgressBar-C2HdYjp4.js.map → GrProgressBar-CC3z-Zqp.js.map} +1 -1
  224. package/dist/components/GrProgressBar/index.js +2 -2
  225. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BV4EW3XO.js → GrPromptDialog-TmWXbpEP.js} +31 -23
  226. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-TmWXbpEP.js.map +1 -0
  227. package/dist/components/GrPromptDialog/index.js +2 -2
  228. package/dist/components/GrRadio/chunks/{GrRadio-IFU9Hiu2.js → GrRadio-CPTixXaY.js} +6 -6
  229. package/dist/components/GrRadio/chunks/{GrRadio-IFU9Hiu2.js.map → GrRadio-CPTixXaY.js.map} +1 -1
  230. package/dist/components/GrRadio/index.js +2 -2
  231. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-C8IcJuuF.js → GrRadioGroup-vKZCbkCp.js} +3 -3
  232. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-C8IcJuuF.js.map → GrRadioGroup-vKZCbkCp.js.map} +1 -1
  233. package/dist/components/GrRadioGroup/index.js +2 -2
  234. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BMvXREcv.js → GrResponseErrorBanner-BWJNe2gr.js} +21 -18
  235. package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-BWJNe2gr.js.map +1 -0
  236. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CzdTh4gd.js → GrResponseErrorBanner-Cdu9ekK9.js} +5 -5
  237. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CzdTh4gd.js.map → GrResponseErrorBanner-Cdu9ekK9.js.map} +1 -1
  238. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  239. package/dist/components/GrSegmented/chunks/{GrSegmented-BRmwBsEG.js → GrSegmented-C1y0UXpQ.js} +5 -5
  240. package/dist/components/GrSegmented/chunks/{GrSegmented-BRmwBsEG.js.map → GrSegmented-C1y0UXpQ.js.map} +1 -1
  241. package/dist/components/GrSegmented/index.js +2 -2
  242. package/dist/components/GrSelect/chunks/{GrSelect-CnHdbPlf.js → GrSelect-RShK21lK.js} +106 -112
  243. package/dist/components/GrSelect/chunks/GrSelect-RShK21lK.js.map +1 -0
  244. package/dist/components/GrSelect/index.js +2 -2
  245. package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js +238 -0
  246. package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +1 -0
  247. package/dist/components/GrSidebar/index.js +3 -3
  248. package/dist/components/GrSkeleton/chunks/{GrSkeleton-URyMkBqI.js → GrSkeleton-DsN-_CDZ.js} +1 -1
  249. package/dist/components/GrSkeleton/chunks/{GrSkeleton-URyMkBqI.js.map → GrSkeleton-DsN-_CDZ.js.map} +1 -1
  250. package/dist/components/GrSkeleton/index.js +2 -2
  251. package/dist/components/GrSwitch/chunks/{GrSwitch-29h0QhMO.js → GrSwitch-DAioyccZ.js} +10 -10
  252. package/dist/components/GrSwitch/chunks/{GrSwitch-29h0QhMO.js.map → GrSwitch-DAioyccZ.js.map} +1 -1
  253. package/dist/components/GrSwitch/index.js +2 -2
  254. package/dist/components/GrTable/chunks/{GrTable-dTWUxzRm.js → GrTable-Db3hRnKA.js} +3 -3
  255. package/dist/components/GrTable/chunks/{GrTable-dTWUxzRm.js.map → GrTable-Db3hRnKA.js.map} +1 -1
  256. package/dist/components/GrTable/index.js +2 -2
  257. package/dist/components/GrTabs/chunks/{GrTabs-D3ntDdtg.js → GrTabs-Z-FDJUr_.js} +3 -3
  258. package/dist/components/GrTabs/chunks/{GrTabs-D3ntDdtg.js.map → GrTabs-Z-FDJUr_.js.map} +1 -1
  259. package/dist/components/GrTabs/index.js +2 -2
  260. package/dist/components/GrTextarea/chunks/{GrTextarea-Cv6r2GuC.js → GrTextarea-D56YxhKq.js} +3 -3
  261. package/dist/components/GrTextarea/chunks/{GrTextarea-Cv6r2GuC.js.map → GrTextarea-D56YxhKq.js.map} +1 -1
  262. package/dist/components/GrTextarea/index.js +2 -2
  263. package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js +189 -0
  264. package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js.map +1 -0
  265. package/dist/components/GrToaster/index.js +2 -2
  266. package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js +109 -0
  267. package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +1 -0
  268. package/dist/components/GrTooltip/index.js +2 -2
  269. package/dist/components/GrTree/chunks/{GrTree-B2SMU5Py.js → GrTree-D3ODe2dB.js} +40 -35
  270. package/dist/components/GrTree/chunks/GrTree-D3ODe2dB.js.map +1 -0
  271. package/dist/components/GrTree/index.js +2 -2
  272. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-C1abr5uH.js → GrTreeSelect-B2xBKs5Q.js} +21 -49
  273. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B2xBKs5Q.js.map +1 -0
  274. package/dist/components/GrTreeSelect/index.js +2 -2
  275. package/dist/composables/useTheme.js +48 -8
  276. package/dist/composables/useTheme.js.map +1 -1
  277. package/dist/composables/useToast.js +88 -26
  278. package/dist/composables/useToast.js.map +1 -1
  279. package/dist/directives/autofocus.js.map +1 -1
  280. package/dist/directives/autosize.js.map +1 -1
  281. package/dist/directives/clickOutside.js.map +1 -1
  282. package/dist/directives/dropzone.js +6 -5
  283. package/dist/directives/dropzone.js.map +1 -1
  284. package/dist/directives/hotkey.js +24 -7
  285. package/dist/directives/hotkey.js.map +1 -1
  286. package/dist/directives/loading.js +2 -2
  287. package/dist/directives/loading.js.map +1 -1
  288. package/dist/fileValidation/index.js +1 -1
  289. package/dist/granular-provider-node.js +7 -7
  290. package/dist/granular-provider-node.js.map +1 -1
  291. package/dist/granular-provider.js +1 -1
  292. package/dist/granular-provider.js.map +1 -1
  293. package/dist/i18n/all.js +1 -1
  294. package/dist/i18n/all.js.map +1 -1
  295. package/dist/i18n/index.js +2 -2
  296. package/dist/index.js +109 -534
  297. package/dist/index.js.map +1 -1
  298. package/dist/styles/base.css +32 -0
  299. package/dist/styles/index.css +15 -0
  300. package/dist/styles/preflight.css +29 -0
  301. package/dist/styles/themes/dark.css +107 -0
  302. package/dist/styles/themes/light.css +98 -0
  303. package/dist/styles/tokens.css +135 -0
  304. package/dist/types/src/components/GrButton/GrButton.vue.d.ts +25 -2
  305. package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +7 -2
  306. package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +8 -8
  307. package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +1 -1
  308. package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +2 -2
  309. package/dist/types/src/components/GrDialog/GrDialogHeader.vue.d.ts +2 -2
  310. package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +2 -2
  311. package/dist/types/src/components/GrDropdown/grDropdownStyles.d.ts +3 -2
  312. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +2 -2
  313. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuGroup.vue.d.ts +1 -1
  314. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuList.vue.d.ts +2 -2
  315. package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +5 -5
  316. package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +11 -11
  317. package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +18 -18
  318. package/dist/types/src/components/GrInput/GrInput.vue.d.ts +14 -0
  319. package/dist/types/src/components/GrInput/grInputStyles.d.ts +3 -3
  320. package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +2 -2
  321. package/dist/types/src/components/GrLink/GrLink.vue.d.ts +11 -5
  322. package/dist/types/src/components/GrLink/grLinkStyles.d.ts +31 -3
  323. package/dist/types/src/components/GrLink/index.d.ts +1 -1
  324. package/dist/types/src/components/GrLoading/GrLoading.vue.d.ts +1 -1
  325. package/dist/types/src/components/GrModal/grModalStyles.d.ts +2 -2
  326. package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +17 -4
  327. package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +13 -1
  328. package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +12 -12
  329. package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +2 -2
  330. package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +5 -5
  331. package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +7 -7
  332. package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +2 -1
  333. package/dist/types/src/components/GrSidebar/GrSidebar.vue.d.ts +33 -10
  334. package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +64 -0
  335. package/dist/types/src/components/GrSidebar/index.d.ts +1 -0
  336. package/dist/types/src/components/GrSidebar/sidebarContext.d.ts +9 -0
  337. package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +1 -1
  338. package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
  339. package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +9 -4
  340. package/dist/types/src/components/GrTree/GrTree.vue.d.ts +1 -1
  341. package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +2 -2
  342. package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  343. package/dist/types/src/components/GrTreeSelect/grTreeSelectTypes.d.ts +1 -1
  344. package/dist/types/src/composables/internal/useAddonMeasurement.d.ts +18 -0
  345. package/dist/types/src/composables/internal/useEscapeToClose.d.ts +11 -0
  346. package/dist/types/src/composables/internal/useFloating.d.ts +53 -0
  347. package/dist/types/src/composables/useTheme.d.ts +5 -2
  348. package/dist/types/src/composables/useToast.d.ts +33 -1
  349. package/dist/types/src/directives/hotkey.d.ts +14 -0
  350. package/dist/types/src/granular-provider/shared.d.ts +1 -3
  351. package/dist/types/src/i18n/messages/en.d.ts +132 -0
  352. package/dist/types/src/i18n/messages/es.d.ts +132 -0
  353. package/dist/types/src/i18n/messages/ru.d.ts +132 -0
  354. package/dist/types/src/index.d.ts +2 -2
  355. package/dist/vue/index.js.map +1 -1
  356. package/dist/web-types.json +4673 -0
  357. package/package.json +33 -19
  358. package/dist/chunks/arrow-up-DZdIrpaF.js.map +0 -1
  359. package/dist/chunks/config-B2YTEe_h.js.map +0 -1
  360. package/dist/chunks/config-BY81UKv0.js.map +0 -1
  361. package/dist/chunks/config-Br_qI3Za.js.map +0 -1
  362. package/dist/chunks/config-C6zT56Jc2.js.map +0 -1
  363. package/dist/chunks/config-CpMYmvVT.js +0 -59
  364. package/dist/chunks/config-CpMYmvVT.js.map +0 -1
  365. package/dist/chunks/config-_3De4HFf.js.map +0 -1
  366. package/dist/chunks/en-foQA8imU.js +0 -65
  367. package/dist/chunks/en-foQA8imU.js.map +0 -1
  368. package/dist/chunks/es-DZFSojYL.js +0 -65
  369. package/dist/chunks/es-DZFSojYL.js.map +0 -1
  370. package/dist/chunks/grBadgeStyles-Cq0hH2Ls.js.map +0 -1
  371. package/dist/chunks/grButtonStyles-DKuXUemw.js +0 -191
  372. package/dist/chunks/grButtonStyles-DKuXUemw.js.map +0 -1
  373. package/dist/chunks/grDropdownStyles-B41mVR1H.js +0 -32
  374. package/dist/chunks/grDropdownStyles-B41mVR1H.js.map +0 -1
  375. package/dist/chunks/grModalStyles-DS1Vl6EW.js.map +0 -1
  376. package/dist/chunks/grSelectStyles-pUt19VGy.js.map +0 -1
  377. package/dist/chunks/grStyle-CUaTmpyW.js.map +0 -1
  378. package/dist/chunks/granularityI18n-LcJ88Vce.js.map +0 -1
  379. package/dist/chunks/info-C0bHmdZq.js.map +0 -1
  380. package/dist/chunks/loader-circle-BUntgosj.js.map +0 -1
  381. package/dist/chunks/ru-LhkPpPIl.js +0 -65
  382. package/dist/chunks/ru-LhkPpPIl.js.map +0 -1
  383. package/dist/chunks/safelist-_UVzJrgE2.js.map +0 -1
  384. package/dist/chunks/shared-BiqXd5MW.js +0 -169
  385. package/dist/chunks/shared-BiqXd5MW.js.map +0 -1
  386. package/dist/chunks/x-Pa6C2hwi.js.map +0 -1
  387. package/dist/chunks/x-circle-DQSlBLmX.js.map +0 -1
  388. package/dist/components/GrAlert/chunks/GrAlert-HyCjYJeL.js.map +0 -1
  389. package/dist/components/GrButton/chunks/GrButton-CPDKonoB.js +0 -83
  390. package/dist/components/GrButton/chunks/GrButton-CPDKonoB.js.map +0 -1
  391. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CPOH6V-P.js.map +0 -1
  392. package/dist/components/GrCard/chunks/GrCard-6yk1RRAQ.js.map +0 -1
  393. package/dist/components/GrCheckbox/chunks/GrCheckbox-Bt3d7ckE.js.map +0 -1
  394. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-Br6WJkLE.js.map +0 -1
  395. package/dist/components/GrDialog/chunks/GrDialog-C7XLxp8e.js.map +0 -1
  396. package/dist/components/GrDrawer/chunks/GrDrawer-BW3wtI7h.js.map +0 -1
  397. package/dist/components/GrDropdown/chunks/GrDropdown-DOvHKnih.js +0 -151
  398. package/dist/components/GrDropdown/chunks/GrDropdown-DOvHKnih.js.map +0 -1
  399. package/dist/components/GrFileUpload/chunks/GrFileUpload-BEKNB1RM.js.map +0 -1
  400. package/dist/components/GrFormFile/chunks/GrFormFile-CIleXnfr.js.map +0 -1
  401. package/dist/components/GrImageViewer/chunks/GrImageViewer-CsvXQHM9.js.map +0 -1
  402. package/dist/components/GrInput/chunks/GrInput-gwFQ1sk4.js.map +0 -1
  403. package/dist/components/GrInputTag/chunks/GrInputTag-Dcj3F6rQ.js.map +0 -1
  404. package/dist/components/GrLink/chunks/GrLink-BMwn2iJ9.js.map +0 -1
  405. package/dist/components/GrNumberInput/chunks/GrNumberInput-YIWhV85S.js.map +0 -1
  406. package/dist/components/GrPagination/chunks/GrPagination-BNDEqM8_.js +0 -114
  407. package/dist/components/GrPagination/chunks/GrPagination-BNDEqM8_.js.map +0 -1
  408. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-BV4EW3XO.js.map +0 -1
  409. package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-BMvXREcv.js.map +0 -1
  410. package/dist/components/GrSelect/chunks/GrSelect-CnHdbPlf.js.map +0 -1
  411. package/dist/components/GrSidebar/chunks/GrSidebar-BpBtAGBs.js +0 -44
  412. package/dist/components/GrSidebar/chunks/GrSidebar-BpBtAGBs.js.map +0 -1
  413. package/dist/components/GrToaster/chunks/GrToaster-DluJmR5D.js +0 -171
  414. package/dist/components/GrToaster/chunks/GrToaster-DluJmR5D.js.map +0 -1
  415. package/dist/components/GrTooltip/chunks/GrTooltip-B7I1AVIC.js +0 -55
  416. package/dist/components/GrTooltip/chunks/GrTooltip-B7I1AVIC.js.map +0 -1
  417. package/dist/components/GrTree/chunks/GrTree-B2SMU5Py.js.map +0 -1
  418. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-C1abr5uH.js.map +0 -1
  419. /package/dist/chunks/{_plugin-vue_export-helper-DQR7Sy7Q.js → _plugin-vue_export-helper-BOaGB7Aw.js} +0 -0
  420. /package/dist/chunks/{adapter-BqqjEZGU.js → adapter-CAOxmn2G.js} +0 -0
  421. /package/dist/chunks/{arrow-up-DZdIrpaF.js → arrow-up-C_G4jg8M.js} +0 -0
  422. /package/dist/chunks/{classTokens-BPeBXNzu.js → classTokens-BzazaERD.js} +0 -0
  423. /package/dist/chunks/{config-DaHI5bD_2.js → config-8Pcutu1j2.js} +0 -0
  424. /package/dist/chunks/{config-DoBk_CzG.js → config-B0qIpo8m.js} +0 -0
  425. /package/dist/chunks/{config-DbghHyY_.js → config-BEegFP74.js} +0 -0
  426. /package/dist/chunks/{config-Dzd6BzIN2.js → config-BLHqZhy-2.js} +0 -0
  427. /package/dist/chunks/{config-BV4vBzdm.js → config-BNu8lFQB.js} +0 -0
  428. /package/dist/chunks/{config-B1kFmhpM.js → config-BUHuGBik.js} +0 -0
  429. /package/dist/chunks/{config-DF_RlCIO.js → config-BWGGp7uV.js} +0 -0
  430. /package/dist/chunks/{config-BduXEXjt.js → config-BXtAmU3s.js} +0 -0
  431. /package/dist/chunks/{config-O1_FTqD3.js → config-Bah4oHwL.js} +0 -0
  432. /package/dist/chunks/{config-DSBlHQVa.js → config-C86UzUYf.js} +0 -0
  433. /package/dist/chunks/{config-BgBWt9-A.js → config-C9AcVDkv.js} +0 -0
  434. /package/dist/chunks/{config-BeQuykDk2.js → config-CGHLoBlH2.js} +0 -0
  435. /package/dist/chunks/{config-ChQxl75m.js → config-CThzliFi.js} +0 -0
  436. /package/dist/chunks/{config-DmjwIqx1.js → config-Cb2PAlSD.js} +0 -0
  437. /package/dist/chunks/{config-BbKroFtR.js → config-D7GZO-Dx.js} +0 -0
  438. /package/dist/chunks/{config-CUwF4E4R.js → config-DBmdgoVf.js} +0 -0
  439. /package/dist/chunks/{config-C9MblwGq.js → config-DICOd-2X.js} +0 -0
  440. /package/dist/chunks/{config-D6Oe3blW2.js → config-DpqOnJiz2.js} +0 -0
  441. /package/dist/chunks/{config-V3LF-b_F.js → config-Dxuwwepq.js} +0 -0
  442. /package/dist/chunks/{config-CvGdaXvH.js → config-HZto2PVy.js} +0 -0
  443. /package/dist/chunks/{config-BOdu-O_B.js → config-JOtB4mzs.js} +0 -0
  444. /package/dist/chunks/{config-iuMz79Mg.js → config-JpHA4Xx0.js} +0 -0
  445. /package/dist/chunks/{config-Dcb7xK-C.js → config-PFg39mYo.js} +0 -0
  446. /package/dist/chunks/{config-BU0olrvr.js → config-QaIc_gRa.js} +0 -0
  447. /package/dist/chunks/{config-vcDVCYXo.js → config-U4m9PSql.js} +0 -0
  448. /package/dist/chunks/{config-Ci9nXGUV.js → config-ZiXWIRBX.js} +0 -0
  449. /package/dist/chunks/{config-Bcf-8XlK2.js → config-ipvU0lzP2.js} +0 -0
  450. /package/dist/chunks/{config-D5ek7VSi.js → config-xR4XVmcy.js} +0 -0
  451. /package/dist/chunks/{dialogShared-BtXUk6Zc.js → dialogShared-CxW62PQE.js} +0 -0
  452. /package/dist/chunks/{grLoadingStyles-DmI-SJ3i.js → grLoadingStyles-R5sreH__.js} +0 -0
  453. /package/dist/chunks/{info-C0bHmdZq.js → info-Be2OccTu.js} +0 -0
  454. /package/dist/chunks/{loader-circle-BUntgosj.js → loader-circle-CfVLz7lb.js} +0 -0
  455. /package/dist/chunks/{x-Pa6C2hwi.js → x-2KXnqxiD.js} +0 -0
  456. /package/dist/chunks/{x-circle-DQSlBLmX.js → x-circle-BCBURwyX.js} +0 -0
  457. /package/dist/components/GrBottomNav/chunks/{GrBottomNav-XPHwd7UQ.js → GrBottomNav-usuMgG8_.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"GrSegmented-BRmwBsEG.js","names":[],"sources":["../../../../src/components/GrSegmented/GrSegmented.vue","../../../../src/components/GrSegmented/GrSegmented.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { ComponentPublicInstance } from 'vue'\n\nimport {\n grSegmentedIndicatorClass,\n grSegmentedItemClass,\n grSegmentedItemIconClass,\n grSegmentedItemLabelClass,\n grSegmentedRootClass,\n grSegmentedRootStyle,\n type GrSegmentedOption,\n type GrSegmentedSize,\n type GrSegmentedValue,\n type GrSegmentedVariant,\n} from './grSegmentedStyles'\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\ntype IndicatorGeometry = {\n width: number\n height: number\n x: number\n y: number\n}\n\n/**\n * Пропсы публичного DS-примитива «Segmented».\n */\nexport interface GrSegmentedProps {\n modelValue: GrSegmentedValue\n options: GrSegmentedOption[]\n variant?: GrSegmentedVariant\n size?: GrSegmentedSize\n /** Длительность анимации индикатора в мс. */\n indicatorDuration?: number\n /** Растягивать сегмент на всю ширину контейнера. */\n block?: boolean\n disabled?: boolean\n /** Имя скрытых radio-inputs для интеграции с нативной формой. */\n name?: string\n ariaLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrSegmentedProps>(),\n {\n variant: 'pills',\n size: 'md',\n indicatorDuration: 300,\n block: false,\n disabled: false,\n name: undefined,\n ariaLabel: undefined,\n },\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', value: GrSegmentedValue): void\n (event: 'change', value: GrSegmentedValue, option: GrSegmentedOption): void\n}>()\n\nconst instance = getCurrentInstance()\nconst fallbackName = `ds-segmented-${instance?.uid ?? Math.random()}`\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst itemRefs = ref(new Map<string, HTMLElement>())\nconst indicatorGeometry = ref<IndicatorGeometry | null>(null)\nconst indicatorReady = ref(false)\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedRoot: HTMLElement | null = null\nlet observedItem: HTMLElement | null = null\nlet scheduled = false\n\nconst selectedIndex = computed(() => props.options.findIndex(option => option.value === props.modelValue))\nconst selectedOption = computed(() => props.options[selectedIndex.value] ?? null)\nconst enabledOptions = computed(() => props.options.filter(option => !resolveOptionDisabled(option)))\nconst indicatorDuration = computed(() => Math.max(0, Math.round(props.indicatorDuration)))\nconst rootClassName = computed(() => grSegmentedRootClass({\n variant: props.variant,\n block: props.block,\n disabled: props.disabled,\n}))\nconst rootStyle = computed<Record<string, string>>(() => ({\n ...grSegmentedRootStyle({\n variant: props.variant,\n size: props.size,\n }),\n gridTemplateColumns: props.options.length > 0\n ? props.options.map(() => props.block ? 'minmax(0,1fr)' : 'minmax(0,max-content)').join(' ')\n : 'none',\n}))\nconst indicatorClassName = computed(() => grSegmentedIndicatorClass(props.variant))\nconst resolvedName = computed(() => props.name ?? fallbackName)\nconst hasIndicator = computed(() => selectedIndex.value !== -1 && indicatorGeometry.value !== null)\n\nconst indicatorStyle = computed<Record<string, string>>(() => {\n const geometry = indicatorGeometry.value\n if (!geometry) {\n return {\n opacity: '0',\n width: '0px',\n height: '0px',\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: 'translate3d(0px, 0px, 0px)',\n }\n }\n\n return {\n opacity: indicatorReady.value ? '1' : '0',\n width: `${geometry.width}px`,\n height: `${geometry.height}px`,\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,\n }\n})\n\nfunction getOptionKey(value: GrSegmentedValue): string {\n return String(value)\n}\n\nfunction resolveOptionDisabled(option: GrSegmentedOption): boolean {\n return props.disabled || Boolean(option.disabled)\n}\n\nfunction isOptionSelected(option: GrSegmentedOption): boolean {\n return option.value === props.modelValue\n}\n\nfunction isIconOnlyOption(option: GrSegmentedOption): boolean {\n return Boolean(option.icon) && !option.label\n}\n\nfunction isFocusableOption(option: GrSegmentedOption, index: number): boolean {\n if (resolveOptionDisabled(option)) {\n return false\n }\n\n if (isOptionSelected(option)) {\n return true\n }\n\n if (selectedIndex.value !== -1) {\n return false\n }\n\n return enabledOptions.value[0]?.value === props.options[index]?.value\n}\n\nfunction setItemRef(value: GrSegmentedValue, element: Element | ComponentPublicInstance | null): void {\n const key = getOptionKey(value)\n\n if (!(element instanceof HTMLElement)) {\n itemRefs.value.delete(key)\n return\n }\n\n itemRefs.value.set(key, element)\n}\n\nfunction isSameGeometry(left: IndicatorGeometry | null, right: IndicatorGeometry | null): boolean {\n if (left === right) {\n return true\n }\n\n if (!left || !right) {\n return false\n }\n\n return left.width === right.width\n && left.height === right.height\n && left.x === right.x\n && left.y === right.y\n}\n\nfunction measureIndicator(): void {\n const root = rootRef.value\n const option = selectedOption.value\n if (!root || !option) {\n if (indicatorGeometry.value !== null)\n indicatorGeometry.value = null\n\n if (indicatorReady.value)\n indicatorReady.value = false\n\n return\n }\n\n const selectedItem = itemRefs.value.get(getOptionKey(option.value))\n if (!selectedItem) {\n return\n }\n\n const rootRect = root.getBoundingClientRect()\n const itemRect = selectedItem.getBoundingClientRect()\n\n const nextGeometry = {\n width: Math.max(Math.round(itemRect.width), 0),\n height: Math.max(Math.round(itemRect.height), 0),\n x: Math.round(itemRect.left - rootRect.left),\n y: Math.max(Math.round(itemRect.top - rootRect.top) - 1, 0),\n } satisfies IndicatorGeometry\n\n if (!isSameGeometry(indicatorGeometry.value, nextGeometry)) {\n indicatorGeometry.value = nextGeometry\n }\n\n const nextReady = nextGeometry.width > 0 && nextGeometry.height > 0\n if (indicatorReady.value !== nextReady) {\n indicatorReady.value = nextReady\n }\n}\n\nfunction refreshObserver(): void {\n if (typeof ResizeObserver === 'undefined') {\n return\n }\n\n const root = rootRef.value\n const option = selectedOption.value\n const selectedItem = option\n ? itemRefs.value.get(getOptionKey(option.value)) ?? null\n : null\n\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver(() => scheduleMeasure())\n }\n\n if (!root) {\n resizeObserver.disconnect()\n observedRoot = null\n observedItem = null\n return\n }\n\n if (observedRoot === root && observedItem === selectedItem) {\n return\n }\n\n resizeObserver.disconnect()\n resizeObserver.observe(root)\n\n if (selectedItem) {\n resizeObserver.observe(selectedItem)\n }\n\n observedRoot = root\n observedItem = selectedItem\n}\n\nfunction scheduleMeasure(): void {\n if (scheduled) {\n return\n }\n\n scheduled = true\n void nextTick(() => {\n scheduled = false\n measureIndicator()\n refreshObserver()\n })\n}\n\nfunction emitValue(option: GrSegmentedOption): void {\n if (resolveOptionDisabled(option) || option.value === props.modelValue) {\n return\n }\n\n emit('update:modelValue', option.value)\n emit('change', option.value, option)\n}\n\nfunction getNextEnabledIndex(startIndex: number, direction: 1 | -1): number {\n if (props.options.length === 0) {\n return -1\n }\n\n let cursor = startIndex\n for (let step = 0; step < props.options.length; step += 1) {\n cursor = (cursor + direction + props.options.length) % props.options.length\n const option = props.options[cursor]\n if (option && !resolveOptionDisabled(option)) {\n return cursor\n }\n }\n\n return -1\n}\n\nfunction focusIndex(index: number): void {\n const option = props.options[index]\n if (!option) {\n return\n }\n\n itemRefs.value.get(getOptionKey(option.value))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number): void {\n if (props.disabled) {\n return\n }\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, 1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, -1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n const firstOption = enabledOptions.value[0]\n if (!firstOption) {\n return\n }\n\n emitValue(firstOption)\n focusIndex(props.options.findIndex(option => option.value === firstOption.value))\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n const lastOption = enabledOptions.value.at(-1)\n if (!lastOption) {\n return\n }\n\n emitValue(lastOption)\n focusIndex(props.options.findIndex(option => option.value === lastOption.value))\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n const option = props.options[index]\n if (option) {\n emitValue(option)\n }\n }\n}\n\nwatch(() => props.modelValue, () => scheduleMeasure())\nwatch(() => props.options, () => scheduleMeasure(), { deep: true })\nwatch(() => props.variant, () => scheduleMeasure())\nwatch(() => props.size, () => scheduleMeasure())\nwatch(() => props.block, () => scheduleMeasure())\n\nonMounted(() => scheduleMeasure())\nonBeforeUnmount(() => {\n resizeObserver?.disconnect()\n observedRoot = null\n observedItem = null\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n data-ds-segmented\n :data-variant=\"variant\"\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :class=\"rootClassName\"\n :style=\"rootStyle\"\n >\n <span\n v-if=\"hasIndicator\"\n data-ds-segmented-indicator\n aria-hidden=\"true\"\n :class=\"indicatorClassName\"\n :style=\"indicatorStyle\"\n />\n\n <button\n v-for=\"(option, index) in options\"\n :key=\"option.value\"\n :ref=\"element => setItemRef(option.value, element)\"\n data-ds-segmented-item\n :data-value=\"String(option.value)\"\n type=\"button\"\n role=\"radio\"\n :aria-checked=\"isOptionSelected(option) ? 'true' : 'false'\"\n :aria-disabled=\"resolveOptionDisabled(option) ? 'true' : undefined\"\n :disabled=\"resolveOptionDisabled(option)\"\n :tabindex=\"isFocusableOption(option, index) ? 0 : -1\"\n :class=\"grSegmentedItemClass({\n variant,\n selected: isOptionSelected(option),\n disabled: resolveOptionDisabled(option),\n iconOnly: isIconOnlyOption(option),\n })\"\n @click=\"emitValue(option)\"\n @keydown=\"onKeydown($event, index)\"\n >\n <input\n type=\"radio\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :name=\"resolvedName\"\n :value=\"option.value\"\n :checked=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n :style=\"hiddenInputStyle\"\n >\n\n <slot\n :option=\"option\"\n :selected=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n >\n <component\n :is=\"option.icon\"\n v-if=\"option.icon\"\n aria-hidden=\"true\"\n :class=\"grSegmentedItemIconClass\"\n />\n <span v-if=\"option.label\" :class=\"grSegmentedItemLabelClass\">\n {{ option.label }}\n </span>\n </slot>\n </button>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { ComponentPublicInstance } from 'vue'\n\nimport {\n grSegmentedIndicatorClass,\n grSegmentedItemClass,\n grSegmentedItemIconClass,\n grSegmentedItemLabelClass,\n grSegmentedRootClass,\n grSegmentedRootStyle,\n type GrSegmentedOption,\n type GrSegmentedSize,\n type GrSegmentedValue,\n type GrSegmentedVariant,\n} from './grSegmentedStyles'\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\ntype IndicatorGeometry = {\n width: number\n height: number\n x: number\n y: number\n}\n\n/**\n * Пропсы публичного DS-примитива «Segmented».\n */\nexport interface GrSegmentedProps {\n modelValue: GrSegmentedValue\n options: GrSegmentedOption[]\n variant?: GrSegmentedVariant\n size?: GrSegmentedSize\n /** Длительность анимации индикатора в мс. */\n indicatorDuration?: number\n /** Растягивать сегмент на всю ширину контейнера. */\n block?: boolean\n disabled?: boolean\n /** Имя скрытых radio-inputs для интеграции с нативной формой. */\n name?: string\n ariaLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrSegmentedProps>(),\n {\n variant: 'pills',\n size: 'md',\n indicatorDuration: 300,\n block: false,\n disabled: false,\n name: undefined,\n ariaLabel: undefined,\n },\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', value: GrSegmentedValue): void\n (event: 'change', value: GrSegmentedValue, option: GrSegmentedOption): void\n}>()\n\nconst instance = getCurrentInstance()\nconst fallbackName = `ds-segmented-${instance?.uid ?? Math.random()}`\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst itemRefs = ref(new Map<string, HTMLElement>())\nconst indicatorGeometry = ref<IndicatorGeometry | null>(null)\nconst indicatorReady = ref(false)\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedRoot: HTMLElement | null = null\nlet observedItem: HTMLElement | null = null\nlet scheduled = false\n\nconst selectedIndex = computed(() => props.options.findIndex(option => option.value === props.modelValue))\nconst selectedOption = computed(() => props.options[selectedIndex.value] ?? null)\nconst enabledOptions = computed(() => props.options.filter(option => !resolveOptionDisabled(option)))\nconst indicatorDuration = computed(() => Math.max(0, Math.round(props.indicatorDuration)))\nconst rootClassName = computed(() => grSegmentedRootClass({\n variant: props.variant,\n block: props.block,\n disabled: props.disabled,\n}))\nconst rootStyle = computed<Record<string, string>>(() => ({\n ...grSegmentedRootStyle({\n variant: props.variant,\n size: props.size,\n }),\n gridTemplateColumns: props.options.length > 0\n ? props.options.map(() => props.block ? 'minmax(0,1fr)' : 'minmax(0,max-content)').join(' ')\n : 'none',\n}))\nconst indicatorClassName = computed(() => grSegmentedIndicatorClass(props.variant))\nconst resolvedName = computed(() => props.name ?? fallbackName)\nconst hasIndicator = computed(() => selectedIndex.value !== -1 && indicatorGeometry.value !== null)\n\nconst indicatorStyle = computed<Record<string, string>>(() => {\n const geometry = indicatorGeometry.value\n if (!geometry) {\n return {\n opacity: '0',\n width: '0px',\n height: '0px',\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: 'translate3d(0px, 0px, 0px)',\n }\n }\n\n return {\n opacity: indicatorReady.value ? '1' : '0',\n width: `${geometry.width}px`,\n height: `${geometry.height}px`,\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,\n }\n})\n\nfunction getOptionKey(value: GrSegmentedValue): string {\n return String(value)\n}\n\nfunction resolveOptionDisabled(option: GrSegmentedOption): boolean {\n return props.disabled || Boolean(option.disabled)\n}\n\nfunction isOptionSelected(option: GrSegmentedOption): boolean {\n return option.value === props.modelValue\n}\n\nfunction isIconOnlyOption(option: GrSegmentedOption): boolean {\n return Boolean(option.icon) && !option.label\n}\n\nfunction isFocusableOption(option: GrSegmentedOption, index: number): boolean {\n if (resolveOptionDisabled(option)) {\n return false\n }\n\n if (isOptionSelected(option)) {\n return true\n }\n\n if (selectedIndex.value !== -1) {\n return false\n }\n\n return enabledOptions.value[0]?.value === props.options[index]?.value\n}\n\nfunction setItemRef(value: GrSegmentedValue, element: Element | ComponentPublicInstance | null): void {\n const key = getOptionKey(value)\n\n if (!(element instanceof HTMLElement)) {\n itemRefs.value.delete(key)\n return\n }\n\n itemRefs.value.set(key, element)\n}\n\nfunction isSameGeometry(left: IndicatorGeometry | null, right: IndicatorGeometry | null): boolean {\n if (left === right) {\n return true\n }\n\n if (!left || !right) {\n return false\n }\n\n return left.width === right.width\n && left.height === right.height\n && left.x === right.x\n && left.y === right.y\n}\n\nfunction measureIndicator(): void {\n const root = rootRef.value\n const option = selectedOption.value\n if (!root || !option) {\n if (indicatorGeometry.value !== null)\n indicatorGeometry.value = null\n\n if (indicatorReady.value)\n indicatorReady.value = false\n\n return\n }\n\n const selectedItem = itemRefs.value.get(getOptionKey(option.value))\n if (!selectedItem) {\n return\n }\n\n const rootRect = root.getBoundingClientRect()\n const itemRect = selectedItem.getBoundingClientRect()\n\n const nextGeometry = {\n width: Math.max(Math.round(itemRect.width), 0),\n height: Math.max(Math.round(itemRect.height), 0),\n x: Math.round(itemRect.left - rootRect.left),\n y: Math.max(Math.round(itemRect.top - rootRect.top) - 1, 0),\n } satisfies IndicatorGeometry\n\n if (!isSameGeometry(indicatorGeometry.value, nextGeometry)) {\n indicatorGeometry.value = nextGeometry\n }\n\n const nextReady = nextGeometry.width > 0 && nextGeometry.height > 0\n if (indicatorReady.value !== nextReady) {\n indicatorReady.value = nextReady\n }\n}\n\nfunction refreshObserver(): void {\n if (typeof ResizeObserver === 'undefined') {\n return\n }\n\n const root = rootRef.value\n const option = selectedOption.value\n const selectedItem = option\n ? itemRefs.value.get(getOptionKey(option.value)) ?? null\n : null\n\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver(() => scheduleMeasure())\n }\n\n if (!root) {\n resizeObserver.disconnect()\n observedRoot = null\n observedItem = null\n return\n }\n\n if (observedRoot === root && observedItem === selectedItem) {\n return\n }\n\n resizeObserver.disconnect()\n resizeObserver.observe(root)\n\n if (selectedItem) {\n resizeObserver.observe(selectedItem)\n }\n\n observedRoot = root\n observedItem = selectedItem\n}\n\nfunction scheduleMeasure(): void {\n if (scheduled) {\n return\n }\n\n scheduled = true\n void nextTick(() => {\n scheduled = false\n measureIndicator()\n refreshObserver()\n })\n}\n\nfunction emitValue(option: GrSegmentedOption): void {\n if (resolveOptionDisabled(option) || option.value === props.modelValue) {\n return\n }\n\n emit('update:modelValue', option.value)\n emit('change', option.value, option)\n}\n\nfunction getNextEnabledIndex(startIndex: number, direction: 1 | -1): number {\n if (props.options.length === 0) {\n return -1\n }\n\n let cursor = startIndex\n for (let step = 0; step < props.options.length; step += 1) {\n cursor = (cursor + direction + props.options.length) % props.options.length\n const option = props.options[cursor]\n if (option && !resolveOptionDisabled(option)) {\n return cursor\n }\n }\n\n return -1\n}\n\nfunction focusIndex(index: number): void {\n const option = props.options[index]\n if (!option) {\n return\n }\n\n itemRefs.value.get(getOptionKey(option.value))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number): void {\n if (props.disabled) {\n return\n }\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, 1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, -1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n const firstOption = enabledOptions.value[0]\n if (!firstOption) {\n return\n }\n\n emitValue(firstOption)\n focusIndex(props.options.findIndex(option => option.value === firstOption.value))\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n const lastOption = enabledOptions.value.at(-1)\n if (!lastOption) {\n return\n }\n\n emitValue(lastOption)\n focusIndex(props.options.findIndex(option => option.value === lastOption.value))\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n const option = props.options[index]\n if (option) {\n emitValue(option)\n }\n }\n}\n\nwatch(() => props.modelValue, () => scheduleMeasure())\nwatch(() => props.options, () => scheduleMeasure(), { deep: true })\nwatch(() => props.variant, () => scheduleMeasure())\nwatch(() => props.size, () => scheduleMeasure())\nwatch(() => props.block, () => scheduleMeasure())\n\nonMounted(() => scheduleMeasure())\nonBeforeUnmount(() => {\n resizeObserver?.disconnect()\n observedRoot = null\n observedItem = null\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n data-ds-segmented\n :data-variant=\"variant\"\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :class=\"rootClassName\"\n :style=\"rootStyle\"\n >\n <span\n v-if=\"hasIndicator\"\n data-ds-segmented-indicator\n aria-hidden=\"true\"\n :class=\"indicatorClassName\"\n :style=\"indicatorStyle\"\n />\n\n <button\n v-for=\"(option, index) in options\"\n :key=\"option.value\"\n :ref=\"element => setItemRef(option.value, element)\"\n data-ds-segmented-item\n :data-value=\"String(option.value)\"\n type=\"button\"\n role=\"radio\"\n :aria-checked=\"isOptionSelected(option) ? 'true' : 'false'\"\n :aria-disabled=\"resolveOptionDisabled(option) ? 'true' : undefined\"\n :disabled=\"resolveOptionDisabled(option)\"\n :tabindex=\"isFocusableOption(option, index) ? 0 : -1\"\n :class=\"grSegmentedItemClass({\n variant,\n selected: isOptionSelected(option),\n disabled: resolveOptionDisabled(option),\n iconOnly: isIconOnlyOption(option),\n })\"\n @click=\"emitValue(option)\"\n @keydown=\"onKeydown($event, index)\"\n >\n <input\n type=\"radio\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :name=\"resolvedName\"\n :value=\"option.value\"\n :checked=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n :style=\"hiddenInputStyle\"\n >\n\n <slot\n :option=\"option\"\n :selected=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n >\n <component\n :is=\"option.icon\"\n v-if=\"option.icon\"\n aria-hidden=\"true\"\n :class=\"grSegmentedItemIconClass\"\n />\n <span v-if=\"option.label\" :class=\"grSegmentedItemLabelClass\">\n {{ option.label }}\n </span>\n </slot>\n </button>\n </div>\n</template>"],"mappings":"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"}
1
+ {"version":3,"file":"GrSegmented-C1y0UXpQ.js","names":[],"sources":["../../../../src/components/GrSegmented/GrSegmented.vue","../../../../src/components/GrSegmented/GrSegmented.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { ComponentPublicInstance } from 'vue'\n\nimport {\n grSegmentedIndicatorClass,\n grSegmentedItemClass,\n grSegmentedItemIconClass,\n grSegmentedItemLabelClass,\n grSegmentedRootClass,\n grSegmentedRootStyle,\n type GrSegmentedOption,\n type GrSegmentedSize,\n type GrSegmentedValue,\n type GrSegmentedVariant,\n} from './grSegmentedStyles'\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\ntype IndicatorGeometry = {\n width: number\n height: number\n x: number\n y: number\n}\n\n/**\n * Пропсы публичного GR-примитива «Segmented».\n */\nexport interface GrSegmentedProps {\n modelValue: GrSegmentedValue\n options: GrSegmentedOption[]\n variant?: GrSegmentedVariant\n size?: GrSegmentedSize\n /** Длительность анимации индикатора в мс. */\n indicatorDuration?: number\n /** Растягивать сегмент на всю ширину контейнера. */\n block?: boolean\n disabled?: boolean\n /** Имя скрытых radio-inputs для интеграции с нативной формой. */\n name?: string\n ariaLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrSegmentedProps>(),\n {\n variant: 'pills',\n size: 'md',\n indicatorDuration: 300,\n block: false,\n disabled: false,\n name: undefined,\n ariaLabel: undefined,\n },\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', value: GrSegmentedValue): void\n (event: 'change', value: GrSegmentedValue, option: GrSegmentedOption): void\n}>()\n\nconst instance = getCurrentInstance()\nconst fallbackName = `gr-segmented-${instance?.uid ?? Math.random()}`\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst itemRefs = ref(new Map<string, HTMLElement>())\nconst indicatorGeometry = ref<IndicatorGeometry | null>(null)\nconst indicatorReady = ref(false)\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedRoot: HTMLElement | null = null\nlet observedItem: HTMLElement | null = null\nlet scheduled = false\n\nconst selectedIndex = computed(() => props.options.findIndex(option => option.value === props.modelValue))\nconst selectedOption = computed(() => props.options[selectedIndex.value] ?? null)\nconst enabledOptions = computed(() => props.options.filter(option => !resolveOptionDisabled(option)))\nconst indicatorDuration = computed(() => Math.max(0, Math.round(props.indicatorDuration)))\nconst rootClassName = computed(() => grSegmentedRootClass({\n variant: props.variant,\n block: props.block,\n disabled: props.disabled,\n}))\nconst rootStyle = computed<Record<string, string>>(() => ({\n ...grSegmentedRootStyle({\n variant: props.variant,\n size: props.size,\n }),\n gridTemplateColumns: props.options.length > 0\n ? props.options.map(() => props.block ? 'minmax(0,1fr)' : 'minmax(0,max-content)').join(' ')\n : 'none',\n}))\nconst indicatorClassName = computed(() => grSegmentedIndicatorClass(props.variant))\nconst resolvedName = computed(() => props.name ?? fallbackName)\nconst hasIndicator = computed(() => selectedIndex.value !== -1 && indicatorGeometry.value !== null)\n\nconst indicatorStyle = computed<Record<string, string>>(() => {\n const geometry = indicatorGeometry.value\n if (!geometry) {\n return {\n opacity: '0',\n width: '0px',\n height: '0px',\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: 'translate3d(0px, 0px, 0px)',\n }\n }\n\n return {\n opacity: indicatorReady.value ? '1' : '0',\n width: `${geometry.width}px`,\n height: `${geometry.height}px`,\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,\n }\n})\n\nfunction getOptionKey(value: GrSegmentedValue): string {\n return String(value)\n}\n\nfunction resolveOptionDisabled(option: GrSegmentedOption): boolean {\n return props.disabled || Boolean(option.disabled)\n}\n\nfunction isOptionSelected(option: GrSegmentedOption): boolean {\n return option.value === props.modelValue\n}\n\nfunction isIconOnlyOption(option: GrSegmentedOption): boolean {\n return Boolean(option.icon) && !option.label\n}\n\nfunction isFocusableOption(option: GrSegmentedOption, index: number): boolean {\n if (resolveOptionDisabled(option)) {\n return false\n }\n\n if (isOptionSelected(option)) {\n return true\n }\n\n if (selectedIndex.value !== -1) {\n return false\n }\n\n return enabledOptions.value[0]?.value === props.options[index]?.value\n}\n\nfunction setItemRef(value: GrSegmentedValue, element: Element | ComponentPublicInstance | null): void {\n const key = getOptionKey(value)\n\n if (!(element instanceof HTMLElement)) {\n itemRefs.value.delete(key)\n return\n }\n\n itemRefs.value.set(key, element)\n}\n\nfunction isSameGeometry(left: IndicatorGeometry | null, right: IndicatorGeometry | null): boolean {\n if (left === right) {\n return true\n }\n\n if (!left || !right) {\n return false\n }\n\n return left.width === right.width\n && left.height === right.height\n && left.x === right.x\n && left.y === right.y\n}\n\nfunction measureIndicator(): void {\n const root = rootRef.value\n const option = selectedOption.value\n if (!root || !option) {\n if (indicatorGeometry.value !== null)\n indicatorGeometry.value = null\n\n if (indicatorReady.value)\n indicatorReady.value = false\n\n return\n }\n\n const selectedItem = itemRefs.value.get(getOptionKey(option.value))\n if (!selectedItem) {\n return\n }\n\n const rootRect = root.getBoundingClientRect()\n const itemRect = selectedItem.getBoundingClientRect()\n\n const nextGeometry = {\n width: Math.max(Math.round(itemRect.width), 0),\n height: Math.max(Math.round(itemRect.height), 0),\n x: Math.round(itemRect.left - rootRect.left),\n y: Math.max(Math.round(itemRect.top - rootRect.top) - 1, 0),\n } satisfies IndicatorGeometry\n\n if (!isSameGeometry(indicatorGeometry.value, nextGeometry)) {\n indicatorGeometry.value = nextGeometry\n }\n\n const nextReady = nextGeometry.width > 0 && nextGeometry.height > 0\n if (indicatorReady.value !== nextReady) {\n indicatorReady.value = nextReady\n }\n}\n\nfunction refreshObserver(): void {\n if (typeof ResizeObserver === 'undefined') {\n return\n }\n\n const root = rootRef.value\n const option = selectedOption.value\n const selectedItem = option\n ? itemRefs.value.get(getOptionKey(option.value)) ?? null\n : null\n\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver(() => scheduleMeasure())\n }\n\n if (!root) {\n resizeObserver.disconnect()\n observedRoot = null\n observedItem = null\n return\n }\n\n if (observedRoot === root && observedItem === selectedItem) {\n return\n }\n\n resizeObserver.disconnect()\n resizeObserver.observe(root)\n\n if (selectedItem) {\n resizeObserver.observe(selectedItem)\n }\n\n observedRoot = root\n observedItem = selectedItem\n}\n\nfunction scheduleMeasure(): void {\n if (scheduled) {\n return\n }\n\n scheduled = true\n void nextTick(() => {\n scheduled = false\n measureIndicator()\n refreshObserver()\n })\n}\n\nfunction emitValue(option: GrSegmentedOption): void {\n if (resolveOptionDisabled(option) || option.value === props.modelValue) {\n return\n }\n\n emit('update:modelValue', option.value)\n emit('change', option.value, option)\n}\n\nfunction getNextEnabledIndex(startIndex: number, direction: 1 | -1): number {\n if (props.options.length === 0) {\n return -1\n }\n\n let cursor = startIndex\n for (let step = 0; step < props.options.length; step += 1) {\n cursor = (cursor + direction + props.options.length) % props.options.length\n const option = props.options[cursor]\n if (option && !resolveOptionDisabled(option)) {\n return cursor\n }\n }\n\n return -1\n}\n\nfunction focusIndex(index: number): void {\n const option = props.options[index]\n if (!option) {\n return\n }\n\n itemRefs.value.get(getOptionKey(option.value))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number): void {\n if (props.disabled) {\n return\n }\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, 1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, -1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n const firstOption = enabledOptions.value[0]\n if (!firstOption) {\n return\n }\n\n emitValue(firstOption)\n focusIndex(props.options.findIndex(option => option.value === firstOption.value))\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n const lastOption = enabledOptions.value.at(-1)\n if (!lastOption) {\n return\n }\n\n emitValue(lastOption)\n focusIndex(props.options.findIndex(option => option.value === lastOption.value))\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n const option = props.options[index]\n if (option) {\n emitValue(option)\n }\n }\n}\n\nwatch(() => props.modelValue, () => scheduleMeasure())\nwatch(() => props.options, () => scheduleMeasure(), { deep: true })\nwatch(() => props.variant, () => scheduleMeasure())\nwatch(() => props.size, () => scheduleMeasure())\nwatch(() => props.block, () => scheduleMeasure())\n\nonMounted(() => scheduleMeasure())\nonBeforeUnmount(() => {\n resizeObserver?.disconnect()\n observedRoot = null\n observedItem = null\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n data-gr-segmented\n :data-variant=\"variant\"\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :class=\"rootClassName\"\n :style=\"rootStyle\"\n >\n <span\n v-if=\"hasIndicator\"\n data-gr-segmented-indicator\n aria-hidden=\"true\"\n :class=\"indicatorClassName\"\n :style=\"indicatorStyle\"\n />\n\n <button\n v-for=\"(option, index) in options\"\n :key=\"option.value\"\n :ref=\"element => setItemRef(option.value, element)\"\n data-gr-segmented-item\n :data-value=\"String(option.value)\"\n type=\"button\"\n role=\"radio\"\n :aria-checked=\"isOptionSelected(option) ? 'true' : 'false'\"\n :aria-disabled=\"resolveOptionDisabled(option) ? 'true' : undefined\"\n :disabled=\"resolveOptionDisabled(option)\"\n :tabindex=\"isFocusableOption(option, index) ? 0 : -1\"\n :class=\"grSegmentedItemClass({\n variant,\n selected: isOptionSelected(option),\n disabled: resolveOptionDisabled(option),\n iconOnly: isIconOnlyOption(option),\n })\"\n @click=\"emitValue(option)\"\n @keydown=\"onKeydown($event, index)\"\n >\n <input\n type=\"radio\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :name=\"resolvedName\"\n :value=\"option.value\"\n :checked=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n :style=\"hiddenInputStyle\"\n >\n\n <slot\n :option=\"option\"\n :selected=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n >\n <component\n :is=\"option.icon\"\n v-if=\"option.icon\"\n aria-hidden=\"true\"\n :class=\"grSegmentedItemIconClass\"\n />\n <span v-if=\"option.label\" :class=\"grSegmentedItemLabelClass\">\n {{ option.label }}\n </span>\n </slot>\n </button>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { ComponentPublicInstance } from 'vue'\n\nimport {\n grSegmentedIndicatorClass,\n grSegmentedItemClass,\n grSegmentedItemIconClass,\n grSegmentedItemLabelClass,\n grSegmentedRootClass,\n grSegmentedRootStyle,\n type GrSegmentedOption,\n type GrSegmentedSize,\n type GrSegmentedValue,\n type GrSegmentedVariant,\n} from './grSegmentedStyles'\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\ntype IndicatorGeometry = {\n width: number\n height: number\n x: number\n y: number\n}\n\n/**\n * Пропсы публичного GR-примитива «Segmented».\n */\nexport interface GrSegmentedProps {\n modelValue: GrSegmentedValue\n options: GrSegmentedOption[]\n variant?: GrSegmentedVariant\n size?: GrSegmentedSize\n /** Длительность анимации индикатора в мс. */\n indicatorDuration?: number\n /** Растягивать сегмент на всю ширину контейнера. */\n block?: boolean\n disabled?: boolean\n /** Имя скрытых radio-inputs для интеграции с нативной формой. */\n name?: string\n ariaLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrSegmentedProps>(),\n {\n variant: 'pills',\n size: 'md',\n indicatorDuration: 300,\n block: false,\n disabled: false,\n name: undefined,\n ariaLabel: undefined,\n },\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', value: GrSegmentedValue): void\n (event: 'change', value: GrSegmentedValue, option: GrSegmentedOption): void\n}>()\n\nconst instance = getCurrentInstance()\nconst fallbackName = `gr-segmented-${instance?.uid ?? Math.random()}`\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst itemRefs = ref(new Map<string, HTMLElement>())\nconst indicatorGeometry = ref<IndicatorGeometry | null>(null)\nconst indicatorReady = ref(false)\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedRoot: HTMLElement | null = null\nlet observedItem: HTMLElement | null = null\nlet scheduled = false\n\nconst selectedIndex = computed(() => props.options.findIndex(option => option.value === props.modelValue))\nconst selectedOption = computed(() => props.options[selectedIndex.value] ?? null)\nconst enabledOptions = computed(() => props.options.filter(option => !resolveOptionDisabled(option)))\nconst indicatorDuration = computed(() => Math.max(0, Math.round(props.indicatorDuration)))\nconst rootClassName = computed(() => grSegmentedRootClass({\n variant: props.variant,\n block: props.block,\n disabled: props.disabled,\n}))\nconst rootStyle = computed<Record<string, string>>(() => ({\n ...grSegmentedRootStyle({\n variant: props.variant,\n size: props.size,\n }),\n gridTemplateColumns: props.options.length > 0\n ? props.options.map(() => props.block ? 'minmax(0,1fr)' : 'minmax(0,max-content)').join(' ')\n : 'none',\n}))\nconst indicatorClassName = computed(() => grSegmentedIndicatorClass(props.variant))\nconst resolvedName = computed(() => props.name ?? fallbackName)\nconst hasIndicator = computed(() => selectedIndex.value !== -1 && indicatorGeometry.value !== null)\n\nconst indicatorStyle = computed<Record<string, string>>(() => {\n const geometry = indicatorGeometry.value\n if (!geometry) {\n return {\n opacity: '0',\n width: '0px',\n height: '0px',\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: 'translate3d(0px, 0px, 0px)',\n }\n }\n\n return {\n opacity: indicatorReady.value ? '1' : '0',\n width: `${geometry.width}px`,\n height: `${geometry.height}px`,\n transitionDuration: `${indicatorDuration.value}ms`,\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,\n }\n})\n\nfunction getOptionKey(value: GrSegmentedValue): string {\n return String(value)\n}\n\nfunction resolveOptionDisabled(option: GrSegmentedOption): boolean {\n return props.disabled || Boolean(option.disabled)\n}\n\nfunction isOptionSelected(option: GrSegmentedOption): boolean {\n return option.value === props.modelValue\n}\n\nfunction isIconOnlyOption(option: GrSegmentedOption): boolean {\n return Boolean(option.icon) && !option.label\n}\n\nfunction isFocusableOption(option: GrSegmentedOption, index: number): boolean {\n if (resolveOptionDisabled(option)) {\n return false\n }\n\n if (isOptionSelected(option)) {\n return true\n }\n\n if (selectedIndex.value !== -1) {\n return false\n }\n\n return enabledOptions.value[0]?.value === props.options[index]?.value\n}\n\nfunction setItemRef(value: GrSegmentedValue, element: Element | ComponentPublicInstance | null): void {\n const key = getOptionKey(value)\n\n if (!(element instanceof HTMLElement)) {\n itemRefs.value.delete(key)\n return\n }\n\n itemRefs.value.set(key, element)\n}\n\nfunction isSameGeometry(left: IndicatorGeometry | null, right: IndicatorGeometry | null): boolean {\n if (left === right) {\n return true\n }\n\n if (!left || !right) {\n return false\n }\n\n return left.width === right.width\n && left.height === right.height\n && left.x === right.x\n && left.y === right.y\n}\n\nfunction measureIndicator(): void {\n const root = rootRef.value\n const option = selectedOption.value\n if (!root || !option) {\n if (indicatorGeometry.value !== null)\n indicatorGeometry.value = null\n\n if (indicatorReady.value)\n indicatorReady.value = false\n\n return\n }\n\n const selectedItem = itemRefs.value.get(getOptionKey(option.value))\n if (!selectedItem) {\n return\n }\n\n const rootRect = root.getBoundingClientRect()\n const itemRect = selectedItem.getBoundingClientRect()\n\n const nextGeometry = {\n width: Math.max(Math.round(itemRect.width), 0),\n height: Math.max(Math.round(itemRect.height), 0),\n x: Math.round(itemRect.left - rootRect.left),\n y: Math.max(Math.round(itemRect.top - rootRect.top) - 1, 0),\n } satisfies IndicatorGeometry\n\n if (!isSameGeometry(indicatorGeometry.value, nextGeometry)) {\n indicatorGeometry.value = nextGeometry\n }\n\n const nextReady = nextGeometry.width > 0 && nextGeometry.height > 0\n if (indicatorReady.value !== nextReady) {\n indicatorReady.value = nextReady\n }\n}\n\nfunction refreshObserver(): void {\n if (typeof ResizeObserver === 'undefined') {\n return\n }\n\n const root = rootRef.value\n const option = selectedOption.value\n const selectedItem = option\n ? itemRefs.value.get(getOptionKey(option.value)) ?? null\n : null\n\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver(() => scheduleMeasure())\n }\n\n if (!root) {\n resizeObserver.disconnect()\n observedRoot = null\n observedItem = null\n return\n }\n\n if (observedRoot === root && observedItem === selectedItem) {\n return\n }\n\n resizeObserver.disconnect()\n resizeObserver.observe(root)\n\n if (selectedItem) {\n resizeObserver.observe(selectedItem)\n }\n\n observedRoot = root\n observedItem = selectedItem\n}\n\nfunction scheduleMeasure(): void {\n if (scheduled) {\n return\n }\n\n scheduled = true\n void nextTick(() => {\n scheduled = false\n measureIndicator()\n refreshObserver()\n })\n}\n\nfunction emitValue(option: GrSegmentedOption): void {\n if (resolveOptionDisabled(option) || option.value === props.modelValue) {\n return\n }\n\n emit('update:modelValue', option.value)\n emit('change', option.value, option)\n}\n\nfunction getNextEnabledIndex(startIndex: number, direction: 1 | -1): number {\n if (props.options.length === 0) {\n return -1\n }\n\n let cursor = startIndex\n for (let step = 0; step < props.options.length; step += 1) {\n cursor = (cursor + direction + props.options.length) % props.options.length\n const option = props.options[cursor]\n if (option && !resolveOptionDisabled(option)) {\n return cursor\n }\n }\n\n return -1\n}\n\nfunction focusIndex(index: number): void {\n const option = props.options[index]\n if (!option) {\n return\n }\n\n itemRefs.value.get(getOptionKey(option.value))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number): void {\n if (props.disabled) {\n return\n }\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, 1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault()\n const nextIndex = getNextEnabledIndex(index, -1)\n if (nextIndex === -1) {\n return\n }\n\n const option = props.options[nextIndex]\n if (option) {\n emitValue(option)\n focusIndex(nextIndex)\n }\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n const firstOption = enabledOptions.value[0]\n if (!firstOption) {\n return\n }\n\n emitValue(firstOption)\n focusIndex(props.options.findIndex(option => option.value === firstOption.value))\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n const lastOption = enabledOptions.value.at(-1)\n if (!lastOption) {\n return\n }\n\n emitValue(lastOption)\n focusIndex(props.options.findIndex(option => option.value === lastOption.value))\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n const option = props.options[index]\n if (option) {\n emitValue(option)\n }\n }\n}\n\nwatch(() => props.modelValue, () => scheduleMeasure())\nwatch(() => props.options, () => scheduleMeasure(), { deep: true })\nwatch(() => props.variant, () => scheduleMeasure())\nwatch(() => props.size, () => scheduleMeasure())\nwatch(() => props.block, () => scheduleMeasure())\n\nonMounted(() => scheduleMeasure())\nonBeforeUnmount(() => {\n resizeObserver?.disconnect()\n observedRoot = null\n observedItem = null\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n data-gr-segmented\n :data-variant=\"variant\"\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :class=\"rootClassName\"\n :style=\"rootStyle\"\n >\n <span\n v-if=\"hasIndicator\"\n data-gr-segmented-indicator\n aria-hidden=\"true\"\n :class=\"indicatorClassName\"\n :style=\"indicatorStyle\"\n />\n\n <button\n v-for=\"(option, index) in options\"\n :key=\"option.value\"\n :ref=\"element => setItemRef(option.value, element)\"\n data-gr-segmented-item\n :data-value=\"String(option.value)\"\n type=\"button\"\n role=\"radio\"\n :aria-checked=\"isOptionSelected(option) ? 'true' : 'false'\"\n :aria-disabled=\"resolveOptionDisabled(option) ? 'true' : undefined\"\n :disabled=\"resolveOptionDisabled(option)\"\n :tabindex=\"isFocusableOption(option, index) ? 0 : -1\"\n :class=\"grSegmentedItemClass({\n variant,\n selected: isOptionSelected(option),\n disabled: resolveOptionDisabled(option),\n iconOnly: isIconOnlyOption(option),\n })\"\n @click=\"emitValue(option)\"\n @keydown=\"onKeydown($event, index)\"\n >\n <input\n type=\"radio\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :name=\"resolvedName\"\n :value=\"option.value\"\n :checked=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n :style=\"hiddenInputStyle\"\n >\n\n <slot\n :option=\"option\"\n :selected=\"isOptionSelected(option)\"\n :disabled=\"resolveOptionDisabled(option)\"\n >\n <component\n :is=\"option.icon\"\n v-if=\"option.icon\"\n aria-hidden=\"true\"\n :class=\"grSegmentedItemIconClass\"\n />\n <span v-if=\"option.label\" :class=\"grSegmentedItemLabelClass\">\n {{ option.label }}\n </span>\n </slot>\n </button>\n </div>\n</template>"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,MAAM,mBAAmB;GACvB,UAAU;GACV,SAAS;GACT,OAAO;GACP,QAAQ;GACR,eAAe;EACjB;EA2BA,MAAM,QAAQ;EAad,MAAM,OAAO;EAMb,MAAM,eAAe,gBADJ,mBACoB,CAAA,EAAU,OAAO,KAAK,OAAO;EAElE,MAAM,UAAU,IAAwB,IAAI;EAC5C,MAAM,WAAW,oBAAI,IAAI,IAAyB,CAAC;EACnD,MAAM,oBAAoB,IAA8B,IAAI;EAC5D,MAAM,iBAAiB,IAAI,KAAK;EAEhC,IAAI,iBAAwC;EAC5C,IAAI,eAAmC;EACvC,IAAI,eAAmC;EACvC,IAAI,YAAY;EAEhB,MAAM,gBAAgB,eAAe,MAAM,QAAQ,WAAU,WAAU,OAAO,UAAU,MAAM,UAAU,CAAC;EACzG,MAAM,iBAAiB,eAAe,MAAM,QAAQ,cAAc,UAAU,IAAI;EAChF,MAAM,iBAAiB,eAAe,MAAM,QAAQ,QAAO,WAAU,CAAC,sBAAsB,MAAM,CAAC,CAAC;EACpG,MAAM,oBAAoB,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,iBAAiB,CAAC,CAAC;EACzF,MAAM,gBAAgB,eAAe,qBAAqB;GACxD,SAAS,MAAM;GACf,OAAO,MAAM;GACb,UAAU,MAAM;EAClB,CAAC,CAAC;EACF,MAAM,YAAY,gBAAwC;GACxD,GAAG,qBAAqB;IACtB,SAAS,MAAM;IACf,MAAM,MAAM;GACd,CAAC;GACD,qBAAqB,MAAM,QAAQ,SAAS,IACxC,MAAM,QAAQ,UAAU,MAAM,QAAQ,kBAAkB,uBAAuB,CAAC,CAAC,KAAK,GAAG,IACzF;EACN,EAAE;EACF,MAAM,qBAAqB,eAAe,0BAA0B,MAAM,OAAO,CAAC;EAClF,MAAM,eAAe,eAAe,MAAM,QAAQ,YAAY;EAC9D,MAAM,eAAe,eAAe,cAAc,UAAU,MAAM,kBAAkB,UAAU,IAAI;EAElG,MAAM,iBAAiB,eAAuC;GAC5D,MAAM,WAAW,kBAAkB;GACnC,IAAI,CAAC,UACH,OAAO;IACL,SAAS;IACT,OAAO;IACP,QAAQ;IACR,oBAAoB,GAAG,kBAAkB,MAAM;IAC/C,WAAW;GACb;GAGF,OAAO;IACL,SAAS,eAAe,QAAQ,MAAM;IACtC,OAAO,GAAG,SAAS,MAAM;IACzB,QAAQ,GAAG,SAAS,OAAO;IAC3B,oBAAoB,GAAG,kBAAkB,MAAM;IAC/C,WAAW,eAAe,SAAS,EAAE,MAAM,SAAS,EAAE;GACxD;EACF,CAAC;EAED,SAAS,aAAa,OAAiC;GACrD,OAAO,OAAO,KAAK;EACrB;EAEA,SAAS,sBAAsB,QAAoC;GACjE,OAAO,MAAM,YAAY,QAAQ,OAAO,QAAQ;EAClD;EAEA,SAAS,iBAAiB,QAAoC;GAC5D,OAAO,OAAO,UAAU,MAAM;EAChC;EAEA,SAAS,iBAAiB,QAAoC;GAC5D,OAAO,QAAQ,OAAO,IAAI,KAAK,CAAC,OAAO;EACzC;EAEA,SAAS,kBAAkB,QAA2B,OAAwB;GAC5E,IAAI,sBAAsB,MAAM,GAC9B,OAAO;GAGT,IAAI,iBAAiB,MAAM,GACzB,OAAO;GAGT,IAAI,cAAc,UAAU,IAC1B,OAAO;GAGT,OAAO,eAAe,MAAM,EAAE,EAAE,UAAU,MAAM,QAAQ,MAAM,EAAE;EAClE;EAEA,SAAS,WAAW,OAAyB,SAAyD;GACpG,MAAM,MAAM,aAAa,KAAK;GAE9B,IAAI,EAAE,mBAAmB,cAAc;IACrC,SAAS,MAAM,OAAO,GAAG;IACzB;GACF;GAEA,SAAS,MAAM,IAAI,KAAK,OAAO;EACjC;EAEA,SAAS,eAAe,MAAgC,OAA0C;GAChG,IAAI,SAAS,OACX,OAAO;GAGT,IAAI,CAAC,QAAQ,CAAC,OACZ,OAAO;GAGT,OAAO,KAAK,UAAU,MAAM,SACvB,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,MAAM,KACjB,KAAK,MAAM,MAAM;EACxB;EAEA,SAAS,mBAAyB;GAChC,MAAM,OAAO,QAAQ;GACrB,MAAM,SAAS,eAAe;GAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ;IACpB,IAAI,kBAAkB,UAAU,MAC9B,kBAAkB,QAAQ;IAE5B,IAAI,eAAe,OACjB,eAAe,QAAQ;IAEzB;GACF;GAEA,MAAM,eAAe,SAAS,MAAM,IAAI,aAAa,OAAO,KAAK,CAAC;GAClE,IAAI,CAAC,cACH;GAGF,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,WAAW,aAAa,sBAAsB;GAEpD,MAAM,eAAe;IACnB,OAAO,KAAK,IAAI,KAAK,MAAM,SAAS,KAAK,GAAG,CAAC;IAC7C,QAAQ,KAAK,IAAI,KAAK,MAAM,SAAS,MAAM,GAAG,CAAC;IAC/C,GAAG,KAAK,MAAM,SAAS,OAAO,SAAS,IAAI;IAC3C,GAAG,KAAK,IAAI,KAAK,MAAM,SAAS,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;GAC5D;GAEA,IAAI,CAAC,eAAe,kBAAkB,OAAO,YAAY,GACvD,kBAAkB,QAAQ;GAG5B,MAAM,YAAY,aAAa,QAAQ,KAAK,aAAa,SAAS;GAClE,IAAI,eAAe,UAAU,WAC3B,eAAe,QAAQ;EAE3B;EAEA,SAAS,kBAAwB;GAC/B,IAAI,OAAO,mBAAmB,aAC5B;GAGF,MAAM,OAAO,QAAQ;GACrB,MAAM,SAAS,eAAe;GAC9B,MAAM,eAAe,SACjB,SAAS,MAAM,IAAI,aAAa,OAAO,KAAK,CAAC,KAAK,OAClD;GAEJ,IAAI,CAAC,gBACH,iBAAiB,IAAI,qBAAqB,gBAAgB,CAAC;GAG7D,IAAI,CAAC,MAAM;IACT,eAAe,WAAW;IAC1B,eAAe;IACf,eAAe;IACf;GACF;GAEA,IAAI,iBAAiB,QAAQ,iBAAiB,cAC5C;GAGF,eAAe,WAAW;GAC1B,eAAe,QAAQ,IAAI;GAE3B,IAAI,cACF,eAAe,QAAQ,YAAY;GAGrC,eAAe;GACf,eAAe;EACjB;EAEA,SAAS,kBAAwB;GAC/B,IAAI,WACF;GAGF,YAAY;GACZ,eAAoB;IAClB,YAAY;IACZ,iBAAiB;IACjB,gBAAgB;GAClB,CAAC;EACH;EAEA,SAAS,UAAU,QAAiC;GAClD,IAAI,sBAAsB,MAAM,KAAK,OAAO,UAAU,MAAM,YAC1D;GAGF,KAAK,qBAAqB,OAAO,KAAK;GACtC,KAAK,UAAU,OAAO,OAAO,MAAM;EACrC;EAEA,SAAS,oBAAoB,YAAoB,WAA2B;GAC1E,IAAI,MAAM,QAAQ,WAAW,GAC3B,OAAO;GAGT,IAAI,SAAS;GACb,KAAK,IAAI,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ,QAAQ,GAAG;IACzD,UAAU,SAAS,YAAY,MAAM,QAAQ,UAAU,MAAM,QAAQ;IACrE,MAAM,SAAS,MAAM,QAAQ;IAC7B,IAAI,UAAU,CAAC,sBAAsB,MAAM,GACzC,OAAO;GAEX;GAEA,OAAO;EACT;EAEA,SAAS,WAAW,OAAqB;GACvC,MAAM,SAAS,MAAM,QAAQ;GAC7B,IAAI,CAAC,QACH;GAGF,SAAS,MAAM,IAAI,aAAa,OAAO,KAAK,CAAC,CAAC,EAAE,MAAM;EACxD;EAEA,SAAS,UAAU,OAAsB,OAAqB;GAC5D,IAAI,MAAM,UACR;GAGF,IAAI,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,aAAa;IAC3D,MAAM,eAAe;IACrB,MAAM,YAAY,oBAAoB,OAAO,CAAC;IAC9C,IAAI,cAAc,IAChB;IAGF,MAAM,SAAS,MAAM,QAAQ;IAC7B,IAAI,QAAQ;KACV,UAAU,MAAM;KAChB,WAAW,SAAS;IACtB;IACA;GACF;GAEA,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;IACxD,MAAM,eAAe;IACrB,MAAM,YAAY,oBAAoB,OAAO,EAAE;IAC/C,IAAI,cAAc,IAChB;IAGF,MAAM,SAAS,MAAM,QAAQ;IAC7B,IAAI,QAAQ;KACV,UAAU,MAAM;KAChB,WAAW,SAAS;IACtB;IACA;GACF;GAEA,IAAI,MAAM,QAAQ,QAAQ;IACxB,MAAM,eAAe;IACrB,MAAM,cAAc,eAAe,MAAM;IACzC,IAAI,CAAC,aACH;IAGF,UAAU,WAAW;IACrB,WAAW,MAAM,QAAQ,WAAU,WAAU,OAAO,UAAU,YAAY,KAAK,CAAC;IAChF;GACF;GAEA,IAAI,MAAM,QAAQ,OAAO;IACvB,MAAM,eAAe;IACrB,MAAM,aAAa,eAAe,MAAM,GAAG,EAAE;IAC7C,IAAI,CAAC,YACH;IAGF,UAAU,UAAU;IACpB,WAAW,MAAM,QAAQ,WAAU,WAAU,OAAO,UAAU,WAAW,KAAK,CAAC;IAC/E;GACF;GAEA,IAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS;IAC9C,MAAM,eAAe;IACrB,MAAM,SAAS,MAAM,QAAQ;IAC7B,IAAI,QACF,UAAU,MAAM;GAEpB;EACF;EAEA,YAAY,MAAM,kBAAkB,gBAAgB,CAAC;EACrD,YAAY,MAAM,eAAe,gBAAgB,GAAG,EAAE,MAAM,KAAK,CAAC;EAClE,YAAY,MAAM,eAAe,gBAAgB,CAAC;EAClD,YAAY,MAAM,YAAY,gBAAgB,CAAC;EAC/C,YAAY,MAAM,aAAa,gBAAgB,CAAC;EAEhD,gBAAgB,gBAAgB,CAAC;EACjC,sBAAsB;GACpB,gBAAgB,WAAW;GAC3B,eAAe;GACf,eAAe;EACjB,CAAC;;uBAIC,mBAkEM,OAAA;aAjEA;IAAJ,KAAI;IACJ,qBAAA;IACC,gBAAc,QAAA;IACf,MAAK;IACJ,cAAY,QAAA;IACZ,iBAAe,QAAA,WAAQ,SAAY,KAAA;IACnC,OAAK,eAAE,cAAA,KAAa;IACpB,OAAK,eAAE,UAAA,KAAS;OAGT,aAAA,SAAA,UAAA,GADR,mBAME,QAAA;;IAJA,+BAAA;IACA,eAAY;IACX,OAAK,eAAE,mBAAA,KAAkB;IACzB,OAAK,eAAE,eAAA,KAAc;kEAGxB,mBA+CS,UAAA,MAAA,WA9CmB,QAAA,UAAlB,QAAQ,UAAK;wBADvB,mBA+CS,UAAA;KA7CN,KAAK,OAAO;;KACZ,MAAK,YAAW,WAAW,OAAO,OAAO,OAAO;KACjD,0BAAA;KACC,cAAY,OAAO,OAAO,KAAK;KAChC,MAAK;KACL,MAAK;KACJ,gBAAc,iBAAiB,MAAM,IAAA,SAAA;KACrC,iBAAe,sBAAsB,MAAM,IAAA,SAAa,KAAA;KACxD,UAAU,sBAAsB,MAAM;KACtC,UAAU,kBAAkB,QAAQ,KAAK,IAAA,IAAA;KACzC,OAAK,eAAE,MAAA,oBAAA,CAAoB,CAAA;eAAW,QAAA;gBAA2B,iBAAiB,MAAM;gBAAqB,sBAAsB,MAAM;gBAAqB,iBAAiB,MAAM;;KAMrL,UAAK,WAAE,UAAU,MAAM;KACvB,YAAO,WAAE,UAAU,QAAQ,KAAK;QAEjC,mBASC,SAAA;KARC,MAAK;KACL,UAAS;KACT,eAAY;KACX,MAAM,aAAA;KACN,OAAO,OAAO;KACd,SAAS,iBAAiB,MAAM;KAChC,UAAU,sBAAsB,MAAM;KACtC,OAAO;6BAGV,WAcO,KAAA,QAAA,WAAA;KAbI;KACR,UAAU,iBAAiB,MAAM;KACjC,UAAU,sBAAsB,MAAM;aAWlC,CAPG,OAAO,QAAA,UAAA,GAFf,YAKE,wBAJK,OAAO,IAAI,GAAA;;KAEhB,eAAY;KACX,OAAK,eAAE,MAAA,wBAAA,CAAwB;4DAEtB,OAAO,SAAA,UAAA,GAAnB,mBAEO,QAAA;;KAFoB,OAAK,eAAE,MAAA,yBAAA,CAAyB;uBACtD,OAAO,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,CAAA,GAAA,IAAA,UAAA"}
@@ -1,3 +1,3 @@
1
- import { n as grSegmentedSafelist, t as grSegmentedConfig } from "../../chunks/config-B2YTEe_h.js";
2
- import { t as GrSegmented_default } from "./chunks/GrSegmented-BRmwBsEG.js";
1
+ import { n as grSegmentedSafelist, t as grSegmentedConfig } from "../../chunks/config-eYLZYOUS2.js";
2
+ import { t as GrSegmented_default } from "./chunks/GrSegmented-C1y0UXpQ.js";
3
3
  export { GrSegmented_default as GrSegmented, GrSegmented_default as default, grSegmentedConfig, grSegmentedSafelist };
@@ -1,26 +1,33 @@
1
- import { t as GrInput_default } from "../../GrInput/chunks/GrInput-gwFQ1sk4.js";
1
+ import { t as useGranularityTranslations } from "../../../chunks/granularityI18n-DoV7Ca2m.js";
2
+ import { t as GrInput_default } from "../../GrInput/chunks/GrInput-C8pOJgCi.js";
2
3
  import { vClickOutside } from "../../../directives/clickOutside.js";
3
- import { a as grSelectPanelClasses, i as grSelectNativeClass, n as grSelectLinkNativeLabelClass, o as grSelectTriggerClass, r as grSelectLinkNativeOverlayClass, s as linkBaseClass, t as defaultBaseClass } from "../../../chunks/grSelectStyles-pUt19VGy.js";
4
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onUnmounted, openBlock, ref, renderList, renderSlot, toDisplayString, unref, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
4
+ import { t as useFloating } from "../../../chunks/useFloating-DtM6TyE4.js";
5
+ import { t as useEscapeToClose } from "../../../chunks/useEscapeToClose-C2t_S1gh.js";
6
+ import { a as grSelectPanelClasses, i as grSelectNativeClass, n as grSelectLinkNativeLabelClass, o as grSelectTriggerClass, r as grSelectLinkNativeOverlayClass, s as linkBaseClass, t as defaultBaseClass } from "../../../chunks/grSelectStyles-CLK5hRd3.js";
7
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderList, renderSlot, toDisplayString, unref, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
5
8
  //#region src/components/GrSelect/GrSelect.vue?vue&type=script&setup=true&lang.ts
6
9
  var _hoisted_1 = [
7
- "value",
8
10
  "multiple",
9
11
  "disabled",
10
12
  "aria-label"
11
13
  ];
12
- var _hoisted_2 = {
13
- key: 0,
14
- value: ""
15
- };
16
- var _hoisted_3 = ["value"];
14
+ var _hoisted_2 = ["selected"];
15
+ var _hoisted_3 = ["value", "selected"];
17
16
  var _hoisted_4 = ["label"];
18
- var _hoisted_5 = ["value"];
19
- var _hoisted_6 = ["value"];
17
+ var _hoisted_5 = [
18
+ "value",
19
+ "selected",
20
+ "disabled"
21
+ ];
22
+ var _hoisted_6 = [
23
+ "value",
24
+ "selected",
25
+ "disabled"
26
+ ];
20
27
  var _hoisted_7 = {
21
28
  key: 1,
22
- "data-testid": "ds-select-chevron",
23
- class: "absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none"
29
+ "data-testid": "gr-select-chevron",
30
+ class: "absolute top-1/2 -translate-y-1/2 right-3 flex items-center text-[var(--muted-fg)] pointer-events-none"
24
31
  };
25
32
  var _hoisted_8 = [
26
33
  "disabled",
@@ -35,8 +42,8 @@ var _hoisted_10 = {
35
42
  };
36
43
  var _hoisted_11 = {
37
44
  key: 1,
38
- "data-testid": "ds-select-chevron",
39
- class: "shrink-0 text-[var(--muted-fg)] pointer-events-none"
45
+ "data-testid": "gr-select-chevron",
46
+ class: "shrink-0 flex items-center text-[var(--muted-fg)] pointer-events-none"
40
47
  };
41
48
  var _hoisted_12 = ["disabled", "aria-label"];
42
49
  var _hoisted_13 = {
@@ -44,7 +51,12 @@ var _hoisted_13 = {
44
51
  class: "p-2 border-b border-[var(--brd)]"
45
52
  };
46
53
  var _hoisted_14 = ["aria-multiselectable"];
47
- var _hoisted_15 = ["aria-selected", "onClick"];
54
+ var _hoisted_15 = [
55
+ "disabled",
56
+ "aria-selected",
57
+ "aria-disabled",
58
+ "onClick"
59
+ ];
48
60
  var _hoisted_16 = { class: "flex items-center gap-2 min-w-0" };
49
61
  var _hoisted_17 = { class: "truncate" };
50
62
  //#endregion
@@ -71,7 +83,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
71
83
  type: Boolean,
72
84
  default: false
73
85
  },
74
- customValuePlaceholder: { default: "Add value…" },
86
+ customValuePlaceholder: { default: void 0 },
75
87
  dropdownMaxHeight: { default: 280 },
76
88
  closeOnSelect: {
77
89
  type: Boolean,
@@ -81,13 +93,18 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
81
93
  type: Boolean,
82
94
  default: false
83
95
  },
84
- clearLabel: { default: "Clear" },
96
+ clearLabel: { default: void 0 },
85
97
  variant: { default: "primary" },
86
98
  underline: { default: "auto" }
87
99
  },
88
100
  emits: ["update:modelValue"],
89
101
  setup(__props, { emit: __emit }) {
90
102
  const props = __props;
103
+ const { t } = useGranularityTranslations();
104
+ const resolvedCustomValuePlaceholder = computed(() => {
105
+ return props.customValuePlaceholder ?? t("gr.select.customValuePlaceholder", "Add value…");
106
+ });
107
+ const resolvedClearLabel = computed(() => props.clearLabel ?? t("gr.common.clear", "Clear"));
91
108
  const baseClassName = computed(() => props.view === "link" ? linkBaseClass : defaultBaseClass);
92
109
  const rootClass = computed(() => props.view === "link" ? "relative inline-block align-baseline" : "relative w-full");
93
110
  const emit = __emit;
@@ -137,9 +154,13 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
137
154
  if (hasSelection.value) return displayLabel.value;
138
155
  return props.placeholder ?? "";
139
156
  });
157
+ const effectiveOptionsView = computed(() => {
158
+ if (props.view === "link" && props.multiple && props.optionsView === "native") return "panel";
159
+ return props.optionsView;
160
+ });
140
161
  const nativeCustomOptionVisible = computed(() => {
141
162
  if (!props.allowCustomValue) return false;
142
- if (props.optionsView !== "native") return false;
163
+ if (effectiveOptionsView.value !== "native") return false;
143
164
  if (props.multiple) return false;
144
165
  if (!props.options) return false;
145
166
  if (modelSingle.value === "") return false;
@@ -151,44 +172,11 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
151
172
  const panelEl = ref(null);
152
173
  const customInputRef = ref(null);
153
174
  const clickOutsideExclude = [() => panelEl.value];
154
- const panelStyle = ref({
155
- left: "0px",
156
- top: "0px",
157
- width: "0px",
158
- zIndex: "2147483647"
175
+ const { floatingStyle, update: updateFloatingPosition } = useFloating(rootEl, panelEl, open, {
176
+ placement: "bottom-start",
177
+ matchWidth: () => props.view === "link" ? "min" : true,
178
+ zIndexVar: "--gr-z-dropdown"
159
179
  });
160
- function syncPanelPosition() {
161
- if (typeof window === "undefined") return;
162
- const root = rootEl.value;
163
- if (!root) return;
164
- const rect = root.getBoundingClientRect();
165
- if (props.view === "link") {
166
- panelStyle.value = {
167
- left: `${rect.left}px`,
168
- top: `${rect.bottom + 8}px`,
169
- width: "max-content",
170
- minWidth: `${rect.width}px`,
171
- zIndex: "2147483647"
172
- };
173
- return;
174
- }
175
- panelStyle.value = {
176
- left: `${rect.left}px`,
177
- top: `${rect.bottom + 8}px`,
178
- width: `${rect.width}px`,
179
- zIndex: "2147483647"
180
- };
181
- }
182
- function bindPanelPositionListeners() {
183
- if (typeof window === "undefined") return;
184
- window.addEventListener("resize", syncPanelPosition);
185
- window.addEventListener("scroll", syncPanelPosition, true);
186
- }
187
- function unbindPanelPositionListeners() {
188
- if (typeof window === "undefined") return;
189
- window.removeEventListener("resize", syncPanelPosition);
190
- window.removeEventListener("scroll", syncPanelPosition, true);
191
- }
192
180
  function closeDropdown() {
193
181
  open.value = false;
194
182
  }
@@ -196,28 +184,20 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
196
184
  if (props.disabled) return;
197
185
  open.value = !open.value;
198
186
  }
199
- function closeOnEscape(e) {
200
- if (e.key === "Escape") closeDropdown();
201
- }
187
+ useEscapeToClose(open, closeDropdown);
188
+ watch(() => props.view, () => {
189
+ if (open.value) updateFloatingPosition();
190
+ });
202
191
  watch(open, async (isOpen) => {
203
- if (typeof document === "undefined") return;
204
- document.removeEventListener("keydown", closeOnEscape);
205
- unbindPanelPositionListeners();
206
- if (isOpen) document.addEventListener("keydown", closeOnEscape);
207
192
  if (!isOpen) {
208
193
  customValue.value = "";
209
194
  return;
210
195
  }
211
- bindPanelPositionListeners();
212
- await nextTick();
213
- syncPanelPosition();
214
- if (props.allowCustomValue) customInputRef.value?.focus();
196
+ if (props.allowCustomValue) {
197
+ await nextTick();
198
+ customInputRef.value?.focus();
199
+ }
215
200
  }, { immediate: true });
216
- onUnmounted(() => {
217
- if (typeof document === "undefined") return;
218
- document.removeEventListener("keydown", closeOnEscape);
219
- unbindPanelPositionListeners();
220
- });
221
201
  const panelClasses = computed(() => {
222
202
  return grSelectPanelClasses;
223
203
  });
@@ -255,21 +235,21 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
255
235
  for (const option of matched) items.push({
256
236
  kind: "option",
257
237
  option,
258
- key: option.value
238
+ key: `${index}:${option.value}`
259
239
  });
260
240
  return;
261
241
  }
262
242
  if (matchesQuery(item, q)) items.push({
263
243
  kind: "option",
264
244
  option: item,
265
- key: item.value
245
+ key: `${index}:${item.value}`
266
246
  });
267
247
  });
268
248
  return items;
269
249
  });
270
250
  const canAddCustom = computed(() => {
271
251
  if (!props.allowCustomValue) return false;
272
- if (props.optionsView !== "panel") return false;
252
+ if (effectiveOptionsView.value !== "panel") return false;
273
253
  const v = customValue.value.trim();
274
254
  if (!v) return false;
275
255
  if (props.multiple) {
@@ -285,11 +265,15 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
285
265
  function isSelected(value) {
286
266
  return selectedValues.value.includes(value);
287
267
  }
268
+ function isOptionDisabled(value) {
269
+ return flatOptions.value.find((o) => o.value === value)?.disabled === true;
270
+ }
288
271
  function selectValue(value) {
289
272
  emitValue(value);
290
273
  if (props.closeOnSelect) closeDropdown();
291
274
  }
292
275
  function toggleValue(value) {
276
+ if (isOptionDisabled(value)) return;
293
277
  if (!props.multiple) {
294
278
  selectValue(value);
295
279
  return;
@@ -307,18 +291,18 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
307
291
  toggleValue(v);
308
292
  }
309
293
  const showNativeChevron = computed(() => {
310
- return props.optionsView === "native" && props.view !== "link" && !props.multiple;
294
+ return effectiveOptionsView.value === "native" && props.view !== "link" && !props.multiple;
311
295
  });
312
296
  const nativeClearOptionVisible = computed(() => {
313
297
  if (!props.clearable) return false;
314
- if (props.optionsView !== "native") return false;
298
+ if (effectiveOptionsView.value !== "native") return false;
315
299
  if (props.multiple) return false;
316
300
  if (!props.options) return true;
317
301
  return !flatOptions.value.some((o) => o.value === "");
318
302
  });
319
303
  const panelClearVisible = computed(() => {
320
304
  if (!props.clearable) return false;
321
- if (props.optionsView !== "panel") return false;
305
+ if (effectiveOptionsView.value !== "panel") return false;
322
306
  if (props.view === "link") return false;
323
307
  return hasSelection.value;
324
308
  });
@@ -338,7 +322,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
338
322
  * `<select>`-overlay поверх видимого `<span>` с меткой — overlay принимает клики/клавиатуру,
339
323
  * span задаёт ширину компонента в закрытом состоянии.
340
324
  */
341
- const isLinkNative = computed(() => props.view === "link" && props.optionsView === "native");
325
+ const isLinkNative = computed(() => props.view === "link" && effectiveOptionsView.value === "native");
342
326
  const linkNativeLabelClassName = computed(() => grSelectLinkNativeLabelClass({
343
327
  size: props.size,
344
328
  variant: props.variant,
@@ -351,7 +335,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
351
335
  const triggerClassName = computed(() => {
352
336
  return grSelectTriggerClass({
353
337
  view: props.view,
354
- optionsView: props.optionsView,
338
+ optionsView: effectiveOptionsView.value,
355
339
  size: props.size,
356
340
  disabled: props.disabled,
357
341
  variant: props.variant,
@@ -361,7 +345,8 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
361
345
  function onChange(e) {
362
346
  const el = e.target;
363
347
  if (props.multiple) {
364
- emit("update:modelValue", Array.from(el.selectedOptions, (o) => o.value));
348
+ const values = Array.from(el.selectedOptions, (o) => o.value);
349
+ emit("update:modelValue", values);
365
350
  return;
366
351
  }
367
352
  emit("update:modelValue", el.value);
@@ -371,56 +356,64 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
371
356
  emitValue(props.multiple ? [] : "");
372
357
  }
373
358
  return (_ctx, _cache) => {
374
- return __props.optionsView === "native" ? (openBlock(), createElementBlock("div", {
359
+ return effectiveOptionsView.value === "native" ? (openBlock(), createElementBlock("div", {
375
360
  key: 0,
376
- "data-ds-select": "",
361
+ "data-gr-select": "",
377
362
  class: normalizeClass(rootClass.value)
378
363
  }, [
379
364
  createElementVNode("select", {
380
- "data-ds-select-native": "",
381
- value: __props.multiple ? modelMultiple.value : modelSingle.value,
365
+ "data-gr-select-native": "",
382
366
  multiple: __props.multiple,
383
367
  disabled: __props.disabled,
384
368
  "aria-label": __props.ariaLabel,
385
369
  class: normalizeClass(isLinkNative.value ? unref(grSelectLinkNativeOverlayClass) : [baseClassName.value, nativeClassName.value]),
386
370
  onChange
387
- }, [nativeClearOptionVisible.value ? (openBlock(), createElementBlock("option", _hoisted_2)) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default", {}, () => [nativeCustomOptionVisible.value ? (openBlock(), createElementBlock("option", {
371
+ }, [nativeClearOptionVisible.value ? (openBlock(), createElementBlock("option", {
372
+ key: 0,
373
+ value: "",
374
+ selected: !__props.multiple && modelSingle.value === ""
375
+ }, toDisplayString(__props.placeholder || unref(t)("gr.select.clearOption", "None")), 9, _hoisted_2)) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default", {}, () => [nativeCustomOptionVisible.value ? (openBlock(), createElementBlock("option", {
388
376
  key: 0,
389
- value: modelSingle.value
377
+ value: modelSingle.value,
378
+ selected: !__props.multiple
390
379
  }, toDisplayString(modelSingle.value), 9, _hoisted_3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(optionsResolved.value, (item, index) => {
391
380
  return openBlock(), createElementBlock(Fragment, { key: index }, [isOptionGroup(item) ? (openBlock(), createElementBlock("optgroup", {
392
381
  key: 0,
393
382
  label: item.label
394
383
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(item.options, (opt) => {
395
384
  return openBlock(), createElementBlock("option", {
396
- key: opt.value,
397
- value: opt.value
385
+ key: `${index}:${opt.value}`,
386
+ value: opt.value,
387
+ selected: __props.multiple ? modelMultiple.value.includes(opt.value) : modelSingle.value === opt.value,
388
+ disabled: opt.disabled
398
389
  }, toDisplayString(opt.label), 9, _hoisted_5);
399
390
  }), 128))], 8, _hoisted_4)) : (openBlock(), createElementBlock("option", {
400
391
  key: 1,
401
- value: item.value
392
+ value: item.value,
393
+ selected: __props.multiple ? modelMultiple.value.includes(item.value) : modelSingle.value === item.value,
394
+ disabled: item.disabled
402
395
  }, toDisplayString(item.label), 9, _hoisted_6))], 64);
403
396
  }), 128))])], 42, _hoisted_1),
404
397
  isLinkNative.value ? (openBlock(), createElementBlock("span", {
405
398
  key: 0,
406
- "data-ds-select-link-label": "",
399
+ "data-gr-select-link-label": "",
407
400
  "aria-hidden": "true",
408
401
  class: normalizeClass(linkNativeLabelClassName.value)
409
402
  }, toDisplayString(linkNativeDisplayText.value), 3)) : createCommentVNode("", true),
410
403
  showNativeChevron.value ? (openBlock(), createElementBlock("span", _hoisted_7, [..._cache[1] || (_cache[1] = [createElementVNode("span", {
411
- class: "i-lucide-chevron-down inline-block h-4 w-4",
404
+ class: "i-lucide-chevron-down block h-4 w-4",
412
405
  "aria-hidden": "true"
413
406
  }, null, -1)])])) : createCommentVNode("", true)
414
407
  ], 2)) : withDirectives((openBlock(), createElementBlock("div", {
415
408
  key: 1,
416
409
  ref_key: "rootEl",
417
410
  ref: rootEl,
418
- "data-ds-select": "",
411
+ "data-gr-select": "",
419
412
  class: normalizeClass(rootClass.value)
420
413
  }, [
421
414
  createElementVNode("button", {
422
- "data-testid": "ds-select-trigger",
423
- "data-ds-select-trigger": "",
415
+ "data-testid": "gr-select-trigger",
416
+ "data-gr-select-trigger": "",
424
417
  type: "button",
425
418
  disabled: __props.disabled,
426
419
  "aria-label": __props.ariaLabel,
@@ -436,17 +429,17 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
436
429
  placeholder: __props.placeholder,
437
430
  hasSelection: hasSelection.value
438
431
  }, () => [createElementVNode("span", { class: normalizeClass(["block truncate", !hasSelection.value ? "text-[var(--muted-fg)]" : ""]) }, toDisplayString(displayText.value), 3)])]), panelClearVisible.value ? (openBlock(), createElementBlock("span", _hoisted_10)) : (openBlock(), createElementBlock("span", _hoisted_11, [..._cache[2] || (_cache[2] = [createElementVNode("span", {
439
- class: "i-lucide-chevron-down inline-block h-4 w-4",
432
+ class: "i-lucide-chevron-down block h-4 w-4",
440
433
  "aria-hidden": "true"
441
434
  }, null, -1)])]))], 10, _hoisted_8),
442
435
  panelClearVisible.value ? (openBlock(), createElementBlock("button", {
443
436
  key: 0,
444
- "data-testid": "ds-select-clear",
445
- "data-ds-select-clear": "",
437
+ "data-testid": "gr-select-clear",
438
+ "data-gr-select-clear": "",
446
439
  type: "button",
447
440
  class: "absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50",
448
441
  disabled: __props.disabled,
449
- "aria-label": __props.clearLabel,
442
+ "aria-label": resolvedClearLabel.value,
450
443
  onClick: withModifiers(clearSelection, ["stop"])
451
444
  }, [..._cache[3] || (_cache[3] = [createElementVNode("span", {
452
445
  class: "i-lucide-x inline-block h-4 w-4",
@@ -463,18 +456,17 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
463
456
  default: withCtx(() => [withDirectives(createElementVNode("div", {
464
457
  ref_key: "panelEl",
465
458
  ref: panelEl,
466
- "data-testid": "ds-select-panel",
467
- "data-ds-select-panel": "",
468
- class: "fixed w-full",
469
- style: normalizeStyle(panelStyle.value)
459
+ "data-testid": "gr-select-panel",
460
+ "data-gr-select-panel": "",
461
+ style: normalizeStyle(unref(floatingStyle))
470
462
  }, [createElementVNode("div", { class: normalizeClass(panelClasses.value) }, [__props.allowCustomValue ? (openBlock(), createElementBlock("div", _hoisted_13, [createVNode(GrInput_default, {
471
463
  ref_key: "customInputRef",
472
464
  ref: customInputRef,
473
465
  modelValue: customValue.value,
474
466
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => customValue.value = $event),
475
- "data-testid": "ds-select-custom-input",
467
+ "data-testid": "gr-select-custom-input",
476
468
  type: "text",
477
- placeholder: __props.customValuePlaceholder,
469
+ placeholder: resolvedCustomValuePlaceholder.value,
478
470
  size: "sm",
479
471
  onKeydown: withKeys(withModifiers(addCustom, ["prevent"]), ["enter"])
480
472
  }, null, 8, [
@@ -482,31 +474,33 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
482
474
  "placeholder",
483
475
  "onKeydown"
484
476
  ])])) : createCommentVNode("", true), createElementVNode("div", {
485
- "data-ds-select-listbox": "",
477
+ "data-gr-select-listbox": "",
486
478
  class: "p-1 overflow-auto",
487
479
  style: normalizeStyle({ maxHeight: `${__props.dropdownMaxHeight}px` }),
488
480
  role: "listbox",
489
481
  "aria-multiselectable": __props.multiple ? "true" : void 0
490
482
  }, [canAddCustom.value ? (openBlock(), createElementBlock("button", {
491
483
  key: 0,
492
- "data-testid": "ds-select-add-option",
493
- "data-ds-select-add-option": "",
484
+ "data-testid": "gr-select-add-option",
485
+ "data-gr-select-add-option": "",
494
486
  type: "button",
495
487
  class: normalizeClass(["rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : "w-full"]]),
496
488
  onClick: addCustom
497
- }, " Add " + toDisplayString(customValue.value.trim()) + "” ", 3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(panelItems.value, (item) => {
489
+ }, toDisplayString(unref(t)("gr.select.addOption", "Add \"{value}\"", { value: customValue.value.trim() })), 3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(panelItems.value, (item) => {
498
490
  return openBlock(), createElementBlock(Fragment, { key: item.key }, [item.kind === "group" ? (openBlock(), createElementBlock("div", {
499
491
  key: 0,
500
- "data-ds-select-group-label": "",
492
+ "data-gr-select-group-label": "",
501
493
  role: "presentation",
502
494
  class: normalizeClass(["px-3 pt-2 pb-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--muted-fg)]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : ""]])
503
495
  }, toDisplayString(item.label), 3)) : (openBlock(), createElementBlock("button", {
504
496
  key: 1,
505
- "data-ds-select-option": "",
497
+ "data-gr-select-option": "",
506
498
  type: "button",
507
499
  role: "option",
500
+ disabled: item.option.disabled,
508
501
  "aria-selected": isSelected(item.option.value) ? "true" : "false",
509
- class: normalizeClass(["rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : "w-full"]]),
502
+ "aria-disabled": item.option.disabled ? "true" : void 0,
503
+ class: normalizeClass(["rounded-[10px] px-3 py-2 text-left text-[13px]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : "w-full", item.option.disabled ? "cursor-not-allowed opacity-50" : "hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]"]]),
510
504
  onClick: ($event) => toggleValue(item.option.value)
511
505
  }, [renderSlot(_ctx.$slots, "option", {
512
506
  option: item.option,