@feugene/granularity 0.19.0 → 0.20.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 (835) hide show
  1. package/README.md +8 -0
  2. package/dist/chunks/config-8Pcutu1j.js.map +1 -0
  3. package/dist/chunks/{config-06SQjBx0.js → config-B4w5gBD0.js} +1 -8
  4. package/dist/chunks/{config-06SQjBx0.js.map → config-B4w5gBD0.js.map} +1 -1
  5. package/dist/chunks/config-BE6n20np.js.map +1 -0
  6. package/dist/chunks/{config-B-iNaGdw.js → config-BEVBsvni.js} +1 -3
  7. package/dist/chunks/{config-B-iNaGdw.js.map → config-BEVBsvni.js.map} +1 -1
  8. package/dist/chunks/config-BKvX0q10.js.map +1 -0
  9. package/dist/chunks/config-BTCOJO5z.js +37 -0
  10. package/dist/chunks/config-BTCOJO5z.js.map +1 -0
  11. package/dist/chunks/{config-Rw9OyW702.js → config-BfsBepkH2.js} +1 -5
  12. package/dist/chunks/{config-Rw9OyW702.js.map → config-BfsBepkH2.js.map} +1 -1
  13. package/dist/chunks/{config-DP7eseR1.js → config-Bsh948nP.js} +1 -8
  14. package/dist/chunks/{config-DP7eseR1.js.map → config-Bsh948nP.js.map} +1 -1
  15. package/dist/chunks/config-CDat1wXf.js.map +1 -0
  16. package/dist/chunks/config-COpuWGr_2.js.map +1 -0
  17. package/dist/chunks/config-CY0_6cMi.js.map +1 -0
  18. package/dist/chunks/config-D94Z9po5.js.map +1 -0
  19. package/dist/chunks/config-DAX8Deh12.js.map +1 -0
  20. package/dist/chunks/{config-_qPUfb6-2.js → config-DWN4x6_e.js} +1 -7
  21. package/dist/chunks/config-DWN4x6_e.js.map +1 -0
  22. package/dist/chunks/{config-DhHbU3zO.js → config-Dgj1Q6JY.js} +1 -12
  23. package/dist/chunks/{config-DhHbU3zO.js.map → config-Dgj1Q6JY.js.map} +1 -1
  24. package/dist/chunks/{config-D3_g2KIn.js → config-Dguto_6o.js} +1 -13
  25. package/dist/chunks/{config-D3_g2KIn.js.map → config-Dguto_6o.js.map} +1 -1
  26. package/dist/chunks/config-WTNhdh6T.js.map +1 -0
  27. package/dist/chunks/config-eXB87DOi2.js.map +1 -0
  28. package/dist/chunks/{config-DvQIb4kb.js → config-vSji8w90.js} +1 -14
  29. package/dist/chunks/{config-DvQIb4kb.js.map → config-vSji8w90.js.map} +1 -1
  30. package/dist/chunks/{context-BSYR7RZs.js → context-CTbuwcYs.js} +1 -20
  31. package/dist/chunks/{context-BSYR7RZs.js.map → context-CTbuwcYs.js.map} +1 -1
  32. package/dist/chunks/{config-BqFjr3tN.js → grRadioStyles-BTjGNhtU.js} +1 -36
  33. package/dist/chunks/grRadioStyles-BTjGNhtU.js.map +1 -0
  34. package/dist/chunks/{granular-provider-C6uAujdJ.js → granular-provider-CZYm70Pm.js} +19 -19
  35. package/dist/chunks/{granular-provider-C6uAujdJ.js.map → granular-provider-CZYm70Pm.js.map} +1 -1
  36. package/dist/chunks/{useModalOverlay-DrQVYwwA.js → useModalOverlay-Cv5hF63W.js} +2 -2
  37. package/dist/chunks/{useModalOverlay-DrQVYwwA.js.map → useModalOverlay-Cv5hF63W.js.map} +1 -1
  38. package/dist/chunks/{usePortalTarget-Cn-Wiz5d.js → usePortalTarget-C0p-mhaM.js} +1 -1
  39. package/dist/chunks/{usePortalTarget-Cn-Wiz5d.js.map → usePortalTarget-C0p-mhaM.js.map} +1 -1
  40. package/dist/chunks/{validation-5HhpanPP.js → validation-DauXRIkL.js} +1 -1
  41. package/dist/chunks/{validation-5HhpanPP.js.map → validation-DauXRIkL.js.map} +1 -1
  42. package/dist/components/GrAlert/chunks/{GrAlert-BC1lplbY.js → GrAlert-B21QGele.js} +2 -16
  43. package/dist/components/GrAlert/chunks/{GrAlert-BC1lplbY.js.map → GrAlert-B21QGele.js.map} +1 -1
  44. package/dist/components/GrAlert/index.js +2 -2
  45. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-gY4Xopza.js → GrAutocomplete-DsevPtiS.js} +3 -3
  46. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-gY4Xopza.js.map → GrAutocomplete-DsevPtiS.js.map} +1 -1
  47. package/dist/components/GrAutocomplete/index.js +1 -1
  48. package/dist/components/GrAvatar/chunks/{GrAvatar-CVUujLmn.js → GrAvatar-BbdKRX8i.js} +3 -3
  49. package/dist/components/GrAvatar/chunks/{GrAvatar-CVUujLmn.js.map → GrAvatar-BbdKRX8i.js.map} +1 -1
  50. package/dist/components/GrAvatar/index.js +3 -3
  51. package/dist/components/GrBadge/chunks/{GrBadge-B1tgqfGQ.js → GrBadge-u2ZdS7CN.js} +1 -1
  52. package/dist/components/GrBadge/chunks/{GrBadge-B1tgqfGQ.js.map → GrBadge-u2ZdS7CN.js.map} +1 -1
  53. package/dist/components/GrBadge/index.js +1 -1
  54. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-C-E9betg.js → GrBadgeWrap-DDoFQscR.js} +1 -1
  55. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-C-E9betg.js.map → GrBadgeWrap-DDoFQscR.js.map} +1 -1
  56. package/dist/components/GrBadgeWrap/index.js +3 -3
  57. package/dist/components/GrBottomNav/chunks/{GrBottomNav-9GH7Dd9E.js → GrBottomNav-JUu4ylYv.js} +2 -2
  58. package/dist/components/GrBottomNav/chunks/{GrBottomNav-9GH7Dd9E.js.map → GrBottomNav-JUu4ylYv.js.map} +1 -1
  59. package/dist/components/GrBottomNav/index.js +3 -3
  60. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DS_-PBVt.js → GrBreadcrumbs-CQ44iU2o.js} +2 -2
  61. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DS_-PBVt.js.map → GrBreadcrumbs-CQ44iU2o.js.map} +1 -1
  62. package/dist/components/GrBreadcrumbs/index.js +1 -1
  63. package/dist/components/GrButton/chunks/{GrButton-D0m_z0XW.js → GrButton-Bw2AH4uX.js} +1 -1
  64. package/dist/components/GrButton/chunks/{GrButton-D0m_z0XW.js.map → GrButton-Bw2AH4uX.js.map} +1 -1
  65. package/dist/components/GrButton/index.js +2 -3
  66. package/dist/components/GrCard/chunks/{GrCard-DOrGHf2x.js → GrCard-DfIZOP5N.js} +1 -1
  67. package/dist/components/GrCard/chunks/{GrCard-DOrGHf2x.js.map → GrCard-DfIZOP5N.js.map} +1 -1
  68. package/dist/components/GrCard/index.js +1 -1
  69. package/dist/components/GrCheckbox/chunks/{GrCheckbox-BLOp8452.js → GrCheckbox-CEcHIsXM.js} +1 -1
  70. package/dist/components/GrCheckbox/chunks/{GrCheckbox-BLOp8452.js.map → GrCheckbox-CEcHIsXM.js.map} +1 -1
  71. package/dist/components/GrCheckbox/index.js +2 -2
  72. package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-CXTx2Z5H.js → GrCheckboxGroup-BOwrVcFr.js} +2 -2
  73. package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-CXTx2Z5H.js.map → GrCheckboxGroup-BOwrVcFr.js.map} +1 -1
  74. package/dist/components/GrCheckboxGroup/index.js +1 -1
  75. package/dist/components/GrCollapse/chunks/{GrCollapse-Kk0DE8tb.js → GrCollapse-KFcrji1L.js} +4 -18
  76. package/dist/components/GrCollapse/chunks/{GrCollapse-Kk0DE8tb.js.map → GrCollapse-KFcrji1L.js.map} +1 -1
  77. package/dist/components/GrCollapse/index.js +2 -2
  78. package/dist/components/GrColorPicker/chunks/{GrColorPicker-CkBTzkqn.js → GrColorPicker-qQdoEPHF.js} +5 -5
  79. package/dist/components/GrColorPicker/chunks/{GrColorPicker-CkBTzkqn.js.map → GrColorPicker-qQdoEPHF.js.map} +1 -1
  80. package/dist/components/GrColorPicker/index.js +2 -2
  81. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BugTlGdj.js → GrCommandPalette-BFcMf4Pn.js} +4 -4
  82. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BugTlGdj.js.map → GrCommandPalette-BFcMf4Pn.js.map} +1 -1
  83. package/dist/components/GrCommandPalette/index.js +2 -2
  84. package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-BA6JO7V6.js → GrConfigProvider-UP-EaoAf.js} +1 -1
  85. package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-BA6JO7V6.js.map → GrConfigProvider-UP-EaoAf.js.map} +1 -1
  86. package/dist/components/GrConfigProvider/index.js +3 -3
  87. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Ds5T0GiR.js → GrConfirmDialog-rRtMScJX.js} +4 -4
  88. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Ds5T0GiR.js.map → GrConfirmDialog-rRtMScJX.js.map} +1 -1
  89. package/dist/components/GrConfirmDialog/index.js +1 -1
  90. package/dist/components/GrDataTable/chunks/{GrDataTable-CYe2A2WA.js → GrDataTable-CNvZg2HZ.js} +5 -5
  91. package/dist/components/GrDataTable/chunks/{GrDataTable-CYe2A2WA.js.map → GrDataTable-CNvZg2HZ.js.map} +1 -1
  92. package/dist/components/GrDataTable/index.js +2 -2
  93. package/dist/components/GrDialog/chunks/{GrDialog-C3tYaA8v.js → GrDialog-D0U5iRqV.js} +3 -3
  94. package/dist/components/GrDialog/chunks/{GrDialog-C3tYaA8v.js.map → GrDialog-D0U5iRqV.js.map} +1 -1
  95. package/dist/components/GrDialog/index.js +2 -3
  96. package/dist/components/GrDialogService/chunks/{GrDialogService-CTBiiJDI.js → GrDialogService-CrwA4aJq.js} +6 -6
  97. package/dist/components/GrDialogService/chunks/GrDialogService-CrwA4aJq.js.map +1 -0
  98. package/dist/components/GrDialogService/index.js +2 -2
  99. package/dist/components/GrDivider/chunks/{GrDivider-xxq1_fIl.js → GrDivider-CAhm9jbE.js} +2 -2
  100. package/dist/components/GrDivider/chunks/{GrDivider-xxq1_fIl.js.map → GrDivider-CAhm9jbE.js.map} +1 -1
  101. package/dist/components/GrDivider/index.js +2 -2
  102. package/dist/components/GrDrawer/chunks/{GrDrawer-BSSuiNHU.js → GrDrawer-C3zAg2tG.js} +5 -5
  103. package/dist/components/GrDrawer/chunks/{GrDrawer-BSSuiNHU.js.map → GrDrawer-C3zAg2tG.js.map} +1 -1
  104. package/dist/components/GrDrawer/index.js +2 -2
  105. package/dist/components/GrDropdown/chunks/{GrDropdown-Bh6UK2M5.js → GrDropdown-BSfFOcDx.js} +2 -2
  106. package/dist/components/GrDropdown/chunks/{GrDropdown-Bh6UK2M5.js.map → GrDropdown-BSfFOcDx.js.map} +1 -1
  107. package/dist/components/GrDropdown/index.js +1 -1
  108. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-LyfEFUbg.js → GrDropdownMenu-LOaFSCyd.js} +3 -3
  109. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-LyfEFUbg.js.map → GrDropdownMenu-LOaFSCyd.js.map} +1 -1
  110. package/dist/components/GrDropdownMenu/index.js +3 -3
  111. package/dist/components/GrEmptyState/chunks/{GrEmptyState-W7Irx3vc.js → GrEmptyState-CS9do8eM.js} +3 -3
  112. package/dist/components/GrEmptyState/chunks/{GrEmptyState-W7Irx3vc.js.map → GrEmptyState-CS9do8eM.js.map} +1 -1
  113. package/dist/components/GrEmptyState/index.js +3 -3
  114. package/dist/components/GrFileUpload/chunks/{GrFileUpload-DuDzC43S.js → GrFileUpload-D3-vC-ap.js} +4 -4
  115. package/dist/components/GrFileUpload/chunks/{GrFileUpload-DuDzC43S.js.map → GrFileUpload-D3-vC-ap.js.map} +1 -1
  116. package/dist/components/GrFileUpload/index.js +3 -3
  117. package/dist/components/GrForm/chunks/{GrForm-BCHCfIMv.js → GrForm-DdJw23Pz.js} +1 -1
  118. package/dist/components/GrForm/chunks/{GrForm-BCHCfIMv.js.map → GrForm-DdJw23Pz.js.map} +1 -1
  119. package/dist/components/GrForm/index.js +4 -4
  120. package/dist/components/GrFormField/chunks/{GrFormField-CL5rcgj6.js → GrFormField-kqfVY30N.js} +1 -1
  121. package/dist/components/GrFormField/chunks/{GrFormField-CL5rcgj6.js.map → GrFormField-kqfVY30N.js.map} +1 -1
  122. package/dist/components/GrFormField/index.js +3 -3
  123. package/dist/components/GrFormFile/chunks/{GrFormFile-BikSD7bg.js → GrFormFile-D722xHn8.js} +3 -3
  124. package/dist/components/GrFormFile/chunks/{GrFormFile-BikSD7bg.js.map → GrFormFile-D722xHn8.js.map} +1 -1
  125. package/dist/components/GrFormFile/index.js +1 -1
  126. package/dist/components/GrFormSection/chunks/{GrFormSection-BEh5n4jF.js → GrFormSection-CdGWvzXO.js} +2 -2
  127. package/dist/components/GrFormSection/chunks/{GrFormSection-BEh5n4jF.js.map → GrFormSection-CdGWvzXO.js.map} +1 -1
  128. package/dist/components/GrFormSection/index.js +3 -3
  129. package/dist/components/GrIcon/chunks/{GrIcon-BvA2ZGXP.js → GrIcon-bQwtZtYT.js} +1 -1
  130. package/dist/components/GrIcon/chunks/{GrIcon-BvA2ZGXP.js.map → GrIcon-bQwtZtYT.js.map} +1 -1
  131. package/dist/components/GrIcon/index.js +1 -1
  132. package/dist/components/GrImageViewer/chunks/{GrImageViewer-DfD4euH5.js → GrImageViewer-CMO10TS7.js} +2 -2
  133. package/dist/components/GrImageViewer/chunks/{GrImageViewer-DfD4euH5.js.map → GrImageViewer-CMO10TS7.js.map} +1 -1
  134. package/dist/components/GrImageViewer/index.js +1 -1
  135. package/dist/components/GrInput/chunks/{GrInput-2wd7Crs0.js → GrInput-Bb_pxqpT.js} +1 -1
  136. package/dist/components/GrInput/chunks/{GrInput-2wd7Crs0.js.map → GrInput-Bb_pxqpT.js.map} +1 -1
  137. package/dist/components/GrInput/index.js +1 -1
  138. package/dist/components/GrInputTag/chunks/{GrInputTag-CyV2eY7Z.js → GrInputTag-Dghhg03-.js} +3 -3
  139. package/dist/components/GrInputTag/chunks/{GrInputTag-CyV2eY7Z.js.map → GrInputTag-Dghhg03-.js.map} +1 -1
  140. package/dist/components/GrInputTag/index.js +1 -1
  141. package/dist/components/GrKbd/chunks/{GrKbd-DU2lBkRV.js → GrKbd-BXbhsH0M.js} +1 -1
  142. package/dist/components/GrKbd/chunks/{GrKbd-DU2lBkRV.js.map → GrKbd-BXbhsH0M.js.map} +1 -1
  143. package/dist/components/GrKbd/index.js +1 -1
  144. package/dist/components/GrLink/chunks/{GrLink-D-cgUMXW.js → GrLink-BQb7U4so.js} +2 -2
  145. package/dist/components/GrLink/chunks/{GrLink-D-cgUMXW.js.map → GrLink-BQb7U4so.js.map} +1 -1
  146. package/dist/components/GrLink/index.js +1 -1
  147. package/dist/components/GrList/chunks/{GrList-4YU1NZtM.js → GrList-CHibO0xA.js} +2 -2
  148. package/dist/components/GrList/chunks/{GrList-4YU1NZtM.js.map → GrList-CHibO0xA.js.map} +1 -1
  149. package/dist/components/GrList/index.js +1 -1
  150. package/dist/components/GrLoading/chunks/{GrLoading-CH95CFzS.js → GrLoading-C3DZSSuh.js} +1 -1
  151. package/dist/components/GrLoading/chunks/{GrLoading-CH95CFzS.js.map → GrLoading-C3DZSSuh.js.map} +1 -1
  152. package/dist/components/GrLoading/index.js +1 -1
  153. package/dist/components/GrModal/chunks/{GrModal-CbMMr6W1.js → GrModal-CPz7SWD_.js} +2 -2
  154. package/dist/components/GrModal/chunks/{GrModal-CbMMr6W1.js.map → GrModal-CPz7SWD_.js.map} +1 -1
  155. package/dist/components/GrModal/index.js +1 -1
  156. package/dist/components/GrNavbar/chunks/{GrNavbar-CF0KbM_6.js → GrNavbar-DWaaoV7n.js} +2 -2
  157. package/dist/components/GrNavbar/chunks/{GrNavbar-CF0KbM_6.js.map → GrNavbar-DWaaoV7n.js.map} +1 -1
  158. package/dist/components/GrNavbar/index.js +1 -1
  159. package/dist/components/GrNumberInput/chunks/{GrNumberInput-B5CHZDBj.js → GrNumberInput-BotnzW77.js} +2 -2
  160. package/dist/components/GrNumberInput/chunks/{GrNumberInput-B5CHZDBj.js.map → GrNumberInput-BotnzW77.js.map} +1 -1
  161. package/dist/components/GrNumberInput/index.js +1 -1
  162. package/dist/components/GrPagination/chunks/{GrPagination-BM4FrD6Q.js → GrPagination-GtGtSMJG.js} +3 -3
  163. package/dist/components/GrPagination/chunks/{GrPagination-BM4FrD6Q.js.map → GrPagination-GtGtSMJG.js.map} +1 -1
  164. package/dist/components/GrPagination/index.js +1 -1
  165. package/dist/components/GrPopover/chunks/{GrPopover-DMH4Jjst.js → GrPopover-b70bIlQ9.js} +2 -2
  166. package/dist/components/GrPopover/chunks/{GrPopover-DMH4Jjst.js.map → GrPopover-b70bIlQ9.js.map} +1 -1
  167. package/dist/components/GrPopover/index.js +1 -1
  168. package/dist/components/GrProgressBar/chunks/{GrProgressBar-xwbNM9QB.js → GrProgressBar-hszUOC8f.js} +1 -1
  169. package/dist/components/GrProgressBar/chunks/{GrProgressBar-xwbNM9QB.js.map → GrProgressBar-hszUOC8f.js.map} +1 -1
  170. package/dist/components/GrProgressBar/index.js +1 -1
  171. package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-B8olXRo5.js → GrProgressCircle-BeUx1g1f.js} +3 -11
  172. package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-B8olXRo5.js.map → GrProgressCircle-BeUx1g1f.js.map} +1 -1
  173. package/dist/components/GrProgressCircle/index.js +2 -2
  174. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Pwr9NPxK.js → GrPromptDialog-CEI8bf-t.js} +8 -8
  175. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Pwr9NPxK.js.map → GrPromptDialog-CEI8bf-t.js.map} +1 -1
  176. package/dist/components/GrPromptDialog/index.js +1 -1
  177. package/dist/components/GrRadio/chunks/{GrRadio-DWiRaMzt.js → GrRadio-BdhknbO8.js} +2 -2
  178. package/dist/components/GrRadio/chunks/{GrRadio-DWiRaMzt.js.map → GrRadio-BdhknbO8.js.map} +1 -1
  179. package/dist/components/GrRadio/index.js +3 -3
  180. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-DIuBw0wk.js → GrRadioGroup-BVmjKXcv.js} +2 -2
  181. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BVmjKXcv.js.map +1 -0
  182. package/dist/components/GrRadioGroup/index.js +1 -1
  183. package/dist/components/GrRating/chunks/{GrRating-DVFH3lYu.js → GrRating-BSEtaibx.js} +1 -1
  184. package/dist/components/GrRating/chunks/{GrRating-DVFH3lYu.js.map → GrRating-BSEtaibx.js.map} +1 -1
  185. package/dist/components/GrRating/index.js +1 -1
  186. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C7W9mgYN.js → GrResponseErrorBanner-CZONq8uT.js} +3 -3
  187. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C7W9mgYN.js.map → GrResponseErrorBanner-CZONq8uT.js.map} +1 -1
  188. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DhX4jjay.js → GrResponseErrorBanner-CgfAwlg3.js} +1 -1
  189. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DhX4jjay.js.map → GrResponseErrorBanner-CgfAwlg3.js.map} +1 -1
  190. package/dist/components/GrResponseErrorBanner/index.js +3 -3
  191. package/dist/components/GrSegmented/chunks/{GrSegmented-CQw3ijqa.js → GrSegmented-DP9WMAbm.js} +2 -2
  192. package/dist/components/GrSegmented/chunks/{GrSegmented-CQw3ijqa.js.map → GrSegmented-DP9WMAbm.js.map} +1 -1
  193. package/dist/components/GrSegmented/index.js +3 -3
  194. package/dist/components/GrSelect/chunks/{GrSelect-B-Voni7D.js → GrSelect-CaGuyvtb.js} +5 -7
  195. package/dist/components/GrSelect/chunks/GrSelect-CaGuyvtb.js.map +1 -0
  196. package/dist/components/GrSelect/index.js +1 -1
  197. package/dist/components/GrSelect/styles.css +1 -1
  198. package/dist/components/GrSidebar/chunks/{GrSidebar-i7AxjhY_.js → GrSidebar-DG_t4aPE.js} +3 -3
  199. package/dist/components/GrSidebar/chunks/{GrSidebar-i7AxjhY_.js.map → GrSidebar-DG_t4aPE.js.map} +1 -1
  200. package/dist/components/GrSidebar/index.js +3 -3
  201. package/dist/components/GrSkeleton/chunks/{GrSkeleton-DEvNE3bC.js → GrSkeleton-CgfXxPQ2.js} +1 -7
  202. package/dist/components/GrSkeleton/chunks/{GrSkeleton-DEvNE3bC.js.map → GrSkeleton-CgfXxPQ2.js.map} +1 -1
  203. package/dist/components/GrSkeleton/index.js +3 -3
  204. package/dist/components/GrSlider/chunks/{GrSlider-CyhVsNKn.js → GrSlider-s99yAyz6.js} +1 -1
  205. package/dist/components/GrSlider/chunks/{GrSlider-CyhVsNKn.js.map → GrSlider-s99yAyz6.js.map} +1 -1
  206. package/dist/components/GrSlider/index.js +1 -1
  207. package/dist/components/GrSortableList/chunks/{GrSortableList-XB7mXM1W.js → GrSortableList-DJFPdUVv.js} +2 -2
  208. package/dist/components/GrSortableList/chunks/{GrSortableList-XB7mXM1W.js.map → GrSortableList-DJFPdUVv.js.map} +1 -1
  209. package/dist/components/GrSortableList/index.js +2 -2
  210. package/dist/components/GrSplitter/chunks/{GrSplitter-BzxVQwbY.js → GrSplitter-B9_JrT7q.js} +3 -12
  211. package/dist/components/GrSplitter/chunks/{GrSplitter-BzxVQwbY.js.map → GrSplitter-B9_JrT7q.js.map} +1 -1
  212. package/dist/components/GrSplitter/index.js +3 -3
  213. package/dist/components/GrStatistic/chunks/{GrStatistic-DOsM6s5V.js → GrStatistic-C3VpykHo.js} +2 -2
  214. package/dist/components/GrStatistic/chunks/{GrStatistic-DOsM6s5V.js.map → GrStatistic-C3VpykHo.js.map} +1 -1
  215. package/dist/components/GrStatistic/index.js +1 -1
  216. package/dist/components/GrSwitch/chunks/{GrSwitch-DpyvVrZG.js → GrSwitch-x_vQQ6ao.js} +1 -1
  217. package/dist/components/GrSwitch/chunks/{GrSwitch-DpyvVrZG.js.map → GrSwitch-x_vQQ6ao.js.map} +1 -1
  218. package/dist/components/GrSwitch/index.js +1 -1
  219. package/dist/components/GrTabPanels/chunks/{GrTabPanels-BVe1CZdJ.js → GrTabPanels-AJt1w1XC.js} +1 -1
  220. package/dist/components/GrTabPanels/chunks/{GrTabPanels-BVe1CZdJ.js.map → GrTabPanels-AJt1w1XC.js.map} +1 -1
  221. package/dist/components/GrTabPanels/index.js +3 -3
  222. package/dist/components/GrTable/chunks/{GrTable-BfqgwETQ.js → GrTable-f3qCWa99.js} +2 -2
  223. package/dist/components/GrTable/chunks/{GrTable-BfqgwETQ.js.map → GrTable-f3qCWa99.js.map} +1 -1
  224. package/dist/components/GrTable/index.js +2 -2
  225. package/dist/components/GrTabs/chunks/{GrTabs-f3-oQenu.js → GrTabs-CBHZkOFY.js} +2 -2
  226. package/dist/components/GrTabs/chunks/{GrTabs-f3-oQenu.js.map → GrTabs-CBHZkOFY.js.map} +1 -1
  227. package/dist/components/GrTabs/index.js +3 -3
  228. package/dist/components/GrTextarea/chunks/{GrTextarea-DSvd1nSy.js → GrTextarea-CNnkcIG1.js} +1 -1
  229. package/dist/components/GrTextarea/chunks/{GrTextarea-DSvd1nSy.js.map → GrTextarea-CNnkcIG1.js.map} +1 -1
  230. package/dist/components/GrTextarea/index.js +1 -1
  231. package/dist/components/GrTimeline/chunks/{GrTimeline-B-h2Yanw.js → GrTimeline-DlTraRn5.js} +4 -15
  232. package/dist/components/GrTimeline/chunks/{GrTimeline-B-h2Yanw.js.map → GrTimeline-DlTraRn5.js.map} +1 -1
  233. package/dist/components/GrTimeline/index.js +3 -3
  234. package/dist/components/GrToaster/chunks/{GrToaster-Dqja0Lf9.js → GrToaster-Db2NgrXu.js} +4 -4
  235. package/dist/components/GrToaster/chunks/{GrToaster-Dqja0Lf9.js.map → GrToaster-Db2NgrXu.js.map} +1 -1
  236. package/dist/components/GrToaster/index.js +1 -1
  237. package/dist/components/GrTooltip/chunks/{GrTooltip-Cn08heWz.js → GrTooltip-B6AwE_UX.js} +3 -3
  238. package/dist/components/GrTooltip/chunks/{GrTooltip-Cn08heWz.js.map → GrTooltip-B6AwE_UX.js.map} +1 -1
  239. package/dist/components/GrTooltip/index.js +1 -1
  240. package/dist/components/GrTree/chunks/{GrTree-BR9a2pay.js → GrTree-BvOeQ3xJ.js} +1 -1
  241. package/dist/components/GrTree/chunks/{GrTree-BR9a2pay.js.map → GrTree-BvOeQ3xJ.js.map} +1 -1
  242. package/dist/components/GrTree/index.js +2 -2
  243. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect--muUeB0v.js → GrTreeSelect-_LjTRR7X.js} +5 -9
  244. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-_LjTRR7X.js.map +1 -0
  245. package/dist/components/GrTreeSelect/index.js +1 -1
  246. package/dist/composables/useGrComponentConfig.js +1 -1
  247. package/dist/composables/usePortalTarget.js +1 -1
  248. package/dist/directives/loading.js +1 -1
  249. package/dist/granular-provider-node.js +1 -1
  250. package/dist/granular-provider.js +1 -1
  251. package/dist/index.js +95 -96
  252. package/dist/testing.js +33 -2
  253. package/dist/testing.js.map +1 -1
  254. package/dist/types/{src/components → components}/GrAlert/index.d.ts +0 -1
  255. package/dist/types/{src/components → components}/GrAvatar/index.d.ts +0 -1
  256. package/dist/types/{src/components → components}/GrBadgeWrap/index.d.ts +1 -1
  257. package/dist/types/{src/components → components}/GrBottomNav/index.d.ts +0 -1
  258. package/dist/types/{src/components → components}/GrButton/index.d.ts +0 -1
  259. package/dist/types/{src/components → components}/GrCheckbox/index.d.ts +0 -1
  260. package/dist/types/{src/components → components}/GrCollapse/index.d.ts +0 -1
  261. package/dist/types/{src/components → components}/GrColorPicker/index.d.ts +1 -1
  262. package/dist/types/{src/components → components}/GrCommandPalette/index.d.ts +0 -1
  263. package/dist/types/{src/components → components}/GrConfigProvider/index.d.ts +1 -1
  264. package/dist/types/{src/components → components}/GrDataTable/index.d.ts +0 -1
  265. package/dist/types/{src/components → components}/GrDialog/index.d.ts +1 -1
  266. package/dist/types/{src/components → components}/GrDialogService/index.d.ts +1 -1
  267. package/dist/types/{src/components → components}/GrDropdownMenu/index.d.ts +0 -1
  268. package/dist/types/{src/components → components}/GrEmptyState/index.d.ts +0 -1
  269. package/dist/types/{src/components → components}/GrFileUpload/index.d.ts +2 -3
  270. package/dist/types/{src/components → components}/GrForm/index.d.ts +2 -2
  271. package/dist/types/{src/components → components}/GrFormField/index.d.ts +1 -1
  272. package/dist/types/{src/components → components}/GrFormSection/index.d.ts +0 -1
  273. package/dist/types/{src/components → components}/GrProgressCircle/index.d.ts +0 -1
  274. package/dist/types/{src/components → components}/GrRadio/index.d.ts +0 -1
  275. package/dist/types/{src/components → components}/GrResponseErrorBanner/index.d.ts +2 -3
  276. package/dist/types/{src/components → components}/GrSegmented/index.d.ts +1 -1
  277. package/dist/types/{src/components → components}/GrSelect/GrSelect.vue.d.ts +0 -6
  278. package/dist/types/{src/components → components}/GrSidebar/index.d.ts +0 -1
  279. package/dist/types/{src/components → components}/GrSkeleton/index.d.ts +1 -1
  280. package/dist/types/{src/components → components}/GrSplitter/index.d.ts +1 -1
  281. package/dist/types/{src/components → components}/GrTabPanels/index.d.ts +0 -1
  282. package/dist/types/{src/components → components}/GrTabs/index.d.ts +0 -1
  283. package/dist/types/{src/components → components}/GrTimeline/index.d.ts +0 -2
  284. package/dist/types/{src/components → components}/GrTreeSelect/GrTreeSelect.vue.d.ts +0 -6
  285. package/dist/types/{src/testing → testing}/index.d.ts +1 -0
  286. package/dist/types/testing/keyboard.d.ts +32 -0
  287. package/dist/web-types.json +1 -9
  288. package/package.json +109 -106
  289. package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
  290. package/dist/chunks/config-BE6n20np2.js.map +0 -1
  291. package/dist/chunks/config-BKvX0q102.js.map +0 -1
  292. package/dist/chunks/config-BqFjr3tN.js.map +0 -1
  293. package/dist/chunks/config-CDat1wXf2.js.map +0 -1
  294. package/dist/chunks/config-COpuWGr_.js.map +0 -1
  295. package/dist/chunks/config-CY0_6cMi2.js.map +0 -1
  296. package/dist/chunks/config-D94Z9po52.js.map +0 -1
  297. package/dist/chunks/config-DAX8Deh1.js.map +0 -1
  298. package/dist/chunks/config-WTNhdh6T2.js.map +0 -1
  299. package/dist/chunks/config-_qPUfb6-2.js.map +0 -1
  300. package/dist/chunks/config-eXB87DOi.js.map +0 -1
  301. package/dist/components/GrDialogService/chunks/GrDialogService-CTBiiJDI.js.map +0 -1
  302. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-DIuBw0wk.js.map +0 -1
  303. package/dist/components/GrSelect/chunks/GrSelect-B-Voni7D.js.map +0 -1
  304. package/dist/components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js.map +0 -1
  305. /package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
  306. /package/dist/chunks/{config-BE6n20np2.js → config-BE6n20np.js} +0 -0
  307. /package/dist/chunks/{config-BKvX0q102.js → config-BKvX0q10.js} +0 -0
  308. /package/dist/chunks/{config-CDat1wXf2.js → config-CDat1wXf.js} +0 -0
  309. /package/dist/chunks/{config-COpuWGr_.js → config-COpuWGr_2.js} +0 -0
  310. /package/dist/chunks/{config-CY0_6cMi2.js → config-CY0_6cMi.js} +0 -0
  311. /package/dist/chunks/{config-D94Z9po52.js → config-D94Z9po5.js} +0 -0
  312. /package/dist/chunks/{config-DAX8Deh1.js → config-DAX8Deh12.js} +0 -0
  313. /package/dist/chunks/{config-WTNhdh6T2.js → config-WTNhdh6T.js} +0 -0
  314. /package/dist/chunks/{config-eXB87DOi.js → config-eXB87DOi2.js} +0 -0
  315. /package/dist/types/{src/components → components}/GrAlert/GrAlert.vue.d.ts +0 -0
  316. /package/dist/types/{src/components → components}/GrAlert/config.d.ts +0 -0
  317. /package/dist/types/{src/components → components}/GrAlert/defaults.d.ts +0 -0
  318. /package/dist/types/{src/components → components}/GrAlert/grAlertStyles.d.ts +0 -0
  319. /package/dist/types/{src/components → components}/GrAutocomplete/GrAutocomplete.vue.d.ts +0 -0
  320. /package/dist/types/{src/components → components}/GrAutocomplete/config.d.ts +0 -0
  321. /package/dist/types/{src/components → components}/GrAutocomplete/defaults.d.ts +0 -0
  322. /package/dist/types/{src/components → components}/GrAutocomplete/grAutocompleteStyles.d.ts +0 -0
  323. /package/dist/types/{src/components → components}/GrAutocomplete/index.d.ts +0 -0
  324. /package/dist/types/{src/components → components}/GrAutocomplete/safelist.d.ts +0 -0
  325. /package/dist/types/{src/components → components}/GrAvatar/GrAvatar.vue.d.ts +0 -0
  326. /package/dist/types/{src/components → components}/GrAvatar/GrAvatarGroup.vue.d.ts +0 -0
  327. /package/dist/types/{src/components → components}/GrAvatar/avatarContext.d.ts +0 -0
  328. /package/dist/types/{src/components → components}/GrAvatar/config.d.ts +0 -0
  329. /package/dist/types/{src/components → components}/GrAvatar/defaults.d.ts +0 -0
  330. /package/dist/types/{src/components → components}/GrAvatar/grAvatarStyles.d.ts +0 -0
  331. /package/dist/types/{src/components → components}/GrAvatar/safelist.d.ts +0 -0
  332. /package/dist/types/{src/components → components}/GrBadge/GrBadge.vue.d.ts +0 -0
  333. /package/dist/types/{src/components → components}/GrBadge/config.d.ts +0 -0
  334. /package/dist/types/{src/components → components}/GrBadge/defaults.d.ts +0 -0
  335. /package/dist/types/{src/components → components}/GrBadge/grBadgeStyles.d.ts +0 -0
  336. /package/dist/types/{src/components → components}/GrBadge/index.d.ts +0 -0
  337. /package/dist/types/{src/components → components}/GrBadge/safelist.d.ts +0 -0
  338. /package/dist/types/{src/components → components}/GrBadgeWrap/GrBadgeWrap.vue.d.ts +0 -0
  339. /package/dist/types/{src/components → components}/GrBadgeWrap/config.d.ts +0 -0
  340. /package/dist/types/{src/components → components}/GrBadgeWrap/grBadgeWrapStyles.d.ts +0 -0
  341. /package/dist/types/{src/components → components}/GrBadgeWrap/safelist.d.ts +0 -0
  342. /package/dist/types/{src/components → components}/GrBottomNav/GrBottomNav.vue.d.ts +0 -0
  343. /package/dist/types/{src/components → components}/GrBottomNav/config.d.ts +0 -0
  344. /package/dist/types/{src/components → components}/GrBottomNav/defaults.d.ts +0 -0
  345. /package/dist/types/{src/components → components}/GrBottomNav/grBottomNavStyles.d.ts +0 -0
  346. /package/dist/types/{src/components → components}/GrBottomNav/safelist.d.ts +0 -0
  347. /package/dist/types/{src/components → components}/GrBreadcrumbs/GrBreadcrumbs.vue.d.ts +0 -0
  348. /package/dist/types/{src/components → components}/GrBreadcrumbs/config.d.ts +0 -0
  349. /package/dist/types/{src/components → components}/GrBreadcrumbs/defaults.d.ts +0 -0
  350. /package/dist/types/{src/components → components}/GrBreadcrumbs/grBreadcrumbsStyles.d.ts +0 -0
  351. /package/dist/types/{src/components → components}/GrBreadcrumbs/index.d.ts +0 -0
  352. /package/dist/types/{src/components → components}/GrBreadcrumbs/safelist.d.ts +0 -0
  353. /package/dist/types/{src/components → components}/GrButton/GrButton.vue.d.ts +0 -0
  354. /package/dist/types/{src/components → components}/GrButton/config.d.ts +0 -0
  355. /package/dist/types/{src/components → components}/GrButton/defaults.d.ts +0 -0
  356. /package/dist/types/{src/components → components}/GrButton/grButtonStyles.d.ts +0 -0
  357. /package/dist/types/{src/components → components}/GrButton/safelist.d.ts +0 -0
  358. /package/dist/types/{src/components → components}/GrButtonGroup/GrButtonGroup.vue.d.ts +0 -0
  359. /package/dist/types/{src/components → components}/GrButtonGroup/config.d.ts +0 -0
  360. /package/dist/types/{src/components → components}/GrButtonGroup/context.d.ts +0 -0
  361. /package/dist/types/{src/components → components}/GrButtonGroup/index.d.ts +0 -0
  362. /package/dist/types/{src/components → components}/GrCard/GrCard.vue.d.ts +0 -0
  363. /package/dist/types/{src/components → components}/GrCard/config.d.ts +0 -0
  364. /package/dist/types/{src/components → components}/GrCard/defaults.d.ts +0 -0
  365. /package/dist/types/{src/components → components}/GrCard/grCardStyles.d.ts +0 -0
  366. /package/dist/types/{src/components → components}/GrCard/index.d.ts +0 -0
  367. /package/dist/types/{src/components → components}/GrCard/safelist.d.ts +0 -0
  368. /package/dist/types/{src/components → components}/GrCheckbox/GrCheckbox.vue.d.ts +0 -0
  369. /package/dist/types/{src/components → components}/GrCheckbox/config.d.ts +0 -0
  370. /package/dist/types/{src/components → components}/GrCheckbox/defaults.d.ts +0 -0
  371. /package/dist/types/{src/components → components}/GrCheckbox/grCheckboxGroupContext.d.ts +0 -0
  372. /package/dist/types/{src/components → components}/GrCheckbox/grCheckboxStyles.d.ts +0 -0
  373. /package/dist/types/{src/components → components}/GrCheckbox/safelist.d.ts +0 -0
  374. /package/dist/types/{src/components → components}/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts +0 -0
  375. /package/dist/types/{src/components → components}/GrCheckboxGroup/config.d.ts +0 -0
  376. /package/dist/types/{src/components → components}/GrCheckboxGroup/defaults.d.ts +0 -0
  377. /package/dist/types/{src/components → components}/GrCheckboxGroup/index.d.ts +0 -0
  378. /package/dist/types/{src/components → components}/GrCollapse/GrCollapse.vue.d.ts +0 -0
  379. /package/dist/types/{src/components → components}/GrCollapse/GrCollapseItem.vue.d.ts +0 -0
  380. /package/dist/types/{src/components → components}/GrCollapse/config.d.ts +0 -0
  381. /package/dist/types/{src/components → components}/GrCollapse/defaults.d.ts +0 -0
  382. /package/dist/types/{src/components → components}/GrCollapse/grCollapseContext.d.ts +0 -0
  383. /package/dist/types/{src/components → components}/GrCollapse/grCollapseStyles.d.ts +0 -0
  384. /package/dist/types/{src/components → components}/GrCollapse/safelist.d.ts +0 -0
  385. /package/dist/types/{src/components → components}/GrColorPicker/GrColorPicker.vue.d.ts +0 -0
  386. /package/dist/types/{src/components → components}/GrColorPicker/color.d.ts +0 -0
  387. /package/dist/types/{src/components → components}/GrColorPicker/config.d.ts +0 -0
  388. /package/dist/types/{src/components → components}/GrColorPicker/defaults.d.ts +0 -0
  389. /package/dist/types/{src/components → components}/GrColorPicker/grColorPickerStyles.d.ts +0 -0
  390. /package/dist/types/{src/components → components}/GrColorPicker/safelist.d.ts +0 -0
  391. /package/dist/types/{src/components → components}/GrCommandPalette/GrCommandPalette.vue.d.ts +0 -0
  392. /package/dist/types/{src/components → components}/GrCommandPalette/config.d.ts +0 -0
  393. /package/dist/types/{src/components → components}/GrCommandPalette/defaults.d.ts +0 -0
  394. /package/dist/types/{src/components → components}/GrCommandPalette/filtering.d.ts +0 -0
  395. /package/dist/types/{src/components → components}/GrCommandPalette/grCommandPaletteStyles.d.ts +0 -0
  396. /package/dist/types/{src/components → components}/GrCommandPalette/safelist.d.ts +0 -0
  397. /package/dist/types/{src/components → components}/GrConfigProvider/GrConfigProvider.vue.d.ts +0 -0
  398. /package/dist/types/{src/components → components}/GrConfigProvider/config.d.ts +0 -0
  399. /package/dist/types/{src/components → components}/GrConfigProvider/context.d.ts +0 -0
  400. /package/dist/types/{src/components → components}/GrConfigProvider/zIndexScale.d.ts +0 -0
  401. /package/dist/types/{src/components → components}/GrConfirmDialog/GrConfirmDialog.vue.d.ts +0 -0
  402. /package/dist/types/{src/components → components}/GrConfirmDialog/config.d.ts +0 -0
  403. /package/dist/types/{src/components → components}/GrConfirmDialog/defaults.d.ts +0 -0
  404. /package/dist/types/{src/components → components}/GrConfirmDialog/index.d.ts +0 -0
  405. /package/dist/types/{src/components → components}/GrDataTable/GrDataTable.vue.d.ts +0 -0
  406. /package/dist/types/{src/components → components}/GrDataTable/config.d.ts +0 -0
  407. /package/dist/types/{src/components → components}/GrDataTable/defaults.d.ts +0 -0
  408. /package/dist/types/{src/components → components}/GrDataTable/grDataTableSort.d.ts +0 -0
  409. /package/dist/types/{src/components → components}/GrDataTable/grDataTableStyles.d.ts +0 -0
  410. /package/dist/types/{src/components → components}/GrDataTable/safelist.d.ts +0 -0
  411. /package/dist/types/{src/components → components}/GrDialog/GrDialog.vue.d.ts +0 -0
  412. /package/dist/types/{src/components → components}/GrDialog/GrDialogCloseButton.vue.d.ts +0 -0
  413. /package/dist/types/{src/components → components}/GrDialog/GrDialogFooter.vue.d.ts +0 -0
  414. /package/dist/types/{src/components → components}/GrDialog/GrDialogHeader.vue.d.ts +0 -0
  415. /package/dist/types/{src/components → components}/GrDialog/config.d.ts +0 -0
  416. /package/dist/types/{src/components → components}/GrDialog/defaults.d.ts +0 -0
  417. /package/dist/types/{src/components → components}/GrDialog/dialogShared.d.ts +0 -0
  418. /package/dist/types/{src/components → components}/GrDialog/safelist.d.ts +0 -0
  419. /package/dist/types/{src/components → components}/GrDialogService/GrDialogServiceHost.vue.d.ts +0 -0
  420. /package/dist/types/{src/components → components}/GrDialogService/GrDialogServiceItem.vue.d.ts +0 -0
  421. /package/dist/types/{src/components → components}/GrDialogService/config.d.ts +0 -0
  422. /package/dist/types/{src/components → components}/GrDialogService/store.d.ts +0 -0
  423. /package/dist/types/{src/components → components}/GrDialogService/types.d.ts +0 -0
  424. /package/dist/types/{src/components → components}/GrDialogService/useDialogService.d.ts +0 -0
  425. /package/dist/types/{src/components → components}/GrDivider/GrDivider.vue.d.ts +0 -0
  426. /package/dist/types/{src/components → components}/GrDivider/config.d.ts +0 -0
  427. /package/dist/types/{src/components → components}/GrDivider/defaults.d.ts +0 -0
  428. /package/dist/types/{src/components → components}/GrDivider/grDividerStyles.d.ts +0 -0
  429. /package/dist/types/{src/components → components}/GrDivider/index.d.ts +0 -0
  430. /package/dist/types/{src/components → components}/GrDivider/safelist.d.ts +0 -0
  431. /package/dist/types/{src/components → components}/GrDrawer/GrDrawer.vue.d.ts +0 -0
  432. /package/dist/types/{src/components → components}/GrDrawer/config.d.ts +0 -0
  433. /package/dist/types/{src/components → components}/GrDrawer/defaults.d.ts +0 -0
  434. /package/dist/types/{src/components → components}/GrDrawer/grDrawerStyles.d.ts +0 -0
  435. /package/dist/types/{src/components → components}/GrDrawer/index.d.ts +0 -0
  436. /package/dist/types/{src/components → components}/GrDrawer/safelist.d.ts +0 -0
  437. /package/dist/types/{src/components → components}/GrDropdown/GrDropdown.vue.d.ts +0 -0
  438. /package/dist/types/{src/components → components}/GrDropdown/config.d.ts +0 -0
  439. /package/dist/types/{src/components → components}/GrDropdown/grDropdownStyles.d.ts +0 -0
  440. /package/dist/types/{src/components → components}/GrDropdown/index.d.ts +0 -0
  441. /package/dist/types/{src/components → components}/GrDropdown/safelist.d.ts +0 -0
  442. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenu.vue.d.ts +0 -0
  443. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuColumn.vue.d.ts +0 -0
  444. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuColumns.vue.d.ts +0 -0
  445. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuDivider.vue.d.ts +0 -0
  446. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuGroup.vue.d.ts +0 -0
  447. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuHeader.vue.d.ts +0 -0
  448. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +0 -0
  449. /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuList.vue.d.ts +0 -0
  450. /package/dist/types/{src/components → components}/GrDropdownMenu/config.d.ts +0 -0
  451. /package/dist/types/{src/components → components}/GrDropdownMenu/grDropdownMenuStyles.d.ts +0 -0
  452. /package/dist/types/{src/components → components}/GrDropdownMenu/menuModel.d.ts +0 -0
  453. /package/dist/types/{src/components → components}/GrDropdownMenu/safelist.d.ts +0 -0
  454. /package/dist/types/{src/components → components}/GrEmptyState/GrEmptyState.vue.d.ts +0 -0
  455. /package/dist/types/{src/components → components}/GrEmptyState/config.d.ts +0 -0
  456. /package/dist/types/{src/components → components}/GrEmptyState/defaults.d.ts +0 -0
  457. /package/dist/types/{src/components → components}/GrEmptyState/grEmptyStateStyles.d.ts +0 -0
  458. /package/dist/types/{src/components → components}/GrEmptyState/safelist.d.ts +0 -0
  459. /package/dist/types/{src/components → components}/GrFileUpload/FileValidationError.d.ts +0 -0
  460. /package/dist/types/{src/components → components}/GrFileUpload/GrFileUpload.vue.d.ts +0 -0
  461. /package/dist/types/{src/components → components}/GrFileUpload/acceptValidator.d.ts +0 -0
  462. /package/dist/types/{src/components → components}/GrFileUpload/config.d.ts +0 -0
  463. /package/dist/types/{src/components → components}/GrFileUpload/defaults.d.ts +0 -0
  464. /package/dist/types/{src/components → components}/GrFileUpload/fileEntry.d.ts +0 -0
  465. /package/dist/types/{src/components → components}/GrFileUpload/grFileUploadStyles.d.ts +0 -0
  466. /package/dist/types/{src/components → components}/GrFileUpload/matchAccept.d.ts +0 -0
  467. /package/dist/types/{src/components → components}/GrFileUpload/maxFileSize.d.ts +0 -0
  468. /package/dist/types/{src/components → components}/GrFileUpload/runFileValidators.d.ts +0 -0
  469. /package/dist/types/{src/components → components}/GrFileUpload/safelist.d.ts +0 -0
  470. /package/dist/types/{src/components → components}/GrFileUpload/types.d.ts +0 -0
  471. /package/dist/types/{src/components → components}/GrFileUpload/uploadState.d.ts +0 -0
  472. /package/dist/types/{src/components → components}/GrFileUpload/uploadViaXhr.d.ts +0 -0
  473. /package/dist/types/{src/components → components}/GrFileUpload/useDropZone.d.ts +0 -0
  474. /package/dist/types/{src/components → components}/GrFileUpload/usePerFileUpload.d.ts +0 -0
  475. /package/dist/types/{src/components → components}/GrFileUpload/useUploadState.d.ts +0 -0
  476. /package/dist/types/{src/components → components}/GrForm/GrForm.vue.d.ts +0 -0
  477. /package/dist/types/{src/components → components}/GrForm/config.d.ts +0 -0
  478. /package/dist/types/{src/components → components}/GrForm/context.d.ts +0 -0
  479. /package/dist/types/{src/components → components}/GrForm/fileRule.d.ts +0 -0
  480. /package/dist/types/{src/components → components}/GrForm/modelSnapshot.d.ts +0 -0
  481. /package/dist/types/{src/components → components}/GrForm/validation.d.ts +0 -0
  482. /package/dist/types/{src/components → components}/GrFormField/GrFormField.vue.d.ts +0 -0
  483. /package/dist/types/{src/components → components}/GrFormField/config.d.ts +0 -0
  484. /package/dist/types/{src/components → components}/GrFormField/context.d.ts +0 -0
  485. /package/dist/types/{src/components → components}/GrFormField/defaults.d.ts +0 -0
  486. /package/dist/types/{src/components → components}/GrFormField/grFormFieldStyles.d.ts +0 -0
  487. /package/dist/types/{src/components → components}/GrFormField/safelist.d.ts +0 -0
  488. /package/dist/types/{src/components → components}/GrFormFile/GrFormFile.vue.d.ts +0 -0
  489. /package/dist/types/{src/components → components}/GrFormFile/config.d.ts +0 -0
  490. /package/dist/types/{src/components → components}/GrFormFile/defaults.d.ts +0 -0
  491. /package/dist/types/{src/components → components}/GrFormFile/grFormFileStyles.d.ts +0 -0
  492. /package/dist/types/{src/components → components}/GrFormFile/index.d.ts +0 -0
  493. /package/dist/types/{src/components → components}/GrFormFile/safelist.d.ts +0 -0
  494. /package/dist/types/{src/components → components}/GrFormSection/GrFormSection.vue.d.ts +0 -0
  495. /package/dist/types/{src/components → components}/GrFormSection/config.d.ts +0 -0
  496. /package/dist/types/{src/components → components}/GrFormSection/defaults.d.ts +0 -0
  497. /package/dist/types/{src/components → components}/GrFormSection/grFormSectionStyles.d.ts +0 -0
  498. /package/dist/types/{src/components → components}/GrFormSection/safelist.d.ts +0 -0
  499. /package/dist/types/{src/components → components}/GrIcon/GrIcon.vue.d.ts +0 -0
  500. /package/dist/types/{src/components → components}/GrIcon/config.d.ts +0 -0
  501. /package/dist/types/{src/components → components}/GrIcon/defaults.d.ts +0 -0
  502. /package/dist/types/{src/components → components}/GrIcon/grIconStyles.d.ts +0 -0
  503. /package/dist/types/{src/components → components}/GrIcon/index.d.ts +0 -0
  504. /package/dist/types/{src/components → components}/GrIcon/safelist.d.ts +0 -0
  505. /package/dist/types/{src/components → components}/GrImageViewer/GrImageViewer.vue.d.ts +0 -0
  506. /package/dist/types/{src/components → components}/GrImageViewer/composables/usePointerGestures.d.ts +0 -0
  507. /package/dist/types/{src/components → components}/GrImageViewer/composables/useViewerKeyboard.d.ts +0 -0
  508. /package/dist/types/{src/components → components}/GrImageViewer/composables/useWheelGesture.d.ts +0 -0
  509. /package/dist/types/{src/components → components}/GrImageViewer/composables/useZoomPan.d.ts +0 -0
  510. /package/dist/types/{src/components → components}/GrImageViewer/config.d.ts +0 -0
  511. /package/dist/types/{src/components → components}/GrImageViewer/grImageViewerStyles.d.ts +0 -0
  512. /package/dist/types/{src/components → components}/GrImageViewer/index.d.ts +0 -0
  513. /package/dist/types/{src/components → components}/GrImageViewer/safelist.d.ts +0 -0
  514. /package/dist/types/{src/components → components}/GrInput/GrInput.vue.d.ts +0 -0
  515. /package/dist/types/{src/components → components}/GrInput/config.d.ts +0 -0
  516. /package/dist/types/{src/components → components}/GrInput/defaults.d.ts +0 -0
  517. /package/dist/types/{src/components → components}/GrInput/grInputStyles.d.ts +0 -0
  518. /package/dist/types/{src/components → components}/GrInput/index.d.ts +0 -0
  519. /package/dist/types/{src/components → components}/GrInput/safelist.d.ts +0 -0
  520. /package/dist/types/{src/components → components}/GrInputTag/GrInputTag.vue.d.ts +0 -0
  521. /package/dist/types/{src/components → components}/GrInputTag/config.d.ts +0 -0
  522. /package/dist/types/{src/components → components}/GrInputTag/defaults.d.ts +0 -0
  523. /package/dist/types/{src/components → components}/GrInputTag/grInputTagStyles.d.ts +0 -0
  524. /package/dist/types/{src/components → components}/GrInputTag/index.d.ts +0 -0
  525. /package/dist/types/{src/components → components}/GrInputTag/safelist.d.ts +0 -0
  526. /package/dist/types/{src/components → components}/GrKbd/GrKbd.vue.d.ts +0 -0
  527. /package/dist/types/{src/components → components}/GrKbd/config.d.ts +0 -0
  528. /package/dist/types/{src/components → components}/GrKbd/defaults.d.ts +0 -0
  529. /package/dist/types/{src/components → components}/GrKbd/grKbdStyles.d.ts +0 -0
  530. /package/dist/types/{src/components → components}/GrKbd/index.d.ts +0 -0
  531. /package/dist/types/{src/components → components}/GrKbd/safelist.d.ts +0 -0
  532. /package/dist/types/{src/components → components}/GrLink/GrLink.vue.d.ts +0 -0
  533. /package/dist/types/{src/components → components}/GrLink/config.d.ts +0 -0
  534. /package/dist/types/{src/components → components}/GrLink/defaults.d.ts +0 -0
  535. /package/dist/types/{src/components → components}/GrLink/grLinkStyles.d.ts +0 -0
  536. /package/dist/types/{src/components → components}/GrLink/index.d.ts +0 -0
  537. /package/dist/types/{src/components → components}/GrLink/safelist.d.ts +0 -0
  538. /package/dist/types/{src/components → components}/GrList/GrList.vue.d.ts +0 -0
  539. /package/dist/types/{src/components → components}/GrList/GrListItem.vue.d.ts +0 -0
  540. /package/dist/types/{src/components → components}/GrList/config.d.ts +0 -0
  541. /package/dist/types/{src/components → components}/GrList/grListStyles.d.ts +0 -0
  542. /package/dist/types/{src/components → components}/GrList/index.d.ts +0 -0
  543. /package/dist/types/{src/components → components}/GrList/safelist.d.ts +0 -0
  544. /package/dist/types/{src/components → components}/GrLoading/GrLoading.vue.d.ts +0 -0
  545. /package/dist/types/{src/components → components}/GrLoading/config.d.ts +0 -0
  546. /package/dist/types/{src/components → components}/GrLoading/grLoadingStyles.d.ts +0 -0
  547. /package/dist/types/{src/components → components}/GrLoading/index.d.ts +0 -0
  548. /package/dist/types/{src/components → components}/GrLoading/safelist.d.ts +0 -0
  549. /package/dist/types/{src/components → components}/GrModal/GrModal.vue.d.ts +0 -0
  550. /package/dist/types/{src/components → components}/GrModal/config.d.ts +0 -0
  551. /package/dist/types/{src/components → components}/GrModal/context.d.ts +0 -0
  552. /package/dist/types/{src/components → components}/GrModal/defaults.d.ts +0 -0
  553. /package/dist/types/{src/components → components}/GrModal/grModalStyles.d.ts +0 -0
  554. /package/dist/types/{src/components → components}/GrModal/index.d.ts +0 -0
  555. /package/dist/types/{src/components → components}/GrModal/safelist.d.ts +0 -0
  556. /package/dist/types/{src/components → components}/GrNavbar/GrNavbar.vue.d.ts +0 -0
  557. /package/dist/types/{src/components → components}/GrNavbar/config.d.ts +0 -0
  558. /package/dist/types/{src/components → components}/GrNavbar/grNavbarStyles.d.ts +0 -0
  559. /package/dist/types/{src/components → components}/GrNavbar/index.d.ts +0 -0
  560. /package/dist/types/{src/components → components}/GrNavbar/safelist.d.ts +0 -0
  561. /package/dist/types/{src/components → components}/GrNumberInput/GrNumberInput.vue.d.ts +0 -0
  562. /package/dist/types/{src/components → components}/GrNumberInput/config.d.ts +0 -0
  563. /package/dist/types/{src/components → components}/GrNumberInput/defaults.d.ts +0 -0
  564. /package/dist/types/{src/components → components}/GrNumberInput/grNumberInputStyles.d.ts +0 -0
  565. /package/dist/types/{src/components → components}/GrNumberInput/index.d.ts +0 -0
  566. /package/dist/types/{src/components → components}/GrNumberInput/numberInputMath.d.ts +0 -0
  567. /package/dist/types/{src/components → components}/GrNumberInput/safelist.d.ts +0 -0
  568. /package/dist/types/{src/components → components}/GrPagination/GrPagination.vue.d.ts +0 -0
  569. /package/dist/types/{src/components → components}/GrPagination/config.d.ts +0 -0
  570. /package/dist/types/{src/components → components}/GrPagination/defaults.d.ts +0 -0
  571. /package/dist/types/{src/components → components}/GrPagination/grPaginationStyles.d.ts +0 -0
  572. /package/dist/types/{src/components → components}/GrPagination/index.d.ts +0 -0
  573. /package/dist/types/{src/components → components}/GrPagination/safelist.d.ts +0 -0
  574. /package/dist/types/{src/components → components}/GrPopover/GrPopover.vue.d.ts +0 -0
  575. /package/dist/types/{src/components → components}/GrPopover/config.d.ts +0 -0
  576. /package/dist/types/{src/components → components}/GrPopover/defaults.d.ts +0 -0
  577. /package/dist/types/{src/components → components}/GrPopover/grPopoverStyles.d.ts +0 -0
  578. /package/dist/types/{src/components → components}/GrPopover/index.d.ts +0 -0
  579. /package/dist/types/{src/components → components}/GrPopover/safelist.d.ts +0 -0
  580. /package/dist/types/{src/components → components}/GrProgressBar/GrProgressBar.vue.d.ts +0 -0
  581. /package/dist/types/{src/components → components}/GrProgressBar/config.d.ts +0 -0
  582. /package/dist/types/{src/components → components}/GrProgressBar/defaults.d.ts +0 -0
  583. /package/dist/types/{src/components → components}/GrProgressBar/grStyle.d.ts +0 -0
  584. /package/dist/types/{src/components → components}/GrProgressBar/index.d.ts +0 -0
  585. /package/dist/types/{src/components → components}/GrProgressBar/safelist.d.ts +0 -0
  586. /package/dist/types/{src/components → components}/GrProgressCircle/GrProgressCircle.vue.d.ts +0 -0
  587. /package/dist/types/{src/components → components}/GrProgressCircle/config.d.ts +0 -0
  588. /package/dist/types/{src/components → components}/GrProgressCircle/defaults.d.ts +0 -0
  589. /package/dist/types/{src/components → components}/GrProgressCircle/geometry.d.ts +0 -0
  590. /package/dist/types/{src/components → components}/GrProgressCircle/grProgressCircleStyles.d.ts +0 -0
  591. /package/dist/types/{src/components → components}/GrProgressCircle/safelist.d.ts +0 -0
  592. /package/dist/types/{src/components → components}/GrPromptDialog/GrPromptDialog.vue.d.ts +0 -0
  593. /package/dist/types/{src/components → components}/GrPromptDialog/config.d.ts +0 -0
  594. /package/dist/types/{src/components → components}/GrPromptDialog/defaults.d.ts +0 -0
  595. /package/dist/types/{src/components → components}/GrPromptDialog/index.d.ts +0 -0
  596. /package/dist/types/{src/components → components}/GrRadio/GrRadio.vue.d.ts +0 -0
  597. /package/dist/types/{src/components → components}/GrRadio/config.d.ts +0 -0
  598. /package/dist/types/{src/components → components}/GrRadio/defaults.d.ts +0 -0
  599. /package/dist/types/{src/components → components}/GrRadio/grRadioGroupContext.d.ts +0 -0
  600. /package/dist/types/{src/components → components}/GrRadio/grRadioStyles.d.ts +0 -0
  601. /package/dist/types/{src/components → components}/GrRadio/safelist.d.ts +0 -0
  602. /package/dist/types/{src/components → components}/GrRadioGroup/GrRadioGroup.vue.d.ts +0 -0
  603. /package/dist/types/{src/components → components}/GrRadioGroup/config.d.ts +0 -0
  604. /package/dist/types/{src/components → components}/GrRadioGroup/defaults.d.ts +0 -0
  605. /package/dist/types/{src/components → components}/GrRadioGroup/index.d.ts +0 -0
  606. /package/dist/types/{src/components → components}/GrRating/GrRating.vue.d.ts +0 -0
  607. /package/dist/types/{src/components → components}/GrRating/config.d.ts +0 -0
  608. /package/dist/types/{src/components → components}/GrRating/defaults.d.ts +0 -0
  609. /package/dist/types/{src/components → components}/GrRating/grRatingStyles.d.ts +0 -0
  610. /package/dist/types/{src/components → components}/GrRating/index.d.ts +0 -0
  611. /package/dist/types/{src/components → components}/GrRating/safelist.d.ts +0 -0
  612. /package/dist/types/{src/components → components}/GrResponseErrorBanner/GrFormErrorBanner.vue.d.ts +0 -0
  613. /package/dist/types/{src/components → components}/GrResponseErrorBanner/GrResponseErrorBanner.vue.d.ts +0 -0
  614. /package/dist/types/{src/components → components}/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +0 -0
  615. /package/dist/types/{src/components → components}/GrResponseErrorBanner/config.d.ts +0 -0
  616. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/abortErrorParser.d.ts +0 -0
  617. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/createResponseErrorClassifier.d.ts +0 -0
  618. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/fileValidationParser.d.ts +0 -0
  619. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/httpStatusParser.d.ts +0 -0
  620. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/index.d.ts +0 -0
  621. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/jsonApiErrorParser.d.ts +0 -0
  622. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/laravelValidationParser.d.ts +0 -0
  623. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/networkErrorParser.d.ts +0 -0
  624. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/normalizeError.d.ts +0 -0
  625. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/plainMessageParser.d.ts +0 -0
  626. /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/problemDetailsParser.d.ts +0 -0
  627. /package/dist/types/{src/components → components}/GrResponseErrorBanner/responseError.defaults.d.ts +0 -0
  628. /package/dist/types/{src/components → components}/GrResponseErrorBanner/responseError.types.d.ts +0 -0
  629. /package/dist/types/{src/components → components}/GrResponseErrorBanner/useResponseError.d.ts +0 -0
  630. /package/dist/types/{src/components → components}/GrSegmented/GrSegmented.vue.d.ts +0 -0
  631. /package/dist/types/{src/components → components}/GrSegmented/config.d.ts +0 -0
  632. /package/dist/types/{src/components → components}/GrSegmented/defaults.d.ts +0 -0
  633. /package/dist/types/{src/components → components}/GrSegmented/grSegmentedStyles.d.ts +0 -0
  634. /package/dist/types/{src/components → components}/GrSegmented/safelist.d.ts +0 -0
  635. /package/dist/types/{src/components → components}/GrSelect/composables/useSelectNavigation.d.ts +0 -0
  636. /package/dist/types/{src/components → components}/GrSelect/composables/useSelectPanelItems.d.ts +0 -0
  637. /package/dist/types/{src/components → components}/GrSelect/composables/useSelectValues.d.ts +0 -0
  638. /package/dist/types/{src/components → components}/GrSelect/composables/useSelectVirtualization.d.ts +0 -0
  639. /package/dist/types/{src/components → components}/GrSelect/config.d.ts +0 -0
  640. /package/dist/types/{src/components → components}/GrSelect/defaults.d.ts +0 -0
  641. /package/dist/types/{src/components → components}/GrSelect/grSelectStyles.d.ts +0 -0
  642. /package/dist/types/{src/components → components}/GrSelect/index.d.ts +0 -0
  643. /package/dist/types/{src/components → components}/GrSelect/safelist.d.ts +0 -0
  644. /package/dist/types/{src/components → components}/GrSelect/selectValue.d.ts +0 -0
  645. /package/dist/types/{src/components → components}/GrSidebar/GrSidebar.vue.d.ts +0 -0
  646. /package/dist/types/{src/components → components}/GrSidebar/GrSidebarGroup.vue.d.ts +0 -0
  647. /package/dist/types/{src/components → components}/GrSidebar/GrSidebarItem.vue.d.ts +0 -0
  648. /package/dist/types/{src/components → components}/GrSidebar/config.d.ts +0 -0
  649. /package/dist/types/{src/components → components}/GrSidebar/grSidebarStyles.d.ts +0 -0
  650. /package/dist/types/{src/components → components}/GrSidebar/safelist.d.ts +0 -0
  651. /package/dist/types/{src/components → components}/GrSidebar/sidebarContext.d.ts +0 -0
  652. /package/dist/types/{src/components → components}/GrSkeleton/GrSkeleton.vue.d.ts +0 -0
  653. /package/dist/types/{src/components → components}/GrSkeleton/config.d.ts +0 -0
  654. /package/dist/types/{src/components → components}/GrSkeleton/grSkeletonStyles.d.ts +0 -0
  655. /package/dist/types/{src/components → components}/GrSlider/GrSlider.vue.d.ts +0 -0
  656. /package/dist/types/{src/components → components}/GrSlider/config.d.ts +0 -0
  657. /package/dist/types/{src/components → components}/GrSlider/defaults.d.ts +0 -0
  658. /package/dist/types/{src/components → components}/GrSlider/grSliderStyles.d.ts +0 -0
  659. /package/dist/types/{src/components → components}/GrSlider/index.d.ts +0 -0
  660. /package/dist/types/{src/components → components}/GrSlider/safelist.d.ts +0 -0
  661. /package/dist/types/{src/components → components}/GrSortableList/GrSortableList.vue.d.ts +0 -0
  662. /package/dist/types/{src/components → components}/GrSortableList/config.d.ts +0 -0
  663. /package/dist/types/{src/components → components}/GrSortableList/grSortableListStyles.d.ts +0 -0
  664. /package/dist/types/{src/components → components}/GrSortableList/index.d.ts +0 -0
  665. /package/dist/types/{src/components → components}/GrSortableList/safelist.d.ts +0 -0
  666. /package/dist/types/{src/components → components}/GrSplitter/GrSplitter.vue.d.ts +0 -0
  667. /package/dist/types/{src/components → components}/GrSplitter/config.d.ts +0 -0
  668. /package/dist/types/{src/components → components}/GrSplitter/defaults.d.ts +0 -0
  669. /package/dist/types/{src/components → components}/GrSplitter/grSplitterStyles.d.ts +0 -0
  670. /package/dist/types/{src/components → components}/GrSplitter/safelist.d.ts +0 -0
  671. /package/dist/types/{src/components → components}/GrSplitter/splitterGeometry.d.ts +0 -0
  672. /package/dist/types/{src/components → components}/GrStatistic/GrStatistic.vue.d.ts +0 -0
  673. /package/dist/types/{src/components → components}/GrStatistic/config.d.ts +0 -0
  674. /package/dist/types/{src/components → components}/GrStatistic/countUp.d.ts +0 -0
  675. /package/dist/types/{src/components → components}/GrStatistic/defaults.d.ts +0 -0
  676. /package/dist/types/{src/components → components}/GrStatistic/formatStatisticValue.d.ts +0 -0
  677. /package/dist/types/{src/components → components}/GrStatistic/grStatisticStyles.d.ts +0 -0
  678. /package/dist/types/{src/components → components}/GrStatistic/index.d.ts +0 -0
  679. /package/dist/types/{src/components → components}/GrStatistic/safelist.d.ts +0 -0
  680. /package/dist/types/{src/components → components}/GrSwitch/GrSwitch.vue.d.ts +0 -0
  681. /package/dist/types/{src/components → components}/GrSwitch/config.d.ts +0 -0
  682. /package/dist/types/{src/components → components}/GrSwitch/defaults.d.ts +0 -0
  683. /package/dist/types/{src/components → components}/GrSwitch/grSwitchStyles.d.ts +0 -0
  684. /package/dist/types/{src/components → components}/GrSwitch/index.d.ts +0 -0
  685. /package/dist/types/{src/components → components}/GrSwitch/safelist.d.ts +0 -0
  686. /package/dist/types/{src/components → components}/GrTabPanels/GrTabPanel.vue.d.ts +0 -0
  687. /package/dist/types/{src/components → components}/GrTabPanels/GrTabPanels.vue.d.ts +0 -0
  688. /package/dist/types/{src/components → components}/GrTabPanels/config.d.ts +0 -0
  689. /package/dist/types/{src/components → components}/GrTabPanels/context.d.ts +0 -0
  690. /package/dist/types/{src/components → components}/GrTable/GrTable.vue.d.ts +0 -0
  691. /package/dist/types/{src/components → components}/GrTable/config.d.ts +0 -0
  692. /package/dist/types/{src/components → components}/GrTable/defaults.d.ts +0 -0
  693. /package/dist/types/{src/components → components}/GrTable/grTableStyles.d.ts +0 -0
  694. /package/dist/types/{src/components → components}/GrTable/index.d.ts +0 -0
  695. /package/dist/types/{src/components → components}/GrTable/safelist.d.ts +0 -0
  696. /package/dist/types/{src/components → components}/GrTabs/GrTabs.vue.d.ts +0 -0
  697. /package/dist/types/{src/components → components}/GrTabs/config.d.ts +0 -0
  698. /package/dist/types/{src/components → components}/GrTabs/defaults.d.ts +0 -0
  699. /package/dist/types/{src/components → components}/GrTabs/grTabsStyles.d.ts +0 -0
  700. /package/dist/types/{src/components → components}/GrTabs/safelist.d.ts +0 -0
  701. /package/dist/types/{src/components → components}/GrTextarea/GrTextarea.vue.d.ts +0 -0
  702. /package/dist/types/{src/components → components}/GrTextarea/config.d.ts +0 -0
  703. /package/dist/types/{src/components → components}/GrTextarea/defaults.d.ts +0 -0
  704. /package/dist/types/{src/components → components}/GrTextarea/grTextareaStyles.d.ts +0 -0
  705. /package/dist/types/{src/components → components}/GrTextarea/index.d.ts +0 -0
  706. /package/dist/types/{src/components → components}/GrTextarea/safelist.d.ts +0 -0
  707. /package/dist/types/{src/components → components}/GrTimeline/GrTimeline.vue.d.ts +0 -0
  708. /package/dist/types/{src/components → components}/GrTimeline/GrTimelineItem.vue.d.ts +0 -0
  709. /package/dist/types/{src/components → components}/GrTimeline/config.d.ts +0 -0
  710. /package/dist/types/{src/components → components}/GrTimeline/defaults.d.ts +0 -0
  711. /package/dist/types/{src/components → components}/GrTimeline/grTimelineContext.d.ts +0 -0
  712. /package/dist/types/{src/components → components}/GrTimeline/grTimelineStyles.d.ts +0 -0
  713. /package/dist/types/{src/components → components}/GrTimeline/safelist.d.ts +0 -0
  714. /package/dist/types/{src/components → components}/GrTimeline/timelineGroups.d.ts +0 -0
  715. /package/dist/types/{src/components → components}/GrToaster/GrToaster.vue.d.ts +0 -0
  716. /package/dist/types/{src/components → components}/GrToaster/config.d.ts +0 -0
  717. /package/dist/types/{src/components → components}/GrToaster/grToasterStyles.d.ts +0 -0
  718. /package/dist/types/{src/components → components}/GrToaster/index.d.ts +0 -0
  719. /package/dist/types/{src/components → components}/GrToaster/safelist.d.ts +0 -0
  720. /package/dist/types/{src/components → components}/GrTooltip/GrTooltip.vue.d.ts +0 -0
  721. /package/dist/types/{src/components → components}/GrTooltip/config.d.ts +0 -0
  722. /package/dist/types/{src/components → components}/GrTooltip/defaults.d.ts +0 -0
  723. /package/dist/types/{src/components → components}/GrTooltip/grTooltipStyles.d.ts +0 -0
  724. /package/dist/types/{src/components → components}/GrTooltip/index.d.ts +0 -0
  725. /package/dist/types/{src/components → components}/GrTooltip/safelist.d.ts +0 -0
  726. /package/dist/types/{src/components → components}/GrTree/GrTree.vue.d.ts +0 -0
  727. /package/dist/types/{src/components → components}/GrTree/config.d.ts +0 -0
  728. /package/dist/types/{src/components → components}/GrTree/defaults.d.ts +0 -0
  729. /package/dist/types/{src/components → components}/GrTree/grTreeChecking.d.ts +0 -0
  730. /package/dist/types/{src/components → components}/GrTree/grTreeDataAdapter.d.ts +0 -0
  731. /package/dist/types/{src/components → components}/GrTree/grTreeInteractionContext.d.ts +0 -0
  732. /package/dist/types/{src/components → components}/GrTree/grTreeProps.d.ts +0 -0
  733. /package/dist/types/{src/components → components}/GrTree/grTreeStore.d.ts +0 -0
  734. /package/dist/types/{src/components → components}/GrTree/grTreeStyles.d.ts +0 -0
  735. /package/dist/types/{src/components → components}/GrTree/grTreeTypes.d.ts +0 -0
  736. /package/dist/types/{src/components → components}/GrTree/index.d.ts +0 -0
  737. /package/dist/types/{src/components → components}/GrTree/safelist.d.ts +0 -0
  738. /package/dist/types/{src/components → components}/GrTreeSelect/config.d.ts +0 -0
  739. /package/dist/types/{src/components → components}/GrTreeSelect/defaults.d.ts +0 -0
  740. /package/dist/types/{src/components → components}/GrTreeSelect/grTreeSelectStyles.d.ts +0 -0
  741. /package/dist/types/{src/components → components}/GrTreeSelect/grTreeSelectTypes.d.ts +0 -0
  742. /package/dist/types/{src/components → components}/GrTreeSelect/index.d.ts +0 -0
  743. /package/dist/types/{src/components → components}/GrTreeSelect/safelist.d.ts +0 -0
  744. /package/dist/types/{src/components → components}/shared/classTokens.d.ts +0 -0
  745. /package/dist/types/{src/components → components}/shared/hotkey.d.ts +0 -0
  746. /package/dist/types/{src/components → components}/shared/hotkeyTokens.d.ts +0 -0
  747. /package/dist/types/{src/components → components}/shared/icon.d.ts +0 -0
  748. /package/dist/types/{src/components → components}/shared/instance.d.ts +0 -0
  749. /package/dist/types/{src/components → components}/shared/optionFilter.d.ts +0 -0
  750. /package/dist/types/{src/components → components}/shared/sizes.d.ts +0 -0
  751. /package/dist/types/{src/components → components}/shared/slotNodes.d.ts +0 -0
  752. /package/dist/types/{src/components → components}/shared/tones.d.ts +0 -0
  753. /package/dist/types/{src/composables → composables}/internal/dragSortGeometry.d.ts +0 -0
  754. /package/dist/types/{src/composables → composables}/internal/focusables.d.ts +0 -0
  755. /package/dist/types/{src/composables → composables}/internal/inert.d.ts +0 -0
  756. /package/dist/types/{src/composables → composables}/internal/overlayStack.d.ts +0 -0
  757. /package/dist/types/{src/composables → composables}/internal/portalRoot.d.ts +0 -0
  758. /package/dist/types/{src/composables → composables}/internal/useAddonMeasurement.d.ts +0 -0
  759. /package/dist/types/{src/composables → composables}/internal/useControlAddons.d.ts +0 -0
  760. /package/dist/types/{src/composables → composables}/internal/useControlledOpen.d.ts +0 -0
  761. /package/dist/types/{src/composables → composables}/internal/useFilePreviews.d.ts +0 -0
  762. /package/dist/types/{src/composables → composables}/internal/useFocusWithin.d.ts +0 -0
  763. /package/dist/types/{src/composables → composables}/internal/useInertOthers.d.ts +0 -0
  764. /package/dist/types/{src/composables → composables}/internal/useModalOverlay.d.ts +0 -0
  765. /package/dist/types/{src/composables → composables}/internal/useOverlayPresence.d.ts +0 -0
  766. /package/dist/types/{src/composables → composables}/internal/useScrollLock.d.ts +0 -0
  767. /package/dist/types/{src/composables → composables}/internal/useTeleportEnabled.d.ts +0 -0
  768. /package/dist/types/{src/composables → composables}/useAnnouncer.d.ts +0 -0
  769. /package/dist/types/{src/composables → composables}/useComboboxNavigation.d.ts +0 -0
  770. /package/dist/types/{src/composables → composables}/useDismissible.d.ts +0 -0
  771. /package/dist/types/{src/composables → composables}/useDragGesture.d.ts +0 -0
  772. /package/dist/types/{src/composables → composables}/useDragSort.d.ts +0 -0
  773. /package/dist/types/{src/composables → composables}/useFloating.d.ts +0 -0
  774. /package/dist/types/{src/composables → composables}/useFocusTrap.d.ts +0 -0
  775. /package/dist/types/{src/composables → composables}/useGrComponentConfig.d.ts +0 -0
  776. /package/dist/types/{src/composables → composables}/useGrFormControl.d.ts +0 -0
  777. /package/dist/types/{src/composables → composables}/useGranularityTranslations.d.ts +0 -0
  778. /package/dist/types/{src/composables → composables}/useOverlayLayer.d.ts +0 -0
  779. /package/dist/types/{src/composables → composables}/usePortalTarget.d.ts +0 -0
  780. /package/dist/types/{src/composables → composables}/useRovingFocus.d.ts +0 -0
  781. /package/dist/types/{src/composables → composables}/useTheme.d.ts +0 -0
  782. /package/dist/types/{src/composables → composables}/useToast.d.ts +0 -0
  783. /package/dist/types/{src/composables → composables}/useVirtualList.d.ts +0 -0
  784. /package/dist/types/{src/directives → directives}/autofocus.d.ts +0 -0
  785. /package/dist/types/{src/directives → directives}/autosize.d.ts +0 -0
  786. /package/dist/types/{src/directives → directives}/clickOutside.d.ts +0 -0
  787. /package/dist/types/{src/directives → directives}/dropzone.d.ts +0 -0
  788. /package/dist/types/{src/directives → directives}/globalDirectives.d.ts +0 -0
  789. /package/dist/types/{src/directives → directives}/hotkey.d.ts +0 -0
  790. /package/dist/types/{src/directives → directives}/index.d.ts +0 -0
  791. /package/dist/types/{src/directives → directives}/loading.d.ts +0 -0
  792. /package/dist/types/{src/fileValidation → fileValidation}/FileValidationError.d.ts +0 -0
  793. /package/dist/types/{src/fileValidation → fileValidation}/acceptValidator.d.ts +0 -0
  794. /package/dist/types/{src/fileValidation → fileValidation}/allowedExtensionsValidator.d.ts +0 -0
  795. /package/dist/types/{src/fileValidation → fileValidation}/allowedMimeTypesValidator.d.ts +0 -0
  796. /package/dist/types/{src/fileValidation → fileValidation}/i18n.d.ts +0 -0
  797. /package/dist/types/{src/fileValidation → fileValidation}/index.d.ts +0 -0
  798. /package/dist/types/{src/fileValidation → fileValidation}/matchAccept.d.ts +0 -0
  799. /package/dist/types/{src/fileValidation → fileValidation}/maxCountValidator.d.ts +0 -0
  800. /package/dist/types/{src/fileValidation → fileValidation}/maxFileSize.d.ts +0 -0
  801. /package/dist/types/{src/fileValidation → fileValidation}/maxTotalSizeBytesValidator.d.ts +0 -0
  802. /package/dist/types/{src/fileValidation → fileValidation}/runFileValidators.d.ts +0 -0
  803. /package/dist/types/{src/fileValidation → fileValidation}/types.d.ts +0 -0
  804. /package/dist/types/{src/granular-provider → granular-provider}/index.d.ts +0 -0
  805. /package/dist/types/{src/granular-provider → granular-provider}/node.d.ts +0 -0
  806. /package/dist/types/{src/granular-provider → granular-provider}/shared.d.ts +0 -0
  807. /package/dist/types/{src/i18n → i18n}/adapter.d.ts +0 -0
  808. /package/dist/types/{src/i18n → i18n}/all.d.ts +0 -0
  809. /package/dist/types/{src/i18n → i18n}/index.d.ts +0 -0
  810. /package/dist/types/{src/i18n → i18n}/messages/const.d.ts +0 -0
  811. /package/dist/types/{src/i18n → i18n}/messages/en.d.ts +0 -0
  812. /package/dist/types/{src/i18n → i18n}/messages/es.d.ts +0 -0
  813. /package/dist/types/{src/i18n → i18n}/messages/index.d.ts +0 -0
  814. /package/dist/types/{src/i18n → i18n}/messages/ru.d.ts +0 -0
  815. /package/dist/types/{src/index.d.ts → index.d.ts} +0 -0
  816. /package/dist/types/{src/internal → internal}/granularityFormat.d.ts +0 -0
  817. /package/dist/types/{src/internal → internal}/granularityI18n.d.ts +0 -0
  818. /package/dist/types/{src/internal → internal}/keyboard.d.ts +0 -0
  819. /package/dist/types/{src/testing → testing}/announcer.d.ts +0 -0
  820. /package/dist/types/{src/testing → testing}/context.d.ts +0 -0
  821. /package/dist/types/{src/testing → testing}/env.d.ts +0 -0
  822. /package/dist/types/{src/testing → testing}/geometry.d.ts +0 -0
  823. /package/dist/types/{src/testing → testing}/pointer.d.ts +0 -0
  824. /package/dist/types/{src/theme → theme}/apply.d.ts +0 -0
  825. /package/dist/types/{src/theme → theme}/color.d.ts +0 -0
  826. /package/dist/types/{src/theme → theme}/extendTheme.d.ts +0 -0
  827. /package/dist/types/{src/theme → theme}/index.d.ts +0 -0
  828. /package/dist/types/{src/theme → theme}/roles.d.ts +0 -0
  829. /package/dist/types/{src/theme → theme}/tone.d.ts +0 -0
  830. /package/dist/types/{src/theme → theme}/validate.d.ts +0 -0
  831. /package/dist/types/{src/tokens → tokens}/generated.d.ts +0 -0
  832. /package/dist/types/{src/tokens → tokens}/index.d.ts +0 -0
  833. /package/dist/types/{src/tokens → tokens}/types.d.ts +0 -0
  834. /package/dist/types/{src/vue → vue}/index.d.ts +0 -0
  835. /package/dist/types/{src/vue → vue}/plugin.d.ts +0 -0
