@feugene/granularity 0.4.0 → 0.4.2

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 (432) hide show
  1. package/dist/chunks/_plugin-vue_export-helper-BG_EqiDU.js +8 -0
  2. package/dist/chunks/adapter-K6zZTzBi.js +4 -0
  3. package/dist/chunks/adapter-K6zZTzBi.js.map +1 -0
  4. package/dist/chunks/arrow-up-DNXrMoAI.js +23 -0
  5. package/dist/chunks/arrow-up-DNXrMoAI.js.map +1 -0
  6. package/dist/chunks/classTokens-BPeBXNzu.js +6 -0
  7. package/dist/chunks/classTokens-BPeBXNzu.js.map +1 -0
  8. package/dist/chunks/config-1I95Zy4V.js +14 -0
  9. package/dist/chunks/config-1I95Zy4V.js.map +1 -0
  10. package/dist/chunks/config-2wgwWaAB.js +8 -0
  11. package/dist/chunks/config-2wgwWaAB.js.map +1 -0
  12. package/dist/chunks/config-BA0BWYzs.js +8 -0
  13. package/dist/chunks/config-BA0BWYzs.js.map +1 -0
  14. package/dist/chunks/config-BCPyma1I.js +8 -0
  15. package/dist/chunks/config-BCPyma1I.js.map +1 -0
  16. package/dist/chunks/config-BDlh6iNz.js +24 -0
  17. package/dist/chunks/config-BDlh6iNz.js.map +1 -0
  18. package/dist/chunks/config-BKRmlivc.js +8 -0
  19. package/dist/chunks/config-BKRmlivc.js.map +1 -0
  20. package/dist/chunks/config-BN-B2K4r.js +17 -0
  21. package/dist/chunks/config-BN-B2K4r.js.map +1 -0
  22. package/dist/chunks/config-BNOf_qjD.js +40 -0
  23. package/dist/chunks/config-BNOf_qjD.js.map +1 -0
  24. package/dist/chunks/config-BaMO9dQh.js +20 -0
  25. package/dist/chunks/config-BaMO9dQh.js.map +1 -0
  26. package/dist/chunks/config-Bv2G0OU6.js +8 -0
  27. package/dist/chunks/config-Bv2G0OU6.js.map +1 -0
  28. package/dist/chunks/config-BvuQUBtZ.js +21 -0
  29. package/dist/chunks/config-BvuQUBtZ.js.map +1 -0
  30. package/dist/chunks/config-BzZGpWsj.js +9 -0
  31. package/dist/chunks/config-BzZGpWsj.js.map +1 -0
  32. package/dist/chunks/config-C0j836dC.js +8 -0
  33. package/dist/chunks/config-C0j836dC.js.map +1 -0
  34. package/dist/chunks/config-C2iI7_QX.js +9 -0
  35. package/dist/chunks/config-C2iI7_QX.js.map +1 -0
  36. package/dist/chunks/config-C4AlNm912.js +13 -0
  37. package/dist/chunks/config-C4AlNm912.js.map +1 -0
  38. package/dist/chunks/config-C5SJXHQ4.js +9 -0
  39. package/dist/chunks/config-C5SJXHQ4.js.map +1 -0
  40. package/dist/chunks/config-C6SBJxcH.js +8 -0
  41. package/dist/chunks/config-C6SBJxcH.js.map +1 -0
  42. package/dist/chunks/config-CByfsV-z2.js +9 -0
  43. package/dist/chunks/config-CByfsV-z2.js.map +1 -0
  44. package/dist/chunks/config-CM7nbATU2.js +78 -0
  45. package/dist/chunks/config-CM7nbATU2.js.map +1 -0
  46. package/dist/chunks/config-CMZE2fu0.js +9 -0
  47. package/dist/chunks/config-CMZE2fu0.js.map +1 -0
  48. package/dist/chunks/config-CU_CBd0k.js +22 -0
  49. package/dist/chunks/config-CU_CBd0k.js.map +1 -0
  50. package/dist/chunks/config-CUgvsjZx.js +171 -0
  51. package/dist/chunks/config-CUgvsjZx.js.map +1 -0
  52. package/dist/chunks/config-CWvHiaqr2.js +23 -0
  53. package/dist/chunks/config-CWvHiaqr2.js.map +1 -0
  54. package/dist/chunks/config-Cf0J6wCX.js +58 -0
  55. package/dist/chunks/config-Cf0J6wCX.js.map +1 -0
  56. package/dist/chunks/config-CgAY2WP9.js +9 -0
  57. package/dist/chunks/config-CgAY2WP9.js.map +1 -0
  58. package/dist/chunks/config-Cgc-D1K4.js +9 -0
  59. package/dist/chunks/config-Cgc-D1K4.js.map +1 -0
  60. package/dist/chunks/config-D19pyP4D.js +35 -0
  61. package/dist/chunks/config-D19pyP4D.js.map +1 -0
  62. package/dist/chunks/config-DCQO6H6h.js +11 -0
  63. package/dist/chunks/config-DCQO6H6h.js.map +1 -0
  64. package/dist/chunks/config-DEv4m-ZP.js +58 -0
  65. package/dist/chunks/config-DEv4m-ZP.js.map +1 -0
  66. package/dist/chunks/config-DFRYOcrP.js +9 -0
  67. package/dist/chunks/config-DFRYOcrP.js.map +1 -0
  68. package/dist/chunks/config-DTpwUHgF.js +9 -0
  69. package/dist/chunks/config-DTpwUHgF.js.map +1 -0
  70. package/dist/chunks/config-DW_RqmUp.js +8 -0
  71. package/dist/chunks/config-DW_RqmUp.js.map +1 -0
  72. package/dist/chunks/config-Da90XGsi.js +38 -0
  73. package/dist/chunks/config-Da90XGsi.js.map +1 -0
  74. package/dist/chunks/config-DgRJlF00.js +53 -0
  75. package/dist/chunks/config-DgRJlF00.js.map +1 -0
  76. package/dist/chunks/config-Dkq0HeLe.js +9 -0
  77. package/dist/chunks/config-Dkq0HeLe.js.map +1 -0
  78. package/dist/chunks/config-DmI1IQvI2.js +8 -0
  79. package/dist/chunks/config-DmI1IQvI2.js.map +1 -0
  80. package/dist/chunks/config-Dnu4VuO0.js +8 -0
  81. package/dist/chunks/config-Dnu4VuO0.js.map +1 -0
  82. package/dist/chunks/config-DxqpV-KM.js +45 -0
  83. package/dist/chunks/config-DxqpV-KM.js.map +1 -0
  84. package/dist/chunks/config-TyzU6gLf.js +8 -0
  85. package/dist/chunks/config-TyzU6gLf.js.map +1 -0
  86. package/dist/chunks/config-XwI6t8cn.js +39 -0
  87. package/dist/chunks/config-XwI6t8cn.js.map +1 -0
  88. package/dist/chunks/config-bpQYM5O-.js +44 -0
  89. package/dist/chunks/config-bpQYM5O-.js.map +1 -0
  90. package/dist/chunks/config-etXh7Bsr2.js +9 -0
  91. package/dist/chunks/config-etXh7Bsr2.js.map +1 -0
  92. package/dist/chunks/config-fCcRwjIB.js +13 -0
  93. package/dist/chunks/config-fCcRwjIB.js.map +1 -0
  94. package/dist/chunks/config-nfOMJXVs.js +9 -0
  95. package/dist/chunks/config-nfOMJXVs.js.map +1 -0
  96. package/dist/chunks/config-qJXIIY1E.js +8 -0
  97. package/dist/chunks/config-qJXIIY1E.js.map +1 -0
  98. package/dist/chunks/config-r6hzn2Bn2.js +9 -0
  99. package/dist/chunks/config-r6hzn2Bn2.js.map +1 -0
  100. package/dist/chunks/config-rQlbnEKn.js +8 -0
  101. package/dist/chunks/config-rQlbnEKn.js.map +1 -0
  102. package/dist/chunks/dialogShared-BtXUk6Zc.js +32 -0
  103. package/dist/chunks/dialogShared-BtXUk6Zc.js.map +1 -0
  104. package/dist/chunks/en-BeJa78lP.js +48 -0
  105. package/dist/chunks/en-BeJa78lP.js.map +1 -0
  106. package/dist/chunks/es-BPqm7rLm.js +20 -0
  107. package/dist/chunks/es-BPqm7rLm.js.map +1 -0
  108. package/dist/chunks/es-axYOwwWD.js +48 -0
  109. package/dist/chunks/es-axYOwwWD.js.map +1 -0
  110. package/dist/chunks/fileValidation-CwJA8Vmn.js +219 -0
  111. package/dist/chunks/fileValidation-CwJA8Vmn.js.map +1 -0
  112. package/dist/chunks/{grBadgeStyles-Bu4H8bFc.js → grBadgeStyles-pqqbVgLk.js} +18 -13
  113. package/dist/chunks/grBadgeStyles-pqqbVgLk.js.map +1 -0
  114. package/dist/chunks/{grButtonStyles-C5k0bN2e.js → grButtonStyles-BxZW2x0-.js} +60 -52
  115. package/dist/chunks/grButtonStyles-BxZW2x0-.js.map +1 -0
  116. package/dist/chunks/{grDropdownStyles-149X1NeB.js → grDropdownStyles-DMp7RrI9.js} +10 -9
  117. package/dist/chunks/grDropdownStyles-DMp7RrI9.js.map +1 -0
  118. package/dist/chunks/grLoadingStyles-CrxZHFL0.js +17 -0
  119. package/dist/chunks/grLoadingStyles-CrxZHFL0.js.map +1 -0
  120. package/dist/chunks/{grModalStyles-Dmd4havY.js → grModalStyles-Dv2NXBKi.js} +20 -11
  121. package/dist/chunks/grModalStyles-Dv2NXBKi.js.map +1 -0
  122. package/dist/chunks/grSelectStyles-B7doeAQp.js +50 -0
  123. package/dist/chunks/grSelectStyles-B7doeAQp.js.map +1 -0
  124. package/dist/chunks/granularityI18n-GCqUz_lo.js +26 -0
  125. package/dist/chunks/granularityI18n-GCqUz_lo.js.map +1 -0
  126. package/dist/chunks/info-C0bHmdZq.js +26 -0
  127. package/dist/chunks/info-C0bHmdZq.js.map +1 -0
  128. package/dist/chunks/loader-circle-B2rWDk5u.js +23 -0
  129. package/dist/chunks/loader-circle-B2rWDk5u.js.map +1 -0
  130. package/dist/chunks/ru-Dqh-2C00.js +48 -0
  131. package/dist/chunks/ru-Dqh-2C00.js.map +1 -0
  132. package/dist/chunks/safelist-BF822K15.js +13 -0
  133. package/dist/chunks/safelist-BF822K15.js.map +1 -0
  134. package/dist/chunks/safelist-BY7z8fOl.js +24 -0
  135. package/dist/chunks/safelist-BY7z8fOl.js.map +1 -0
  136. package/dist/chunks/{shared-BqUqjuxn.js → shared-Cu5QkNmt.js} +149 -111
  137. package/dist/chunks/shared-Cu5QkNmt.js.map +1 -0
  138. package/dist/chunks/transition-mJ3PZCHH.js +1692 -0
  139. package/dist/chunks/transition-mJ3PZCHH.js.map +1 -0
  140. package/dist/chunks/x-Pa6C2hwi.js +23 -0
  141. package/dist/chunks/x-Pa6C2hwi.js.map +1 -0
  142. package/dist/chunks/x-circle-DQSlBLmX.js +67 -0
  143. package/dist/chunks/x-circle-DQSlBLmX.js.map +1 -0
  144. package/dist/components/GrAlert/chunks/GrAlert-BjerGcU8.js +146 -0
  145. package/dist/components/GrAlert/chunks/GrAlert-BjerGcU8.js.map +1 -0
  146. package/dist/components/GrAlert/index.js +3 -3
  147. package/dist/components/GrAvatar/chunks/GrAvatar-BjnPKNAL.js +41 -0
  148. package/dist/components/GrAvatar/chunks/GrAvatar-BjnPKNAL.js.map +1 -0
  149. package/dist/components/GrAvatar/index.js +3 -3
  150. package/dist/components/GrBadge/chunks/GrBadge-wuIb4_2K.js +32 -0
  151. package/dist/components/GrBadge/chunks/GrBadge-wuIb4_2K.js.map +1 -0
  152. package/dist/components/GrBadge/index.js +3 -3
  153. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CxtamOZ-.js +33 -0
  154. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CxtamOZ-.js.map +1 -0
  155. package/dist/components/GrBadgeWrap/index.js +3 -3
  156. package/dist/components/GrBottomNav/chunks/GrBottomNav-CsmQ7mTJ.js +31 -0
  157. package/dist/components/GrBottomNav/chunks/GrBottomNav-CsmQ7mTJ.js.map +1 -0
  158. package/dist/components/GrBottomNav/index.js +3 -3
  159. package/dist/components/GrButton/chunks/GrButton-BmGdp8-4.js +83 -0
  160. package/dist/components/GrButton/chunks/GrButton-BmGdp8-4.js.map +1 -0
  161. package/dist/components/GrButton/index.js +5 -5
  162. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CBj4tpms.js +21 -0
  163. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CBj4tpms.js.map +1 -0
  164. package/dist/components/GrButtonGroup/index.js +3 -3
  165. package/dist/components/GrCard/chunks/GrCard-xtDcXBr7.js +11 -0
  166. package/dist/components/GrCard/chunks/GrCard-xtDcXBr7.js.map +1 -0
  167. package/dist/components/GrCard/index.js +3 -3
  168. package/dist/components/GrCheckbox/chunks/GrCheckbox-Bt3d7ckE.js +134 -0
  169. package/dist/components/GrCheckbox/chunks/GrCheckbox-Bt3d7ckE.js.map +1 -0
  170. package/dist/components/GrCheckbox/index.js +3 -3
  171. package/dist/components/GrCollapse/chunks/GrCollapse-HU20VTVn.js +205 -0
  172. package/dist/components/GrCollapse/chunks/GrCollapse-HU20VTVn.js.map +1 -0
  173. package/dist/components/GrCollapse/index.js +3 -3
  174. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-DjGOX9Hd.js +131 -0
  175. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-DjGOX9Hd.js.map +1 -0
  176. package/dist/components/GrConfirmDialog/index.js +3 -3
  177. package/dist/components/GrDataTable/chunks/GrDataTable-QDOJWmdY.js +179 -0
  178. package/dist/components/GrDataTable/chunks/GrDataTable-QDOJWmdY.js.map +1 -0
  179. package/dist/components/GrDataTable/index.js +3 -3
  180. package/dist/components/GrDialog/chunks/GrDialog-gObmaVEl.js +221 -0
  181. package/dist/components/GrDialog/chunks/GrDialog-gObmaVEl.js.map +1 -0
  182. package/dist/components/GrDialog/index.js +4 -4
  183. package/dist/components/GrDrawer/chunks/GrDrawer-BJL_gTxI.js +156 -0
  184. package/dist/components/GrDrawer/chunks/GrDrawer-BJL_gTxI.js.map +1 -0
  185. package/dist/components/GrDrawer/index.js +3 -3
  186. package/dist/components/GrDropdown/chunks/GrDropdown-BkACCXdp.js +151 -0
  187. package/dist/components/GrDropdown/chunks/GrDropdown-BkACCXdp.js.map +1 -0
  188. package/dist/components/GrDropdown/index.js +3 -3
  189. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-BEenXrJw.js +309 -0
  190. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-BEenXrJw.js.map +1 -0
  191. package/dist/components/GrDropdownMenu/index.js +3 -3
  192. package/dist/components/GrEmptyState/chunks/GrEmptyState-BLbMJFW-.js +62 -0
  193. package/dist/components/GrEmptyState/chunks/GrEmptyState-BLbMJFW-.js.map +1 -0
  194. package/dist/components/GrEmptyState/index.js +3 -3
  195. package/dist/components/GrFileUpload/chunks/GrFileUpload-u01j9S0t.js +368 -0
  196. package/dist/components/GrFileUpload/chunks/GrFileUpload-u01j9S0t.js.map +1 -0
  197. package/dist/components/GrFileUpload/index.js +4 -4
  198. package/dist/components/GrFormField/chunks/GrFormField-C6PfAs4u.js +35 -0
  199. package/dist/components/GrFormField/chunks/GrFormField-C6PfAs4u.js.map +1 -0
  200. package/dist/components/GrFormField/index.js +3 -3
  201. package/dist/components/GrFormFile/chunks/GrFormFile-DdM8Bc2B.js +313 -0
  202. package/dist/components/GrFormFile/chunks/GrFormFile-DdM8Bc2B.js.map +1 -0
  203. package/dist/components/GrFormFile/index.js +3 -3
  204. package/dist/components/GrFormSection/chunks/GrFormSection-5djEaQZQ.js +35 -0
  205. package/dist/components/GrFormSection/chunks/GrFormSection-5djEaQZQ.js.map +1 -0
  206. package/dist/components/GrFormSection/index.js +3 -3
  207. package/dist/components/GrIcon/chunks/GrIcon-BV7RBU_0.js +32 -0
  208. package/dist/components/GrIcon/chunks/GrIcon-BV7RBU_0.js.map +1 -0
  209. package/dist/components/GrIcon/index.js +3 -3
  210. package/dist/components/GrImageViewer/chunks/GrImageViewer-CjSnohW7.js +397 -0
  211. package/dist/components/GrImageViewer/chunks/GrImageViewer-CjSnohW7.js.map +1 -0
  212. package/dist/components/GrImageViewer/index.js +3 -3
  213. package/dist/components/GrInput/chunks/GrInput-ghxaTf6d.js +211 -0
  214. package/dist/components/GrInput/chunks/GrInput-ghxaTf6d.js.map +1 -0
  215. package/dist/components/GrInput/index.js +3 -3
  216. package/dist/components/GrInputTag/chunks/GrInputTag-B0x4U0Yk.js +257 -0
  217. package/dist/components/GrInputTag/chunks/GrInputTag-B0x4U0Yk.js.map +1 -0
  218. package/dist/components/GrInputTag/index.js +3 -3
  219. package/dist/components/GrLink/chunks/GrLink-C7-Y1u88.js +80 -0
  220. package/dist/components/GrLink/chunks/GrLink-C7-Y1u88.js.map +1 -0
  221. package/dist/components/GrLink/index.js +3 -3
  222. package/dist/components/GrList/chunks/GrList--Ib4zLNw.js +77 -0
  223. package/dist/components/GrList/chunks/GrList--Ib4zLNw.js.map +1 -0
  224. package/dist/components/GrList/index.js +3 -3
  225. package/dist/components/GrLoading/chunks/GrLoading-C3QZKwE-.js +69 -0
  226. package/dist/components/GrLoading/chunks/GrLoading-C3QZKwE-.js.map +1 -0
  227. package/dist/components/GrLoading/index.js +3 -3
  228. package/dist/components/GrModal/chunks/GrModal-gvfvlp7k.js +168 -0
  229. package/dist/components/GrModal/chunks/GrModal-gvfvlp7k.js.map +1 -0
  230. package/dist/components/GrModal/index.js +4 -4
  231. package/dist/components/GrNavbar/chunks/GrNavbar-nIyuiVj1.js +75 -0
  232. package/dist/components/GrNavbar/chunks/GrNavbar-nIyuiVj1.js.map +1 -0
  233. package/dist/components/GrNavbar/index.js +3 -3
  234. package/dist/components/GrNumberInput/chunks/GrNumberInput-B0mPLjdv.js +397 -0
  235. package/dist/components/GrNumberInput/chunks/GrNumberInput-B0mPLjdv.js.map +1 -0
  236. package/dist/components/GrNumberInput/index.js +3 -3
  237. package/dist/components/GrPagination/chunks/GrPagination-BSTO6flk.js +114 -0
  238. package/dist/components/GrPagination/chunks/GrPagination-BSTO6flk.js.map +1 -0
  239. package/dist/components/GrPagination/index.js +3 -3
  240. package/dist/components/GrProgressBar/chunks/GrProgressBar-MvMnzsJl.js +39 -0
  241. package/dist/components/GrProgressBar/chunks/GrProgressBar-MvMnzsJl.js.map +1 -0
  242. package/dist/components/GrProgressBar/index.js +3 -3
  243. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DKhbN6ji.js +190 -0
  244. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DKhbN6ji.js.map +1 -0
  245. package/dist/components/GrPromptDialog/index.js +3 -3
  246. package/dist/components/GrRadio/chunks/GrRadio-BxBs3WHq.js +184 -0
  247. package/dist/components/GrRadio/chunks/GrRadio-BxBs3WHq.js.map +1 -0
  248. package/dist/components/GrRadio/index.js +3 -3
  249. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-CEAfJQ6A.js +80 -0
  250. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-CEAfJQ6A.js.map +1 -0
  251. package/dist/components/GrRadioGroup/index.js +3 -3
  252. package/dist/components/GrSegmented/chunks/GrSegmented-Bwn2qOY4.js +323 -0
  253. package/dist/components/GrSegmented/chunks/GrSegmented-Bwn2qOY4.js.map +1 -0
  254. package/dist/components/GrSegmented/index.js +3 -3
  255. package/dist/components/GrSelect/chunks/GrSelect-9wRWAu2R.js +443 -0
  256. package/dist/components/GrSelect/chunks/GrSelect-9wRWAu2R.js.map +1 -0
  257. package/dist/components/GrSelect/index.js +3 -3
  258. package/dist/components/GrSidebar/chunks/GrSidebar-CSZ3RpFB.js +44 -0
  259. package/dist/components/GrSidebar/chunks/GrSidebar-CSZ3RpFB.js.map +1 -0
  260. package/dist/components/GrSidebar/index.js +3 -3
  261. package/dist/components/GrSkeleton/chunks/GrSkeleton-DKXkqWDa.js +33 -0
  262. package/dist/components/GrSkeleton/chunks/GrSkeleton-DKXkqWDa.js.map +1 -0
  263. package/dist/components/GrSkeleton/index.js +3 -3
  264. package/dist/components/GrSwitch/chunks/GrSwitch-CdBxwV3k.js +79 -0
  265. package/dist/components/GrSwitch/chunks/GrSwitch-CdBxwV3k.js.map +1 -0
  266. package/dist/components/GrSwitch/index.js +3 -3
  267. package/dist/components/GrTable/chunks/GrTable-CyQ9uw8A.js +57 -0
  268. package/dist/components/GrTable/chunks/GrTable-CyQ9uw8A.js.map +1 -0
  269. package/dist/components/GrTable/index.js +3 -3
  270. package/dist/components/GrTabs/chunks/GrTabs-BpF8AAUz.js +118 -0
  271. package/dist/components/GrTabs/chunks/GrTabs-BpF8AAUz.js.map +1 -0
  272. package/dist/components/GrTabs/index.js +3 -3
  273. package/dist/components/GrTextarea/chunks/GrTextarea-DFS9ZkrA.js +71 -0
  274. package/dist/components/GrTextarea/chunks/GrTextarea-DFS9ZkrA.js.map +1 -0
  275. package/dist/components/GrTextarea/index.js +3 -3
  276. package/dist/components/GrToaster/chunks/GrToaster-3Mf0Moxt.js +171 -0
  277. package/dist/components/GrToaster/chunks/GrToaster-3Mf0Moxt.js.map +1 -0
  278. package/dist/components/GrToaster/index.js +3 -3
  279. package/dist/components/GrTooltip/chunks/GrTooltip-BvmsukLW.js +55 -0
  280. package/dist/components/GrTooltip/chunks/GrTooltip-BvmsukLW.js.map +1 -0
  281. package/dist/components/GrTooltip/index.js +3 -3
  282. package/dist/components/GrTree/chunks/GrTree-C2kN-O4Q.js +734 -0
  283. package/dist/components/GrTree/chunks/GrTree-C2kN-O4Q.js.map +1 -0
  284. package/dist/components/GrTree/index.js +3 -3
  285. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-Da-CpRqm.js +454 -0
  286. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-Da-CpRqm.js.map +1 -0
  287. package/dist/components/GrTreeSelect/index.js +3 -3
  288. package/dist/composables/useTheme.js +39 -30
  289. package/dist/composables/useTheme.js.map +1 -0
  290. package/dist/composables/useToast.js +41 -34
  291. package/dist/composables/useToast.js.map +1 -0
  292. package/dist/directives/autofocus.js +55 -0
  293. package/dist/directives/autofocus.js.map +1 -0
  294. package/dist/directives/autosize.js +117 -0
  295. package/dist/directives/autosize.js.map +1 -0
  296. package/dist/directives/clickOutside.js +96 -0
  297. package/dist/directives/clickOutside.js.map +1 -0
  298. package/dist/directives/dropzone.js +164 -0
  299. package/dist/directives/dropzone.js.map +1 -0
  300. package/dist/directives/hotkey.js +138 -0
  301. package/dist/directives/hotkey.js.map +1 -0
  302. package/dist/directives/index.js +7 -2
  303. package/dist/directives/loading.js +163 -0
  304. package/dist/directives/loading.js.map +1 -0
  305. package/dist/fileValidation/index.js +2 -2
  306. package/dist/granular-provider-node.js +23 -14
  307. package/dist/granular-provider-node.js.map +1 -0
  308. package/dist/granular-provider.js +3 -3
  309. package/dist/granular-provider.js.map +1 -0
  310. package/dist/i18n/all.js +6 -6
  311. package/dist/i18n/all.js.map +1 -0
  312. package/dist/i18n/index.js +3 -3
  313. package/dist/index.js +110 -105
  314. package/dist/vue/index.js +64 -26
  315. package/dist/vue/index.js.map +1 -0
  316. package/package.json +25 -1
  317. package/dist/chunks/_plugin-vue_export-helper-CHO2XVys.js +0 -8
  318. package/dist/chunks/adapter-D5uYoOZj.js +0 -4
  319. package/dist/chunks/arrow-up-Dv3dC3hu.js +0 -23
  320. package/dist/chunks/classTokens-CT1tqF2j.js +0 -6
  321. package/dist/chunks/config-B5JCvHys.js +0 -13
  322. package/dist/chunks/config-BDXa5Sna2.js +0 -9
  323. package/dist/chunks/config-BG5_FuZ-.js +0 -34
  324. package/dist/chunks/config-BMYKG1oB.js +0 -10
  325. package/dist/chunks/config-BQREEXFD.js +0 -8
  326. package/dist/chunks/config-BUZtbeTr.js +0 -40
  327. package/dist/chunks/config-BVXycfiO.js +0 -9
  328. package/dist/chunks/config-BZW-RL6E.js +0 -14
  329. package/dist/chunks/config-BhbfV-Is.js +0 -48
  330. package/dist/chunks/config-BmYFupZh.js +0 -8
  331. package/dist/chunks/config-BsZc_QQ-2.js +0 -20
  332. package/dist/chunks/config-C1Sn7mn-.js +0 -27
  333. package/dist/chunks/config-C4_REX-3.js +0 -9
  334. package/dist/chunks/config-CBFllZZ4.js +0 -9
  335. package/dist/chunks/config-CDyD_fCt.js +0 -8
  336. package/dist/chunks/config-CJeG727i.js +0 -149
  337. package/dist/chunks/config-CLawBqde.js +0 -21
  338. package/dist/chunks/config-CMz46RPG.js +0 -8
  339. package/dist/chunks/config-CO-7HRZd2.js +0 -8
  340. package/dist/chunks/config-CS7E7LME.js +0 -9
  341. package/dist/chunks/config-CVy124Xj.js +0 -8
  342. package/dist/chunks/config-CcixQGaN.js +0 -47
  343. package/dist/chunks/config-CiVXZxyQ.js +0 -9
  344. package/dist/chunks/config-CoMQmunP.js +0 -8
  345. package/dist/chunks/config-Cq6ufYtp.js +0 -9
  346. package/dist/chunks/config-D8CIEWcb.js +0 -8
  347. package/dist/chunks/config-D8hKc39m.js +0 -18
  348. package/dist/chunks/config-D9MxGwCJ.js +0 -8
  349. package/dist/chunks/config-DBXTZE36.js +0 -15
  350. package/dist/chunks/config-DK9C8O7L.js +0 -9
  351. package/dist/chunks/config-DTegOmx2.js +0 -8
  352. package/dist/chunks/config-DYI8XADo.js +0 -47
  353. package/dist/chunks/config-DlidGf7P.js +0 -8
  354. package/dist/chunks/config-DtNe7EIX.js +0 -35
  355. package/dist/chunks/config-EdWeK_ge.js +0 -17
  356. package/dist/chunks/config-FGAkxHFh.js +0 -8
  357. package/dist/chunks/config-M76gNxd2.js +0 -37
  358. package/dist/chunks/config-NuqoO_Of.js +0 -33
  359. package/dist/chunks/config-QsovJrku2.js +0 -66
  360. package/dist/chunks/config-R6F6zRJk.js +0 -9
  361. package/dist/chunks/config-SLwkDc4Q2.js +0 -9
  362. package/dist/chunks/config-aJ7sb62Y.js +0 -8
  363. package/dist/chunks/config-b9nc87Oc.js +0 -9
  364. package/dist/chunks/config-dSI8RttH2.js +0 -8
  365. package/dist/chunks/config-im2VHeSM.js +0 -9
  366. package/dist/chunks/config-vKeQ035f.js +0 -9
  367. package/dist/chunks/config-vMcxHlWi.js +0 -14
  368. package/dist/chunks/dialogShared-CONROtU2.js +0 -26
  369. package/dist/chunks/directives-Dr5NPOT8.js +0 -530
  370. package/dist/chunks/en-j3simI0h.js +0 -41
  371. package/dist/chunks/es-CIT9s_vo.js +0 -4
  372. package/dist/chunks/es-CLpJj7KP.js +0 -41
  373. package/dist/chunks/fileValidation-LFD-vwil.js +0 -193
  374. package/dist/chunks/grLoadingStyles-Bjo7ylmq.js +0 -15
  375. package/dist/chunks/grSelectStyles-C3QKIn1J.js +0 -40
  376. package/dist/chunks/granularityI18n-8_v1B11L.js +0 -24
  377. package/dist/chunks/info-CNJnuTYC.js +0 -26
  378. package/dist/chunks/loader-circle-C5vCCMfB.js +0 -23
  379. package/dist/chunks/ru-CiOZPnBu.js +0 -41
  380. package/dist/chunks/safelist-Bq32hAXc.js +0 -13
  381. package/dist/chunks/safelist-CLcTRYB-.js +0 -22
  382. package/dist/chunks/transition-BJXMi52x.js +0 -1617
  383. package/dist/chunks/x--kxrj3ez.js +0 -23
  384. package/dist/chunks/x-circle-ChJ87u1v.js +0 -61
  385. package/dist/components/GrAlert/chunks/GrAlert-DLHkusb-.js +0 -129
  386. package/dist/components/GrAvatar/chunks/GrAvatar-BFYH3HJw.js +0 -32
  387. package/dist/components/GrBadge/chunks/GrBadge-D_AoqGrn.js +0 -27
  388. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-C_N0QJfA.js +0 -26
  389. package/dist/components/GrBottomNav/chunks/GrBottomNav-Chpu3SVd.js +0 -21
  390. package/dist/components/GrButton/chunks/GrButton-BXVVt6Od.js +0 -67
  391. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CmnYHVH7.js +0 -16
  392. package/dist/components/GrCard/chunks/GrCard-DEpN6Ptf.js +0 -10
  393. package/dist/components/GrCheckbox/chunks/GrCheckbox-DF3vJApB.js +0 -111
  394. package/dist/components/GrCollapse/chunks/GrCollapse-D7QYRqNa.js +0 -150
  395. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-C7Eh8-Vn.js +0 -111
  396. package/dist/components/GrDataTable/chunks/GrDataTable-Dxsg1NMP.js +0 -142
  397. package/dist/components/GrDialog/chunks/GrDialog-BSd4-uP5.js +0 -169
  398. package/dist/components/GrDrawer/chunks/GrDrawer-DBBSwe1s.js +0 -135
  399. package/dist/components/GrDropdown/chunks/GrDropdown-BELyRP4A.js +0 -110
  400. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-B8fuk7iP.js +0 -233
  401. package/dist/components/GrEmptyState/chunks/GrEmptyState-BPGoafJI.js +0 -49
  402. package/dist/components/GrFileUpload/chunks/GrFileUpload-BPzx3LEM.js +0 -294
  403. package/dist/components/GrFormField/chunks/GrFormField-Cn8g9eFP.js +0 -28
  404. package/dist/components/GrFormFile/chunks/GrFormFile-DfinD5Iv.js +0 -248
  405. package/dist/components/GrFormSection/chunks/GrFormSection-dKpQw-vh.js +0 -27
  406. package/dist/components/GrIcon/chunks/GrIcon-CXIHuG7L.js +0 -25
  407. package/dist/components/GrImageViewer/chunks/GrImageViewer-CQSNx-D7.js +0 -322
  408. package/dist/components/GrInput/chunks/GrInput-CLKX1inm.js +0 -158
  409. package/dist/components/GrInputTag/chunks/GrInputTag-BAtLody2.js +0 -214
  410. package/dist/components/GrLink/chunks/GrLink-BpXnly-Y.js +0 -59
  411. package/dist/components/GrList/chunks/GrList-BrFc7VdS.js +0 -55
  412. package/dist/components/GrLoading/chunks/GrLoading-dFuoryMY.js +0 -53
  413. package/dist/components/GrModal/chunks/GrModal-uaWXH08K.js +0 -136
  414. package/dist/components/GrNavbar/chunks/GrNavbar-KzLHgdjX.js +0 -62
  415. package/dist/components/GrNumberInput/chunks/GrNumberInput-rENn1802.js +0 -315
  416. package/dist/components/GrPagination/chunks/GrPagination-DP0x3rx6.js +0 -93
  417. package/dist/components/GrProgressBar/chunks/GrProgressBar-DpW93sOi.js +0 -29
  418. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-ASfBwyzQ.js +0 -158
  419. package/dist/components/GrRadio/chunks/GrRadio-8BOo97XV.js +0 -147
  420. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BymbUmqI.js +0 -66
  421. package/dist/components/GrSegmented/chunks/GrSegmented-CK5C_lN7.js +0 -250
  422. package/dist/components/GrSelect/chunks/GrSelect-BMfc1-vs.js +0 -314
  423. package/dist/components/GrSidebar/chunks/GrSidebar-C4SXXhfO.js +0 -29
  424. package/dist/components/GrSkeleton/chunks/GrSkeleton-QlieOdpY.js +0 -25
  425. package/dist/components/GrSwitch/chunks/GrSwitch-Cefiutzu.js +0 -64
  426. package/dist/components/GrTable/chunks/GrTable-k_FUiJQk.js +0 -44
  427. package/dist/components/GrTabs/chunks/GrTabs-B46P-lUc.js +0 -98
  428. package/dist/components/GrTextarea/chunks/GrTextarea-BX7L1MJk.js +0 -57
  429. package/dist/components/GrToaster/chunks/GrToaster-C4l_BjOh.js +0 -139
  430. package/dist/components/GrTooltip/chunks/GrTooltip-BqRAzuLT.js +0 -37
  431. package/dist/components/GrTree/chunks/GrTree-C2CXR_vW.js +0 -614
  432. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DAAay-QB.js +0 -353
