@feugene/granularity 0.4.5 → 0.5.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 (125) hide show
  1. package/dist/chunks/{config-DTpwUHgF.js → config-BDiLiqSk.js} +1 -2
  2. package/dist/chunks/{config-DTpwUHgF.js.map → config-BDiLiqSk.js.map} +1 -1
  3. package/dist/chunks/{config-C2iI7_QX.js → config-BFZN9-vt.js} +1 -2
  4. package/dist/chunks/{config-C2iI7_QX.js.map → config-BFZN9-vt.js.map} +1 -1
  5. package/dist/chunks/{config-CByfsV-z2.js → config-BGmiXpR82.js} +1 -2
  6. package/dist/chunks/config-BGmiXpR82.js.map +1 -0
  7. package/dist/chunks/{config-C6SBJxcH.js → config-BV4vBzdm.js} +1 -4
  8. package/dist/chunks/config-BV4vBzdm.js.map +1 -0
  9. package/dist/chunks/{config-BA0BWYzs.js → config-BulF0Bf-.js} +1 -4
  10. package/dist/chunks/config-BulF0Bf-.js.map +1 -0
  11. package/dist/chunks/{config-1I95Zy4V.js → config-C-GVBa19.js} +1 -2
  12. package/dist/chunks/{config-1I95Zy4V.js.map → config-C-GVBa19.js.map} +1 -1
  13. package/dist/chunks/{config-DW_RqmUp.js → config-C9AOlKah.js} +1 -4
  14. package/dist/chunks/config-C9AOlKah.js.map +1 -0
  15. package/dist/chunks/{config-TyzU6gLf.js → config-C9MblwGq.js} +1 -4
  16. package/dist/chunks/config-C9MblwGq.js.map +1 -0
  17. package/dist/chunks/{config-r6hzn2Bn2.js → config-CA9XwYnZ2.js} +1 -2
  18. package/dist/chunks/{config-r6hzn2Bn2.js.map → config-CA9XwYnZ2.js.map} +1 -1
  19. package/dist/chunks/{config-Cgc-D1K4.js → config-CFcv0hjb.js} +1 -5
  20. package/dist/chunks/{config-Cgc-D1K4.js.map → config-CFcv0hjb.js.map} +1 -1
  21. package/dist/chunks/{config-BKRmlivc.js → config-C_-02Pu-.js} +1 -4
  22. package/dist/chunks/config-C_-02Pu-.js.map +1 -0
  23. package/dist/chunks/{config-DFRYOcrP.js → config-C_AOYGBr.js} +1 -2
  24. package/dist/chunks/{config-DFRYOcrP.js.map → config-C_AOYGBr.js.map} +1 -1
  25. package/dist/chunks/{config-qJXIIY1E.js → config-CdHY0Z7L.js} +1 -4
  26. package/dist/chunks/config-CdHY0Z7L.js.map +1 -0
  27. package/dist/chunks/{config-nfOMJXVs.js → config-CgjOJ3aF.js} +1 -2
  28. package/dist/chunks/{config-nfOMJXVs.js.map → config-CgjOJ3aF.js.map} +1 -1
  29. package/dist/chunks/{config-Dnu4VuO0.js → config-Cgk5ti-b.js} +1 -4
  30. package/dist/chunks/config-Cgk5ti-b.js.map +1 -0
  31. package/dist/chunks/{config-rQlbnEKn.js → config-ChQxl75m.js} +1 -4
  32. package/dist/chunks/config-ChQxl75m.js.map +1 -0
  33. package/dist/chunks/{config-Bv2G0OU6.js → config-Cn8TG49a.js} +1 -4
  34. package/dist/chunks/{config-Bv2G0OU6.js.map → config-Cn8TG49a.js.map} +1 -1
  35. package/dist/chunks/{config-C0j836dC.js → config-CsMIhZfM.js} +1 -4
  36. package/dist/chunks/config-CsMIhZfM.js.map +1 -0
  37. package/dist/chunks/{config-DmI1IQvI2.js → config-CwLoozAz2.js} +1 -4
  38. package/dist/chunks/config-CwLoozAz2.js.map +1 -0
  39. package/dist/chunks/{config-BzZGpWsj.js → config-D5ek7VSi.js} +1 -2
  40. package/dist/chunks/{config-BzZGpWsj.js.map → config-D5ek7VSi.js.map} +1 -1
  41. package/dist/chunks/{config-etXh7Bsr2.js → config-DDEWvph-2.js} +1 -2
  42. package/dist/chunks/config-DDEWvph-2.js.map +1 -0
  43. package/dist/chunks/{config-CMZE2fu0.js → config-DJWf0kWe.js} +0 -1
  44. package/dist/chunks/config-DJWf0kWe.js.map +1 -0
  45. package/dist/chunks/config-Da90XGsi.js.map +1 -1
  46. package/dist/chunks/{config-CgAY2WP9.js → config-Db4BEG8Y.js} +1 -2
  47. package/dist/chunks/{config-CgAY2WP9.js.map → config-Db4BEG8Y.js.map} +1 -1
  48. package/dist/chunks/{config-2wgwWaAB.js → config-DbghHyY_.js} +1 -4
  49. package/dist/chunks/config-DbghHyY_.js.map +1 -0
  50. package/dist/chunks/config-R0jaXatX.js.map +1 -1
  51. package/dist/chunks/{config-BCPyma1I.js → config-YSOeh6cy.js} +1 -4
  52. package/dist/chunks/{config-BCPyma1I.js.map → config-YSOeh6cy.js.map} +1 -1
  53. package/dist/chunks/{config-C5SJXHQ4.js → config-ndXqsz5A.js} +1 -2
  54. package/dist/chunks/config-ndXqsz5A.js.map +1 -0
  55. package/dist/chunks/grBadgeStyles-pqqbVgLk.js.map +1 -1
  56. package/dist/chunks/grButtonStyles-BxZW2x0-.js.map +1 -1
  57. package/dist/chunks/{shared-BB4Bq2z2.js → shared-CyCPkimZ.js} +26 -26
  58. package/dist/chunks/{shared-BB4Bq2z2.js.map → shared-CyCPkimZ.js.map} +1 -1
  59. package/dist/components/GrAlert/chunks/{GrAlert-BjerGcU8.js → GrAlert-HyCjYJeL.js} +14 -0
  60. package/dist/components/GrAlert/chunks/GrAlert-HyCjYJeL.js.map +1 -0
  61. package/dist/components/GrAlert/index.js +2 -2
  62. package/dist/components/GrBadgeWrap/index.js +1 -1
  63. package/dist/components/GrBottomNav/index.js +1 -1
  64. package/dist/components/GrButtonGroup/index.js +1 -1
  65. package/dist/components/GrCard/index.js +1 -1
  66. package/dist/components/GrCheckbox/index.js +1 -1
  67. package/dist/components/GrCollapse/index.js +1 -1
  68. package/dist/components/GrConfirmDialog/index.js +1 -1
  69. package/dist/components/GrDataTable/index.js +1 -1
  70. package/dist/components/GrDropdownMenu/index.js +1 -1
  71. package/dist/components/GrEmptyState/index.js +1 -1
  72. package/dist/components/GrFileUpload/index.js +1 -1
  73. package/dist/components/GrFormField/index.js +1 -1
  74. package/dist/components/GrFormFile/index.js +1 -1
  75. package/dist/components/GrFormSection/index.js +1 -1
  76. package/dist/components/GrIcon/index.js +1 -1
  77. package/dist/components/GrImageViewer/index.js +1 -1
  78. package/dist/components/GrNavbar/index.js +1 -1
  79. package/dist/components/GrPagination/chunks/{GrPagination-BDVXvgMR.js → GrPagination-C_rxGwfY.js} +1 -1
  80. package/dist/components/GrPagination/chunks/{GrPagination-BDVXvgMR.js.map → GrPagination-C_rxGwfY.js.map} +1 -1
  81. package/dist/components/GrPagination/index.js +2 -2
  82. package/dist/components/GrPromptDialog/index.js +1 -1
  83. package/dist/components/GrRadioGroup/index.js +1 -1
  84. package/dist/components/GrSelect/chunks/{GrSelect-BMmQWQBp.js → GrSelect-BMMT5MrT.js} +4 -4
  85. package/dist/components/GrSelect/chunks/GrSelect-BMMT5MrT.js.map +1 -0
  86. package/dist/components/GrSelect/index.js +1 -1
  87. package/dist/components/GrSidebar/index.js +1 -1
  88. package/dist/components/GrSkeleton/index.js +1 -1
  89. package/dist/components/GrTable/index.js +1 -1
  90. package/dist/components/GrTabs/index.js +1 -1
  91. package/dist/components/GrTooltip/index.js +1 -1
  92. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-Da-CpRqm.js → GrTreeSelect-N-oPAOFj.js} +2 -2
  93. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-N-oPAOFj.js.map +1 -0
  94. package/dist/components/GrTreeSelect/index.js +1 -1
  95. package/dist/composables/useToast.js.map +1 -1
  96. package/dist/granular-provider-node.js +1 -1
  97. package/dist/granular-provider.js +1 -1
  98. package/dist/index.js +51 -31
  99. package/dist/index.js.map +1 -0
  100. package/dist/types/src/components/GrAlert/GrAlert.vue.d.ts +2 -1
  101. package/dist/types/src/components/GrBadge/grBadgeStyles.d.ts +2 -1
  102. package/dist/types/src/components/GrButton/grButtonStyles.d.ts +2 -1
  103. package/dist/types/src/components/GrProgressBar/grStyle.d.ts +2 -1
  104. package/dist/types/src/components/shared/tones.d.ts +10 -0
  105. package/dist/types/src/composables/useToast.d.ts +2 -1
  106. package/dist/types/src/index.d.ts +2 -0
  107. package/package.json +3 -3
  108. package/dist/chunks/config-2wgwWaAB.js.map +0 -1
  109. package/dist/chunks/config-BA0BWYzs.js.map +0 -1
  110. package/dist/chunks/config-BKRmlivc.js.map +0 -1
  111. package/dist/chunks/config-C0j836dC.js.map +0 -1
  112. package/dist/chunks/config-C5SJXHQ4.js.map +0 -1
  113. package/dist/chunks/config-C6SBJxcH.js.map +0 -1
  114. package/dist/chunks/config-CByfsV-z2.js.map +0 -1
  115. package/dist/chunks/config-CMZE2fu0.js.map +0 -1
  116. package/dist/chunks/config-DW_RqmUp.js.map +0 -1
  117. package/dist/chunks/config-DmI1IQvI2.js.map +0 -1
  118. package/dist/chunks/config-Dnu4VuO0.js.map +0 -1
  119. package/dist/chunks/config-TyzU6gLf.js.map +0 -1
  120. package/dist/chunks/config-etXh7Bsr2.js.map +0 -1
  121. package/dist/chunks/config-qJXIIY1E.js.map +0 -1
  122. package/dist/chunks/config-rQlbnEKn.js.map +0 -1
  123. package/dist/components/GrAlert/chunks/GrAlert-BjerGcU8.js.map +0 -1
  124. package/dist/components/GrSelect/chunks/GrSelect-BMmQWQBp.js.map +0 -1
  125. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-Da-CpRqm.js.map +0 -1
@@ -1,3 +1,3 @@
1
1
  import { t as GrTable_default } from "./chunks/GrTable-CyQ9uw8A.js";