@@ -1,9 +1,9 @@
1
1
  import { t as x_default } from "../../../chunks/x-2KXnqxiD.js";
2
- import { a as useGrComponentProp, o as useGrComponentSize } from "../../../chunks/context-BSYR7RZs.js";
2
+ import { a as useGrComponentSize, i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
3
3
  import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
4
4
  import { n as iconTag, t as iconClass } from "../../../chunks/icon-Dag2tIMs.js";
5
5
  import { useRovingFocus } from "../../../composables/useRovingFocus.js";
6
- import { a as grTabsCloseClass, c as grTabsTabClass, d as tabIconClass, i as grTabsBadgeClass, l as tabCloseIconSizes, o as grTabsEmptyClass, s as grTabsListClass, u as tabContentClass } from "../../../chunks/config-_qPUfb6-2.js";
6
+ import { a as grTabsEmptyClass, c as tabCloseIconSizes, i as grTabsCloseClass, l as tabContentClass, o as grTabsListClass, r as grTabsBadgeClass, s as grTabsTabClass, u as tabIconClass } from "../../../chunks/config-DWN4x6_e.js";
7
7
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, watch } from "vue";
8
8
  //#region src/components/GrTabs/GrTabs.vue?vue&type=script&setup=true&lang.ts
9
9
  var _hoisted_1 = ["aria-orientation"];
