@feugene/granularity 0.18.0 → 0.19.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 (199) hide show
  1. package/dist/chunks/chevron-left-D8AUBAM7.js +23 -0
  2. package/dist/chunks/chevron-left-D8AUBAM7.js.map +1 -0
  3. package/dist/chunks/{chevron-right-BfqMVpbB.js → chevron-right-C6Z01h0X.js} +1 -22
  4. package/dist/chunks/chevron-right-C6Z01h0X.js.map +1 -0
  5. package/dist/chunks/config-8Pcutu1j2.js.map +1 -0
  6. package/dist/chunks/{config-K0C2tcLB.js → config-9PYRZlKE.js} +1 -1
  7. package/dist/chunks/{config-K0C2tcLB.js.map → config-9PYRZlKE.js.map} +1 -1
  8. package/dist/chunks/{config-DEvsMTQE.js → config-BJ7Bv_G2.js} +1 -3
  9. package/dist/chunks/config-BJ7Bv_G2.js.map +1 -0
  10. package/dist/chunks/config-BKvX0q102.js.map +1 -0
  11. package/dist/chunks/{config-gvq_hWNM.js → config-Be9k9bOf.js} +1 -7
  12. package/dist/chunks/config-Be9k9bOf.js.map +1 -0
  13. package/dist/chunks/{config-DpqOnJiz2.js → config-CDat1wXf2.js} +1 -1
  14. package/dist/chunks/config-CDat1wXf2.js.map +1 -0
  15. package/dist/chunks/config-CY0_6cMi2.js.map +1 -0
  16. package/dist/chunks/config-D94Z9po52.js.map +1 -0
  17. package/dist/chunks/{config-D2aNP7Es.js → config-DAX8Deh1.js} +1 -3
  18. package/dist/chunks/config-DAX8Deh1.js.map +1 -0
  19. package/dist/chunks/config-DCFvmHEv.js.map +1 -0
  20. package/dist/chunks/config-DKdlqXiY.js.map +1 -1
  21. package/dist/chunks/config-Rw9OyW702.js.map +1 -0
  22. package/dist/chunks/generated-BRkbhyxk.js +3270 -0
  23. package/dist/chunks/generated-BRkbhyxk.js.map +1 -0
  24. package/dist/chunks/{granular-provider-B9nXQCMu.js → granular-provider-C6uAujdJ.js} +12 -12
  25. package/dist/chunks/{granular-provider-B9nXQCMu.js.map → granular-provider-C6uAujdJ.js.map} +1 -1
  26. package/dist/chunks/grip-vertical-lRha2S7q.js +16 -0
  27. package/dist/chunks/grip-vertical-lRha2S7q.js.map +1 -0
  28. package/dist/chunks/icon-Dag2tIMs.js +21 -0
  29. package/dist/chunks/icon-Dag2tIMs.js.map +1 -0
  30. package/dist/chunks/{portalRoot-CWD4zHBm.js → portalRoot-CVhCgdG6.js} +10 -1
  31. package/dist/chunks/{portalRoot-CWD4zHBm.js.map → portalRoot-CVhCgdG6.js.map} +1 -1
  32. package/dist/chunks/{useModalOverlay-BTq-0ImG.js → useModalOverlay-DrQVYwwA.js} +1 -1
  33. package/dist/chunks/{useModalOverlay-BTq-0ImG.js.map → useModalOverlay-DrQVYwwA.js.map} +1 -1
  34. package/dist/chunks/{usePortalTarget-RyzEgNTb.js → usePortalTarget-Cn-Wiz5d.js} +1 -1
  35. package/dist/chunks/{usePortalTarget-RyzEgNTb.js.map → usePortalTarget-Cn-Wiz5d.js.map} +1 -1
  36. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-CPEQxmLZ.js → GrAutocomplete-gY4Xopza.js} +32 -24
  37. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-gY4Xopza.js.map +1 -0
  38. package/dist/components/GrAutocomplete/index.js +1 -1
  39. package/dist/components/GrAutocomplete/styles.css +1 -1
  40. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-BCNGDS6k.js → GrBreadcrumbs-DS_-PBVt.js} +8 -7
  41. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DS_-PBVt.js.map +1 -0
  42. package/dist/components/GrBreadcrumbs/index.js +1 -1
  43. package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js.map → GrCollapse-Kk0DE8tb.js.map} +1 -1
  44. package/dist/components/GrCollapse/index.js +1 -1
  45. package/dist/components/GrColorPicker/chunks/{GrColorPicker-DAdQ-Gc3.js → GrColorPicker-CkBTzkqn.js} +1 -1
  46. package/dist/components/GrColorPicker/chunks/{GrColorPicker-DAdQ-Gc3.js.map → GrColorPicker-CkBTzkqn.js.map} +1 -1
  47. package/dist/components/GrColorPicker/index.js +1 -1
  48. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-DMeSqkEv.js → GrCommandPalette-BugTlGdj.js} +37 -11
  49. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BugTlGdj.js.map +1 -0
  50. package/dist/components/GrCommandPalette/index.js +2 -2
  51. package/dist/components/GrCommandPalette/styles.css +1 -1
  52. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-hUTi-GdJ.js → GrConfirmDialog-Ds5T0GiR.js} +1 -1
  53. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-hUTi-GdJ.js.map → GrConfirmDialog-Ds5T0GiR.js.map} +1 -1
  54. package/dist/components/GrConfirmDialog/index.js +1 -1
  55. package/dist/components/GrDataTable/chunks/{GrDataTable-DzaGLG3A.js → GrDataTable-CYe2A2WA.js} +9 -7
  56. package/dist/components/GrDataTable/chunks/GrDataTable-CYe2A2WA.js.map +1 -0
  57. package/dist/components/GrDataTable/index.js +2 -2
  58. package/dist/components/GrDialog/chunks/{GrDialog-MD9Fzy9C.js → GrDialog-C3tYaA8v.js} +1 -1
  59. package/dist/components/GrDialog/chunks/{GrDialog-MD9Fzy9C.js.map → GrDialog-C3tYaA8v.js.map} +1 -1
  60. package/dist/components/GrDialog/index.js +1 -1
  61. package/dist/components/GrDialogService/chunks/{GrDialogService-DtgUijMj.js → GrDialogService-CTBiiJDI.js} +3 -3
  62. package/dist/components/GrDialogService/chunks/{GrDialogService-DtgUijMj.js.map → GrDialogService-CTBiiJDI.js.map} +1 -1
  63. package/dist/components/GrDialogService/index.js +1 -1
  64. package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js → GrDivider-xxq1_fIl.js} +1 -1
  65. package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js.map → GrDivider-xxq1_fIl.js.map} +1 -1
  66. package/dist/components/GrDivider/index.js +2 -2
  67. package/dist/components/GrDrawer/chunks/{GrDrawer-DWHdZZzW.js → GrDrawer-BSSuiNHU.js} +2 -2
  68. package/dist/components/GrDrawer/chunks/{GrDrawer-DWHdZZzW.js.map → GrDrawer-BSSuiNHU.js.map} +1 -1
  69. package/dist/components/GrDrawer/index.js +2 -2
  70. package/dist/components/GrDropdown/chunks/{GrDropdown-0tJK01Kq.js → GrDropdown-Bh6UK2M5.js} +1 -1
  71. package/dist/components/GrDropdown/chunks/{GrDropdown-0tJK01Kq.js.map → GrDropdown-Bh6UK2M5.js.map} +1 -1
  72. package/dist/components/GrDropdown/index.js +1 -1
  73. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-VPPrpCoA.js → GrDropdownMenu-LyfEFUbg.js} +2 -2
  74. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-VPPrpCoA.js.map → GrDropdownMenu-LyfEFUbg.js.map} +1 -1
  75. package/dist/components/GrDropdownMenu/index.js +2 -2
  76. package/dist/components/GrImageViewer/chunks/{GrImageViewer-DE7MBbF8.js → GrImageViewer-DfD4euH5.js} +3 -2
  77. package/dist/components/GrImageViewer/chunks/{GrImageViewer-DE7MBbF8.js.map → GrImageViewer-DfD4euH5.js.map} +1 -1
  78. package/dist/components/GrImageViewer/index.js +1 -1
  79. package/dist/components/GrModal/chunks/{GrModal-BbhcsDQ8.js → GrModal-CbMMr6W1.js} +1 -1
  80. package/dist/components/GrModal/chunks/{GrModal-BbhcsDQ8.js.map → GrModal-CbMMr6W1.js.map} +1 -1
  81. package/dist/components/GrModal/index.js +1 -1
  82. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js → GrNumberInput-B5CHZDBj.js} +2 -1
  83. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js.map → GrNumberInput-B5CHZDBj.js.map} +1 -1
  84. package/dist/components/GrNumberInput/index.js +1 -1
  85. package/dist/components/GrPagination/chunks/{GrPagination-waKhxBP7.js → GrPagination-BM4FrD6Q.js} +1 -1
  86. package/dist/components/GrPagination/chunks/{GrPagination-waKhxBP7.js.map → GrPagination-BM4FrD6Q.js.map} +1 -1
  87. package/dist/components/GrPagination/index.js +1 -1
  88. package/dist/components/GrPopover/chunks/{GrPopover-DuqeoFaI.js → GrPopover-DMH4Jjst.js} +1 -1
  89. package/dist/components/GrPopover/chunks/{GrPopover-DuqeoFaI.js.map → GrPopover-DMH4Jjst.js.map} +1 -1
  90. package/dist/components/GrPopover/index.js +1 -1
  91. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-JVVqBsPY.js → GrPromptDialog-Pwr9NPxK.js} +1 -1
  92. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-JVVqBsPY.js.map → GrPromptDialog-Pwr9NPxK.js.map} +1 -1
  93. package/dist/components/GrPromptDialog/index.js +1 -1
  94. package/dist/components/GrRating/chunks/{GrRating-LarIiwJL.js → GrRating-DVFH3lYu.js} +8 -7
  95. package/dist/components/GrRating/chunks/GrRating-DVFH3lYu.js.map +1 -0
  96. package/dist/components/GrRating/index.js +1 -1
  97. package/dist/components/GrSelect/chunks/{GrSelect-DAdu044K.js → GrSelect-B-Voni7D.js} +65 -52
  98. package/dist/components/GrSelect/chunks/GrSelect-B-Voni7D.js.map +1 -0
  99. package/dist/components/GrSelect/index.js +1 -1
  100. package/dist/components/GrSelect/styles.css +1 -1
  101. package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js → GrSidebar-i7AxjhY_.js} +3 -2
  102. package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js.map → GrSidebar-i7AxjhY_.js.map} +1 -1
  103. package/dist/components/GrSidebar/index.js +2 -2
  104. package/dist/components/GrSkeleton/index.js +1 -1
  105. package/dist/components/GrSortableList/chunks/{GrSortableList-BefVfWKh.js → GrSortableList-XB7mXM1W.js} +6 -5
  106. package/dist/components/GrSortableList/chunks/GrSortableList-XB7mXM1W.js.map +1 -0
  107. package/dist/components/GrSortableList/index.js +2 -2
  108. package/dist/components/GrStatistic/chunks/{GrStatistic-J4qLs3TH.js → GrStatistic-DOsM6s5V.js} +54 -7
  109. package/dist/components/GrStatistic/chunks/GrStatistic-DOsM6s5V.js.map +1 -0
  110. package/dist/components/GrStatistic/index.js +2 -2
  111. package/dist/components/GrTabs/chunks/{GrTabs-TeXaU5Uh.js → GrTabs-f3-oQenu.js} +5 -4
  112. package/dist/components/GrTabs/chunks/GrTabs-f3-oQenu.js.map +1 -0
  113. package/dist/components/GrTabs/index.js +1 -1
  114. package/dist/components/GrToaster/chunks/{GrToaster-Ct-39hga.js → GrToaster-Dqja0Lf9.js} +1 -1
  115. package/dist/components/GrToaster/chunks/{GrToaster-Ct-39hga.js.map → GrToaster-Dqja0Lf9.js.map} +1 -1
  116. package/dist/components/GrToaster/index.js +1 -1
  117. package/dist/components/GrTooltip/chunks/{GrTooltip-xAcqs0bP.js → GrTooltip-Cn08heWz.js} +1 -1
  118. package/dist/components/GrTooltip/chunks/{GrTooltip-xAcqs0bP.js.map → GrTooltip-Cn08heWz.js.map} +1 -1
  119. package/dist/components/GrTooltip/index.js +1 -1
  120. package/dist/components/GrTree/chunks/{GrTree-CaYK8dGZ.js → GrTree-BR9a2pay.js} +25 -20
  121. package/dist/components/GrTree/chunks/GrTree-BR9a2pay.js.map +1 -0
  122. package/dist/components/GrTree/index.js +2 -2
  123. package/dist/components/GrTree/styles.css +1 -1
  124. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DZp7CqqW.js → GrTreeSelect--muUeB0v.js} +27 -13
  125. package/dist/components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js.map +1 -0
  126. package/dist/components/GrTreeSelect/index.js +2 -2
  127. package/dist/composables/useAnnouncer.js +1 -1
  128. package/dist/composables/usePortalTarget.js +1 -1
  129. package/dist/directives/loading.js +1 -1
  130. package/dist/granular-provider-node.js +1 -1
  131. package/dist/granular-provider.js +1 -1
  132. package/dist/index.js +41 -41
  133. package/dist/styles/themes/dark.css +6 -1
  134. package/dist/testing.js +199 -0
  135. package/dist/testing.js.map +1 -0
  136. package/dist/theme-apply.js +33 -0
  137. package/dist/theme-apply.js.map +1 -0
  138. package/dist/theme.js +501 -0
  139. package/dist/theme.js.map +1 -0
  140. package/dist/tokens.js +1 -3215
  141. package/dist/types/src/components/GrBreadcrumbs/grBreadcrumbsStyles.d.ts +5 -2
  142. package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +6 -6
  143. package/dist/types/src/components/GrCommandPalette/filtering.d.ts +6 -2
  144. package/dist/types/src/components/GrDataTable/grDataTableStyles.d.ts +0 -1
  145. package/dist/types/src/components/GrRating/GrRating.vue.d.ts +9 -4
  146. package/dist/types/src/components/GrSortableList/grSortableListStyles.d.ts +0 -1
  147. package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +12 -9
  148. package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +0 -1
  149. package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -2
  150. package/dist/types/src/components/GrTree/grTreeProps.d.ts +11 -4
  151. package/dist/types/src/components/GrTree/safelist.d.ts +1 -1
  152. package/dist/types/src/components/shared/icon.d.ts +13 -0
  153. package/dist/types/src/testing/announcer.d.ts +10 -0
  154. package/dist/types/src/testing/context.d.ts +36 -0
  155. package/dist/types/src/testing/env.d.ts +25 -0
  156. package/dist/types/src/testing/geometry.d.ts +23 -0
  157. package/dist/types/src/testing/index.d.ts +12 -0
  158. package/dist/types/src/testing/pointer.d.ts +31 -0
  159. package/dist/types/src/theme/apply.d.ts +27 -0
  160. package/dist/types/src/theme/color.d.ts +35 -0
  161. package/dist/types/src/theme/extendTheme.d.ts +63 -0
  162. package/dist/types/src/theme/index.d.ts +22 -0
  163. package/dist/types/src/theme/roles.d.ts +16 -0
  164. package/dist/types/src/theme/tone.d.ts +32 -0
  165. package/dist/types/src/theme/validate.d.ts +16 -0
  166. package/dist/types/src/tokens/types.d.ts +8 -0
  167. package/dist/web-types.json +14 -11
  168. package/package.json +17 -2
  169. package/tokens/themes/dark.json +2 -1
  170. package/dist/chunks/chevron-right-BfqMVpbB.js.map +0 -1
  171. package/dist/chunks/config-8Pcutu1j.js.map +0 -1
  172. package/dist/chunks/config-BKvX0q10.js.map +0 -1
  173. package/dist/chunks/config-CY0_6cMi.js.map +0 -1
  174. package/dist/chunks/config-D2aNP7Es.js.map +0 -1
  175. package/dist/chunks/config-D94Z9po5.js.map +0 -1
  176. package/dist/chunks/config-DCFvmHEv2.js.map +0 -1
  177. package/dist/chunks/config-DEvsMTQE.js.map +0 -1
  178. package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
  179. package/dist/chunks/config-Rw9OyW70.js.map +0 -1
  180. package/dist/chunks/config-gvq_hWNM.js.map +0 -1
  181. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-CPEQxmLZ.js.map +0 -1
  182. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-BCNGDS6k.js.map +0 -1
  183. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-DMeSqkEv.js.map +0 -1
  184. package/dist/components/GrDataTable/chunks/GrDataTable-DzaGLG3A.js.map +0 -1
  185. package/dist/components/GrRating/chunks/GrRating-LarIiwJL.js.map +0 -1
  186. package/dist/components/GrSelect/chunks/GrSelect-DAdu044K.js.map +0 -1
  187. package/dist/components/GrSortableList/chunks/GrSortableList-BefVfWKh.js.map +0 -1
  188. package/dist/components/GrStatistic/chunks/GrStatistic-J4qLs3TH.js.map +0 -1
  189. package/dist/components/GrTabs/chunks/GrTabs-TeXaU5Uh.js.map +0 -1
  190. package/dist/components/GrTree/chunks/GrTree-CaYK8dGZ.js.map +0 -1
  191. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DZp7CqqW.js.map +0 -1
  192. package/dist/tokens.js.map +0 -1
  193. package/dist/chunks/{config-8Pcutu1j.js → config-8Pcutu1j2.js} +0 -0
  194. package/dist/chunks/{config-BKvX0q10.js → config-BKvX0q102.js} +0 -0
  195. package/dist/chunks/{config-CY0_6cMi.js → config-CY0_6cMi2.js} +0 -0
  196. package/dist/chunks/{config-D94Z9po5.js → config-D94Z9po52.js} +0 -0
  197. package/dist/chunks/{config-DCFvmHEv2.js → config-DCFvmHEv.js} +0 -0
  198. package/dist/chunks/{config-Rw9OyW70.js → config-Rw9OyW702.js} +0 -0
  199. package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js → GrCollapse-Kk0DE8tb.js} +1 -1
