@feugene/granularity 0.33.0 → 0.34.1

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 (128) hide show
  1. package/dist/chunks/{config-uzUuosv7.js → config-CT4lP6S4.js} +6 -5
  2. package/dist/chunks/config-CT4lP6S4.js.map +1 -0
  3. package/dist/chunks/{config-vYMJ3Cr1.js → config-CYthTVK2.js} +2 -2
  4. package/dist/chunks/config-CYthTVK2.js.map +1 -0
  5. package/dist/chunks/{config-CPSxM7XE.js → config-CsCUuukB.js} +1 -0
  6. package/dist/chunks/config-CsCUuukB.js.map +1 -0
  7. package/dist/chunks/{config-DnF472Ox.js → config-DOYz_SVK.js} +2 -2
  8. package/dist/chunks/{config-DnF472Ox.js.map → config-DOYz_SVK.js.map} +1 -1
  9. package/dist/chunks/{config-T3-DMXYm.js → config-DUNH02Fg.js} +2 -2
  10. package/dist/chunks/config-DUNH02Fg.js.map +1 -0
  11. package/dist/chunks/{config-BTwYMQaz2.js → config-DVCNvhIG2.js} +4 -3
  12. package/dist/chunks/config-DVCNvhIG2.js.map +1 -0
  13. package/dist/chunks/{generated-CSyPsWtM.js → generated-Bk-f6NsN.js} +21 -0
  14. package/dist/chunks/{generated-CSyPsWtM.js.map → generated-Bk-f6NsN.js.map} +1 -1
  15. package/dist/chunks/grDropdownStyles-DLToHWMX.js +5 -0
  16. package/dist/chunks/grDropdownStyles-DLToHWMX.js.map +1 -0
  17. package/dist/chunks/grPopoverStyles-CYAeO3Ov.js +110 -0
  18. package/dist/chunks/grPopoverStyles-CYAeO3Ov.js.map +1 -0
  19. package/dist/chunks/{grSelectStyles-Cdtd10eY.js → grSelectStyles-D9EQ-pgK.js} +2 -1
  20. package/dist/chunks/grSelectStyles-D9EQ-pgK.js.map +1 -0
  21. package/dist/chunks/{granular-provider-CrQua8PT.js → granular-provider-BAy4APOX.js} +6 -6
  22. package/dist/chunks/{granular-provider-CrQua8PT.js.map → granular-provider-BAy4APOX.js.map} +1 -1
  23. package/dist/chunks/{overlayTransition-0Fj5tQbq.js → overlayPanelSurface-BKeMhRx4.js} +24 -1
  24. package/dist/chunks/overlayPanelSurface-BKeMhRx4.js.map +1 -0
  25. package/dist/chunks/{focusables-BkzK42SQ.js → useFocusTrap-D9bIPNF6.js} +123 -1
  26. package/dist/chunks/useFocusTrap-D9bIPNF6.js.map +1 -0
  27. package/dist/chunks/{useMenuItemsFocus-B6TldmGf.js → useMenuItemsFocus-B7Bl_aFA.js} +1 -1
  28. package/dist/chunks/{useMenuItemsFocus-B6TldmGf.js.map → useMenuItemsFocus-B7Bl_aFA.js.map} +1 -1
  29. package/dist/chunks/{useModalOverlay-D__CqLGn.js → useModalOverlay-BnAGZpcI.js} +1 -1
  30. package/dist/chunks/{useModalOverlay-D__CqLGn.js.map → useModalOverlay-BnAGZpcI.js.map} +1 -1
  31. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-CoQjEF8h.js → GrAutocomplete-BQsSE7sj.js} +2 -2
  32. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-CoQjEF8h.js.map → GrAutocomplete-BQsSE7sj.js.map} +1 -1
  33. package/dist/components/GrAutocomplete/index.js +2 -2
  34. package/dist/components/GrColorPicker/chunks/{GrColorPicker-p2XH_8cE.js → GrColorPicker-CIgdPXHn.js} +2 -1
  35. package/dist/components/GrColorPicker/chunks/GrColorPicker-CIgdPXHn.js.map +1 -0
  36. package/dist/components/GrColorPicker/index.js +1 -1
  37. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BXbh3q7O.js → GrCommandPalette-BZHUKlux.js} +1 -1
  38. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BXbh3q7O.js.map → GrCommandPalette-BZHUKlux.js.map} +1 -1
  39. package/dist/components/GrCommandPalette/index.js +1 -1
  40. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-CUP43q__.js → GrConfirmDialog-jRDs_E6C.js} +1 -1
  41. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-CUP43q__.js.map → GrConfirmDialog-jRDs_E6C.js.map} +1 -1
  42. package/dist/components/GrConfirmDialog/index.js +1 -1
  43. package/dist/components/GrContextMenu/chunks/{GrContextMenu-ClkVjdcP.js → GrContextMenu-DlFWm0eW.js} +17 -3
  44. package/dist/components/GrContextMenu/chunks/GrContextMenu-DlFWm0eW.js.map +1 -0
  45. package/dist/components/GrContextMenu/index.js +2 -2
  46. package/dist/components/GrDialog/chunks/{GrDialog-BiMJ9_T4.js → GrDialog-C01Hhk6G.js} +1 -1
  47. package/dist/components/GrDialog/chunks/{GrDialog-BiMJ9_T4.js.map → GrDialog-C01Hhk6G.js.map} +1 -1
  48. package/dist/components/GrDialog/index.js +1 -1
  49. package/dist/components/GrDialogService/chunks/{GrDialogService-BxNK6crD.js → GrDialogService-CmsJNUmM.js} +7 -2
  50. package/dist/components/GrDialogService/chunks/{GrDialogService-BxNK6crD.js.map → GrDialogService-CmsJNUmM.js.map} +1 -1
  51. package/dist/components/GrDialogService/index.js +1 -1
  52. package/dist/components/GrDrawer/chunks/{GrDrawer-Ce2l3zaG.js → GrDrawer-xfoy-MCj.js} +1 -1
  53. package/dist/components/GrDrawer/chunks/{GrDrawer-Ce2l3zaG.js.map → GrDrawer-xfoy-MCj.js.map} +1 -1
  54. package/dist/components/GrDrawer/index.js +1 -1
  55. package/dist/components/GrDropdown/chunks/GrDropdown-7r772-Cq.js +180 -0
  56. package/dist/components/GrDropdown/chunks/GrDropdown-7r772-Cq.js.map +1 -0
  57. package/dist/components/GrDropdown/index.js +2 -2
  58. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-GOzuAXsi.js → GrDropdownMenu-DNurbsWc.js} +1 -1
  59. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-GOzuAXsi.js.map → GrDropdownMenu-DNurbsWc.js.map} +1 -1
  60. package/dist/components/GrDropdownMenu/index.js +1 -1
  61. package/dist/components/GrFileUpload/chunks/{GrFileUpload-NsHkRRIa.js → GrFileUpload-LL8RZvC0.js} +10 -0
  62. package/dist/components/GrFileUpload/chunks/GrFileUpload-LL8RZvC0.js.map +1 -0
  63. package/dist/components/GrFileUpload/index.js +1 -1
  64. package/dist/components/GrImageViewer/chunks/{GrImageViewer-CG4vUBg_.js → GrImageViewer--BU8yrfx.js} +1 -1
  65. package/dist/components/GrImageViewer/chunks/{GrImageViewer-CG4vUBg_.js.map → GrImageViewer--BU8yrfx.js.map} +1 -1
  66. package/dist/components/GrImageViewer/index.js +1 -1
  67. package/dist/components/GrModal/chunks/{GrModal-D0mf1SAx.js → GrModal-_JrDhon-.js} +1 -1
  68. package/dist/components/GrModal/chunks/{GrModal-D0mf1SAx.js.map → GrModal-_JrDhon-.js.map} +1 -1
  69. package/dist/components/GrModal/index.js +1 -1
  70. package/dist/components/GrPagination/chunks/{GrPagination-FiiXzVyv.js → GrPagination-gBoWVHk6.js} +1 -1
  71. package/dist/components/GrPagination/chunks/{GrPagination-FiiXzVyv.js.map → GrPagination-gBoWVHk6.js.map} +1 -1
  72. package/dist/components/GrPagination/index.js +1 -1
  73. package/dist/components/GrPopover/chunks/{GrPopover-faJanmGs.js → GrPopover-DEFxDffj.js} +87 -13
  74. package/dist/components/GrPopover/chunks/GrPopover-DEFxDffj.js.map +1 -0
  75. package/dist/components/GrPopover/index.js +2 -2
  76. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-C6QGC7QJ.js → GrPromptDialog-CailXSqW.js} +1 -1
  77. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-C6QGC7QJ.js.map → GrPromptDialog-CailXSqW.js.map} +1 -1
  78. package/dist/components/GrPromptDialog/index.js +1 -1
  79. package/dist/components/GrSelect/chunks/{GrSelect-Dt8iqruc.js → GrSelect-CZqV1Eg4.js} +2 -2
  80. package/dist/components/GrSelect/chunks/{GrSelect-Dt8iqruc.js.map → GrSelect-CZqV1Eg4.js.map} +1 -1
  81. package/dist/components/GrSelect/index.js +2 -2
  82. package/dist/components/GrTabs/chunks/{GrTabs-ugDnkk-2.js → GrTabs-UsO4j8zv.js} +5 -0
  83. package/dist/components/GrTabs/chunks/GrTabs-UsO4j8zv.js.map +1 -0
  84. package/dist/components/GrTabs/index.js +1 -1
  85. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-BHwgGJcT.js → GrTreeSelect-DOXcpWq2.js} +2 -2
  86. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-BHwgGJcT.js.map → GrTreeSelect-DOXcpWq2.js.map} +1 -1
  87. package/dist/components/GrTreeSelect/index.js +2 -2
  88. package/dist/composables/useFloating.js +31 -11
  89. package/dist/composables/useFloating.js.map +1 -1
  90. package/dist/composables/useFocusTrap.js +1 -123
  91. package/dist/granular-provider-node.js +1 -1
  92. package/dist/granular-provider.js +1 -1
  93. package/dist/index.js +26 -26
  94. package/dist/theme.js +1 -1
  95. package/dist/tokens.js +1 -1
  96. package/dist/types/components/GrAutocomplete/grAutocompleteStyles.d.ts +1 -1
  97. package/dist/types/components/GrDropdown/GrDropdown.vue.d.ts +5 -5
  98. package/dist/types/components/GrDropdown/grDropdownStyles.d.ts +8 -2
  99. package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +2 -2
  100. package/dist/types/components/GrPopover/GrPopover.vue.d.ts +54 -4
  101. package/dist/types/components/GrPopover/grPopoverStyles.d.ts +38 -11
  102. package/dist/types/components/GrSelect/grSelectStyles.d.ts +1 -1
  103. package/dist/types/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  104. package/dist/types/components/shared/overlayOrigin.d.ts +22 -0
  105. package/dist/types/components/shared/overlayPanelSurface.d.ts +21 -0
  106. package/dist/types/composables/useFloating.d.ts +15 -0
  107. package/dist/web-types.json +40 -4
  108. package/package.json +1 -1
  109. package/dist/chunks/config-BTwYMQaz2.js.map +0 -1
  110. package/dist/chunks/config-CPSxM7XE.js.map +0 -1
  111. package/dist/chunks/config-T3-DMXYm.js.map +0 -1
  112. package/dist/chunks/config-uzUuosv7.js.map +0 -1
  113. package/dist/chunks/config-vYMJ3Cr1.js.map +0 -1
  114. package/dist/chunks/focusables-BkzK42SQ.js.map +0 -1
  115. package/dist/chunks/grDropdownStyles-V7TRiCXn.js +0 -24
  116. package/dist/chunks/grDropdownStyles-V7TRiCXn.js.map +0 -1
  117. package/dist/chunks/grPopoverStyles-Djh5RNhn.js +0 -59
  118. package/dist/chunks/grPopoverStyles-Djh5RNhn.js.map +0 -1
  119. package/dist/chunks/grSelectStyles-Cdtd10eY.js.map +0 -1
  120. package/dist/chunks/overlayTransition-0Fj5tQbq.js.map +0 -1
  121. package/dist/components/GrColorPicker/chunks/GrColorPicker-p2XH_8cE.js.map +0 -1
  122. package/dist/components/GrContextMenu/chunks/GrContextMenu-ClkVjdcP.js.map +0 -1
  123. package/dist/components/GrDropdown/chunks/GrDropdown-13Wt9eB_.js +0 -239
  124. package/dist/components/GrDropdown/chunks/GrDropdown-13Wt9eB_.js.map +0 -1
  125. package/dist/components/GrFileUpload/chunks/GrFileUpload-NsHkRRIa.js.map +0 -1
  126. package/dist/components/GrPopover/chunks/GrPopover-faJanmGs.js.map +0 -1
  127. package/dist/components/GrTabs/chunks/GrTabs-ugDnkk-2.js.map +0 -1
  128. package/dist/composables/useFocusTrap.js.map +0 -1