2
- import { t as grTableConfig } from "../../chunks/config-Cgc-D1K4.js";
2
+ import { t as grTableConfig } from "../../chunks/config-CFcv0hjb.js";
3
3
  export { GrTable_default as GrTable, GrTable_default as default, grTableConfig };
@@ -1,3 +1,3 @@
1
1
  import { t as GrTabs_default } from "./chunks/GrTabs-BpF8AAUz.js";
2
- import { t as grTabsConfig } from "../../chunks/config-DmI1IQvI2.js";
2
+ import { t as grTabsConfig } from "../../chunks/config-CwLoozAz2.js";
3
3
  export { GrTabs_default as GrTabs, GrTabs_default as default, grTabsConfig };
@@ -1,3 +1,3 @@
1
1
  import { t as GrTooltip_default } from "./chunks/GrTooltip-BvmsukLW.js";
2
- import { t as grTooltipConfig } from "../../chunks/config-r6hzn2Bn2.js";
2
+ import { t as grTooltipConfig } from "../../chunks/config-CA9XwYnZ2.js";
3
3
  export { GrTooltip_default as GrTooltip, GrTooltip_default as default, grTooltipConfig };
@@ -372,7 +372,7 @@ var GrTreeSelect_default = /* @__PURE__ */ defineComponent({
372
372
  disabled: __props.disabled,
373
373
  "aria-label": unref(t)("gr.common.clear", "Clear"),
374
374
  onClick: withModifiers(clear, ["stop"])
375
- }, [..._cache[1] || (_cache[1] = [createElementVNode("span", { class: "i-lucide-x h-4 w-4" }, null, -1)])], 8, _hoisted_3)) : (openBlock(), createElementBlock("span", _hoisted_4, [createElementVNode("span", { class: normalizeClass(["i-lucide-chevron-down h-4 w-4 transition-transform duration-150", open.value ? "rotate-180" : ""]) }, null, 2)])),
375
+ }, [..._cache[1] || (_cache[1] = [createElementVNode("span", { class: "i-lucide-x inline-block h-4 w-4" }, null, -1)])], 8, _hoisted_3)) : (openBlock(), createElementBlock("span", _hoisted_4, [createElementVNode("span", { class: normalizeClass(["i-lucide-chevron-down inline-block h-4 w-4 transition-transform duration-150", open.value ? "rotate-180" : ""]) }, null, 2)])),
376
376
  _ctx.$slots.value ? (openBlock(), createElementBlock("div", _hoisted_5, [renderSlot(_ctx.$slots, "value", {
377
377
  value: __props.modelValue,
378
378
  labels: selectedLabels.value,
@@ -429,7 +429,7 @@ var GrTreeSelect_default = /* @__PURE__ */ defineComponent({
429
429
  data,
430
430
  selected: selectedKeySet.value.has(node.key)
431
431
  }, () => [createElementVNode("div", _hoisted_8, [createElementVNode("span", {
432
- class: normalizeClass(["h-4 w-4 shrink-0", selectedKeySet.value.has(node.key) ? "i-lucide-check text-[var(--primary)]" : ""]),
432
+ class: normalizeClass(["inline-block h-4 w-4 shrink-0", selectedKeySet.value.has(node.key) ? "i-lucide-check text-[var(--primary)]" : ""]),
433
433
  "aria-hidden": "true"
434
434
  }, null, 2), createElementVNode("span", _hoisted_9, toDisplayString(node.label), 1)])])]),
435
435
  _: 3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrTreeSelect-N-oPAOFj.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, onUnmounted, ref, watch } from 'vue'\n\nimport { vClickOutside } from '../../directives'\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 { GrTreeSelectModelValue, GrTreeSelectProps } from './grTreeSelectTypes'\nimport { grTreeSelectClass, grTreeSelectPanelClass } from './grTreeSelectStyles'\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: 'md',\n invalid: false,\n state: 'default',\n multiple: false,\n clearable: false,\n valueDisplay: 'label',\n filterable: false,\n filterPlaceholder: undefined,\n filterInputmode: undefined,\n filterNodeMethod: undefined,\n closeOnSelect: undefined,\n dropdownMaxHeight: 320,\n },\n)\n\nconst { t } = useGranularityTranslations()\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrTreeSelectModelValue): void\n (e: 'change', value: GrTreeSelectModelValue): void\n (e: 'visibleChange', visible: boolean): void\n (e: 'clear'): void\n (e: 'nodeClick', data: T, node: GrTreeNode<T>): void\n}>()\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\nconst rootEl = ref<HTMLElement | null>(null)\nconst triggerEl = ref<HTMLInputElement | null>(null)\nconst filterInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst treeRef = ref<GrTreeInstance | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\n\nconst clickOutsideExclude = [() => panelEl.value]\n\nlet hadPointerDownOnTrigger = false\n\nconst open = ref(false)\nconst filterValue = ref('')\n\nconst panelStyle = ref<Record<string, string>>({\n left: '0px',\n top: '0px',\n width: '0px',\n zIndex: '2147483647',\n})\n\nfunction syncPanelPosition(): void {\n if (typeof window === 'undefined')\n return\n\n const root = rootEl.value\n if (!root)\n return\n\n const rect = root.getBoundingClientRect()\n\n panelStyle.value = {\n left: `${rect.left}px`,\n top: `${rect.bottom + 8}px`,\n width: `${rect.width}px`,\n zIndex: '2147483647',\n }\n}\n\nfunction bindPanelPositionListeners(): void {\n if (typeof window === 'undefined')\n return\n window.addEventListener('resize', syncPanelPosition)\n window.addEventListener('scroll', syncPanelPosition, true)\n}\n\nfunction unbindPanelPositionListeners(): void {\n if (typeof window === 'undefined')\n return\n window.removeEventListener('resize', syncPanelPosition)\n window.removeEventListener('scroll', syncPanelPosition, true)\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\nconst resolvedFilterPlaceholder = computed(() => {\n return props.filterPlaceholder ?? t('gr.treeSelect.filterPlaceholder', 'Search…')\n})\n\nconst className = computed(() => {\n return grTreeSelectClass({\n size: props.size,\n state: props.state,\n invalid: props.invalid,\n })\n})\n\nconst panelClasses = computed(() => {\n return grTreeSelectPanelClass\n})\n\nfunction setOpen(next: boolean) {\n if (props.disabled)\n return\n\n if (open.value === next)\n return\n\n open.value = next\n emit('visibleChange', next)\n}\n\nfunction onClickOutside(): void {\n setOpen(false)\n}\n\nfunction openDropdown(): void {\n setOpen(true)\n}\n\nfunction closeDropdown(): void {\n setOpen(false)\n}\n\nfunction toggleDropdown(): void {\n setOpen(!open.value)\n}\n\nfunction onTriggerPointerDown(): void {\n hadPointerDownOnTrigger = true\n if (typeof window !== 'undefined') {\n window.setTimeout(() => {\n hadPointerDownOnTrigger = false\n }, 0)\n }\n else {\n // SSR / no window: reset sync\n hadPointerDownOnTrigger = false\n }\n}\n\nfunction onTriggerFocus(): void {\n if (hadPointerDownOnTrigger)\n return\n openDropdown()\n}\n\nfunction closeOnEscape(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n closeDropdown()\n nextTick(() => triggerEl.value?.focus())\n }\n}\n\nwatch(\n open,\n async (isOpen) => {\n if (typeof document === 'undefined')\n return\n\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\n\n if (isOpen)\n document.addEventListener('keydown', closeOnEscape)\n\n if (!isOpen)\n return\n\n bindPanelPositionListeners()\n await nextTick()\n syncPanelPosition()\n\n // sync tree highlight\n if (!props.multiple) {\n const v = props.modelValue\n if (v != null && !Array.isArray(v))\n treeRef.value?.setCurrentKey(v)\n }\n\n // focus filter input\n if (props.filterable) {\n await nextTick()\n filterInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nonUnmounted(() => {\n if (typeof document === 'undefined')\n return\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\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\nwatch(\n open,\n (isOpen) => {\n if (isOpen)\n return\n if (filterValue.value.trim().length > 0)\n filterValue.value = ''\n },\n)\n\nfunction emitModel(next: GrTreeSelectModelValue) {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction clear(): void {\n if (props.disabled)\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\nfunction onTriggerKeydown(e: KeyboardEvent): void {\n if (props.disabled)\n return\n\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openDropdown()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closeDropdown()\n }\n}\n\nfunction onNodeClick(data: T, node: GrTreeNode<T>): void {\n emit('nodeClick', data, node)\n\n if (props.disabled)\n return\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</script>\n\n<template>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: onClickOutside, enabled: open, exclude: clickOutsideExclude }\"\n data-ds-tree-select\n class=\"relative\"\n >\n <div class=\"relative\">\n <input\n ref=\"triggerEl\"\n data-testid=\"ds-tree-select-trigger\"\n data-ds-tree-select-trigger\n type=\"text\"\n :value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n readonly\n role=\"combobox\"\n aria-readonly=\"true\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :aria-invalid=\"invalid ? 'true' : undefined\"\n class=\"w-full rounded-md border bg-[var(--bg)] text-[var(--fg)] placeholder:text-[var(--muted-fg)] transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] disabled:opacity-50 disabled:cursor-not-allowed\"\n :class=\"[className, $slots.value ? 'text-transparent placeholder:text-transparent' : '']\"\n @pointerdown=\"onTriggerPointerDown\"\n @click=\"toggleDropdown\"\n @focus=\"onTriggerFocus\"\n @keydown=\"onTriggerKeydown\"\n >\n\n <button\n v-if=\"clearable && hasSelection\"\n data-testid=\"ds-tree-select-clear\"\n data-ds-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-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50\"\n :disabled=\"disabled\"\n :aria-label=\"t('gr.common.clear', 'Clear')\"\n @click.stop=\"clear\"\n >\n <span class=\"i-lucide-x inline-block h-4 w-4\" />\n </button>\n\n <span\n v-else\n data-testid=\"ds-tree-select-chevron\"\n data-ds-tree-select-chevron\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span\n class=\"i-lucide-chevron-down inline-block h-4 w-4 transition-transform duration-150\"\n :class=\"open ? 'rotate-180' : ''\"\n />\n </span>\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 >\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=\"body\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n ref=\"panelEl\"\n data-testid=\"ds-tree-select-panel\"\n data-ds-tree-select-panel\n class=\"fixed w-full\"\n :style=\"panelStyle\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"filterable\" class=\"p-2 border-b border-[var(--brd)]\">\n <GrInput\n ref=\"filterInputRef\"\n v-model=\"filterValue\"\n data-testid=\"ds-tree-select-filter\"\n data-ds-tree-select-filter\n type=\"search\"\n :inputmode=\"filterInputmode\"\n :placeholder=\"resolvedFilterPlaceholder\"\n size=\"sm\"\n />\n </div>\n\n <div\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n >\n <div v-if=\"(data?.length ?? 0) === 0\" class=\"px-3 py-2 text-[13px] text-[var(--muted-fg)]\">\n <slot name=\"empty\">\n {{ t('gr.treeSelect.empty', 'No data') }}\n </slot>\n </div>\n\n <GrTree\n v-else\n ref=\"treeRef\"\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 @node-click=\"onNodeClick\"\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 <span\n class=\"inline-block h-4 w-4 shrink-0\"\n :class=\"selectedKeySet.has(node.key) ? 'i-lucide-check text-[var(--primary)]' : ''\"\n aria-hidden=\"true\"\n />\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, onUnmounted, ref, watch } from 'vue'\n\nimport { vClickOutside } from '../../directives'\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 { GrTreeSelectModelValue, GrTreeSelectProps } from './grTreeSelectTypes'\nimport { grTreeSelectClass, grTreeSelectPanelClass } from './grTreeSelectStyles'\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: 'md',\n invalid: false,\n state: 'default',\n multiple: false,\n clearable: false,\n valueDisplay: 'label',\n filterable: false,\n filterPlaceholder: undefined,\n filterInputmode: undefined,\n filterNodeMethod: undefined,\n closeOnSelect: undefined,\n dropdownMaxHeight: 320,\n },\n)\n\nconst { t } = useGranularityTranslations()\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrTreeSelectModelValue): void\n (e: 'change', value: GrTreeSelectModelValue): void\n (e: 'visibleChange', visible: boolean): void\n (e: 'clear'): void\n (e: 'nodeClick', data: T, node: GrTreeNode<T>): void\n}>()\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\nconst rootEl = ref<HTMLElement | null>(null)\nconst triggerEl = ref<HTMLInputElement | null>(null)\nconst filterInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst treeRef = ref<GrTreeInstance | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\n\nconst clickOutsideExclude = [() => panelEl.value]\n\nlet hadPointerDownOnTrigger = false\n\nconst open = ref(false)\nconst filterValue = ref('')\n\nconst panelStyle = ref<Record<string, string>>({\n left: '0px',\n top: '0px',\n width: '0px',\n zIndex: '2147483647',\n})\n\nfunction syncPanelPosition(): void {\n if (typeof window === 'undefined')\n return\n\n const root = rootEl.value\n if (!root)\n return\n\n const rect = root.getBoundingClientRect()\n\n panelStyle.value = {\n left: `${rect.left}px`,\n top: `${rect.bottom + 8}px`,\n width: `${rect.width}px`,\n zIndex: '2147483647',\n }\n}\n\nfunction bindPanelPositionListeners(): void {\n if (typeof window === 'undefined')\n return\n window.addEventListener('resize', syncPanelPosition)\n window.addEventListener('scroll', syncPanelPosition, true)\n}\n\nfunction unbindPanelPositionListeners(): void {\n if (typeof window === 'undefined')\n return\n window.removeEventListener('resize', syncPanelPosition)\n window.removeEventListener('scroll', syncPanelPosition, true)\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\nconst resolvedFilterPlaceholder = computed(() => {\n return props.filterPlaceholder ?? t('gr.treeSelect.filterPlaceholder', 'Search…')\n})\n\nconst className = computed(() => {\n return grTreeSelectClass({\n size: props.size,\n state: props.state,\n invalid: props.invalid,\n })\n})\n\nconst panelClasses = computed(() => {\n return grTreeSelectPanelClass\n})\n\nfunction setOpen(next: boolean) {\n if (props.disabled)\n return\n\n if (open.value === next)\n return\n\n open.value = next\n emit('visibleChange', next)\n}\n\nfunction onClickOutside(): void {\n setOpen(false)\n}\n\nfunction openDropdown(): void {\n setOpen(true)\n}\n\nfunction closeDropdown(): void {\n setOpen(false)\n}\n\nfunction toggleDropdown(): void {\n setOpen(!open.value)\n}\n\nfunction onTriggerPointerDown(): void {\n hadPointerDownOnTrigger = true\n if (typeof window !== 'undefined') {\n window.setTimeout(() => {\n hadPointerDownOnTrigger = false\n }, 0)\n }\n else {\n // SSR / no window: reset sync\n hadPointerDownOnTrigger = false\n }\n}\n\nfunction onTriggerFocus(): void {\n if (hadPointerDownOnTrigger)\n return\n openDropdown()\n}\n\nfunction closeOnEscape(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n closeDropdown()\n nextTick(() => triggerEl.value?.focus())\n }\n}\n\nwatch(\n open,\n async (isOpen) => {\n if (typeof document === 'undefined')\n return\n\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\n\n if (isOpen)\n document.addEventListener('keydown', closeOnEscape)\n\n if (!isOpen)\n return\n\n bindPanelPositionListeners()\n await nextTick()\n syncPanelPosition()\n\n // sync tree highlight\n if (!props.multiple) {\n const v = props.modelValue\n if (v != null && !Array.isArray(v))\n treeRef.value?.setCurrentKey(v)\n }\n\n // focus filter input\n if (props.filterable) {\n await nextTick()\n filterInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nonUnmounted(() => {\n if (typeof document === 'undefined')\n return\n document.removeEventListener('keydown', closeOnEscape)\n unbindPanelPositionListeners()\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\nwatch(\n open,\n (isOpen) => {\n if (isOpen)\n return\n if (filterValue.value.trim().length > 0)\n filterValue.value = ''\n },\n)\n\nfunction emitModel(next: GrTreeSelectModelValue) {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction clear(): void {\n if (props.disabled)\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\nfunction onTriggerKeydown(e: KeyboardEvent): void {\n if (props.disabled)\n return\n\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openDropdown()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closeDropdown()\n }\n}\n\nfunction onNodeClick(data: T, node: GrTreeNode<T>): void {\n emit('nodeClick', data, node)\n\n if (props.disabled)\n return\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</script>\n\n<template>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: onClickOutside, enabled: open, exclude: clickOutsideExclude }\"\n data-ds-tree-select\n class=\"relative\"\n >\n <div class=\"relative\">\n <input\n ref=\"triggerEl\"\n data-testid=\"ds-tree-select-trigger\"\n data-ds-tree-select-trigger\n type=\"text\"\n :value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n readonly\n role=\"combobox\"\n aria-readonly=\"true\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :aria-invalid=\"invalid ? 'true' : undefined\"\n class=\"w-full rounded-md border bg-[var(--bg)] text-[var(--fg)] placeholder:text-[var(--muted-fg)] transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] disabled:opacity-50 disabled:cursor-not-allowed\"\n :class=\"[className, $slots.value ? 'text-transparent placeholder:text-transparent' : '']\"\n @pointerdown=\"onTriggerPointerDown\"\n @click=\"toggleDropdown\"\n @focus=\"onTriggerFocus\"\n @keydown=\"onTriggerKeydown\"\n >\n\n <button\n v-if=\"clearable && hasSelection\"\n data-testid=\"ds-tree-select-clear\"\n data-ds-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-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50\"\n :disabled=\"disabled\"\n :aria-label=\"t('gr.common.clear', 'Clear')\"\n @click.stop=\"clear\"\n >\n <span class=\"i-lucide-x inline-block h-4 w-4\" />\n </button>\n\n <span\n v-else\n data-testid=\"ds-tree-select-chevron\"\n data-ds-tree-select-chevron\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span\n class=\"i-lucide-chevron-down inline-block h-4 w-4 transition-transform duration-150\"\n :class=\"open ? 'rotate-180' : ''\"\n />\n </span>\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 >\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=\"body\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n ref=\"panelEl\"\n data-testid=\"ds-tree-select-panel\"\n data-ds-tree-select-panel\n class=\"fixed w-full\"\n :style=\"panelStyle\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"filterable\" class=\"p-2 border-b border-[var(--brd)]\">\n <GrInput\n ref=\"filterInputRef\"\n v-model=\"filterValue\"\n data-testid=\"ds-tree-select-filter\"\n data-ds-tree-select-filter\n type=\"search\"\n :inputmode=\"filterInputmode\"\n :placeholder=\"resolvedFilterPlaceholder\"\n size=\"sm\"\n />\n </div>\n\n <div\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n >\n <div v-if=\"(data?.length ?? 0) === 0\" class=\"px-3 py-2 text-[13px] text-[var(--muted-fg)]\">\n <slot name=\"empty\">\n {{ t('gr.treeSelect.empty', 'No data') }}\n </slot>\n </div>\n\n <GrTree\n v-else\n ref=\"treeRef\"\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 @node-click=\"onNodeClick\"\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 <span\n class=\"inline-block h-4 w-4 shrink-0\"\n :class=\"selectedKeySet.has(node.key) ? 'i-lucide-check text-[var(--primary)]' : ''\"\n aria-hidden=\"true\"\n />\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
1
  import { n as grTreeSelectSafelist, t as grTreeSelectConfig } from "../../chunks/config-BNOf_qjD.js";
2
- import { t as GrTreeSelect_default } from "./chunks/GrTreeSelect-Da-CpRqm.js";
2
+ import { t as GrTreeSelect_default } from "./chunks/GrTreeSelect-N-oPAOFj.js";
3
3
  export { GrTreeSelect_default as GrTreeSelect, GrTreeSelect_default as default, grTreeSelectConfig, grTreeSelectSafelist };
@@ -1 +1 @@
1
- {"version":3,"file":"useToast.js","names":[],"sources":["../../src/composables/useToast.ts"],"sourcesContent":["import { computed, reactive } from 'vue'\n\nexport type GrToastTone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'slate' | 'azure'\n\nexport type ToastInput = {\n title: string\n message?: string\n tone?: GrToastTone\n /**\n * Автозакрытие через N мс. `0` или отрицательное значение — «навсегда»\n * (до явного вызова `dismiss(id)` / `clear()`). По умолчанию: `3500`.\n */\n timeoutMs?: number\n}\n\nexport type Toast = {\n id: string\n title: string\n message?: string\n tone: GrToastTone\n}\n\n// Модульный синглтон состояния: один источник истины для всех `GrToaster`\n// в приложении. Подразумевается один активный `GrToaster` на корень.\nconst toasts = reactive<Toast[]>([])\n\n// Таймеры авто-дисмисса по id — чтобы при раннем `dismiss()` / `clear()`\n// не оставлять «висящие» setTimeout'ы и не будить мёртвый tab.\nconst timers = new Map<string, number>()\n\nconst DEFAULT_TIMEOUT_MS = 3500\n\nfunction makeId(): string {\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`\n}\n\nfunction clearTimer(id: string): void {\n const handle = timers.get(id)\n if (handle !== undefined) {\n clearTimeout(handle)\n timers.delete(id)\n }\n}\n\nexport function useToast() {\n const list = computed(() => toasts)\n\n function push(input: ToastInput): string {\n const id = makeId()\n const toast: Toast = {\n id,\n title: input.title,\n message: input.message,\n tone: input.tone ?? 'info',\n }\n\n toasts.unshift(toast)\n\n const timeout = input.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (timeout > 0 && typeof window !== 'undefined') {\n const handle = window.setTimeout(() => {\n timers.delete(id)\n dismiss(id)\n }, timeout)\n timers.set(id, handle)\n }\n\n return id\n }\n\n function dismiss(id: string): void {\n clearTimer(id)\n const index = toasts.findIndex(toast => toast.id === id)\n if (index >= 0)\n toasts.splice(index, 1)\n }\n\n function clear(): void {\n for (const id of timers.keys()) clearTimer(id)\n toasts.splice(0, toasts.length)\n }\n\n return {\n list,\n push,\n dismiss,\n clear,\n }\n}\n"],"mappings":";;AAwBA,IAAM,SAAS,SAAkB,EAAE,CAAC;AAIpC,IAAM,yBAAS,IAAI,KAAqB;AAExC,IAAM,qBAAqB;AAE3B,SAAS,SAAiB;AACxB,QAAO,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE;;AAG7D,SAAS,WAAW,IAAkB;CACpC,MAAM,SAAS,OAAO,IAAI,GAAG;AAC7B,KAAI,WAAW,KAAA,GAAW;AACxB,eAAa,OAAO;AACpB,SAAO,OAAO,GAAG;;;AAIrB,SAAgB,WAAW;CACzB,MAAM,OAAO,eAAe,OAAO;CAEnC,SAAS,KAAK,OAA2B;EACvC,MAAM,KAAK,QAAQ;EACnB,MAAM,QAAe;GACnB;GACA,OAAO,MAAM;GACb,SAAS,MAAM;GACf,MAAM,MAAM,QAAQ;GACrB;AAED,SAAO,QAAQ,MAAM;EAErB,MAAM,UAAU,MAAM,aAAa;AACnC,MAAI,UAAU,KAAK,OAAO,WAAW,aAAa;GAChD,MAAM,SAAS,OAAO,iBAAiB;AACrC,WAAO,OAAO,GAAG;AACjB,YAAQ,GAAG;MACV,QAAQ;AACX,UAAO,IAAI,IAAI,OAAO;;AAGxB,SAAO;;CAGT,SAAS,QAAQ,IAAkB;AACjC,aAAW,GAAG;EACd,MAAM,QAAQ,OAAO,WAAU,UAAS,MAAM,OAAO,GAAG;AACxD,MAAI,SAAS,EACX,QAAO,OAAO,OAAO,EAAE;;CAG3B,SAAS,QAAc;AACrB,OAAK,MAAM,MAAM,OAAO,MAAM,CAAE,YAAW,GAAG;AAC9C,SAAO,OAAO,GAAG,OAAO,OAAO;;AAGjC,QAAO;EACL;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"useToast.js","names":[],"sources":["../../src/composables/useToast.ts"],"sourcesContent":["import { computed, reactive } from 'vue'\n\nimport type { GrTone } from '../components/shared/tones'\n\nexport type GrToastTone = GrTone\n\nexport type ToastInput = {\n title: string\n message?: string\n tone?: GrToastTone\n /**\n * Автозакрытие через N мс. `0` или отрицательное значение — «навсегда»\n * (до явного вызова `dismiss(id)` / `clear()`). По умолчанию: `3500`.\n */\n timeoutMs?: number\n}\n\nexport type Toast = {\n id: string\n title: string\n message?: string\n tone: GrToastTone\n}\n\n// Модульный синглтон состояния: один источник истины для всех `GrToaster`\n// в приложении. Подразумевается один активный `GrToaster` на корень.\nconst toasts = reactive<Toast[]>([])\n\n// Таймеры авто-дисмисса по id — чтобы при раннем `dismiss()` / `clear()`\n// не оставлять «висящие» setTimeout'ы и не будить мёртвый tab.\nconst timers = new Map<string, number>()\n\nconst DEFAULT_TIMEOUT_MS = 3500\n\nfunction makeId(): string {\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`\n}\n\nfunction clearTimer(id: string): void {\n const handle = timers.get(id)\n if (handle !== undefined) {\n clearTimeout(handle)\n timers.delete(id)\n }\n}\n\nexport function useToast() {\n const list = computed(() => toasts)\n\n function push(input: ToastInput): string {\n const id = makeId()\n const toast: Toast = {\n id,\n title: input.title,\n message: input.message,\n tone: input.tone ?? 'info',\n }\n\n toasts.unshift(toast)\n\n const timeout = input.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (timeout > 0 && typeof window !== 'undefined') {\n const handle = window.setTimeout(() => {\n timers.delete(id)\n dismiss(id)\n }, timeout)\n timers.set(id, handle)\n }\n\n return id\n }\n\n function dismiss(id: string): void {\n clearTimer(id)\n const index = toasts.findIndex(toast => toast.id === id)\n if (index >= 0)\n toasts.splice(index, 1)\n }\n\n function clear(): void {\n for (const id of timers.keys()) clearTimer(id)\n toasts.splice(0, toasts.length)\n }\n\n return {\n list,\n push,\n dismiss,\n clear,\n }\n}\n"],"mappings":";;AA0BA,IAAM,SAAS,SAAkB,EAAE,CAAC;AAIpC,IAAM,yBAAS,IAAI,KAAqB;AAExC,IAAM,qBAAqB;AAE3B,SAAS,SAAiB;AACxB,QAAO,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE;;AAG7D,SAAS,WAAW,IAAkB;CACpC,MAAM,SAAS,OAAO,IAAI,GAAG;AAC7B,KAAI,WAAW,KAAA,GAAW;AACxB,eAAa,OAAO;AACpB,SAAO,OAAO,GAAG;;;AAIrB,SAAgB,WAAW;CACzB,MAAM,OAAO,eAAe,OAAO;CAEnC,SAAS,KAAK,OAA2B;EACvC,MAAM,KAAK,QAAQ;EACnB,MAAM,QAAe;GACnB;GACA,OAAO,MAAM;GACb,SAAS,MAAM;GACf,MAAM,MAAM,QAAQ;GACrB;AAED,SAAO,QAAQ,MAAM;EAErB,MAAM,UAAU,MAAM,aAAa;AACnC,MAAI,UAAU,KAAK,OAAO,WAAW,aAAa;GAChD,MAAM,SAAS,OAAO,iBAAiB;AACrC,WAAO,OAAO,GAAG;AACjB,YAAQ,GAAG;MACV,QAAQ;AACX,UAAO,IAAI,IAAI,OAAO;;AAGxB,SAAO;;CAGT,SAAS,QAAQ,IAAkB;AACjC,aAAW,GAAG;EACd,MAAM,QAAQ,OAAO,WAAU,UAAS,MAAM,OAAO,GAAG;AACxD,MAAI,SAAS,EACX,QAAO,OAAO,OAAO,EAAE;;CAG3B,SAAS,QAAc;AACrB,OAAK,MAAM,MAAM,OAAO,MAAM,CAAE,YAAW,GAAG;AAC9C,SAAO,OAAO,GAAG,OAAO,OAAO;;AAGjC,QAAO;EACL;EACA;EACA;EACA;EACD"}
@@ -1,6 +1,6 @@
1
1
  import { n as grButtonSafelist } from "./chunks/safelist-BY7z8fOl.js";
2
2
  import { n as grProgressBarSafelist } from "./chunks/config-Da90XGsi.js";
3
- import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-BB4Bq2z2.js";
3
+ import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-CyCPkimZ.js";
4
4
  import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
5
5
  import { tokenDefinitionsFromCssSync } from "@feugene/unocss-preset-granular/node";
6
6
  //#region src/components/GrButton/config.node.ts
@@ -1,4 +1,4 @@
1
- import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-BB4Bq2z2.js";
1
+ import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-CyCPkimZ.js";
2
2
  //#region src/granular-provider/index.ts
3
3
  var granularityProvider = createGranularityProvider();
4
4
  //#endregion
package/dist/index.js CHANGED
@@ -1,38 +1,38 @@
1
- import { t as GrAlert_default } from "./components/GrAlert/chunks/GrAlert-BjerGcU8.js";
2
- import { t as grAlertConfig } from "./chunks/config-C6SBJxcH.js";
1
+ import { t as GrAlert_default } from "./components/GrAlert/chunks/GrAlert-HyCjYJeL.js";
2
+ import { t as grAlertConfig } from "./chunks/config-BV4vBzdm.js";
3
3
  import { n as grAvatarSafelist, t as grAvatarConfig } from "./chunks/config-CU_CBd0k.js";
4
4
  import { t as GrAvatar_default } from "./components/GrAvatar/chunks/GrAvatar-BjnPKNAL.js";
5
5
  import { t as GrBadge_default } from "./components/GrBadge/chunks/GrBadge-wuIb4_2K.js";
6
6
  import { n as grBadgeSafelist, t as grBadgeConfig } from "./chunks/config-BaMO9dQh.js";
7
7
  import "./components/GrBadge/index.js";
8
8
  import { t as GrBadgeWrap_default } from "./components/GrBadgeWrap/chunks/GrBadgeWrap-CxtamOZ-.js";
9
- import { t as grBadgeWrapConfig } from "./chunks/config-DW_RqmUp.js";
9
+ import { t as grBadgeWrapConfig } from "./chunks/config-C9AOlKah.js";
10
10
  import { t as GrBottomNav_default } from "./components/GrBottomNav/chunks/GrBottomNav-CsmQ7mTJ.js";
11
- import { t as grBottomNavConfig } from "./chunks/config-BKRmlivc.js";
11
+ import { t as grBottomNavConfig } from "./chunks/config-C_-02Pu-.js";
12
12
  import { r as grButtonClass } from "./chunks/grButtonStyles-BxZW2x0-.js";
13
13
  import { t as GrButton_default } from "./components/GrButton/chunks/GrButton-BmGdp8-4.js";
14
14
  import { n as grButtonSafelist, t as grButtonClassTokens } from "./chunks/safelist-BY7z8fOl.js";
15
15
  import { t as grButtonConfig } from "./chunks/config-Dkq0HeLe.js";
16
16
  import { t as GrButtonGroup_default } from "./components/GrButtonGroup/chunks/GrButtonGroup-CBj4tpms.js";
17
- import { t as grButtonGroupConfig } from "./chunks/config-Bv2G0OU6.js";
17
+ import { t as grButtonGroupConfig } from "./chunks/config-Cn8TG49a.js";
18
18
  import "./components/GrButtonGroup/index.js";
19
19
  import { t as GrCard_default } from "./components/GrCard/chunks/GrCard-xtDcXBr7.js";
20
- import { t as grCardConfig } from "./chunks/config-rQlbnEKn.js";
20
+ import { t as grCardConfig } from "./chunks/config-ChQxl75m.js";
21
21
  import { t as GrCheckbox_default } from "./components/GrCheckbox/chunks/GrCheckbox-Bt3d7ckE.js";
22
- import { t as grCheckboxConfig } from "./chunks/config-TyzU6gLf.js";
22
+ import { t as grCheckboxConfig } from "./chunks/config-C9MblwGq.js";
23
23
  import { n as GrCollapse_default, r as GR_COLLAPSE_CONTEXT, t as GrCollapseItem_default } from "./components/GrCollapse/chunks/GrCollapse-HU20VTVn.js";
24
24
  import { t as GrIcon_default } from "./components/GrIcon/chunks/GrIcon-BV7RBU_0.js";
25
- import { t as grIconConfig } from "./chunks/config-2wgwWaAB.js";
26
- import { t as grCollapseConfig } from "./chunks/config-BzZGpWsj.js";
25
+ import { t as grIconConfig } from "./chunks/config-DbghHyY_.js";
26
+ import { t as grCollapseConfig } from "./chunks/config-D5ek7VSi.js";
27
27
  import { t as getGrModalPanelClass } from "./chunks/grModalStyles-Dv2NXBKi.js";
28
28
  import { t as GrModal_default } from "./components/GrModal/chunks/GrModal-gvfvlp7k.js";
29
29
  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-BtXUk6Zc.js";
30
30
  import { i as GrDialogFooter_default, n as GrDialogHeader_default, r as GrDialogCloseButton_default, t as GrDialog_default } from "./components/GrDialog/chunks/GrDialog-gObmaVEl.js";
31
31
  import { t as GrConfirmDialog_default } from "./components/GrConfirmDialog/chunks/GrConfirmDialog-DjGOX9Hd.js";
32
- import { t as grConfirmDialogConfig } from "./chunks/config-DFRYOcrP.js";
32
+ import { t as grConfirmDialogConfig } from "./chunks/config-C_AOYGBr.js";
33
33
  import { t as GrTable_default } from "./components/GrTable/chunks/GrTable-CyQ9uw8A.js";
34
34
  import { t as GrDataTable_default } from "./components/GrDataTable/chunks/GrDataTable-QDOJWmdY.js";
35
- import { t as grDataTableConfig } from "./chunks/config-CMZE2fu0.js";
35
+ import { t as grDataTableConfig } from "./chunks/config-DJWf0kWe.js";
36
36
  import { t as grDialogSafelist } from "./chunks/safelist-BF822K15.js";
37
37
  import "./components/GrDialog/index.js";
38
38
  import { n as grDrawerSafelist, t as grDrawerConfig } from "./chunks/config-DxqpV-KM.js";
@@ -49,20 +49,20 @@ import { t as GrDropdown_default } from "./components/GrDropdown/chunks/GrDropdo
49
49
  import { n as grDropdownSafelist, t as grDropdownConfig } from "./chunks/config-C4AlNm912.js";
50
50
  import "./components/GrDropdown/index.js";
51
51
  import { a as GrDropdownMenuColumns_default, c as GrDropdownMenuList_default, i as GrDropdownMenuDivider_default, n as GrDropdownMenuGroup_default, o as GrDropdownMenuColumn_default, r as GrDropdownMenuHeader_default, s as GrDropdownMenu_default, t as GrDropdownMenuItem_default } from "./components/GrDropdownMenu/chunks/GrDropdownMenu-BEenXrJw.js";
52
- import { t as grDropdownMenuConfig } from "./chunks/config-etXh7Bsr2.js";
52
+ import { t as grDropdownMenuConfig } from "./chunks/config-DDEWvph-2.js";
53
53
  import { t as GrEmptyState_default } from "./components/GrEmptyState/chunks/GrEmptyState-BLbMJFW-.js";
54
- import { t as grEmptyStateConfig } from "./chunks/config-CgAY2WP9.js";
54
+ import { t as grEmptyStateConfig } from "./chunks/config-Db4BEG8Y.js";
55
55
  import { t as GrFileUpload_default } from "./components/GrFileUpload/chunks/GrFileUpload-u01j9S0t.js";
56
- import { t as grFileUploadConfig } from "./chunks/config-CByfsV-z2.js";
56
+ import { t as grFileUploadConfig } from "./chunks/config-BGmiXpR82.js";
57
57
  import { t as GrFormField_default } from "./components/GrFormField/chunks/GrFormField-C6PfAs4u.js";
58
- import { t as grFormFieldConfig } from "./chunks/config-Dnu4VuO0.js";
58
+ import { t as grFormFieldConfig } from "./chunks/config-Cgk5ti-b.js";
59
59
  import "./components/GrFormField/index.js";
60
60
  import { t as GrFormFile_default } from "./components/GrFormFile/chunks/GrFormFile-DdM8Bc2B.js";
61
- import { t as grFormFileConfig } from "./chunks/config-C5SJXHQ4.js";
61
+ import { t as grFormFileConfig } from "./chunks/config-ndXqsz5A.js";
62
62
  import { t as GrFormSection_default } from "./components/GrFormSection/chunks/GrFormSection-5djEaQZQ.js";
63
- import { t as grFormSectionConfig } from "./chunks/config-BCPyma1I.js";
63
+ import { t as grFormSectionConfig } from "./chunks/config-YSOeh6cy.js";
64
64
  import { t as GrImageViewer_default } from "./components/GrImageViewer/chunks/GrImageViewer-CjSnohW7.js";
65
- import { t as grImageViewerConfig } from "./chunks/config-BA0BWYzs.js";
65
+ import { t as grImageViewerConfig } from "./chunks/config-BulF0Bf-.js";
66
66
  import { t as GrInput_default } from "./components/GrInput/chunks/GrInput-ghxaTf6d.js";
67
67
  import { n as grInputSafelist, t as grInputConfig } from "./chunks/config-D19pyP4D.js";
68
68
  import "./components/GrInput/index.js";
@@ -77,44 +77,64 @@ import "./components/GrLoading/index.js";
77
77
  import { n as grModalClassTokens, r as grModalSafelist, t as grModalConfig } from "./chunks/config-XwI6t8cn.js";
78
78
  import "./components/GrModal/index.js";
79
79
  import { t as GrNavbar_default } from "./components/GrNavbar/chunks/GrNavbar-nIyuiVj1.js";
80
- import { t as grNavbarConfig } from "./chunks/config-DTpwUHgF.js";
80
+ import { t as grNavbarConfig } from "./chunks/config-BDiLiqSk.js";
81
81
  import { n as grNumberInputSafelist, t as grNumberInputConfig } from "./chunks/config-bpQYM5O-.js";
82
82
  import { t as GrNumberInput_default } from "./components/GrNumberInput/chunks/GrNumberInput-B0mPLjdv.js";
83
- import { t as GrSelect_default } from "./components/GrSelect/chunks/GrSelect-BMmQWQBp.js";
84
- import { t as GrPagination_default } from "./components/GrPagination/chunks/GrPagination-BDVXvgMR.js";
85
- import { t as grPaginationConfig } from "./chunks/config-C2iI7_QX.js";
83
+ import { t as GrSelect_default } from "./components/GrSelect/chunks/GrSelect-BMMT5MrT.js";
84
+ import { t as GrPagination_default } from "./components/GrPagination/chunks/GrPagination-C_rxGwfY.js";
85
+ import { t as grPaginationConfig } from "./chunks/config-BFZN9-vt.js";
86
86
  import { n as grProgressBarSafelist, t as grProgressBarConfig } from "./chunks/config-Da90XGsi.js";
87
87
  import { t as GrProgressBar_default } from "./components/GrProgressBar/chunks/GrProgressBar-MvMnzsJl.js";
88
88
  import { t as GrPromptDialog_default } from "./components/GrPromptDialog/chunks/GrPromptDialog-DKhbN6ji.js";
89
- import { t as grPromptDialogConfig } from "./chunks/config-1I95Zy4V.js";
89
+ import { t as grPromptDialogConfig } from "./chunks/config-C-GVBa19.js";
90
90
  import { n as grRadioSafelist, t as grRadioConfig } from "./chunks/config-DEv4m-ZP.js";
91
91
  import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "./components/GrRadio/chunks/GrRadio-BxBs3WHq.js";
92
92
  import { t as GrRadioGroup_default } from "./components/GrRadioGroup/chunks/GrRadioGroup-CEAfJQ6A.js";
93
- import { t as grRadioGroupConfig } from "./chunks/config-nfOMJXVs.js";
93
+ import { t as grRadioGroupConfig } from "./chunks/config-CgjOJ3aF.js";
94
94
  import { n as grSegmentedSafelist, t as grSegmentedConfig } from "./chunks/config-CUgvsjZx.js";
95
95
  import { t as GrSegmented_default } from "./components/GrSegmented/chunks/GrSegmented-Bwn2qOY4.js";
96
96
  import { n as grSelectSafelist, t as grSelectConfig } from "./chunks/config-R0jaXatX.js";
97
97
  import "./components/GrSelect/index.js";
98
98
  import { t as GrSidebar_default } from "./components/GrSidebar/chunks/GrSidebar-CSZ3RpFB.js";
99
- import { t as grSidebarConfig } from "./chunks/config-qJXIIY1E.js";
99
+ import { t as grSidebarConfig } from "./chunks/config-CdHY0Z7L.js";
100
100
  import { t as GrSkeleton_default } from "./components/GrSkeleton/chunks/GrSkeleton-DKXkqWDa.js";
101
- import { t as grSkeletonConfig } from "./chunks/config-C0j836dC.js";
101
+ import { t as grSkeletonConfig } from "./chunks/config-CsMIhZfM.js";
102
102
  import { n as grSwitchSafelist, t as grSwitchConfig } from "./chunks/config-CM7nbATU2.js";
103
103
  import { t as GrSwitch_default } from "./components/GrSwitch/chunks/GrSwitch-CdBxwV3k.js";
104
- import { t as grTableConfig } from "./chunks/config-Cgc-D1K4.js";
104
+ import { t as grTableConfig } from "./chunks/config-CFcv0hjb.js";
105
105
  import "./components/GrTable/index.js";
106
106
  import { t as GrTabs_default } from "./components/GrTabs/chunks/GrTabs-BpF8AAUz.js";
107
- import { t as grTabsConfig } from "./chunks/config-DmI1IQvI2.js";
107
+ import { t as grTabsConfig } from "./chunks/config-CwLoozAz2.js";
108
108
  import { n as grTextareaSafelist, t as grTextareaConfig } from "./chunks/config-CWvHiaqr2.js";
109
109
  import { t as GrTextarea_default } from "./components/GrTextarea/chunks/GrTextarea-DFS9ZkrA.js";
110
110
  import { useToast } from "./composables/useToast.js";
111
111
  import { n as grToasterSafelist, t as grToasterConfig } from "./chunks/config-BvuQUBtZ.js";
112
112
  import { t as GrToaster_default } from "./components/GrToaster/chunks/GrToaster-3Mf0Moxt.js";
113
113
  import { t as GrTooltip_default } from "./components/GrTooltip/chunks/GrTooltip-BvmsukLW.js";
114
- import { t as grTooltipConfig } from "./chunks/config-r6hzn2Bn2.js";
114
+ import { t as grTooltipConfig } from "./chunks/config-CA9XwYnZ2.js";
115
115
  import { t as GrTree_default } from "./components/GrTree/chunks/GrTree-C2kN-O4Q.js";
116
116
  import { n as grTreeSafelist, t as grTreeConfig } from "./chunks/config-DCQO6H6h.js";
117
117
  import { n as grTreeSelectSafelist, t as grTreeSelectConfig } from "./chunks/config-BNOf_qjD.js";
118
- import { t as GrTreeSelect_default } from "./components/GrTreeSelect/chunks/GrTreeSelect-Da-CpRqm.js";
118
+ import { t as GrTreeSelect_default } from "./components/GrTreeSelect/chunks/GrTreeSelect-N-oPAOFj.js";
119
119
  import { initThemeEarly, useTheme } from "./composables/useTheme.js";
120
- export { DEFAULT_GR_DIALOG_BODY_CONFIG, DEFAULT_GR_DIALOG_FOOTER_CONFIG, DEFAULT_GR_DIALOG_HEADER_CONFIG, FileValidationError, GR_COLLAPSE_CONTEXT, GR_RADIO_GROUP_CONTEXT, GrAlert_default as GrAlert, GrAvatar_default as GrAvatar, GrBadge_default as GrBadge, GrBadgeWrap_default as GrBadgeWrap, GrBottomNav_default as GrBottomNav, GrButton_default as GrButton, GrButtonGroup_default as GrButtonGroup, GrCard_default as GrCard, GrCheckbox_default as GrCheckbox, GrCollapse_default as GrCollapse, GrCollapseItem_default as GrCollapseItem, GrConfirmDialog_default as GrConfirmDialog, GrDataTable_default as GrDataTable, GrDialog_default as GrDialog, GrDialogCloseButton_default as GrDialogCloseButton, GrDialogFooter_default as GrDialogFooter, GrDialogHeader_default as GrDialogHeader, GrDrawer_default as GrDrawer, GrDropdown_default as GrDropdown, GrDropdownMenu_default as GrDropdownMenu, 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, GrEmptyState_default as GrEmptyState, GrFileUpload_default as GrFileUpload, GrFormField_default as GrFormField, GrFormFile_default as GrFormFile, GrFormSection_default as GrFormSection, GrIcon_default as GrIcon, GrImageViewer_default as GrImageViewer, GrInput_default as GrInput, GrInputTag_default as GrInputTag, GrLink_default as GrLink, GrList_default as GrList, GrListItem_default as GrListItem, GrLoading_default as GrLoading, GrModal_default as GrModal, GrNavbar_default as GrNavbar, GrNumberInput_default as GrNumberInput, GrPagination_default as GrPagination, GrProgressBar_default as GrProgressBar, GrPromptDialog_default as GrPromptDialog, GrRadio_default as GrRadio, GrRadioGroup_default as GrRadioGroup, GrSegmented_default as GrSegmented, GrSelect_default as GrSelect, GrSidebar_default as GrSidebar, GrSkeleton_default as GrSkeleton, GrSwitch_default as GrSwitch, GrTable_default as GrTable, GrTabs_default as GrTabs, GrTextarea_default as GrTextarea, GrToaster_default as GrToaster, GrTooltip_default as GrTooltip, GrTree_default as GrTree, GrTreeSelect_default as GrTreeSelect, acceptValidator, allowedExtensionsValidator, allowedMimeTypesValidator, createLoading, getGrModalPanelClass, grAlertConfig, grAvatarConfig, grAvatarSafelist, grBadgeConfig, grBadgeSafelist, grBadgeWrapConfig, grBottomNavConfig, grButtonClass, grButtonClassTokens, grButtonConfig, grButtonGroupConfig, grButtonSafelist, grCardConfig, grCheckboxConfig, grCollapseConfig, grConfirmDialogConfig, grDataTableConfig, grDialogSafelist, grDrawerConfig, grDrawerSafelist, grDropdownConfig, grDropdownMenuConfig, grDropdownSafelist, grEmptyStateConfig, grFileUploadConfig, grFormFieldConfig, grFormFileConfig, grFormSectionConfig, grIconConfig, grImageViewerConfig, grInputConfig, grInputSafelist, grInputTagConfig, grInputTagSafelist, grLinkConfig, grLinkSafelist, grListConfig, grLoadingConfig, grLoadingSafelist, grModalClassTokens, grModalConfig, grModalSafelist, grNavbarConfig, grNumberInputConfig, grNumberInputSafelist, grPaginationConfig, grProgressBarConfig, grProgressBarSafelist, grPromptDialogConfig, grRadioConfig, grRadioGroupConfig, grRadioSafelist, grSegmentedConfig, grSegmentedSafelist, grSelectConfig, grSelectSafelist, grSidebarConfig, grSkeletonConfig, grSwitchConfig, grSwitchSafelist, grTableConfig, grTabsConfig, grTextareaConfig, grTextareaSafelist, grToasterConfig, grToasterSafelist, grTooltipConfig, grTreeConfig, grTreeSafelist, grTreeSelectConfig, grTreeSelectSafelist, initThemeEarly, matchAccept, maxFileSizeBytesValidator, maxSizeMbValidator, maxTotalSizeBytesValidator, normalizeFiles, resolveGrDialogSectionConfig, resolveGrDialogTitle, runFileValidators, useTheme, useToast, vAutofocus, vAutosize, vClickOutside, vDropzone, vHotkey, vLoading };
120
+ //#region src/components/shared/tones.ts
121
+ /**
122
+ * Единый перечень дизайн-тонов для всех компонентов библиотеки.
123
+ *
124
+ * Источник истины: список объявлен как `as const`-кортеж, из которого
125
+ * автоматически выводится тип `GrTone`. Это позволяет использовать
126
+ * `GR_TONES` в рантайме (валидация, итерация, safelist) и `GrTone`
127
+ * в типах одновременно, без расхождений.
128
+ */
129
+ var GR_TONES = [
130
+ "primary",
131
+ "neutral",
132
+ "success",
133
+ "warning",
134
+ "danger",
135
+ "info",
136
+ "slate",
137
+ "azure"
138
+ ];
139
+ //#endregion
140
+ export { DEFAULT_GR_DIALOG_BODY_CONFIG, DEFAULT_GR_DIALOG_FOOTER_CONFIG, DEFAULT_GR_DIALOG_HEADER_CONFIG, FileValidationError, GR_COLLAPSE_CONTEXT, GR_RADIO_GROUP_CONTEXT, GR_TONES, GrAlert_default as GrAlert, GrAvatar_default as GrAvatar, GrBadge_default as GrBadge, GrBadgeWrap_default as GrBadgeWrap, GrBottomNav_default as GrBottomNav, GrButton_default as GrButton, GrButtonGroup_default as GrButtonGroup, GrCard_default as GrCard, GrCheckbox_default as GrCheckbox, GrCollapse_default as GrCollapse, GrCollapseItem_default as GrCollapseItem, GrConfirmDialog_default as GrConfirmDialog, GrDataTable_default as GrDataTable, GrDialog_default as GrDialog, GrDialogCloseButton_default as GrDialogCloseButton, GrDialogFooter_default as GrDialogFooter, GrDialogHeader_default as GrDialogHeader, GrDrawer_default as GrDrawer, GrDropdown_default as GrDropdown, GrDropdownMenu_default as GrDropdownMenu, 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, GrEmptyState_default as GrEmptyState, GrFileUpload_default as GrFileUpload, GrFormField_default as GrFormField, GrFormFile_default as GrFormFile, GrFormSection_default as GrFormSection, GrIcon_default as GrIcon, GrImageViewer_default as GrImageViewer, GrInput_default as GrInput, GrInputTag_default as GrInputTag, GrLink_default as GrLink, GrList_default as GrList, GrListItem_default as GrListItem, GrLoading_default as GrLoading, GrModal_default as GrModal, GrNavbar_default as GrNavbar, GrNumberInput_default as GrNumberInput, GrPagination_default as GrPagination, GrProgressBar_default as GrProgressBar, GrPromptDialog_default as GrPromptDialog, GrRadio_default as GrRadio, GrRadioGroup_default as GrRadioGroup, GrSegmented_default as GrSegmented, GrSelect_default as GrSelect, GrSidebar_default as GrSidebar, GrSkeleton_default as GrSkeleton, GrSwitch_default as GrSwitch, GrTable_default as GrTable, GrTabs_default as GrTabs, GrTextarea_default as GrTextarea, GrToaster_default as GrToaster, GrTooltip_default as GrTooltip, GrTree_default as GrTree, GrTreeSelect_default as GrTreeSelect, acceptValidator, allowedExtensionsValidator, allowedMimeTypesValidator, createLoading, getGrModalPanelClass, grAlertConfig, grAvatarConfig, grAvatarSafelist, grBadgeConfig, grBadgeSafelist, grBadgeWrapConfig, grBottomNavConfig, grButtonClass, grButtonClassTokens, grButtonConfig, grButtonGroupConfig, grButtonSafelist, grCardConfig, grCheckboxConfig, grCollapseConfig, grConfirmDialogConfig, grDataTableConfig, grDialogSafelist, grDrawerConfig, grDrawerSafelist, grDropdownConfig, grDropdownMenuConfig, grDropdownSafelist, grEmptyStateConfig, grFileUploadConfig, grFormFieldConfig, grFormFileConfig, grFormSectionConfig, grIconConfig, grImageViewerConfig, grInputConfig, grInputSafelist, grInputTagConfig, grInputTagSafelist, grLinkConfig, grLinkSafelist, grListConfig, grLoadingConfig, grLoadingSafelist, grModalClassTokens, grModalConfig, grModalSafelist, grNavbarConfig, grNumberInputConfig, grNumberInputSafelist, grPaginationConfig, grProgressBarConfig, grProgressBarSafelist, grPromptDialogConfig, grRadioConfig, grRadioGroupConfig, grRadioSafelist, grSegmentedConfig, grSegmentedSafelist, grSelectConfig, grSelectSafelist, grSidebarConfig, grSkeletonConfig, grSwitchConfig, grSwitchSafelist, grTableConfig, grTabsConfig, grTextareaConfig, grTextareaSafelist, grToasterConfig, grToasterSafelist, grTooltipConfig, grTreeConfig, grTreeSafelist, grTreeSelectConfig, grTreeSelectSafelist, initThemeEarly, matchAccept, maxFileSizeBytesValidator, maxSizeMbValidator, maxTotalSizeBytesValidator, normalizeFiles, resolveGrDialogSectionConfig, resolveGrDialogTitle, runFileValidators, useTheme, useToast, vAutofocus, vAutosize, vClickOutside, vDropzone, vHotkey, vLoading };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/shared/tones.ts"],"sourcesContent":["/**\n * Единый перечень дизайн-тонов для всех компонентов библиотеки.\n *\n * Источник истины: список объявлен как `as const`-кортеж, из которого\n * автоматически выводится тип `GrTone`. Это позволяет использовать\n * `GR_TONES` в рантайме (валидация, итерация, safelist) и `GrTone`\n * в типах одновременно, без расхождений.\n */\nexport const GR_TONES = [\n 'primary',\n 'neutral',\n 'success',\n 'warning',\n 'danger',\n 'info',\n 'slate',\n 'azure',\n] as const\n\nexport type GrTone = typeof GR_TONES[number]\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAa,WAAW;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
@@ -1,4 +1,5 @@
1
- export type GrAlertTone = 'info' | 'success' | 'warning' | 'danger' | 'slate' | 'azure';
1
+ import type { GrTone } from '../shared/tones';
2
+ export type GrAlertTone = GrTone;
2
3
  export type GrAlertVariant = 'soft' | 'light';
3
4
  type __VLS_Props = {
4
5
  tone?: GrAlertTone;
@@ -1,4 +1,5 @@
1
- export type GrBadgeTone = 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'slate' | 'azure';
1
+ import type { GrTone } from '../shared/tones';
2
+ export type GrBadgeTone = GrTone;
2
3
  export type GrBadgeSize = 'sm' | 'md' | 'lg';
3
4
  export type GrBadgeRadius = 'square' | 'semi' | 'round';
4
5
  export declare const sizeClassBySize: Record<GrBadgeSize, string>;
@@ -1,5 +1,6 @@
1
+ import type { GrTone } from '../shared/tones';
1
2
  export type GrButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'ghost-border';
2
- export type GrButtonTone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'slate' | 'azure';
3
+ export type GrButtonTone = GrTone;
3
4
  export type GrButtonSize = 'xs' | 'sm' | 'md' | 'lg';
4
5
  export type GrButtonClassOptions = {
5
6
  variant: GrButtonVariant;
@@ -1,2 +1,3 @@
1
- export type GrProgressBarTone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'slate' | 'azure';
1
+ import type { GrTone } from '../shared/tones';
2
+ export type GrProgressBarTone = GrTone;
2
3
  export declare function grProgressBarFillClass(tone: GrProgressBarTone): string;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Единый перечень дизайн-тонов для всех компонентов библиотеки.
3
+ *
4
+ * Источник истины: список объявлен как `as const`-кортеж, из которого
5
+ * автоматически выводится тип `GrTone`. Это позволяет использовать
6
+ * `GR_TONES` в рантайме (валидация, итерация, safelist) и `GrTone`
7
+ * в типах одновременно, без расхождений.
8
+ */
9
+ export declare const GR_TONES: readonly ["primary", "neutral", "success", "warning", "danger", "info", "slate", "azure"];
10
+ export type GrTone = typeof GR_TONES[number];
@@ -1,4 +1,5 @@
1
- export type GrToastTone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'slate' | 'azure';
1
+ import type { GrTone } from '../components/shared/tones';
2
+ export type GrToastTone = GrTone;
2
3
  export type ToastInput = {
3
4
  title: string;
4
5
  message?: string;
@@ -50,5 +50,7 @@ export { initThemeEarly, useTheme } from './composables/useTheme';
50
50
  export type { ThemeName, UseThemeOptions } from './composables/useTheme';
51
51
  export { useToast } from './composables/useToast';
52
52
  export type { GrToastTone, Toast, ToastInput } from './composables/useToast';
53
+ export { GR_TONES } from './components/shared/tones';
54
+ export type { GrTone } from './components/shared/tones';
53
55
  export type * from './fileValidation/types';
54
56
  export * from './directives';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feugene/granularity",
3
3
  "description": "Granularity design system package with Vue 3 components, consumed via the `@feugene/unocss-preset-granular` preset.",
4
- "version": "0.4.5",
4
+ "version": "0.5.0",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
7
7
  "name": "Evgeniy Fureev",
@@ -305,12 +305,12 @@
305
305
  }
306
306
  },
307
307
  "peerDependencies": {
308
- "@feugene/unocss-preset-granular": "^0.2.0",
308
+ "@feugene/unocss-preset-granular": "^0.3.0",
309
309
  "vue": "^3.5.32"
310
310
  },
311
311
  "devDependencies": {
312
312
  "@antfu/eslint-config": "^8.2.0",
313
- "@feugene/unocss-preset-granular": "^0.2.0",
313
+ "@feugene/unocss-preset-granular": "^0.3.0",
314
314
  "@iconify-json/lucide": "^1.2.101",
315
315
  "@types/node": "^25.5.2",
316
316
  "@unocss/eslint-plugin": "^66.6.8",
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-2wgwWaAB.js","names":[],"sources":["../../src/components/GrIcon/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grIconConfig = defineGranularComponent(import.meta.url, {\n name: 'GrIcon',\n safelist: [],\n})"],"mappings":";;AAEA,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACjE,MAAM;CACN,UAAU,EAAE;CACf,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-BA0BWYzs.js","names":[],"sources":["../../src/components/GrImageViewer/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grImageViewerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrImageViewer',\n // Литералы из шаблона UnoCSS находит сканом — safelist не нужен.\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,sBAAsB,wBAAwB,OAAO,KAAK,KAAK;CAC1E,MAAM;CAEN,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-BKRmlivc.js","names":[],"sources":["../../src/components/GrBottomNav/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grBottomNavConfig = defineGranularComponent(import.meta.url, {\n name: 'GrBottomNav',\n safelist: [],\n})"],"mappings":";;AAEA,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACtE,MAAM;CACN,UAAU,EAAE;CACf,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-C0j836dC.js","names":[],"sources":["../../src/components/GrSkeleton/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grSkeletonConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSkeleton',\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,mBAAmB,wBAAwB,OAAO,KAAK,KAAK;CACvE,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-C5SJXHQ4.js","names":[],"sources":["../../src/components/GrFormFile/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grFormFileConfig = defineGranularComponent(import.meta.url, {\n name: 'GrFormFile',\n dependencies: ['GrButton', 'GrIcon'],\n // Литералы из шаблона UnoCSS находит сканом — safelist не нужен.\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,mBAAmB,wBAAwB,OAAO,KAAK,KAAK;CACvE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CAEpC,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-C6SBJxcH.js","names":[],"sources":["../../src/components/GrAlert/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grAlertConfig = defineGranularComponent(import.meta.url, {\n name: 'GrAlert',\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,gBAAgB,wBAAwB,OAAO,KAAK,KAAK;CAClE,MAAM;CACN,UAAU,EAAE;CACf,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CByfsV-z2.js","names":[],"sources":["../../src/components/GrFileUpload/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grFileUploadConfig = defineGranularComponent(import.meta.url, {\n name: 'GrFileUpload',\n dependencies: ['GrIcon'],\n // Литералы из шаблона UnoCSS находит сканом — safelist не нужен.\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,qBAAqB,wBAAwB,OAAO,KAAK,KAAK;CACzE,MAAM;CACN,cAAc,CAAC,SAAS;CAExB,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CMZE2fu0.js","names":[],"sources":["../../src/components/GrDataTable/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\n// safelist пустой — все классы прописаны литералами в шаблоне, UnoCSS находит сканом\nexport const grDataTableConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDataTable',\n safelist: [],\n dependencies: ['GrTable', 'GrIcon'],\n})\n"],"mappings":";;AAGA,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU,EAAE;CACZ,cAAc,CAAC,WAAW,SAAS;CACpC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DW_RqmUp.js","names":[],"sources":["../../src/components/GrBadgeWrap/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grBadgeWrapConfig = defineGranularComponent(import.meta.url, {\n name: 'GrBadgeWrap',\n safelist: [],\n})"],"mappings":";;AAEA,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU,EAAE;CACb,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DmI1IQvI2.js","names":[],"sources":["../../src/components/GrTabs/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grTabsConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTabs',\n safelist: []\n})\n"],"mappings":";;AAEA,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACjE,MAAM;CACN,UAAU,EAAE;CACf,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-Dnu4VuO0.js","names":[],"sources":["../../src/components/GrFormField/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grFormFieldConfig = defineGranularComponent(import.meta.url, {\n name: 'GrFormField',\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-TyzU6gLf.js","names":[],"sources":["../../src/components/GrCheckbox/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grCheckboxConfig = defineGranularComponent(import.meta.url, {\n name: 'GrCheckbox',\n safelist: [],\n})"],"mappings":";;AAEA,IAAa,mBAAmB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,UAAU,EAAE;CACf,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-etXh7Bsr2.js","names":[],"sources":["../../src/components/GrDropdownMenu/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grDropdownMenuConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDropdownMenu',\n dependencies: ['GrDropdown'],\n // Все токены прописаны статически в шаблонах подкомпонентов — UnoCSS находит их сканом.\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,uBAAuB,wBAAwB,OAAO,KAAK,KAAK;CAC3E,MAAM;CACN,cAAc,CAAC,aAAa;CAE5B,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-qJXIIY1E.js","names":[],"sources":["../../src/components/GrSidebar/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grSidebarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSidebar',\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,kBAAkB,wBAAwB,OAAO,KAAK,KAAK;CACtE,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-rQlbnEKn.js","names":[],"sources":["../../src/components/GrCard/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grCardConfig = defineGranularComponent(import.meta.url, {\n name: 'GrCard',\n safelist: [],\n})\n"],"mappings":";;AAEA,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACnE,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrAlert-BjerGcU8.js","names":[],"sources":["../../../../src/components/GrAlert/GrAlert.vue","../../../../src/components/GrAlert/GrAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport IconWarning from '~icons/lucide/alert-triangle'\nimport IconCheck from '~icons/lucide/check-circle'\nimport IconInfo from '~icons/lucide/info'\nimport IconClose from '~icons/lucide/x'\nimport IconError from '~icons/lucide/x-circle'\n\nexport type GrAlertTone = 'info' | 'success' | 'warning' | 'danger' | 'slate' | 'azure'\nexport type GrAlertVariant = 'soft' | 'light'\n\ntype GrAlertResolvedStyles = {\n bg: string\n border: string\n icon: string\n title: string\n text: string\n close: string\n closeHover: string\n Icon: unknown\n}\n\nconst DEFAULT_TEXT_COLORS = {\n title: 'var(--fg)',\n text: 'var(--muted-fg)',\n close: 'var(--muted-fg)',\n closeHover: 'var(--fg)',\n} as const\n\nconst WARNING_LIGHT_TEXT_COLOR = '#92400e'\n\nconst emit = defineEmits<{\n (event: 'close'): void\n}>()\n\nconst props = withDefaults(defineProps<{\n tone?: GrAlertTone\n variant?: GrAlertVariant\n title?: string\n closable?: boolean\n backgroundColor?: string\n textColor?: string\n borderColor?: string\n}>(), {\n tone: 'info',\n variant: 'soft',\n title: undefined,\n closable: false,\n backgroundColor: undefined,\n textColor: undefined,\n borderColor: undefined,\n})\n\nconst getCustomColor = (value?: string) => value?.trim() || undefined\n\nconst SOFT_TONE_STYLES: Record<GrAlertTone, GrAlertResolvedStyles> = {\n info: {\n bg: 'var(--ds-info-light)',\n border: 'color-mix(in srgb, var(--ds-info) 22%, var(--brd))',\n icon: 'var(--ds-info)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconInfo,\n },\n success: {\n bg: 'var(--ds-success-light)',\n border: 'color-mix(in srgb, var(--ds-success) 22%, var(--brd))',\n icon: 'var(--ds-success)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconCheck,\n },\n warning: {\n bg: 'var(--ds-warning-light)',\n border: 'color-mix(in srgb, var(--ds-warning) 22%, var(--brd))',\n icon: 'var(--ds-warning)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconWarning,\n },\n danger: {\n bg: 'var(--ds-danger-light)',\n border: 'color-mix(in srgb, var(--ds-danger) 22%, var(--brd))',\n icon: 'var(--ds-danger)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconError,\n },\n slate: {\n bg: 'var(--ds-slate-light)',\n border: 'color-mix(in srgb, var(--ds-slate) 22%, var(--brd))',\n icon: 'var(--ds-slate)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconInfo,\n },\n azure: {\n bg: 'var(--ds-azure-light)',\n border: 'color-mix(in srgb, var(--ds-azure) 22%, var(--brd))',\n icon: 'var(--ds-azure)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconInfo,\n },\n}\n\nconst LIGHT_TONE_STYLES: Partial<Record<GrAlertTone, GrAlertResolvedStyles>> = {\n warning: {\n bg: '#fffbeb',\n border: '#fcd34d',\n icon: WARNING_LIGHT_TEXT_COLOR,\n title: WARNING_LIGHT_TEXT_COLOR,\n text: WARNING_LIGHT_TEXT_COLOR,\n close: WARNING_LIGHT_TEXT_COLOR,\n closeHover: WARNING_LIGHT_TEXT_COLOR,\n Icon: IconWarning,\n },\n}\n\nconst styles = computed<GrAlertResolvedStyles>(() => {\n const base = (props.variant === 'light' ? LIGHT_TONE_STYLES[props.tone] : undefined) ?? SOFT_TONE_STYLES[props.tone]\n const customTextColor = getCustomColor(props.textColor)\n\n return {\n ...base,\n bg: getCustomColor(props.backgroundColor) ?? base.bg,\n border: getCustomColor(props.borderColor) ?? base.border,\n icon: customTextColor ?? base.icon,\n title: customTextColor ?? base.title,\n text: customTextColor ?? base.text,\n close: customTextColor ?? base.close,\n closeHover: customTextColor ?? base.closeHover,\n }\n})\n\nconst rootStyle = computed(() => ({\n '--ds-alert-bg': styles.value.bg,\n '--ds-alert-brd': styles.value.border,\n '--ds-alert-icon-color': styles.value.icon,\n '--ds-alert-title-color': styles.value.title,\n '--ds-alert-text-color': styles.value.text,\n '--ds-alert-close-color': styles.value.close,\n '--ds-alert-close-hover-color': styles.value.closeHover,\n background: 'var(--ds-alert-bg)',\n borderColor: 'var(--ds-alert-brd)',\n}))\n</script>\n\n<template>\n <div\n role=\"alert\"\n class=\"rounded-[var(--ds-radius-lg)] border px-4 py-3\"\n :style=\"rootStyle\"\n >\n <div class=\"flex items-start gap-3\">\n <component :is=\"styles.Icon\" class=\"mt-0.5 h-5 w-5 text-[var(--ds-alert-icon-color)]\" aria-hidden=\"true\" />\n <div class=\"min-w-0 flex-1\">\n <div v-if=\"props.title\" class=\"text-[14px] font-700 text-[var(--ds-alert-title-color)]\">\n {{ props.title }}\n </div>\n <div class=\"mt-0.5 text-[13px] text-[var(--ds-alert-text-color)]\">\n <slot />\n </div>\n </div>\n\n <button\n v-if=\"props.closable\"\n type=\"button\"\n class=\"-mr-1 -mt-1 rounded-[var(--ds-radius-md)] p-1 text-[var(--ds-alert-close-color)] transition-colors hover:text-[var(--ds-alert-close-hover-color)]\"\n aria-label=\"Close\"\n @click=\"emit('close')\"\n >\n <IconClose class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport IconWarning from '~icons/lucide/alert-triangle'\nimport IconCheck from '~icons/lucide/check-circle'\nimport IconInfo from '~icons/lucide/info'\nimport IconClose from '~icons/lucide/x'\nimport IconError from '~icons/lucide/x-circle'\n\nexport type GrAlertTone = 'info' | 'success' | 'warning' | 'danger' | 'slate' | 'azure'\nexport type GrAlertVariant = 'soft' | 'light'\n\ntype GrAlertResolvedStyles = {\n bg: string\n border: string\n icon: string\n title: string\n text: string\n close: string\n closeHover: string\n Icon: unknown\n}\n\nconst DEFAULT_TEXT_COLORS = {\n title: 'var(--fg)',\n text: 'var(--muted-fg)',\n close: 'var(--muted-fg)',\n closeHover: 'var(--fg)',\n} as const\n\nconst WARNING_LIGHT_TEXT_COLOR = '#92400e'\n\nconst emit = defineEmits<{\n (event: 'close'): void\n}>()\n\nconst props = withDefaults(defineProps<{\n tone?: GrAlertTone\n variant?: GrAlertVariant\n title?: string\n closable?: boolean\n backgroundColor?: string\n textColor?: string\n borderColor?: string\n}>(), {\n tone: 'info',\n variant: 'soft',\n title: undefined,\n closable: false,\n backgroundColor: undefined,\n textColor: undefined,\n borderColor: undefined,\n})\n\nconst getCustomColor = (value?: string) => value?.trim() || undefined\n\nconst SOFT_TONE_STYLES: Record<GrAlertTone, GrAlertResolvedStyles> = {\n info: {\n bg: 'var(--ds-info-light)',\n border: 'color-mix(in srgb, var(--ds-info) 22%, var(--brd))',\n icon: 'var(--ds-info)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconInfo,\n },\n success: {\n bg: 'var(--ds-success-light)',\n border: 'color-mix(in srgb, var(--ds-success) 22%, var(--brd))',\n icon: 'var(--ds-success)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconCheck,\n },\n warning: {\n bg: 'var(--ds-warning-light)',\n border: 'color-mix(in srgb, var(--ds-warning) 22%, var(--brd))',\n icon: 'var(--ds-warning)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconWarning,\n },\n danger: {\n bg: 'var(--ds-danger-light)',\n border: 'color-mix(in srgb, var(--ds-danger) 22%, var(--brd))',\n icon: 'var(--ds-danger)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconError,\n },\n slate: {\n bg: 'var(--ds-slate-light)',\n border: 'color-mix(in srgb, var(--ds-slate) 22%, var(--brd))',\n icon: 'var(--ds-slate)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconInfo,\n },\n azure: {\n bg: 'var(--ds-azure-light)',\n border: 'color-mix(in srgb, var(--ds-azure) 22%, var(--brd))',\n icon: 'var(--ds-azure)',\n ...DEFAULT_TEXT_COLORS,\n Icon: IconInfo,\n },\n}\n\nconst LIGHT_TONE_STYLES: Partial<Record<GrAlertTone, GrAlertResolvedStyles>> = {\n warning: {\n bg: '#fffbeb',\n border: '#fcd34d',\n icon: WARNING_LIGHT_TEXT_COLOR,\n title: WARNING_LIGHT_TEXT_COLOR,\n text: WARNING_LIGHT_TEXT_COLOR,\n close: WARNING_LIGHT_TEXT_COLOR,\n closeHover: WARNING_LIGHT_TEXT_COLOR,\n Icon: IconWarning,\n },\n}\n\nconst styles = computed<GrAlertResolvedStyles>(() => {\n const base = (props.variant === 'light' ? LIGHT_TONE_STYLES[props.tone] : undefined) ?? SOFT_TONE_STYLES[props.tone]\n const customTextColor = getCustomColor(props.textColor)\n\n return {\n ...base,\n bg: getCustomColor(props.backgroundColor) ?? base.bg,\n border: getCustomColor(props.borderColor) ?? base.border,\n icon: customTextColor ?? base.icon,\n title: customTextColor ?? base.title,\n text: customTextColor ?? base.text,\n close: customTextColor ?? base.close,\n closeHover: customTextColor ?? base.closeHover,\n }\n})\n\nconst rootStyle = computed(() => ({\n '--ds-alert-bg': styles.value.bg,\n '--ds-alert-brd': styles.value.border,\n '--ds-alert-icon-color': styles.value.icon,\n '--ds-alert-title-color': styles.value.title,\n '--ds-alert-text-color': styles.value.text,\n '--ds-alert-close-color': styles.value.close,\n '--ds-alert-close-hover-color': styles.value.closeHover,\n background: 'var(--ds-alert-bg)',\n borderColor: 'var(--ds-alert-brd)',\n}))\n</script>\n\n<template>\n <div\n role=\"alert\"\n class=\"rounded-[var(--ds-radius-lg)] border px-4 py-3\"\n :style=\"rootStyle\"\n >\n <div class=\"flex items-start gap-3\">\n <component :is=\"styles.Icon\" class=\"mt-0.5 h-5 w-5 text-[var(--ds-alert-icon-color)]\" aria-hidden=\"true\" />\n <div class=\"min-w-0 flex-1\">\n <div v-if=\"props.title\" class=\"text-[14px] font-700 text-[var(--ds-alert-title-color)]\">\n {{ props.title }}\n </div>\n <div class=\"mt-0.5 text-[13px] text-[var(--ds-alert-text-color)]\">\n <slot />\n </div>\n </div>\n\n <button\n v-if=\"props.closable\"\n type=\"button\"\n class=\"-mr-1 -mt-1 rounded-[var(--ds-radius-md)] p-1 text-[var(--ds-alert-close-color)] transition-colors hover:text-[var(--ds-alert-close-hover-color)]\"\n aria-label=\"Close\"\n @click=\"emit('close')\"\n >\n <IconClose class=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n</template>"],"mappings":";;;;;;;;;;;;AA8BA,IAAM,2BAA2B;;;;;;;;;;;;;;;;;;;EAPjC,MAAM,sBAAsB;GAC1B,OAAO;GACP,MAAM;GACN,OAAO;GACP,YAAY;GACb;EAID,MAAM,OAAO;EAIb,MAAM,QAAQ;EAkBd,MAAM,kBAAkB,UAAmB,OAAO,MAAM,IAAI,KAAA;EAE5D,MAAM,mBAA+D;GACnE,MAAM;IACJ,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,GAAG;IACH,MAAM;IACP;GACD,SAAS;IACP,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,GAAG;IACH,MAAM;IACP;GACD,SAAS;IACP,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,GAAG;IACH,MAAM;IACP;GACD,QAAQ;IACN,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,GAAG;IACH,MAAM;IACP;GACD,OAAO;IACL,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,GAAG;IACH,MAAM;IACP;GACD,OAAO;IACL,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,GAAG;IACH,MAAM;IACP;GACH;EAEA,MAAM,oBAAyE,EAC7E,SAAS;GACP,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,OAAO;GACP,MAAM;GACN,OAAO;GACP,YAAY;GACZ,MAAM;GACP,EACH;EAEA,MAAM,SAAS,eAAsC;GACnD,MAAM,QAAQ,MAAM,YAAY,UAAU,kBAAkB,MAAM,QAAQ,KAAA,MAAc,iBAAiB,MAAM;GAC/G,MAAM,kBAAkB,eAAe,MAAM,UAAS;AAEtD,UAAO;IACL,GAAG;IACH,IAAI,eAAe,MAAM,gBAAgB,IAAI,KAAK;IAClD,QAAQ,eAAe,MAAM,YAAY,IAAI,KAAK;IAClD,MAAM,mBAAmB,KAAK;IAC9B,OAAO,mBAAmB,KAAK;IAC/B,MAAM,mBAAmB,KAAK;IAC9B,OAAO,mBAAmB,KAAK;IAC/B,YAAY,mBAAmB,KAAK;IACtC;IACD;EAED,MAAM,YAAY,gBAAgB;GAChC,iBAAiB,OAAO,MAAM;GAC9B,kBAAkB,OAAO,MAAM;GAC/B,yBAAyB,OAAO,MAAM;GACtC,0BAA0B,OAAO,MAAM;GACvC,yBAAyB,OAAO,MAAM;GACtC,0BAA0B,OAAO,MAAM;GACvC,gCAAgC,OAAO,MAAM;GAC7C,YAAY;GACZ,aAAa;GACd,EAAC;;uBAIA,mBA0BM,OAAA;IAzBJ,MAAK;IACL,OAAM;IACL,OAAK,eAAE,UAAA,MAAS;OAEjB,mBAoBM,OApBN,YAoBM;kBAnBJ,YAA2G,wBAA3F,OAAA,MAAO,KAAI,EAAA;KAAE,OAAM;KAAmD,eAAY;;IAClG,mBAOM,OAPN,YAOM,CANO,MAAM,SAAA,WAAA,EAAjB,mBAEM,OAFN,YAEM,gBADD,MAAM,MAAK,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA,EAEhB,mBAEM,OAFN,YAEM,CADJ,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA,CAAA,CAAA;IAKJ,MAAM,YAAA,WAAA,EADd,mBAQS,UAAA;;KANP,MAAK;KACL,OAAM;KACN,cAAW;KACV,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAA;QAEZ,YAAgD,MAAA,UAAA,EAAA;KAArC,OAAM;KAAU,eAAY"}