@@ -1,7 +1,9 @@
1
+ import { t as x_default } from "../../../chunks/x-2KXnqxiD.js";
1
2
  import { c as useGrThemeAttrs, o as useGrComponentSize } from "../../../chunks/context-BSYR7RZs.js";
2
3
  import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
3
- import { t as usePortalTarget } from "../../../chunks/usePortalTarget-RyzEgNTb.js";
4
+ import { t as usePortalTarget } from "../../../chunks/usePortalTarget-Cn-Wiz5d.js";
4
5
  import { vClickOutside } from "../../../directives/clickOutside.js";
6
+ import { t as loader_circle_default } from "../../../chunks/loader-circle-CfVLz7lb.js";
5
7
  import { useFloating } from "../../../composables/useFloating.js";
6
8
  import { useOverlayLayer } from "../../../composables/useOverlayLayer.js";
7
9
  import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
@@ -9,9 +11,11 @@ import { useGrFormControl } from "../../../composables/useGrFormControl.js";
9
11
  import { t as useFocusWithin } from "../../../chunks/useFocusWithin-BwHE0rzm.js";
10
12
  import { t as useControlledOpen } from "../../../chunks/useControlledOpen-DV3SqLTP.js";
11
13
  import { t as useControlAddons } from "../../../chunks/useControlAddons-asUr10Pf.js";
14
+ import { t as check_default } from "../../../chunks/check-BZI24Qs4.js";
15
+ import { t as chevron_down_default } from "../../../chunks/chevron-down-CQS2OG_s.js";
12
16
  import { t as GrInput_default } from "../../GrInput/chunks/GrInput-2wd7Crs0.js";
13
- import { t as GrTree_default } from "../../GrTree/chunks/GrTree-CaYK8dGZ.js";
14
- import { a as grTreeSelectStateClass, i as grTreeSelectPanelClass, o as paddingX, r as grTreeSelectClass, s as trailingZoneWidth } from "../../../chunks/config-DCFvmHEv2.js";
17
+ import { t as GrTree_default } from "../../GrTree/chunks/GrTree-BR9a2pay.js";
18
+ import { a as grTreeSelectStateClass, i as grTreeSelectPanelClass, o as paddingX, r as grTreeSelectClass, s as trailingZoneWidth } from "../../../chunks/config-DCFvmHEv.js";
15
19
  import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeProps, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useId, useSlots, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
16
20
  //#region src/components/GrTreeSelect/GrTreeSelect.vue?vue&type=script&setup=true&lang.ts
17
21
  var _hoisted_1 = ["name", "value"];
@@ -40,7 +44,13 @@ var _hoisted_6 = {
40
44
  class: "p-2 border-b border-[var(--gr-brd)]"
41
45
  };
42
46
  var _hoisted_7 = { class: "flex items-center gap-2 min-w-0" };
43
- var _hoisted_8 = { class: "truncate" };
47
+ var _hoisted_8 = {
48
+ key: 0,
49
+ "data-gr-tree-select-check": "",
50
+ class: "inline-block h-4 w-4 shrink-0",
51
+ "aria-hidden": "true"
52
+ };
53
+ var _hoisted_9 = { class: "truncate" };
44
54
  //#endregion
45
55
  //#region src/components/GrTreeSelect/GrTreeSelect.vue
46
56
  var GrTreeSelect_default = /* @__PURE__ */ defineComponent({
@@ -493,7 +503,13 @@ var GrTreeSelect_default = /* @__PURE__ */ defineComponent({
493
503
  class: "absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-[var(--gr-radius-control)] text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] hover:bg-[color-mix(in_srgb,var(--gr-muted)_25%,transparent)]",
494
504
  "aria-label": unref(t)("gr.common.clear", "Clear"),
495
505
  onClick: withModifiers(clear, ["stop"])
496
- }, [..._cache[3] || (_cache[3] = [createElementVNode("span", { class: "i-lucide-x inline-block h-4 w-4" }, null, -1)])], 8, _hoisted_4)) : (openBlock(), createElementBlock("span", _hoisted_5, [createElementVNode("span", { class: normalizeClass(["i-lucide-chevron-down inline-block h-4 w-4 transition-transform duration-[var(--gr-duration-fast)]", unref(open) ? "rotate-180" : ""]) }, null, 2)])),
506
+ }, [createVNode(unref(x_default), {
507
+ class: "inline-block h-4 w-4",
508
+ "aria-hidden": "true"
509
+ })], 8, _hoisted_4)) : (openBlock(), createElementBlock("span", _hoisted_5, [createVNode(unref(chevron_down_default), {
510
+ class: normalizeClass(["inline-block h-4 w-4 transition-transform duration-[var(--gr-duration-fast)]", unref(open) ? "rotate-180" : ""]),
511
+ "aria-hidden": "true"
512
+ }, null, 8, ["class"])])),
497
513
  unref(hasSuffix) ? (openBlock(), createElementBlock("div", {
498
514
  key: 3,
499
515
  ref_key: "suffixEl",
@@ -558,10 +574,10 @@ var GrTreeSelect_default = /* @__PURE__ */ defineComponent({
558
574
  "data-gr-tree-select-loading": "",
559
575
  role: "status",
560
576
  class: normalizeClass(unref(grTreeSelectStateClass))
561
- }, [renderSlot(_ctx.$slots, "loading", {}, () => [_cache[4] || (_cache[4] = createElementVNode("span", {
562
- class: "i-lucide-loader-circle block h-4 w-4 animate-spin",
577
+ }, [renderSlot(_ctx.$slots, "loading", {}, () => [createVNode(unref(loader_circle_default), {
578
+ class: "block h-4 w-4 animate-spin",
563
579
  "aria-hidden": "true"
564
- }, null, -1)), createElementVNode("span", null, toDisplayString(unref(t)("gr.treeSelect.loading", "Loading…")), 1)])], 2)) : (__props.data?.length ?? 0) === 0 ? (openBlock(), createElementBlock("div", {
580
+ }), createElementVNode("span", null, toDisplayString(unref(t)("gr.treeSelect.loading", "Loading…")), 1)])], 2)) : (__props.data?.length ?? 0) === 0 ? (openBlock(), createElementBlock("div", {
565
581
  key: 1,
566
582
  class: normalizeClass(unref(grTreeSelectStateClass))
567
583
  }, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(unref(t)("gr.treeSelect.empty", "No data")), 1)])], 2)) : (openBlock(), createBlock(unref(GrTree_default), {
@@ -588,12 +604,10 @@ var GrTreeSelect_default = /* @__PURE__ */ defineComponent({
588
604
  node,
589
605
  data,
590
606
  selected: selectedKeySet.value.has(node.key)
591
- }, () => [createElementVNode("div", _hoisted_7, [!checkboxMode.value ? (openBlock(), createElementBlock("span", {
607
+ }, () => [createElementVNode("div", _hoisted_7, [!checkboxMode.value ? (openBlock(), createElementBlock("span", _hoisted_8, [selectedKeySet.value.has(node.key) ? (openBlock(), createBlock(unref(check_default), {
592
608
  key: 0,
593
- "data-gr-tree-select-check": "",
594
- class: normalizeClass(["inline-block h-4 w-4 shrink-0", selectedKeySet.value.has(node.key) ? "i-lucide-check text-[var(--gr-primary)]" : ""]),
595
- "aria-hidden": "true"
596
- }, null, 2)) : createCommentVNode("", true), createElementVNode("span", _hoisted_8, toDisplayString(node.label), 1)])])]),
609
+ class: "block h-4 w-4 text-[var(--gr-primary)]"
610
+ })) : createCommentVNode("", true)])) : createCommentVNode("", true), createElementVNode("span", _hoisted_9, toDisplayString(node.label), 1)])])]),
597
611
  _: 3