@@ -1 +1 @@
1
- {"version":3,"file":"GrTabs-f3-oQenu.js","names":[],"sources":["../../../../src/components/GrTabs/GrTabs.vue","../../../../src/components/GrTabs/GrTabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch, type Component } from 'vue'\n\nimport IconX from '~icons/lucide/x'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { iconClass, iconTag } from '../shared/icon'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport {\n grTabsBadgeClass,\n grTabsCloseClass,\n grTabsEmptyClass,\n grTabsListClass,\n grTabsTabClass,\n tabCloseIconSizes,\n tabContentClass,\n tabIconClass,\n type GrTabsOrientation,\n type GrTabsSize,\n type GrTabsVariant,\n} from './grTabsStyles'\n\nexport interface GrTab {\n value: string\n label: string\n badge?: string\n /**\n * Иконка слева от подписи: Vue-компонент либо класс иконки вашей UnoCSS-сборки\n * (`'i-lucide-user'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`).\n */\n icon?: string | Component\n disabled?: boolean\n /** Перекрывает `closable` ряда в обе стороны: закрепить вкладку или закрыть одну её. */\n closable?: boolean\n}\n\nexport interface GrTabsProps {\n modelValue: string\n tabs: GrTab[]\n /**\n * База id для ARIA-связки с `GrTabPanels`. Если задана, каждая вкладка\n * получает `id=\"<idBase>-tab-<value>\"` и `aria-controls=\"<idBase>-panel-<value>\"`.\n * Передайте тот же `idBase` в `GrTabPanels`, чтобы связать `tab`↔`tabpanel`.\n */\n idBase?: string\n size?: GrTabsSize\n /** Вид ряда: обойма с таблетками или ряд с подчёркиванием. */\n variant?: GrTabsVariant\n /**\n * `automatic` (по умолчанию) — стрелка сразу переключает вкладку;\n * `manual` — стрелка двигает только фокус, выбор подтверждается\n * `Enter`/`Space`. Второй режим для вкладок с тяжёлой загрузкой: перебор\n * стрелками иначе тянет каждую панель.\n */\n activationMode?: GrTabsActivationMode\n /** Горизонтальный (по умолчанию) или вертикальный список вкладок. */\n orientation?: GrTabsOrientation\n /**\n * Крестик на вкладках и закрытие по `Delete`/`Backspace`. Точечно снимается\n * `closable: false` у самой вкладки.\n */\n closable?: boolean\n /** Текст, когда список вкладок пуст. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrTabsEmits {\n (e: 'update:modelValue', value: string): void\n /**\n * Просьба закрыть вкладку. Компонент список не трогает: `tabs` — проп, и\n * закрытие может не состояться («сохранить изменения?»).\n */\n (e: 'close', value: string): void\n}\n\nexport type GrTabsActivationMode = 'automatic' | 'manual'\n\nexport type { GrTabsOrientation, GrTabsVariant } from './grTabsStyles'\n\n/**\n * GrTabs — горизонтальная группа вкладок с паттерном WAI-ARIA `tablist`.\n *\n * A11y:\n * - `role=\"tablist\"` на корне, `role=\"tab\"` на каждой вкладке.\n * - Roving `tabindex`: активная вкладка `0`, остальные `-1`.\n * - Клавиатура: `ArrowLeft`/`ArrowRight` — цикличный переход, `Home`/`End` — к первой/последней.\n * - При переключении стрелками DOM-фокус программно переносится на новую вкладку.\n *\n * Сам компонент не рендерит `tabpanel` — это ответственность консьюмера (по `aria-controls`/внешней разметке).\n */\nconst props = withDefaults(defineProps<GrTabsProps>(), {\n idBase: undefined,\n size: undefined,\n // Дефолт живёт в резолвере: Vue подставил бы свой раньше, чем компонент\n // заглянет в `GrConfigProvider`.\n variant: undefined,\n activationMode: 'automatic',\n orientation: 'horizontal',\n closable: false,\n emptyText: undefined,\n})\n\ndefineSlots<{\n /** Содержимое вкладки целиком — вместо подписи, иконки и счётчика. Крестик остаётся. */\n tab?: (props: { tab: GrTab, active: boolean, disabled: boolean }) => unknown\n /** Пустой ряд — вместо текста из локали. */\n empty?: () => unknown\n}>()\n\nconst emit = defineEmits<GrTabsEmits>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTabs' })\nconst resolvedVariant = useGrComponentProp('GrTabs', 'variant', () => props.variant, 'pills')\n\nconst tablistClass = computed(() => grTabsListClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n orientation: props.orientation,\n}))\n\nfunction tabClass(tab: GrTab): string {\n return grTabsTabClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n active: tab.value === props.modelValue,\n disabled: Boolean(tab.disabled),\n })\n}\n\nconst badgeClass = computed(() => grTabsBadgeClass(resolvedSize.value))\nconst closeClass = computed(() => grTabsCloseClass(resolvedSize.value))\nconst closeIconClass = computed(() => tabCloseIconSizes[resolvedSize.value])\nconst emptyClass = computed(() => grTabsEmptyClass(resolvedSize.value))\n\nconst isEmpty = computed(() => props.tabs.length === 0)\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.tabs.empty', 'Nothing here yet'))\nconst closeTitle = computed(() => t('gr.tabs.close', 'Close tab'))\n\n/** Отключённая вкладка не принимает взаимодействия, а закрытие — тоже взаимодействие. */\nfunction isClosable(tab: GrTab): boolean {\n return !tab.disabled && (tab.closable ?? props.closable)\n}\n\nconst buttonRefs = ref<HTMLButtonElement[]>([])\n\n/**\n * Vue зовёт ref-функцию с `null`, когда узел исчез. Игнорировать такой вызов\n * нельзя: в массиве оставались отсоединённые от DOM кнопки, и `focus()` по\n * сократившемуся списку молча проваливался в `<body>`.\n */\nfunction setButtonRef(el: unknown, index: number): void {\n if (el instanceof HTMLButtonElement)\n buttonRefs.value[index] = el\n else\n delete buttonRefs.value[index]\n\n if (buttonRefs.value.length > props.tabs.length)\n buttonRefs.value.length = props.tabs.length\n}\n\nconst activeIndex = computed(() => props.tabs.findIndex(t => t.value === props.modelValue))\n\nfunction isEnabled(tab: GrTab): boolean {\n return !tab.disabled\n}\n\nconst tabIndexes = computed(() => props.tabs.map((_, index) => index))\n\n/**\n * Кольцо roving-фокуса. При `activationMode: 'manual'` фокус уезжает вперёд\n * выбора — это и есть разница между `activeKey` примитива и `initialKey`:\n * первый ведёт фокус, второй подставляет выбранную вкладку, пока фокус не\n * трогали.\n *\n * Выбор стрелка **не** переносит: этим заведует `onKeydown` по\n * `activationMode`. Через `onMove` это выразить нельзя — клик тоже зовёт\n * `focusKey`, и выбор эмитился бы дважды.\n */\nconst roving = useRovingFocus<number>({\n items: () => tabIndexes.value,\n elementFor: index => buttonRefs.value[index],\n isDisabled: index => Boolean(props.tabs[index]?.disabled),\n orientation: () => (props.orientation === 'vertical' ? 'vertical' : 'horizontal'),\n skipDisabled: () => true,\n /**\n * Пока фокус не трогали, остановку `Tab` держит выбранная вкладка. Если\n * `modelValue` не совпал ни с одной (пустое начальное значение, асинхронный\n * список, удалённая активная вкладка), примитив ставит её на первую\n * доступную — иначе tablist выпал бы из обхода целиком и молча.\n *\n * Выключенность здесь не проверяется намеренно: на кнопке `aria-disabled`, а\n * не нативный `disabled`, поэтому выключенная вкладка фокусируется и держать\n * остановку вправе.\n */\n initialKey: () => (activeIndex.value >= 0 ? activeIndex.value : undefined),\n /**\n * Прокрутка до фокуса, а не после: иначе браузер доскроллит сам по-своему, и\n * ряд дёрнется дважды. Синхронно — фокус обязан остаться в том же такте, что\n * и раньше: тик, где он нужен, добавляет `focusIndex`.\n */\n beforeFocus: index => scrollIntoView(index),\n})\n\n/**\n * Фокус после перерисовки — для путей, где список только что изменился\n * (закрытие вкладки). Клавиатура идёт через примитив напрямую: там ряд уже\n * отрисован, и лишний тик только отложил бы фокус.\n */\nasync function focusIndex(index: number): Promise<void> {\n await nextTick()\n await roving.focusKey(index)\n}\n\n/**\n * Ряд прокручивается, а не переносится, поэтому активная вкладка может уехать\n * за край — например, когда её выбрали снаружи. `scrollIntoView` нет в jsdom и\n * в старых движках, поэтому вызов необязательный.\n */\nfunction scrollIntoView(index: number): void {\n buttonRefs.value[index]?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n}\n\nwatch(() => props.modelValue, async () => {\n await nextTick()\n if (activeIndex.value >= 0)\n scrollIntoView(activeIndex.value)\n})\n\nasync function selectByIndex(index: number, focus = false): Promise<void> {\n const tab = props.tabs[index]\n if (!tab || !isEnabled(tab))\n return\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n if (focus)\n await focusIndex(index)\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (props.tabs.length === 0)\n return\n\n const currentIndex = roving.rovingKey.value ?? 0\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n // В ручном режиме выбор подтверждается явно — на той вкладке, где фокус.\n if (props.activationMode === 'manual') {\n event.preventDefault()\n void selectByIndex(currentIndex, false)\n }\n return\n case 'Delete':\n case 'Backspace': {\n // Единственный клавиатурный путь к закрытию: крестик в таб-порядке не стоит.\n const tab = props.tabs[currentIndex]\n if (tab && isClosable(tab)) {\n event.preventDefault()\n requestClose(currentIndex)\n }\n return\n }\n }\n\n // Стрелки, `Home`, `End` — фокус ведёт примитив по объявленной ориентации.\n if (!roving.handleNavigationKeys(event))\n return\n\n // `automatic`: выбор едет за фокусом. `manual`: ждёт `Enter`/`Space`.\n if (props.activationMode !== 'manual')\n void selectByIndex(roving.rovingKey.value ?? currentIndex, false)\n}\n\n/**\n * Закрытая вкладка, которая держала фокус. Компонент список не укорачивает —\n * это делает потребитель, — поэтому фокус возвращается только после того, как\n * `tabs` действительно стал короче.\n */\nlet pendingClose: { index: number, value: string } | null = null\n\nfunction requestClose(index: number): void {\n const tab = props.tabs[index]\n if (!tab || !isClosable(tab))\n return\n\n const held = buttonRefs.value[index] === document.activeElement\n pendingClose = held ? { index, value: tab.value } : null\n\n emit('close', tab.value)\n}\n\n// Без этого клавиатурное закрытие роняет фокус в `<body>`: кнопка, на которой\n// он стоял, исчезает из DOM вместе со вкладкой.\nwatch(() => props.tabs.length, async (next, prev) => {\n const pending = pendingClose\n pendingClose = null\n\n if (!pending || next >= prev)\n return\n // Ушла не та вкладка — потребитель поменял список по своей причине.\n if (props.tabs.some(tab => tab.value === pending.value))\n return\n\n await nextTick()\n\n const target = Math.min(pending.index, next - 1)\n if (target >= 0)\n void focusIndex(target)\n else\n roving.reset()\n})\n\nfunction onClick(event: MouseEvent, tab: GrTab, index: number): void {\n if (!isEnabled(tab))\n return\n\n // Крестик — не кнопка, поэтому его клик приходит сюда же и разбирается по цели.\n if (event.target instanceof Element && event.target.closest('[data-gr-tab-close]')) {\n requestClose(index)\n return\n }\n\n roving.setActive(index)\n\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n}\n</script>\n\n<template>\n <!--\n Пустой ряд — не пустой `tablist`: роль обязана владеть потомками `tab`,\n и текст внутри неё был бы нарушением, а не пустым состоянием.\n -->\n <div v-if=\"isEmpty\" data-gr-tabs-empty :class=\"emptyClass\">\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div\n v-else\n role=\"tablist\"\n data-gr-tabs\n :aria-orientation=\"orientation\"\n :class=\"tablistClass\"\n @keydown=\"onKeydown\"\n >\n <button\n v-for=\"(tab, index) in tabs\"\n :id=\"idBase ? `${idBase}-tab-${tab.value}` : undefined\"\n :key=\"tab.value\"\n :ref=\"el => setButtonRef(el, index)\"\n type=\"button\"\n role=\"tab\"\n data-gr-tab\n :aria-controls=\"idBase ? `${idBase}-panel-${tab.value}` : undefined\"\n :aria-selected=\"tab.value === modelValue ? 'true' : 'false'\"\n :aria-disabled=\"tab.disabled ? 'true' : undefined\"\n :aria-keyshortcuts=\"isClosable(tab) ? 'Delete' : undefined\"\n :tabindex=\"roving.tabindexFor(index)\"\n :class=\"tabClass(tab)\"\n @click=\"onClick($event, tab, index)\"\n >\n <span :class=\"tabContentClass\">\n <slot\n name=\"tab\"\n :tab=\"tab\"\n :active=\"tab.value === modelValue\"\n :disabled=\"Boolean(tab.disabled)\"\n >\n <component\n :is=\"iconTag(tab.icon)\"\n v-if=\"tab.icon\"\n :class=\"[tabIconClass, iconClass(tab.icon)]\"\n aria-hidden=\"true\"\n />\n <span>{{ tab.label }}</span>\n <span v-if=\"tab.badge\" :class=\"badgeClass\">\n {{ tab.badge }}\n </span>\n </slot>\n\n <!-- Снаружи слота: своя разметка вкладки не должна отнимать закрытие. -->\n <span\n v-if=\"isClosable(tab)\"\n data-gr-tab-close\n :class=\"closeClass\"\n :title=\"closeTitle\"\n aria-hidden=\"true\"\n >\n <IconX :class=\"closeIconClass\" />\n </span>\n </span>\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch, type Component } from 'vue'\n\nimport IconX from '~icons/lucide/x'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { iconClass, iconTag } from '../shared/icon'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport {\n grTabsBadgeClass,\n grTabsCloseClass,\n grTabsEmptyClass,\n grTabsListClass,\n grTabsTabClass,\n tabCloseIconSizes,\n tabContentClass,\n tabIconClass,\n type GrTabsOrientation,\n type GrTabsSize,\n type GrTabsVariant,\n} from './grTabsStyles'\n\nexport interface GrTab {\n value: string\n label: string\n badge?: string\n /**\n * Иконка слева от подписи: Vue-компонент либо класс иконки вашей UnoCSS-сборки\n * (`'i-lucide-user'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`).\n */\n icon?: string | Component\n disabled?: boolean\n /** Перекрывает `closable` ряда в обе стороны: закрепить вкладку или закрыть одну её. */\n closable?: boolean\n}\n\nexport interface GrTabsProps {\n modelValue: string\n tabs: GrTab[]\n /**\n * База id для ARIA-связки с `GrTabPanels`. Если задана, каждая вкладка\n * получает `id=\"<idBase>-tab-<value>\"` и `aria-controls=\"<idBase>-panel-<value>\"`.\n * Передайте тот же `idBase` в `GrTabPanels`, чтобы связать `tab`↔`tabpanel`.\n */\n idBase?: string\n size?: GrTabsSize\n /** Вид ряда: обойма с таблетками или ряд с подчёркиванием. */\n variant?: GrTabsVariant\n /**\n * `automatic` (по умолчанию) — стрелка сразу переключает вкладку;\n * `manual` — стрелка двигает только фокус, выбор подтверждается\n * `Enter`/`Space`. Второй режим для вкладок с тяжёлой загрузкой: перебор\n * стрелками иначе тянет каждую панель.\n */\n activationMode?: GrTabsActivationMode\n /** Горизонтальный (по умолчанию) или вертикальный список вкладок. */\n orientation?: GrTabsOrientation\n /**\n * Крестик на вкладках и закрытие по `Delete`/`Backspace`. Точечно снимается\n * `closable: false` у самой вкладки.\n */\n closable?: boolean\n /** Текст, когда список вкладок пуст. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrTabsEmits {\n (e: 'update:modelValue', value: string): void\n /**\n * Просьба закрыть вкладку. Компонент список не трогает: `tabs` — проп, и\n * закрытие может не состояться («сохранить изменения?»).\n */\n (e: 'close', value: string): void\n}\n\nexport type GrTabsActivationMode = 'automatic' | 'manual'\n\nexport type { GrTabsOrientation, GrTabsVariant } from './grTabsStyles'\n\n/**\n * GrTabs — горизонтальная группа вкладок с паттерном WAI-ARIA `tablist`.\n *\n * A11y:\n * - `role=\"tablist\"` на корне, `role=\"tab\"` на каждой вкладке.\n * - Roving `tabindex`: активная вкладка `0`, остальные `-1`.\n * - Клавиатура: `ArrowLeft`/`ArrowRight` — цикличный переход, `Home`/`End` — к первой/последней.\n * - При переключении стрелками DOM-фокус программно переносится на новую вкладку.\n *\n * Сам компонент не рендерит `tabpanel` — это ответственность консьюмера (по `aria-controls`/внешней разметке).\n */\nconst props = withDefaults(defineProps<GrTabsProps>(), {\n idBase: undefined,\n size: undefined,\n // Дефолт живёт в резолвере: Vue подставил бы свой раньше, чем компонент\n // заглянет в `GrConfigProvider`.\n variant: undefined,\n activationMode: 'automatic',\n orientation: 'horizontal',\n closable: false,\n emptyText: undefined,\n})\n\ndefineSlots<{\n /** Содержимое вкладки целиком — вместо подписи, иконки и счётчика. Крестик остаётся. */\n tab?: (props: { tab: GrTab, active: boolean, disabled: boolean }) => unknown\n /** Пустой ряд — вместо текста из локали. */\n empty?: () => unknown\n}>()\n\nconst emit = defineEmits<GrTabsEmits>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTabs' })\nconst resolvedVariant = useGrComponentProp('GrTabs', 'variant', () => props.variant, 'pills')\n\nconst tablistClass = computed(() => grTabsListClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n orientation: props.orientation,\n}))\n\nfunction tabClass(tab: GrTab): string {\n return grTabsTabClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n active: tab.value === props.modelValue,\n disabled: Boolean(tab.disabled),\n })\n}\n\nconst badgeClass = computed(() => grTabsBadgeClass(resolvedSize.value))\nconst closeClass = computed(() => grTabsCloseClass(resolvedSize.value))\nconst closeIconClass = computed(() => tabCloseIconSizes[resolvedSize.value])\nconst emptyClass = computed(() => grTabsEmptyClass(resolvedSize.value))\n\nconst isEmpty = computed(() => props.tabs.length === 0)\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.tabs.empty', 'Nothing here yet'))\nconst closeTitle = computed(() => t('gr.tabs.close', 'Close tab'))\n\n/** Отключённая вкладка не принимает взаимодействия, а закрытие — тоже взаимодействие. */\nfunction isClosable(tab: GrTab): boolean {\n return !tab.disabled && (tab.closable ?? props.closable)\n}\n\nconst buttonRefs = ref<HTMLButtonElement[]>([])\n\n/**\n * Vue зовёт ref-функцию с `null`, когда узел исчез. Игнорировать такой вызов\n * нельзя: в массиве оставались отсоединённые от DOM кнопки, и `focus()` по\n * сократившемуся списку молча проваливался в `<body>`.\n */\nfunction setButtonRef(el: unknown, index: number): void {\n if (el instanceof HTMLButtonElement)\n buttonRefs.value[index] = el\n else\n delete buttonRefs.value[index]\n\n if (buttonRefs.value.length > props.tabs.length)\n buttonRefs.value.length = props.tabs.length\n}\n\nconst activeIndex = computed(() => props.tabs.findIndex(t => t.value === props.modelValue))\n\nfunction isEnabled(tab: GrTab): boolean {\n return !tab.disabled\n}\n\nconst tabIndexes = computed(() => props.tabs.map((_, index) => index))\n\n/**\n * Кольцо roving-фокуса. При `activationMode: 'manual'` фокус уезжает вперёд\n * выбора — это и есть разница между `activeKey` примитива и `initialKey`:\n * первый ведёт фокус, второй подставляет выбранную вкладку, пока фокус не\n * трогали.\n *\n * Выбор стрелка **не** переносит: этим заведует `onKeydown` по\n * `activationMode`. Через `onMove` это выразить нельзя — клик тоже зовёт\n * `focusKey`, и выбор эмитился бы дважды.\n */\nconst roving = useRovingFocus<number>({\n items: () => tabIndexes.value,\n elementFor: index => buttonRefs.value[index],\n isDisabled: index => Boolean(props.tabs[index]?.disabled),\n orientation: () => (props.orientation === 'vertical' ? 'vertical' : 'horizontal'),\n skipDisabled: () => true,\n /**\n * Пока фокус не трогали, остановку `Tab` держит выбранная вкладка. Если\n * `modelValue` не совпал ни с одной (пустое начальное значение, асинхронный\n * список, удалённая активная вкладка), примитив ставит её на первую\n * доступную — иначе tablist выпал бы из обхода целиком и молча.\n *\n * Выключенность здесь не проверяется намеренно: на кнопке `aria-disabled`, а\n * не нативный `disabled`, поэтому выключенная вкладка фокусируется и держать\n * остановку вправе.\n */\n initialKey: () => (activeIndex.value >= 0 ? activeIndex.value : undefined),\n /**\n * Прокрутка до фокуса, а не после: иначе браузер доскроллит сам по-своему, и\n * ряд дёрнется дважды. Синхронно — фокус обязан остаться в том же такте, что\n * и раньше: тик, где он нужен, добавляет `focusIndex`.\n */\n beforeFocus: index => scrollIntoView(index),\n})\n\n/**\n * Фокус после перерисовки — для путей, где список только что изменился\n * (закрытие вкладки). Клавиатура идёт через примитив напрямую: там ряд уже\n * отрисован, и лишний тик только отложил бы фокус.\n */\nasync function focusIndex(index: number): Promise<void> {\n await nextTick()\n await roving.focusKey(index)\n}\n\n/**\n * Ряд прокручивается, а не переносится, поэтому активная вкладка может уехать\n * за край — например, когда её выбрали снаружи. `scrollIntoView` нет в jsdom и\n * в старых движках, поэтому вызов необязательный.\n */\nfunction scrollIntoView(index: number): void {\n buttonRefs.value[index]?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n}\n\nwatch(() => props.modelValue, async () => {\n await nextTick()\n if (activeIndex.value >= 0)\n scrollIntoView(activeIndex.value)\n})\n\nasync function selectByIndex(index: number, focus = false): Promise<void> {\n const tab = props.tabs[index]\n if (!tab || !isEnabled(tab))\n return\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n if (focus)\n await focusIndex(index)\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (props.tabs.length === 0)\n return\n\n const currentIndex = roving.rovingKey.value ?? 0\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n // В ручном режиме выбор подтверждается явно — на той вкладке, где фокус.\n if (props.activationMode === 'manual') {\n event.preventDefault()\n void selectByIndex(currentIndex, false)\n }\n return\n case 'Delete':\n case 'Backspace': {\n // Единственный клавиатурный путь к закрытию: крестик в таб-порядке не стоит.\n const tab = props.tabs[currentIndex]\n if (tab && isClosable(tab)) {\n event.preventDefault()\n requestClose(currentIndex)\n }\n return\n }\n }\n\n // Стрелки, `Home`, `End` — фокус ведёт примитив по объявленной ориентации.\n if (!roving.handleNavigationKeys(event))\n return\n\n // `automatic`: выбор едет за фокусом. `manual`: ждёт `Enter`/`Space`.\n if (props.activationMode !== 'manual')\n void selectByIndex(roving.rovingKey.value ?? currentIndex, false)\n}\n\n/**\n * Закрытая вкладка, которая держала фокус. Компонент список не укорачивает —\n * это делает потребитель, — поэтому фокус возвращается только после того, как\n * `tabs` действительно стал короче.\n */\nlet pendingClose: { index: number, value: string } | null = null\n\nfunction requestClose(index: number): void {\n const tab = props.tabs[index]\n if (!tab || !isClosable(tab))\n return\n\n const held = buttonRefs.value[index] === document.activeElement\n pendingClose = held ? { index, value: tab.value } : null\n\n emit('close', tab.value)\n}\n\n// Без этого клавиатурное закрытие роняет фокус в `<body>`: кнопка, на которой\n// он стоял, исчезает из DOM вместе со вкладкой.\nwatch(() => props.tabs.length, async (next, prev) => {\n const pending = pendingClose\n pendingClose = null\n\n if (!pending || next >= prev)\n return\n // Ушла не та вкладка — потребитель поменял список по своей причине.\n if (props.tabs.some(tab => tab.value === pending.value))\n return\n\n await nextTick()\n\n const target = Math.min(pending.index, next - 1)\n if (target >= 0)\n void focusIndex(target)\n else\n roving.reset()\n})\n\nfunction onClick(event: MouseEvent, tab: GrTab, index: number): void {\n if (!isEnabled(tab))\n return\n\n // Крестик — не кнопка, поэтому его клик приходит сюда же и разбирается по цели.\n if (event.target instanceof Element && event.target.closest('[data-gr-tab-close]')) {\n requestClose(index)\n return\n }\n\n roving.setActive(index)\n\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n}\n</script>\n\n<template>\n <!--\n Пустой ряд — не пустой `tablist`: роль обязана владеть потомками `tab`,\n и текст внутри неё был бы нарушением, а не пустым состоянием.\n -->\n <div v-if=\"isEmpty\" data-gr-tabs-empty :class=\"emptyClass\">\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div\n v-else\n role=\"tablist\"\n data-gr-tabs\n :aria-orientation=\"orientation\"\n :class=\"tablistClass\"\n @keydown=\"onKeydown\"\n >\n <button\n v-for=\"(tab, index) in tabs\"\n :id=\"idBase ? `${idBase}-tab-${tab.value}` : undefined\"\n :key=\"tab.value\"\n :ref=\"el => setButtonRef(el, index)\"\n type=\"button\"\n role=\"tab\"\n data-gr-tab\n :aria-controls=\"idBase ? `${idBase}-panel-${tab.value}` : undefined\"\n :aria-selected=\"tab.value === modelValue ? 'true' : 'false'\"\n :aria-disabled=\"tab.disabled ? 'true' : undefined\"\n :aria-keyshortcuts=\"isClosable(tab) ? 'Delete' : undefined\"\n :tabindex=\"roving.tabindexFor(index)\"\n :class=\"tabClass(tab)\"\n @click=\"onClick($event, tab, index)\"\n >\n <span :class=\"tabContentClass\">\n <slot\n name=\"tab\"\n :tab=\"tab\"\n :active=\"tab.value === modelValue\"\n :disabled=\"Boolean(tab.disabled)\"\n >\n <component\n :is=\"iconTag(tab.icon)\"\n v-if=\"tab.icon\"\n :class=\"[tabIconClass, iconClass(tab.icon)]\"\n aria-hidden=\"true\"\n />\n <span>{{ tab.label }}</span>\n <span v-if=\"tab.badge\" :class=\"badgeClass\">\n {{ tab.badge }}\n </span>\n </slot>\n\n <!-- Снаружи слота: своя разметка вкладки не должна отнимать закрытие. -->\n <span\n v-if=\"isClosable(tab)\"\n data-gr-tab-close\n :class=\"closeClass\"\n :title=\"closeTitle\"\n aria-hidden=\"true\"\n >\n <IconX :class=\"closeIconClass\" />\n </span>\n </span>\n </button>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GrTabs-CBHZkOFY.js","names":[],"sources":["../../../../src/components/GrTabs/GrTabs.vue","../../../../src/components/GrTabs/GrTabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch, type Component } from 'vue'\n\nimport IconX from '~icons/lucide/x'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { iconClass, iconTag } from '../shared/icon'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport {\n grTabsBadgeClass,\n grTabsCloseClass,\n grTabsEmptyClass,\n grTabsListClass,\n grTabsTabClass,\n tabCloseIconSizes,\n tabContentClass,\n tabIconClass,\n type GrTabsOrientation,\n type GrTabsSize,\n type GrTabsVariant,\n} from './grTabsStyles'\n\nexport interface GrTab {\n value: string\n label: string\n badge?: string\n /**\n * Иконка слева от подписи: Vue-компонент либо класс иконки вашей UnoCSS-сборки\n * (`'i-lucide-user'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`).\n */\n icon?: string | Component\n disabled?: boolean\n /** Перекрывает `closable` ряда в обе стороны: закрепить вкладку или закрыть одну её. */\n closable?: boolean\n}\n\nexport interface GrTabsProps {\n modelValue: string\n tabs: GrTab[]\n /**\n * База id для ARIA-связки с `GrTabPanels`. Если задана, каждая вкладка\n * получает `id=\"<idBase>-tab-<value>\"` и `aria-controls=\"<idBase>-panel-<value>\"`.\n * Передайте тот же `idBase` в `GrTabPanels`, чтобы связать `tab`↔`tabpanel`.\n */\n idBase?: string\n size?: GrTabsSize\n /** Вид ряда: обойма с таблетками или ряд с подчёркиванием. */\n variant?: GrTabsVariant\n /**\n * `automatic` (по умолчанию) — стрелка сразу переключает вкладку;\n * `manual` — стрелка двигает только фокус, выбор подтверждается\n * `Enter`/`Space`. Второй режим для вкладок с тяжёлой загрузкой: перебор\n * стрелками иначе тянет каждую панель.\n */\n activationMode?: GrTabsActivationMode\n /** Горизонтальный (по умолчанию) или вертикальный список вкладок. */\n orientation?: GrTabsOrientation\n /**\n * Крестик на вкладках и закрытие по `Delete`/`Backspace`. Точечно снимается\n * `closable: false` у самой вкладки.\n */\n closable?: boolean\n /** Текст, когда список вкладок пуст. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrTabsEmits {\n (e: 'update:modelValue', value: string): void\n /**\n * Просьба закрыть вкладку. Компонент список не трогает: `tabs` — проп, и\n * закрытие может не состояться («сохранить изменения?»).\n */\n (e: 'close', value: string): void\n}\n\nexport type GrTabsActivationMode = 'automatic' | 'manual'\n\nexport type { GrTabsOrientation, GrTabsVariant } from './grTabsStyles'\n\n/**\n * GrTabs — горизонтальная группа вкладок с паттерном WAI-ARIA `tablist`.\n *\n * A11y:\n * - `role=\"tablist\"` на корне, `role=\"tab\"` на каждой вкладке.\n * - Roving `tabindex`: активная вкладка `0`, остальные `-1`.\n * - Клавиатура: `ArrowLeft`/`ArrowRight` — цикличный переход, `Home`/`End` — к первой/последней.\n * - При переключении стрелками DOM-фокус программно переносится на новую вкладку.\n *\n * Сам компонент не рендерит `tabpanel` — это ответственность консьюмера (по `aria-controls`/внешней разметке).\n */\nconst props = withDefaults(defineProps<GrTabsProps>(), {\n idBase: undefined,\n size: undefined,\n // Дефолт живёт в резолвере: Vue подставил бы свой раньше, чем компонент\n // заглянет в `GrConfigProvider`.\n variant: undefined,\n activationMode: 'automatic',\n orientation: 'horizontal',\n closable: false,\n emptyText: undefined,\n})\n\ndefineSlots<{\n /** Содержимое вкладки целиком — вместо подписи, иконки и счётчика. Крестик остаётся. */\n tab?: (props: { tab: GrTab, active: boolean, disabled: boolean }) => unknown\n /** Пустой ряд — вместо текста из локали. */\n empty?: () => unknown\n}>()\n\nconst emit = defineEmits<GrTabsEmits>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTabs' })\nconst resolvedVariant = useGrComponentProp('GrTabs', 'variant', () => props.variant, 'pills')\n\nconst tablistClass = computed(() => grTabsListClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n orientation: props.orientation,\n}))\n\nfunction tabClass(tab: GrTab): string {\n return grTabsTabClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n active: tab.value === props.modelValue,\n disabled: Boolean(tab.disabled),\n })\n}\n\nconst badgeClass = computed(() => grTabsBadgeClass(resolvedSize.value))\nconst closeClass = computed(() => grTabsCloseClass(resolvedSize.value))\nconst closeIconClass = computed(() => tabCloseIconSizes[resolvedSize.value])\nconst emptyClass = computed(() => grTabsEmptyClass(resolvedSize.value))\n\nconst isEmpty = computed(() => props.tabs.length === 0)\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.tabs.empty', 'Nothing here yet'))\nconst closeTitle = computed(() => t('gr.tabs.close', 'Close tab'))\n\n/** Отключённая вкладка не принимает взаимодействия, а закрытие — тоже взаимодействие. */\nfunction isClosable(tab: GrTab): boolean {\n return !tab.disabled && (tab.closable ?? props.closable)\n}\n\nconst buttonRefs = ref<HTMLButtonElement[]>([])\n\n/**\n * Vue зовёт ref-функцию с `null`, когда узел исчез. Игнорировать такой вызов\n * нельзя: в массиве оставались отсоединённые от DOM кнопки, и `focus()` по\n * сократившемуся списку молча проваливался в `<body>`.\n */\nfunction setButtonRef(el: unknown, index: number): void {\n if (el instanceof HTMLButtonElement)\n buttonRefs.value[index] = el\n else\n delete buttonRefs.value[index]\n\n if (buttonRefs.value.length > props.tabs.length)\n buttonRefs.value.length = props.tabs.length\n}\n\nconst activeIndex = computed(() => props.tabs.findIndex(t => t.value === props.modelValue))\n\nfunction isEnabled(tab: GrTab): boolean {\n return !tab.disabled\n}\n\nconst tabIndexes = computed(() => props.tabs.map((_, index) => index))\n\n/**\n * Кольцо roving-фокуса. При `activationMode: 'manual'` фокус уезжает вперёд\n * выбора — это и есть разница между `activeKey` примитива и `initialKey`:\n * первый ведёт фокус, второй подставляет выбранную вкладку, пока фокус не\n * трогали.\n *\n * Выбор стрелка **не** переносит: этим заведует `onKeydown` по\n * `activationMode`. Через `onMove` это выразить нельзя — клик тоже зовёт\n * `focusKey`, и выбор эмитился бы дважды.\n */\nconst roving = useRovingFocus<number>({\n items: () => tabIndexes.value,\n elementFor: index => buttonRefs.value[index],\n isDisabled: index => Boolean(props.tabs[index]?.disabled),\n orientation: () => (props.orientation === 'vertical' ? 'vertical' : 'horizontal'),\n skipDisabled: () => true,\n /**\n * Пока фокус не трогали, остановку `Tab` держит выбранная вкладка. Если\n * `modelValue` не совпал ни с одной (пустое начальное значение, асинхронный\n * список, удалённая активная вкладка), примитив ставит её на первую\n * доступную — иначе tablist выпал бы из обхода целиком и молча.\n *\n * Выключенность здесь не проверяется намеренно: на кнопке `aria-disabled`, а\n * не нативный `disabled`, поэтому выключенная вкладка фокусируется и держать\n * остановку вправе.\n */\n initialKey: () => (activeIndex.value >= 0 ? activeIndex.value : undefined),\n /**\n * Прокрутка до фокуса, а не после: иначе браузер доскроллит сам по-своему, и\n * ряд дёрнется дважды. Синхронно — фокус обязан остаться в том же такте, что\n * и раньше: тик, где он нужен, добавляет `focusIndex`.\n */\n beforeFocus: index => scrollIntoView(index),\n})\n\n/**\n * Фокус после перерисовки — для путей, где список только что изменился\n * (закрытие вкладки). Клавиатура идёт через примитив напрямую: там ряд уже\n * отрисован, и лишний тик только отложил бы фокус.\n */\nasync function focusIndex(index: number): Promise<void> {\n await nextTick()\n await roving.focusKey(index)\n}\n\n/**\n * Ряд прокручивается, а не переносится, поэтому активная вкладка может уехать\n * за край — например, когда её выбрали снаружи. `scrollIntoView` нет в jsdom и\n * в старых движках, поэтому вызов необязательный.\n */\nfunction scrollIntoView(index: number): void {\n buttonRefs.value[index]?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n}\n\nwatch(() => props.modelValue, async () => {\n await nextTick()\n if (activeIndex.value >= 0)\n scrollIntoView(activeIndex.value)\n})\n\nasync function selectByIndex(index: number, focus = false): Promise<void> {\n const tab = props.tabs[index]\n if (!tab || !isEnabled(tab))\n return\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n if (focus)\n await focusIndex(index)\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (props.tabs.length === 0)\n return\n\n const currentIndex = roving.rovingKey.value ?? 0\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n // В ручном режиме выбор подтверждается явно — на той вкладке, где фокус.\n if (props.activationMode === 'manual') {\n event.preventDefault()\n void selectByIndex(currentIndex, false)\n }\n return\n case 'Delete':\n case 'Backspace': {\n // Единственный клавиатурный путь к закрытию: крестик в таб-порядке не стоит.\n const tab = props.tabs[currentIndex]\n if (tab && isClosable(tab)) {\n event.preventDefault()\n requestClose(currentIndex)\n }\n return\n }\n }\n\n // Стрелки, `Home`, `End` — фокус ведёт примитив по объявленной ориентации.\n if (!roving.handleNavigationKeys(event))\n return\n\n // `automatic`: выбор едет за фокусом. `manual`: ждёт `Enter`/`Space`.\n if (props.activationMode !== 'manual')\n void selectByIndex(roving.rovingKey.value ?? currentIndex, false)\n}\n\n/**\n * Закрытая вкладка, которая держала фокус. Компонент список не укорачивает —\n * это делает потребитель, — поэтому фокус возвращается только после того, как\n * `tabs` действительно стал короче.\n */\nlet pendingClose: { index: number, value: string } | null = null\n\nfunction requestClose(index: number): void {\n const tab = props.tabs[index]\n if (!tab || !isClosable(tab))\n return\n\n const held = buttonRefs.value[index] === document.activeElement\n pendingClose = held ? { index, value: tab.value } : null\n\n emit('close', tab.value)\n}\n\n// Без этого клавиатурное закрытие роняет фокус в `<body>`: кнопка, на которой\n// он стоял, исчезает из DOM вместе со вкладкой.\nwatch(() => props.tabs.length, async (next, prev) => {\n const pending = pendingClose\n pendingClose = null\n\n if (!pending || next >= prev)\n return\n // Ушла не та вкладка — потребитель поменял список по своей причине.\n if (props.tabs.some(tab => tab.value === pending.value))\n return\n\n await nextTick()\n\n const target = Math.min(pending.index, next - 1)\n if (target >= 0)\n void focusIndex(target)\n else\n roving.reset()\n})\n\nfunction onClick(event: MouseEvent, tab: GrTab, index: number): void {\n if (!isEnabled(tab))\n return\n\n // Крестик — не кнопка, поэтому его клик приходит сюда же и разбирается по цели.\n if (event.target instanceof Element && event.target.closest('[data-gr-tab-close]')) {\n requestClose(index)\n return\n }\n\n roving.setActive(index)\n\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n}\n</script>\n\n<template>\n <!--\n Пустой ряд — не пустой `tablist`: роль обязана владеть потомками `tab`,\n и текст внутри неё был бы нарушением, а не пустым состоянием.\n -->\n <div v-if=\"isEmpty\" data-gr-tabs-empty :class=\"emptyClass\">\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div\n v-else\n role=\"tablist\"\n data-gr-tabs\n :aria-orientation=\"orientation\"\n :class=\"tablistClass\"\n @keydown=\"onKeydown\"\n >\n <button\n v-for=\"(tab, index) in tabs\"\n :id=\"idBase ? `${idBase}-tab-${tab.value}` : undefined\"\n :key=\"tab.value\"\n :ref=\"el => setButtonRef(el, index)\"\n type=\"button\"\n role=\"tab\"\n data-gr-tab\n :aria-controls=\"idBase ? `${idBase}-panel-${tab.value}` : undefined\"\n :aria-selected=\"tab.value === modelValue ? 'true' : 'false'\"\n :aria-disabled=\"tab.disabled ? 'true' : undefined\"\n :aria-keyshortcuts=\"isClosable(tab) ? 'Delete' : undefined\"\n :tabindex=\"roving.tabindexFor(index)\"\n :class=\"tabClass(tab)\"\n @click=\"onClick($event, tab, index)\"\n >\n <span :class=\"tabContentClass\">\n <slot\n name=\"tab\"\n :tab=\"tab\"\n :active=\"tab.value === modelValue\"\n :disabled=\"Boolean(tab.disabled)\"\n >\n <component\n :is=\"iconTag(tab.icon)\"\n v-if=\"tab.icon\"\n :class=\"[tabIconClass, iconClass(tab.icon)]\"\n aria-hidden=\"true\"\n />\n <span>{{ tab.label }}</span>\n <span v-if=\"tab.badge\" :class=\"badgeClass\">\n {{ tab.badge }}\n </span>\n </slot>\n\n <!-- Снаружи слота: своя разметка вкладки не должна отнимать закрытие. -->\n <span\n v-if=\"isClosable(tab)\"\n data-gr-tab-close\n :class=\"closeClass\"\n :title=\"closeTitle\"\n aria-hidden=\"true\"\n >\n <IconX :class=\"closeIconClass\" />\n </span>\n </span>\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch, type Component } from 'vue'\n\nimport IconX from '~icons/lucide/x'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { iconClass, iconTag } from '../shared/icon'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport {\n grTabsBadgeClass,\n grTabsCloseClass,\n grTabsEmptyClass,\n grTabsListClass,\n grTabsTabClass,\n tabCloseIconSizes,\n tabContentClass,\n tabIconClass,\n type GrTabsOrientation,\n type GrTabsSize,\n type GrTabsVariant,\n} from './grTabsStyles'\n\nexport interface GrTab {\n value: string\n label: string\n badge?: string\n /**\n * Иконка слева от подписи: Vue-компонент либо класс иконки вашей UnoCSS-сборки\n * (`'i-lucide-user'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`).\n */\n icon?: string | Component\n disabled?: boolean\n /** Перекрывает `closable` ряда в обе стороны: закрепить вкладку или закрыть одну её. */\n closable?: boolean\n}\n\nexport interface GrTabsProps {\n modelValue: string\n tabs: GrTab[]\n /**\n * База id для ARIA-связки с `GrTabPanels`. Если задана, каждая вкладка\n * получает `id=\"<idBase>-tab-<value>\"` и `aria-controls=\"<idBase>-panel-<value>\"`.\n * Передайте тот же `idBase` в `GrTabPanels`, чтобы связать `tab`↔`tabpanel`.\n */\n idBase?: string\n size?: GrTabsSize\n /** Вид ряда: обойма с таблетками или ряд с подчёркиванием. */\n variant?: GrTabsVariant\n /**\n * `automatic` (по умолчанию) — стрелка сразу переключает вкладку;\n * `manual` — стрелка двигает только фокус, выбор подтверждается\n * `Enter`/`Space`. Второй режим для вкладок с тяжёлой загрузкой: перебор\n * стрелками иначе тянет каждую панель.\n */\n activationMode?: GrTabsActivationMode\n /** Горизонтальный (по умолчанию) или вертикальный список вкладок. */\n orientation?: GrTabsOrientation\n /**\n * Крестик на вкладках и закрытие по `Delete`/`Backspace`. Точечно снимается\n * `closable: false` у самой вкладки.\n */\n closable?: boolean\n /** Текст, когда список вкладок пуст. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrTabsEmits {\n (e: 'update:modelValue', value: string): void\n /**\n * Просьба закрыть вкладку. Компонент список не трогает: `tabs` — проп, и\n * закрытие может не состояться («сохранить изменения?»).\n */\n (e: 'close', value: string): void\n}\n\nexport type GrTabsActivationMode = 'automatic' | 'manual'\n\nexport type { GrTabsOrientation, GrTabsVariant } from './grTabsStyles'\n\n/**\n * GrTabs — горизонтальная группа вкладок с паттерном WAI-ARIA `tablist`.\n *\n * A11y:\n * - `role=\"tablist\"` на корне, `role=\"tab\"` на каждой вкладке.\n * - Roving `tabindex`: активная вкладка `0`, остальные `-1`.\n * - Клавиатура: `ArrowLeft`/`ArrowRight` — цикличный переход, `Home`/`End` — к первой/последней.\n * - При переключении стрелками DOM-фокус программно переносится на новую вкладку.\n *\n * Сам компонент не рендерит `tabpanel` — это ответственность консьюмера (по `aria-controls`/внешней разметке).\n */\nconst props = withDefaults(defineProps<GrTabsProps>(), {\n idBase: undefined,\n size: undefined,\n // Дефолт живёт в резолвере: Vue подставил бы свой раньше, чем компонент\n // заглянет в `GrConfigProvider`.\n variant: undefined,\n activationMode: 'automatic',\n orientation: 'horizontal',\n closable: false,\n emptyText: undefined,\n})\n\ndefineSlots<{\n /** Содержимое вкладки целиком — вместо подписи, иконки и счётчика. Крестик остаётся. */\n tab?: (props: { tab: GrTab, active: boolean, disabled: boolean }) => unknown\n /** Пустой ряд — вместо текста из локали. */\n empty?: () => unknown\n}>()\n\nconst emit = defineEmits<GrTabsEmits>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTabs' })\nconst resolvedVariant = useGrComponentProp('GrTabs', 'variant', () => props.variant, 'pills')\n\nconst tablistClass = computed(() => grTabsListClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n orientation: props.orientation,\n}))\n\nfunction tabClass(tab: GrTab): string {\n return grTabsTabClass({\n variant: resolvedVariant.value,\n size: resolvedSize.value,\n active: tab.value === props.modelValue,\n disabled: Boolean(tab.disabled),\n })\n}\n\nconst badgeClass = computed(() => grTabsBadgeClass(resolvedSize.value))\nconst closeClass = computed(() => grTabsCloseClass(resolvedSize.value))\nconst closeIconClass = computed(() => tabCloseIconSizes[resolvedSize.value])\nconst emptyClass = computed(() => grTabsEmptyClass(resolvedSize.value))\n\nconst isEmpty = computed(() => props.tabs.length === 0)\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.tabs.empty', 'Nothing here yet'))\nconst closeTitle = computed(() => t('gr.tabs.close', 'Close tab'))\n\n/** Отключённая вкладка не принимает взаимодействия, а закрытие — тоже взаимодействие. */\nfunction isClosable(tab: GrTab): boolean {\n return !tab.disabled && (tab.closable ?? props.closable)\n}\n\nconst buttonRefs = ref<HTMLButtonElement[]>([])\n\n/**\n * Vue зовёт ref-функцию с `null`, когда узел исчез. Игнорировать такой вызов\n * нельзя: в массиве оставались отсоединённые от DOM кнопки, и `focus()` по\n * сократившемуся списку молча проваливался в `<body>`.\n */\nfunction setButtonRef(el: unknown, index: number): void {\n if (el instanceof HTMLButtonElement)\n buttonRefs.value[index] = el\n else\n delete buttonRefs.value[index]\n\n if (buttonRefs.value.length > props.tabs.length)\n buttonRefs.value.length = props.tabs.length\n}\n\nconst activeIndex = computed(() => props.tabs.findIndex(t => t.value === props.modelValue))\n\nfunction isEnabled(tab: GrTab): boolean {\n return !tab.disabled\n}\n\nconst tabIndexes = computed(() => props.tabs.map((_, index) => index))\n\n/**\n * Кольцо roving-фокуса. При `activationMode: 'manual'` фокус уезжает вперёд\n * выбора — это и есть разница между `activeKey` примитива и `initialKey`:\n * первый ведёт фокус, второй подставляет выбранную вкладку, пока фокус не\n * трогали.\n *\n * Выбор стрелка **не** переносит: этим заведует `onKeydown` по\n * `activationMode`. Через `onMove` это выразить нельзя — клик тоже зовёт\n * `focusKey`, и выбор эмитился бы дважды.\n */\nconst roving = useRovingFocus<number>({\n items: () => tabIndexes.value,\n elementFor: index => buttonRefs.value[index],\n isDisabled: index => Boolean(props.tabs[index]?.disabled),\n orientation: () => (props.orientation === 'vertical' ? 'vertical' : 'horizontal'),\n skipDisabled: () => true,\n /**\n * Пока фокус не трогали, остановку `Tab` держит выбранная вкладка. Если\n * `modelValue` не совпал ни с одной (пустое начальное значение, асинхронный\n * список, удалённая активная вкладка), примитив ставит её на первую\n * доступную — иначе tablist выпал бы из обхода целиком и молча.\n *\n * Выключенность здесь не проверяется намеренно: на кнопке `aria-disabled`, а\n * не нативный `disabled`, поэтому выключенная вкладка фокусируется и держать\n * остановку вправе.\n */\n initialKey: () => (activeIndex.value >= 0 ? activeIndex.value : undefined),\n /**\n * Прокрутка до фокуса, а не после: иначе браузер доскроллит сам по-своему, и\n * ряд дёрнется дважды. Синхронно — фокус обязан остаться в том же такте, что\n * и раньше: тик, где он нужен, добавляет `focusIndex`.\n */\n beforeFocus: index => scrollIntoView(index),\n})\n\n/**\n * Фокус после перерисовки — для путей, где список только что изменился\n * (закрытие вкладки). Клавиатура идёт через примитив напрямую: там ряд уже\n * отрисован, и лишний тик только отложил бы фокус.\n */\nasync function focusIndex(index: number): Promise<void> {\n await nextTick()\n await roving.focusKey(index)\n}\n\n/**\n * Ряд прокручивается, а не переносится, поэтому активная вкладка может уехать\n * за край — например, когда её выбрали снаружи. `scrollIntoView` нет в jsdom и\n * в старых движках, поэтому вызов необязательный.\n */\nfunction scrollIntoView(index: number): void {\n buttonRefs.value[index]?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n}\n\nwatch(() => props.modelValue, async () => {\n await nextTick()\n if (activeIndex.value >= 0)\n scrollIntoView(activeIndex.value)\n})\n\nasync function selectByIndex(index: number, focus = false): Promise<void> {\n const tab = props.tabs[index]\n if (!tab || !isEnabled(tab))\n return\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n if (focus)\n await focusIndex(index)\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (props.tabs.length === 0)\n return\n\n const currentIndex = roving.rovingKey.value ?? 0\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n // В ручном режиме выбор подтверждается явно — на той вкладке, где фокус.\n if (props.activationMode === 'manual') {\n event.preventDefault()\n void selectByIndex(currentIndex, false)\n }\n return\n case 'Delete':\n case 'Backspace': {\n // Единственный клавиатурный путь к закрытию: крестик в таб-порядке не стоит.\n const tab = props.tabs[currentIndex]\n if (tab && isClosable(tab)) {\n event.preventDefault()\n requestClose(currentIndex)\n }\n return\n }\n }\n\n // Стрелки, `Home`, `End` — фокус ведёт примитив по объявленной ориентации.\n if (!roving.handleNavigationKeys(event))\n return\n\n // `automatic`: выбор едет за фокусом. `manual`: ждёт `Enter`/`Space`.\n if (props.activationMode !== 'manual')\n void selectByIndex(roving.rovingKey.value ?? currentIndex, false)\n}\n\n/**\n * Закрытая вкладка, которая держала фокус. Компонент список не укорачивает —\n * это делает потребитель, — поэтому фокус возвращается только после того, как\n * `tabs` действительно стал короче.\n */\nlet pendingClose: { index: number, value: string } | null = null\n\nfunction requestClose(index: number): void {\n const tab = props.tabs[index]\n if (!tab || !isClosable(tab))\n return\n\n const held = buttonRefs.value[index] === document.activeElement\n pendingClose = held ? { index, value: tab.value } : null\n\n emit('close', tab.value)\n}\n\n// Без этого клавиатурное закрытие роняет фокус в `<body>`: кнопка, на которой\n// он стоял, исчезает из DOM вместе со вкладкой.\nwatch(() => props.tabs.length, async (next, prev) => {\n const pending = pendingClose\n pendingClose = null\n\n if (!pending || next >= prev)\n return\n // Ушла не та вкладка — потребитель поменял список по своей причине.\n if (props.tabs.some(tab => tab.value === pending.value))\n return\n\n await nextTick()\n\n const target = Math.min(pending.index, next - 1)\n if (target >= 0)\n void focusIndex(target)\n else\n roving.reset()\n})\n\nfunction onClick(event: MouseEvent, tab: GrTab, index: number): void {\n if (!isEnabled(tab))\n return\n\n // Крестик — не кнопка, поэтому его клик приходит сюда же и разбирается по цели.\n if (event.target instanceof Element && event.target.closest('[data-gr-tab-close]')) {\n requestClose(index)\n return\n }\n\n roving.setActive(index)\n\n if (tab.value !== props.modelValue)\n emit('update:modelValue', tab.value)\n}\n</script>\n\n<template>\n <!--\n Пустой ряд — не пустой `tablist`: роль обязана владеть потомками `tab`,\n и текст внутри неё был бы нарушением, а не пустым состоянием.\n -->\n <div v-if=\"isEmpty\" data-gr-tabs-empty :class=\"emptyClass\">\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div\n v-else\n role=\"tablist\"\n data-gr-tabs\n :aria-orientation=\"orientation\"\n :class=\"tablistClass\"\n @keydown=\"onKeydown\"\n >\n <button\n v-for=\"(tab, index) in tabs\"\n :id=\"idBase ? `${idBase}-tab-${tab.value}` : undefined\"\n :key=\"tab.value\"\n :ref=\"el => setButtonRef(el, index)\"\n type=\"button\"\n role=\"tab\"\n data-gr-tab\n :aria-controls=\"idBase ? `${idBase}-panel-${tab.value}` : undefined\"\n :aria-selected=\"tab.value === modelValue ? 'true' : 'false'\"\n :aria-disabled=\"tab.disabled ? 'true' : undefined\"\n :aria-keyshortcuts=\"isClosable(tab) ? 'Delete' : undefined\"\n :tabindex=\"roving.tabindexFor(index)\"\n :class=\"tabClass(tab)\"\n @click=\"onClick($event, tab, index)\"\n >\n <span :class=\"tabContentClass\">\n <slot\n name=\"tab\"\n :tab=\"tab\"\n :active=\"tab.value === modelValue\"\n :disabled=\"Boolean(tab.disabled)\"\n >\n <component\n :is=\"iconTag(tab.icon)\"\n v-if=\"tab.icon\"\n :class=\"[tabIconClass, iconClass(tab.icon)]\"\n aria-hidden=\"true\"\n />\n <span>{{ tab.label }}</span>\n <span v-if=\"tab.badge\" :class=\"badgeClass\">\n {{ tab.badge }}\n </span>\n </slot>\n\n <!-- Снаружи слота: своя разметка вкладки не должна отнимать закрытие. -->\n <span\n v-if=\"isClosable(tab)\"\n data-gr-tab-close\n :class=\"closeClass\"\n :title=\"closeTitle\"\n aria-hidden=\"true\"\n >\n <IconX :class=\"closeIconClass\" />\n </span>\n </span>\n </button>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { n as grTabsSafelist, r as GR_TABS_VARIANTS, t as grTabsConfig } from "../../chunks/config-_qPUfb6-2.js";
2
- import { t as GrTabs_default } from "./chunks/GrTabs-f3-oQenu.js";
3
- export { GR_TABS_VARIANTS, GrTabs_default as GrTabs, GrTabs_default as default, grTabsConfig, grTabsSafelist };
1
+ import { n as grTabsSafelist, t as grTabsConfig } from "../../chunks/config-DWN4x6_e.js";
2
+ import { t as GrTabs_default } from "./chunks/GrTabs-CBHZkOFY.js";
3
+ export { GrTabs_default as GrTabs, GrTabs_default as default, grTabsConfig, grTabsSafelist };
@@ -1,5 +1,5 @@
1
1
  import { t as x_default } from "../../../chunks/x-2KXnqxiD.js";
2
- import { a as useGrComponentProp, o as useGrComponentSize } from "../../../chunks/context-BSYR7RZs.js";
2
+ import { a as useGrComponentSize, i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
3
3
  import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
4
4
  import { vAutosize } from "../../../directives/autosize.js";
5
5
  import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
@@ -1 +1 @@
1
- {"version":3,"file":"GrTextarea-DSvd1nSy.js","names":["$attrs"],"sources":["../../../../src/components/GrTextarea/GrTextarea.vue","../../../../src/components/GrTextarea/GrTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrTextarea — многострочное поле ввода GR-примитива.\n *\n * Состояния:\n * - `state`: визуальный оттенок рамки (`default | success | warning | danger`).\n * - `invalid`: форсирует `danger`-состояние и проставляет `aria-invalid=\"true\"`.\n */\nimport { computed, ref, useId } from 'vue'\nimport {\n countClass,\n countRowClass,\n lineCountClass,\n disabledSurfaceClass,\n enabledSurfaceClass,\n grTextareaClass,\n resizeClass,\n sizes,\n type GrTextareaResize,\n type GrTextareaSize,\n type GrTextareaState,\n} from './grTextareaStyles'\nimport IconX from '~icons/lucide/x'\nimport { vAutosize } from '../../directives'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport interface GrTextareaProps {\n modelValue: string\n placeholder?: string\n autocomplete?: string\n disabled?: boolean\n /** Только для чтения: значение видно и уходит в форму, но не редактируется. */\n readonly?: boolean\n invalid?: boolean\n /** Обязательное поле (`aria-required`). Складывается с `required` у `GrFormField`. */\n required?: boolean\n /** Доступное имя вне `GrFormField`. */\n ariaLabel?: string\n state?: GrTextareaState\n name?: string\n id?: string\n rows?: number\n size?: GrTextareaSize\n /** Ограничение длины + основа для счётчика символов. */\n maxlength?: number\n /** Показывать счётчик символов (`len` или `len/maxlength`). */\n showCount?: boolean\n /**\n * Показывать счётчик строк. Считаются **логические** строки (переводы строки), а\n * не визуальные переносы: при `autosize` число не меняется от ширины поля.\n */\n showLineCount?: boolean\n /**\n * Ориентир по числу строк для счётчика (`3 / 10`). Ввод не ограничивает: обрезать\n * набранный текст за пользователя компонент не вправе.\n */\n maxLines?: number\n /** Подгонять высоту под содержимое (директива `v-autosize`). */\n autosize?: boolean\n /** Кнопка очистки значения. Настраивается через `GrConfigProvider`. */\n clearable?: boolean\n /** A11y-подпись кнопки очистки. */\n clearLabel?: string\n /** Ручное изменение размера пользователем. */\n resize?: GrTextareaResize\n}\n\nexport interface GrTextareaEmits {\n (e: 'update:modelValue', value: string): void\n /** Значение зафиксировано нативным `change` — по `blur`. */\n (e: 'change', value: string): void\n /** Значение стёрто кнопкой очистки. */\n (e: 'clear'): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrTextareaProps>(), {\n placeholder: undefined,\n autocomplete: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n ariaLabel: undefined,\n state: 'default',\n name: undefined,\n id: undefined,\n rows: 4,\n size: undefined,\n maxlength: undefined,\n showCount: false,\n autosize: false,\n clearable: undefined,\n clearLabel: undefined,\n resize: 'vertical',\n})\n\ndefineOptions({\n // Иначе атрибуты потребителя (`data-*`, `aria-*`, `name`) садятся на корень,\n // а корень со `showCount` — обёртка счётчика, а не само поле.\n inheritAttrs: false,\n})\n\nconst emit = defineEmits<GrTextareaEmits>()\n\n// Fallback из контекста `GrFormField` (id/aria-describedby/invalid/required).\nconst field = useGrFormFieldContext()\nconst resolvedId = computed(() => props.id ?? field?.id.value)\n\n// Счётчик обязан быть частью описания поля: иначе «12 / 60» видно глазами, но\n// не слышно — при том что ограничение длины и есть его смысл.\nconst countId = useId()\nconst lineCountId = useId()\nconst describedBy = computed(() =>\n [\n field?.describedById.value,\n props.showCount ? countId : undefined,\n props.showLineCount ? lineCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n)\n\n/** Обёртка нужна любому из счётчиков — и кнопке очистки. */\nconst hasCounters = computed(() => props.showCount || props.showLineCount)\n\nconst lineCount = computed(() => props.modelValue.split('\\n').length)\n\nconst countText = computed(() =>\n props.maxlength !== undefined ? `${props.modelValue.length} / ${props.maxlength}` : String(props.modelValue.length),\n)\nconst {\n disabled: isDisabled,\n invalid: isInvalid,\n required: isRequired,\n readonly: isReadonly,\n} = useGrFormControl(() => props)\n\nconst textareaEl = ref<HTMLTextAreaElement | null>(null)\n\nfunction focus(): void {\n textareaEl.value?.focus()\n}\n\nfunction blur(): void {\n textareaEl.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTextarea' })\nconst resolvedClearable = useGrComponentProp('GrTextarea', 'clearable', () => props.clearable, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.input.clear', 'Clear'))\n\n/** С `maxLines` — «3 / 10», без него — локализованная подпись с формой числа. */\nconst lineCountText = computed(() => (\n props.maxLines !== undefined\n ? `${lineCount.value} / ${props.maxLines}`\n : t('gr.textarea.lines', '{n} lines', { n: lineCount.value })\n))\n\nconst showClear = computed(() =>\n resolvedClearable.value && !isDisabled.value && !isReadonly.value && props.modelValue !== '',\n)\n\nfunction clear(): void {\n emit('update:modelValue', '')\n emit('change', '')\n emit('clear')\n focus()\n}\n\nconst baseClass = 'w-full rounded-[var(--gr-radius-control)] border text-[var(--gr-fg)] placeholder:text-[var(--gr-muted-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:cursor-not-allowed'\n\nconst className = computed(() => [\n sizes[resolvedSize.value],\n resizeClass[props.resize],\n isDisabled.value ? disabledSurfaceClass : enabledSurfaceClass,\n grTextareaClass({\n state: props.state,\n invalid: isInvalid.value,\n }),\n].join(' '))\n\n// Обе ветки шаблона (со счётчиком и без) рендерят одно и то же поле, поэтому\n// атрибуты живут одним объектом: двадцать строк копипасты расходятся молча.\nconst textareaAttrs = computed(() => ({\n id: resolvedId.value,\n 'data-gr-textarea': '',\n name: props.name,\n rows: props.rows,\n maxlength: props.maxlength,\n autocomplete: props.autocomplete,\n placeholder: props.placeholder,\n disabled: isDisabled.value,\n value: props.modelValue,\n 'aria-invalid': isInvalid.value ? ('true' as const) : undefined,\n 'aria-describedby': describedBy.value,\n 'aria-required': isRequired.value ? ('true' as const) : undefined,\n 'aria-readonly': isReadonly.value ? ('true' as const) : undefined,\n 'aria-label': props.ariaLabel,\n readonly: isReadonly.value,\n class: [baseClass, className.value],\n}))\n\nfunction onInput(e: Event): void {\n emit('update:modelValue', (e.target as HTMLTextAreaElement).value)\n}\n\n// Объявленный emit уходит из `$attrs`, поэтому нативные события переизлучаем\n// руками — иначе `@change`/`@focus`/`@blur` у потребителя перестали бы работать.\nfunction onChange(e: Event): void {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nfunction onFocus(e: FocusEvent): void {\n emit('focus', e)\n}\n\nfunction onBlur(e: FocusEvent): void {\n emit('blur', e)\n}\n</script>\n\n<template>\n <div v-if=\"hasCounters\" data-gr-textarea-wrap class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <div :class=\"countRowClass\">\n <div\n v-if=\"showLineCount\"\n :id=\"lineCountId\"\n data-gr-textarea-line-count\n :class=\"lineCountClass\"\n >\n {{ lineCountText }}\n </div>\n\n <!-- Символьный счётчик всегда прижат вправо: без счётчика строк он остаётся\n единственным в ряду, и `justify-between` его туда и отправляет. -->\n <div\n v-if=\"showCount\"\n :id=\"countId\"\n data-gr-textarea-count\n class=\"ml-auto\"\n :class=\"countClass\"\n >\n {{ countText }}\n </div>\n </div>\n </div>\n\n <!-- Обёртка появляется только под кнопку очистки: без неё поле остаётся\n корневым элементом — на этом стоит контракт fallthrough-атрибутов. -->\n <div v-else-if=\"resolvedClearable\" class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <textarea\n v-else\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrTextarea — многострочное поле ввода GR-примитива.\n *\n * Состояния:\n * - `state`: визуальный оттенок рамки (`default | success | warning | danger`).\n * - `invalid`: форсирует `danger`-состояние и проставляет `aria-invalid=\"true\"`.\n */\nimport { computed, ref, useId } from 'vue'\nimport {\n countClass,\n countRowClass,\n lineCountClass,\n disabledSurfaceClass,\n enabledSurfaceClass,\n grTextareaClass,\n resizeClass,\n sizes,\n type GrTextareaResize,\n type GrTextareaSize,\n type GrTextareaState,\n} from './grTextareaStyles'\nimport IconX from '~icons/lucide/x'\nimport { vAutosize } from '../../directives'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport interface GrTextareaProps {\n modelValue: string\n placeholder?: string\n autocomplete?: string\n disabled?: boolean\n /** Только для чтения: значение видно и уходит в форму, но не редактируется. */\n readonly?: boolean\n invalid?: boolean\n /** Обязательное поле (`aria-required`). Складывается с `required` у `GrFormField`. */\n required?: boolean\n /** Доступное имя вне `GrFormField`. */\n ariaLabel?: string\n state?: GrTextareaState\n name?: string\n id?: string\n rows?: number\n size?: GrTextareaSize\n /** Ограничение длины + основа для счётчика символов. */\n maxlength?: number\n /** Показывать счётчик символов (`len` или `len/maxlength`). */\n showCount?: boolean\n /**\n * Показывать счётчик строк. Считаются **логические** строки (переводы строки), а\n * не визуальные переносы: при `autosize` число не меняется от ширины поля.\n */\n showLineCount?: boolean\n /**\n * Ориентир по числу строк для счётчика (`3 / 10`). Ввод не ограничивает: обрезать\n * набранный текст за пользователя компонент не вправе.\n */\n maxLines?: number\n /** Подгонять высоту под содержимое (директива `v-autosize`). */\n autosize?: boolean\n /** Кнопка очистки значения. Настраивается через `GrConfigProvider`. */\n clearable?: boolean\n /** A11y-подпись кнопки очистки. */\n clearLabel?: string\n /** Ручное изменение размера пользователем. */\n resize?: GrTextareaResize\n}\n\nexport interface GrTextareaEmits {\n (e: 'update:modelValue', value: string): void\n /** Значение зафиксировано нативным `change` — по `blur`. */\n (e: 'change', value: string): void\n /** Значение стёрто кнопкой очистки. */\n (e: 'clear'): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrTextareaProps>(), {\n placeholder: undefined,\n autocomplete: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n ariaLabel: undefined,\n state: 'default',\n name: undefined,\n id: undefined,\n rows: 4,\n size: undefined,\n maxlength: undefined,\n showCount: false,\n autosize: false,\n clearable: undefined,\n clearLabel: undefined,\n resize: 'vertical',\n})\n\ndefineOptions({\n // Иначе атрибуты потребителя (`data-*`, `aria-*`, `name`) садятся на корень,\n // а корень со `showCount` — обёртка счётчика, а не само поле.\n inheritAttrs: false,\n})\n\nconst emit = defineEmits<GrTextareaEmits>()\n\n// Fallback из контекста `GrFormField` (id/aria-describedby/invalid/required).\nconst field = useGrFormFieldContext()\nconst resolvedId = computed(() => props.id ?? field?.id.value)\n\n// Счётчик обязан быть частью описания поля: иначе «12 / 60» видно глазами, но\n// не слышно — при том что ограничение длины и есть его смысл.\nconst countId = useId()\nconst lineCountId = useId()\nconst describedBy = computed(() =>\n [\n field?.describedById.value,\n props.showCount ? countId : undefined,\n props.showLineCount ? lineCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n)\n\n/** Обёртка нужна любому из счётчиков — и кнопке очистки. */\nconst hasCounters = computed(() => props.showCount || props.showLineCount)\n\nconst lineCount = computed(() => props.modelValue.split('\\n').length)\n\nconst countText = computed(() =>\n props.maxlength !== undefined ? `${props.modelValue.length} / ${props.maxlength}` : String(props.modelValue.length),\n)\nconst {\n disabled: isDisabled,\n invalid: isInvalid,\n required: isRequired,\n readonly: isReadonly,\n} = useGrFormControl(() => props)\n\nconst textareaEl = ref<HTMLTextAreaElement | null>(null)\n\nfunction focus(): void {\n textareaEl.value?.focus()\n}\n\nfunction blur(): void {\n textareaEl.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTextarea' })\nconst resolvedClearable = useGrComponentProp('GrTextarea', 'clearable', () => props.clearable, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.input.clear', 'Clear'))\n\n/** С `maxLines` — «3 / 10», без него — локализованная подпись с формой числа. */\nconst lineCountText = computed(() => (\n props.maxLines !== undefined\n ? `${lineCount.value} / ${props.maxLines}`\n : t('gr.textarea.lines', '{n} lines', { n: lineCount.value })\n))\n\nconst showClear = computed(() =>\n resolvedClearable.value && !isDisabled.value && !isReadonly.value && props.modelValue !== '',\n)\n\nfunction clear(): void {\n emit('update:modelValue', '')\n emit('change', '')\n emit('clear')\n focus()\n}\n\nconst baseClass = 'w-full rounded-[var(--gr-radius-control)] border text-[var(--gr-fg)] placeholder:text-[var(--gr-muted-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:cursor-not-allowed'\n\nconst className = computed(() => [\n sizes[resolvedSize.value],\n resizeClass[props.resize],\n isDisabled.value ? disabledSurfaceClass : enabledSurfaceClass,\n grTextareaClass({\n state: props.state,\n invalid: isInvalid.value,\n }),\n].join(' '))\n\n// Обе ветки шаблона (со счётчиком и без) рендерят одно и то же поле, поэтому\n// атрибуты живут одним объектом: двадцать строк копипасты расходятся молча.\nconst textareaAttrs = computed(() => ({\n id: resolvedId.value,\n 'data-gr-textarea': '',\n name: props.name,\n rows: props.rows,\n maxlength: props.maxlength,\n autocomplete: props.autocomplete,\n placeholder: props.placeholder,\n disabled: isDisabled.value,\n value: props.modelValue,\n 'aria-invalid': isInvalid.value ? ('true' as const) : undefined,\n 'aria-describedby': describedBy.value,\n 'aria-required': isRequired.value ? ('true' as const) : undefined,\n 'aria-readonly': isReadonly.value ? ('true' as const) : undefined,\n 'aria-label': props.ariaLabel,\n readonly: isReadonly.value,\n class: [baseClass, className.value],\n}))\n\nfunction onInput(e: Event): void {\n emit('update:modelValue', (e.target as HTMLTextAreaElement).value)\n}\n\n// Объявленный emit уходит из `$attrs`, поэтому нативные события переизлучаем\n// руками — иначе `@change`/`@focus`/`@blur` у потребителя перестали бы работать.\nfunction onChange(e: Event): void {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nfunction onFocus(e: FocusEvent): void {\n emit('focus', e)\n}\n\nfunction onBlur(e: FocusEvent): void {\n emit('blur', e)\n}\n</script>\n\n<template>\n <div v-if=\"hasCounters\" data-gr-textarea-wrap class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <div :class=\"countRowClass\">\n <div\n v-if=\"showLineCount\"\n :id=\"lineCountId\"\n data-gr-textarea-line-count\n :class=\"lineCountClass\"\n >\n {{ lineCountText }}\n </div>\n\n <!-- Символьный счётчик всегда прижат вправо: без счётчика строк он остаётся\n единственным в ряду, и `justify-between` его туда и отправляет. -->\n <div\n v-if=\"showCount\"\n :id=\"countId\"\n data-gr-textarea-count\n class=\"ml-auto\"\n :class=\"countClass\"\n >\n {{ countText }}\n </div>\n </div>\n </div>\n\n <!-- Обёртка появляется только под кнопку очистки: без неё поле остаётся\n корневым элементом — на этом стоит контракт fallthrough-атрибутов. -->\n <div v-else-if=\"resolvedClearable\" class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <textarea\n v-else\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GrTextarea-CNnkcIG1.js","names":["$attrs"],"sources":["../../../../src/components/GrTextarea/GrTextarea.vue","../../../../src/components/GrTextarea/GrTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrTextarea — многострочное поле ввода GR-примитива.\n *\n * Состояния:\n * - `state`: визуальный оттенок рамки (`default | success | warning | danger`).\n * - `invalid`: форсирует `danger`-состояние и проставляет `aria-invalid=\"true\"`.\n */\nimport { computed, ref, useId } from 'vue'\nimport {\n countClass,\n countRowClass,\n lineCountClass,\n disabledSurfaceClass,\n enabledSurfaceClass,\n grTextareaClass,\n resizeClass,\n sizes,\n type GrTextareaResize,\n type GrTextareaSize,\n type GrTextareaState,\n} from './grTextareaStyles'\nimport IconX from '~icons/lucide/x'\nimport { vAutosize } from '../../directives'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport interface GrTextareaProps {\n modelValue: string\n placeholder?: string\n autocomplete?: string\n disabled?: boolean\n /** Только для чтения: значение видно и уходит в форму, но не редактируется. */\n readonly?: boolean\n invalid?: boolean\n /** Обязательное поле (`aria-required`). Складывается с `required` у `GrFormField`. */\n required?: boolean\n /** Доступное имя вне `GrFormField`. */\n ariaLabel?: string\n state?: GrTextareaState\n name?: string\n id?: string\n rows?: number\n size?: GrTextareaSize\n /** Ограничение длины + основа для счётчика символов. */\n maxlength?: number\n /** Показывать счётчик символов (`len` или `len/maxlength`). */\n showCount?: boolean\n /**\n * Показывать счётчик строк. Считаются **логические** строки (переводы строки), а\n * не визуальные переносы: при `autosize` число не меняется от ширины поля.\n */\n showLineCount?: boolean\n /**\n * Ориентир по числу строк для счётчика (`3 / 10`). Ввод не ограничивает: обрезать\n * набранный текст за пользователя компонент не вправе.\n */\n maxLines?: number\n /** Подгонять высоту под содержимое (директива `v-autosize`). */\n autosize?: boolean\n /** Кнопка очистки значения. Настраивается через `GrConfigProvider`. */\n clearable?: boolean\n /** A11y-подпись кнопки очистки. */\n clearLabel?: string\n /** Ручное изменение размера пользователем. */\n resize?: GrTextareaResize\n}\n\nexport interface GrTextareaEmits {\n (e: 'update:modelValue', value: string): void\n /** Значение зафиксировано нативным `change` — по `blur`. */\n (e: 'change', value: string): void\n /** Значение стёрто кнопкой очистки. */\n (e: 'clear'): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrTextareaProps>(), {\n placeholder: undefined,\n autocomplete: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n ariaLabel: undefined,\n state: 'default',\n name: undefined,\n id: undefined,\n rows: 4,\n size: undefined,\n maxlength: undefined,\n showCount: false,\n autosize: false,\n clearable: undefined,\n clearLabel: undefined,\n resize: 'vertical',\n})\n\ndefineOptions({\n // Иначе атрибуты потребителя (`data-*`, `aria-*`, `name`) садятся на корень,\n // а корень со `showCount` — обёртка счётчика, а не само поле.\n inheritAttrs: false,\n})\n\nconst emit = defineEmits<GrTextareaEmits>()\n\n// Fallback из контекста `GrFormField` (id/aria-describedby/invalid/required).\nconst field = useGrFormFieldContext()\nconst resolvedId = computed(() => props.id ?? field?.id.value)\n\n// Счётчик обязан быть частью описания поля: иначе «12 / 60» видно глазами, но\n// не слышно — при том что ограничение длины и есть его смысл.\nconst countId = useId()\nconst lineCountId = useId()\nconst describedBy = computed(() =>\n [\n field?.describedById.value,\n props.showCount ? countId : undefined,\n props.showLineCount ? lineCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n)\n\n/** Обёртка нужна любому из счётчиков — и кнопке очистки. */\nconst hasCounters = computed(() => props.showCount || props.showLineCount)\n\nconst lineCount = computed(() => props.modelValue.split('\\n').length)\n\nconst countText = computed(() =>\n props.maxlength !== undefined ? `${props.modelValue.length} / ${props.maxlength}` : String(props.modelValue.length),\n)\nconst {\n disabled: isDisabled,\n invalid: isInvalid,\n required: isRequired,\n readonly: isReadonly,\n} = useGrFormControl(() => props)\n\nconst textareaEl = ref<HTMLTextAreaElement | null>(null)\n\nfunction focus(): void {\n textareaEl.value?.focus()\n}\n\nfunction blur(): void {\n textareaEl.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTextarea' })\nconst resolvedClearable = useGrComponentProp('GrTextarea', 'clearable', () => props.clearable, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.input.clear', 'Clear'))\n\n/** С `maxLines` — «3 / 10», без него — локализованная подпись с формой числа. */\nconst lineCountText = computed(() => (\n props.maxLines !== undefined\n ? `${lineCount.value} / ${props.maxLines}`\n : t('gr.textarea.lines', '{n} lines', { n: lineCount.value })\n))\n\nconst showClear = computed(() =>\n resolvedClearable.value && !isDisabled.value && !isReadonly.value && props.modelValue !== '',\n)\n\nfunction clear(): void {\n emit('update:modelValue', '')\n emit('change', '')\n emit('clear')\n focus()\n}\n\nconst baseClass = 'w-full rounded-[var(--gr-radius-control)] border text-[var(--gr-fg)] placeholder:text-[var(--gr-muted-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:cursor-not-allowed'\n\nconst className = computed(() => [\n sizes[resolvedSize.value],\n resizeClass[props.resize],\n isDisabled.value ? disabledSurfaceClass : enabledSurfaceClass,\n grTextareaClass({\n state: props.state,\n invalid: isInvalid.value,\n }),\n].join(' '))\n\n// Обе ветки шаблона (со счётчиком и без) рендерят одно и то же поле, поэтому\n// атрибуты живут одним объектом: двадцать строк копипасты расходятся молча.\nconst textareaAttrs = computed(() => ({\n id: resolvedId.value,\n 'data-gr-textarea': '',\n name: props.name,\n rows: props.rows,\n maxlength: props.maxlength,\n autocomplete: props.autocomplete,\n placeholder: props.placeholder,\n disabled: isDisabled.value,\n value: props.modelValue,\n 'aria-invalid': isInvalid.value ? ('true' as const) : undefined,\n 'aria-describedby': describedBy.value,\n 'aria-required': isRequired.value ? ('true' as const) : undefined,\n 'aria-readonly': isReadonly.value ? ('true' as const) : undefined,\n 'aria-label': props.ariaLabel,\n readonly: isReadonly.value,\n class: [baseClass, className.value],\n}))\n\nfunction onInput(e: Event): void {\n emit('update:modelValue', (e.target as HTMLTextAreaElement).value)\n}\n\n// Объявленный emit уходит из `$attrs`, поэтому нативные события переизлучаем\n// руками — иначе `@change`/`@focus`/`@blur` у потребителя перестали бы работать.\nfunction onChange(e: Event): void {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nfunction onFocus(e: FocusEvent): void {\n emit('focus', e)\n}\n\nfunction onBlur(e: FocusEvent): void {\n emit('blur', e)\n}\n</script>\n\n<template>\n <div v-if=\"hasCounters\" data-gr-textarea-wrap class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <div :class=\"countRowClass\">\n <div\n v-if=\"showLineCount\"\n :id=\"lineCountId\"\n data-gr-textarea-line-count\n :class=\"lineCountClass\"\n >\n {{ lineCountText }}\n </div>\n\n <!-- Символьный счётчик всегда прижат вправо: без счётчика строк он остаётся\n единственным в ряду, и `justify-between` его туда и отправляет. -->\n <div\n v-if=\"showCount\"\n :id=\"countId\"\n data-gr-textarea-count\n class=\"ml-auto\"\n :class=\"countClass\"\n >\n {{ countText }}\n </div>\n </div>\n </div>\n\n <!-- Обёртка появляется только под кнопку очистки: без неё поле остаётся\n корневым элементом — на этом стоит контракт fallthrough-атрибутов. -->\n <div v-else-if=\"resolvedClearable\" class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <textarea\n v-else\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrTextarea — многострочное поле ввода GR-примитива.\n *\n * Состояния:\n * - `state`: визуальный оттенок рамки (`default | success | warning | danger`).\n * - `invalid`: форсирует `danger`-состояние и проставляет `aria-invalid=\"true\"`.\n */\nimport { computed, ref, useId } from 'vue'\nimport {\n countClass,\n countRowClass,\n lineCountClass,\n disabledSurfaceClass,\n enabledSurfaceClass,\n grTextareaClass,\n resizeClass,\n sizes,\n type GrTextareaResize,\n type GrTextareaSize,\n type GrTextareaState,\n} from './grTextareaStyles'\nimport IconX from '~icons/lucide/x'\nimport { vAutosize } from '../../directives'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport interface GrTextareaProps {\n modelValue: string\n placeholder?: string\n autocomplete?: string\n disabled?: boolean\n /** Только для чтения: значение видно и уходит в форму, но не редактируется. */\n readonly?: boolean\n invalid?: boolean\n /** Обязательное поле (`aria-required`). Складывается с `required` у `GrFormField`. */\n required?: boolean\n /** Доступное имя вне `GrFormField`. */\n ariaLabel?: string\n state?: GrTextareaState\n name?: string\n id?: string\n rows?: number\n size?: GrTextareaSize\n /** Ограничение длины + основа для счётчика символов. */\n maxlength?: number\n /** Показывать счётчик символов (`len` или `len/maxlength`). */\n showCount?: boolean\n /**\n * Показывать счётчик строк. Считаются **логические** строки (переводы строки), а\n * не визуальные переносы: при `autosize` число не меняется от ширины поля.\n */\n showLineCount?: boolean\n /**\n * Ориентир по числу строк для счётчика (`3 / 10`). Ввод не ограничивает: обрезать\n * набранный текст за пользователя компонент не вправе.\n */\n maxLines?: number\n /** Подгонять высоту под содержимое (директива `v-autosize`). */\n autosize?: boolean\n /** Кнопка очистки значения. Настраивается через `GrConfigProvider`. */\n clearable?: boolean\n /** A11y-подпись кнопки очистки. */\n clearLabel?: string\n /** Ручное изменение размера пользователем. */\n resize?: GrTextareaResize\n}\n\nexport interface GrTextareaEmits {\n (e: 'update:modelValue', value: string): void\n /** Значение зафиксировано нативным `change` — по `blur`. */\n (e: 'change', value: string): void\n /** Значение стёрто кнопкой очистки. */\n (e: 'clear'): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrTextareaProps>(), {\n placeholder: undefined,\n autocomplete: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n ariaLabel: undefined,\n state: 'default',\n name: undefined,\n id: undefined,\n rows: 4,\n size: undefined,\n maxlength: undefined,\n showCount: false,\n autosize: false,\n clearable: undefined,\n clearLabel: undefined,\n resize: 'vertical',\n})\n\ndefineOptions({\n // Иначе атрибуты потребителя (`data-*`, `aria-*`, `name`) садятся на корень,\n // а корень со `showCount` — обёртка счётчика, а не само поле.\n inheritAttrs: false,\n})\n\nconst emit = defineEmits<GrTextareaEmits>()\n\n// Fallback из контекста `GrFormField` (id/aria-describedby/invalid/required).\nconst field = useGrFormFieldContext()\nconst resolvedId = computed(() => props.id ?? field?.id.value)\n\n// Счётчик обязан быть частью описания поля: иначе «12 / 60» видно глазами, но\n// не слышно — при том что ограничение длины и есть его смысл.\nconst countId = useId()\nconst lineCountId = useId()\nconst describedBy = computed(() =>\n [\n field?.describedById.value,\n props.showCount ? countId : undefined,\n props.showLineCount ? lineCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n)\n\n/** Обёртка нужна любому из счётчиков — и кнопке очистки. */\nconst hasCounters = computed(() => props.showCount || props.showLineCount)\n\nconst lineCount = computed(() => props.modelValue.split('\\n').length)\n\nconst countText = computed(() =>\n props.maxlength !== undefined ? `${props.modelValue.length} / ${props.maxlength}` : String(props.modelValue.length),\n)\nconst {\n disabled: isDisabled,\n invalid: isInvalid,\n required: isRequired,\n readonly: isReadonly,\n} = useGrFormControl(() => props)\n\nconst textareaEl = ref<HTMLTextAreaElement | null>(null)\n\nfunction focus(): void {\n textareaEl.value?.focus()\n}\n\nfunction blur(): void {\n textareaEl.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTextarea' })\nconst resolvedClearable = useGrComponentProp('GrTextarea', 'clearable', () => props.clearable, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.input.clear', 'Clear'))\n\n/** С `maxLines` — «3 / 10», без него — локализованная подпись с формой числа. */\nconst lineCountText = computed(() => (\n props.maxLines !== undefined\n ? `${lineCount.value} / ${props.maxLines}`\n : t('gr.textarea.lines', '{n} lines', { n: lineCount.value })\n))\n\nconst showClear = computed(() =>\n resolvedClearable.value && !isDisabled.value && !isReadonly.value && props.modelValue !== '',\n)\n\nfunction clear(): void {\n emit('update:modelValue', '')\n emit('change', '')\n emit('clear')\n focus()\n}\n\nconst baseClass = 'w-full rounded-[var(--gr-radius-control)] border text-[var(--gr-fg)] placeholder:text-[var(--gr-muted-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:cursor-not-allowed'\n\nconst className = computed(() => [\n sizes[resolvedSize.value],\n resizeClass[props.resize],\n isDisabled.value ? disabledSurfaceClass : enabledSurfaceClass,\n grTextareaClass({\n state: props.state,\n invalid: isInvalid.value,\n }),\n].join(' '))\n\n// Обе ветки шаблона (со счётчиком и без) рендерят одно и то же поле, поэтому\n// атрибуты живут одним объектом: двадцать строк копипасты расходятся молча.\nconst textareaAttrs = computed(() => ({\n id: resolvedId.value,\n 'data-gr-textarea': '',\n name: props.name,\n rows: props.rows,\n maxlength: props.maxlength,\n autocomplete: props.autocomplete,\n placeholder: props.placeholder,\n disabled: isDisabled.value,\n value: props.modelValue,\n 'aria-invalid': isInvalid.value ? ('true' as const) : undefined,\n 'aria-describedby': describedBy.value,\n 'aria-required': isRequired.value ? ('true' as const) : undefined,\n 'aria-readonly': isReadonly.value ? ('true' as const) : undefined,\n 'aria-label': props.ariaLabel,\n readonly: isReadonly.value,\n class: [baseClass, className.value],\n}))\n\nfunction onInput(e: Event): void {\n emit('update:modelValue', (e.target as HTMLTextAreaElement).value)\n}\n\n// Объявленный emit уходит из `$attrs`, поэтому нативные события переизлучаем\n// руками — иначе `@change`/`@focus`/`@blur` у потребителя перестали бы работать.\nfunction onChange(e: Event): void {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nfunction onFocus(e: FocusEvent): void {\n emit('focus', e)\n}\n\nfunction onBlur(e: FocusEvent): void {\n emit('blur', e)\n}\n</script>\n\n<template>\n <div v-if=\"hasCounters\" data-gr-textarea-wrap class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <div :class=\"countRowClass\">\n <div\n v-if=\"showLineCount\"\n :id=\"lineCountId\"\n data-gr-textarea-line-count\n :class=\"lineCountClass\"\n >\n {{ lineCountText }}\n </div>\n\n <!-- Символьный счётчик всегда прижат вправо: без счётчика строк он остаётся\n единственным в ряду, и `justify-between` его туда и отправляет. -->\n <div\n v-if=\"showCount\"\n :id=\"countId\"\n data-gr-textarea-count\n class=\"ml-auto\"\n :class=\"countClass\"\n >\n {{ countText }}\n </div>\n </div>\n </div>\n\n <!-- Обёртка появляется только под кнопку очистки: без неё поле остаётся\n корневым элементом — на этом стоит контракт fallthrough-атрибутов. -->\n <div v-else-if=\"resolvedClearable\" class=\"relative w-full\">\n <textarea\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n data-gr-textarea-clear\n :aria-label=\"resolvedClearLabel\"\n class=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @click=\"clear\"\n >\n <IconX class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <textarea\n v-else\n ref=\"textareaEl\"\n v-autosize=\"autosize\"\n v-bind=\"{ ...textareaAttrs, ...$attrs }\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as GrTextarea_default } from "./chunks/GrTextarea-DSvd1nSy.js";
1
+ import { t as GrTextarea_default } from "./chunks/GrTextarea-CNnkcIG1.js";
2
2
  import { n as grTextareaSafelist, t as grTextareaConfig } from "../../chunks/config-BDfTXHo12.js";
3
3
  export { GrTextarea_default as GrTextarea, GrTextarea_default as default, grTextareaConfig, grTextareaSafelist };
@@ -1,21 +1,10 @@
1
- import { a as useGrComponentProp } from "../../../chunks/context-BSYR7RZs.js";
1
+ import { i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
2
2
  import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
3
- import { t as GrSkeleton_default } from "../../GrSkeleton/chunks/GrSkeleton-DEvNE3bC.js";
3
+ import { t as GrSkeleton_default } from "../../GrSkeleton/chunks/GrSkeleton-CgfXxPQ2.js";
4
4
  import { n as hasMeaningfulSlotContent } from "../../../chunks/slotNodes-DxNXpC7v.js";
5
- import { a as grTimelineDensityClass, c as loadingRowClass, i as emptyClass, l as timeClass, o as grTimelineMarkerClass, r as descriptionClass, s as groupTitleClass, u as titleClass } from "../../../chunks/config-COpuWGr_.js";
5
+ import { a as grTimelineDensityClass, c as loadingRowClass, i as emptyClass, l as timeClass, o as grTimelineMarkerClass, r as descriptionClass, s as groupTitleClass, u as titleClass } from "../../../chunks/config-COpuWGr_2.js";
6
6
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, normalizeClass, openBlock, provide, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useSlots, withCtx } from "vue";
7
7
  import '../styles.css';//#region src/components/GrTimeline/grTimelineContext.ts
8
- /**
9
- * Уровень заголовка группы. Тот же довод, что у `GrCollapse`: лента в разделе
10
- * `<h4>` с захардкоженным `<h3>` рвёт навигацию по заголовкам.
11
- */
12
- var GR_TIMELINE_HEADING_LEVELS = [
13
- 2,
14
- 3,
15
- 4,
16
- 5,
17
- 6
18
- ];
19
8
  var GR_TIMELINE_CONTEXT = Symbol("GR_TIMELINE_CONTEXT");
20
9
  //#endregion
21
10
  //#region src/components/GrTimeline/timelineGroups.ts
@@ -282,4 +271,4 @@ var GrTimelineItem_default = /* @__PURE__ */ defineComponent({
282
271
  }
283
272
  });
284
273
  //#endregion
285
- export { GR_TIMELINE_HEADING_LEVELS as i, GrTimeline_default as n, groupTimelineItems as r, GrTimelineItem_default as t };
274
+ export { GrTimeline_default as n, GrTimelineItem_default as t };