@@ -0,0 +1,180 @@
1
+ import { t as useControlledOpen } from "../../../chunks/useControlledOpen-DV3SqLTP.js";
2
+ import { t as GrPopover_default } from "../../GrPopover/chunks/GrPopover-DEFxDffj.js";
3
+ import { t as useMenuItemsFocus } from "../../../chunks/useMenuItemsFocus-B7Bl_aFA.js";
4
+ import { t as grDropdownContentClass } from "../../../chunks/grDropdownStyles-DLToHWMX.js";
5
+ import { computed, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderSlot, unref, watch, withCtx } from "vue";
6
+ //#region src/components/GrDropdown/GrDropdown.vue?vue&type=script&setup=true&lang.ts
7
+ var _hoisted_1 = { "data-gr-dropdown": "" };
8
+ //#endregion
9
+ //#region src/components/GrDropdown/GrDropdown.vue
10
+ var GrDropdown_default = /* @__PURE__ */ defineComponent({
11
+ __name: "GrDropdown",
12
+ props: {
13
+ placement: { default: "bottom-end" },
14
+ offset: { default: 8 },
15
+ width: { default: "12rem" },
16
+ trigger: { default: "click" },
17
+ openDelay: { default: 120 },
18
+ closeDelay: { default: 160 },
19
+ disabled: {
20
+ type: Boolean,
21
+ default: false
22
+ },
23
+ closeOnContentClick: {
24
+ type: Boolean,
25
+ default: true
26
+ },
27
+ contentClass: { default: "" },
28
+ teleportTo: { default: void 0 },
29
+ open: {
30
+ type: Boolean,
31
+ default: void 0
32
+ }
33
+ },
34
+ emits: ["update:open"],
35
+ setup(__props, { expose: __expose, emit: __emit }) {
36
+ const props = __props;
37
+ const emit = __emit;
38
+ const { open: isOpen, setOpen } = useControlledOpen(() => props.open, (next) => emit("update:open", next));
39
+ /**
40
+ * Контейнер пунктов — он же контейнер кольца фокуса.
41
+ *
42
+ * Панель `GrPopover` рисует `v-show`, поэтому содержимое слота существует в DOM
43
+ * с монтирования: ссылка готова до первого открытия, и `focusAt` не приходится
44
+ * ждать отрисовки панели.
45
+ */
46
+ const menuEl = ref(null);
47
+ const menu = useMenuItemsFocus({
48
+ container: () => menuEl.value,
49
+ close: () => close()
50
+ });
51
+ function open() {
52
+ if (props.disabled) return;
53
+ setOpen(true);
54
+ }
55
+ function close() {
56
+ setOpen(false);
57
+ }
58
+ function toggle() {
59
+ isOpen.value ? close() : open();
60
+ }
61
+ async function openWithFocus(first) {
62
+ if (props.disabled) return;
63
+ setOpen(true);
64
+ await nextTick();
65
+ menu.focusAt(first ? 0 : -1);
66
+ }
67
+ /**
68
+ * Что меню добавляет к `triggerProps` примитива.
69
+ *
70
+ * Примитив отдаёт ARIA и клик; стрелки, открывающие меню с первого или
71
+ * последнего пункта, принадлежат паттерну `menu` и живут здесь.
72
+ *
73
+ * И `aria-disabled` вместо нативного `disabled`. Расхождение намеренное:
74
+ * нативный атрибут убирает кнопку из таб-порядка, а у меню триггер обязан
75
+ * оставаться фокусируемым — иначе пользователь клавиатуры не найдёт его вовсе и
76
+ * не узнает, почему меню недоступно. Форм-контролу (`GrColorPicker`) верно
77
+ * обратное, поэтому примитив оставляет нативный, а меню его перекрывает.
78
+ */
79
+ function menuTriggerProps(popoverProps) {
80
+ return {
81
+ ...popoverProps,
82
+ "disabled": void 0,
83
+ "aria-disabled": props.disabled || void 0,
84
+ "onKeydown": onTriggerKeydown
85
+ };
86
+ }
87
+ function onTriggerKeydown(event) {
88
+ if (props.disabled) return;
89
+ switch (event.key) {
90
+ case "Enter":
91
+ case " ":
92
+ case "ArrowDown":
93
+ event.preventDefault();
94
+ openWithFocus(true);
95
+ break;
96
+ case "ArrowUp":
97
+ event.preventDefault();
98
+ openWithFocus(false);
99
+ break;
100
+ case "Escape":
101
+ if (isOpen.value) {
102
+ event.preventDefault();
103
+ close();
104
+ }
105
+ break;
106
+ }
107
+ }
108
+ watch(() => props.disabled, (value) => {
109
+ if (value) close();
110
+ });
111
+ function toCssLength(value) {
112
+ if (value === "auto") return void 0;
113
+ if (typeof value === "number") return `${value}px`;
114
+ const bare = value.trim();
115
+ if (/^\d+$/.test(bare)) {
116
+ if (typeof process !== "undefined" && process.env.NODE_ENV !== "production") console.warn(`[GrDropdown] width="${value}" трактуется как ${bare}px. Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: width="${bare}px" или :width="${bare}".`);
117
+ return `${bare}px`;
118
+ }
119
+ return value;
120
+ }
121
+ const panelStyle = computed(() => {
122
+ const width = toCssLength(props.width);
123
+ return width ? { width } : void 0;
124
+ });
125
+ const contentClasses = computed(() => grDropdownContentClass(props.contentClass));
126
+ __expose({
127
+ open,
128
+ close,
129
+ toggle
130
+ });
131
+ return (_ctx, _cache) => {
132
+ return openBlock(), createElementBlock("div", _hoisted_1, [createVNode(GrPopover_default, {
133
+ role: "menu",
134
+ padding: "none",
135
+ open: unref(isOpen),
136
+ placement: __props.placement,
137
+ "offset-px": __props.offset,
138
+ trigger: __props.trigger,
139
+ "open-delay": __props.openDelay,
140
+ "close-delay": __props.closeDelay,
141
+ disabled: __props.disabled,
142
+ "close-on-content-click": __props.closeOnContentClick,
143
+ "teleport-to": __props.teleportTo,
144
+ "auto-focus": false,
145
+ "onUpdate:open": unref(setOpen)
146
+ }, {
147
+ trigger: withCtx(({ triggerProps: popoverTriggerProps }) => [renderSlot(_ctx.$slots, "trigger", {
148
+ open: unref(isOpen),
149
+ toggle,
150
+ close,
151
+ triggerProps: menuTriggerProps(popoverTriggerProps)
152
+ })]),
153
+ content: withCtx(({ close: closePanel }) => [createElementVNode("div", {
154
+ ref_key: "menuEl",
155
+ ref: menuEl,
156
+ "data-gr-dropdown-panel": "",
157
+ style: normalizeStyle(panelStyle.value),
158
+ onKeydown: _cache[0] || (_cache[0] = (...args) => unref(menu).onKeydown && unref(menu).onKeydown(...args))
159
+ }, [createElementVNode("div", {
160
+ "data-gr-dropdown-content": "",
161
+ class: normalizeClass(contentClasses.value)
162
+ }, [renderSlot(_ctx.$slots, "content", { close: closePanel })], 2)], 36)]),
163
+ _: 3
164
+ }, 8, [
165
+ "open",
166
+ "placement",
167
+ "offset-px",
168
+ "trigger",
169
+ "open-delay",
170
+ "close-delay",
171
+ "disabled",
172
+ "close-on-content-click",
173
+ "teleport-to",
174
+ "onUpdate:open"
175
+ ])]);
176
+ };
177
+ }
178
+ });
179
+ //#endregion
180
+ export { GrDropdown_default as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrDropdown-7r772-Cq.js","names":[],"sources":["../../../../src/components/GrDropdown/GrDropdown.vue","../../../../src/components/GrDropdown/GrDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue'\n\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useMenuItemsFocus } from '../../composables/internal/useMenuItemsFocus'\nimport GrPopover from '../GrPopover/GrPopover.vue'\nimport {\n grDropdownContentClass,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport type GrDropdownTrigger = 'click' | 'hover'\n\nexport interface GrDropdownProps {\n /** Размещение панели относительно триггера; `flip` при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Панель не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /**\n * Точечное переопределение точки монтирования. По умолчанию — общий портал\n * оверлеев (`#gr-portal` либо `portalTarget` из `GrConfigProvider`).\n */\n teleportTo?: string | HTMLElement\n /**\n * Контролируемое состояние панели (`v-model:open`). Без пропа панель ведёт\n * себя сама (uncontrolled), с ним — слушайте `update:open` и меняйте проп.\n */\n open?: boolean\n}\n\nexport interface GrDropdownEmits {\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\n/**\n * Меню поверх `GrPopover`.\n *\n * Панель, слой, портал, позиционирование, наведение с задержками и возврат\n * фокуса принадлежат примитиву. До этого здесь жила вторая их реализация:\n * карта `transform-origin` совпадала с поповерской дословно все двенадцать\n * записей, поверхность панели — шесть утилит — была скопирована, а сборка слоя\n * и портала повторяла его же. Расходились бы молча.\n *\n * Меню оставляет себе то, что меню и есть: кольцо фокуса по пунктам, поиск по\n * буквам, клавиатуру открытия и ширину панели. Тот же приём, что у\n * `GrContextMenu`, который так устроен с самого начала.\n */\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: undefined,\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownEmits>()\n\n// Имя `isOpen` сохранено: читатели работают с computed-Ref.\nconst { open: isOpen, setOpen } = useControlledOpen(\n () => props.open,\n next => emit('update:open', next),\n)\n\n/**\n * Контейнер пунктов — он же контейнер кольца фокуса.\n *\n * Панель `GrPopover` рисует `v-show`, поэтому содержимое слота существует в DOM\n * с монтирования: ссылка готова до первого открытия, и `focusAt` не приходится\n * ждать отрисовки панели.\n */\nconst menuEl = ref<HTMLElement | null>(null)\n\n// Кольцо фокуса и поиск по буквам — общие с `GrContextMenu`: паттерн `menu`\n// один, и вторая его реализация разошлась бы с первой незаметно для тестов.\nconst menu = useMenuItemsFocus({\n container: () => menuEl.value,\n close: () => close(),\n})\n\nfunction open(): void {\n if (props.disabled)\n return\n\n setOpen(true)\n}\n\nfunction close(): void {\n setOpen(false)\n}\n\nfunction toggle(): void {\n isOpen.value ? close() : open()\n}\n\nasync function openWithFocus(first: boolean): Promise<void> {\n if (props.disabled)\n return\n\n setOpen(true)\n await nextTick()\n menu.focusAt(first ? 0 : -1)\n}\n\n/**\n * Что меню добавляет к `triggerProps` примитива.\n *\n * Примитив отдаёт ARIA и клик; стрелки, открывающие меню с первого или\n * последнего пункта, принадлежат паттерну `menu` и живут здесь.\n *\n * И `aria-disabled` вместо нативного `disabled`. Расхождение намеренное:\n * нативный атрибут убирает кнопку из таб-порядка, а у меню триггер обязан\n * оставаться фокусируемым — иначе пользователь клавиатуры не найдёт его вовсе и\n * не узнает, почему меню недоступно. Форм-контролу (`GrColorPicker`) верно\n * обратное, поэтому примитив оставляет нативный, а меню его перекрывает.\n */\nfunction menuTriggerProps(popoverProps: Record<string, unknown>): Record<string, unknown> {\n return {\n ...popoverProps,\n 'disabled': undefined,\n 'aria-disabled': props.disabled || undefined,\n 'onKeydown': onTriggerKeydown,\n }\n}\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n if (props.disabled)\n return\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (isOpen.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nwatch(\n () => props.disabled,\n (value) => {\n if (value)\n close()\n },\n)\n\nfunction toCssLength(value: GrDropdownWidth): string | undefined {\n if (value === 'auto')\n return undefined\n if (typeof value === 'number')\n return `${value}px`\n\n // Строка без единиц браузер просто отбросит, поэтому трактуем её как пиксели\n // — и предупреждаем: `width=\"48\"` легко прочесть как токен шкалы `w-48`.\n const bare = value.trim()\n if (/^\\d+$/.test(bare)) {\n if (__GR_DEV__) {\n console.warn(\n `[GrDropdown] width=\"${value}\" трактуется как ${bare}px. `\n + 'Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: '\n + `width=\"${bare}px\" или :width=\"${bare}\".`,\n )\n }\n return `${bare}px`\n }\n\n return value\n}\n\nconst panelStyle = computed(() => {\n const width = toCssLength(props.width)\n\n return width ? { width } : undefined\n})\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\ndefineExpose({ open, close, toggle })\n\ndefineSlots<{\n /**\n * Триггер панели. `triggerProps` обязаны попасть на сам интерактивный\n * элемент, а не на обёртку вокруг него: `aria-expanded` и `aria-controls`\n * читаются с того узла, который получает фокус, а клик приезжает вместе с ними.\n */\n trigger?: (props: {\n open: boolean\n toggle: () => void\n close: () => void\n triggerProps: Record<string, unknown>\n }) => any\n /** Содержимое меню. */\n content?: (props: { close: () => void }) => any\n}>()\n</script>\n\n<template>\n <div data-gr-dropdown>\n <GrPopover\n role=\"menu\"\n padding=\"none\"\n :open=\"isOpen\"\n :placement=\"placement\"\n :offset-px=\"offset\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :close-on-content-click=\"closeOnContentClick\"\n :teleport-to=\"teleportTo\"\n :auto-focus=\"false\"\n @update:open=\"setOpen\"\n >\n <template #trigger=\"{ triggerProps: popoverTriggerProps }\">\n <slot\n name=\"trigger\"\n :open=\"isOpen\"\n :toggle=\"toggle\"\n :close=\"close\"\n :trigger-props=\"menuTriggerProps(popoverTriggerProps)\"\n />\n </template>\n\n <template #content=\"{ close: closePanel }\">\n <div\n ref=\"menuEl\"\n data-gr-dropdown-panel\n :style=\"panelStyle\"\n @keydown=\"menu.onKeydown\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"closePanel\" />\n </div>\n </div>\n </template>\n </GrPopover>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue'\n\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useMenuItemsFocus } from '../../composables/internal/useMenuItemsFocus'\nimport GrPopover from '../GrPopover/GrPopover.vue'\nimport {\n grDropdownContentClass,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport type GrDropdownTrigger = 'click' | 'hover'\n\nexport interface GrDropdownProps {\n /** Размещение панели относительно триггера; `flip` при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Панель не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /**\n * Точечное переопределение точки монтирования. По умолчанию — общий портал\n * оверлеев (`#gr-portal` либо `portalTarget` из `GrConfigProvider`).\n */\n teleportTo?: string | HTMLElement\n /**\n * Контролируемое состояние панели (`v-model:open`). Без пропа панель ведёт\n * себя сама (uncontrolled), с ним — слушайте `update:open` и меняйте проп.\n */\n open?: boolean\n}\n\nexport interface GrDropdownEmits {\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\n/**\n * Меню поверх `GrPopover`.\n *\n * Панель, слой, портал, позиционирование, наведение с задержками и возврат\n * фокуса принадлежат примитиву. До этого здесь жила вторая их реализация:\n * карта `transform-origin` совпадала с поповерской дословно все двенадцать\n * записей, поверхность панели — шесть утилит — была скопирована, а сборка слоя\n * и портала повторяла его же. Расходились бы молча.\n *\n * Меню оставляет себе то, что меню и есть: кольцо фокуса по пунктам, поиск по\n * буквам, клавиатуру открытия и ширину панели. Тот же приём, что у\n * `GrContextMenu`, который так устроен с самого начала.\n */\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: undefined,\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownEmits>()\n\n// Имя `isOpen` сохранено: читатели работают с computed-Ref.\nconst { open: isOpen, setOpen } = useControlledOpen(\n () => props.open,\n next => emit('update:open', next),\n)\n\n/**\n * Контейнер пунктов — он же контейнер кольца фокуса.\n *\n * Панель `GrPopover` рисует `v-show`, поэтому содержимое слота существует в DOM\n * с монтирования: ссылка готова до первого открытия, и `focusAt` не приходится\n * ждать отрисовки панели.\n */\nconst menuEl = ref<HTMLElement | null>(null)\n\n// Кольцо фокуса и поиск по буквам — общие с `GrContextMenu`: паттерн `menu`\n// один, и вторая его реализация разошлась бы с первой незаметно для тестов.\nconst menu = useMenuItemsFocus({\n container: () => menuEl.value,\n close: () => close(),\n})\n\nfunction open(): void {\n if (props.disabled)\n return\n\n setOpen(true)\n}\n\nfunction close(): void {\n setOpen(false)\n}\n\nfunction toggle(): void {\n isOpen.value ? close() : open()\n}\n\nasync function openWithFocus(first: boolean): Promise<void> {\n if (props.disabled)\n return\n\n setOpen(true)\n await nextTick()\n menu.focusAt(first ? 0 : -1)\n}\n\n/**\n * Что меню добавляет к `triggerProps` примитива.\n *\n * Примитив отдаёт ARIA и клик; стрелки, открывающие меню с первого или\n * последнего пункта, принадлежат паттерну `menu` и живут здесь.\n *\n * И `aria-disabled` вместо нативного `disabled`. Расхождение намеренное:\n * нативный атрибут убирает кнопку из таб-порядка, а у меню триггер обязан\n * оставаться фокусируемым — иначе пользователь клавиатуры не найдёт его вовсе и\n * не узнает, почему меню недоступно. Форм-контролу (`GrColorPicker`) верно\n * обратное, поэтому примитив оставляет нативный, а меню его перекрывает.\n */\nfunction menuTriggerProps(popoverProps: Record<string, unknown>): Record<string, unknown> {\n return {\n ...popoverProps,\n 'disabled': undefined,\n 'aria-disabled': props.disabled || undefined,\n 'onKeydown': onTriggerKeydown,\n }\n}\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n if (props.disabled)\n return\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (isOpen.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nwatch(\n () => props.disabled,\n (value) => {\n if (value)\n close()\n },\n)\n\nfunction toCssLength(value: GrDropdownWidth): string | undefined {\n if (value === 'auto')\n return undefined\n if (typeof value === 'number')\n return `${value}px`\n\n // Строка без единиц браузер просто отбросит, поэтому трактуем её как пиксели\n // — и предупреждаем: `width=\"48\"` легко прочесть как токен шкалы `w-48`.\n const bare = value.trim()\n if (/^\\d+$/.test(bare)) {\n if (__GR_DEV__) {\n console.warn(\n `[GrDropdown] width=\"${value}\" трактуется как ${bare}px. `\n + 'Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: '\n + `width=\"${bare}px\" или :width=\"${bare}\".`,\n )\n }\n return `${bare}px`\n }\n\n return value\n}\n\nconst panelStyle = computed(() => {\n const width = toCssLength(props.width)\n\n return width ? { width } : undefined\n})\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\ndefineExpose({ open, close, toggle })\n\ndefineSlots<{\n /**\n * Триггер панели. `triggerProps` обязаны попасть на сам интерактивный\n * элемент, а не на обёртку вокруг него: `aria-expanded` и `aria-controls`\n * читаются с того узла, который получает фокус, а клик приезжает вместе с ними.\n */\n trigger?: (props: {\n open: boolean\n toggle: () => void\n close: () => void\n triggerProps: Record<string, unknown>\n }) => any\n /** Содержимое меню. */\n content?: (props: { close: () => void }) => any\n}>()\n</script>\n\n<template>\n <div data-gr-dropdown>\n <GrPopover\n role=\"menu\"\n padding=\"none\"\n :open=\"isOpen\"\n :placement=\"placement\"\n :offset-px=\"offset\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :close-on-content-click=\"closeOnContentClick\"\n :teleport-to=\"teleportTo\"\n :auto-focus=\"false\"\n @update:open=\"setOpen\"\n >\n <template #trigger=\"{ triggerProps: popoverTriggerProps }\">\n <slot\n name=\"trigger\"\n :open=\"isOpen\"\n :toggle=\"toggle\"\n :close=\"close\"\n :trigger-props=\"menuTriggerProps(popoverTriggerProps)\"\n />\n </template>\n\n <template #content=\"{ close: closePanel }\">\n <div\n ref=\"menuEl\"\n data-gr-dropdown-panel\n :style=\"panelStyle\"\n @keydown=\"menu.onKeydown\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"closePanel\" />\n </div>\n </div>\n </template>\n </GrPopover>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAGb,MAAM,EAAE,MAAM,QAAQ,YAAY,wBAC1B,MAAM,OACZ,SAAQ,KAAK,eAAe,IAAI,CAClC;;;;;;;;EASA,MAAM,SAAS,IAAwB,IAAI;EAI3C,MAAM,OAAO,kBAAkB;GAC7B,iBAAiB,OAAO;GACxB,aAAa,MAAM;EACrB,CAAC;EAED,SAAS,OAAa;GACpB,IAAI,MAAM,UACR;GAEF,QAAQ,IAAI;EACd;EAEA,SAAS,QAAc;GACrB,QAAQ,KAAK;EACf;EAEA,SAAS,SAAe;GACtB,OAAO,QAAQ,MAAM,IAAI,KAAK;EAChC;EAEA,eAAe,cAAc,OAA+B;GAC1D,IAAI,MAAM,UACR;GAEF,QAAQ,IAAI;GACZ,MAAM,SAAS;GACf,KAAK,QAAQ,QAAQ,IAAI,EAAE;EAC7B;;;;;;;;;;;;;EAcA,SAAS,iBAAiB,cAAgE;GACxF,OAAO;IACL,GAAG;IACH,YAAY,KAAA;IACZ,iBAAiB,MAAM,YAAY,KAAA;IACnC,aAAa;GACf;EACF;EAEA,SAAS,iBAAiB,OAA4B;GACpD,IAAI,MAAM,UACR;GAEF,QAAQ,MAAM,KAAd;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,MAAM,eAAe;KACrB,cAAmB,IAAI;KACvB;IACF,KAAK;KACH,MAAM,eAAe;KACrB,cAAmB,KAAK;KACxB;IACF,KAAK;KACH,IAAI,OAAO,OAAO;MAChB,MAAM,eAAe;MACrB,MAAM;KACR;KACA;GACJ;EACF;EAEA,YACQ,MAAM,WACX,UAAU;GACT,IAAI,OACF,MAAM;EACV,CACF;EAEA,SAAS,YAAY,OAA4C;GAC/D,IAAI,UAAU,QACZ,OAAO,KAAA;GACT,IAAI,OAAO,UAAU,UACnB,OAAO,GAAG,MAAM;GAIlB,MAAM,OAAO,MAAM,KAAK;GACxB,IAAI,QAAQ,KAAK,IAAI,GAAG;IACtB,IAAA,OAAA,YAAA,eAAA,QAAA,IAAA,aAAA,cACE,QAAQ,KACN,uBAAuB,MAAM,mBAAmB,KAAK,iFAEzC,KAAK,kBAAkB,KAAK,GAC1C;IAEF,OAAO,GAAG,KAAK;GACjB;GAEA,OAAO;EACT;EAEA,MAAM,aAAa,eAAe;GAChC,MAAM,QAAQ,YAAY,MAAM,KAAK;GAErC,OAAO,QAAQ,EAAE,MAAM,IAAI,KAAA;EAC7B,CAAC;EAED,MAAM,iBAAiB,eAAe,uBAAuB,MAAM,YAAY,CAAC;EAEhF,SAAa;GAAE;GAAM;GAAO;EAAO,CAAC;;uBAoBlC,mBAuCM,OAvCN,YAuCM,CAtCJ,YAqCY,mBAAA;IApCV,MAAK;IACL,SAAQ;IACP,MAAM,MAAA,MAAA;IACN,WAAW,QAAA;IACX,aAAW,QAAA;IACX,SAAS,QAAA;IACT,cAAY,QAAA;IACZ,eAAa,QAAA;IACb,UAAU,QAAA;IACV,0BAAwB,QAAA;IACxB,eAAa,QAAA;IACb,cAAY;IACZ,iBAAa,MAAA,OAAA;;IAEH,SAAO,SAOd,EAAA,cAPgC,0BAAmB,CACrD,WAME,KAAA,QAAA,WAAA;KAJC,MAAM,MAAA,MAAA;KACE;KACD;KACP,cAAe,iBAAiB,mBAAmB;;IAI7C,SAAO,SAUV,EAAA,OAVqB,iBAAU,CACrC,mBASM,OAAA;cARA;KAAJ,KAAI;KACJ,0BAAA;KACC,OAAK,eAAE,WAAA,KAAU;KACjB,WAAO,OAAA,OAAA,OAAA,MAAA,GAAA,SAAE,MAAA,IAAA,CAAI,CAAC,aAAL,MAAA,IAAA,CAAI,CAAC,UAAS,GAAA,IAAA;QAExB,mBAEM,OAAA;KAFD,4BAAA;KAA0B,OAAK,eAAE,eAAA,KAAc;QAClD,WAA2C,KAAA,QAAA,WAAA,EAArB,OAAO,WAAU,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA"}
@@ -1,3 +1,3 @@
1
- import { t as GrDropdown_default } from "./chunks/GrDropdown-13Wt9eB_.js";
2
- import { n as grDropdownSafelist, t as grDropdownConfig } from "../../chunks/config-uzUuosv7.js";
1
+ import { t as GrDropdown_default } from "./chunks/GrDropdown-7r772-Cq.js";
2
+ import { n as grDropdownSafelist, t as grDropdownConfig } from "../../chunks/config-CT4lP6S4.js";
3
3
  export { GrDropdown_default as GrDropdown, GrDropdown_default as default, grDropdownConfig, grDropdownSafelist };
@@ -1,6 +1,6 @@
1
1
  import { a as colsClass, o as columnBaseClass, s as columnsBaseClass, t as alignClass } from "../../../chunks/grDropdownMenuStyles-Cf8OdR8S.js";
2
2
  import { n as GrDropdownMenuEntries_default, t as GrDropdownMenuList_default } from "./GrDropdownMenuList-B33ZzwfB.js";
3
- import { t as GrDropdown_default } from "../../GrDropdown/chunks/GrDropdown-13Wt9eB_.js";
3
+ import { t as GrDropdown_default } from "../../GrDropdown/chunks/GrDropdown-7r772-Cq.js";
4
4
  import { createBlock, createElementBlock, createVNode, defineComponent, guardReactiveProps, normalizeClass, normalizeProps, openBlock, renderSlot, unref, withCtx } from "vue";
5
5
  //#endregion
6
6
  //#region src/components/GrDropdownMenu/GrDropdownMenu.vue
@@ -1 +1 @@
1
- {"version":3,"file":"GrDropdownMenu-GOzuAXsi.js","names":[],"sources":["../../../../src/components/GrDropdownMenu/GrDropdownMenu.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenu.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumn.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumn.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumns.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumns.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport GrDropdown from '../GrDropdown/GrDropdown.vue'\n// Типы размещения и ширины — из владельца API, а не переобъявлением: расхождение\n// обнаружилось бы только рантаймом.\nimport type { GrDropdownTrigger } from '../GrDropdown/GrDropdown.vue'\nimport type { GrDropdownWidth } from '../GrDropdown/grDropdownStyles'\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\n\nimport GrDropdownMenuEntries from './GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from './GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from './menuModel'\n\nexport interface GrDropdownMenuProps {\n /** Размещение панели относительно триггера; переворот при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Меню не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Куда телепортировать панель (`body` по умолчанию). */\n /** Точечное переопределение точки монтирования; по умолчанию — общий портал. */\n teleportTo?: string | HTMLElement\n /** Закрывать по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы content-контейнера. */\n contentClass?: string\n /**\n * Декларативное меню: пункты, группы и разделители массивом. Слот по\n * умолчанию сильнее — он для меню, которое из модели не собирается.\n */\n items?: GrDropdownMenuEntry[]\n\n // list wrapper\n /** Разделители между пунктами. */\n dividers?: boolean\n /** Верхний бордер контейнера списка. */\n borderTop?: boolean\n /** Нижний бордер контейнера списка. */\n borderBottom?: boolean\n /** Дополнительные классы для wrapper'а списка. */\n listClass?: string\n /**\n * Контролируемое состояние панели (`v-model:open`) — прокидывается в\n * `GrDropdown`. Без пропа меню ведёт себя само (uncontrolled).\n */\n open?: boolean\n}\n\nexport interface GrDropdownMenuEmits {\n /** Выбран пункт декларативного меню. */\n (e: 'select', item: GrDropdownMenuAction): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nwithDefaults(defineProps<GrDropdownMenuProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n teleportTo: undefined,\n closeOnContentClick: true,\n // Поле панели принадлежит панели. Гасить его отсюда своим `p-0` нельзя: оба\n // класса попадают в один атрибут с равной специфичностью, и победителя\n // выбирает порядок правил в сгенерированном CSS, а не разметка. Пункт вписан\n // в это поле собственным радиусом — см. `itemBaseClass`.\n contentClass: '',\n items: undefined,\n dividers: false,\n borderTop: false,\n borderBottom: false,\n listClass: '',\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownMenuEmits>()\n\ndefineSlots<{\n /** Пункты меню. Слот-пропы прокидываются от `GrDropdown` как есть. */\n default?: (props: { close: () => void }) => any\n /**\n * Триггер панели. `triggerProps` обязаны попасть на сам интерактивный\n * элемент, а не на обёртку вокруг него: `aria-expanded` и `aria-controls`\n * читаются с того узла, который получает фокус.\n */\n trigger?: (props: {\n open: boolean\n toggle: () => void\n close: () => void\n triggerProps: Record<string, unknown>\n }) => any\n}>()\n</script>\n\n<template>\n <GrDropdown\n data-gr-dropdown-menu\n :placement=\"placement\"\n :offset=\"offset\"\n :width=\"width\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :teleport-to=\"teleportTo\"\n :close-on-content-click=\"closeOnContentClick\"\n :content-class=\"contentClass\"\n :open=\"open\"\n @update:open=\"emit('update:open', $event)\"\n >\n <template #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n\n <template #content=\"slotProps\">\n <GrDropdownMenuList\n :dividers=\"dividers\"\n :border-top=\"borderTop\"\n :border-bottom=\"borderBottom\"\n :class=\"listClass\"\n >\n <slot v-bind=\"slotProps\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"emit('select', $event)\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrDropdown>\n</template>\n","<script setup lang=\"ts\">\nimport GrDropdown from '../GrDropdown/GrDropdown.vue'\n// Типы размещения и ширины — из владельца API, а не переобъявлением: расхождение\n// обнаружилось бы только рантаймом.\nimport type { GrDropdownTrigger } from '../GrDropdown/GrDropdown.vue'\nimport type { GrDropdownWidth } from '../GrDropdown/grDropdownStyles'\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\n\nimport GrDropdownMenuEntries from './GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from './GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from './menuModel'\n\nexport interface GrDropdownMenuProps {\n /** Размещение панели относительно триггера; переворот при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Меню не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Куда телепортировать панель (`body` по умолчанию). */\n /** Точечное переопределение точки монтирования; по умолчанию — общий портал. */\n teleportTo?: string | HTMLElement\n /** Закрывать по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы content-контейнера. */\n contentClass?: string\n /**\n * Декларативное меню: пункты, группы и разделители массивом. Слот по\n * умолчанию сильнее — он для меню, которое из модели не собирается.\n */\n items?: GrDropdownMenuEntry[]\n\n // list wrapper\n /** Разделители между пунктами. */\n dividers?: boolean\n /** Верхний бордер контейнера списка. */\n borderTop?: boolean\n /** Нижний бордер контейнера списка. */\n borderBottom?: boolean\n /** Дополнительные классы для wrapper'а списка. */\n listClass?: string\n /**\n * Контролируемое состояние панели (`v-model:open`) — прокидывается в\n * `GrDropdown`. Без пропа меню ведёт себя само (uncontrolled).\n */\n open?: boolean\n}\n\nexport interface GrDropdownMenuEmits {\n /** Выбран пункт декларативного меню. */\n (e: 'select', item: GrDropdownMenuAction): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nwithDefaults(defineProps<GrDropdownMenuProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n teleportTo: undefined,\n closeOnContentClick: true,\n // Поле панели принадлежит панели. Гасить его отсюда своим `p-0` нельзя: оба\n // класса попадают в один атрибут с равной специфичностью, и победителя\n // выбирает порядок правил в сгенерированном CSS, а не разметка. Пункт вписан\n // в это поле собственным радиусом — см. `itemBaseClass`.\n contentClass: '',\n items: undefined,\n dividers: false,\n borderTop: false,\n borderBottom: false,\n listClass: '',\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownMenuEmits>()\n\ndefineSlots<{\n /** Пункты меню. Слот-пропы прокидываются от `GrDropdown` как есть. */\n default?: (props: { close: () => void }) => any\n /**\n * Триггер панели. `triggerProps` обязаны попасть на сам интерактивный\n * элемент, а не на обёртку вокруг него: `aria-expanded` и `aria-controls`\n * читаются с того узла, который получает фокус.\n */\n trigger?: (props: {\n open: boolean\n toggle: () => void\n close: () => void\n triggerProps: Record<string, unknown>\n }) => any\n}>()\n</script>\n\n<template>\n <GrDropdown\n data-gr-dropdown-menu\n :placement=\"placement\"\n :offset=\"offset\"\n :width=\"width\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :teleport-to=\"teleportTo\"\n :close-on-content-click=\"closeOnContentClick\"\n :content-class=\"contentClass\"\n :open=\"open\"\n @update:open=\"emit('update:open', $event)\"\n >\n <template #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n\n <template #content=\"slotProps\">\n <GrDropdownMenuList\n :dividers=\"dividers\"\n :border-top=\"borderTop\"\n :border-bottom=\"borderBottom\"\n :class=\"listClass\"\n >\n <slot v-bind=\"slotProps\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"emit('select', $event)\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrDropdown>\n</template>\n","<script setup lang=\"ts\">\nimport { alignClass, columnBaseClass, type GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport type { GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnProps {\n align?: GrDropdownMenuColumnAlign\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnProps>(), {\n align: 'center',\n})\n\ndefineSlots<{\n /** Содержимое колонки меню. */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-column\n role=\"none\"\n :class=\"[columnBaseClass, alignClass[align]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { alignClass, columnBaseClass, type GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport type { GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnProps {\n align?: GrDropdownMenuColumnAlign\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnProps>(), {\n align: 'center',\n})\n\ndefineSlots<{\n /** Содержимое колонки меню. */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-column\n role=\"none\"\n :class=\"[columnBaseClass, alignClass[align]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { colsClass, columnsBaseClass, type GrDropdownMenuColumnsCount } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnsProps {\n cols?: GrDropdownMenuColumnsCount\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnsProps>(), {\n cols: 2,\n})\n\ndefineSlots<{\n /** Колонки меню (`GrDropdownMenuColumn`). */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-columns\n role=\"none\"\n :class=\"[columnsBaseClass, colsClass[cols]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { colsClass, columnsBaseClass, type GrDropdownMenuColumnsCount } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnsProps {\n cols?: GrDropdownMenuColumnsCount\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnsProps>(), {\n cols: 2,\n})\n\ndefineSlots<{\n /** Колонки меню (`GrDropdownMenuColumn`). */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-columns\n role=\"none\"\n :class=\"[columnsBaseClass, colsClass[cols]]\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFA,MAAM,OAAO;;uBAoBX,YA+Ba,oBAAA;IA9BX,yBAAA;IACC,WAAW,QAAA;IACX,QAAQ,QAAA;IACR,OAAO,QAAA;IACP,SAAS,QAAA;IACT,cAAY,QAAA;IACZ,eAAa,QAAA;IACb,UAAU,QAAA;IACV,eAAa,QAAA;IACb,0BAAwB,QAAA;IACxB,iBAAe,QAAA;IACf,MAAM,QAAA;IACN,iBAAW,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,eAAgB,MAAM;;IAE7B,SAAO,SAAE,cAAS,CAC3B,WAA0C,KAAA,QAAA,WAAA,eAAA,mBAAb,SAAS,CAAA,CAAA,CAAA,CAAA;IAG7B,SAAO,SAAE,cAAS,CAC3B,YASqB,4BAAA;KARlB,UAAU,QAAA;KACV,cAAY,QAAA;KACZ,iBAAe,QAAA;KACf,OAAK,eAAE,QAAA,SAAS;;4BAIV,CAFP,WAEO,KAAA,QAAA,WAAA,eAAA,mBAFO,SAAS,CAAA,SAEhB,CADL,YAAyE,+BAAA;MAAjD,OAAO,QAAA;MAAQ,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAW,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBEjH5E,mBAMM,OAAA;IALJ,gCAAA;IACA,MAAK;IACJ,OAAK,eAAA,CAAG,MAAA,eAAA,GAAiB,MAAA,UAAA,CAAU,CAAC,QAAA,MAAK,CAAA;OAE1C,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;;;;;;;;;;;uBEPV,mBAMM,OAAA;IALJ,iCAAA;IACA,MAAK;IACJ,OAAK,eAAA,CAAG,MAAA,gBAAA,GAAkB,MAAA,SAAA,CAAS,CAAC,QAAA,KAAI,CAAA;OAEzC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"GrDropdownMenu-DNurbsWc.js","names":[],"sources":["../../../../src/components/GrDropdownMenu/GrDropdownMenu.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenu.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumn.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumn.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumns.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumns.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport GrDropdown from '../GrDropdown/GrDropdown.vue'\n// Типы размещения и ширины — из владельца API, а не переобъявлением: расхождение\n// обнаружилось бы только рантаймом.\nimport type { GrDropdownTrigger } from '../GrDropdown/GrDropdown.vue'\nimport type { GrDropdownWidth } from '../GrDropdown/grDropdownStyles'\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\n\nimport GrDropdownMenuEntries from './GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from './GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from './menuModel'\n\nexport interface GrDropdownMenuProps {\n /** Размещение панели относительно триггера; переворот при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Меню не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Куда телепортировать панель (`body` по умолчанию). */\n /** Точечное переопределение точки монтирования; по умолчанию — общий портал. */\n teleportTo?: string | HTMLElement\n /** Закрывать по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы content-контейнера. */\n contentClass?: string\n /**\n * Декларативное меню: пункты, группы и разделители массивом. Слот по\n * умолчанию сильнее — он для меню, которое из модели не собирается.\n */\n items?: GrDropdownMenuEntry[]\n\n // list wrapper\n /** Разделители между пунктами. */\n dividers?: boolean\n /** Верхний бордер контейнера списка. */\n borderTop?: boolean\n /** Нижний бордер контейнера списка. */\n borderBottom?: boolean\n /** Дополнительные классы для wrapper'а списка. */\n listClass?: string\n /**\n * Контролируемое состояние панели (`v-model:open`) — прокидывается в\n * `GrDropdown`. Без пропа меню ведёт себя само (uncontrolled).\n */\n open?: boolean\n}\n\nexport interface GrDropdownMenuEmits {\n /** Выбран пункт декларативного меню. */\n (e: 'select', item: GrDropdownMenuAction): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nwithDefaults(defineProps<GrDropdownMenuProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n teleportTo: undefined,\n closeOnContentClick: true,\n // Поле панели принадлежит панели. Гасить его отсюда своим `p-0` нельзя: оба\n // класса попадают в один атрибут с равной специфичностью, и победителя\n // выбирает порядок правил в сгенерированном CSS, а не разметка. Пункт вписан\n // в это поле собственным радиусом — см. `itemBaseClass`.\n contentClass: '',\n items: undefined,\n dividers: false,\n borderTop: false,\n borderBottom: false,\n listClass: '',\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownMenuEmits>()\n\ndefineSlots<{\n /** Пункты меню. Слот-пропы прокидываются от `GrDropdown` как есть. */\n default?: (props: { close: () => void }) => any\n /**\n * Триггер панели. `triggerProps` обязаны попасть на сам интерактивный\n * элемент, а не на обёртку вокруг него: `aria-expanded` и `aria-controls`\n * читаются с того узла, который получает фокус.\n */\n trigger?: (props: {\n open: boolean\n toggle: () => void\n close: () => void\n triggerProps: Record<string, unknown>\n }) => any\n}>()\n</script>\n\n<template>\n <GrDropdown\n data-gr-dropdown-menu\n :placement=\"placement\"\n :offset=\"offset\"\n :width=\"width\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :teleport-to=\"teleportTo\"\n :close-on-content-click=\"closeOnContentClick\"\n :content-class=\"contentClass\"\n :open=\"open\"\n @update:open=\"emit('update:open', $event)\"\n >\n <template #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n\n <template #content=\"slotProps\">\n <GrDropdownMenuList\n :dividers=\"dividers\"\n :border-top=\"borderTop\"\n :border-bottom=\"borderBottom\"\n :class=\"listClass\"\n >\n <slot v-bind=\"slotProps\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"emit('select', $event)\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrDropdown>\n</template>\n","<script setup lang=\"ts\">\nimport GrDropdown from '../GrDropdown/GrDropdown.vue'\n// Типы размещения и ширины — из владельца API, а не переобъявлением: расхождение\n// обнаружилось бы только рантаймом.\nimport type { GrDropdownTrigger } from '../GrDropdown/GrDropdown.vue'\nimport type { GrDropdownWidth } from '../GrDropdown/grDropdownStyles'\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\n\nimport GrDropdownMenuEntries from './GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from './GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from './menuModel'\n\nexport interface GrDropdownMenuProps {\n /** Размещение панели относительно триггера; переворот при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Меню не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Куда телепортировать панель (`body` по умолчанию). */\n /** Точечное переопределение точки монтирования; по умолчанию — общий портал. */\n teleportTo?: string | HTMLElement\n /** Закрывать по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы content-контейнера. */\n contentClass?: string\n /**\n * Декларативное меню: пункты, группы и разделители массивом. Слот по\n * умолчанию сильнее — он для меню, которое из модели не собирается.\n */\n items?: GrDropdownMenuEntry[]\n\n // list wrapper\n /** Разделители между пунктами. */\n dividers?: boolean\n /** Верхний бордер контейнера списка. */\n borderTop?: boolean\n /** Нижний бордер контейнера списка. */\n borderBottom?: boolean\n /** Дополнительные классы для wrapper'а списка. */\n listClass?: string\n /**\n * Контролируемое состояние панели (`v-model:open`) — прокидывается в\n * `GrDropdown`. Без пропа меню ведёт себя само (uncontrolled).\n */\n open?: boolean\n}\n\nexport interface GrDropdownMenuEmits {\n /** Выбран пункт декларативного меню. */\n (e: 'select', item: GrDropdownMenuAction): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nwithDefaults(defineProps<GrDropdownMenuProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n teleportTo: undefined,\n closeOnContentClick: true,\n // Поле панели принадлежит панели. Гасить его отсюда своим `p-0` нельзя: оба\n // класса попадают в один атрибут с равной специфичностью, и победителя\n // выбирает порядок правил в сгенерированном CSS, а не разметка. Пункт вписан\n // в это поле собственным радиусом — см. `itemBaseClass`.\n contentClass: '',\n items: undefined,\n dividers: false,\n borderTop: false,\n borderBottom: false,\n listClass: '',\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownMenuEmits>()\n\ndefineSlots<{\n /** Пункты меню. Слот-пропы прокидываются от `GrDropdown` как есть. */\n default?: (props: { close: () => void }) => any\n /**\n * Триггер панели. `triggerProps` обязаны попасть на сам интерактивный\n * элемент, а не на обёртку вокруг него: `aria-expanded` и `aria-controls`\n * читаются с того узла, который получает фокус.\n */\n trigger?: (props: {\n open: boolean\n toggle: () => void\n close: () => void\n triggerProps: Record<string, unknown>\n }) => any\n}>()\n</script>\n\n<template>\n <GrDropdown\n data-gr-dropdown-menu\n :placement=\"placement\"\n :offset=\"offset\"\n :width=\"width\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :teleport-to=\"teleportTo\"\n :close-on-content-click=\"closeOnContentClick\"\n :content-class=\"contentClass\"\n :open=\"open\"\n @update:open=\"emit('update:open', $event)\"\n >\n <template #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n\n <template #content=\"slotProps\">\n <GrDropdownMenuList\n :dividers=\"dividers\"\n :border-top=\"borderTop\"\n :border-bottom=\"borderBottom\"\n :class=\"listClass\"\n >\n <slot v-bind=\"slotProps\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"emit('select', $event)\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrDropdown>\n</template>\n","<script setup lang=\"ts\">\nimport { alignClass, columnBaseClass, type GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport type { GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnProps {\n align?: GrDropdownMenuColumnAlign\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnProps>(), {\n align: 'center',\n})\n\ndefineSlots<{\n /** Содержимое колонки меню. */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-column\n role=\"none\"\n :class=\"[columnBaseClass, alignClass[align]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { alignClass, columnBaseClass, type GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport type { GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnProps {\n align?: GrDropdownMenuColumnAlign\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnProps>(), {\n align: 'center',\n})\n\ndefineSlots<{\n /** Содержимое колонки меню. */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-column\n role=\"none\"\n :class=\"[columnBaseClass, alignClass[align]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { colsClass, columnsBaseClass, type GrDropdownMenuColumnsCount } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnsProps {\n cols?: GrDropdownMenuColumnsCount\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnsProps>(), {\n cols: 2,\n})\n\ndefineSlots<{\n /** Колонки меню (`GrDropdownMenuColumn`). */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-columns\n role=\"none\"\n :class=\"[columnsBaseClass, colsClass[cols]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { colsClass, columnsBaseClass, type GrDropdownMenuColumnsCount } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnsProps {\n cols?: GrDropdownMenuColumnsCount\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnsProps>(), {\n cols: 2,\n})\n\ndefineSlots<{\n /** Колонки меню (`GrDropdownMenuColumn`). */\n default?: () => any\n}>()\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-columns\n role=\"none\"\n :class=\"[columnsBaseClass, colsClass[cols]]\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFA,MAAM,OAAO;;uBAoBX,YA+Ba,oBAAA;IA9BX,yBAAA;IACC,WAAW,QAAA;IACX,QAAQ,QAAA;IACR,OAAO,QAAA;IACP,SAAS,QAAA;IACT,cAAY,QAAA;IACZ,eAAa,QAAA;IACb,UAAU,QAAA;IACV,eAAa,QAAA;IACb,0BAAwB,QAAA;IACxB,iBAAe,QAAA;IACf,MAAM,QAAA;IACN,iBAAW,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,eAAgB,MAAM;;IAE7B,SAAO,SAAE,cAAS,CAC3B,WAA0C,KAAA,QAAA,WAAA,eAAA,mBAAb,SAAS,CAAA,CAAA,CAAA,CAAA;IAG7B,SAAO,SAAE,cAAS,CAC3B,YASqB,4BAAA;KARlB,UAAU,QAAA;KACV,cAAY,QAAA;KACZ,iBAAe,QAAA;KACf,OAAK,eAAE,QAAA,SAAS;;4BAIV,CAFP,WAEO,KAAA,QAAA,WAAA,eAAA,mBAFO,SAAS,CAAA,SAEhB,CADL,YAAyE,+BAAA;MAAjD,OAAO,QAAA;MAAQ,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAW,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBEjH5E,mBAMM,OAAA;IALJ,gCAAA;IACA,MAAK;IACJ,OAAK,eAAA,CAAG,MAAA,eAAA,GAAiB,MAAA,UAAA,CAAU,CAAC,QAAA,MAAK,CAAA;OAE1C,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;;;;;;;;;;;uBEPV,mBAMM,OAAA;IALJ,iCAAA;IACA,MAAK;IACJ,OAAK,eAAA,CAAG,MAAA,gBAAA,GAAkB,MAAA,SAAA,CAAS,CAAC,QAAA,KAAI,CAAA;OAEzC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
@@ -1,4 +1,4 @@
1
1
  import { a as GrDropdownMenuItem_default, c as GrDropdownMenuDivider_default, o as GrDropdownMenuGroup_default, s as GrDropdownMenuHeader_default, t as GrDropdownMenuList_default } from "./chunks/GrDropdownMenuList-B33ZzwfB.js";
2
- import { n as GrDropdownMenuColumn_default, r as GrDropdownMenu_default, t as GrDropdownMenuColumns_default } from "./chunks/GrDropdownMenu-GOzuAXsi.js";
2
+ import { n as GrDropdownMenuColumn_default, r as GrDropdownMenu_default, t as GrDropdownMenuColumns_default } from "./chunks/GrDropdownMenu-DNurbsWc.js";
3
3
  import { n as grDropdownMenuSafelist, t as grDropdownMenuConfig } from "../../chunks/config-_jbgsFpw.js";
4
4
  export { GrDropdownMenu_default as GrDropdownMenu, GrDropdownMenu_default as default, GrDropdownMenuColumn_default as GrDropdownMenuColumn, GrDropdownMenuColumns_default as GrDropdownMenuColumns, GrDropdownMenuDivider_default as GrDropdownMenuDivider, GrDropdownMenuGroup_default as GrDropdownMenuGroup, GrDropdownMenuHeader_default as GrDropdownMenuHeader, GrDropdownMenuItem_default as GrDropdownMenuItem, GrDropdownMenuList_default as GrDropdownMenuList, grDropdownMenuConfig, grDropdownMenuSafelist };
@@ -925,6 +925,16 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
925
925
  retryFile,
926
926
  abortFile
927
927
  });
928
+ /**
929
+ * Drop-zone намеренно БЕЗ `role="button"` и `tabindex`: доступным контролом
930
+ * служит сам нативный `<input type="file">`. Роль-виджет объявляет потомков
931
+ * презентационными, поэтому input внутри неё теряется для скринридеров и
932
+ * падает в axe на `nested-interactive`; а обёртывать его в собственный
933
+ * «button» — значит вручную переизобретать то, что file-input уже умеет
934
+ * нативно (открытие диалога с клавиатуры, объявление «кнопка выбора файла»).
935
+ * Зона остаётся кликабельной и принимает drag&drop, фокус input'а показывает
936
+ * через `focus-within`.
937
+ */
928
938
  return (_ctx, _cache) => {
929
939
  return openBlock(), createElementBlock("div", {
930
940
  ref_key: "rootEl",