598
612
  }, 8, [
599
613
  "size",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrTreeSelect--muUeB0v.js","names":["$slots"],"sources":["../../../../src/components/GrTreeSelect/GrTreeSelect.vue","../../../../src/components/GrTreeSelect/GrTreeSelect.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T extends Record<string, any> = any\">\nimport { computed, nextTick, ref, useId, useSlots, watch } from 'vue'\n\nimport { usePortalTarget } from '../../composables/usePortalTarget'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/useFloating'\nimport { useOverlayLayer } from '../../composables/useOverlayLayer'\nimport { useControlAddons } from '../../composables/internal/useControlAddons'\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useGrComponentSize, useGrThemeAttrs } from '../GrConfigProvider/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useFocusWithin } from '../../composables/internal/useFocusWithin'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport GrInput from '../GrInput/GrInput.vue'\nimport GrTree, {\n type GrTreeInstance,\n type GrTreeKey,\n type GrTreeNode,\n} from '../GrTree'\nimport type { GrInputSize } from '../GrInput/GrInput.vue'\nimport type { GrTreeSelectModelValue, GrTreeSelectProps } from './grTreeSelectTypes'\nimport { grTreeSelectClass, grTreeSelectPanelClass, grTreeSelectStateClass, paddingX, trailingZoneWidth } from './grTreeSelectStyles'\n\nimport IconCheck from '~icons/lucide/check'\nimport IconChevronDown from '~icons/lucide/chevron-down'\nimport IconLoaderCircle from '~icons/lucide/loader-circle'\nimport IconX from '~icons/lucide/x'\n\nexport interface GrTreeSelectEmits<T extends Record<string, any> = any> {\n (e: 'update:modelValue', value: GrTreeSelectModelValue): void\n (e: 'change', value: GrTreeSelectModelValue): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n /**\n * Панель открылась/закрылась.\n * @deprecated Используйте `update:open` (`v-model:open`); алиас будет снят после 1.0.\n */\n (e: 'visibleChange', visible: boolean): void\n (e: 'clear'): void\n (e: 'nodeClick', data: T, node: GrTreeNode<T>): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(\n defineProps<GrTreeSelectProps<T>>(),\n {\n props: () => ({\n children: 'children',\n label: 'label',\n }),\n nodeKey: 'id' as any,\n defaultExpandedKeys: () => [],\n disabled: false,\n placeholder: undefined,\n size: undefined,\n loading: false,\n invalid: false,\n readonly: false,\n required: false,\n ariaLabel: undefined,\n state: 'default',\n multiple: false,\n showCheckbox: false,\n checkStrictly: false,\n clearable: false,\n open: undefined,\n name: undefined,\n valueDisplay: 'label',\n filterable: false,\n filterPlaceholder: undefined,\n filterInputmode: undefined,\n filterNodeMethod: undefined,\n closeOnSelect: undefined,\n dropdownMaxHeight: 320,\n virtual: false,\n prefixMinWidth: undefined,\n prefixMaxWidth: undefined,\n suffixMinWidth: undefined,\n suffixMaxWidth: undefined,\n prefixFixed: false,\n suffixFixed: false,\n },\n)\n\nconst { t } = useGranularityTranslations()\n\nconst emit = defineEmits<GrTreeSelectEmits<T>>()\n\ndefineSlots<{\n /** Рендер значения внутри триггера (вместо дефолтного текста). */\n value?: (props: { value: GrTreeSelectModelValue; labels: string[]; displayValue: string; pathLabels?: string[] }) => any\n /** Рендер строки дерева. */\n node?: (props: { node: GrTreeNode<T>; data: T; selected: boolean }) => any\n /** Содержимое пустого состояния (когда нет данных). */\n empty?: () => any\n /** Содержимое панели, пока данные едут. */\n loading?: () => any\n /** Аддон слева от значения: иконка, код валюты, метка. */\n prefix?: () => any\n /** Аддон справа от значения, перед крестиком и шевроном. */\n suffix?: () => any\n}>()\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst triggerEl = ref<HTMLInputElement | null>(null)\nconst treeId = `gr-tree-select-tree-${useId()}`\n\n// Контекст `GrFormField` + общий контракт форм-контрола.\nconst field = useGrFormFieldContext()\nconst fieldId = computed(() => field?.id.value)\nconst describedBy = computed(() => field?.describedById.value)\nconst {\n disabled: isDisabled,\n invalid: isInvalid, required: isRequired, readonly: isReadonly } = useGrFormControl(() => props)\n\nfunction focus(): void {\n triggerEl.value?.focus()\n}\n\nfunction blur(): void {\n triggerEl.value?.blur()\n}\n\ndefineExpose({ focus, blur })\nconst filterInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst treeRef = ref<GrTreeInstance | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\n\n// Панель телепортирована в `body`, то есть лежит вне корня, но для пользователя\n// она часть контрола: без неё уход фокуса в панель читался бы как `blur`.\nconst { onFocusIn, onFocusOut } = useFocusWithin(rootEl, {\n enter: event => emit('focus', event),\n leave: event => emit('blur', event),\n containers: () => [panelEl.value],\n})\n\nconst clickOutsideExclude = [() => panelEl.value]\n\nlet hadPointerDownOnTrigger = false\n\n// Имя `open` сохранено: читатели работают с computed-Ref.\nconst { open, setOpen: setOpenState } = useControlledOpen(\n () => props.open,\n (next) => {\n emit('update:open', next)\n emit('visibleChange', next)\n },\n)\nconst filterValue = ref('')\n\nconst { floatingStyle } = useFloating(rootEl, panelEl, open, {\n placement: 'bottom-start',\n matchWidth: true,\n zIndexVar: '--gr-z-dropdown',\n})\n\nconst closeOnSelectResolved = computed(() => {\n return props.closeOnSelect ?? !props.multiple\n})\n\nfunction getChildrenKey() {\n return props.props.children ?? 'children'\n}\n\nfunction getLabelKey() {\n return props.props.label ?? 'label'\n}\n\nfunction nodeLabel(data: T): string {\n const key = getLabelKey() as keyof T\n const v = data[key]\n return v == null ? '' : String(v)\n}\n\nfunction nodeChildren(data: T): T[] {\n const key = getChildrenKey() as keyof T\n const v = data[key]\n return Array.isArray(v) ? (v as any) : []\n}\n\nfunction nodeKeyOf(data: T, index: number, parentKey: GrTreeKey | undefined): GrTreeKey {\n const keyName = props.nodeKey as keyof T\n const v = data[keyName]\n if (v != null)\n return v as GrTreeKey\n\n return parentKey == null ? index : `${String(parentKey)}:${index}`\n}\n\nconst labelByKey = computed(() => {\n const map = new Map<GrTreeKey, string>()\n\n const walk = (items: T[], parentKey: GrTreeKey | undefined) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const key = nodeKeyOf(item, i, parentKey)\n map.set(key, nodeLabel(item))\n walk(nodeChildren(item), key)\n }\n }\n\n walk(props.data ?? [], undefined)\n return map\n})\n\nconst pathLabelsByKey = computed(() => {\n const map = new Map<GrTreeKey, string[]>()\n\n const walk = (items: T[], parentKey: GrTreeKey | undefined, parentPath: string[]) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const key = nodeKeyOf(item, i, parentKey)\n const label = nodeLabel(item)\n const path = [...parentPath, label]\n map.set(key, path)\n walk(nodeChildren(item), key, path)\n }\n }\n\n walk(props.data ?? [], undefined, [])\n return map\n})\n\nconst selectedKeys = computed<GrTreeKey[]>(() => {\n if (props.multiple) {\n return Array.isArray(props.modelValue) ? props.modelValue : []\n }\n\n const v = props.modelValue\n if (v == null || Array.isArray(v))\n return []\n return [v]\n})\n\nconst selectedKeySet = computed(() => new Set(selectedKeys.value))\n\nconst selectedLabels = computed(() => {\n const map = labelByKey.value\n return selectedKeys.value.map((k) => map.get(k) ?? String(k))\n})\n\nconst selectedPathLabels = computed<string[] | undefined>(() => {\n if (props.multiple)\n return undefined\n\n const key = selectedKeys.value[0]\n if (key == null)\n return undefined\n\n const path = pathLabelsByKey.value.get(key)\n if (path?.length)\n return path\n\n const labels = selectedLabels.value\n return labels.length ? [labels[0]] : undefined\n})\n\nconst displayValue = computed(() => {\n const labels = selectedLabels.value\n if (labels.length === 0)\n return ''\n\n if (!props.multiple) {\n if (props.valueDisplay === 'path') {\n const path = selectedPathLabels.value\n if (path?.length)\n return path.join(' / ')\n }\n return labels[0]\n }\n\n if (labels.length === 1)\n return labels[0]\n return `${labels[0]} +${labels.length - 1}`\n})\n\nconst hasSelection = computed(() => selectedKeys.value.length > 0)\n\n/** Дерево рендерится только когда есть что показать — ссылаться иначе не на что. */\nconst hasTree = computed(() => !props.loading && (props.data?.length ?? 0) > 0)\n\nconst resolvedFilterPlaceholder = computed(() => {\n return props.filterPlaceholder ?? t('gr.treeSelect.filterPlaceholder', 'Search…')\n})\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTreeSelect' })\n\nconst className = computed(() => {\n return grTreeSelectClass({\n size: resolvedSize.value,\n state: props.state,\n invalid: isInvalid.value,\n disabled: isDisabled.value,\n })\n})\n\nconst panelClasses = computed(() => {\n return grTreeSelectPanelClass\n})\n\nconst ADDON_MIN_WIDTH_BY_SIZE: Record<GrInputSize, string> = {\n xs: '2rem',\n sm: '2.25rem',\n md: '2.5rem',\n lg: '3rem',\n}\n\nconst slots = useSlots()\n\nconst {\n hasPrefix,\n hasSuffix,\n prefixEl,\n suffixEl,\n prefixStyle,\n suffixStyle,\n fieldPadding: triggerStyle,\n} = useControlAddons(() => props, {\n defaultMinWidth: () => ADDON_MIN_WIDTH_BY_SIZE[resolvedSize.value],\n paddingX: () => paddingX[resolvedSize.value],\n // Место под крестик и шеврон уже отдано классом `pr-9`, но инлайн-паддинг\n // перекрывает класс целиком — с суффиксом эту зону приходится вернуть числом.\n trailingReserve: () => (slots.suffix ? trailingZoneWidth : '0px'),\n})\n\n// Слот `value` рисуется поверх поля и обязан жить в тех же границах, что и\n// текст под ним. Без аддонов границы задаёт класс — стиль остаётся пустым.\nconst valueOverlayStyle = computed(() => ({\n left: hasPrefix.value ? triggerStyle.value.paddingLeft : undefined,\n right: hasSuffix.value ? triggerStyle.value.paddingRight : undefined,\n}))\n\nfunction setOpen(next: boolean) {\n if (isDisabled.value || isReadonly.value)\n return\n\n setOpenState(next)\n}\n\nfunction onClickOutside(): void {\n setOpen(false)\n}\n\nfunction openDropdown(): void {\n setOpen(true)\n}\n\n/**\n * Стек слоёв возвращает фокус на триггер сразу после закрытия, а у триггера\n * открытие висит на `focus`. Без флага `Escape` из дерева закрывал бы панель и\n * тем же движением открывал её заново.\n */\nlet suppressFocusOpen = false\n\nfunction closeDropdown(): void {\n suppressFocusOpen = true\n setOpen(false)\n setTimeout(() => {\n suppressFocusOpen = false\n }, 0)\n}\n\nfunction toggleDropdown(): void {\n setOpen(!open.value)\n}\n\n// Клик по триггеру сам переключает панель через `@click`; флаг гасит открытие\n// по приходящему следом `focus`, иначе один клик открыл бы и тут же закрыл.\nfunction onTriggerPointerDown(): void {\n hadPointerDownOnTrigger = true\n setTimeout(() => {\n hadPointerDownOnTrigger = false\n }, 0)\n}\n\nfunction onTriggerFocus(): void {\n if (hadPointerDownOnTrigger || suppressFocusOpen)\n return\n openDropdown()\n}\n\n// Возврат фокуса на триггер — из контракта слоя, а не руками через `nextTick`.\nuseOverlayLayer(open, closeDropdown, { root: panelEl })\n\nwatch(\n open,\n async (isOpen) => {\n if (!isOpen) {\n if (filterValue.value.trim().length > 0)\n filterValue.value = ''\n return\n }\n\n // Подсветка дерева идёт за значением: панель могли открыть после того, как\n // значение сменили снаружи.\n if (!props.multiple) {\n const v = props.modelValue\n if (v != null && !Array.isArray(v))\n treeRef.value?.setCurrentKey(v)\n }\n\n if (props.filterable) {\n await nextTick()\n filterInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nwatch(\n () => props.modelValue,\n (v) => {\n if (props.multiple)\n return\n if (v == null || Array.isArray(v)) {\n treeRef.value?.setCurrentKey(undefined)\n return\n }\n treeRef.value?.setCurrentKey(v)\n },\n)\n\nwatch(\n filterValue,\n (v) => {\n treeRef.value?.filter(v)\n },\n)\n\nfunction emitModel(next: GrTreeSelectModelValue) {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction clear(): void {\n if (isDisabled.value || isReadonly.value)\n return\n\n const next: GrTreeSelectModelValue = props.multiple ? [] : null\n emitModel(next)\n emit('clear')\n if (!props.multiple)\n treeRef.value?.setCurrentKey(undefined)\n}\n\n/**\n * Отдаёт клавиатуру дереву. Панель под `v-show`, поэтому дерево уже в DOM, но\n * скрытый элемент сфокусировать нельзя — сначала открытие, потом кадр, потом\n * фокус. Дальше работают клавиши `GrTree`, а `Escape` возвращает фокус на\n * триггер силами общего стека слоёв.\n */\nasync function focusTree(): Promise<boolean> {\n if (!open.value)\n return false\n\n await nextTick()\n return treeRef.value?.focus() ?? false\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent): void {\n if (isDisabled.value)\n return\n\n if (e.key === 'Escape') {\n e.preventDefault()\n closeDropdown()\n return\n }\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openDropdown()\n\n // При `filterable` фокус уходит в поле поиска (см. watch на `open`), и\n // дальше в дерево ведёт стрелка уже оттуда.\n if (!props.filterable)\n void focusTree()\n }\n}\n\n/** Стрелка из поля поиска — единственный путь из фильтра в дерево. */\nfunction onFilterKeydown(e: KeyboardEvent): void {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp')\n return\n\n e.preventDefault()\n void focusTree()\n}\n\n/** `Tab` уводит из панели — оставлять её открытой за спиной незачем. */\nfunction onPanelKeydown(e: KeyboardEvent): void {\n if (e.key === 'Tab')\n closeDropdown()\n}\n\n// Чекбоксы осмысленны только в множественном выборе: одиночный уже подсвечен\n// текущим узлом.\nconst checkboxMode = computed(() => props.multiple && props.showCheckbox)\n\n// В режиме чекбоксов каскад по родителям и детям считает `GrTree`, а не копия\n// его логики здесь: значение приходит обратно одним `update:checkedKeys`.\nfunction onCheckedKeys(keys: GrTreeKey[]): void {\n if (isDisabled.value || isReadonly.value)\n return\n\n emitModel([...keys])\n}\n\nfunction onNodeClick(data: T, node: GrTreeNode<T>): void {\n emit('nodeClick', data, node)\n\n if (isDisabled.value)\n return\n\n if (checkboxMode.value) {\n // Клик по строке — тот же переключатель отметки, что и сам чекбокс;\n // значение придёт через `update:checkedKeys`, поэтому здесь не эмитим.\n treeRef.value?.setChecked(node.key, !selectedKeySet.value.has(node.key))\n return\n }\n\n if (props.multiple) {\n const next = new Set(selectedKeySet.value)\n if (next.has(node.key))\n next.delete(node.key)\n else\n next.add(node.key)\n emitModel([...next])\n\n if (closeOnSelectResolved.value) {\n closeDropdown()\n }\n return\n }\n\n emitModel(node.key)\n if (closeOnSelectResolved.value) {\n closeDropdown()\n }\n}\n\n// Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n// рендер не совпадает с серверным и ломается гидрация (см. композабл).\nconst { target: portalTarget, enabled: teleportEnabled } = usePortalTarget()\n\n// Тема поддерева на телепортированную панель: в DOM она уезжает в `body`, то\n// есть вне обёртки провайдера, и `data-theme` с неё не наследуется. В дереве\n// компонентов панель остаётся внутри — `inject` доходит, и тему она ставит себе\n// сама.\nconst themeAttrs = useGrThemeAttrs()\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: onClickOutside, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-tree-select\n class=\"relative\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <!-- Нативная форма: hidden на каждый выбранный ключ. -->\n <template v-if=\"name\">\n <input\n v-for=\"key in selectedKeys\"\n :key=\"`hidden-${String(key)}`\"\n type=\"hidden\"\n :name=\"name\"\n :value=\"String(key)\"\n >\n </template>\n <div class=\"relative\">\n <div\n v-if=\"hasPrefix\"\n ref=\"prefixEl\"\n data-gr-tree-select-prefix\n class=\"absolute inset-y-px left-px flex items-center justify-center rounded-l-[var(--gr-radius-control)] border-r border-[var(--gr-brd)] px-2 text-[var(--gr-muted-fg)] pointer-events-none select-none truncate\"\n :style=\"prefixStyle\"\n aria-hidden=\"true\"\n >\n <slot name=\"prefix\" />\n </div>\n\n <input\n :id=\"fieldId\"\n ref=\"triggerEl\"\n data-testid=\"gr-tree-select-trigger\"\n data-gr-tree-select-trigger\n type=\"text\"\n :value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n readonly\n role=\"combobox\"\n aria-readonly=\"true\"\n aria-haspopup=\"tree\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :aria-controls=\"open && hasTree ? treeId : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"ariaLabel\"\n class=\"w-full rounded-[var(--gr-radius-control)] border placeholder:text-[var(--gr-muted-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n :class=\"[className, $slots.value ? 'text-transparent placeholder:text-transparent' : '']\"\n :style=\"triggerStyle\"\n @pointerdown=\"onTriggerPointerDown\"\n @click=\"toggleDropdown\"\n @focus=\"onTriggerFocus\"\n @keydown=\"onTriggerKeydown\"\n >\n\n <button\n v-if=\"clearable && hasSelection && !disabled && !isReadonly\"\n data-testid=\"gr-tree-select-clear\"\n data-gr-tree-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-[var(--gr-radius-control)] text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] hover:bg-[color-mix(in_srgb,var(--gr-muted)_25%,transparent)]\"\n :aria-label=\"t('gr.common.clear', 'Clear')\"\n @click.stop=\"clear\"\n >\n <IconX class=\"inline-block h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <span\n v-else\n data-testid=\"gr-tree-select-chevron\"\n data-gr-tree-select-chevron\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--gr-muted-fg)] pointer-events-none\"\n >\n <IconChevronDown\n class=\"inline-block h-4 w-4 transition-transform duration-[var(--gr-duration-fast)]\"\n :class=\"open ? 'rotate-180' : ''\"\n aria-hidden=\"true\"\n />\n </span>\n\n <div\n v-if=\"hasSuffix\"\n ref=\"suffixEl\"\n data-gr-tree-select-suffix\n class=\"absolute inset-y-px right-9 flex items-center justify-center border-l border-[var(--gr-brd)] px-2 text-[var(--gr-muted-fg)] pointer-events-none select-none truncate\"\n :class=\"suffixFixed ? '[direction:rtl]' : ''\"\n :style=\"suffixStyle\"\n aria-hidden=\"true\"\n >\n <slot name=\"suffix\" />\n </div>\n\n <div\n v-if=\"$slots.value\"\n class=\"absolute inset-y-0 left-3 right-9 flex items-center pointer-events-none\"\n :style=\"valueOverlayStyle\"\n >\n <slot\n name=\"value\"\n :value=\"modelValue\"\n :labels=\"selectedLabels\"\n :display-value=\"displayValue\"\n :path-labels=\"selectedPathLabels\"\n />\n </div>\n </div>\n\n <teleport :to=\"portalTarget\" :disabled=\"!teleportEnabled\">\n <transition\n enter-active-class=\"transition ease-[var(--gr-ease-out)] duration-[var(--gr-duration-fast)]\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-[var(--gr-ease-in)] duration-[var(--gr-duration-fast)]\"\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=\"gr-tree-select-panel\"\n v-bind=\"themeAttrs\"\n data-gr-tree-select-panel\n data-gr-overlay-root\n :style=\"floatingStyle\"\n @keydown=\"onPanelKeydown\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"filterable\" class=\"p-2 border-b border-[var(--gr-brd)]\">\n <GrInput\n ref=\"filterInputRef\"\n v-model=\"filterValue\"\n data-testid=\"gr-tree-select-filter\"\n data-gr-tree-select-filter\n type=\"search\"\n :inputmode=\"filterInputmode\"\n :placeholder=\"resolvedFilterPlaceholder\"\n size=\"sm\"\n @keydown=\"onFilterKeydown\"\n />\n </div>\n\n <!--\n Скроллер один. При виртуализации его берёт на себя дерево: своя\n высота нужна ему, чтобы посчитать окно, а вложенный скроллер поверх\n дал бы вторую полосу прокрутки на том же списке.\n -->\n <div\n class=\"p-1\"\n :class=\"virtual ? '' : 'overflow-auto'\"\n :style=\"virtual ? undefined : { maxHeight: `${dropdownMaxHeight}px` }\"\n >\n <div\n v-if=\"loading\"\n data-gr-tree-select-loading\n role=\"status\"\n :class=\"grTreeSelectStateClass\"\n >\n <slot name=\"loading\">\n <IconLoaderCircle class=\"block h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <span>{{ t('gr.treeSelect.loading', 'Loading…') }}</span>\n </slot>\n </div>\n\n <div v-else-if=\"(data?.length ?? 0) === 0\" :class=\"grTreeSelectStateClass\">\n <slot name=\"empty\">\n {{ t('gr.treeSelect.empty', 'No data') }}\n </slot>\n </div>\n\n <GrTree\n v-else\n :id=\"treeId\"\n ref=\"treeRef\"\n :size=\"resolvedSize\"\n :data=\"data\"\n :props=\"props.props\"\n :node-key=\"nodeKey as any\"\n :default-expanded-keys=\"defaultExpandedKeys\"\n :filter-node-method=\"filterNodeMethod\"\n :highlight-current=\"!multiple\"\n :virtual=\"virtual\"\n :max-height=\"dropdownMaxHeight\"\n :show-checkbox=\"checkboxMode\"\n :check-strictly=\"checkStrictly\"\n :checked-keys=\"selectedKeys\"\n @node-click=\"onNodeClick\"\n @update:checked-keys=\"onCheckedKeys\"\n >\n <template #default=\"{ node, data }\">\n <slot\n name=\"node\"\n :node=\"node\"\n :data=\"data\"\n :selected=\"selectedKeySet.has(node.key)\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <!-- Чекбокс дерева уже показывает отметку: вторая галочка\n рядом читалась бы как ошибка. -->\n <span\n v-if=\"!checkboxMode\"\n data-gr-tree-select-check\n class=\"inline-block h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n >\n <IconCheck v-if=\"selectedKeySet.has(node.key)\" class=\"block h-4 w-4 text-[var(--gr-primary)]\" />\n </span>\n <span class=\"truncate\">{{ node.label }}</span>\n </div>\n </slot>\n </template>\n </GrTree>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any> = any\">\nimport { computed, nextTick, ref, useId, useSlots, watch } from 'vue'\n\nimport { usePortalTarget } from '../../composables/usePortalTarget'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/useFloating'\nimport { useOverlayLayer } from '../../composables/useOverlayLayer'\nimport { useControlAddons } from '../../composables/internal/useControlAddons'\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useGrComponentSize, useGrThemeAttrs } from '../GrConfigProvider/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useFocusWithin } from '../../composables/internal/useFocusWithin'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport GrInput from '../GrInput/GrInput.vue'\nimport GrTree, {\n type GrTreeInstance,\n type GrTreeKey,\n type GrTreeNode,\n} from '../GrTree'\nimport type { GrInputSize } from '../GrInput/GrInput.vue'\nimport type { GrTreeSelectModelValue, GrTreeSelectProps } from './grTreeSelectTypes'\nimport { grTreeSelectClass, grTreeSelectPanelClass, grTreeSelectStateClass, paddingX, trailingZoneWidth } from './grTreeSelectStyles'\n\nimport IconCheck from '~icons/lucide/check'\nimport IconChevronDown from '~icons/lucide/chevron-down'\nimport IconLoaderCircle from '~icons/lucide/loader-circle'\nimport IconX from '~icons/lucide/x'\n\nexport interface GrTreeSelectEmits<T extends Record<string, any> = any> {\n (e: 'update:modelValue', value: GrTreeSelectModelValue): void\n (e: 'change', value: GrTreeSelectModelValue): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n /**\n * Панель открылась/закрылась.\n * @deprecated Используйте `update:open` (`v-model:open`); алиас будет снят после 1.0.\n */\n (e: 'visibleChange', visible: boolean): void\n (e: 'clear'): void\n (e: 'nodeClick', data: T, node: GrTreeNode<T>): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(\n defineProps<GrTreeSelectProps<T>>(),\n {\n props: () => ({\n children: 'children',\n label: 'label',\n }),\n nodeKey: 'id' as any,\n defaultExpandedKeys: () => [],\n disabled: false,\n placeholder: undefined,\n size: undefined,\n loading: false,\n invalid: false,\n readonly: false,\n required: false,\n ariaLabel: undefined,\n state: 'default',\n multiple: false,\n showCheckbox: false,\n checkStrictly: false,\n clearable: false,\n open: undefined,\n name: undefined,\n valueDisplay: 'label',\n filterable: false,\n filterPlaceholder: undefined,\n filterInputmode: undefined,\n filterNodeMethod: undefined,\n closeOnSelect: undefined,\n dropdownMaxHeight: 320,\n virtual: false,\n prefixMinWidth: undefined,\n prefixMaxWidth: undefined,\n suffixMinWidth: undefined,\n suffixMaxWidth: undefined,\n prefixFixed: false,\n suffixFixed: false,\n },\n)\n\nconst { t } = useGranularityTranslations()\n\nconst emit = defineEmits<GrTreeSelectEmits<T>>()\n\ndefineSlots<{\n /** Рендер значения внутри триггера (вместо дефолтного текста). */\n value?: (props: { value: GrTreeSelectModelValue; labels: string[]; displayValue: string; pathLabels?: string[] }) => any\n /** Рендер строки дерева. */\n node?: (props: { node: GrTreeNode<T>; data: T; selected: boolean }) => any\n /** Содержимое пустого состояния (когда нет данных). */\n empty?: () => any\n /** Содержимое панели, пока данные едут. */\n loading?: () => any\n /** Аддон слева от значения: иконка, код валюты, метка. */\n prefix?: () => any\n /** Аддон справа от значения, перед крестиком и шевроном. */\n suffix?: () => any\n}>()\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst triggerEl = ref<HTMLInputElement | null>(null)\nconst treeId = `gr-tree-select-tree-${useId()}`\n\n// Контекст `GrFormField` + общий контракт форм-контрола.\nconst field = useGrFormFieldContext()\nconst fieldId = computed(() => field?.id.value)\nconst describedBy = computed(() => field?.describedById.value)\nconst {\n disabled: isDisabled,\n invalid: isInvalid, required: isRequired, readonly: isReadonly } = useGrFormControl(() => props)\n\nfunction focus(): void {\n triggerEl.value?.focus()\n}\n\nfunction blur(): void {\n triggerEl.value?.blur()\n}\n\ndefineExpose({ focus, blur })\nconst filterInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst treeRef = ref<GrTreeInstance | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\n\n// Панель телепортирована в `body`, то есть лежит вне корня, но для пользователя\n// она часть контрола: без неё уход фокуса в панель читался бы как `blur`.\nconst { onFocusIn, onFocusOut } = useFocusWithin(rootEl, {\n enter: event => emit('focus', event),\n leave: event => emit('blur', event),\n containers: () => [panelEl.value],\n})\n\nconst clickOutsideExclude = [() => panelEl.value]\n\nlet hadPointerDownOnTrigger = false\n\n// Имя `open` сохранено: читатели работают с computed-Ref.\nconst { open, setOpen: setOpenState } = useControlledOpen(\n () => props.open,\n (next) => {\n emit('update:open', next)\n emit('visibleChange', next)\n },\n)\nconst filterValue = ref('')\n\nconst { floatingStyle } = useFloating(rootEl, panelEl, open, {\n placement: 'bottom-start',\n matchWidth: true,\n zIndexVar: '--gr-z-dropdown',\n})\n\nconst closeOnSelectResolved = computed(() => {\n return props.closeOnSelect ?? !props.multiple\n})\n\nfunction getChildrenKey() {\n return props.props.children ?? 'children'\n}\n\nfunction getLabelKey() {\n return props.props.label ?? 'label'\n}\n\nfunction nodeLabel(data: T): string {\n const key = getLabelKey() as keyof T\n const v = data[key]\n return v == null ? '' : String(v)\n}\n\nfunction nodeChildren(data: T): T[] {\n const key = getChildrenKey() as keyof T\n const v = data[key]\n return Array.isArray(v) ? (v as any) : []\n}\n\nfunction nodeKeyOf(data: T, index: number, parentKey: GrTreeKey | undefined): GrTreeKey {\n const keyName = props.nodeKey as keyof T\n const v = data[keyName]\n if (v != null)\n return v as GrTreeKey\n\n return parentKey == null ? index : `${String(parentKey)}:${index}`\n}\n\nconst labelByKey = computed(() => {\n const map = new Map<GrTreeKey, string>()\n\n const walk = (items: T[], parentKey: GrTreeKey | undefined) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const key = nodeKeyOf(item, i, parentKey)\n map.set(key, nodeLabel(item))\n walk(nodeChildren(item), key)\n }\n }\n\n walk(props.data ?? [], undefined)\n return map\n})\n\nconst pathLabelsByKey = computed(() => {\n const map = new Map<GrTreeKey, string[]>()\n\n const walk = (items: T[], parentKey: GrTreeKey | undefined, parentPath: string[]) => {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const key = nodeKeyOf(item, i, parentKey)\n const label = nodeLabel(item)\n const path = [...parentPath, label]\n map.set(key, path)\n walk(nodeChildren(item), key, path)\n }\n }\n\n walk(props.data ?? [], undefined, [])\n return map\n})\n\nconst selectedKeys = computed<GrTreeKey[]>(() => {\n if (props.multiple) {\n return Array.isArray(props.modelValue) ? props.modelValue : []\n }\n\n const v = props.modelValue\n if (v == null || Array.isArray(v))\n return []\n return [v]\n})\n\nconst selectedKeySet = computed(() => new Set(selectedKeys.value))\n\nconst selectedLabels = computed(() => {\n const map = labelByKey.value\n return selectedKeys.value.map((k) => map.get(k) ?? String(k))\n})\n\nconst selectedPathLabels = computed<string[] | undefined>(() => {\n if (props.multiple)\n return undefined\n\n const key = selectedKeys.value[0]\n if (key == null)\n return undefined\n\n const path = pathLabelsByKey.value.get(key)\n if (path?.length)\n return path\n\n const labels = selectedLabels.value\n return labels.length ? [labels[0]] : undefined\n})\n\nconst displayValue = computed(() => {\n const labels = selectedLabels.value\n if (labels.length === 0)\n return ''\n\n if (!props.multiple) {\n if (props.valueDisplay === 'path') {\n const path = selectedPathLabels.value\n if (path?.length)\n return path.join(' / ')\n }\n return labels[0]\n }\n\n if (labels.length === 1)\n return labels[0]\n return `${labels[0]} +${labels.length - 1}`\n})\n\nconst hasSelection = computed(() => selectedKeys.value.length > 0)\n\n/** Дерево рендерится только когда есть что показать — ссылаться иначе не на что. */\nconst hasTree = computed(() => !props.loading && (props.data?.length ?? 0) > 0)\n\nconst resolvedFilterPlaceholder = computed(() => {\n return props.filterPlaceholder ?? t('gr.treeSelect.filterPlaceholder', 'Search…')\n})\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTreeSelect' })\n\nconst className = computed(() => {\n return grTreeSelectClass({\n size: resolvedSize.value,\n state: props.state,\n invalid: isInvalid.value,\n disabled: isDisabled.value,\n })\n})\n\nconst panelClasses = computed(() => {\n return grTreeSelectPanelClass\n})\n\nconst ADDON_MIN_WIDTH_BY_SIZE: Record<GrInputSize, string> = {\n xs: '2rem',\n sm: '2.25rem',\n md: '2.5rem',\n lg: '3rem',\n}\n\nconst slots = useSlots()\n\nconst {\n hasPrefix,\n hasSuffix,\n prefixEl,\n suffixEl,\n prefixStyle,\n suffixStyle,\n fieldPadding: triggerStyle,\n} = useControlAddons(() => props, {\n defaultMinWidth: () => ADDON_MIN_WIDTH_BY_SIZE[resolvedSize.value],\n paddingX: () => paddingX[resolvedSize.value],\n // Место под крестик и шеврон уже отдано классом `pr-9`, но инлайн-паддинг\n // перекрывает класс целиком — с суффиксом эту зону приходится вернуть числом.\n trailingReserve: () => (slots.suffix ? trailingZoneWidth : '0px'),\n})\n\n// Слот `value` рисуется поверх поля и обязан жить в тех же границах, что и\n// текст под ним. Без аддонов границы задаёт класс — стиль остаётся пустым.\nconst valueOverlayStyle = computed(() => ({\n left: hasPrefix.value ? triggerStyle.value.paddingLeft : undefined,\n right: hasSuffix.value ? triggerStyle.value.paddingRight : undefined,\n}))\n\nfunction setOpen(next: boolean) {\n if (isDisabled.value || isReadonly.value)\n return\n\n setOpenState(next)\n}\n\nfunction onClickOutside(): void {\n setOpen(false)\n}\n\nfunction openDropdown(): void {\n setOpen(true)\n}\n\n/**\n * Стек слоёв возвращает фокус на триггер сразу после закрытия, а у триггера\n * открытие висит на `focus`. Без флага `Escape` из дерева закрывал бы панель и\n * тем же движением открывал её заново.\n */\nlet suppressFocusOpen = false\n\nfunction closeDropdown(): void {\n suppressFocusOpen = true\n setOpen(false)\n setTimeout(() => {\n suppressFocusOpen = false\n }, 0)\n}\n\nfunction toggleDropdown(): void {\n setOpen(!open.value)\n}\n\n// Клик по триггеру сам переключает панель через `@click`; флаг гасит открытие\n// по приходящему следом `focus`, иначе один клик открыл бы и тут же закрыл.\nfunction onTriggerPointerDown(): void {\n hadPointerDownOnTrigger = true\n setTimeout(() => {\n hadPointerDownOnTrigger = false\n }, 0)\n}\n\nfunction onTriggerFocus(): void {\n if (hadPointerDownOnTrigger || suppressFocusOpen)\n return\n openDropdown()\n}\n\n// Возврат фокуса на триггер — из контракта слоя, а не руками через `nextTick`.\nuseOverlayLayer(open, closeDropdown, { root: panelEl })\n\nwatch(\n open,\n async (isOpen) => {\n if (!isOpen) {\n if (filterValue.value.trim().length > 0)\n filterValue.value = ''\n return\n }\n\n // Подсветка дерева идёт за значением: панель могли открыть после того, как\n // значение сменили снаружи.\n if (!props.multiple) {\n const v = props.modelValue\n if (v != null && !Array.isArray(v))\n treeRef.value?.setCurrentKey(v)\n }\n\n if (props.filterable) {\n await nextTick()\n filterInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nwatch(\n () => props.modelValue,\n (v) => {\n if (props.multiple)\n return\n if (v == null || Array.isArray(v)) {\n treeRef.value?.setCurrentKey(undefined)\n return\n }\n treeRef.value?.setCurrentKey(v)\n },\n)\n\nwatch(\n filterValue,\n (v) => {\n treeRef.value?.filter(v)\n },\n)\n\nfunction emitModel(next: GrTreeSelectModelValue) {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction clear(): void {\n if (isDisabled.value || isReadonly.value)\n return\n\n const next: GrTreeSelectModelValue = props.multiple ? [] : null\n emitModel(next)\n emit('clear')\n if (!props.multiple)\n treeRef.value?.setCurrentKey(undefined)\n}\n\n/**\n * Отдаёт клавиатуру дереву. Панель под `v-show`, поэтому дерево уже в DOM, но\n * скрытый элемент сфокусировать нельзя — сначала открытие, потом кадр, потом\n * фокус. Дальше работают клавиши `GrTree`, а `Escape` возвращает фокус на\n * триггер силами общего стека слоёв.\n */\nasync function focusTree(): Promise<boolean> {\n if (!open.value)\n return false\n\n await nextTick()\n return treeRef.value?.focus() ?? false\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent): void {\n if (isDisabled.value)\n return\n\n if (e.key === 'Escape') {\n e.preventDefault()\n closeDropdown()\n return\n }\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openDropdown()\n\n // При `filterable` фокус уходит в поле поиска (см. watch на `open`), и\n // дальше в дерево ведёт стрелка уже оттуда.\n if (!props.filterable)\n void focusTree()\n }\n}\n\n/** Стрелка из поля поиска — единственный путь из фильтра в дерево. */\nfunction onFilterKeydown(e: KeyboardEvent): void {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp')\n return\n\n e.preventDefault()\n void focusTree()\n}\n\n/** `Tab` уводит из панели — оставлять её открытой за спиной незачем. */\nfunction onPanelKeydown(e: KeyboardEvent): void {\n if (e.key === 'Tab')\n closeDropdown()\n}\n\n// Чекбоксы осмысленны только в множественном выборе: одиночный уже подсвечен\n// текущим узлом.\nconst checkboxMode = computed(() => props.multiple && props.showCheckbox)\n\n// В режиме чекбоксов каскад по родителям и детям считает `GrTree`, а не копия\n// его логики здесь: значение приходит обратно одним `update:checkedKeys`.\nfunction onCheckedKeys(keys: GrTreeKey[]): void {\n if (isDisabled.value || isReadonly.value)\n return\n\n emitModel([...keys])\n}\n\nfunction onNodeClick(data: T, node: GrTreeNode<T>): void {\n emit('nodeClick', data, node)\n\n if (isDisabled.value)\n return\n\n if (checkboxMode.value) {\n // Клик по строке — тот же переключатель отметки, что и сам чекбокс;\n // значение придёт через `update:checkedKeys`, поэтому здесь не эмитим.\n treeRef.value?.setChecked(node.key, !selectedKeySet.value.has(node.key))\n return\n }\n\n if (props.multiple) {\n const next = new Set(selectedKeySet.value)\n if (next.has(node.key))\n next.delete(node.key)\n else\n next.add(node.key)\n emitModel([...next])\n\n if (closeOnSelectResolved.value) {\n closeDropdown()\n }\n return\n }\n\n emitModel(node.key)\n if (closeOnSelectResolved.value) {\n closeDropdown()\n }\n}\n\n// Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n// рендер не совпадает с серверным и ломается гидрация (см. композабл).\nconst { target: portalTarget, enabled: teleportEnabled } = usePortalTarget()\n\n// Тема поддерева на телепортированную панель: в DOM она уезжает в `body`, то\n// есть вне обёртки провайдера, и `data-theme` с неё не наследуется. В дереве\n// компонентов панель остаётся внутри — `inject` доходит, и тему она ставит себе\n// сама.\nconst themeAttrs = useGrThemeAttrs()\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: onClickOutside, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-tree-select\n class=\"relative\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <!-- Нативная форма: hidden на каждый выбранный ключ. -->\n <template v-if=\"name\">\n <input\n v-for=\"key in selectedKeys\"\n :key=\"`hidden-${String(key)}`\"\n type=\"hidden\"\n :name=\"name\"\n :value=\"String(key)\"\n >\n </template>\n <div class=\"relative\">\n <div\n v-if=\"hasPrefix\"\n ref=\"prefixEl\"\n data-gr-tree-select-prefix\n class=\"absolute inset-y-px left-px flex items-center justify-center rounded-l-[var(--gr-radius-control)] border-r border-[var(--gr-brd)] px-2 text-[var(--gr-muted-fg)] pointer-events-none select-none truncate\"\n :style=\"prefixStyle\"\n aria-hidden=\"true\"\n >\n <slot name=\"prefix\" />\n </div>\n\n <input\n :id=\"fieldId\"\n ref=\"triggerEl\"\n data-testid=\"gr-tree-select-trigger\"\n data-gr-tree-select-trigger\n type=\"text\"\n :value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n readonly\n role=\"combobox\"\n aria-readonly=\"true\"\n aria-haspopup=\"tree\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :aria-controls=\"open && hasTree ? treeId : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"ariaLabel\"\n class=\"w-full rounded-[var(--gr-radius-control)] border placeholder:text-[var(--gr-muted-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n :class=\"[className, $slots.value ? 'text-transparent placeholder:text-transparent' : '']\"\n :style=\"triggerStyle\"\n @pointerdown=\"onTriggerPointerDown\"\n @click=\"toggleDropdown\"\n @focus=\"onTriggerFocus\"\n @keydown=\"onTriggerKeydown\"\n >\n\n <button\n v-if=\"clearable && hasSelection && !disabled && !isReadonly\"\n data-testid=\"gr-tree-select-clear\"\n data-gr-tree-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-[var(--gr-radius-control)] text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] hover:bg-[color-mix(in_srgb,var(--gr-muted)_25%,transparent)]\"\n :aria-label=\"t('gr.common.clear', 'Clear')\"\n @click.stop=\"clear\"\n >\n <IconX class=\"inline-block h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <span\n v-else\n data-testid=\"gr-tree-select-chevron\"\n data-gr-tree-select-chevron\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--gr-muted-fg)] pointer-events-none\"\n >\n <IconChevronDown\n class=\"inline-block h-4 w-4 transition-transform duration-[var(--gr-duration-fast)]\"\n :class=\"open ? 'rotate-180' : ''\"\n aria-hidden=\"true\"\n />\n </span>\n\n <div\n v-if=\"hasSuffix\"\n ref=\"suffixEl\"\n data-gr-tree-select-suffix\n class=\"absolute inset-y-px right-9 flex items-center justify-center border-l border-[var(--gr-brd)] px-2 text-[var(--gr-muted-fg)] pointer-events-none select-none truncate\"\n :class=\"suffixFixed ? '[direction:rtl]' : ''\"\n :style=\"suffixStyle\"\n aria-hidden=\"true\"\n >\n <slot name=\"suffix\" />\n </div>\n\n <div\n v-if=\"$slots.value\"\n class=\"absolute inset-y-0 left-3 right-9 flex items-center pointer-events-none\"\n :style=\"valueOverlayStyle\"\n >\n <slot\n name=\"value\"\n :value=\"modelValue\"\n :labels=\"selectedLabels\"\n :display-value=\"displayValue\"\n :path-labels=\"selectedPathLabels\"\n />\n </div>\n </div>\n\n <teleport :to=\"portalTarget\" :disabled=\"!teleportEnabled\">\n <transition\n enter-active-class=\"transition ease-[var(--gr-ease-out)] duration-[var(--gr-duration-fast)]\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-[var(--gr-ease-in)] duration-[var(--gr-duration-fast)]\"\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=\"gr-tree-select-panel\"\n v-bind=\"themeAttrs\"\n data-gr-tree-select-panel\n data-gr-overlay-root\n :style=\"floatingStyle\"\n @keydown=\"onPanelKeydown\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"filterable\" class=\"p-2 border-b border-[var(--gr-brd)]\">\n <GrInput\n ref=\"filterInputRef\"\n v-model=\"filterValue\"\n data-testid=\"gr-tree-select-filter\"\n data-gr-tree-select-filter\n type=\"search\"\n :inputmode=\"filterInputmode\"\n :placeholder=\"resolvedFilterPlaceholder\"\n size=\"sm\"\n @keydown=\"onFilterKeydown\"\n />\n </div>\n\n <!--\n Скроллер один. При виртуализации его берёт на себя дерево: своя\n высота нужна ему, чтобы посчитать окно, а вложенный скроллер поверх\n дал бы вторую полосу прокрутки на том же списке.\n -->\n <div\n class=\"p-1\"\n :class=\"virtual ? '' : 'overflow-auto'\"\n :style=\"virtual ? undefined : { maxHeight: `${dropdownMaxHeight}px` }\"\n >\n <div\n v-if=\"loading\"\n data-gr-tree-select-loading\n role=\"status\"\n :class=\"grTreeSelectStateClass\"\n >\n <slot name=\"loading\">\n <IconLoaderCircle class=\"block h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <span>{{ t('gr.treeSelect.loading', 'Loading…') }}</span>\n </slot>\n </div>\n\n <div v-else-if=\"(data?.length ?? 0) === 0\" :class=\"grTreeSelectStateClass\">\n <slot name=\"empty\">\n {{ t('gr.treeSelect.empty', 'No data') }}\n </slot>\n </div>\n\n <GrTree\n v-else\n :id=\"treeId\"\n ref=\"treeRef\"\n :size=\"resolvedSize\"\n :data=\"data\"\n :props=\"props.props\"\n :node-key=\"nodeKey as any\"\n :default-expanded-keys=\"defaultExpandedKeys\"\n :filter-node-method=\"filterNodeMethod\"\n :highlight-current=\"!multiple\"\n :virtual=\"virtual\"\n :max-height=\"dropdownMaxHeight\"\n :show-checkbox=\"checkboxMode\"\n :check-strictly=\"checkStrictly\"\n :checked-keys=\"selectedKeys\"\n @node-click=\"onNodeClick\"\n @update:checked-keys=\"onCheckedKeys\"\n >\n <template #default=\"{ node, data }\">\n <slot\n name=\"node\"\n :node=\"node\"\n :data=\"data\"\n :selected=\"selectedKeySet.has(node.key)\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <!-- Чекбокс дерева уже показывает отметку: вторая галочка\n рядом читалась бы как ошибка. -->\n <span\n v-if=\"!checkboxMode\"\n data-gr-tree-select-check\n class=\"inline-block h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n >\n <IconCheck v-if=\"selectedKeySet.has(node.key)\" class=\"block h-4 w-4 text-[var(--gr-primary)]\" />\n </span>\n <span class=\"truncate\">{{ node.label }}</span>\n </div>\n </slot>\n </template>\n </GrTree>\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 { n as grTreeSelectSafelist, t as grTreeSelectConfig } from "../../chunks/config-DCFvmHEv2.js";
2
- import { t as GrTreeSelect_default } from "./chunks/GrTreeSelect-DZp7CqqW.js";
1
+ import { n as grTreeSelectSafelist, t as grTreeSelectConfig } from "../../chunks/config-DCFvmHEv.js";
2
+ import { t as GrTreeSelect_default } from "./chunks/GrTreeSelect--muUeB0v.js";
3
3
  export { GrTreeSelect_default as GrTreeSelect, GrTreeSelect_default as default, grTreeSelectConfig, grTreeSelectSafelist };
@@ -1,4 +1,4 @@
1
- import { t as ensurePortalRoot } from "../chunks/portalRoot-CWD4zHBm.js";
1
+ import { t as ensurePortalRoot } from "../chunks/portalRoot-CVhCgdG6.js";
2
2
  //#region src/composables/useAnnouncer.ts
3
3
  var HOST_ID = "gr-announcer";
4
4
  var DEFAULT_CLEAR_AFTER_MS = 7e3;
@@ -1,2 +1,2 @@
1
- import { t as usePortalTarget } from "../chunks/usePortalTarget-RyzEgNTb.js";
1
+ import { t as usePortalTarget } from "../chunks/usePortalTarget-Cn-Wiz5d.js";
2
2
  export { usePortalTarget };
@@ -1,4 +1,4 @@
1
- import { t as ensurePortalRoot } from "../chunks/portalRoot-CWD4zHBm.js";
1
+ import { t as ensurePortalRoot } from "../chunks/portalRoot-CVhCgdG6.js";
2
2
  import { n as markInert, t as inertableOutside } from "../chunks/inert-DIHCCn_1.js";
3
3
  import { t as GrLoading_default } from "../components/GrLoading/chunks/GrLoading-CH95CFzS.js";
4
4
  import { createVNode, render } from "vue";
@@ -1,2 +1,2 @@
1
- import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-B9nXQCMu.js";
1
+ import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-C6uAujdJ.js";
2
2
  export { GRANULARITY_PROVIDER_ID, createGranularityProvider, granularityProvider as default, granularityProvider, granularityComponentConfigs, granularityDefaultThemes, granularityThemeNames };
@@ -1,2 +1,2 @@
1
- import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-B9nXQCMu.js";
1
+ import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-C6uAujdJ.js";
2
2
  export { GRANULARITY_PROVIDER_ID, createGranularityProvider, granularityProvider as default, granularityProvider, granularityComponentConfigs, granularityDefaultThemes, granularityThemeNames };
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { n as useGranularityTranslations } from "./chunks/granularityI18n-BC5zsj
3
3
  import { n as GR_ALERT_VARIANTS, t as GrAlert_default } from "./components/GrAlert/chunks/GrAlert-BC1lplbY.js";
4
4
  import { t as grAlertConfig } from "./chunks/config-BNu8lFQB.js";
5
5
  import "./components/GrAlert/index.js";
6
- import { t as usePortalTarget } from "./chunks/usePortalTarget-RyzEgNTb.js";
6
+ import { t as usePortalTarget } from "./chunks/usePortalTarget-Cn-Wiz5d.js";
7
7
  import { vAutofocus } from "./directives/autofocus.js";
8
8
  import { vAutosize } from "./directives/autosize.js";
9
9
  import { vClickOutside } from "./directives/clickOutside.js";
@@ -22,7 +22,7 @@ import { useGrFormControl } from "./composables/useGrFormControl.js";
22
22
  import { useComboboxNavigation } from "./composables/useComboboxNavigation.js";
23
23
  import { t as GrBadge_default } from "./components/GrBadge/chunks/GrBadge-B1tgqfGQ.js";
24
24
  import { n as grAutocompleteSafelist, t as grAutocompleteConfig } from "./chunks/config-BbY2SKGE.js";
25
- import { t as GrAutocomplete_default } from "./components/GrAutocomplete/chunks/GrAutocomplete-CPEQxmLZ.js";
25
+ import { t as GrAutocomplete_default } from "./components/GrAutocomplete/chunks/GrAutocomplete-gY4Xopza.js";
26
26
  import { n as GR_SKELETON_VARIANTS, t as GrSkeleton_default } from "./components/GrSkeleton/chunks/GrSkeleton-DEvNE3bC.js";
27
27
  import { n as GrAvatar_default, t as GrAvatarGroup_default } from "./components/GrAvatar/chunks/GrAvatar-CVUujLmn.js";
28
28
  import { l as initialsFrom, n as grAvatarSafelist, r as GR_AVATAR_STATUSES, t as grAvatarConfig } from "./chunks/config-DP7eseR1.js";
@@ -34,7 +34,7 @@ import { i as GR_BOTTOM_NAV_POSITIONS, n as grBottomNavSafelist, r as GR_BOTTOM_
34
34
  import { t as GrBottomNav_default } from "./components/GrBottomNav/chunks/GrBottomNav-9GH7Dd9E.js";
35
35
  import { t as GrLink_default } from "./components/GrLink/chunks/GrLink-D-cgUMXW.js";
36
36
  import { m as resolveBreadcrumbsLayout, n as grBreadcrumbsSafelist, p as resolveBreadcrumbsFit, t as grBreadcrumbsConfig } from "./chunks/config-DKdlqXiY.js";
37
- import { t as GrBreadcrumbs_default } from "./components/GrBreadcrumbs/chunks/GrBreadcrumbs-BCNGDS6k.js";
37
+ import { t as GrBreadcrumbs_default } from "./components/GrBreadcrumbs/chunks/GrBreadcrumbs-DS_-PBVt.js";
38
38
  import { n as useGrButtonGroup } from "./chunks/context-BfIQv7m1.js";
39
39
  import { a as grButtonClass } from "./chunks/grButtonStyles-B_-YRE__.js";
40
40
  import { t as GrButton_default } from "./components/GrButton/chunks/GrButton-D0m_z0XW.js";
@@ -51,52 +51,52 @@ import "./components/GrCheckbox/index.js";
51
51
  import { t as GrCheckboxGroup_default } from "./components/GrCheckboxGroup/chunks/GrCheckboxGroup-CXTx2Z5H.js";
52
52
  import { t as grCheckboxGroupConfig } from "./chunks/config-BuGlNPE9.js";
53
53
  import { n as grCollapseSafelist, t as grCollapseConfig } from "./chunks/config-DU2DNSRx2.js";
54
- import { a as GR_COLLAPSE_ICON_POSITIONS, i as GR_COLLAPSE_HEADING_LEVELS, n as GrCollapse_default, r as GR_COLLAPSE_CONTEXT, t as GrCollapseItem_default } from "./components/GrCollapse/chunks/GrCollapse-B2Fc6A9r.js";
54
+ import { a as GR_COLLAPSE_ICON_POSITIONS, i as GR_COLLAPSE_HEADING_LEVELS, n as GrCollapse_default, r as GR_COLLAPSE_CONTEXT, t as GrCollapseItem_default } from "./components/GrCollapse/chunks/GrCollapse-Kk0DE8tb.js";
55
55
  import { n as grIconSafelist, t as grIconConfig } from "./chunks/config-Cp0DE0GH.js";
56
56
  import { t as GrInput_default } from "./components/GrInput/chunks/GrInput-2wd7Crs0.js";
57
57
  import { useFocusTrap } from "./composables/useFocusTrap.js";
58
- import { t as GrPopover_default } from "./components/GrPopover/chunks/GrPopover-DuqeoFaI.js";
58
+ import { t as GrPopover_default } from "./components/GrPopover/chunks/GrPopover-DMH4Jjst.js";
59
59
  import { useDragGesture } from "./composables/useDragGesture.js";
60
60
  import { t as GrSlider_default } from "./components/GrSlider/chunks/GrSlider-CyhVsNKn.js";
61
- import { n as formatHexColor, r as parseHexColor, t as GrColorPicker_default } from "./components/GrColorPicker/chunks/GrColorPicker-DAdQ-Gc3.js";
61
+ import { n as formatHexColor, r as parseHexColor, t as GrColorPicker_default } from "./components/GrColorPicker/chunks/GrColorPicker-CkBTzkqn.js";
62
62
  import { n as grColorPickerSafelist, t as grColorPickerConfig } from "./chunks/config-BsPDQ0dS.js";
63
63
  import { a as GR_KBD_TOKENS, o as findKbdToken, t as GrKbd_default } from "./components/GrKbd/chunks/GrKbd-DU2lBkRV.js";
64
- import { t as GrModal_default } from "./components/GrModal/chunks/GrModal-BbhcsDQ8.js";
65
- import { i as matchCommandItem, n as filterCommandItems, r as groupCommandItems, t as GrCommandPalette_default } from "./components/GrCommandPalette/chunks/GrCommandPalette-DMeSqkEv.js";
66
- import { n as grCommandPaletteSafelist, t as grCommandPaletteConfig } from "./chunks/config-K0C2tcLB.js";
64
+ import { t as GrModal_default } from "./components/GrModal/chunks/GrModal-CbMMr6W1.js";
65
+ import { i as matchCommandItem, n as filterCommandItems, r as groupCommandItems, t as GrCommandPalette_default } from "./components/GrCommandPalette/chunks/GrCommandPalette-BugTlGdj.js";
66
+ import { n as grCommandPaletteSafelist, t as grCommandPaletteConfig } from "./chunks/config-9PYRZlKE.js";
67
67
  import { t as GrConfigProvider_default } from "./components/GrConfigProvider/chunks/GrConfigProvider-BA6JO7V6.js";
68
68
  import { t as grConfigProviderConfig } from "./chunks/config-B7W9VlZ7.js";
69
69
  import { a as resolveGrDialogTitle, i as resolveGrDialogSectionConfig, n as DEFAULT_GR_DIALOG_FOOTER_CONFIG, r as DEFAULT_GR_DIALOG_HEADER_CONFIG, t as DEFAULT_GR_DIALOG_BODY_CONFIG } from "./chunks/dialogShared-CxW62PQE.js";
70
- import { i as GrDialogFooter_default, n as GrDialogHeader_default, r as GrDialogCloseButton_default, t as GrDialog_default } from "./components/GrDialog/chunks/GrDialog-MD9Fzy9C.js";
70
+ import { i as GrDialogFooter_default, n as GrDialogHeader_default, r as GrDialogCloseButton_default, t as GrDialog_default } from "./components/GrDialog/chunks/GrDialog-C3tYaA8v.js";
71
71
  import { _ as DEFAULT_AUTO_HIDE_KINDS, a as extendDefaultParsers, c as problemDetailsParser, d as networkErrorParser, f as laravelValidationParser, g as abortErrorParser, h as fileValidationParser, i as defaultResponseErrorParsers, l as plainMessageParser, m as httpStatusParser, n as coreResponseErrorParsers, o as resolveResponseErrorTitle, p as jsonApiErrorParser, r as createResponseErrorClassifier, s as responseErrorParserPresets, t as GrResponseErrorBanner_default, u as normalizeError, v as DEFAULT_RESPONSE_ERROR_TEXTS, y as DEFAULT_TONE_BY_KIND } from "./components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-C7W9mgYN.js";
72
- import { t as GrConfirmDialog_default } from "./components/GrConfirmDialog/chunks/GrConfirmDialog-hUTi-GdJ.js";
72
+ import { t as GrConfirmDialog_default } from "./components/GrConfirmDialog/chunks/GrConfirmDialog-Ds5T0GiR.js";
73
73
  import { t as grConfirmDialogConfig } from "./chunks/config-A-bBiotF.js";
74
74
  import "./components/GrConfirmDialog/index.js";
75
75
  import { t as GrTable_default } from "./components/GrTable/chunks/GrTable-BfqgwETQ.js";
76
76
  import { useAnnouncer } from "./composables/useAnnouncer.js";
77
77
  import { t as useDragSort } from "./chunks/useDragSort-0l47h4yb.js";
78
78
  import { useRovingFocus } from "./composables/useRovingFocus.js";
79
- import { i as sortRows, n as compareCells, r as isEmptyCell, t as GrDataTable_default } from "./components/GrDataTable/chunks/GrDataTable-DzaGLG3A.js";
80
- import { n as grDataTableSafelist, t as grDataTableConfig } from "./chunks/config-DEvsMTQE.js";
79
+ import { i as sortRows, n as compareCells, r as isEmptyCell, t as GrDataTable_default } from "./components/GrDataTable/chunks/GrDataTable-CYe2A2WA.js";
80
+ import { n as grDataTableSafelist, t as grDataTableConfig } from "./chunks/config-BJ7Bv_G2.js";
81
81
  import { t as grDialogSafelist } from "./chunks/safelist-CkF4v7DC.js";
82
82
  import "./components/GrDialog/index.js";
83
83
  import { n as useGrFormContext, t as GR_FORM_KEY } from "./chunks/context-Bfrgsluh.js";
84
84
  import { t as GrFormField_default } from "./components/GrFormField/chunks/GrFormField-CL5rcgj6.js";
85
85
  import { t as GrTextarea_default } from "./components/GrTextarea/chunks/GrTextarea-DSvd1nSy.js";
86
86
  import { n as getByPath, o as runFieldRules, r as isEmpty, t as createGrFormMessageResolver } from "./chunks/validation-5HhpanPP.js";
87
- import { t as GrPromptDialog_default } from "./components/GrPromptDialog/chunks/GrPromptDialog-JVVqBsPY.js";
87
+ import { t as GrPromptDialog_default } from "./components/GrPromptDialog/chunks/GrPromptDialog-Pwr9NPxK.js";
88
88
  import { n as GrFormErrorBanner_default, r as GrUploadErrorBanner_default, t as useResponseError } from "./components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-DhX4jjay.js";
89
- import { a as teardownDialogService, i as granularityDialogServicePlugin, n as GRANULARITY_DIALOG_SERVICE_STATE, o as useDialogService, r as dialogService, t as GrDialogServiceHost_default } from "./components/GrDialogService/chunks/GrDialogService-DtgUijMj.js";
89
+ import { a as teardownDialogService, i as granularityDialogServicePlugin, n as GRANULARITY_DIALOG_SERVICE_STATE, o as useDialogService, r as dialogService, t as GrDialogServiceHost_default } from "./components/GrDialogService/chunks/GrDialogService-CTBiiJDI.js";
90
90
  import { t as grDialogServiceConfig } from "./chunks/config-CjXjhphs.js";
91
- import { n as grDividerSafelist, t as grDividerConfig } from "./chunks/config-CY0_6cMi.js";
92
- import { t as GrDivider_default } from "./components/GrDivider/chunks/GrDivider-B2Xwc_QO.js";
93
- import { n as grDrawerSafelist, t as grDrawerConfig } from "./chunks/config-D94Z9po5.js";
94
- import { t as GrDrawer_default } from "./components/GrDrawer/chunks/GrDrawer-DWHdZZzW.js";
95
- import { t as GrDropdown_default } from "./components/GrDropdown/chunks/GrDropdown-0tJK01Kq.js";
91
+ import { n as grDividerSafelist, t as grDividerConfig } from "./chunks/config-CY0_6cMi2.js";
92
+ import { t as GrDivider_default } from "./components/GrDivider/chunks/GrDivider-xxq1_fIl.js";
93
+ import { n as grDrawerSafelist, t as grDrawerConfig } from "./chunks/config-D94Z9po52.js";
94
+ import { t as GrDrawer_default } from "./components/GrDrawer/chunks/GrDrawer-BSSuiNHU.js";
95
+ import { t as GrDropdown_default } from "./components/GrDropdown/chunks/GrDropdown-Bh6UK2M5.js";
96
96
  import { n as grDropdownSafelist, t as grDropdownConfig } from "./chunks/config-BViooYNv.js";
97
97
  import "./components/GrDropdown/index.js";
98
- import { n as grDropdownMenuSafelist, t as grDropdownMenuConfig } from "./chunks/config-BKvX0q10.js";
99
- import { a as isMenuSection, c as GrDropdownMenuItem_default, d as GrDropdownMenuDivider_default, i as isMenuAction, l as GrDropdownMenuGroup_default, n as GrDropdownMenuColumn_default, o as isMenuSeparator, r as GrDropdownMenu_default, s as GrDropdownMenuList_default, t as GrDropdownMenuColumns_default, u as GrDropdownMenuHeader_default } from "./components/GrDropdownMenu/chunks/GrDropdownMenu-VPPrpCoA.js";
98
+ import { n as grDropdownMenuSafelist, t as grDropdownMenuConfig } from "./chunks/config-BKvX0q102.js";
99
+ import { a as isMenuSection, c as GrDropdownMenuItem_default, d as GrDropdownMenuDivider_default, i as isMenuAction, l as GrDropdownMenuGroup_default, n as GrDropdownMenuColumn_default, o as isMenuSeparator, r as GrDropdownMenu_default, s as GrDropdownMenuList_default, t as GrDropdownMenuColumns_default, u as GrDropdownMenuHeader_default } from "./components/GrDropdownMenu/chunks/GrDropdownMenu-LyfEFUbg.js";
100
100
  import { t as GrEmptyState_default } from "./components/GrEmptyState/chunks/GrEmptyState-W7Irx3vc.js";
101
101
  import { i as GR_EMPTY_STATE_VARIANTS, n as grEmptyStateSafelist, r as GR_EMPTY_STATE_HEADING_LEVELS, t as grEmptyStateConfig } from "./chunks/config-DvQIb4kb.js";
102
102
  import { t as GrProgressBar_default } from "./components/GrProgressBar/chunks/GrProgressBar-xwbNM9QB.js";
@@ -110,7 +110,7 @@ import { t as GrFormFile_default } from "./components/GrFormFile/chunks/GrFormFi
110
110
  import { n as grFormFileSafelist, t as grFormFileConfig } from "./chunks/config-COvrUfhR.js";
111
111
  import { n as grFormSectionSafelist, r as GR_FORM_SECTION_HEADING_LEVELS, t as grFormSectionConfig } from "./chunks/config-DhHbU3zO.js";
112
112
  import { t as GrFormSection_default } from "./components/GrFormSection/chunks/GrFormSection-BEh5n4jF.js";
113
- import { t as GrImageViewer_default } from "./components/GrImageViewer/chunks/GrImageViewer-DE7MBbF8.js";
113
+ import { t as GrImageViewer_default } from "./components/GrImageViewer/chunks/GrImageViewer-DfD4euH5.js";
114
114
  import { n as grImageViewerSafelist, t as grImageViewerConfig } from "./chunks/config-BeZRuonp.js";
115
115
  import { n as grInputSafelist, t as grInputConfig } from "./chunks/config-DpeQchsV.js";
116
116
  import "./components/GrInput/index.js";
@@ -129,10 +129,10 @@ import "./components/GrModal/index.js";
129
129
  import { t as GrNavbar_default } from "./components/GrNavbar/chunks/GrNavbar-CF0KbM_6.js";
130
130
  import { n as grNavbarSafelist, t as grNavbarConfig } from "./chunks/config-Bpt9Xbxm.js";
131
131
  import { n as grNumberInputSafelist, t as grNumberInputConfig } from "./chunks/config-zjeAJ4ho.js";
132
- import { t as GrNumberInput_default } from "./components/GrNumberInput/chunks/GrNumberInput-CZOyPz4J.js";
133
- import { t as GrSelect_default } from "./components/GrSelect/chunks/GrSelect-DAdu044K.js";
132
+ import { t as GrNumberInput_default } from "./components/GrNumberInput/chunks/GrNumberInput-B5CHZDBj.js";
133
+ import { t as GrSelect_default } from "./components/GrSelect/chunks/GrSelect-B-Voni7D.js";
134
134
  import { n as grPaginationSafelist, t as grPaginationConfig } from "./chunks/config-DSJY6aEl.js";
135
- import { t as GrPagination_default } from "./components/GrPagination/chunks/GrPagination-waKhxBP7.js";
135
+ import { t as GrPagination_default } from "./components/GrPagination/chunks/GrPagination-BM4FrD6Q.js";
136
136
  import { n as grPopoverSafelist, t as grPopoverConfig } from "./chunks/config-BSyiFlbi.js";
137
137
  import "./components/GrPopover/index.js";
138
138
  import { n as grProgressBarSafelist, r as GR_TONES, t as grProgressBarConfig } from "./chunks/config-CQzGyi1C.js";
@@ -146,23 +146,23 @@ import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "./components/
146
146
  import { t as GrRadioGroup_default } from "./components/GrRadioGroup/chunks/GrRadioGroup-DIuBw0wk.js";
147
147
  import { t as grRadioGroupConfig } from "./chunks/config-QaIc_gRa.js";
148
148
  import { n as grRatingSafelist, t as grRatingConfig } from "./chunks/config-Baj7Wvx-.js";
149
- import { t as GrRating_default } from "./components/GrRating/chunks/GrRating-LarIiwJL.js";
149
+ import { t as GrRating_default } from "./components/GrRating/chunks/GrRating-DVFH3lYu.js";
150
150
  import { n as grSegmentedSafelist, r as GR_SEGMENTED_ORIENTATIONS, t as grSegmentedConfig } from "./chunks/config-B-iNaGdw.js";
151
151
  import { t as GrSegmented_default } from "./components/GrSegmented/chunks/GrSegmented-CQw3ijqa.js";
152
152
  import { n as grSelectSafelist, t as grSelectConfig } from "./chunks/config-Cwd3yjRw.js";
153
153
  import "./components/GrSelect/index.js";
154
- import { i as GR_SIDEBAR_POSITIONS, n as grSidebarSafelist, r as GR_SIDEBAR_LANDMARKS, t as grSidebarConfig } from "./chunks/config-Rw9OyW70.js";
155
- import { n as GrSidebarItem_default, r as GrSidebar_default, t as GrSidebarGroup_default } from "./components/GrSidebar/chunks/GrSidebar-DRGnnViw.js";
156
- import { t as grSkeletonConfig } from "./chunks/config-8Pcutu1j.js";
154
+ import { i as GR_SIDEBAR_POSITIONS, n as grSidebarSafelist, r as GR_SIDEBAR_LANDMARKS, t as grSidebarConfig } from "./chunks/config-Rw9OyW702.js";
155
+ import { n as GrSidebarItem_default, r as GrSidebar_default, t as GrSidebarGroup_default } from "./components/GrSidebar/chunks/GrSidebar-i7AxjhY_.js";
156
+ import { t as grSkeletonConfig } from "./chunks/config-8Pcutu1j2.js";
157
157
  import "./components/GrSkeleton/index.js";
158
158
  import { n as grSliderSafelist, t as grSliderConfig } from "./chunks/config-T3qdQBgU2.js";
159
159
  import "./components/GrSlider/index.js";
160
- import { n as grSortableListSafelist, t as grSortableListConfig } from "./chunks/config-D2aNP7Es.js";
161
- import { t as GrSortableList_default } from "./components/GrSortableList/chunks/GrSortableList-BefVfWKh.js";
160
+ import { n as grSortableListSafelist, t as grSortableListConfig } from "./chunks/config-DAX8Deh1.js";
161
+ import { t as GrSortableList_default } from "./components/GrSortableList/chunks/GrSortableList-XB7mXM1W.js";
162
162
  import { n as grSplitterSafelist, t as grSplitterConfig } from "./chunks/config-BE6n20np2.js";
163
163
  import { a as sizeFromPointer, i as shouldCollapse, n as GR_SPLITTER_ORIENTATIONS, r as clampSize, t as GrSplitter_default } from "./components/GrSplitter/chunks/GrSplitter-BzxVQwbY.js";
164
- import { n as formatStatisticValue, t as GrStatistic_default } from "./components/GrStatistic/chunks/GrStatistic-J4qLs3TH.js";
165
- import { n as grStatisticSafelist, t as grStatisticConfig } from "./chunks/config-gvq_hWNM.js";
164
+ import { n as formatStatisticValue, t as GrStatistic_default } from "./components/GrStatistic/chunks/GrStatistic-DOsM6s5V.js";
165
+ import { n as grStatisticSafelist, t as grStatisticConfig } from "./chunks/config-Be9k9bOf.js";
166
166
  import { n as grSwitchSafelist, t as grSwitchConfig } from "./chunks/config-BoNR7_PD2.js";
167
167
  import { t as GrSwitch_default } from "./components/GrSwitch/chunks/GrSwitch-DpyvVrZG.js";
168
168
  import { n as grTableSafelist, t as grTableConfig } from "./chunks/config-WTNhdh6T2.js";
@@ -170,20 +170,20 @@ import "./components/GrTable/index.js";
170
170
  import { n as GrTabPanels_default, r as GR_TAB_PANELS_KEY, t as GrTabPanel_default } from "./components/GrTabPanels/chunks/GrTabPanels-BVe1CZdJ.js";
171
171
  import { t as grTabPanelsConfig } from "./chunks/config-eXB87DOi.js";
172
172
  import { n as grTabsSafelist, r as GR_TABS_VARIANTS, t as grTabsConfig } from "./chunks/config-_qPUfb6-2.js";
173
- import { t as GrTabs_default } from "./components/GrTabs/chunks/GrTabs-TeXaU5Uh.js";
173
+ import { t as GrTabs_default } from "./components/GrTabs/chunks/GrTabs-f3-oQenu.js";
174
174
  import { n as grTextareaSafelist, t as grTextareaConfig } from "./chunks/config-BDfTXHo12.js";
175
175
  import "./components/GrTextarea/index.js";
176
176
  import { i as GR_TIMELINE_HEADING_LEVELS, n as GrTimeline_default, r as groupTimelineItems, t as GrTimelineItem_default } from "./components/GrTimeline/chunks/GrTimeline-B-h2Yanw.js";
177
177
  import { n as grTimelineSafelist, t as grTimelineConfig } from "./chunks/config-COpuWGr_.js";
178
178
  import { GRANULARITY_TOAST_STATE, granularityToastPlugin, useToast } from "./composables/useToast.js";
179
179
  import { n as grToasterSafelist, t as grToasterConfig } from "./chunks/config-ScuvHw6k2.js";
180
- import { t as GrToaster_default } from "./components/GrToaster/chunks/GrToaster-Ct-39hga.js";
180
+ import { t as GrToaster_default } from "./components/GrToaster/chunks/GrToaster-Dqja0Lf9.js";
181
181
  import { n as grTooltipSafelist, t as grTooltipConfig } from "./chunks/config-CN2ULSQL.js";
182
- import { t as GrTooltip_default } from "./components/GrTooltip/chunks/GrTooltip-xAcqs0bP.js";
183
- import { t as GrTree_default } from "./components/GrTree/chunks/GrTree-CaYK8dGZ.js";
184
- import { n as grTreeSafelist, t as grTreeConfig } from "./chunks/config-DpqOnJiz2.js";
185
- import { n as grTreeSelectSafelist, t as grTreeSelectConfig } from "./chunks/config-DCFvmHEv2.js";
186
- import { t as GrTreeSelect_default } from "./components/GrTreeSelect/chunks/GrTreeSelect-DZp7CqqW.js";
182
+ import { t as GrTooltip_default } from "./components/GrTooltip/chunks/GrTooltip-Cn08heWz.js";
183
+ import { t as GrTree_default } from "./components/GrTree/chunks/GrTree-BR9a2pay.js";
184
+ import { n as grTreeSafelist, t as grTreeConfig } from "./chunks/config-CDat1wXf2.js";
185
+ import { n as grTreeSelectSafelist, t as grTreeSelectConfig } from "./chunks/config-DCFvmHEv.js";
186
+ import { t as GrTreeSelect_default } from "./components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js";
187
187
  import "./composables/useGrComponentConfig.js";
188
188
  import "./composables/useGranularityTranslations.js";
189
189
  import { GRANULARITY_THEME_STATE, granularityThemePlugin, initThemeEarly, useTheme } from "./composables/useTheme.js";
@@ -138,7 +138,12 @@
138
138
  /* Navigation roles */
139
139
  --gr-sidebar: #1e293b;
140
140
  --gr-sidebar-fg: #f8fafc;
141
- --gr-sidebar-primary: #6366f1;
141
+ /*
142
+ * Белый текст на #6366f1 даёт 4.47:1 — тот же недолёт AA, из-за которого
143
+ * перекрашен `--gr-primary` (заметка выше). Здесь взят минимальный шаг, снимающий
144
+ * недолёт без смены вида: 4.52:1 при ΔE 0.42 к прежнему цвету.
145
+ */
146
+ --gr-sidebar-primary: #6365f0;
142
147
  --gr-sidebar-primary-fg: #ffffff;
143
148
  --gr-sidebar-accent: #334155;
144
149
  --gr-sidebar-accent-fg: #f1f5f9;