@@ -0,0 +1,443 @@
1
+ import { vClickOutside } from "../../../directives/clickOutside.js";
2
+ import { t as GrInput_default } from "../../GrInput/chunks/GrInput-ghxaTf6d.js";
3
+ import { a as linkBaseClass, i as grSelectTriggerClass, n as grSelectNativeClass, r as grSelectPanelClasses, t as defaultBaseClass } from "../../../chunks/grSelectStyles-B7doeAQp.js";
4
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onUnmounted, openBlock, ref, renderList, renderSlot, toDisplayString, unref, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
5
+ //#region src/components/GrSelect/GrSelect.vue?vue&type=script&setup=true&lang.ts
6
+ var _hoisted_1 = [
7
+ "value",
8
+ "multiple",
9
+ "disabled",
10
+ "aria-label"
11
+ ];
12
+ var _hoisted_2 = {
13
+ key: 0,
14
+ value: ""
15
+ };
16
+ var _hoisted_3 = ["value"];
17
+ var _hoisted_4 = ["value"];
18
+ var _hoisted_5 = {
19
+ key: 0,
20
+ "data-testid": "ds-select-chevron",
21
+ class: "absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none"
22
+ };
23
+ var _hoisted_6 = [
24
+ "disabled",
25
+ "aria-label",
26
+ "aria-expanded"
27
+ ];
28
+ var _hoisted_7 = { class: "min-w-0 flex-1" };
29
+ var _hoisted_8 = {
30
+ key: 0,
31
+ class: "shrink-0 h-4 w-4",
32
+ "aria-hidden": "true"
33
+ };
34
+ var _hoisted_9 = {
35
+ key: 1,
36
+ "data-testid": "ds-select-chevron",
37
+ class: "shrink-0 text-[var(--muted-fg)] pointer-events-none"
38
+ };
39
+ var _hoisted_10 = ["disabled", "aria-label"];
40
+ var _hoisted_11 = {
41
+ key: 0,
42
+ class: "p-2 border-b border-[var(--brd)]"
43
+ };
44
+ var _hoisted_12 = ["aria-multiselectable"];
45
+ var _hoisted_13 = ["aria-selected", "onClick"];
46
+ var _hoisted_14 = { class: "flex items-center gap-2 min-w-0" };
47
+ var _hoisted_15 = { class: "truncate" };
48
+ //#endregion
49
+ //#region src/components/GrSelect/GrSelect.vue
50
+ var GrSelect_default = /* @__PURE__ */ defineComponent({
51
+ __name: "GrSelect",
52
+ props: {
53
+ modelValue: {},
54
+ options: { default: void 0 },
55
+ disabled: {
56
+ type: Boolean,
57
+ default: false
58
+ },
59
+ ariaLabel: { default: void 0 },
60
+ view: { default: "default" },
61
+ size: { default: "md" },
62
+ placeholder: { default: void 0 },
63
+ multiple: {
64
+ type: Boolean,
65
+ default: false
66
+ },
67
+ optionsView: { default: "native" },
68
+ allowCustomValue: {
69
+ type: Boolean,
70
+ default: false
71
+ },
72
+ customValuePlaceholder: { default: "Add value…" },
73
+ dropdownMaxHeight: { default: 280 },
74
+ closeOnSelect: {
75
+ type: Boolean,
76
+ default: true
77
+ },
78
+ clearable: {
79
+ type: Boolean,
80
+ default: false
81
+ },
82
+ clearLabel: { default: "Clear" },
83
+ variant: { default: "primary" },
84
+ underline: { default: "auto" }
85
+ },
86
+ emits: ["update:modelValue"],
87
+ setup(__props, { emit: __emit }) {
88
+ const props = __props;
89
+ const baseClassName = computed(() => props.view === "link" ? linkBaseClass : defaultBaseClass);
90
+ const rootClass = computed(() => props.view === "link" ? "relative inline-block align-baseline" : "relative w-full");
91
+ const emit = __emit;
92
+ const optionsResolved = computed(() => props.options ?? []);
93
+ function modelToArray(value) {
94
+ if (Array.isArray(value)) return value;
95
+ if (!value) return [];
96
+ return [value];
97
+ }
98
+ const modelSingle = computed(() => {
99
+ return Array.isArray(props.modelValue) ? props.modelValue[0] ?? "" : props.modelValue;
100
+ });
101
+ const modelMultiple = computed(() => modelToArray(props.modelValue));
102
+ const selectedValues = computed(() => {
103
+ return props.multiple ? modelMultiple.value : modelSingle.value ? [modelSingle.value] : [];
104
+ });
105
+ const hasSelection = computed(() => selectedValues.value.length > 0);
106
+ const selectedOptions = computed(() => {
107
+ const byValue = new Map(optionsResolved.value.map((o) => [o.value, o]));
108
+ return selectedValues.value.map((v) => byValue.get(v) ?? {
109
+ value: v,
110
+ label: v
111
+ });
112
+ });
113
+ const hasModelInOptions = computed(() => {
114
+ if (props.multiple) return false;
115
+ return optionsResolved.value.some((o) => o.value === modelSingle.value);
116
+ });
117
+ const displayLabel = computed(() => {
118
+ if (props.multiple) {
119
+ if (!selectedValues.value.length) return "";
120
+ return selectedValues.value.map((v) => optionsResolved.value.find((o) => o.value === v)?.label ?? v).join(", ");
121
+ }
122
+ return optionsResolved.value.find((o) => o.value === modelSingle.value)?.label ?? modelSingle.value;
123
+ });
124
+ const displayText = computed(() => {
125
+ if (hasSelection.value) return displayLabel.value;
126
+ return props.placeholder ?? "";
127
+ });
128
+ const nativeCustomOptionVisible = computed(() => {
129
+ if (!props.allowCustomValue) return false;
130
+ if (props.optionsView !== "native") return false;
131
+ if (props.multiple) return false;
132
+ if (!props.options) return false;
133
+ if (modelSingle.value === "") return false;
134
+ return !hasModelInOptions.value;
135
+ });
136
+ const customValue = ref("");
137
+ const open = ref(false);
138
+ const rootEl = ref(null);
139
+ const panelEl = ref(null);
140
+ const customInputRef = ref(null);
141
+ const clickOutsideExclude = [() => panelEl.value];
142
+ const panelStyle = ref({
143
+ left: "0px",
144
+ top: "0px",
145
+ width: "0px",
146
+ zIndex: "2147483647"
147
+ });
148
+ function syncPanelPosition() {
149
+ if (typeof window === "undefined") return;
150
+ const root = rootEl.value;
151
+ if (!root) return;
152
+ const rect = root.getBoundingClientRect();
153
+ panelStyle.value = {
154
+ left: `${rect.left}px`,
155
+ top: `${rect.bottom + 8}px`,
156
+ width: `${rect.width}px`,
157
+ zIndex: "2147483647"
158
+ };
159
+ }
160
+ function bindPanelPositionListeners() {
161
+ if (typeof window === "undefined") return;
162
+ window.addEventListener("resize", syncPanelPosition);
163
+ window.addEventListener("scroll", syncPanelPosition, true);
164
+ }
165
+ function unbindPanelPositionListeners() {
166
+ if (typeof window === "undefined") return;
167
+ window.removeEventListener("resize", syncPanelPosition);
168
+ window.removeEventListener("scroll", syncPanelPosition, true);
169
+ }
170
+ function closeDropdown() {
171
+ open.value = false;
172
+ }
173
+ function toggleDropdown() {
174
+ if (props.disabled) return;
175
+ open.value = !open.value;
176
+ }
177
+ function closeOnEscape(e) {
178
+ if (e.key === "Escape") closeDropdown();
179
+ }
180
+ watch(open, async (isOpen) => {
181
+ if (typeof document === "undefined") return;
182
+ document.removeEventListener("keydown", closeOnEscape);
183
+ unbindPanelPositionListeners();
184
+ if (isOpen) document.addEventListener("keydown", closeOnEscape);
185
+ if (!isOpen) {
186
+ customValue.value = "";
187
+ return;
188
+ }
189
+ bindPanelPositionListeners();
190
+ await nextTick();
191
+ syncPanelPosition();
192
+ if (props.allowCustomValue) customInputRef.value?.focus();
193
+ }, { immediate: true });
194
+ onUnmounted(() => {
195
+ if (typeof document === "undefined") return;
196
+ document.removeEventListener("keydown", closeOnEscape);
197
+ unbindPanelPositionListeners();
198
+ });
199
+ const panelClasses = computed(() => {
200
+ return grSelectPanelClasses;
201
+ });
202
+ const visibleOptions = computed(() => {
203
+ const base = optionsResolved.value;
204
+ const withCustom = (() => {
205
+ if (!props.allowCustomValue) return base;
206
+ if (props.multiple) return base;
207
+ if (modelSingle.value === "") return base;
208
+ if (hasModelInOptions.value) return base;
209
+ return [{
210
+ value: modelSingle.value,
211
+ label: modelSingle.value
212
+ }, ...base];
213
+ })();
214
+ if (!props.allowCustomValue) return withCustom;
215
+ const q = customValue.value.trim().toLowerCase();
216
+ if (!q) return withCustom;
217
+ return withCustom.filter((o) => {
218
+ return o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q);
219
+ });
220
+ });
221
+ const canAddCustom = computed(() => {
222
+ if (!props.allowCustomValue) return false;
223
+ if (props.optionsView !== "panel") return false;
224
+ const v = customValue.value.trim();
225
+ if (!v) return false;
226
+ if (props.multiple) {
227
+ if (selectedValues.value.includes(v)) return false;
228
+ return !optionsResolved.value.some((o) => o.value === v);
229
+ }
230
+ if (v === modelSingle.value) return false;
231
+ return !optionsResolved.value.some((o) => o.value === v);
232
+ });
233
+ function emitValue(value) {
234
+ emit("update:modelValue", value);
235
+ }
236
+ function isSelected(value) {
237
+ return selectedValues.value.includes(value);
238
+ }
239
+ function selectValue(value) {
240
+ emitValue(value);
241
+ if (props.closeOnSelect) closeDropdown();
242
+ }
243
+ function toggleValue(value) {
244
+ if (!props.multiple) {
245
+ selectValue(value);
246
+ return;
247
+ }
248
+ const next = selectedValues.value.slice();
249
+ const idx = next.indexOf(value);
250
+ if (idx >= 0) next.splice(idx, 1);
251
+ else next.push(value);
252
+ emitValue(next);
253
+ if (props.closeOnSelect) closeDropdown();
254
+ }
255
+ function addCustom() {
256
+ const v = customValue.value.trim();
257
+ if (!v) return;
258
+ toggleValue(v);
259
+ }
260
+ const showNativeChevron = computed(() => {
261
+ return props.optionsView === "native" && props.view !== "link" && !props.multiple;
262
+ });
263
+ const nativeClearOptionVisible = computed(() => {
264
+ if (!props.clearable) return false;
265
+ if (props.optionsView !== "native") return false;
266
+ if (props.multiple) return false;
267
+ if (!props.options) return true;
268
+ return !props.options.some((o) => o.value === "");
269
+ });
270
+ const panelClearVisible = computed(() => {
271
+ if (!props.clearable) return false;
272
+ if (props.optionsView !== "panel") return false;
273
+ if (props.view === "link") return false;
274
+ return hasSelection.value;
275
+ });
276
+ const nativeClassName = computed(() => {
277
+ return grSelectNativeClass({
278
+ view: props.view,
279
+ size: props.size,
280
+ disabled: props.disabled,
281
+ variant: props.variant,
282
+ underline: props.underline,
283
+ showNativeChevron: showNativeChevron.value
284
+ });
285
+ });
286
+ const triggerClassName = computed(() => {
287
+ return grSelectTriggerClass({
288
+ view: props.view,
289
+ optionsView: props.optionsView,
290
+ size: props.size,
291
+ disabled: props.disabled,
292
+ variant: props.variant,
293
+ underline: props.underline
294
+ });
295
+ });
296
+ function onChange(e) {
297
+ const el = e.target;
298
+ if (props.multiple) {
299
+ emit("update:modelValue", Array.from(el.selectedOptions, (o) => o.value));
300
+ return;
301
+ }
302
+ emit("update:modelValue", el.value);
303
+ }
304
+ function clearSelection() {
305
+ if (props.disabled) return;
306
+ emitValue(props.multiple ? [] : "");
307
+ }
308
+ return (_ctx, _cache) => {
309
+ return __props.optionsView === "native" ? (openBlock(), createElementBlock("div", {
310
+ key: 0,
311
+ "data-ds-select": "",
312
+ class: normalizeClass(rootClass.value)
313
+ }, [createElementVNode("select", {
314
+ "data-ds-select-native": "",
315
+ value: __props.multiple ? modelMultiple.value : modelSingle.value,
316
+ multiple: __props.multiple,
317
+ disabled: __props.disabled,
318
+ "aria-label": __props.ariaLabel,
319
+ class: normalizeClass([baseClassName.value, nativeClassName.value]),
320
+ onChange
321
+ }, [nativeClearOptionVisible.value ? (openBlock(), createElementBlock("option", _hoisted_2)) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default", {}, () => [nativeCustomOptionVisible.value ? (openBlock(), createElementBlock("option", {
322
+ key: 0,
323
+ value: modelSingle.value
324
+ }, toDisplayString(modelSingle.value), 9, _hoisted_3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
325
+ return openBlock(), createElementBlock("option", {
326
+ key: opt.value,
327
+ value: opt.value
328
+ }, toDisplayString(opt.label), 9, _hoisted_4);
329
+ }), 128))])], 42, _hoisted_1), showNativeChevron.value ? (openBlock(), createElementBlock("span", _hoisted_5, [..._cache[1] || (_cache[1] = [createElementVNode("span", {
330
+ class: "i-lucide-chevron-down h-4 w-4",
331
+ "aria-hidden": "true"
332
+ }, null, -1)])])) : createCommentVNode("", true)], 2)) : withDirectives((openBlock(), createElementBlock("div", {
333
+ key: 1,
334
+ ref_key: "rootEl",
335
+ ref: rootEl,
336
+ "data-ds-select": "",
337
+ class: normalizeClass(rootClass.value)
338
+ }, [
339
+ createElementVNode("button", {
340
+ "data-testid": "ds-select-trigger",
341
+ "data-ds-select-trigger": "",
342
+ type: "button",
343
+ disabled: __props.disabled,
344
+ "aria-label": __props.ariaLabel,
345
+ role: "combobox",
346
+ "aria-readonly": "true",
347
+ "aria-expanded": open.value ? "true" : "false",
348
+ class: normalizeClass([baseClassName.value, triggerClassName.value]),
349
+ onClick: toggleDropdown
350
+ }, [createElementVNode("span", _hoisted_7, [renderSlot(_ctx.$slots, "value", {
351
+ selectedOptions: selectedOptions.value,
352
+ selectedValues: selectedValues.value,
353
+ displayLabel: displayLabel.value,
354
+ placeholder: __props.placeholder,
355
+ hasSelection: hasSelection.value
356
+ }, () => [createElementVNode("span", { class: normalizeClass(["block truncate", !hasSelection.value ? "text-[var(--muted-fg)]" : ""]) }, toDisplayString(displayText.value), 3)])]), panelClearVisible.value ? (openBlock(), createElementBlock("span", _hoisted_8)) : (openBlock(), createElementBlock("span", _hoisted_9, [..._cache[2] || (_cache[2] = [createElementVNode("span", {
357
+ class: "i-lucide-chevron-down h-4 w-4",
358
+ "aria-hidden": "true"
359
+ }, null, -1)])]))], 10, _hoisted_6),
360
+ panelClearVisible.value ? (openBlock(), createElementBlock("button", {
361
+ key: 0,
362
+ "data-testid": "ds-select-clear",
363
+ "data-ds-select-clear": "",
364
+ type: "button",
365
+ class: "absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50",
366
+ disabled: __props.disabled,
367
+ "aria-label": __props.clearLabel,
368
+ onClick: withModifiers(clearSelection, ["stop"])
369
+ }, [..._cache[3] || (_cache[3] = [createElementVNode("span", {
370
+ class: "i-lucide-x h-4 w-4",
371
+ "aria-hidden": "true"
372
+ }, null, -1)])], 8, _hoisted_10)) : createCommentVNode("", true),
373
+ (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
374
+ "enter-active-class": "transition ease-out duration-150",
375
+ "enter-from-class": "transform opacity-0 scale-95",
376
+ "enter-to-class": "transform opacity-100 scale-100",
377
+ "leave-active-class": "transition ease-in duration-100",
378
+ "leave-from-class": "transform opacity-100 scale-100",
379
+ "leave-to-class": "transform opacity-0 scale-95"
380
+ }, {
381
+ default: withCtx(() => [withDirectives(createElementVNode("div", {
382
+ ref_key: "panelEl",
383
+ ref: panelEl,
384
+ "data-testid": "ds-select-panel",
385
+ "data-ds-select-panel": "",
386
+ class: "fixed w-full",
387
+ style: normalizeStyle(panelStyle.value)
388
+ }, [createElementVNode("div", { class: normalizeClass(panelClasses.value) }, [__props.allowCustomValue ? (openBlock(), createElementBlock("div", _hoisted_11, [createVNode(GrInput_default, {
389
+ ref_key: "customInputRef",
390
+ ref: customInputRef,
391
+ modelValue: customValue.value,
392
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => customValue.value = $event),
393
+ "data-testid": "ds-select-custom-input",
394
+ type: "text",
395
+ placeholder: __props.customValuePlaceholder,
396
+ size: "sm",
397
+ onKeydown: withKeys(withModifiers(addCustom, ["prevent"]), ["enter"])
398
+ }, null, 8, [
399
+ "modelValue",
400
+ "placeholder",
401
+ "onKeydown"
402
+ ])])) : createCommentVNode("", true), createElementVNode("div", {
403
+ "data-ds-select-listbox": "",
404
+ class: "p-1 overflow-auto",
405
+ style: normalizeStyle({ maxHeight: `${__props.dropdownMaxHeight}px` }),
406
+ role: "listbox",
407
+ "aria-multiselectable": __props.multiple ? "true" : void 0
408
+ }, [canAddCustom.value ? (openBlock(), createElementBlock("button", {
409
+ key: 0,
410
+ "data-testid": "ds-select-add-option",
411
+ "data-ds-select-add-option": "",
412
+ type: "button",
413
+ class: "w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]",
414
+ onClick: addCustom
415
+ }, " Add “" + toDisplayString(customValue.value.trim()) + "” ", 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(visibleOptions.value, (opt) => {
416
+ return openBlock(), createElementBlock("button", {
417
+ key: opt.value,
418
+ "data-ds-select-option": "",
419
+ type: "button",
420
+ role: "option",
421
+ "aria-selected": isSelected(opt.value) ? "true" : "false",
422
+ class: "w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]",
423
+ onClick: ($event) => toggleValue(opt.value)
424
+ }, [renderSlot(_ctx.$slots, "option", {
425
+ option: opt,
426
+ selected: isSelected(opt.value)
427
+ }, () => [createElementVNode("span", _hoisted_14, [createElementVNode("span", {
428
+ class: normalizeClass(["h-4 w-4 shrink-0", isSelected(opt.value) ? "i-lucide-check text-[var(--primary)]" : ""]),
429
+ "aria-hidden": "true"
430
+ }, null, 2), createElementVNode("span", _hoisted_15, toDisplayString(opt.label), 1)])])], 8, _hoisted_13);
431
+ }), 128))], 12, _hoisted_12)], 2)], 4), [[vShow, open.value]])]),
432
+ _: 3
433
+ })]))
434
+ ], 2)), [[unref(vClickOutside), {
435
+ handler: closeDropdown,
436
+ enabled: open.value,
437
+ exclude: clickOutsideExclude
438
+ }]]);
439
+ };
440
+ }
441
+ });
442
+ //#endregion
443
+ export { GrSelect_default as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrSelect-9wRWAu2R.js","names":[],"sources":["../../../../src/components/GrSelect/GrSelect.vue","../../../../src/components/GrSelect/GrSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\n\nimport GrInput from '../GrInput/GrInput.vue'\nimport { vClickOutside } from '../../directives'\n\nimport {\n defaultBaseClass,\n grSelectNativeClass,\n grSelectPanelClasses,\n grSelectTriggerClass,\n linkBaseClass,\n type GrSelectModelValue,\n type GrSelectOption,\n type GrSelectOptionsView,\n type GrSelectSize,\n type GrSelectUnderline,\n type GrSelectVariant,\n type GrSelectView,\n} from './grSelectStyles'\n\nexport type {\n GrSelectModelValue,\n GrSelectOption,\n GrSelectOptionsView,\n GrSelectSize,\n GrSelectUnderline,\n GrSelectVariant,\n GrSelectView,\n} from './grSelectStyles'\n\n/**\n * Пропсы публичного DS-примитива «Select».\n */\nexport interface GrSelectProps {\n modelValue: GrSelectModelValue\n options?: GrSelectOption[]\n disabled?: boolean\n ariaLabel?: string\n view?: GrSelectView\n size?: GrSelectSize\n /** Placeholder (показывается, когда значение не выбрано). */\n placeholder?: string\n /** Multiple selection. */\n multiple?: boolean\n /** Как отображать список опций: нативный `<select>` или кастомная панель. */\n optionsView?: GrSelectOptionsView\n /** Разрешает ввод/выбор значения, которого нет в `options`. */\n allowCustomValue?: boolean\n /** Placeholder для инпута кастомного значения (только в `optionsView=\"panel\"`). */\n customValuePlaceholder?: string\n /** Максимальная высота панели (только в `optionsView=\"panel\"`). */\n dropdownMaxHeight?: number\n /** Закрывать панель после выбора (только в `optionsView=\"panel\"`). */\n closeOnSelect?: boolean\n /** Разрешает очистку выбранного значения. */\n clearable?: boolean\n /** i18n-label для кнопки очистки (`aria-label`). */\n clearLabel?: string\n /**\n * Цвет/вариант ссылки для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n variant?: GrSelectVariant\n /**\n * Подчёркивание для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n underline?: GrSelectUnderline\n}\n\nconst props = withDefaults(\n defineProps<GrSelectProps>(),\n {\n options: undefined,\n disabled: false,\n ariaLabel: undefined,\n view: 'default',\n size: 'md',\n\n placeholder: undefined,\n multiple: false,\n\n optionsView: 'native',\n allowCustomValue: false,\n customValuePlaceholder: 'Add value…',\n dropdownMaxHeight: 280,\n closeOnSelect: true,\n clearable: false,\n clearLabel: 'Clear',\n variant: 'primary',\n underline: 'auto',\n },\n)\n\nconst baseClassName = computed(() => props.view === 'link' ? linkBaseClass : defaultBaseClass)\n\nconst rootClass = computed(() => props.view === 'link' ? 'relative inline-block align-baseline' : 'relative w-full')\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrSelectModelValue): void\n}>()\n\nconst optionsResolved = computed(() => props.options ?? [])\n\nfunction modelToArray(value: GrSelectModelValue): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n return [value]\n}\n\nconst modelSingle = computed(() => {\n return Array.isArray(props.modelValue) ? (props.modelValue[0] ?? '') : props.modelValue\n})\n\nconst modelMultiple = computed(() => modelToArray(props.modelValue))\n\nconst selectedValues = computed(() => {\n return props.multiple ? modelMultiple.value : (modelSingle.value ? [modelSingle.value] : [])\n})\n\nconst hasSelection = computed(() => selectedValues.value.length > 0)\n\nconst selectedOptions = computed<GrSelectOption[]>(() => {\n const byValue = new Map(optionsResolved.value.map(o => [o.value, o]))\n return selectedValues.value.map((v) => byValue.get(v) ?? { value: v, label: v })\n})\n\nconst hasModelInOptions = computed(() => {\n if (props.multiple) return false\n return optionsResolved.value.some((o) => o.value === modelSingle.value)\n})\n\nconst displayLabel = computed(() => {\n if (props.multiple) {\n if (!selectedValues.value.length) return ''\n return selectedValues.value\n .map((v) => optionsResolved.value.find((o) => o.value === v)?.label ?? v)\n .join(', ')\n }\n\n return optionsResolved.value.find((o) => o.value === modelSingle.value)?.label ?? modelSingle.value\n})\n\nconst displayText = computed(() => {\n if (hasSelection.value) return displayLabel.value\n return props.placeholder ?? ''\n})\n\nconst nativeCustomOptionVisible = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return false\n if (modelSingle.value === '') return false\n return !hasModelInOptions.value\n})\n\nconst customValue = ref('')\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst customInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\nconst panelStyle = ref<Record<string, string>>({\n left: '0px',\n top: '0px',\n width: '0px',\n zIndex: '2147483647',\n})\n\nfunction syncPanelPosition(): void {\n if (typeof window === 'undefined') return\n\n const root = rootEl.value\n if (!root) return\n\n const rect = root.getBoundingClientRect()\n\n panelStyle.value = {\n left: `${rect.left}px`,\n top: `${rect.bottom + 8}px`,\n width: `${rect.width}px`,\n zIndex: '2147483647',\n }\n}\n\nfunction bindPanelPositionListeners(): void {\n if (typeof window === 'undefined') return\n window.addEventListener('resize', syncPanelPosition)\n window.addEventListener('scroll', syncPanelPosition, true)\n}\n\nfunction unbindPanelPositionListeners(): void {\n if (typeof window === 'undefined') return\n window.removeEventListener('resize', syncPanelPosition)\n window.removeEventListener('scroll', syncPanelPosition, true)\n}\n\nfunction closeDropdown(): void {\n open.value = false\n}\n\nfunction toggleDropdown(): void {\n if (props.disabled) return\n open.value = !open.value\n}\n\nfunction closeOnEscape(e: KeyboardEvent): void {\n if (e.key === 'Escape') closeDropdown()\n}\n\nwatch(\n open,\n async (isOpen) => {\n if (typeof document === 'undefined') return\n\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\n\n if (isOpen) document.addEventListener('keydown', closeOnEscape)\n\n if (!isOpen) {\n customValue.value = ''\n return\n }\n\n bindPanelPositionListeners()\n await nextTick()\n syncPanelPosition()\n\n if (props.allowCustomValue) {\n customInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nonUnmounted(() => {\n if (typeof document === 'undefined') return\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\n})\n\nconst panelClasses = computed(() => {\n return grSelectPanelClasses\n})\n\nconst visibleOptions = computed(() => {\n const base = optionsResolved.value\n\n const withCustom = (() => {\n if (!props.allowCustomValue) return base\n if (props.multiple) return base\n if (modelSingle.value === '') return base\n if (hasModelInOptions.value) return base\n return [{ value: modelSingle.value, label: modelSingle.value }, ...base]\n })()\n\n if (!props.allowCustomValue) return withCustom\n\n const q = customValue.value.trim().toLowerCase()\n if (!q) return withCustom\n\n return withCustom.filter((o) => {\n return o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q)\n })\n})\n\nconst canAddCustom = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'panel') return false\n const v = customValue.value.trim()\n if (!v) return false\n\n if (props.multiple) {\n if (selectedValues.value.includes(v)) return false\n return !optionsResolved.value.some((o) => o.value === v)\n }\n\n if (v === modelSingle.value) return false\n return !optionsResolved.value.some((o) => o.value === v)\n})\n\nfunction emitValue(value: GrSelectModelValue): void {\n emit('update:modelValue', value)\n}\n\nfunction isSelected(value: string): boolean {\n return selectedValues.value.includes(value)\n}\n\nfunction selectValue(value: string): void {\n emitValue(value)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction toggleValue(value: string): void {\n if (!props.multiple) {\n selectValue(value)\n return\n }\n\n const next = selectedValues.value.slice()\n const idx = next.indexOf(value)\n if (idx >= 0) {\n next.splice(idx, 1)\n }\n else {\n next.push(value)\n }\n\n emitValue(next)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction addCustom(): void {\n const v = customValue.value.trim()\n if (!v) return\n toggleValue(v)\n}\n\nconst showNativeChevron = computed(() => {\n return props.optionsView === 'native' && props.view !== 'link' && !props.multiple\n})\n\nconst nativeClearOptionVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return true\n return !props.options.some(o => o.value === '')\n})\n\nconst panelClearVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'panel') return false\n if (props.view === 'link') return false\n return hasSelection.value\n})\n\nconst nativeClassName = computed(() => {\n return grSelectNativeClass({\n view: props.view,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n showNativeChevron: showNativeChevron.value,\n })\n})\n\nconst triggerClassName = computed(() => {\n return grSelectTriggerClass({\n view: props.view,\n optionsView: props.optionsView,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n })\n})\n\nfunction onChange(e: Event): void {\n const el = e.target as HTMLSelectElement\n\n if (props.multiple) {\n const values = Array.from(el.selectedOptions, o => o.value)\n emit('update:modelValue', values)\n return\n }\n\n emit('update:modelValue', el.value)\n}\n\nfunction clearSelection(): void {\n if (props.disabled) return\n emitValue(props.multiple ? [] : '')\n}\n</script>\n\n<template>\n <div\n v-if=\"optionsView === 'native'\"\n data-ds-select\n :class=\"rootClass\"\n >\n <select\n data-ds-select-native\n :value=\"multiple ? modelMultiple : modelSingle\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :class=\"[baseClassName, nativeClassName]\"\n @change=\"onChange\"\n >\n <option v-if=\"nativeClearOptionVisible\" value=\"\" />\n\n <slot>\n <option v-if=\"nativeCustomOptionVisible\" :value=\"modelSingle\">\n {{ modelSingle }}\n </option>\n <option v-for=\"opt in options\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </option>\n </slot>\n </select>\n\n <span\n v-if=\"showNativeChevron\"\n data-testid=\"ds-select-chevron\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </div>\n\n <div\n v-else\n ref=\"rootEl\"\n v-click-outside=\"{ handler: closeDropdown, enabled: open, exclude: clickOutsideExclude }\"\n data-ds-select\n :class=\"rootClass\"\n >\n <button\n data-testid=\"ds-select-trigger\"\n data-ds-select-trigger\n type=\"button\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n role=\"combobox\"\n aria-readonly=\"true\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :class=\"[baseClassName, triggerClassName]\"\n @click=\"toggleDropdown\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot\n name=\"value\"\n :selected-options=\"selectedOptions\"\n :selected-values=\"selectedValues\"\n :display-label=\"displayLabel\"\n :placeholder=\"placeholder\"\n :has-selection=\"hasSelection\"\n >\n <span\n class=\"block truncate\"\n :class=\"!hasSelection ? 'text-[var(--muted-fg)]' : ''\"\n >\n {{ displayText }}\n </span>\n </slot>\n </span>\n\n <span\n v-if=\"panelClearVisible\"\n class=\"shrink-0 h-4 w-4\"\n aria-hidden=\"true\"\n />\n\n <span\n v-else\n data-testid=\"ds-select-chevron\"\n class=\"shrink-0 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <button\n v-if=\"panelClearVisible\"\n data-testid=\"ds-select-clear\"\n data-ds-select-clear\n type=\"button\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50\"\n :disabled=\"disabled\"\n :aria-label=\"clearLabel\"\n @click.stop=\"clearSelection\"\n >\n <span class=\"i-lucide-x h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <teleport to=\"body\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n ref=\"panelEl\"\n data-testid=\"ds-select-panel\"\n data-ds-select-panel\n class=\"fixed w-full\"\n :style=\"panelStyle\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"allowCustomValue\" class=\"p-2 border-b border-[var(--brd)]\">\n <GrInput\n ref=\"customInputRef\"\n v-model=\"customValue\"\n data-testid=\"ds-select-custom-input\"\n type=\"text\"\n :placeholder=\"customValuePlaceholder\"\n size=\"sm\"\n @keydown.enter.prevent=\"addCustom\"\n />\n </div>\n\n <div\n data-ds-select-listbox\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple ? 'true' : undefined\"\n >\n <button\n v-if=\"canAddCustom\"\n data-testid=\"ds-select-add-option\"\n data-ds-select-add-option\n type=\"button\"\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\"\n @click=\"addCustom\"\n >\n Add “{{ customValue.trim() }}”\n </button>\n\n <button\n v-for=\"opt in visibleOptions\"\n :key=\"opt.value\"\n data-ds-select-option\n type=\"button\"\n role=\"option\"\n :aria-selected=\"isSelected(opt.value) ? 'true' : 'false'\"\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\"\n @click=\"toggleValue(opt.value)\"\n >\n <slot name=\"option\" :option=\"opt\" :selected=\"isSelected(opt.value)\">\n <span class=\"flex items-center gap-2 min-w-0\">\n <span\n class=\"h-4 w-4 shrink-0\"\n :class=\"isSelected(opt.value) ? 'i-lucide-check text-[var(--primary)]' : ''\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate\">{{ opt.label }}</span>\n </span>\n </slot>\n </button>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\n\nimport GrInput from '../GrInput/GrInput.vue'\nimport { vClickOutside } from '../../directives'\n\nimport {\n defaultBaseClass,\n grSelectNativeClass,\n grSelectPanelClasses,\n grSelectTriggerClass,\n linkBaseClass,\n type GrSelectModelValue,\n type GrSelectOption,\n type GrSelectOptionsView,\n type GrSelectSize,\n type GrSelectUnderline,\n type GrSelectVariant,\n type GrSelectView,\n} from './grSelectStyles'\n\nexport type {\n GrSelectModelValue,\n GrSelectOption,\n GrSelectOptionsView,\n GrSelectSize,\n GrSelectUnderline,\n GrSelectVariant,\n GrSelectView,\n} from './grSelectStyles'\n\n/**\n * Пропсы публичного DS-примитива «Select».\n */\nexport interface GrSelectProps {\n modelValue: GrSelectModelValue\n options?: GrSelectOption[]\n disabled?: boolean\n ariaLabel?: string\n view?: GrSelectView\n size?: GrSelectSize\n /** Placeholder (показывается, когда значение не выбрано). */\n placeholder?: string\n /** Multiple selection. */\n multiple?: boolean\n /** Как отображать список опций: нативный `<select>` или кастомная панель. */\n optionsView?: GrSelectOptionsView\n /** Разрешает ввод/выбор значения, которого нет в `options`. */\n allowCustomValue?: boolean\n /** Placeholder для инпута кастомного значения (только в `optionsView=\"panel\"`). */\n customValuePlaceholder?: string\n /** Максимальная высота панели (только в `optionsView=\"panel\"`). */\n dropdownMaxHeight?: number\n /** Закрывать панель после выбора (только в `optionsView=\"panel\"`). */\n closeOnSelect?: boolean\n /** Разрешает очистку выбранного значения. */\n clearable?: boolean\n /** i18n-label для кнопки очистки (`aria-label`). */\n clearLabel?: string\n /**\n * Цвет/вариант ссылки для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n variant?: GrSelectVariant\n /**\n * Подчёркивание для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n underline?: GrSelectUnderline\n}\n\nconst props = withDefaults(\n defineProps<GrSelectProps>(),\n {\n options: undefined,\n disabled: false,\n ariaLabel: undefined,\n view: 'default',\n size: 'md',\n\n placeholder: undefined,\n multiple: false,\n\n optionsView: 'native',\n allowCustomValue: false,\n customValuePlaceholder: 'Add value…',\n dropdownMaxHeight: 280,\n closeOnSelect: true,\n clearable: false,\n clearLabel: 'Clear',\n variant: 'primary',\n underline: 'auto',\n },\n)\n\nconst baseClassName = computed(() => props.view === 'link' ? linkBaseClass : defaultBaseClass)\n\nconst rootClass = computed(() => props.view === 'link' ? 'relative inline-block align-baseline' : 'relative w-full')\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrSelectModelValue): void\n}>()\n\nconst optionsResolved = computed(() => props.options ?? [])\n\nfunction modelToArray(value: GrSelectModelValue): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n return [value]\n}\n\nconst modelSingle = computed(() => {\n return Array.isArray(props.modelValue) ? (props.modelValue[0] ?? '') : props.modelValue\n})\n\nconst modelMultiple = computed(() => modelToArray(props.modelValue))\n\nconst selectedValues = computed(() => {\n return props.multiple ? modelMultiple.value : (modelSingle.value ? [modelSingle.value] : [])\n})\n\nconst hasSelection = computed(() => selectedValues.value.length > 0)\n\nconst selectedOptions = computed<GrSelectOption[]>(() => {\n const byValue = new Map(optionsResolved.value.map(o => [o.value, o]))\n return selectedValues.value.map((v) => byValue.get(v) ?? { value: v, label: v })\n})\n\nconst hasModelInOptions = computed(() => {\n if (props.multiple) return false\n return optionsResolved.value.some((o) => o.value === modelSingle.value)\n})\n\nconst displayLabel = computed(() => {\n if (props.multiple) {\n if (!selectedValues.value.length) return ''\n return selectedValues.value\n .map((v) => optionsResolved.value.find((o) => o.value === v)?.label ?? v)\n .join(', ')\n }\n\n return optionsResolved.value.find((o) => o.value === modelSingle.value)?.label ?? modelSingle.value\n})\n\nconst displayText = computed(() => {\n if (hasSelection.value) return displayLabel.value\n return props.placeholder ?? ''\n})\n\nconst nativeCustomOptionVisible = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return false\n if (modelSingle.value === '') return false\n return !hasModelInOptions.value\n})\n\nconst customValue = ref('')\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst customInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\nconst panelStyle = ref<Record<string, string>>({\n left: '0px',\n top: '0px',\n width: '0px',\n zIndex: '2147483647',\n})\n\nfunction syncPanelPosition(): void {\n if (typeof window === 'undefined') return\n\n const root = rootEl.value\n if (!root) return\n\n const rect = root.getBoundingClientRect()\n\n panelStyle.value = {\n left: `${rect.left}px`,\n top: `${rect.bottom + 8}px`,\n width: `${rect.width}px`,\n zIndex: '2147483647',\n }\n}\n\nfunction bindPanelPositionListeners(): void {\n if (typeof window === 'undefined') return\n window.addEventListener('resize', syncPanelPosition)\n window.addEventListener('scroll', syncPanelPosition, true)\n}\n\nfunction unbindPanelPositionListeners(): void {\n if (typeof window === 'undefined') return\n window.removeEventListener('resize', syncPanelPosition)\n window.removeEventListener('scroll', syncPanelPosition, true)\n}\n\nfunction closeDropdown(): void {\n open.value = false\n}\n\nfunction toggleDropdown(): void {\n if (props.disabled) return\n open.value = !open.value\n}\n\nfunction closeOnEscape(e: KeyboardEvent): void {\n if (e.key === 'Escape') closeDropdown()\n}\n\nwatch(\n open,\n async (isOpen) => {\n if (typeof document === 'undefined') return\n\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\n\n if (isOpen) document.addEventListener('keydown', closeOnEscape)\n\n if (!isOpen) {\n customValue.value = ''\n return\n }\n\n bindPanelPositionListeners()\n await nextTick()\n syncPanelPosition()\n\n if (props.allowCustomValue) {\n customInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nonUnmounted(() => {\n if (typeof document === 'undefined') return\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\n})\n\nconst panelClasses = computed(() => {\n return grSelectPanelClasses\n})\n\nconst visibleOptions = computed(() => {\n const base = optionsResolved.value\n\n const withCustom = (() => {\n if (!props.allowCustomValue) return base\n if (props.multiple) return base\n if (modelSingle.value === '') return base\n if (hasModelInOptions.value) return base\n return [{ value: modelSingle.value, label: modelSingle.value }, ...base]\n })()\n\n if (!props.allowCustomValue) return withCustom\n\n const q = customValue.value.trim().toLowerCase()\n if (!q) return withCustom\n\n return withCustom.filter((o) => {\n return o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q)\n })\n})\n\nconst canAddCustom = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'panel') return false\n const v = customValue.value.trim()\n if (!v) return false\n\n if (props.multiple) {\n if (selectedValues.value.includes(v)) return false\n return !optionsResolved.value.some((o) => o.value === v)\n }\n\n if (v === modelSingle.value) return false\n return !optionsResolved.value.some((o) => o.value === v)\n})\n\nfunction emitValue(value: GrSelectModelValue): void {\n emit('update:modelValue', value)\n}\n\nfunction isSelected(value: string): boolean {\n return selectedValues.value.includes(value)\n}\n\nfunction selectValue(value: string): void {\n emitValue(value)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction toggleValue(value: string): void {\n if (!props.multiple) {\n selectValue(value)\n return\n }\n\n const next = selectedValues.value.slice()\n const idx = next.indexOf(value)\n if (idx >= 0) {\n next.splice(idx, 1)\n }\n else {\n next.push(value)\n }\n\n emitValue(next)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction addCustom(): void {\n const v = customValue.value.trim()\n if (!v) return\n toggleValue(v)\n}\n\nconst showNativeChevron = computed(() => {\n return props.optionsView === 'native' && props.view !== 'link' && !props.multiple\n})\n\nconst nativeClearOptionVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return true\n return !props.options.some(o => o.value === '')\n})\n\nconst panelClearVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'panel') return false\n if (props.view === 'link') return false\n return hasSelection.value\n})\n\nconst nativeClassName = computed(() => {\n return grSelectNativeClass({\n view: props.view,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n showNativeChevron: showNativeChevron.value,\n })\n})\n\nconst triggerClassName = computed(() => {\n return grSelectTriggerClass({\n view: props.view,\n optionsView: props.optionsView,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n })\n})\n\nfunction onChange(e: Event): void {\n const el = e.target as HTMLSelectElement\n\n if (props.multiple) {\n const values = Array.from(el.selectedOptions, o => o.value)\n emit('update:modelValue', values)\n return\n }\n\n emit('update:modelValue', el.value)\n}\n\nfunction clearSelection(): void {\n if (props.disabled) return\n emitValue(props.multiple ? [] : '')\n}\n</script>\n\n<template>\n <div\n v-if=\"optionsView === 'native'\"\n data-ds-select\n :class=\"rootClass\"\n >\n <select\n data-ds-select-native\n :value=\"multiple ? modelMultiple : modelSingle\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :class=\"[baseClassName, nativeClassName]\"\n @change=\"onChange\"\n >\n <option v-if=\"nativeClearOptionVisible\" value=\"\" />\n\n <slot>\n <option v-if=\"nativeCustomOptionVisible\" :value=\"modelSingle\">\n {{ modelSingle }}\n </option>\n <option v-for=\"opt in options\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </option>\n </slot>\n </select>\n\n <span\n v-if=\"showNativeChevron\"\n data-testid=\"ds-select-chevron\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </div>\n\n <div\n v-else\n ref=\"rootEl\"\n v-click-outside=\"{ handler: closeDropdown, enabled: open, exclude: clickOutsideExclude }\"\n data-ds-select\n :class=\"rootClass\"\n >\n <button\n data-testid=\"ds-select-trigger\"\n data-ds-select-trigger\n type=\"button\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n role=\"combobox\"\n aria-readonly=\"true\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :class=\"[baseClassName, triggerClassName]\"\n @click=\"toggleDropdown\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot\n name=\"value\"\n :selected-options=\"selectedOptions\"\n :selected-values=\"selectedValues\"\n :display-label=\"displayLabel\"\n :placeholder=\"placeholder\"\n :has-selection=\"hasSelection\"\n >\n <span\n class=\"block truncate\"\n :class=\"!hasSelection ? 'text-[var(--muted-fg)]' : ''\"\n >\n {{ displayText }}\n </span>\n </slot>\n </span>\n\n <span\n v-if=\"panelClearVisible\"\n class=\"shrink-0 h-4 w-4\"\n aria-hidden=\"true\"\n />\n\n <span\n v-else\n data-testid=\"ds-select-chevron\"\n class=\"shrink-0 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <button\n v-if=\"panelClearVisible\"\n data-testid=\"ds-select-clear\"\n data-ds-select-clear\n type=\"button\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50\"\n :disabled=\"disabled\"\n :aria-label=\"clearLabel\"\n @click.stop=\"clearSelection\"\n >\n <span class=\"i-lucide-x h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <teleport to=\"body\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n ref=\"panelEl\"\n data-testid=\"ds-select-panel\"\n data-ds-select-panel\n class=\"fixed w-full\"\n :style=\"panelStyle\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"allowCustomValue\" class=\"p-2 border-b border-[var(--brd)]\">\n <GrInput\n ref=\"customInputRef\"\n v-model=\"customValue\"\n data-testid=\"ds-select-custom-input\"\n type=\"text\"\n :placeholder=\"customValuePlaceholder\"\n size=\"sm\"\n @keydown.enter.prevent=\"addCustom\"\n />\n </div>\n\n <div\n data-ds-select-listbox\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple ? 'true' : undefined\"\n >\n <button\n v-if=\"canAddCustom\"\n data-testid=\"ds-select-add-option\"\n data-ds-select-add-option\n type=\"button\"\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\"\n @click=\"addCustom\"\n >\n Add “{{ customValue.trim() }}”\n </button>\n\n <button\n v-for=\"opt in visibleOptions\"\n :key=\"opt.value\"\n data-ds-select-option\n type=\"button\"\n role=\"option\"\n :aria-selected=\"isSelected(opt.value) ? 'true' : 'false'\"\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\"\n @click=\"toggleValue(opt.value)\"\n >\n <slot name=\"option\" :option=\"opt\" :selected=\"isSelected(opt.value)\">\n <span class=\"flex items-center gap-2 min-w-0\">\n <span\n class=\"h-4 w-4 shrink-0\"\n :class=\"isSelected(opt.value) ? 'i-lucide-check text-[var(--primary)]' : ''\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate\">{{ opt.label }}</span>\n </span>\n </slot>\n </button>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as e } from "./chunks/GrSelect-BMfc1-vs.js";
2
- import { n as t, t as n } from "../../chunks/config-CLawBqde.js";
3
- export { e as GrSelect, e as default, n as grSelectConfig, t as grSelectSafelist };
1
+ import { t as GrSelect_default } from "./chunks/GrSelect-9wRWAu2R.js";
2
+ import { n as grSelectSafelist, t as grSelectConfig } from "../../chunks/config-BDlh6iNz.js";
3
+ export { GrSelect_default as GrSelect, GrSelect_default as default, grSelectConfig, grSelectSafelist };
@@ -0,0 +1,44 @@
1
+ import { createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, openBlock, renderSlot, toDisplayString } from "vue";
2
+ //#region src/components/GrSidebar/GrSidebar.vue?vue&type=script&setup=true&lang.ts
3
+ var _hoisted_1 = {
4
+ "data-ds-sidebar": "",
5
+ class: "border-r border-[var(--sidebar-brd)] bg-[var(--sidebar)] text-[var(--sidebar-fg)]"
6
+ };
7
+ var _hoisted_2 = {
8
+ key: 0,
9
+ "data-ds-sidebar-header": "",
10
+ class: "border-b border-[var(--sidebar-brd)] px-4 py-4"
11
+ };
12
+ var _hoisted_3 = {
13
+ key: 0,
14
+ "data-ds-sidebar-subtitle": "",
15
+ class: "text-[14px] text-[var(--muted-fg)]"
16
+ };
17
+ var _hoisted_4 = {
18
+ key: 1,
19
+ "data-ds-sidebar-title": "",
20
+ class: "text-[18px] font-700"
21
+ };
22
+ var _hoisted_5 = { class: "p-3" };
23
+ //#endregion
24
+ //#region src/components/GrSidebar/GrSidebar.vue
25
+ var GrSidebar_default = /* @__PURE__ */ defineComponent({
26
+ __name: "GrSidebar",
27
+ props: {
28
+ title: { default: void 0 },
29
+ subtitle: { default: void 0 }
30
+ },
31
+ setup(__props) {
32
+ /**
33
+ * GrSidebar — боковая панель приложения с заголовком и слотом контента.
34
+ *
35
+ * Слоты `#title` / `#subtitle` имеют приоритет над одноимёнными пропами
36
+ * и позволяют передать произвольную разметку (иконки, бейджи, действия).
37
+ */
38
+ return (_ctx, _cache) => {
39
+ return openBlock(), createElementBlock("aside", _hoisted_1, [_ctx.$slots.title || __props.title || _ctx.$slots.subtitle || __props.subtitle ? (openBlock(), createElementBlock("div", _hoisted_2, [_ctx.$slots.subtitle || __props.subtitle ? (openBlock(), createElementBlock("div", _hoisted_3, [renderSlot(_ctx.$slots, "subtitle", {}, () => [createTextVNode(toDisplayString(__props.subtitle), 1)])])) : createCommentVNode("", true), _ctx.$slots.title || __props.title ? (openBlock(), createElementBlock("div", _hoisted_4, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true)])) : createCommentVNode("", true), createElementVNode("div", _hoisted_5, [renderSlot(_ctx.$slots, "default")])]);
40
+ };
41
+ }
42
+ });
43
+ //#endregion
44
+ export { GrSidebar_default as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrSidebar-CSZ3RpFB.js","names":["$slots"],"sources":["../../../../src/components/GrSidebar/GrSidebar.vue","../../../../src/components/GrSidebar/GrSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrSidebar — боковая панель приложения с заголовком и слотом контента.\n *\n * Слоты `#title` / `#subtitle` имеют приоритет над одноимёнными пропами\n * и позволяют передать произвольную разметку (иконки, бейджи, действия).\n */\nexport interface GrSidebarProps {\n title?: string\n subtitle?: string\n}\n\nwithDefaults(defineProps<GrSidebarProps>(), {\n title: undefined,\n subtitle: undefined,\n})\n</script>\n\n<template>\n <aside\n data-ds-sidebar\n class=\"border-r border-[var(--sidebar-brd)] bg-[var(--sidebar)] text-[var(--sidebar-fg)]\"\n >\n <div\n v-if=\"$slots.title || title || $slots.subtitle || subtitle\"\n data-ds-sidebar-header\n class=\"border-b border-[var(--sidebar-brd)] px-4 py-4\"\n >\n <div\n v-if=\"$slots.subtitle || subtitle\"\n data-ds-sidebar-subtitle\n class=\"text-[14px] text-[var(--muted-fg)]\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </div>\n <div\n v-if=\"$slots.title || title\"\n data-ds-sidebar-title\n class=\"text-[18px] font-700\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n </div>\n <div class=\"p-3\">\n <slot />\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrSidebar — боковая панель приложения с заголовком и слотом контента.\n *\n * Слоты `#title` / `#subtitle` имеют приоритет над одноимёнными пропами\n * и позволяют передать произвольную разметку (иконки, бейджи, действия).\n */\nexport interface GrSidebarProps {\n title?: string\n subtitle?: string\n}\n\nwithDefaults(defineProps<GrSidebarProps>(), {\n title: undefined,\n subtitle: undefined,\n})\n</script>\n\n<template>\n <aside\n data-ds-sidebar\n class=\"border-r border-[var(--sidebar-brd)] bg-[var(--sidebar)] text-[var(--sidebar-fg)]\"\n >\n <div\n v-if=\"$slots.title || title || $slots.subtitle || subtitle\"\n data-ds-sidebar-header\n class=\"border-b border-[var(--sidebar-brd)] px-4 py-4\"\n >\n <div\n v-if=\"$slots.subtitle || subtitle\"\n data-ds-sidebar-subtitle\n class=\"text-[14px] text-[var(--muted-fg)]\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </div>\n <div\n v-if=\"$slots.title || title\"\n data-ds-sidebar-title\n class=\"text-[18px] font-700\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n </div>\n <div class=\"p-3\">\n <slot />\n </div>\n </aside>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmBE,mBA+BQ,SA/BR,YA+BQ,CA1BEA,KAAAA,OAAO,SAAS,QAAA,SAASA,KAAAA,OAAO,YAAY,QAAA,YAAA,WAAA,EADpD,mBAuBM,OAvBN,YAuBM,CAjBIA,KAAAA,OAAO,YAAY,QAAA,YAAA,WAAA,EAD3B,mBAQM,OARN,YAQM,CAHJ,WAEO,KAAA,QAAA,YAAA,EAAA,QAAA,CAAA,gBAAA,gBADF,QAAA,SAAQ,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,EAIPA,KAAAA,OAAO,SAAS,QAAA,SAAA,WAAA,EADxB,mBAQM,OARN,YAQM,CAHJ,WAEO,KAAA,QAAA,SAAA,EAAA,QAAA,CAAA,gBAAA,gBADF,QAAA,MAAK,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,EAId,mBAEM,OAFN,YAEM,CADJ,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA,CAAA,CAAA"}
@@ -1,3 +1,3 @@
1
- import { t as e } from "./chunks/GrSidebar-C4SXXhfO.js";
2
- import { t } from "../../chunks/config-DlidGf7P.js";
3
- export { e as GrSidebar, e as default, t as grSidebarConfig };
1
+ import { t as GrSidebar_default } from "./chunks/GrSidebar-CSZ3RpFB.js";
2
+ import { t as grSidebarConfig } from "../../chunks/config-qJXIIY1E.js";
3
+ export { GrSidebar_default as GrSidebar, GrSidebar_default as default, grSidebarConfig };
@@ -0,0 +1,33 @@
1
+ import { createElementBlock, defineComponent, normalizeStyle, openBlock } from "vue";
2
+ import '../../../GrSkeleton.css';//#endregion
3
+ //#region src/components/GrSkeleton/GrSkeleton.vue
4
+ var GrSkeleton_default = /* @__PURE__ */ defineComponent({
5
+ __name: "GrSkeleton",
6
+ props: {
7
+ height: { default: "12px" },
8
+ width: { default: "100%" },
9
+ rounded: { default: "9999px" }
10
+ },
11
+ setup(__props) {
12
+ /**
13
+ * GrSkeleton — заглушка-плейсхолдер для загружающегося контента.
14
+ *
15
+ * Помечен `aria-hidden="true"`, чтобы скринридер не озвучивал «пустой» узел;
16
+ * внешний контейнер обычно имеет `aria-busy="true"` + `aria-live`.
17
+ */
18
+ return (_ctx, _cache) => {
19
+ return openBlock(), createElementBlock("div", {
20
+ "data-ds-skeleton": "",
21
+ "aria-hidden": "true",
22
+ class: "bg-[var(--muted)] border border-[var(--brd)]",
23
+ style: normalizeStyle({
24
+ height: __props.height,
25
+ width: __props.width,
26
+ borderRadius: __props.rounded
27
+ })
28
+ }, null, 4);
29
+ };
30
+ }
31
+ });
32
+ //#endregion
33
+ export { GrSkeleton_default as t };