@feugene/granularity 0.24.1 → 0.26.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 (296) hide show
  1. package/dist/chunks/config-BViooYNv.js.map +1 -0
  2. package/dist/chunks/config-BfsBepkH.js.map +1 -0
  3. package/dist/chunks/config-BuGlNPE92.js.map +1 -0
  4. package/dist/chunks/config-CPSxM7XE.js +8 -0
  5. package/dist/chunks/config-CPSxM7XE.js.map +1 -0
  6. package/dist/chunks/config-D7zgE_Gr.js +107 -0
  7. package/dist/chunks/config-D7zgE_Gr.js.map +1 -0
  8. package/dist/chunks/config-DAX8Deh1.js.map +1 -0
  9. package/dist/chunks/config-DGCMHPCR.js +19 -0
  10. package/dist/chunks/config-DGCMHPCR.js.map +1 -0
  11. package/dist/chunks/config-DGWFal5h.js +128 -0
  12. package/dist/chunks/config-DGWFal5h.js.map +1 -0
  13. package/dist/chunks/config-DKISz9gR.js +39 -0
  14. package/dist/chunks/config-DKISz9gR.js.map +1 -0
  15. package/dist/chunks/{config-BSyiFlbi2.js → config-DtgYuGUn2.js} +2 -1
  16. package/dist/chunks/config-DtgYuGUn2.js.map +1 -0
  17. package/dist/chunks/config-Iu684VNI.js +21 -0
  18. package/dist/chunks/config-Iu684VNI.js.map +1 -0
  19. package/dist/chunks/config-T3qdQBgU.js.map +1 -0
  20. package/dist/chunks/config-rkcKArZQ.js.map +1 -0
  21. package/dist/chunks/config-vSji8w90.js.map +1 -0
  22. package/dist/chunks/config-zjeAJ4ho2.js.map +1 -0
  23. package/dist/chunks/context-BfIQv7m12.js.map +1 -0
  24. package/dist/chunks/context-CTbuwcYs.js.map +1 -1
  25. package/dist/chunks/{en-DCCFP4qu.js → en-NpP9e7lC.js} +16 -2
  26. package/dist/chunks/en-NpP9e7lC.js.map +1 -0
  27. package/dist/chunks/{es-CT34HBVM.js → es-DaeA2Ql-.js} +16 -2
  28. package/dist/chunks/es-DaeA2Ql-.js.map +1 -0
  29. package/dist/chunks/{es-DdJsxlUr.js → es-Do2CNrC2.js} +3 -3
  30. package/dist/chunks/{es-DdJsxlUr.js.map → es-Do2CNrC2.js.map} +1 -1
  31. package/dist/chunks/{generated-1WEi10KK.js → generated-CJe6hdiE.js} +49 -0
  32. package/dist/chunks/{generated-1WEi10KK.js.map → generated-CJe6hdiE.js.map} +1 -1
  33. package/dist/chunks/{grBadgeStyles-C2wLlkjF.js → grBadgeStyles-C1S56Alo.js} +6 -1
  34. package/dist/chunks/{grBadgeStyles-C2wLlkjF.js.map → grBadgeStyles-C1S56Alo.js.map} +1 -1
  35. package/dist/chunks/grChipGroupContext-DZXkACap.js +4 -0
  36. package/dist/chunks/grChipGroupContext-DZXkACap.js.map +1 -0
  37. package/dist/chunks/{config-C5mO5DYZ.js → grDropdownMenuStyles-D1LOkdVj.js} +1 -38
  38. package/dist/chunks/grDropdownMenuStyles-D1LOkdVj.js.map +1 -0
  39. package/dist/chunks/{grPopoverStyles-Rz_Z5nLW.js → grPopoverStyles-Cke_BZsM.js} +16 -3
  40. package/dist/chunks/grPopoverStyles-Cke_BZsM.js.map +1 -0
  41. package/dist/chunks/{granular-provider-Dr2PKgl1.js → granular-provider-BaHkLjFX.js} +19 -11
  42. package/dist/chunks/granular-provider-BaHkLjFX.js.map +1 -0
  43. package/dist/chunks/{ru-CLiAMwrx.js → ru-Bg9-DPmg.js} +16 -2
  44. package/dist/chunks/ru-Bg9-DPmg.js.map +1 -0
  45. package/dist/chunks/{config-qVg3Zz_A.js → safelist-DOfCQR5O.js} +2 -19
  46. package/dist/chunks/safelist-DOfCQR5O.js.map +1 -0
  47. package/dist/chunks/useMenuItemsFocus-OyOnIAlr.js +117 -0
  48. package/dist/chunks/useMenuItemsFocus-OyOnIAlr.js.map +1 -0
  49. package/dist/chunks/{validation-DauXRIkL.js → validation-5HhpanPP.js} +1 -1
  50. package/dist/chunks/{validation-DauXRIkL.js.map → validation-5HhpanPP.js.map} +1 -1
  51. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-DsevPtiS.js → GrAutocomplete-D9c9BNFg.js} +1 -1
  52. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-DsevPtiS.js.map → GrAutocomplete-D9c9BNFg.js.map} +1 -1
  53. package/dist/components/GrAutocomplete/index.js +1 -1
  54. package/dist/components/GrBadge/chunks/{GrBadge-u2ZdS7CN.js → GrBadge-_9rCHuE1.js} +1 -1
  55. package/dist/components/GrBadge/chunks/{GrBadge-u2ZdS7CN.js.map → GrBadge-_9rCHuE1.js.map} +1 -1
  56. package/dist/components/GrBadge/index.js +3 -2
  57. package/dist/components/GrButton/chunks/{GrButton-Bw2AH4uX.js → GrButton-DCz-Wn-V.js} +1 -1
  58. package/dist/components/GrButton/chunks/{GrButton-Bw2AH4uX.js.map → GrButton-DCz-Wn-V.js.map} +1 -1
  59. package/dist/components/GrButton/index.js +1 -1
  60. package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-CKyiAV8K.js → GrButtonGroup-BQo5VQ_c.js} +1 -1
  61. package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-CKyiAV8K.js.map → GrButtonGroup-BQo5VQ_c.js.map} +1 -1
  62. package/dist/components/GrButtonGroup/index.js +2 -2
  63. package/dist/components/GrCard/chunks/{GrCard-gI2wA8ZZ.js → GrCard-aQIjk6I9.js} +1 -1
  64. package/dist/components/GrCard/chunks/GrCard-aQIjk6I9.js.map +1 -0
  65. package/dist/components/GrCard/index.js +1 -1
  66. package/dist/components/GrCheckboxGroup/index.js +1 -1
  67. package/dist/components/GrChip/chunks/GrChip-BnL2FedO.js +222 -0
  68. package/dist/components/GrChip/chunks/GrChip-BnL2FedO.js.map +1 -0
  69. package/dist/components/GrChip/index.js +3 -0
  70. package/dist/components/GrChipGroup/chunks/GrChipGroup-DefmSdY9.js +209 -0
  71. package/dist/components/GrChipGroup/chunks/GrChipGroup-DefmSdY9.js.map +1 -0
  72. package/dist/components/GrChipGroup/index.js +3 -0
  73. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-BmXCLgLS.js → GrCodeBlock-CyptiEo4.js} +1 -1
  74. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-BmXCLgLS.js.map → GrCodeBlock-CyptiEo4.js.map} +1 -1
  75. package/dist/components/GrCodeBlock/index.js +1 -1
  76. package/dist/components/GrCollapse/chunks/{GrCollapse-DIHEiTju.js → GrCollapse-DUROgAgc.js} +1 -1
  77. package/dist/components/GrCollapse/chunks/{GrCollapse-DIHEiTju.js.map → GrCollapse-DUROgAgc.js.map} +1 -1
  78. package/dist/components/GrCollapse/index.js +1 -1
  79. package/dist/components/GrColorPicker/chunks/{GrColorPicker-qQdoEPHF.js → GrColorPicker-CDaJRVIM.js} +1 -1
  80. package/dist/components/GrColorPicker/chunks/{GrColorPicker-qQdoEPHF.js.map → GrColorPicker-CDaJRVIM.js.map} +1 -1
  81. package/dist/components/GrColorPicker/index.js +1 -1
  82. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BFcMf4Pn.js → GrCommandPalette-BPsVN_XU.js} +3 -3
  83. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BPsVN_XU.js.map +1 -0
  84. package/dist/components/GrCommandPalette/index.js +1 -1
  85. package/dist/components/GrCommandPalette/styles.css +1 -1
  86. package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-UP-EaoAf.js → GrConfigProvider-BF7R3hgg.js} +1 -1
  87. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BF7R3hgg.js.map +1 -0
  88. package/dist/components/GrConfigProvider/index.js +1 -1
  89. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-rRtMScJX.js → GrConfirmDialog-CwXNLyzk.js} +3 -3
  90. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-rRtMScJX.js.map → GrConfirmDialog-CwXNLyzk.js.map} +1 -1
  91. package/dist/components/GrConfirmDialog/index.js +1 -1
  92. package/dist/components/GrContextMenu/chunks/GrContextMenu-BbAJholy.js +331 -0
  93. package/dist/components/GrContextMenu/chunks/GrContextMenu-BbAJholy.js.map +1 -0
  94. package/dist/components/GrContextMenu/index.js +3 -0
  95. package/dist/components/GrDataTable/chunks/{GrDataTable-B5MmZFUg.js → GrDataTable-NRbrXpdx.js} +2 -2
  96. package/dist/components/GrDataTable/chunks/GrDataTable-NRbrXpdx.js.map +1 -0
  97. package/dist/components/GrDataTable/index.js +1 -1
  98. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-C6Pxjjbh.js → GrDescriptionList-1mICfrqX.js} +1 -1
  99. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-C6Pxjjbh.js.map → GrDescriptionList-1mICfrqX.js.map} +1 -1
  100. package/dist/components/GrDescriptionList/index.js +2 -2
  101. package/dist/components/GrDialog/chunks/{GrDialog-D0U5iRqV.js → GrDialog-5Y5K87ss.js} +2 -2
  102. package/dist/components/GrDialog/chunks/{GrDialog-D0U5iRqV.js.map → GrDialog-5Y5K87ss.js.map} +1 -1
  103. package/dist/components/GrDialog/index.js +1 -1
  104. package/dist/components/GrDialogService/chunks/{GrDialogService-CrwA4aJq.js → GrDialogService-CHVR4sOk.js} +6 -6
  105. package/dist/components/GrDialogService/chunks/GrDialogService-CHVR4sOk.js.map +1 -0
  106. package/dist/components/GrDialogService/index.js +1 -1
  107. package/dist/components/GrDrawer/chunks/{GrDrawer-C3zAg2tG.js → GrDrawer-CXy3-SVd.js} +2 -2
  108. package/dist/components/GrDrawer/chunks/GrDrawer-CXy3-SVd.js.map +1 -0
  109. package/dist/components/GrDrawer/index.js +1 -1
  110. package/dist/components/GrDropdown/chunks/{GrDropdown-BSfFOcDx.js → GrDropdown-BfTmdPyh.js} +10 -79
  111. package/dist/components/GrDropdown/chunks/GrDropdown-BfTmdPyh.js.map +1 -0
  112. package/dist/components/GrDropdown/index.js +2 -2
  113. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-l5HEqzjr.js +130 -0
  114. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-l5HEqzjr.js.map +1 -0
  115. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DyS6dWDp.js → GrDropdownMenuList-BGA_xNVo.js} +57 -159
  116. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-BGA_xNVo.js.map +1 -0
  117. package/dist/components/GrDropdownMenu/index.js +3 -2
  118. package/dist/components/GrEmptyState/chunks/{GrEmptyState-BGUX8O0U.js → GrEmptyState-CS9do8eM.js} +1 -1
  119. package/dist/components/GrEmptyState/chunks/{GrEmptyState-BGUX8O0U.js.map → GrEmptyState-CS9do8eM.js.map} +1 -1
  120. package/dist/components/GrEmptyState/index.js +2 -2
  121. package/dist/components/GrFileUpload/chunks/{GrFileUpload-D3-vC-ap.js → GrFileUpload-wNXzHb5N.js} +1 -1
  122. package/dist/components/GrFileUpload/chunks/GrFileUpload-wNXzHb5N.js.map +1 -0
  123. package/dist/components/GrFileUpload/index.js +1 -1
  124. package/dist/components/GrForm/chunks/{GrForm-B_Qq_13k.js → GrForm-CAlJg-wb.js} +1 -1
  125. package/dist/components/GrForm/chunks/{GrForm-B_Qq_13k.js.map → GrForm-CAlJg-wb.js.map} +1 -1
  126. package/dist/components/GrForm/index.js +3 -3
  127. package/dist/components/GrFormField/chunks/{GrFormField-kqfVY30N.js → GrFormField-DSylU7IU.js} +1 -1
  128. package/dist/components/GrFormField/chunks/GrFormField-DSylU7IU.js.map +1 -0
  129. package/dist/components/GrFormField/index.js +1 -1
  130. package/dist/components/GrFormFile/chunks/{GrFormFile-D722xHn8.js → GrFormFile-DhVkB2gm.js} +1 -1
  131. package/dist/components/GrFormFile/chunks/{GrFormFile-D722xHn8.js.map → GrFormFile-DhVkB2gm.js.map} +1 -1
  132. package/dist/components/GrFormFile/index.js +1 -1
  133. package/dist/components/GrInputTag/chunks/{GrInputTag-C7QVPijj.js → GrInputTag-UI8kIB_F.js} +2 -2
  134. package/dist/components/GrInputTag/chunks/{GrInputTag-C7QVPijj.js.map → GrInputTag-UI8kIB_F.js.map} +1 -1
  135. package/dist/components/GrInputTag/index.js +1 -1
  136. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-DFUppRNb.js → GrJsonViewer-jk3ylOTc.js} +2 -2
  137. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-jk3ylOTc.js.map +1 -0
  138. package/dist/components/GrJsonViewer/index.js +1 -1
  139. package/dist/components/GrList/chunks/{GrList-DAtzVIHh.js → GrList-B5bclmHV.js} +30 -3
  140. package/dist/components/GrList/chunks/GrList-B5bclmHV.js.map +1 -0
  141. package/dist/components/GrList/index.js +1 -1
  142. package/dist/components/GrList/styles.css +1 -1
  143. package/dist/components/GrModal/chunks/{GrModal-CPz7SWD_.js → GrModal-CCoWZuIl.js} +2 -2
  144. package/dist/components/GrModal/chunks/GrModal-CCoWZuIl.js.map +1 -0
  145. package/dist/components/GrModal/index.js +1 -1
  146. package/dist/components/GrNavbar/chunks/{GrNavbar-DWaaoV7n.js → GrNavbar-DPj30sHX.js} +1 -1
  147. package/dist/components/GrNavbar/chunks/{GrNavbar-DWaaoV7n.js.map → GrNavbar-DPj30sHX.js.map} +1 -1
  148. package/dist/components/GrNavbar/index.js +1 -1
  149. package/dist/components/GrNumberInput/chunks/{GrNumberInput-BotnzW77.js → GrNumberInput-V2mZvDDC.js} +1 -1
  150. package/dist/components/GrNumberInput/chunks/{GrNumberInput-BotnzW77.js.map → GrNumberInput-V2mZvDDC.js.map} +1 -1
  151. package/dist/components/GrNumberInput/index.js +2 -2
  152. package/dist/components/GrPagination/chunks/{GrPagination-GtGtSMJG.js → GrPagination-DG7kp6VL.js} +2 -2
  153. package/dist/components/GrPagination/chunks/{GrPagination-GtGtSMJG.js.map → GrPagination-DG7kp6VL.js.map} +1 -1
  154. package/dist/components/GrPagination/index.js +1 -1
  155. package/dist/components/GrPopover/chunks/{GrPopover-b70bIlQ9.js → GrPopover-DDChM1jD.js} +28 -10
  156. package/dist/components/GrPopover/chunks/GrPopover-DDChM1jD.js.map +1 -0
  157. package/dist/components/GrPopover/index.js +2 -2
  158. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-CEI8bf-t.js → GrPromptDialog-BGuMUzlv.js} +5 -5
  159. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-CEI8bf-t.js.map → GrPromptDialog-BGuMUzlv.js.map} +1 -1
  160. package/dist/components/GrPromptDialog/index.js +1 -1
  161. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-BVmjKXcv.js → GrRadioGroup-7w4bXIg_.js} +1 -1
  162. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-BVmjKXcv.js.map → GrRadioGroup-7w4bXIg_.js.map} +1 -1
  163. package/dist/components/GrRadioGroup/index.js +1 -1
  164. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CZONq8uT.js → GrResponseErrorBanner-BhP-xw2P.js} +1 -1
  165. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CZONq8uT.js.map → GrResponseErrorBanner-BhP-xw2P.js.map} +1 -1
  166. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CgfAwlg3.js → GrResponseErrorBanner-DA4q90Zt.js} +1 -1
  167. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CgfAwlg3.js.map → GrResponseErrorBanner-DA4q90Zt.js.map} +1 -1
  168. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  169. package/dist/components/GrSelect/chunks/{GrSelect-CaGuyvtb.js → GrSelect-BA1wfX3c.js} +19 -3
  170. package/dist/components/GrSelect/chunks/GrSelect-BA1wfX3c.js.map +1 -0
  171. package/dist/components/GrSelect/index.js +1 -1
  172. package/dist/components/GrSelect/styles.css +1 -1
  173. package/dist/components/GrSidebar/chunks/{GrSidebar-D7WxRtIu.js → GrSidebar-DY-LgIbS.js} +2 -2
  174. package/dist/components/GrSidebar/chunks/{GrSidebar-D7WxRtIu.js.map → GrSidebar-DY-LgIbS.js.map} +1 -1
  175. package/dist/components/GrSidebar/index.js +2 -2
  176. package/dist/components/GrSlider/index.js +1 -1
  177. package/dist/components/GrSortableList/chunks/{GrSortableList-BmcUVAMb.js → GrSortableList-BMXyxmRc.js} +3 -3
  178. package/dist/components/GrSortableList/chunks/{GrSortableList-BmcUVAMb.js.map → GrSortableList-BMXyxmRc.js.map} +1 -1
  179. package/dist/components/GrSortableList/index.js +2 -2
  180. package/dist/components/GrSteps/chunks/GrSteps-Cce4rfr3.js +282 -0
  181. package/dist/components/GrSteps/chunks/GrSteps-Cce4rfr3.js.map +1 -0
  182. package/dist/components/GrSteps/index.js +3 -0
  183. package/dist/components/GrTabPanels/chunks/{GrTabPanels-AJt1w1XC.js → GrTabPanels-BZQS8-JM.js} +12 -1
  184. package/dist/components/GrTabPanels/chunks/{GrTabPanels-AJt1w1XC.js.map → GrTabPanels-BZQS8-JM.js.map} +1 -1
  185. package/dist/components/GrTabPanels/index.js +1 -1
  186. package/dist/components/GrTimeline/chunks/{GrTimeline-Ch9sHzwL.js → GrTimeline-DIDdkTn7.js} +12 -1
  187. package/dist/components/GrTimeline/chunks/GrTimeline-DIDdkTn7.js.map +1 -0
  188. package/dist/components/GrTimeline/index.js +1 -1
  189. package/dist/components/GrToaster/chunks/{GrToaster-DJUzx3sR.js → GrToaster-CC49q3a4.js} +1 -1
  190. package/dist/components/GrToaster/chunks/{GrToaster-DJUzx3sR.js.map → GrToaster-CC49q3a4.js.map} +1 -1
  191. package/dist/components/GrToaster/index.js +1 -1
  192. package/dist/components/GrTree/chunks/{GrTree-BvOeQ3xJ.js.map → GrTree-J5q8aCya.js.map} +1 -1
  193. package/dist/components/GrTree/index.js +1 -1
  194. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-_LjTRR7X.js → GrTreeSelect-DEfxWAc3.js} +1 -1
  195. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-_LjTRR7X.js.map → GrTreeSelect-DEfxWAc3.js.map} +1 -1
  196. package/dist/components/GrTreeSelect/index.js +1 -1
  197. package/dist/composables/useFloating.js +47 -7
  198. package/dist/composables/useFloating.js.map +1 -1
  199. package/dist/composables/useTheme.js.map +1 -1
  200. package/dist/composables/useToast.js.map +1 -1
  201. package/dist/granular-provider-node.js +1 -1
  202. package/dist/granular-provider.js +1 -1
  203. package/dist/i18n/all.js +1 -1
  204. package/dist/i18n/index.js +1 -1
  205. package/dist/index.js +68 -58
  206. package/dist/theme.js +1 -1
  207. package/dist/tokens.js +1 -1
  208. package/dist/types/components/GrBadge/grBadgeStyles.d.ts +7 -0
  209. package/dist/types/components/GrCard/GrCard.vue.d.ts +1 -1
  210. package/dist/types/components/GrChip/GrChip.vue.d.ts +118 -0
  211. package/dist/types/components/GrChip/config.d.ts +1 -0
  212. package/dist/types/components/GrChip/defaults.d.ts +16 -0
  213. package/dist/types/components/GrChip/grChipGroupContext.d.ts +52 -0
  214. package/dist/types/components/GrChip/grChipStyles.d.ts +64 -0
  215. package/dist/types/components/GrChip/index.d.ts +11 -0
  216. package/dist/types/components/GrChip/safelist.d.ts +7 -0
  217. package/dist/types/components/GrChipGroup/GrChipGroup.vue.d.ts +128 -0
  218. package/dist/types/components/GrChipGroup/config.d.ts +1 -0
  219. package/dist/types/components/GrChipGroup/defaults.d.ts +13 -0
  220. package/dist/types/components/GrChipGroup/grChipGroupStyles.d.ts +7 -0
  221. package/dist/types/components/GrChipGroup/index.d.ts +9 -0
  222. package/dist/types/components/GrChipGroup/safelist.d.ts +1 -0
  223. package/dist/types/components/GrContextMenu/GrContextMenu.vue.d.ts +157 -0
  224. package/dist/types/components/GrContextMenu/config.d.ts +1 -0
  225. package/dist/types/components/GrContextMenu/contextMenuAnchor.d.ts +29 -0
  226. package/dist/types/components/GrContextMenu/index.d.ts +7 -0
  227. package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +1 -1
  228. package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +3 -3
  229. package/dist/types/components/GrDropdownMenu/GrDropdownMenuEntries.vue.d.ts +22 -0
  230. package/dist/types/components/GrFilePreview/GrFilePreview.vue.d.ts +1 -1
  231. package/dist/types/components/GrForm/index.d.ts +1 -1
  232. package/dist/types/components/GrList/GrListItem.vue.d.ts +1 -1
  233. package/dist/types/components/GrPopover/GrPopover.vue.d.ts +21 -2
  234. package/dist/types/components/GrPopover/grPopoverStyles.d.ts +11 -1
  235. package/dist/types/components/GrPopover/index.d.ts +1 -1
  236. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +1 -1
  237. package/dist/types/components/GrSteps/GrSteps.vue.d.ts +118 -0
  238. package/dist/types/components/GrSteps/config.d.ts +1 -0
  239. package/dist/types/components/GrSteps/defaults.d.ts +18 -0
  240. package/dist/types/components/GrSteps/grStepsStyles.d.ts +63 -0
  241. package/dist/types/components/GrSteps/index.d.ts +11 -0
  242. package/dist/types/components/GrSteps/safelist.d.ts +1 -0
  243. package/dist/types/components/GrSteps/stepsModel.d.ts +57 -0
  244. package/dist/types/composables/internal/useMenuItemsFocus.d.ts +24 -0
  245. package/dist/types/composables/internal/useTypeahead.d.ts +30 -0
  246. package/dist/types/composables/useFloating.d.ts +33 -2
  247. package/dist/types/granular-provider/shared.d.ts +4 -0
  248. package/dist/types/i18n/messages/en.d.ts +26 -0
  249. package/dist/types/i18n/messages/es.d.ts +26 -0
  250. package/dist/types/i18n/messages/ru.d.ts +26 -0
  251. package/dist/types/index.d.ts +4 -0
  252. package/dist/web-types.json +790 -241
  253. package/package.json +18 -2
  254. package/dist/chunks/config-BSyiFlbi2.js.map +0 -1
  255. package/dist/chunks/config-BViooYNv2.js.map +0 -1
  256. package/dist/chunks/config-BfsBepkH2.js.map +0 -1
  257. package/dist/chunks/config-BuGlNPE9.js.map +0 -1
  258. package/dist/chunks/config-C5mO5DYZ.js.map +0 -1
  259. package/dist/chunks/config-DAX8Deh12.js.map +0 -1
  260. package/dist/chunks/config-T3qdQBgU2.js.map +0 -1
  261. package/dist/chunks/config-qVg3Zz_A.js.map +0 -1
  262. package/dist/chunks/config-rkcKArZQ2.js.map +0 -1
  263. package/dist/chunks/config-vSji8w902.js.map +0 -1
  264. package/dist/chunks/config-zjeAJ4ho.js.map +0 -1
  265. package/dist/chunks/context-BfIQv7m1.js.map +0 -1
  266. package/dist/chunks/en-DCCFP4qu.js.map +0 -1
  267. package/dist/chunks/es-CT34HBVM.js.map +0 -1
  268. package/dist/chunks/grPopoverStyles-Rz_Z5nLW.js.map +0 -1
  269. package/dist/chunks/granular-provider-Dr2PKgl1.js.map +0 -1
  270. package/dist/chunks/ru-CLiAMwrx.js.map +0 -1
  271. package/dist/components/GrCard/chunks/GrCard-gI2wA8ZZ.js.map +0 -1
  272. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BFcMf4Pn.js.map +0 -1
  273. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-UP-EaoAf.js.map +0 -1
  274. package/dist/components/GrDataTable/chunks/GrDataTable-B5MmZFUg.js.map +0 -1
  275. package/dist/components/GrDialogService/chunks/GrDialogService-CrwA4aJq.js.map +0 -1
  276. package/dist/components/GrDrawer/chunks/GrDrawer-C3zAg2tG.js.map +0 -1
  277. package/dist/components/GrDropdown/chunks/GrDropdown-BSfFOcDx.js.map +0 -1
  278. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-DyS6dWDp.js.map +0 -1
  279. package/dist/components/GrFileUpload/chunks/GrFileUpload-D3-vC-ap.js.map +0 -1
  280. package/dist/components/GrFormField/chunks/GrFormField-kqfVY30N.js.map +0 -1
  281. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-DFUppRNb.js.map +0 -1
  282. package/dist/components/GrList/chunks/GrList-DAtzVIHh.js.map +0 -1
  283. package/dist/components/GrModal/chunks/GrModal-CPz7SWD_.js.map +0 -1
  284. package/dist/components/GrPopover/chunks/GrPopover-b70bIlQ9.js.map +0 -1
  285. package/dist/components/GrSelect/chunks/GrSelect-CaGuyvtb.js.map +0 -1
  286. package/dist/components/GrTimeline/chunks/GrTimeline-Ch9sHzwL.js.map +0 -1
  287. package/dist/chunks/{config-BViooYNv2.js → config-BViooYNv.js} +0 -0
  288. package/dist/chunks/{config-BfsBepkH2.js → config-BfsBepkH.js} +0 -0
  289. package/dist/chunks/{config-BuGlNPE9.js → config-BuGlNPE92.js} +0 -0
  290. package/dist/chunks/{config-DAX8Deh12.js → config-DAX8Deh1.js} +0 -0
  291. package/dist/chunks/{config-T3qdQBgU2.js → config-T3qdQBgU.js} +0 -0
  292. package/dist/chunks/{config-rkcKArZQ2.js → config-rkcKArZQ.js} +0 -0
  293. package/dist/chunks/{config-vSji8w902.js → config-vSji8w90.js} +0 -0
  294. package/dist/chunks/{config-zjeAJ4ho.js → config-zjeAJ4ho2.js} +0 -0
  295. package/dist/chunks/{context-BfIQv7m1.js → context-BfIQv7m12.js} +0 -0
  296. package/dist/components/GrTree/chunks/{GrTree-BvOeQ3xJ.js → GrTree-J5q8aCya.js} +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"validation-DauXRIkL.js","names":[],"sources":["../../src/components/GrForm/fileRule.ts","../../src/components/GrForm/validation.ts"],"sourcesContent":["/**\n * Файловое правило `GrForm` — мост между декларативными `rules` и валидаторами\n * из `src/fileValidation`.\n *\n * Своих проверок здесь нет ни одной: правило собирает те же валидаторы, которые\n * `GrFormFile` и `v-dropzone` запускают на выборе и на drop. Поэтому ограничение,\n * переехавшее из пропов поля в правило формы, не меняет ни поведения, ни текста\n * ошибки — меняется только момент проверки и то, кто о ней сообщает.\n *\n * Модуль чистый (без Vue): его гоняют юнит-тесты без монтирования.\n */\n\nimport {\n acceptValidator,\n allowedExtensionsValidator,\n allowedMimeTypesValidator,\n maxCountValidator,\n maxFileSize,\n maxTotalSizeBytesValidator,\n runFileValidators,\n type FileValidationIssue,\n type FileValidator,\n} from '../../fileValidation'\n\nexport interface GrFormFileRule {\n /** W3C `accept`: `'image/*,.pdf'`. */\n accept?: string\n /** Белый список расширений (с точкой или без). */\n extensions?: string[]\n /** Белый список MIME-типов. */\n mimeTypes?: string[]\n /** Предел размера одного файла в мегабайтах. */\n maxSizeMb?: number\n /** Предел размера одного файла в байтах. Задан вместе с `maxSizeMb` — берётся меньший. */\n maxSizeBytes?: number\n /** Максимум файлов в наборе. */\n maxCount?: number\n /** Суммарный размер набора в мегабайтах. */\n maxTotalSizeMb?: number\n /** Свои валидаторы — тот же тип, что у `GrFormFile` и `v-dropzone`. Идут после встроенных. */\n validators?: FileValidator[]\n}\n\nconst BYTES_IN_MB = 1024 * 1024\n\nfunction mbToBytes(mb: number | undefined): number | undefined {\n return typeof mb === 'number' && Number.isFinite(mb) ? mb * BYTES_IN_MB : undefined\n}\n\nfunction isFile(value: unknown): value is File {\n return typeof File !== 'undefined' && value instanceof File\n}\n\n/**\n * Значение поля как набор файлов. Всё, что файлами не является, даёт пустой\n * набор: правило молчит, а пустоту разбирает `required` движка.\n */\nexport function fileRuleFiles(value: unknown): File[] {\n if (isFile(value)) return [value]\n if (Array.isArray(value)) return value.filter(isFile)\n return []\n}\n\n/** Порядок повторяет `GrFormFile`: встроенные проверки, затем валидаторы потребителя. */\nexport function fileRuleValidators(rule: GrFormFileRule): FileValidator[] {\n return [\n acceptValidator(rule.accept),\n ...(rule.extensions ? [allowedExtensionsValidator(rule.extensions)] : []),\n ...(rule.mimeTypes ? [allowedMimeTypesValidator(rule.mimeTypes)] : []),\n maxFileSize({ bytes: rule.maxSizeBytes, mb: rule.maxSizeMb }),\n maxCountValidator(rule.maxCount),\n maxTotalSizeBytesValidator(mbToBytes(rule.maxTotalSizeMb)),\n ...(rule.validators ?? []),\n ]\n}\n\n/**\n * Первая проблема набора или `undefined`. Первая, а не все: у поля формы одна\n * строка ошибки, и файлы тут не исключение — подробный разбор по каждому файлу\n * остаётся за `GrFormFile`.\n */\nexport async function runFileRule(\n value: unknown,\n rule: GrFormFileRule,\n): Promise<FileValidationIssue | undefined> {\n const files = fileRuleFiles(value)\n if (!files.length) return undefined\n\n const { issues } = await runFileValidators(files, fileRuleValidators(rule), {\n source: 'form',\n multiple: Array.isArray(value),\n accept: rule.accept,\n })\n\n return issues[0]\n}\n","/**\n * Движок валидации `GrForm` — чистый (без Vue/i18n), тестируется изолированно.\n *\n * Правило описывает набор проверок значения поля; `runFieldRules` прогоняет их по\n * порядку и возвращает первое сообщение об ошибке (или `undefined`, если валидно).\n * Сообщения резолвит потребитель (компонент) через `resolveMessage` — так i18n и\n * дефолтные тексты остаются в компоненте, а движок ничего о них не знает.\n */\n\nimport { resolveFileValidationMessage, type FileValidationIssue } from '../../fileValidation'\nimport { runFileRule, type GrFormFileRule } from './fileRule'\n\nexport type { GrFormFileRule } from './fileRule'\n\nexport type GrFormTrigger = 'blur' | 'change' | 'submit'\n\n/** Результат кастомного валидатора: `true`/void — ок; `false` — ошибка (дефолт-текст); строка — текст ошибки. */\nexport type GrFormValidatorResult = boolean | string | void\n\nexport interface GrFormRule {\n /** Значение обязательно (не пустое). */\n required?: boolean\n /** Готовый текст ошибки — перекрывает дефолтное сообщение любой проверки этого правила. */\n message?: string\n /** Минимум: длина для строки/массива, значение для числа. */\n min?: number\n /** Максимум: длина для строки/массива, значение для числа. */\n max?: number\n /** Точная длина/значение. */\n len?: number\n /** Регулярное выражение (проверяется по `String(value)`). */\n pattern?: RegExp\n /** Встроенный тип-валидатор. */\n type?: 'email' | 'url'\n /** Ограничения для значения `File | File[]`: тип, размер, количество. */\n file?: GrFormFileRule\n /** Кастомный (в т.ч. async) валидатор. Второй аргумент — весь `model`. */\n validator?: (value: unknown, model: Record<string, unknown>) => GrFormValidatorResult | Promise<GrFormValidatorResult>\n /** Когда правило срабатывает. По умолчанию — на любом триггере (blur/change/submit). */\n trigger?: GrFormTrigger | GrFormTrigger[]\n}\n\nexport type GrFormRules = Record<string, GrFormRule | GrFormRule[]>\n\n/** Вид сработавшей проверки — ключ для дефолтного i18n-сообщения. */\nexport type GrFormRuleFailure = 'required' | 'min' | 'max' | 'len' | 'pattern' | 'email' | 'url' | 'file' | 'invalid'\n\nexport type GrFormMessageResolver = (\n kind: GrFormRuleFailure,\n rule: GrFormRule,\n params: Record<string, unknown>,\n) => string\n\n/** Подпись `t()` из `useGranularityTranslations()`: ключ, фолбэк, параметры. */\nexport type GrFormMessageTranslate = (\n key: string,\n fallback: string,\n params?: Record<string, unknown>,\n) => string\n\nconst DEFAULT_MESSAGES: Record<GrFormRuleFailure, string> = {\n required: 'This field is required',\n min: 'Minimum is {min}',\n max: 'Maximum is {max}',\n len: 'Length must be {len}',\n pattern: 'Invalid format',\n email: 'Enter a valid email',\n url: 'Enter a valid URL',\n file: 'Invalid file',\n invalid: 'Invalid value',\n}\n\n/**\n * Дефолтный резолвер сообщений: `rule.message` сильнее всего, иначе ключ\n * `gr.form.<kind>` из локали, иначе английский фолбэк.\n *\n * Вынесен из `GrForm.vue` и экспортируется наружу не «на всякий случай»:\n * `runFieldRules` публичен, но без резолвера бесполезен — любой, кто хочет\n * прогнать те же правила вне формы, обязан был написать свой.\n */\nexport function createGrFormMessageResolver(t: GrFormMessageTranslate): GrFormMessageResolver {\n return (kind, rule, params) => {\n if (rule.message) return rule.message\n\n // Текст файловой ошибки приходит от самого валидатора и локализуется его же\n // ключом (`gr.fileValidation.*`): иначе одно и то же «файл не того типа»\n // звучало бы по-разному в поле и в форме. `gr.form.file` — фолбэк на случай\n // вида `file` без issue: сюда движок не приходит, но резолвер публичный.\n const issue = params.issue as FileValidationIssue | undefined\n if (kind === 'file' && issue) return resolveFileValidationMessage(issue, t)\n\n return t(`gr.form.${kind}`, DEFAULT_MESSAGES[kind], params)\n }\n}\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction isUrl(value: string): boolean {\n return URL.canParse(value)\n}\n\n/** Пустое значение: `null`/`undefined`/пустая (или пробельная) строка/пустой массив. */\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true\n if (typeof value === 'string') return value.trim() === ''\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\n/** Мера значения для min/max/len: число → само значение, строка/массив → длина. */\nfunction measure(value: unknown): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return value.length\n if (Array.isArray(value)) return value.length\n return Number(value)\n}\n\n/** Достаёт значение из объекта по dot-path (`address.city`). */\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n if (!path.includes('.')) return obj[path]\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc && typeof acc === 'object') return (acc as Record<string, unknown>)[key]\n return undefined\n }, obj)\n}\n\n/** Записывает значение в объект по dot-path (создаёт промежуточные объекты). */\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const keys = path.split('.')\n const last = keys.pop() as string\n let target = obj\n for (const key of keys) {\n if (!target[key] || typeof target[key] !== 'object') target[key] = {}\n target = target[key] as Record<string, unknown>\n }\n target[last] = value\n}\n\n/** Нормализует правило(а) поля в массив. */\nexport function toRuleArray(rules: GrFormRule | GrFormRule[] | undefined): GrFormRule[] {\n if (!rules) return []\n return Array.isArray(rules) ? rules : [rules]\n}\n\nfunction ruleMatchesTrigger(rule: GrFormRule, trigger?: GrFormTrigger): boolean {\n if (!trigger) return true // полная валидация (validate()) — все правила\n if (!rule.trigger) return true // правило без триггера срабатывает на любом\n const triggers = Array.isArray(rule.trigger) ? rule.trigger : [rule.trigger]\n return triggers.includes(trigger)\n}\n\n/** Правила поля, применимые для данного триггера (undefined = все). */\nexport function rulesForTrigger(rules: GrFormRule[], trigger?: GrFormTrigger): GrFormRule[] {\n return rules.filter(rule => ruleMatchesTrigger(rule, trigger))\n}\n\n/** Есть ли среди правил `required` (для маркера обязательности в поле). */\nexport function rulesRequired(rules: GrFormRule[]): boolean {\n return rules.some(rule => rule.required === true)\n}\n\n/**\n * Прогоняет правила по порядку, возвращает первое сообщение об ошибке или `undefined`.\n * Пустое необязательное значение проходит все проверки (кроме `required`).\n */\nexport async function runFieldRules(\n value: unknown,\n rules: GrFormRule[],\n model: Record<string, unknown>,\n resolveMessage: GrFormMessageResolver,\n): Promise<string | undefined> {\n for (const rule of rules) {\n const empty = isEmpty(value)\n\n if (rule.required && empty) return resolveMessage('required', rule, {})\n // Необязательное пустое значение — остальные проверки этого правила пропускаем.\n if (empty) continue\n\n if (rule.type === 'email' && !EMAIL_RE.test(String(value))) return resolveMessage('email', rule, {})\n if (rule.type === 'url' && !isUrl(String(value))) return resolveMessage('url', rule, {})\n\n if (rule.len != null && measure(value) !== rule.len) return resolveMessage('len', rule, { len: rule.len })\n if (rule.min != null && measure(value) < rule.min) return resolveMessage('min', rule, { min: rule.min })\n if (rule.max != null && measure(value) > rule.max) return resolveMessage('max', rule, { max: rule.max })\n\n if (rule.pattern && !rule.pattern.test(String(value))) return resolveMessage('pattern', rule, {})\n\n if (rule.file) {\n const issue = await runFileRule(value, rule.file)\n if (issue) return resolveMessage('file', rule, { issue })\n }\n\n if (rule.validator) {\n const result = await rule.validator(value, model)\n if (result === false) return rule.message ?? resolveMessage('invalid', rule, {})\n if (typeof result === 'string') return result\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation-5HhpanPP.js","names":[],"sources":["../../src/components/GrForm/fileRule.ts","../../src/components/GrForm/validation.ts"],"sourcesContent":["/**\n * Файловое правило `GrForm` — мост между декларативными `rules` и валидаторами\n * из `src/fileValidation`.\n *\n * Своих проверок здесь нет ни одной: правило собирает те же валидаторы, которые\n * `GrFormFile` и `v-dropzone` запускают на выборе и на drop. Поэтому ограничение,\n * переехавшее из пропов поля в правило формы, не меняет ни поведения, ни текста\n * ошибки — меняется только момент проверки и то, кто о ней сообщает.\n *\n * Модуль чистый (без Vue): его гоняют юнит-тесты без монтирования.\n */\n\nimport {\n acceptValidator,\n allowedExtensionsValidator,\n allowedMimeTypesValidator,\n maxCountValidator,\n maxFileSize,\n maxTotalSizeBytesValidator,\n runFileValidators,\n type FileValidationIssue,\n type FileValidator,\n} from '../../fileValidation'\n\nexport interface GrFormFileRule {\n /** W3C `accept`: `'image/*,.pdf'`. */\n accept?: string\n /** Белый список расширений (с точкой или без). */\n extensions?: string[]\n /** Белый список MIME-типов. */\n mimeTypes?: string[]\n /** Предел размера одного файла в мегабайтах. */\n maxSizeMb?: number\n /** Предел размера одного файла в байтах. Задан вместе с `maxSizeMb` — берётся меньший. */\n maxSizeBytes?: number\n /** Максимум файлов в наборе. */\n maxCount?: number\n /** Суммарный размер набора в мегабайтах. */\n maxTotalSizeMb?: number\n /** Свои валидаторы — тот же тип, что у `GrFormFile` и `v-dropzone`. Идут после встроенных. */\n validators?: FileValidator[]\n}\n\nconst BYTES_IN_MB = 1024 * 1024\n\nfunction mbToBytes(mb: number | undefined): number | undefined {\n return typeof mb === 'number' && Number.isFinite(mb) ? mb * BYTES_IN_MB : undefined\n}\n\nfunction isFile(value: unknown): value is File {\n return typeof File !== 'undefined' && value instanceof File\n}\n\n/**\n * Значение поля как набор файлов. Всё, что файлами не является, даёт пустой\n * набор: правило молчит, а пустоту разбирает `required` движка.\n */\nexport function fileRuleFiles(value: unknown): File[] {\n if (isFile(value)) return [value]\n if (Array.isArray(value)) return value.filter(isFile)\n return []\n}\n\n/** Порядок повторяет `GrFormFile`: встроенные проверки, затем валидаторы потребителя. */\nexport function fileRuleValidators(rule: GrFormFileRule): FileValidator[] {\n return [\n acceptValidator(rule.accept),\n ...(rule.extensions ? [allowedExtensionsValidator(rule.extensions)] : []),\n ...(rule.mimeTypes ? [allowedMimeTypesValidator(rule.mimeTypes)] : []),\n maxFileSize({ bytes: rule.maxSizeBytes, mb: rule.maxSizeMb }),\n maxCountValidator(rule.maxCount),\n maxTotalSizeBytesValidator(mbToBytes(rule.maxTotalSizeMb)),\n ...(rule.validators ?? []),\n ]\n}\n\n/**\n * Первая проблема набора или `undefined`. Первая, а не все: у поля формы одна\n * строка ошибки, и файлы тут не исключение — подробный разбор по каждому файлу\n * остаётся за `GrFormFile`.\n */\nexport async function runFileRule(\n value: unknown,\n rule: GrFormFileRule,\n): Promise<FileValidationIssue | undefined> {\n const files = fileRuleFiles(value)\n if (!files.length) return undefined\n\n const { issues } = await runFileValidators(files, fileRuleValidators(rule), {\n source: 'form',\n multiple: Array.isArray(value),\n accept: rule.accept,\n })\n\n return issues[0]\n}\n","/**\n * Движок валидации `GrForm` — чистый (без Vue/i18n), тестируется изолированно.\n *\n * Правило описывает набор проверок значения поля; `runFieldRules` прогоняет их по\n * порядку и возвращает первое сообщение об ошибке (или `undefined`, если валидно).\n * Сообщения резолвит потребитель (компонент) через `resolveMessage` — так i18n и\n * дефолтные тексты остаются в компоненте, а движок ничего о них не знает.\n */\n\nimport { resolveFileValidationMessage, type FileValidationIssue } from '../../fileValidation'\nimport { runFileRule, type GrFormFileRule } from './fileRule'\n\nexport type { GrFormFileRule } from './fileRule'\n\nexport type GrFormTrigger = 'blur' | 'change' | 'submit'\n\n/** Результат кастомного валидатора: `true`/void — ок; `false` — ошибка (дефолт-текст); строка — текст ошибки. */\nexport type GrFormValidatorResult = boolean | string | void\n\nexport interface GrFormRule {\n /** Значение обязательно (не пустое). */\n required?: boolean\n /** Готовый текст ошибки — перекрывает дефолтное сообщение любой проверки этого правила. */\n message?: string\n /** Минимум: длина для строки/массива, значение для числа. */\n min?: number\n /** Максимум: длина для строки/массива, значение для числа. */\n max?: number\n /** Точная длина/значение. */\n len?: number\n /** Регулярное выражение (проверяется по `String(value)`). */\n pattern?: RegExp\n /** Встроенный тип-валидатор. */\n type?: 'email' | 'url'\n /** Ограничения для значения `File | File[]`: тип, размер, количество. */\n file?: GrFormFileRule\n /** Кастомный (в т.ч. async) валидатор. Второй аргумент — весь `model`. */\n validator?: (value: unknown, model: Record<string, unknown>) => GrFormValidatorResult | Promise<GrFormValidatorResult>\n /** Когда правило срабатывает. По умолчанию — на любом триггере (blur/change/submit). */\n trigger?: GrFormTrigger | GrFormTrigger[]\n}\n\nexport type GrFormRules = Record<string, GrFormRule | GrFormRule[]>\n\n/** Вид сработавшей проверки — ключ для дефолтного i18n-сообщения. */\nexport type GrFormRuleFailure = 'required' | 'min' | 'max' | 'len' | 'pattern' | 'email' | 'url' | 'file' | 'invalid'\n\nexport type GrFormMessageResolver = (\n kind: GrFormRuleFailure,\n rule: GrFormRule,\n params: Record<string, unknown>,\n) => string\n\n/** Подпись `t()` из `useGranularityTranslations()`: ключ, фолбэк, параметры. */\nexport type GrFormMessageTranslate = (\n key: string,\n fallback: string,\n params?: Record<string, unknown>,\n) => string\n\nconst DEFAULT_MESSAGES: Record<GrFormRuleFailure, string> = {\n required: 'This field is required',\n min: 'Minimum is {min}',\n max: 'Maximum is {max}',\n len: 'Length must be {len}',\n pattern: 'Invalid format',\n email: 'Enter a valid email',\n url: 'Enter a valid URL',\n file: 'Invalid file',\n invalid: 'Invalid value',\n}\n\n/**\n * Дефолтный резолвер сообщений: `rule.message` сильнее всего, иначе ключ\n * `gr.form.<kind>` из локали, иначе английский фолбэк.\n *\n * Вынесен из `GrForm.vue` и экспортируется наружу не «на всякий случай»:\n * `runFieldRules` публичен, но без резолвера бесполезен — любой, кто хочет\n * прогнать те же правила вне формы, обязан был написать свой.\n */\nexport function createGrFormMessageResolver(t: GrFormMessageTranslate): GrFormMessageResolver {\n return (kind, rule, params) => {\n if (rule.message) return rule.message\n\n // Текст файловой ошибки приходит от самого валидатора и локализуется его же\n // ключом (`gr.fileValidation.*`): иначе одно и то же «файл не того типа»\n // звучало бы по-разному в поле и в форме. `gr.form.file` — фолбэк на случай\n // вида `file` без issue: сюда движок не приходит, но резолвер публичный.\n const issue = params.issue as FileValidationIssue | undefined\n if (kind === 'file' && issue) return resolveFileValidationMessage(issue, t)\n\n return t(`gr.form.${kind}`, DEFAULT_MESSAGES[kind], params)\n }\n}\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction isUrl(value: string): boolean {\n return URL.canParse(value)\n}\n\n/** Пустое значение: `null`/`undefined`/пустая (или пробельная) строка/пустой массив. */\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true\n if (typeof value === 'string') return value.trim() === ''\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\n/** Мера значения для min/max/len: число → само значение, строка/массив → длина. */\nfunction measure(value: unknown): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return value.length\n if (Array.isArray(value)) return value.length\n return Number(value)\n}\n\n/** Достаёт значение из объекта по dot-path (`address.city`). */\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n if (!path.includes('.')) return obj[path]\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc && typeof acc === 'object') return (acc as Record<string, unknown>)[key]\n return undefined\n }, obj)\n}\n\n/** Записывает значение в объект по dot-path (создаёт промежуточные объекты). */\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const keys = path.split('.')\n const last = keys.pop() as string\n let target = obj\n for (const key of keys) {\n if (!target[key] || typeof target[key] !== 'object') target[key] = {}\n target = target[key] as Record<string, unknown>\n }\n target[last] = value\n}\n\n/** Нормализует правило(а) поля в массив. */\nexport function toRuleArray(rules: GrFormRule | GrFormRule[] | undefined): GrFormRule[] {\n if (!rules) return []\n return Array.isArray(rules) ? rules : [rules]\n}\n\nfunction ruleMatchesTrigger(rule: GrFormRule, trigger?: GrFormTrigger): boolean {\n if (!trigger) return true // полная валидация (validate()) — все правила\n if (!rule.trigger) return true // правило без триггера срабатывает на любом\n const triggers = Array.isArray(rule.trigger) ? rule.trigger : [rule.trigger]\n return triggers.includes(trigger)\n}\n\n/** Правила поля, применимые для данного триггера (undefined = все). */\nexport function rulesForTrigger(rules: GrFormRule[], trigger?: GrFormTrigger): GrFormRule[] {\n return rules.filter(rule => ruleMatchesTrigger(rule, trigger))\n}\n\n/** Есть ли среди правил `required` (для маркера обязательности в поле). */\nexport function rulesRequired(rules: GrFormRule[]): boolean {\n return rules.some(rule => rule.required === true)\n}\n\n/**\n * Прогоняет правила по порядку, возвращает первое сообщение об ошибке или `undefined`.\n * Пустое необязательное значение проходит все проверки (кроме `required`).\n */\nexport async function runFieldRules(\n value: unknown,\n rules: GrFormRule[],\n model: Record<string, unknown>,\n resolveMessage: GrFormMessageResolver,\n): Promise<string | undefined> {\n for (const rule of rules) {\n const empty = isEmpty(value)\n\n if (rule.required && empty) return resolveMessage('required', rule, {})\n // Необязательное пустое значение — остальные проверки этого правила пропускаем.\n if (empty) continue\n\n if (rule.type === 'email' && !EMAIL_RE.test(String(value))) return resolveMessage('email', rule, {})\n if (rule.type === 'url' && !isUrl(String(value))) return resolveMessage('url', rule, {})\n\n if (rule.len != null && measure(value) !== rule.len) return resolveMessage('len', rule, { len: rule.len })\n if (rule.min != null && measure(value) < rule.min) return resolveMessage('min', rule, { min: rule.min })\n if (rule.max != null && measure(value) > rule.max) return resolveMessage('max', rule, { max: rule.max })\n\n if (rule.pattern && !rule.pattern.test(String(value))) return resolveMessage('pattern', rule, {})\n\n if (rule.file) {\n const issue = await runFileRule(value, rule.file)\n if (issue) return resolveMessage('file', rule, { issue })\n }\n\n if (rule.validator) {\n const result = await rule.validator(value, model)\n if (result === false) return rule.message ?? resolveMessage('invalid', rule, {})\n if (typeof result === 'string') return result\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
@@ -15,7 +15,7 @@ import { t as useControlledOpen } from "../../../chunks/useControlledOpen-DV3SqL
15
15
  import { useComboboxNavigation } from "../../../composables/useComboboxNavigation.js";
16
16
  import { a as resolveSelectedOptions, t as filterOptions } from "../../../chunks/optionFilter-DYw9XPPx.js";
17
17
  import { t as useControlAddons } from "../../../chunks/useControlAddons-asUr10Pf.js";
18
- import { t as GrBadge_default } from "../../GrBadge/chunks/GrBadge-u2ZdS7CN.js";
18
+ import { t as GrBadge_default } from "../../GrBadge/chunks/GrBadge-_9rCHuE1.js";
19
19
  import { t as _plugin_vue_export_helper_default } from "../../../chunks/_plugin-vue_export-helper-BOaGB7Aw.js";
20
20
  import { a as autocompleteShellClass, i as autocompletePanelClasses, o as autocompleteStateClass, r as autocompleteOptionClass } from "../../../chunks/config-BbY2SKGE.js";
21
21
  import { t as check_default } from "../../../chunks/check-BZI24Qs4.js";