@auronui/vue 1.0.16 → 1.0.18
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.
- package/dist/cjs/index.cjs +783 -478
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/components/accordion/Accordion.js.map +1 -1
- package/dist/components/accordion/Accordion.vue_vue_type_script_setup_true_lang.js +26 -3
- package/dist/components/accordion/Accordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatar/AvatarGroup.js.map +1 -1
- package/dist/components/avatar/AvatarGroup.vue_vue_type_script_setup_true_lang.js +23 -4
- package/dist/components/avatar/AvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.vue_vue_type_script_setup_true_lang.js +26 -4
- package/dist/components/breadcrumbs/Breadcrumbs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/button/Button.vue_vue_type_script_setup_true_lang.js +53 -2
- package/dist/components/button/Button.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/button/ButtonGroup.js.map +1 -1
- package/dist/components/button/ButtonGroup.vue_vue_type_script_setup_true_lang.js +28 -4
- package/dist/components/button/ButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/button/ToggleButtonGroup.js.map +1 -1
- package/dist/components/button/ToggleButtonGroup.vue_vue_type_script_setup_true_lang.js +21 -3
- package/dist/components/button/ToggleButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/button/button-group.context.js.map +1 -1
- package/dist/components/checkbox/CheckboxGroup.js.map +1 -1
- package/dist/components/checkbox/CheckboxGroup.vue_vue_type_script_setup_true_lang.js +14 -3
- package/dist/components/checkbox/CheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/collapsible/CollapsibleGroup.js.map +1 -1
- package/dist/components/collapsible/CollapsibleGroup.vue_vue_type_script_setup_true_lang.js +22 -3
- package/dist/components/collapsible/CollapsibleGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/list-box/ListBox.js.map +1 -1
- package/dist/components/list-box/ListBox.vue_vue_type_script_setup_true_lang.js +19 -3
- package/dist/components/list-box/ListBox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/modal/ModalContent.js.map +1 -1
- package/dist/components/modal/ModalContent.vue_vue_type_script_setup_true_lang.js +4 -3
- package/dist/components/modal/ModalContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/radio/RadioGroup.js.map +1 -1
- package/dist/components/radio/RadioGroup.vue_vue_type_script_setup_true_lang.js +14 -3
- package/dist/components/radio/RadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/select/SelectContent.js.map +1 -1
- package/dist/components/select/SelectContent.vue_vue_type_script_setup_true_lang.js +5 -1
- package/dist/components/select/SelectContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/select/SelectTrigger.js.map +1 -1
- package/dist/components/select/SelectTrigger.vue_vue_type_script_setup_true_lang.js +16 -2
- package/dist/components/select/SelectTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/stepper/Stepper.vue_vue_type_script_setup_true_lang.js +37 -5
- package/dist/components/stepper/Stepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/switch/SwitchGroup.js.map +1 -1
- package/dist/components/switch/SwitchGroup.vue_vue_type_script_setup_true_lang.js +14 -3
- package/dist/components/switch/SwitchGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/tabs/Tabs.vue_vue_type_script_setup_true_lang.js +30 -3
- package/dist/components/tabs/Tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/toolbar/ToolbarToggleGroup.js.map +1 -1
- package/dist/components/toolbar/ToolbarToggleGroup.vue_vue_type_script_setup_true_lang.js +25 -3
- package/dist/components/toolbar/ToolbarToggleGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/index.d.ts +128 -2
- package/dist/index.js +7 -7
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.js","names":[],"sources":["../../../src/components/accordion/Accordion.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { AccordionRoot } from 'reka-ui'\nimport { accordionVariants, type AccordionVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useAccordionProvide } from './accordion.context'\n\ntype SingleValue = string\ntype MultipleValue = string[]\n\nconst props = withDefaults(defineProps<{\n type: 'single' | 'multiple'\n modelValue?: SingleValue | MultipleValue\n defaultValue?: SingleValue | MultipleValue\n collapsible?: boolean\n disabled?: boolean\n variant?: AccordionVariants['variant']\n size?: AccordionVariants['size']\n class?: ClassValue\n /** Override classes for any slot */\n classNames?: Partial<{\n base: ClassValue\n }>\n}>(), {\n collapsible: true,\n disabled: false,\n variant: 'default',\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: SingleValue | MultipleValue]\n}>()\n\nconst slotFns = computed(() => accordionVariants({ variant: props.variant, size: props.size }))\n\nuseAccordionProvide({ slotFns })\n</script>\n\n<template>\n <AccordionRoot\n :type=\"props.type\"\n :model-value=\"props.modelValue\"\n :default-value=\"props.defaultValue\"\n :collapsible=\"props.collapsible\"\n :disabled=\"props.disabled\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n @update:model-value=\"(v: SingleValue | MultipleValue | undefined) => { if (v !== undefined) emit('update:modelValue', v) }\"\n >\n <slot />\n </AccordionRoot>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Accordion.js","names":[],"sources":["../../../src/components/accordion/Accordion.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { AccordionRoot } from 'reka-ui'\nimport { accordionVariants, type AccordionVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useAccordionProvide } from './accordion.context'\nimport AccordionItem from './AccordionItem.vue'\nimport AccordionHeader from './AccordionHeader.vue'\nimport AccordionTrigger from './AccordionTrigger.vue'\nimport AccordionContent from './AccordionContent.vue'\n\ntype SingleValue = string\ntype MultipleValue = string[]\ntype AccordionShorthandItem = { value: string; title: string; content?: string; disabled?: boolean }\n\nconst props = withDefaults(defineProps<{\n type: 'single' | 'multiple'\n modelValue?: SingleValue | MultipleValue\n defaultValue?: SingleValue | MultipleValue\n collapsible?: boolean\n disabled?: boolean\n variant?: AccordionVariants['variant']\n size?: AccordionVariants['size']\n class?: ClassValue\n /** Override classes for any slot */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render items from an array instead of the compound slot API */\n items?: AccordionShorthandItem[]\n}>(), {\n\n collapsible: true,\n disabled: false,\n variant: 'default',\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: SingleValue | MultipleValue]\n}>()\n\nconst slotFns = computed(() => accordionVariants({ variant: props.variant, size: props.size }))\n\nuseAccordionProvide({ slotFns })\n</script>\n\n<template>\n <AccordionRoot\n :type=\"props.type\"\n :model-value=\"props.modelValue\"\n :default-value=\"props.defaultValue\"\n :collapsible=\"props.collapsible\"\n :disabled=\"props.disabled\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n @update:model-value=\"(v: SingleValue | MultipleValue | undefined) => { if (v !== undefined) emit('update:modelValue', v) }\"\n >\n <template v-if=\"props.items\">\n <AccordionItem\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n <AccordionHeader>\n <AccordionTrigger>{{ item.title }}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent>{{ item.content }}</AccordionContent>\n </AccordionItem>\n </template>\n <slot v-else />\n </AccordionRoot>\n</template>\n"],"mappings":""}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { composeClassName } from "../../utils/composeClassName.js";
|
|
2
2
|
import { useAccordionProvide } from "./accordion.context.js";
|
|
3
|
-
import
|
|
3
|
+
import AccordionItem_default from "./AccordionItem.js";
|
|
4
|
+
import AccordionHeader_default from "./AccordionHeader.js";
|
|
5
|
+
import AccordionTrigger_default from "./AccordionTrigger.js";
|
|
6
|
+
import AccordionContent_default from "./AccordionContent.js";
|
|
7
|
+
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderList, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
4
8
|
import { accordionVariants } from "@auronui/styles";
|
|
5
9
|
import { AccordionRoot } from "reka-ui";
|
|
6
10
|
//#region src/components/accordion/Accordion.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -27,7 +31,8 @@ var Accordion_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
|
|
|
27
31
|
Object,
|
|
28
32
|
Array
|
|
29
33
|
] },
|
|
30
|
-
classNames: {}
|
|
34
|
+
classNames: {},
|
|
35
|
+
items: {}
|
|
31
36
|
},
|
|
32
37
|
emits: ["update:modelValue"],
|
|
33
38
|
setup(__props, { emit: __emit }) {
|
|
@@ -50,7 +55,25 @@ var Accordion_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
|
|
|
50
55
|
if (v !== void 0) emit("update:modelValue", v);
|
|
51
56
|
})
|
|
52
57
|
}, {
|
|
53
|
-
default: withCtx(() => [
|
|
58
|
+
default: withCtx(() => [props.items ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(props.items, (item) => {
|
|
59
|
+
return openBlock(), createBlock(AccordionItem_default, {
|
|
60
|
+
key: item.value,
|
|
61
|
+
value: item.value,
|
|
62
|
+
disabled: item.disabled
|
|
63
|
+
}, {
|
|
64
|
+
default: withCtx(() => [createVNode(AccordionHeader_default, null, {
|
|
65
|
+
default: withCtx(() => [createVNode(AccordionTrigger_default, null, {
|
|
66
|
+
default: withCtx(() => [createTextVNode(toDisplayString(item.title), 1)]),
|
|
67
|
+
_: 2
|
|
68
|
+
}, 1024)]),
|
|
69
|
+
_: 2
|
|
70
|
+
}, 1024), createVNode(AccordionContent_default, null, {
|
|
71
|
+
default: withCtx(() => [createTextVNode(toDisplayString(item.content), 1)]),
|
|
72
|
+
_: 2
|
|
73
|
+
}, 1024)]),
|
|
74
|
+
_: 2
|
|
75
|
+
}, 1032, ["value", "disabled"]);
|
|
76
|
+
}), 128)) : renderSlot(_ctx.$slots, "default", { key: 1 })]),
|
|
54
77
|
_: 3
|
|
55
78
|
}, 8, [
|
|
56
79
|
"type",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/accordion/Accordion.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { AccordionRoot } from 'reka-ui'\nimport { accordionVariants, type AccordionVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useAccordionProvide } from './accordion.context'\n\ntype SingleValue = string\ntype MultipleValue = string[]\n\nconst props = withDefaults(defineProps<{\n type: 'single' | 'multiple'\n modelValue?: SingleValue | MultipleValue\n defaultValue?: SingleValue | MultipleValue\n collapsible?: boolean\n disabled?: boolean\n variant?: AccordionVariants['variant']\n size?: AccordionVariants['size']\n class?: ClassValue\n /** Override classes for any slot */\n classNames?: Partial<{\n base: ClassValue\n }>\n}>(), {\n collapsible: true,\n disabled: false,\n variant: 'default',\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: SingleValue | MultipleValue]\n}>()\n\nconst slotFns = computed(() => accordionVariants({ variant: props.variant, size: props.size }))\n\nuseAccordionProvide({ slotFns })\n</script>\n\n<template>\n <AccordionRoot\n :type=\"props.type\"\n :model-value=\"props.modelValue\"\n :default-value=\"props.defaultValue\"\n :collapsible=\"props.collapsible\"\n :disabled=\"props.disabled\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n @update:model-value=\"(v: SingleValue | MultipleValue | undefined) => { if (v !== undefined) emit('update:modelValue', v) }\"\n >\n <slot />\n </AccordionRoot>\n</template>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Accordion.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/accordion/Accordion.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { AccordionRoot } from 'reka-ui'\nimport { accordionVariants, type AccordionVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useAccordionProvide } from './accordion.context'\nimport AccordionItem from './AccordionItem.vue'\nimport AccordionHeader from './AccordionHeader.vue'\nimport AccordionTrigger from './AccordionTrigger.vue'\nimport AccordionContent from './AccordionContent.vue'\n\ntype SingleValue = string\ntype MultipleValue = string[]\ntype AccordionShorthandItem = { value: string; title: string; content?: string; disabled?: boolean }\n\nconst props = withDefaults(defineProps<{\n type: 'single' | 'multiple'\n modelValue?: SingleValue | MultipleValue\n defaultValue?: SingleValue | MultipleValue\n collapsible?: boolean\n disabled?: boolean\n variant?: AccordionVariants['variant']\n size?: AccordionVariants['size']\n class?: ClassValue\n /** Override classes for any slot */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render items from an array instead of the compound slot API */\n items?: AccordionShorthandItem[]\n}>(), {\n\n collapsible: true,\n disabled: false,\n variant: 'default',\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: SingleValue | MultipleValue]\n}>()\n\nconst slotFns = computed(() => accordionVariants({ variant: props.variant, size: props.size }))\n\nuseAccordionProvide({ slotFns })\n</script>\n\n<template>\n <AccordionRoot\n :type=\"props.type\"\n :model-value=\"props.modelValue\"\n :default-value=\"props.defaultValue\"\n :collapsible=\"props.collapsible\"\n :disabled=\"props.disabled\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n @update:model-value=\"(v: SingleValue | MultipleValue | undefined) => { if (v !== undefined) emit('update:modelValue', v) }\"\n >\n <template v-if=\"props.items\">\n <AccordionItem\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n <AccordionHeader>\n <AccordionTrigger>{{ item.title }}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent>{{ item.content }}</AccordionContent>\n </AccordionItem>\n </template>\n <slot v-else />\n </AccordionRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAuBd,MAAM,OAAO;EAIb,MAAM,UAAU,eAAe,kBAAkB;GAAE,SAAS,MAAM;GAAS,MAAM,MAAM;GAAM,CAAC,CAAA;AAE9F,sBAAoB,EAAE,SAAS,CAAA;;uBAI7B,YAuBgB,MAAA,cAAA,EAAA;IAtBb,MAAM,MAAM;IACZ,eAAa,MAAM;IACnB,iBAAe,MAAM;IACrB,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI,CAAA;IAC3E,uBAAkB,OAAA,OAAA,OAAA,MAAG,MAA0C;AAAA,SAAW,MAAM,KAAA,EAAW,MAAI,qBAAsB,EAAC;;;2BAc5G,CAZK,MAAM,SAAA,UAAA,KAAA,EACpB,mBAUgB,UAAA,EAAA,KAAA,GAAA,EAAA,WATC,MAAM,QAAd,SAAI;yBADb,YAUgB,uBAAA;MARb,KAAK,KAAK;MACV,OAAO,KAAK;MACZ,UAAU,KAAK;;6BAIE,CAFlB,YAEkB,yBAAA,MAAA;8BADqC,CAArD,YAAqD,0BAAA,MAAA;+BAAnB,CAAA,gBAAA,gBAAb,KAAK,MAAK,EAAA,EAAA,CAAA,CAAA;;;;gBAEjC,YAAuD,0BAAA,MAAA;8BAAnB,CAAA,gBAAA,gBAAf,KAAK,QAAO,EAAA,EAAA,CAAA,CAAA;;;;;gBAGrC,WAAe,KAAA,QAAA,WAAA,EAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvatarGroup.js","names":[],"sources":["../../../src/components/avatar/AvatarGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, toRef, ref, h, Fragment, type VNode } from 'vue'\nimport { composeClassName } from '../../utils/composeClassName'\nimport { useAvatarGroupProvide } from './avatar-group.context'\nimport Avatar from './Avatar.vue'\n\n\nconst props = withDefaults(defineProps<{\n size?: 'sm' | 'md' | 'lg'\n isBordered?: boolean\n isDisabled?: boolean\n isGrid?: boolean\n max?: number\n total?: number\n renderCount?: (count: number) => string\n class?: string\n}>(), {\n size: 'md',\n isBordered: false,\n isDisabled: false,\n isGrid: false,\n})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n}>()\n\n// Provide context using toRef() for reactivity (canonical pattern from ButtonGroup)\nuseAvatarGroupProvide({\n size: toRef(props, 'size'),\n isBordered: toRef(props, 'isBordered'),\n isDisabled: toRef(props, 'isDisabled'),\n isGrid: toRef(props, 'isGrid'),\n isInGroup: ref(true),\n})\n\nconst containerClass = computed(() =>\n composeClassName('flex items-center flex-row', props.class)\n)\n\n// Flatten slot vnodes (handles Fragments from v-for etc.)\nfunction flattenVNodes(vnodes: VNode[]): VNode[] {\n const result: VNode[] = []\n for (const vnode of vnodes) {\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\n result.push(...flattenVNodes(vnode.children as VNode[]))\n } else {\n result.push(vnode)\n }\n }\n return result\n}\n\n// Determine which vnodes to render when max is set\nfunction getSlicedNodes(): VNode[] {\n const defaultSlot = slots.default?.()\n if (!defaultSlot) return []\n\n const allNodes = flattenVNodes(defaultSlot)\n\n if (props.max === undefined) {\n return allNodes\n }\n\n const visibleNodes = allNodes.slice(0, props.max)\n const totalCount = props.total ?? allNodes.length\n const overflowCount = totalCount - props.max\n\n if (overflowCount <= 0) {\n return visibleNodes\n }\n\n const counterLabel = props.renderCount\n ? props.renderCount(overflowCount)\n : `+${overflowCount}`\n\n // Render counter avatar with a fallback slot so the full label string is shown\n const counterNode = h(Avatar, {}, {\n fallback: () => h('span', { class: 'avatar__name text-xs font-medium leading-none' }, counterLabel),\n })\n\n return [...visibleNodes, counterNode]\n}\n</script>\n\n<template>\n <div\n role=\"group\"\n :class=\"containerClass\"\n >\n <template v-if=\"props.max !== undefined\">\n <!-- Use render function output for sliced vnodes -->\n <template\n v-for=\"(node, _i) in getSlicedNodes()\"\n :key=\"_i\"\n >\n <component :is=\"node\" />\n </template>\n </template>\n <template v-else>\n <slot />\n </template>\n </div>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AvatarGroup.js","names":[],"sources":["../../../src/components/avatar/AvatarGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, toRef, ref, h, Fragment, type VNode } from 'vue'\nimport { composeClassName } from '../../utils/composeClassName'\nimport { useAvatarGroupProvide } from './avatar-group.context'\nimport Avatar from './Avatar.vue'\n\n\ntype AvatarShorthandItem = {\n src?: string\n alt?: string\n name?: string\n color?: string\n variant?: string\n isBordered?: boolean\n isDisabled?: boolean\n showFallback?: boolean\n}\n\nconst props = withDefaults(defineProps<{\n size?: 'sm' | 'md' | 'lg'\n isBordered?: boolean\n isDisabled?: boolean\n isGrid?: boolean\n max?: number\n total?: number\n renderCount?: (count: number) => string\n class?: string\n /** Shorthand API: render avatars from an array instead of the compound slot API */\n avatars?: AvatarShorthandItem[]\n}>(), {\n size: 'md',\n\n isBordered: false,\n isDisabled: false,\n isGrid: false,\n})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n}>()\n\n// Provide context using toRef() for reactivity (canonical pattern from ButtonGroup)\nuseAvatarGroupProvide({\n size: toRef(props, 'size'),\n isBordered: toRef(props, 'isBordered'),\n isDisabled: toRef(props, 'isDisabled'),\n isGrid: toRef(props, 'isGrid'),\n isInGroup: ref(true),\n})\n\nconst containerClass = computed(() =>\n composeClassName('flex items-center flex-row', props.class)\n)\n\nconst visibleAvatars = computed(() => {\n if (!props.avatars) return []\n return props.max !== undefined ? props.avatars.slice(0, props.max) : props.avatars\n})\nconst avatarOverflowCount = computed(() => {\n if (!props.avatars || props.max === undefined) return 0\n const total = props.total ?? props.avatars.length\n return total - props.max\n})\nconst avatarOverflowLabel = computed(() => {\n if (avatarOverflowCount.value <= 0) return ''\n return props.renderCount ? props.renderCount(avatarOverflowCount.value) : `+${avatarOverflowCount.value}`\n})\n\n// Flatten slot vnodes (handles Fragments from v-for etc.)\nfunction flattenVNodes(vnodes: VNode[]): VNode[] {\n const result: VNode[] = []\n for (const vnode of vnodes) {\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\n result.push(...flattenVNodes(vnode.children as VNode[]))\n } else {\n result.push(vnode)\n }\n }\n return result\n}\n\n// Determine which vnodes to render when max is set\nfunction getSlicedNodes(): VNode[] {\n const defaultSlot = slots.default?.()\n if (!defaultSlot) return []\n\n const allNodes = flattenVNodes(defaultSlot)\n\n if (props.max === undefined) {\n return allNodes\n }\n\n const visibleNodes = allNodes.slice(0, props.max)\n const totalCount = props.total ?? allNodes.length\n const overflowCount = totalCount - props.max\n\n if (overflowCount <= 0) {\n return visibleNodes\n }\n\n const counterLabel = props.renderCount\n ? props.renderCount(overflowCount)\n : `+${overflowCount}`\n\n // Render counter avatar with a fallback slot so the full label string is shown\n const counterNode = h(Avatar, {}, {\n fallback: () => h('span', { class: 'avatar__name text-xs font-medium leading-none' }, counterLabel),\n })\n\n return [...visibleNodes, counterNode]\n}\n</script>\n\n<template>\n <div\n role=\"group\"\n :class=\"containerClass\"\n >\n <template v-if=\"props.avatars\">\n <Avatar\n v-for=\"(avatar, idx) in visibleAvatars\"\n :key=\"idx\"\n v-bind=\"avatar\"\n />\n <Avatar v-if=\"avatarOverflowCount > 0\">\n <template #fallback>\n <span class=\"avatar__name text-xs font-medium leading-none\">{{ avatarOverflowLabel }}</span>\n </template>\n </Avatar>\n </template>\n <template v-else-if=\"props.max !== undefined\">\n <!-- Use render function output for sliced vnodes -->\n <template\n v-for=\"(node, _i) in getSlicedNodes()\"\n :key=\"_i\"\n >\n <component :is=\"node\" />\n </template>\n </template>\n <template v-else>\n <slot />\n </template>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { composeClassName } from "../../utils/composeClassName.js";
|
|
2
2
|
import { useAvatarGroupProvide } from "./avatar-group.context.js";
|
|
3
3
|
import Avatar_default from "./Avatar.js";
|
|
4
|
-
import { Fragment, computed, createBlock, createElementBlock, defineComponent, h, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toRef, useSlots } from "vue";
|
|
4
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, h, mergeProps, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, toRef, useSlots, withCtx } from "vue";
|
|
5
5
|
//#region src/components/avatar/AvatarGroup.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
var _hoisted_1 = { class: "avatar__name text-xs font-medium leading-none" };
|
|
6
7
|
var AvatarGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
7
8
|
__name: "AvatarGroup",
|
|
8
9
|
props: {
|
|
@@ -22,7 +23,8 @@ var AvatarGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
22
23
|
max: {},
|
|
23
24
|
total: {},
|
|
24
25
|
renderCount: {},
|
|
25
|
-
class: {}
|
|
26
|
+
class: {},
|
|
27
|
+
avatars: {}
|
|
26
28
|
},
|
|
27
29
|
setup(__props) {
|
|
28
30
|
const props = __props;
|
|
@@ -35,6 +37,18 @@ var AvatarGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
35
37
|
isInGroup: ref(true)
|
|
36
38
|
});
|
|
37
39
|
const containerClass = computed(() => composeClassName("flex items-center flex-row", props.class));
|
|
40
|
+
const visibleAvatars = computed(() => {
|
|
41
|
+
if (!props.avatars) return [];
|
|
42
|
+
return props.max !== void 0 ? props.avatars.slice(0, props.max) : props.avatars;
|
|
43
|
+
});
|
|
44
|
+
const avatarOverflowCount = computed(() => {
|
|
45
|
+
if (!props.avatars || props.max === void 0) return 0;
|
|
46
|
+
return (props.total ?? props.avatars.length) - props.max;
|
|
47
|
+
});
|
|
48
|
+
const avatarOverflowLabel = computed(() => {
|
|
49
|
+
if (avatarOverflowCount.value <= 0) return "";
|
|
50
|
+
return props.renderCount ? props.renderCount(avatarOverflowCount.value) : `+${avatarOverflowCount.value}`;
|
|
51
|
+
});
|
|
38
52
|
function flattenVNodes(vnodes) {
|
|
39
53
|
const result = [];
|
|
40
54
|
for (const vnode of vnodes) if (vnode.type === Fragment && Array.isArray(vnode.children)) result.push(...flattenVNodes(vnode.children));
|
|
@@ -57,9 +71,14 @@ var AvatarGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
57
71
|
return openBlock(), createElementBlock("div", {
|
|
58
72
|
role: "group",
|
|
59
73
|
class: normalizeClass(containerClass.value)
|
|
60
|
-
}, [props.
|
|
74
|
+
}, [props.avatars ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleAvatars.value, (avatar, idx) => {
|
|
75
|
+
return openBlock(), createBlock(Avatar_default, mergeProps({ key: idx }, { ref_for: true }, avatar), null, 16);
|
|
76
|
+
}), 128)), avatarOverflowCount.value > 0 ? (openBlock(), createBlock(Avatar_default, { key: 0 }, {
|
|
77
|
+
fallback: withCtx(() => [createElementVNode("span", _hoisted_1, toDisplayString(avatarOverflowLabel.value), 1)]),
|
|
78
|
+
_: 1
|
|
79
|
+
})) : createCommentVNode("", true)], 64)) : props.max !== void 0 ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(getSlicedNodes(), (node, _i) => {
|
|
61
80
|
return openBlock(), createBlock(resolveDynamicComponent(node), { key: _i });
|
|
62
|
-
}), 128)) : renderSlot(_ctx.$slots, "default", { key:
|
|
81
|
+
}), 128)) : renderSlot(_ctx.$slots, "default", { key: 2 })], 2);
|
|
63
82
|
};
|
|
64
83
|
}
|
|
65
84
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvatarGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/avatar/AvatarGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, toRef, ref, h, Fragment, type VNode } from 'vue'\nimport { composeClassName } from '../../utils/composeClassName'\nimport { useAvatarGroupProvide } from './avatar-group.context'\nimport Avatar from './Avatar.vue'\n\n\nconst props = withDefaults(defineProps<{\n size?: 'sm' | 'md' | 'lg'\n isBordered?: boolean\n isDisabled?: boolean\n isGrid?: boolean\n max?: number\n total?: number\n renderCount?: (count: number) => string\n class?: string\n}>(), {\n size: 'md',\n isBordered: false,\n isDisabled: false,\n isGrid: false,\n})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n}>()\n\n// Provide context using toRef() for reactivity (canonical pattern from ButtonGroup)\nuseAvatarGroupProvide({\n size: toRef(props, 'size'),\n isBordered: toRef(props, 'isBordered'),\n isDisabled: toRef(props, 'isDisabled'),\n isGrid: toRef(props, 'isGrid'),\n isInGroup: ref(true),\n})\n\nconst containerClass = computed(() =>\n composeClassName('flex items-center flex-row', props.class)\n)\n\n// Flatten slot vnodes (handles Fragments from v-for etc.)\nfunction flattenVNodes(vnodes: VNode[]): VNode[] {\n const result: VNode[] = []\n for (const vnode of vnodes) {\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\n result.push(...flattenVNodes(vnode.children as VNode[]))\n } else {\n result.push(vnode)\n }\n }\n return result\n}\n\n// Determine which vnodes to render when max is set\nfunction getSlicedNodes(): VNode[] {\n const defaultSlot = slots.default?.()\n if (!defaultSlot) return []\n\n const allNodes = flattenVNodes(defaultSlot)\n\n if (props.max === undefined) {\n return allNodes\n }\n\n const visibleNodes = allNodes.slice(0, props.max)\n const totalCount = props.total ?? allNodes.length\n const overflowCount = totalCount - props.max\n\n if (overflowCount <= 0) {\n return visibleNodes\n }\n\n const counterLabel = props.renderCount\n ? props.renderCount(overflowCount)\n : `+${overflowCount}`\n\n // Render counter avatar with a fallback slot so the full label string is shown\n const counterNode = h(Avatar, {}, {\n fallback: () => h('span', { class: 'avatar__name text-xs font-medium leading-none' }, counterLabel),\n })\n\n return [...visibleNodes, counterNode]\n}\n</script>\n\n<template>\n <div\n role=\"group\"\n :class=\"containerClass\"\n >\n <template v-if=\"props.max !== undefined\">\n <!-- Use render function output for sliced vnodes -->\n <template\n v-for=\"(node, _i) in getSlicedNodes()\"\n :key=\"_i\"\n >\n <component :is=\"node\" />\n </template>\n </template>\n <template v-else>\n <slot />\n </template>\n </div>\n</template>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"AvatarGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/avatar/AvatarGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, toRef, ref, h, Fragment, type VNode } from 'vue'\nimport { composeClassName } from '../../utils/composeClassName'\nimport { useAvatarGroupProvide } from './avatar-group.context'\nimport Avatar from './Avatar.vue'\n\n\ntype AvatarShorthandItem = {\n src?: string\n alt?: string\n name?: string\n color?: string\n variant?: string\n isBordered?: boolean\n isDisabled?: boolean\n showFallback?: boolean\n}\n\nconst props = withDefaults(defineProps<{\n size?: 'sm' | 'md' | 'lg'\n isBordered?: boolean\n isDisabled?: boolean\n isGrid?: boolean\n max?: number\n total?: number\n renderCount?: (count: number) => string\n class?: string\n /** Shorthand API: render avatars from an array instead of the compound slot API */\n avatars?: AvatarShorthandItem[]\n}>(), {\n size: 'md',\n\n isBordered: false,\n isDisabled: false,\n isGrid: false,\n})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n}>()\n\n// Provide context using toRef() for reactivity (canonical pattern from ButtonGroup)\nuseAvatarGroupProvide({\n size: toRef(props, 'size'),\n isBordered: toRef(props, 'isBordered'),\n isDisabled: toRef(props, 'isDisabled'),\n isGrid: toRef(props, 'isGrid'),\n isInGroup: ref(true),\n})\n\nconst containerClass = computed(() =>\n composeClassName('flex items-center flex-row', props.class)\n)\n\nconst visibleAvatars = computed(() => {\n if (!props.avatars) return []\n return props.max !== undefined ? props.avatars.slice(0, props.max) : props.avatars\n})\nconst avatarOverflowCount = computed(() => {\n if (!props.avatars || props.max === undefined) return 0\n const total = props.total ?? props.avatars.length\n return total - props.max\n})\nconst avatarOverflowLabel = computed(() => {\n if (avatarOverflowCount.value <= 0) return ''\n return props.renderCount ? props.renderCount(avatarOverflowCount.value) : `+${avatarOverflowCount.value}`\n})\n\n// Flatten slot vnodes (handles Fragments from v-for etc.)\nfunction flattenVNodes(vnodes: VNode[]): VNode[] {\n const result: VNode[] = []\n for (const vnode of vnodes) {\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\n result.push(...flattenVNodes(vnode.children as VNode[]))\n } else {\n result.push(vnode)\n }\n }\n return result\n}\n\n// Determine which vnodes to render when max is set\nfunction getSlicedNodes(): VNode[] {\n const defaultSlot = slots.default?.()\n if (!defaultSlot) return []\n\n const allNodes = flattenVNodes(defaultSlot)\n\n if (props.max === undefined) {\n return allNodes\n }\n\n const visibleNodes = allNodes.slice(0, props.max)\n const totalCount = props.total ?? allNodes.length\n const overflowCount = totalCount - props.max\n\n if (overflowCount <= 0) {\n return visibleNodes\n }\n\n const counterLabel = props.renderCount\n ? props.renderCount(overflowCount)\n : `+${overflowCount}`\n\n // Render counter avatar with a fallback slot so the full label string is shown\n const counterNode = h(Avatar, {}, {\n fallback: () => h('span', { class: 'avatar__name text-xs font-medium leading-none' }, counterLabel),\n })\n\n return [...visibleNodes, counterNode]\n}\n</script>\n\n<template>\n <div\n role=\"group\"\n :class=\"containerClass\"\n >\n <template v-if=\"props.avatars\">\n <Avatar\n v-for=\"(avatar, idx) in visibleAvatars\"\n :key=\"idx\"\n v-bind=\"avatar\"\n />\n <Avatar v-if=\"avatarOverflowCount > 0\">\n <template #fallback>\n <span class=\"avatar__name text-xs font-medium leading-none\">{{ avatarOverflowLabel }}</span>\n </template>\n </Avatar>\n </template>\n <template v-else-if=\"props.max !== undefined\">\n <!-- Use render function output for sliced vnodes -->\n <template\n v-for=\"(node, _i) in getSlicedNodes()\"\n :key=\"_i\"\n >\n <component :is=\"node\" />\n </template>\n </template>\n <template v-else>\n <slot />\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,MAAM,QAAQ;EAmBd,MAAM,QAAQ,UAAA;AAKd,wBAAsB;GACpB,MAAM,MAAM,OAAO,OAAO;GAC1B,YAAY,MAAM,OAAO,aAAa;GACtC,YAAY,MAAM,OAAO,aAAa;GACtC,QAAQ,MAAM,OAAO,SAAS;GAC9B,WAAW,IAAI,KAAK;GACrB,CAAA;EAED,MAAM,iBAAiB,eACrB,iBAAiB,8BAA8B,MAAM,MAAK,CAC5D;EAEA,MAAM,iBAAiB,eAAe;AACpC,OAAI,CAAC,MAAM,QAAS,QAAO,EAAC;AAC5B,UAAO,MAAM,QAAQ,KAAA,IAAY,MAAM,QAAQ,MAAM,GAAG,MAAM,IAAI,GAAG,MAAM;IAC5E;EACD,MAAM,sBAAsB,eAAe;AACzC,OAAI,CAAC,MAAM,WAAW,MAAM,QAAQ,KAAA,EAAW,QAAO;AAEtD,WADc,MAAM,SAAS,MAAM,QAAQ,UAC5B,MAAM;IACtB;EACD,MAAM,sBAAsB,eAAe;AACzC,OAAI,oBAAoB,SAAS,EAAG,QAAO;AAC3C,UAAO,MAAM,cAAc,MAAM,YAAY,oBAAoB,MAAM,GAAG,IAAI,oBAAoB;IACnG;EAGD,SAAS,cAAc,QAA0B;GAC/C,MAAM,SAAkB,EAAC;AACzB,QAAK,MAAM,SAAS,OAClB,KAAI,MAAM,SAAS,YAAY,MAAM,QAAQ,MAAM,SAAS,CAC1D,QAAO,KAAK,GAAG,cAAc,MAAM,SAAoB,CAAA;OAEvD,QAAO,KAAK,MAAK;AAGrB,UAAO;;EAIT,SAAS,iBAA0B;GACjC,MAAM,cAAc,MAAM,WAAU;AACpC,OAAI,CAAC,YAAa,QAAO,EAAC;GAE1B,MAAM,WAAW,cAAc,YAAW;AAE1C,OAAI,MAAM,QAAQ,KAAA,EAChB,QAAO;GAGT,MAAM,eAAe,SAAS,MAAM,GAAG,MAAM,IAAG;GAEhD,MAAM,iBADa,MAAM,SAAS,SAAS,UACR,MAAM;AAEzC,OAAI,iBAAiB,EACnB,QAAO;GAGT,MAAM,eAAe,MAAM,cACvB,MAAM,YAAY,cAAa,GAC/B,IAAI;GAGR,MAAM,cAAc,EAAE,gBAAQ,EAAE,EAAE,EAChC,gBAAgB,EAAE,QAAQ,EAAE,OAAO,iDAAiD,EAAE,aAAa,EACpG,CAAA;AAED,UAAO,CAAC,GAAG,cAAc,YAAW;;;uBAKpC,mBA4BM,OAAA;IA3BJ,MAAK;IACJ,OAAK,eAAE,eAAA,MAAc;OAEN,MAAM,WAAA,WAAA,EAAtB,mBAWW,UAAA,EAAA,KAAA,GAAA,EAAA,EAAA,UAAA,KAAA,EAVT,mBAIE,UAAA,MAAA,WAHwB,eAAA,QAAhB,QAAQ,QAAG;wBADrB,YAIE,gBAJF,WAIE,EAFC,KAAK,KAAG,EAAA,EAAA,SAAA,MAAA,EACD,OAAM,EAAA,MAAA,GAAA;cAEF,oBAAA,QAAmB,KAAA,WAAA,EAAjC,YAIS,gBAAA,EAAA,KAAA,GAAA,EAAA;IAHI,UAAQ,cAC2E,CAA5F,mBAA4F,QAA5F,YAA4F,gBAA7B,oBAAA,MAAmB,EAAA,EAAA,CAAA,CAAA;;+CAInE,MAAM,QAAQ,KAAA,KAAA,UAAA,KAAA,EAEjC,mBAKW,UAAA,EAAA,KAAA,GAAA,EAAA,WAJY,gBAAc,GAA3B,MAAM,OAAE;wBAGhB,YAAwB,wBAAR,KAAI,EAAA,EAAA,KAFd,IAAE,CAAA;eAMV,WAAQ,KAAA,QAAA,WAAA,EAAA,KAAA,GAAA,CAAA,CAAA,EAAA,EAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/components/breadcrumbs/Breadcrumbs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, cloneVNode, type VNode } from 'vue'\nimport { breadcrumbsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useBreadcrumbsProvide } from './breadcrumbs.context'\n\nconst props = withDefaults(defineProps<{\n maxItems?: number\n class?: ClassValue\n /** Override classes on any named slot. */\n classNames?: Partial<{\n base: ClassValue\n item: ClassValue\n }>\n}>(), {})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n separator?(): VNode;\n}>();\n\nconst slotFns = computed(() => breadcrumbsVariants({}))\n\n// Flatten default slot children into an array of VNodes we can iterate.\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes) return []\n const out: VNode[] = []\n for (const n of nodes) {\n // Skip comment / text whitespace nodes; detect Fragment by string representation\n if (typeof n.type === 'symbol' && String(n.type) === 'Symbol(v-fgt)') {\n out.push(...flattenChildren((n.children as VNode[]) ?? []))\n } else if (n.type && typeof n.type !== 'symbol') {\n out.push(n)\n }\n }\n return out\n}\n\nconst renderedChildren = computed(() => {\n const raw = slots.default?.() ?? []\n const items = flattenChildren(raw as VNode[])\n const max = props.maxItems\n let list = items\n if (max && items.length > max && max >= 2) {\n const first = items[0]\n const last = items.slice(items.length - (max - 2))\n const ellipsis = h(\n 'li',\n { class: composeClassName(slotFns.value.item(), props.classNames?.item), 'aria-hidden': 'true' },\n '…'\n )\n list = [first, ellipsis, ...last]\n }\n // Clone the last BreadcrumbItem VNode with isLast prop set\n if (list.length > 0) {\n const lastIdx = list.length - 1\n list = list.map((vnode, idx) =>\n idx === lastIdx ? cloneVNode(vnode, { isLast: true }) : vnode\n )\n }\n return list\n})\n\nconst total = computed(() => renderedChildren.value.length)\n\nuseBreadcrumbsProvide({\n slotFns,\n total,\n separatorSlot: slots.separator,\n})\n</script>\n\n<template>\n <nav\n aria-label=\"Breadcrumb\"\n :class=\"props.class\"\n >\n <ol :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\">\n <
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/components/breadcrumbs/Breadcrumbs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, cloneVNode, type VNode } from 'vue'\nimport { breadcrumbsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useBreadcrumbsProvide } from './breadcrumbs.context'\nimport BreadcrumbItem from './BreadcrumbItem.vue'\n\ntype BreadcrumbShorthandItem = { label: string; href?: string }\n\nconst props = withDefaults(defineProps<{\n maxItems?: number\n class?: ClassValue\n /** Override classes on any named slot. */\n classNames?: Partial<{\n base: ClassValue\n item: ClassValue\n }>\n /** Shorthand API: render breadcrumb items from an array instead of the compound slot API */\n items?: BreadcrumbShorthandItem[]\n}>(), {})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n separator?(): VNode;\n}>();\n\nconst slotFns = computed(() => breadcrumbsVariants({}))\n\n// Flatten default slot children into an array of VNodes we can iterate.\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes) return []\n const out: VNode[] = []\n for (const n of nodes) {\n // Skip comment / text whitespace nodes; detect Fragment by string representation\n if (typeof n.type === 'symbol' && String(n.type) === 'Symbol(v-fgt)') {\n out.push(...flattenChildren((n.children as VNode[]) ?? []))\n } else if (n.type && typeof n.type !== 'symbol') {\n out.push(n)\n }\n }\n return out\n}\n\nconst renderedChildren = computed(() => {\n const raw = slots.default?.() ?? []\n const items = flattenChildren(raw as VNode[])\n const max = props.maxItems\n let list = items\n if (max && items.length > max && max >= 2) {\n const first = items[0]\n const last = items.slice(items.length - (max - 2))\n const ellipsis = h(\n 'li',\n { class: composeClassName(slotFns.value.item(), props.classNames?.item), 'aria-hidden': 'true' },\n '…'\n )\n list = [first, ellipsis, ...last]\n }\n // Clone the last BreadcrumbItem VNode with isLast prop set\n if (list.length > 0) {\n const lastIdx = list.length - 1\n list = list.map((vnode, idx) =>\n idx === lastIdx ? cloneVNode(vnode, { isLast: true }) : vnode\n )\n }\n return list\n})\n\nconst total = computed(() => renderedChildren.value.length)\n\nconst renderedItems = computed((): BreadcrumbShorthandItem[] => {\n if (!props.items) return []\n const max = props.maxItems\n if (!max || props.items.length <= max || max < 2) return props.items\n const first = props.items[0]\n const tail = props.items.slice(props.items.length - (max - 2))\n return [first, { label: '…' }, ...tail]\n})\n\nuseBreadcrumbsProvide({\n slotFns,\n total,\n separatorSlot: slots.separator,\n})\n</script>\n\n<template>\n <nav\n aria-label=\"Breadcrumb\"\n :class=\"props.class\"\n >\n <ol :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\">\n <template v-if=\"props.items\">\n <BreadcrumbItem\n v-for=\"(item, idx) in renderedItems\"\n :key=\"idx\"\n :href=\"item.href\"\n :is-last=\"idx === renderedItems.length - 1\"\n >{{ item.label }}</BreadcrumbItem>\n </template>\n <template v-else>\n <component\n :is=\"child\"\n v-for=\"(child, idx) in renderedChildren\"\n :key=\"idx\"\n />\n </template>\n </ol>\n </nav>\n</template>\n"],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { composeClassName } from "../../utils/composeClassName.js";
|
|
2
2
|
import { useBreadcrumbsProvide } from "./breadcrumbs.context.js";
|
|
3
|
-
import
|
|
3
|
+
import BreadcrumbItem_default from "./BreadcrumbItem.js";
|
|
4
|
+
import { Fragment, cloneVNode, computed, createBlock, createElementBlock, createElementVNode, createTextVNode, defineComponent, h, normalizeClass, openBlock, renderList, resolveDynamicComponent, toDisplayString, unref, useSlots, withCtx } from "vue";
|
|
4
5
|
import { breadcrumbsVariants } from "@auronui/styles";
|
|
5
6
|
//#region src/components/breadcrumbs/Breadcrumbs.vue?vue&type=script&setup=true&lang.ts
|
|
6
7
|
var Breadcrumbs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
@@ -14,7 +15,8 @@ var Breadcrumbs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
14
15
|
Object,
|
|
15
16
|
Array
|
|
16
17
|
] },
|
|
17
|
-
classNames: {}
|
|
18
|
+
classNames: {},
|
|
19
|
+
items: {}
|
|
18
20
|
},
|
|
19
21
|
setup(__props) {
|
|
20
22
|
const props = __props;
|
|
@@ -49,16 +51,36 @@ var Breadcrumbs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
49
51
|
}
|
|
50
52
|
return list;
|
|
51
53
|
});
|
|
54
|
+
const total = computed(() => renderedChildren.value.length);
|
|
55
|
+
const renderedItems = computed(() => {
|
|
56
|
+
if (!props.items) return [];
|
|
57
|
+
const max = props.maxItems;
|
|
58
|
+
if (!max || props.items.length <= max || max < 2) return props.items;
|
|
59
|
+
return [
|
|
60
|
+
props.items[0],
|
|
61
|
+
{ label: "…" },
|
|
62
|
+
...props.items.slice(props.items.length - (max - 2))
|
|
63
|
+
];
|
|
64
|
+
});
|
|
52
65
|
useBreadcrumbsProvide({
|
|
53
66
|
slotFns,
|
|
54
|
-
total
|
|
67
|
+
total,
|
|
55
68
|
separatorSlot: slots.separator
|
|
56
69
|
});
|
|
57
70
|
return (_ctx, _cache) => {
|
|
58
71
|
return openBlock(), createElementBlock("nav", {
|
|
59
72
|
"aria-label": "Breadcrumb",
|
|
60
73
|
class: normalizeClass(props.class)
|
|
61
|
-
}, [createElementVNode("ol", { class: normalizeClass(unref(composeClassName)(slotFns.value.base(), props.class, props.classNames?.base)) }, [(openBlock(true), createElementBlock(Fragment,
|
|
74
|
+
}, [createElementVNode("ol", { class: normalizeClass(unref(composeClassName)(slotFns.value.base(), props.class, props.classNames?.base)) }, [props.items ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(renderedItems.value, (item, idx) => {
|
|
75
|
+
return openBlock(), createBlock(BreadcrumbItem_default, {
|
|
76
|
+
key: idx,
|
|
77
|
+
href: item.href,
|
|
78
|
+
"is-last": idx === renderedItems.value.length - 1
|
|
79
|
+
}, {
|
|
80
|
+
default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
|
|
81
|
+
_: 2
|
|
82
|
+
}, 1032, ["href", "is-last"]);
|
|
83
|
+
}), 128)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(renderedChildren.value, (child, idx) => {
|
|
62
84
|
return openBlock(), createBlock(resolveDynamicComponent(child), { key: idx });
|
|
63
85
|
}), 128))], 2)], 2);
|
|
64
86
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumbs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/breadcrumbs/Breadcrumbs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, cloneVNode, type VNode } from 'vue'\nimport { breadcrumbsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useBreadcrumbsProvide } from './breadcrumbs.context'\n\nconst props = withDefaults(defineProps<{\n maxItems?: number\n class?: ClassValue\n /** Override classes on any named slot. */\n classNames?: Partial<{\n base: ClassValue\n item: ClassValue\n }>\n}>(), {})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n separator?(): VNode;\n}>();\n\nconst slotFns = computed(() => breadcrumbsVariants({}))\n\n// Flatten default slot children into an array of VNodes we can iterate.\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes) return []\n const out: VNode[] = []\n for (const n of nodes) {\n // Skip comment / text whitespace nodes; detect Fragment by string representation\n if (typeof n.type === 'symbol' && String(n.type) === 'Symbol(v-fgt)') {\n out.push(...flattenChildren((n.children as VNode[]) ?? []))\n } else if (n.type && typeof n.type !== 'symbol') {\n out.push(n)\n }\n }\n return out\n}\n\nconst renderedChildren = computed(() => {\n const raw = slots.default?.() ?? []\n const items = flattenChildren(raw as VNode[])\n const max = props.maxItems\n let list = items\n if (max && items.length > max && max >= 2) {\n const first = items[0]\n const last = items.slice(items.length - (max - 2))\n const ellipsis = h(\n 'li',\n { class: composeClassName(slotFns.value.item(), props.classNames?.item), 'aria-hidden': 'true' },\n '…'\n )\n list = [first, ellipsis, ...last]\n }\n // Clone the last BreadcrumbItem VNode with isLast prop set\n if (list.length > 0) {\n const lastIdx = list.length - 1\n list = list.map((vnode, idx) =>\n idx === lastIdx ? cloneVNode(vnode, { isLast: true }) : vnode\n )\n }\n return list\n})\n\nconst total = computed(() => renderedChildren.value.length)\n\nuseBreadcrumbsProvide({\n slotFns,\n total,\n separatorSlot: slots.separator,\n})\n</script>\n\n<template>\n <nav\n aria-label=\"Breadcrumb\"\n :class=\"props.class\"\n >\n <ol :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\">\n <
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/breadcrumbs/Breadcrumbs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, cloneVNode, type VNode } from 'vue'\nimport { breadcrumbsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useBreadcrumbsProvide } from './breadcrumbs.context'\nimport BreadcrumbItem from './BreadcrumbItem.vue'\n\ntype BreadcrumbShorthandItem = { label: string; href?: string }\n\nconst props = withDefaults(defineProps<{\n maxItems?: number\n class?: ClassValue\n /** Override classes on any named slot. */\n classNames?: Partial<{\n base: ClassValue\n item: ClassValue\n }>\n /** Shorthand API: render breadcrumb items from an array instead of the compound slot API */\n items?: BreadcrumbShorthandItem[]\n}>(), {})\n\nconst slots = defineSlots<{\n default?(): VNode[];\n separator?(): VNode;\n}>();\n\nconst slotFns = computed(() => breadcrumbsVariants({}))\n\n// Flatten default slot children into an array of VNodes we can iterate.\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes) return []\n const out: VNode[] = []\n for (const n of nodes) {\n // Skip comment / text whitespace nodes; detect Fragment by string representation\n if (typeof n.type === 'symbol' && String(n.type) === 'Symbol(v-fgt)') {\n out.push(...flattenChildren((n.children as VNode[]) ?? []))\n } else if (n.type && typeof n.type !== 'symbol') {\n out.push(n)\n }\n }\n return out\n}\n\nconst renderedChildren = computed(() => {\n const raw = slots.default?.() ?? []\n const items = flattenChildren(raw as VNode[])\n const max = props.maxItems\n let list = items\n if (max && items.length > max && max >= 2) {\n const first = items[0]\n const last = items.slice(items.length - (max - 2))\n const ellipsis = h(\n 'li',\n { class: composeClassName(slotFns.value.item(), props.classNames?.item), 'aria-hidden': 'true' },\n '…'\n )\n list = [first, ellipsis, ...last]\n }\n // Clone the last BreadcrumbItem VNode with isLast prop set\n if (list.length > 0) {\n const lastIdx = list.length - 1\n list = list.map((vnode, idx) =>\n idx === lastIdx ? cloneVNode(vnode, { isLast: true }) : vnode\n )\n }\n return list\n})\n\nconst total = computed(() => renderedChildren.value.length)\n\nconst renderedItems = computed((): BreadcrumbShorthandItem[] => {\n if (!props.items) return []\n const max = props.maxItems\n if (!max || props.items.length <= max || max < 2) return props.items\n const first = props.items[0]\n const tail = props.items.slice(props.items.length - (max - 2))\n return [first, { label: '…' }, ...tail]\n})\n\nuseBreadcrumbsProvide({\n slotFns,\n total,\n separatorSlot: slots.separator,\n})\n</script>\n\n<template>\n <nav\n aria-label=\"Breadcrumb\"\n :class=\"props.class\"\n >\n <ol :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\">\n <template v-if=\"props.items\">\n <BreadcrumbItem\n v-for=\"(item, idx) in renderedItems\"\n :key=\"idx\"\n :href=\"item.href\"\n :is-last=\"idx === renderedItems.length - 1\"\n >{{ item.label }}</BreadcrumbItem>\n </template>\n <template v-else>\n <component\n :is=\"child\"\n v-for=\"(child, idx) in renderedChildren\"\n :key=\"idx\"\n />\n </template>\n </ol>\n </nav>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EASA,MAAM,QAAQ;EAYd,MAAM,QAAQ,UAGV;EAEJ,MAAM,UAAU,eAAe,oBAAoB,EAAE,CAAC,CAAA;EAGtD,SAAS,gBAAgB,OAAqC;AAC5D,OAAI,CAAC,MAAO,QAAO,EAAC;GACpB,MAAM,MAAe,EAAC;AACtB,QAAK,MAAM,KAAK,MAEd,KAAI,OAAO,EAAE,SAAS,YAAY,OAAO,EAAE,KAAK,KAAK,gBACnD,KAAI,KAAK,GAAG,gBAAiB,EAAE,YAAwB,EAAE,CAAC,CAAA;YACjD,EAAE,QAAQ,OAAO,EAAE,SAAS,SACrC,KAAI,KAAK,EAAC;AAGd,UAAO;;EAGT,MAAM,mBAAmB,eAAe;GAEtC,MAAM,QAAQ,gBADF,MAAM,WAAW,IAAI,EAAC,CACU;GAC5C,MAAM,MAAM,MAAM;GAClB,IAAI,OAAO;AACX,OAAI,OAAO,MAAM,SAAS,OAAO,OAAO,GAAG;IACzC,MAAM,QAAQ,MAAM;IACpB,MAAM,OAAO,MAAM,MAAM,MAAM,UAAU,MAAM,GAAE;AAMjD,WAAO;KAAC;KALS,EACf,MACA;MAAE,OAAO,iBAAiB,QAAQ,MAAM,MAAM,EAAE,MAAM,YAAY,KAAK;MAAE,eAAe;MAAQ,EAChG,IACF;KACyB,GAAG;KAAI;;AAGlC,OAAI,KAAK,SAAS,GAAG;IACnB,MAAM,UAAU,KAAK,SAAS;AAC9B,WAAO,KAAK,KAAK,OAAO,QACtB,QAAQ,UAAU,WAAW,OAAO,EAAE,QAAQ,MAAM,CAAC,GAAG,MAC1D;;AAEF,UAAO;IACR;EAED,MAAM,QAAQ,eAAe,iBAAiB,MAAM,OAAM;EAE1D,MAAM,gBAAgB,eAA0C;AAC9D,OAAI,CAAC,MAAM,MAAO,QAAO,EAAC;GAC1B,MAAM,MAAM,MAAM;AAClB,OAAI,CAAC,OAAO,MAAM,MAAM,UAAU,OAAO,MAAM,EAAG,QAAO,MAAM;AAG/D,UAAO;IAFO,MAAM,MAAM;IAEX,EAAE,OAAO,KAAK;IAAE,GADlB,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,MAAM,GAAE;IACvB;IACvC;AAED,wBAAsB;GACpB;GACA;GACA,eAAe,MAAM;GACtB,CAAA;;uBAIC,mBAqBM,OAAA;IApBJ,cAAW;IACV,OAAK,eAAE,MAAM,MAAK;OAEnB,mBAgBK,MAAA,EAhBA,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI,CAAA,EAAA,EAAA,CAC9D,MAAM,SAAA,UAAA,KAAA,EACpB,mBAKkC,UAAA,EAAA,KAAA,GAAA,EAAA,WAJV,cAAA,QAAd,MAAM,QAAG;wBADnB,YAKkC,wBAAA;KAH/B,KAAK;KACL,MAAM,KAAK;KACX,WAAS,QAAQ,cAAA,MAAc,SAAM;;4BACvB,CAAA,gBAAA,gBAAb,KAAK,MAAK,EAAA,EAAA,CAAA,CAAA;;;iCAGd,mBAIE,UAAA,EAAA,KAAA,GAAA,EAAA,WAFuB,iBAAA,QAAf,OAAO,QAAG;wBAFpB,YAIE,wBAHK,MAAK,EAAA,EAET,KAAK,KAAG,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","names":[],"sources":["../../../src/components/button/Button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { Primitive } from 'reka-ui'\nimport { buttonVariants, type ButtonVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupInject } from './button-group.context'\nimport Spinner from '../spinner/Spinner.vue'\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n size?: ButtonVariants['size']\n radius?: ButtonVariants['radius']\n isIconOnly?: boolean\n fullWidth?: boolean\n disabled?: boolean\n isLoading?: boolean\n as?: string | object\n class?: ClassValue\n /** Override classes for individual slots (base, startContent, label, endContent, spinner) */\n classNames?: Partial<{\n base: ClassValue\n startContent: ClassValue\n label: ClassValue\n endContent: ClassValue\n spinner: ClassValue\n }>\n value?: string | number\n}>(), {\n variant: undefined,\n size: undefined,\n radius: undefined,\n isIconOnly: false,\n fullWidth: false,\n disabled: false,\n isLoading: false,\n as: 'button',\n value: undefined,\n})\n\n// Inject ButtonGroup context unconditionally with fallback defaults (D-12)\n// When no ButtonGroup is present, inject returns these fallback values (no-op)\nconst groupCtx = useButtonGroupInject({\n variant: ref('primary'),\n size: ref('md'),\n disabled: ref(false),\n fullWidth: ref(false),\n orientation: ref('horizontal'),\n selectionMode: ref('single'),\n selectedValue: ref(null),\n isValueSelected: () => false,\n selectValue: () => {},\n})\n\nconst isSelected = computed(() => groupCtx.isValueSelected(props.value))\n\nfunction handleClick() {\n if (props.value !== undefined) groupCtx.selectValue(props.value)\n}\n\n// Prop precedence rules (D-13):\n// - group disabled ALWAYS wins over child prop\n// - all other props: child prop wins over group value (child ?? group)\nconst isDisabled = computed(() => groupCtx.disabled.value || props.disabled)\nconst finalVariant = computed(() => props.variant ?? groupCtx.variant.value)\nconst finalSize = computed(() => props.size ?? groupCtx.size.value)\nconst finalFullWidth = computed(() => props.fullWidth || groupCtx.fullWidth.value)\n\nconst slotFns = computed(() =>\n buttonVariants({\n variant:
|
|
1
|
+
{"version":3,"file":"Button.js","names":[],"sources":["../../../src/components/button/Button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { Primitive } from 'reka-ui'\nimport { buttonVariants, type ButtonVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupInject } from './button-group.context'\nimport Spinner from '../spinner/Spinner.vue'\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n color?: ButtonVariants['color']\n size?: ButtonVariants['size']\n radius?: ButtonVariants['radius']\n isIconOnly?: boolean\n fullWidth?: boolean\n disabled?: boolean\n isLoading?: boolean\n as?: string | object\n class?: ClassValue\n /** Override classes for individual slots (base, startContent, label, endContent, spinner) */\n classNames?: Partial<{\n base: ClassValue\n startContent: ClassValue\n label: ClassValue\n endContent: ClassValue\n spinner: ClassValue\n }>\n value?: string | number\n}>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n radius: undefined,\n isIconOnly: false,\n fullWidth: false,\n disabled: false,\n isLoading: false,\n as: 'button',\n value: undefined,\n})\n\n// Inject ButtonGroup context unconditionally with fallback defaults (D-12)\n// When no ButtonGroup is present, inject returns these fallback values (no-op)\nconst groupCtx = useButtonGroupInject({\n variant: ref('solid'),\n color: ref('primary'),\n size: ref('md'),\n disabled: ref(false),\n fullWidth: ref(false),\n orientation: ref('horizontal'),\n selectionMode: ref('single'),\n selectedValue: ref(null),\n isValueSelected: () => false,\n selectValue: () => {},\n})\n\nconst isSelected = computed(() => groupCtx.isValueSelected(props.value))\n\nfunction handleClick() {\n if (props.value !== undefined) groupCtx.selectValue(props.value)\n}\n\n// Prop precedence rules (D-13):\n// - group disabled ALWAYS wins over child prop\n// - all other props: child prop wins over group value (child ?? group)\nconst isDisabled = computed(() => groupCtx.disabled.value || props.disabled)\nconst finalVariant = computed(() => props.variant ?? groupCtx.variant.value)\nconst finalColor = computed(() => props.color ?? groupCtx.color.value)\nconst finalSize = computed(() => props.size ?? groupCtx.size.value)\nconst finalFullWidth = computed(() => props.fullWidth || groupCtx.fullWidth.value)\n\n// Map legacy variant names to new variant+color so old usage keeps working\nconst LEGACY_VARIANTS: Record<string, { variant: string; color: string }> = {\n primary: { variant: 'solid', color: 'primary' },\n secondary: { variant: 'default', color: 'default' },\n tertiary: { variant: 'default', color: 'default' },\n danger: { variant: 'solid', color: 'danger' },\n 'danger-soft': { variant: 'soft', color: 'danger' },\n success: { variant: 'solid', color: 'success' },\n 'success-soft':{ variant: 'soft', color: 'success' },\n warning: { variant: 'solid', color: 'warning' },\n 'warning-soft':{ variant: 'soft', color: 'warning' },\n}\n\nconst resolvedVariant = computed(() => {\n const v = finalVariant.value\n return (LEGACY_VARIANTS[v]?.variant ?? v) as ButtonVariants['variant']\n})\n\nconst resolvedColor = computed(() => {\n const v = finalVariant.value\n // If caller explicitly set color, respect it; otherwise infer from legacy variant\n if (props.color === undefined && LEGACY_VARIANTS[v]) return LEGACY_VARIANTS[v].color as ButtonVariants['color']\n return finalColor.value\n})\n\nconst slotFns = computed(() =>\n buttonVariants({\n variant: resolvedVariant.value,\n color: resolvedColor.value,\n size: finalSize.value,\n radius: props.radius,\n isIconOnly: props.isIconOnly,\n fullWidth: finalFullWidth.value,\n isLoading: props.isLoading,\n })\n)\n\n// Spinner size scales with button size\nconst spinnerSize = computed(() => {\n if (finalSize.value === 'xs' || finalSize.value === 'sm') return 'sm' as const\n if (finalSize.value === 'lg' || finalSize.value === 'xl') return 'lg' as const\n return 'md' as const\n})\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :disabled=\"isDisabled || props.isLoading || undefined\"\n :data-disabled=\"isDisabled || undefined\"\n :data-loading=\"props.isLoading || undefined\"\n :data-orientation=\"groupCtx.orientation.value\"\n :data-selected=\"isSelected || undefined\"\n v-bind=\"$attrs\"\n @click=\"handleClick\"\n >\n <!-- startContent named slot -->\n <span\n v-if=\"$slots.startContent\"\n :class=\"composeClassName(slotFns.startContent(), props.classNames?.startContent)\"\n >\n <slot name=\"startContent\" />\n </span>\n\n <!-- default (label) slot -->\n <span :class=\"composeClassName(slotFns.label(), props.classNames?.label)\">\n <slot />\n </span>\n\n <!-- endContent named slot -->\n <span\n v-if=\"$slots.endContent\"\n :class=\"composeClassName(slotFns.endContent(), props.classNames?.endContent)\"\n >\n <slot name=\"endContent\" />\n </span>\n\n <!-- Loading spinner: absolute-centered, only rendered when isLoading=true (D-08, D-09) -->\n <!-- color=\"current\" inherits --button-fg so spinner contrasts with the button background -->\n <span\n v-if=\"props.isLoading\"\n :class=\"composeClassName(slotFns.spinner(), props.classNames?.spinner)\"\n aria-hidden=\"true\"\n data-slot=\"spinner\"\n >\n <Spinner\n :size=\"spinnerSize\"\n color=\"current\"\n />\n </span>\n </Primitive>\n</template>\n"],"mappings":""}
|
|
@@ -9,6 +9,7 @@ var Button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
9
9
|
__name: "Button",
|
|
10
10
|
props: {
|
|
11
11
|
variant: { default: void 0 },
|
|
12
|
+
color: { default: void 0 },
|
|
12
13
|
size: { default: void 0 },
|
|
13
14
|
radius: { default: void 0 },
|
|
14
15
|
isIconOnly: {
|
|
@@ -41,7 +42,8 @@ var Button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
41
42
|
setup(__props) {
|
|
42
43
|
const props = __props;
|
|
43
44
|
const groupCtx = useButtonGroupInject({
|
|
44
|
-
variant: ref("
|
|
45
|
+
variant: ref("solid"),
|
|
46
|
+
color: ref("primary"),
|
|
45
47
|
size: ref("md"),
|
|
46
48
|
disabled: ref(false),
|
|
47
49
|
fullWidth: ref(false),
|
|
@@ -57,10 +59,59 @@ var Button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
57
59
|
}
|
|
58
60
|
const isDisabled = computed(() => groupCtx.disabled.value || props.disabled);
|
|
59
61
|
const finalVariant = computed(() => props.variant ?? groupCtx.variant.value);
|
|
62
|
+
const finalColor = computed(() => props.color ?? groupCtx.color.value);
|
|
60
63
|
const finalSize = computed(() => props.size ?? groupCtx.size.value);
|
|
61
64
|
const finalFullWidth = computed(() => props.fullWidth || groupCtx.fullWidth.value);
|
|
65
|
+
const LEGACY_VARIANTS = {
|
|
66
|
+
primary: {
|
|
67
|
+
variant: "solid",
|
|
68
|
+
color: "primary"
|
|
69
|
+
},
|
|
70
|
+
secondary: {
|
|
71
|
+
variant: "default",
|
|
72
|
+
color: "default"
|
|
73
|
+
},
|
|
74
|
+
tertiary: {
|
|
75
|
+
variant: "default",
|
|
76
|
+
color: "default"
|
|
77
|
+
},
|
|
78
|
+
danger: {
|
|
79
|
+
variant: "solid",
|
|
80
|
+
color: "danger"
|
|
81
|
+
},
|
|
82
|
+
"danger-soft": {
|
|
83
|
+
variant: "soft",
|
|
84
|
+
color: "danger"
|
|
85
|
+
},
|
|
86
|
+
success: {
|
|
87
|
+
variant: "solid",
|
|
88
|
+
color: "success"
|
|
89
|
+
},
|
|
90
|
+
"success-soft": {
|
|
91
|
+
variant: "soft",
|
|
92
|
+
color: "success"
|
|
93
|
+
},
|
|
94
|
+
warning: {
|
|
95
|
+
variant: "solid",
|
|
96
|
+
color: "warning"
|
|
97
|
+
},
|
|
98
|
+
"warning-soft": {
|
|
99
|
+
variant: "soft",
|
|
100
|
+
color: "warning"
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const resolvedVariant = computed(() => {
|
|
104
|
+
const v = finalVariant.value;
|
|
105
|
+
return LEGACY_VARIANTS[v]?.variant ?? v;
|
|
106
|
+
});
|
|
107
|
+
const resolvedColor = computed(() => {
|
|
108
|
+
const v = finalVariant.value;
|
|
109
|
+
if (props.color === void 0 && LEGACY_VARIANTS[v]) return LEGACY_VARIANTS[v].color;
|
|
110
|
+
return finalColor.value;
|
|
111
|
+
});
|
|
62
112
|
const slotFns = computed(() => buttonVariants({
|
|
63
|
-
variant:
|
|
113
|
+
variant: resolvedVariant.value,
|
|
114
|
+
color: resolvedColor.value,
|
|
64
115
|
size: finalSize.value,
|
|
65
116
|
radius: props.radius,
|
|
66
117
|
isIconOnly: props.isIconOnly,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../src/components/button/Button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { Primitive } from 'reka-ui'\nimport { buttonVariants, type ButtonVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupInject } from './button-group.context'\nimport Spinner from '../spinner/Spinner.vue'\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n size?: ButtonVariants['size']\n radius?: ButtonVariants['radius']\n isIconOnly?: boolean\n fullWidth?: boolean\n disabled?: boolean\n isLoading?: boolean\n as?: string | object\n class?: ClassValue\n /** Override classes for individual slots (base, startContent, label, endContent, spinner) */\n classNames?: Partial<{\n base: ClassValue\n startContent: ClassValue\n label: ClassValue\n endContent: ClassValue\n spinner: ClassValue\n }>\n value?: string | number\n}>(), {\n variant: undefined,\n size: undefined,\n radius: undefined,\n isIconOnly: false,\n fullWidth: false,\n disabled: false,\n isLoading: false,\n as: 'button',\n value: undefined,\n})\n\n// Inject ButtonGroup context unconditionally with fallback defaults (D-12)\n// When no ButtonGroup is present, inject returns these fallback values (no-op)\nconst groupCtx = useButtonGroupInject({\n variant: ref('primary'),\n size: ref('md'),\n disabled: ref(false),\n fullWidth: ref(false),\n orientation: ref('horizontal'),\n selectionMode: ref('single'),\n selectedValue: ref(null),\n isValueSelected: () => false,\n selectValue: () => {},\n})\n\nconst isSelected = computed(() => groupCtx.isValueSelected(props.value))\n\nfunction handleClick() {\n if (props.value !== undefined) groupCtx.selectValue(props.value)\n}\n\n// Prop precedence rules (D-13):\n// - group disabled ALWAYS wins over child prop\n// - all other props: child prop wins over group value (child ?? group)\nconst isDisabled = computed(() => groupCtx.disabled.value || props.disabled)\nconst finalVariant = computed(() => props.variant ?? groupCtx.variant.value)\nconst finalSize = computed(() => props.size ?? groupCtx.size.value)\nconst finalFullWidth = computed(() => props.fullWidth || groupCtx.fullWidth.value)\n\nconst slotFns = computed(() =>\n buttonVariants({\n variant:
|
|
1
|
+
{"version":3,"file":"Button.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../src/components/button/Button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { Primitive } from 'reka-ui'\nimport { buttonVariants, type ButtonVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupInject } from './button-group.context'\nimport Spinner from '../spinner/Spinner.vue'\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n color?: ButtonVariants['color']\n size?: ButtonVariants['size']\n radius?: ButtonVariants['radius']\n isIconOnly?: boolean\n fullWidth?: boolean\n disabled?: boolean\n isLoading?: boolean\n as?: string | object\n class?: ClassValue\n /** Override classes for individual slots (base, startContent, label, endContent, spinner) */\n classNames?: Partial<{\n base: ClassValue\n startContent: ClassValue\n label: ClassValue\n endContent: ClassValue\n spinner: ClassValue\n }>\n value?: string | number\n}>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n radius: undefined,\n isIconOnly: false,\n fullWidth: false,\n disabled: false,\n isLoading: false,\n as: 'button',\n value: undefined,\n})\n\n// Inject ButtonGroup context unconditionally with fallback defaults (D-12)\n// When no ButtonGroup is present, inject returns these fallback values (no-op)\nconst groupCtx = useButtonGroupInject({\n variant: ref('solid'),\n color: ref('primary'),\n size: ref('md'),\n disabled: ref(false),\n fullWidth: ref(false),\n orientation: ref('horizontal'),\n selectionMode: ref('single'),\n selectedValue: ref(null),\n isValueSelected: () => false,\n selectValue: () => {},\n})\n\nconst isSelected = computed(() => groupCtx.isValueSelected(props.value))\n\nfunction handleClick() {\n if (props.value !== undefined) groupCtx.selectValue(props.value)\n}\n\n// Prop precedence rules (D-13):\n// - group disabled ALWAYS wins over child prop\n// - all other props: child prop wins over group value (child ?? group)\nconst isDisabled = computed(() => groupCtx.disabled.value || props.disabled)\nconst finalVariant = computed(() => props.variant ?? groupCtx.variant.value)\nconst finalColor = computed(() => props.color ?? groupCtx.color.value)\nconst finalSize = computed(() => props.size ?? groupCtx.size.value)\nconst finalFullWidth = computed(() => props.fullWidth || groupCtx.fullWidth.value)\n\n// Map legacy variant names to new variant+color so old usage keeps working\nconst LEGACY_VARIANTS: Record<string, { variant: string; color: string }> = {\n primary: { variant: 'solid', color: 'primary' },\n secondary: { variant: 'default', color: 'default' },\n tertiary: { variant: 'default', color: 'default' },\n danger: { variant: 'solid', color: 'danger' },\n 'danger-soft': { variant: 'soft', color: 'danger' },\n success: { variant: 'solid', color: 'success' },\n 'success-soft':{ variant: 'soft', color: 'success' },\n warning: { variant: 'solid', color: 'warning' },\n 'warning-soft':{ variant: 'soft', color: 'warning' },\n}\n\nconst resolvedVariant = computed(() => {\n const v = finalVariant.value\n return (LEGACY_VARIANTS[v]?.variant ?? v) as ButtonVariants['variant']\n})\n\nconst resolvedColor = computed(() => {\n const v = finalVariant.value\n // If caller explicitly set color, respect it; otherwise infer from legacy variant\n if (props.color === undefined && LEGACY_VARIANTS[v]) return LEGACY_VARIANTS[v].color as ButtonVariants['color']\n return finalColor.value\n})\n\nconst slotFns = computed(() =>\n buttonVariants({\n variant: resolvedVariant.value,\n color: resolvedColor.value,\n size: finalSize.value,\n radius: props.radius,\n isIconOnly: props.isIconOnly,\n fullWidth: finalFullWidth.value,\n isLoading: props.isLoading,\n })\n)\n\n// Spinner size scales with button size\nconst spinnerSize = computed(() => {\n if (finalSize.value === 'xs' || finalSize.value === 'sm') return 'sm' as const\n if (finalSize.value === 'lg' || finalSize.value === 'xl') return 'lg' as const\n return 'md' as const\n})\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :disabled=\"isDisabled || props.isLoading || undefined\"\n :data-disabled=\"isDisabled || undefined\"\n :data-loading=\"props.isLoading || undefined\"\n :data-orientation=\"groupCtx.orientation.value\"\n :data-selected=\"isSelected || undefined\"\n v-bind=\"$attrs\"\n @click=\"handleClick\"\n >\n <!-- startContent named slot -->\n <span\n v-if=\"$slots.startContent\"\n :class=\"composeClassName(slotFns.startContent(), props.classNames?.startContent)\"\n >\n <slot name=\"startContent\" />\n </span>\n\n <!-- default (label) slot -->\n <span :class=\"composeClassName(slotFns.label(), props.classNames?.label)\">\n <slot />\n </span>\n\n <!-- endContent named slot -->\n <span\n v-if=\"$slots.endContent\"\n :class=\"composeClassName(slotFns.endContent(), props.classNames?.endContent)\"\n >\n <slot name=\"endContent\" />\n </span>\n\n <!-- Loading spinner: absolute-centered, only rendered when isLoading=true (D-08, D-09) -->\n <!-- color=\"current\" inherits --button-fg so spinner contrasts with the button background -->\n <span\n v-if=\"props.isLoading\"\n :class=\"composeClassName(slotFns.spinner(), props.classNames?.spinner)\"\n aria-hidden=\"true\"\n data-slot=\"spinner\"\n >\n <Spinner\n :size=\"spinnerSize\"\n color=\"current\"\n />\n </span>\n </Primitive>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQA,MAAM,QAAQ;EAmCd,MAAM,WAAW,qBAAqB;GACpC,SAAS,IAAI,QAAQ;GACrB,OAAO,IAAI,UAAU;GACrB,MAAM,IAAI,KAAK;GACf,UAAU,IAAI,MAAM;GACpB,WAAW,IAAI,MAAM;GACrB,aAAa,IAAI,aAAa;GAC9B,eAAe,IAAI,SAAS;GAC5B,eAAe,IAAI,KAAK;GACxB,uBAAuB;GACvB,mBAAmB;GACpB,CAAA;EAED,MAAM,aAAa,eAAe,SAAS,gBAAgB,MAAM,MAAM,CAAA;EAEvE,SAAS,cAAc;AACrB,OAAI,MAAM,UAAU,KAAA,EAAW,UAAS,YAAY,MAAM,MAAK;;EAMjE,MAAM,aAAa,eAAe,SAAS,SAAS,SAAS,MAAM,SAAQ;EAC3E,MAAM,eAAe,eAAe,MAAM,WAAW,SAAS,QAAQ,MAAK;EAC3E,MAAM,aAAa,eAAe,MAAM,SAAS,SAAS,MAAM,MAAK;EACrE,MAAM,YAAY,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAK;EAClE,MAAM,iBAAiB,eAAe,MAAM,aAAa,SAAS,UAAU,MAAK;EAGjF,MAAM,kBAAsE;GAC1E,SAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACvD,WAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACvD,UAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACvD,QAAe;IAAE,SAAS;IAAW,OAAO;IAAU;GACtD,eAAe;IAAE,SAAS;IAAW,OAAO;IAAU;GACtD,SAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACvD,gBAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACvD,SAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACvD,gBAAe;IAAE,SAAS;IAAW,OAAO;IAAW;GACzD;EAEA,MAAM,kBAAkB,eAAe;GACrC,MAAM,IAAI,aAAa;AACvB,UAAQ,gBAAgB,IAAI,WAAW;IACxC;EAED,MAAM,gBAAgB,eAAe;GACnC,MAAM,IAAI,aAAa;AAEvB,OAAI,MAAM,UAAU,KAAA,KAAa,gBAAgB,GAAI,QAAO,gBAAgB,GAAG;AAC/E,UAAO,WAAW;IACnB;EAED,MAAM,UAAU,eACd,eAAe;GACb,SAAS,gBAAgB;GACzB,OAAO,cAAc;GACrB,MAAM,UAAU;GAChB,QAAQ,MAAM;GACd,YAAY,MAAM;GAClB,WAAW,eAAe;GAC1B,WAAW,MAAM;GAClB,CAAA,CACH;EAGA,MAAM,cAAc,eAAe;AACjC,OAAI,UAAU,UAAU,QAAQ,UAAU,UAAU,KAAM,QAAO;AACjE,OAAI,UAAU,UAAU,QAAQ,UAAU,UAAU,KAAM,QAAO;AACjE,UAAO;IACR;;uBAIC,YA6CY,MAAA,UAAA,EA7CZ,WA6CY;IA5CT,IAAI,MAAM;IACV,OAAO,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI;IAC3E,UAAU,WAAA,SAAc,MAAM,aAAa,KAAA;IAC3C,iBAAe,WAAA,SAAc,KAAA;IAC7B,gBAAc,MAAM,aAAa,KAAA;IACjC,oBAAkB,MAAA,SAAQ,CAAC,YAAY;IACvC,iBAAe,WAAA,SAAc,KAAA;MACtBA,KAAAA,QAAM,EACb,SAAO,aAAW,CAAA,EAAA;2BAQZ;KAJCC,KAAAA,OAAO,gBAAA,WAAA,EADf,mBAKO,QAAA;;MAHJ,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,cAAY,EAAI,MAAM,YAAY,aAAY,CAAA;SAE/E,WAA4B,KAAA,QAAA,eAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA;KAI9B,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,OAAK,EAAI,MAAM,YAAY,MAAK,CAAA,EAAA,EAAA,CACrE,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,EAAA;KAKFA,KAAAA,OAAO,cAAA,WAAA,EADf,mBAKO,QAAA;;MAHJ,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,YAAU,EAAI,MAAM,YAAY,WAAU,CAAA;SAE3E,WAA0B,KAAA,QAAA,aAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA;KAMpB,MAAM,aAAA,WAAA,EADd,mBAUO,QAAA;;MARJ,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,SAAO,EAAI,MAAM,YAAY,QAAO,CAAA;MACrE,eAAY;MACZ,aAAU;SAEV,YAGE,iBAAA;MAFC,MAAM,YAAA;MACP,OAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ButtonGroup.js","names":[],"sources":["../../../src/components/button/ButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef } from 'vue'\nimport { buttonGroupVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupProvide } from './button-group.context'\nimport type { ButtonGroupSelectionMode, ButtonGroupValue } from './button-group.context'\nimport type { ButtonVariants } from '@auronui/styles'\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n size?: ButtonVariants['size']\n disabled?: boolean\n fullWidth?: boolean\n orientation?: 'horizontal' | 'vertical'\n class?: ClassValue\n /** Per-slot class overrides */\n classNames?: Partial<{\n base: ClassValue\n }>\n selectionMode?: ButtonGroupSelectionMode\n modelValue?: ButtonGroupValue\n}>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n fullWidth: false,\n orientation: 'horizontal',\n selectionMode: 'single',\n modelValue: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: ButtonGroupValue]\n}>()\n\n// Selected value: controlled if modelValue prop is provided, otherwise uncontrolled.\n// Single mode: scalar (string|number|null). Multiple mode: array of scalars.\nconst internalSelected = ref<ButtonGroupValue>(props.selectionMode === 'multiple' ? [] : null)\nconst selectedValue = computed<ButtonGroupValue>({\n get: () => (props.modelValue !== undefined ? props.modelValue : internalSelected.value),\n set: (v) => {\n if (props.modelValue === undefined) internalSelected.value = v\n emit('update:modelValue', v)\n },\n})\n\nfunction isValueSelected(value: string | number | undefined): boolean {\n if (value === undefined) return false\n const current = selectedValue.value\n if (Array.isArray(current)) return current.includes(value)\n return current === value\n}\n\nfunction selectValue(value: string | number) {\n if (props.selectionMode === 'multiple') {\n const current = Array.isArray(selectedValue.value) ? selectedValue.value : []\n selectedValue.value = current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value]\n } else {\n // Single mode: clicking the already-selected button deselects it\n selectedValue.value = selectedValue.value === value ? null : value\n }\n}\n\n// Provide context using toRef() for reactivity (D-11)\nuseButtonGroupProvide({\n variant: toRef(props, 'variant'),\n size: toRef(props, 'size'),\n disabled: toRef(props, 'disabled'),\n fullWidth: toRef(props, 'fullWidth'),\n orientation: toRef(props, 'orientation'),\n selectionMode: toRef(props, 'selectionMode'),\n selectedValue,\n isValueSelected,\n selectValue,\n})\n\nconst slotFns = computed(() =>\n buttonGroupVariants({\n fullWidth: props.fullWidth,\n orientation: props.orientation,\n })\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n role=\"group\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ButtonGroup.js","names":[],"sources":["../../../src/components/button/ButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef } from 'vue'\nimport { buttonGroupVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupProvide } from './button-group.context'\nimport type { ButtonGroupSelectionMode, ButtonGroupValue } from './button-group.context'\nimport type { ButtonVariants } from '@auronui/styles'\nimport Button from './Button.vue'\n\ntype ButtonShorthandItem = {\n label: string\n value?: string | number\n disabled?: boolean\n isLoading?: boolean\n variant?: ButtonVariants['variant']\n color?: ButtonVariants['color']\n class?: string\n}\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n color?: ButtonVariants['color']\n size?: ButtonVariants['size']\n disabled?: boolean\n fullWidth?: boolean\n orientation?: 'horizontal' | 'vertical'\n class?: ClassValue\n /** Per-slot class overrides */\n classNames?: Partial<{\n base: ClassValue\n }>\n selectionMode?: ButtonGroupSelectionMode\n modelValue?: ButtonGroupValue\n /** Shorthand API: render buttons from an array instead of the compound slot API */\n buttons?: ButtonShorthandItem[]\n}>(), {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n disabled: false,\n fullWidth: false,\n orientation: 'horizontal',\n selectionMode: 'single',\n modelValue: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: ButtonGroupValue]\n}>()\n\n// Selected value: controlled if modelValue prop is provided, otherwise uncontrolled.\n// Single mode: scalar (string|number|null). Multiple mode: array of scalars.\nconst internalSelected = ref<ButtonGroupValue>(props.selectionMode === 'multiple' ? [] : null)\nconst selectedValue = computed<ButtonGroupValue>({\n get: () => (props.modelValue !== undefined ? props.modelValue : internalSelected.value),\n set: (v) => {\n if (props.modelValue === undefined) internalSelected.value = v\n emit('update:modelValue', v)\n },\n})\n\nfunction isValueSelected(value: string | number | undefined): boolean {\n if (value === undefined) return false\n const current = selectedValue.value\n if (Array.isArray(current)) return current.includes(value)\n return current === value\n}\n\nfunction selectValue(value: string | number) {\n if (props.selectionMode === 'multiple') {\n const current = Array.isArray(selectedValue.value) ? selectedValue.value : []\n selectedValue.value = current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value]\n } else {\n // Single mode: clicking the already-selected button deselects it\n selectedValue.value = selectedValue.value === value ? null : value\n }\n}\n\n// Provide context using toRef() for reactivity (D-11)\nuseButtonGroupProvide({\n variant: toRef(props, 'variant'),\n color: toRef(props, 'color'),\n size: toRef(props, 'size'),\n disabled: toRef(props, 'disabled'),\n fullWidth: toRef(props, 'fullWidth'),\n orientation: toRef(props, 'orientation'),\n selectionMode: toRef(props, 'selectionMode'),\n selectedValue,\n isValueSelected,\n selectValue,\n})\n\nconst slotFns = computed(() =>\n buttonGroupVariants({\n fullWidth: props.fullWidth,\n orientation: props.orientation,\n })\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n role=\"group\"\n >\n <template v-if=\"props.buttons\">\n <Button\n v-for=\"(btn, idx) in props.buttons\"\n :key=\"idx\"\n :value=\"btn.value\"\n :disabled=\"btn.disabled\"\n :is-loading=\"btn.isLoading\"\n :variant=\"btn.variant\"\n :color=\"btn.color\"\n :class=\"btn.class\"\n >{{ btn.label }}</Button>\n </template>\n <slot v-else />\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { composeClassName } from "../../utils/composeClassName.js";
|
|
2
2
|
import { useButtonGroupProvide } from "./button-group.context.js";
|
|
3
|
-
import
|
|
3
|
+
import Button_default from "./Button.js";
|
|
4
|
+
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, toDisplayString, toRef, unref, withCtx } from "vue";
|
|
4
5
|
import { buttonGroupVariants } from "@auronui/styles";
|
|
5
6
|
//#region src/components/button/ButtonGroup.vue?vue&type=script&setup=true&lang.ts
|
|
6
7
|
var _hoisted_1 = ["data-orientation"];
|
|
7
8
|
var ButtonGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
8
9
|
__name: "ButtonGroup",
|
|
9
10
|
props: {
|
|
10
|
-
variant: { default: "
|
|
11
|
+
variant: { default: "solid" },
|
|
12
|
+
color: { default: "primary" },
|
|
11
13
|
size: { default: "md" },
|
|
12
14
|
disabled: {
|
|
13
15
|
type: Boolean,
|
|
@@ -27,7 +29,8 @@ var ButtonGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
27
29
|
] },
|
|
28
30
|
classNames: {},
|
|
29
31
|
selectionMode: { default: "single" },
|
|
30
|
-
modelValue: { default: void 0 }
|
|
32
|
+
modelValue: { default: void 0 },
|
|
33
|
+
buttons: {}
|
|
31
34
|
},
|
|
32
35
|
emits: ["update:modelValue"],
|
|
33
36
|
setup(__props, { emit: __emit }) {
|
|
@@ -55,6 +58,7 @@ var ButtonGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
55
58
|
}
|
|
56
59
|
useButtonGroupProvide({
|
|
57
60
|
variant: toRef(props, "variant"),
|
|
61
|
+
color: toRef(props, "color"),
|
|
58
62
|
size: toRef(props, "size"),
|
|
59
63
|
disabled: toRef(props, "disabled"),
|
|
60
64
|
fullWidth: toRef(props, "fullWidth"),
|
|
@@ -73,7 +77,27 @@ var ButtonGroup_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
73
77
|
class: normalizeClass(unref(composeClassName)(slotFns.value.base(), props.class, props.classNames?.base)),
|
|
74
78
|
"data-orientation": props.orientation,
|
|
75
79
|
role: "group"
|
|
76
|
-
}, [
|
|
80
|
+
}, [props.buttons ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(props.buttons, (btn, idx) => {
|
|
81
|
+
return openBlock(), createBlock(Button_default, {
|
|
82
|
+
key: idx,
|
|
83
|
+
value: btn.value,
|
|
84
|
+
disabled: btn.disabled,
|
|
85
|
+
"is-loading": btn.isLoading,
|
|
86
|
+
variant: btn.variant,
|
|
87
|
+
color: btn.color,
|
|
88
|
+
class: normalizeClass(btn.class)
|
|
89
|
+
}, {
|
|
90
|
+
default: withCtx(() => [createTextVNode(toDisplayString(btn.label), 1)]),
|
|
91
|
+
_: 2
|
|
92
|
+
}, 1032, [
|
|
93
|
+
"value",
|
|
94
|
+
"disabled",
|
|
95
|
+
"is-loading",
|
|
96
|
+
"variant",
|
|
97
|
+
"color",
|
|
98
|
+
"class"
|
|
99
|
+
]);
|
|
100
|
+
}), 128)) : renderSlot(_ctx.$slots, "default", { key: 1 })], 10, _hoisted_1);
|
|
77
101
|
};
|
|
78
102
|
}
|
|
79
103
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ButtonGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/button/ButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef } from 'vue'\nimport { buttonGroupVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupProvide } from './button-group.context'\nimport type { ButtonGroupSelectionMode, ButtonGroupValue } from './button-group.context'\nimport type { ButtonVariants } from '@auronui/styles'\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n size?: ButtonVariants['size']\n disabled?: boolean\n fullWidth?: boolean\n orientation?: 'horizontal' | 'vertical'\n class?: ClassValue\n /** Per-slot class overrides */\n classNames?: Partial<{\n base: ClassValue\n }>\n selectionMode?: ButtonGroupSelectionMode\n modelValue?: ButtonGroupValue\n}>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n fullWidth: false,\n orientation: 'horizontal',\n selectionMode: 'single',\n modelValue: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: ButtonGroupValue]\n}>()\n\n// Selected value: controlled if modelValue prop is provided, otherwise uncontrolled.\n// Single mode: scalar (string|number|null). Multiple mode: array of scalars.\nconst internalSelected = ref<ButtonGroupValue>(props.selectionMode === 'multiple' ? [] : null)\nconst selectedValue = computed<ButtonGroupValue>({\n get: () => (props.modelValue !== undefined ? props.modelValue : internalSelected.value),\n set: (v) => {\n if (props.modelValue === undefined) internalSelected.value = v\n emit('update:modelValue', v)\n },\n})\n\nfunction isValueSelected(value: string | number | undefined): boolean {\n if (value === undefined) return false\n const current = selectedValue.value\n if (Array.isArray(current)) return current.includes(value)\n return current === value\n}\n\nfunction selectValue(value: string | number) {\n if (props.selectionMode === 'multiple') {\n const current = Array.isArray(selectedValue.value) ? selectedValue.value : []\n selectedValue.value = current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value]\n } else {\n // Single mode: clicking the already-selected button deselects it\n selectedValue.value = selectedValue.value === value ? null : value\n }\n}\n\n// Provide context using toRef() for reactivity (D-11)\nuseButtonGroupProvide({\n variant: toRef(props, 'variant'),\n size: toRef(props, 'size'),\n disabled: toRef(props, 'disabled'),\n fullWidth: toRef(props, 'fullWidth'),\n orientation: toRef(props, 'orientation'),\n selectionMode: toRef(props, 'selectionMode'),\n selectedValue,\n isValueSelected,\n selectValue,\n})\n\nconst slotFns = computed(() =>\n buttonGroupVariants({\n fullWidth: props.fullWidth,\n orientation: props.orientation,\n })\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n role=\"group\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ButtonGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/button/ButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef } from 'vue'\nimport { buttonGroupVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useButtonGroupProvide } from './button-group.context'\nimport type { ButtonGroupSelectionMode, ButtonGroupValue } from './button-group.context'\nimport type { ButtonVariants } from '@auronui/styles'\nimport Button from './Button.vue'\n\ntype ButtonShorthandItem = {\n label: string\n value?: string | number\n disabled?: boolean\n isLoading?: boolean\n variant?: ButtonVariants['variant']\n color?: ButtonVariants['color']\n class?: string\n}\n\nconst props = withDefaults(defineProps<{\n variant?: ButtonVariants['variant']\n color?: ButtonVariants['color']\n size?: ButtonVariants['size']\n disabled?: boolean\n fullWidth?: boolean\n orientation?: 'horizontal' | 'vertical'\n class?: ClassValue\n /** Per-slot class overrides */\n classNames?: Partial<{\n base: ClassValue\n }>\n selectionMode?: ButtonGroupSelectionMode\n modelValue?: ButtonGroupValue\n /** Shorthand API: render buttons from an array instead of the compound slot API */\n buttons?: ButtonShorthandItem[]\n}>(), {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n disabled: false,\n fullWidth: false,\n orientation: 'horizontal',\n selectionMode: 'single',\n modelValue: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: ButtonGroupValue]\n}>()\n\n// Selected value: controlled if modelValue prop is provided, otherwise uncontrolled.\n// Single mode: scalar (string|number|null). Multiple mode: array of scalars.\nconst internalSelected = ref<ButtonGroupValue>(props.selectionMode === 'multiple' ? [] : null)\nconst selectedValue = computed<ButtonGroupValue>({\n get: () => (props.modelValue !== undefined ? props.modelValue : internalSelected.value),\n set: (v) => {\n if (props.modelValue === undefined) internalSelected.value = v\n emit('update:modelValue', v)\n },\n})\n\nfunction isValueSelected(value: string | number | undefined): boolean {\n if (value === undefined) return false\n const current = selectedValue.value\n if (Array.isArray(current)) return current.includes(value)\n return current === value\n}\n\nfunction selectValue(value: string | number) {\n if (props.selectionMode === 'multiple') {\n const current = Array.isArray(selectedValue.value) ? selectedValue.value : []\n selectedValue.value = current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value]\n } else {\n // Single mode: clicking the already-selected button deselects it\n selectedValue.value = selectedValue.value === value ? null : value\n }\n}\n\n// Provide context using toRef() for reactivity (D-11)\nuseButtonGroupProvide({\n variant: toRef(props, 'variant'),\n color: toRef(props, 'color'),\n size: toRef(props, 'size'),\n disabled: toRef(props, 'disabled'),\n fullWidth: toRef(props, 'fullWidth'),\n orientation: toRef(props, 'orientation'),\n selectionMode: toRef(props, 'selectionMode'),\n selectedValue,\n isValueSelected,\n selectValue,\n})\n\nconst slotFns = computed(() =>\n buttonGroupVariants({\n fullWidth: props.fullWidth,\n orientation: props.orientation,\n })\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n role=\"group\"\n >\n <template v-if=\"props.buttons\">\n <Button\n v-for=\"(btn, idx) in props.buttons\"\n :key=\"idx\"\n :value=\"btn.value\"\n :disabled=\"btn.disabled\"\n :is-loading=\"btn.isLoading\"\n :variant=\"btn.variant\"\n :color=\"btn.color\"\n :class=\"btn.class\"\n >{{ btn.label }}</Button>\n </template>\n <slot v-else />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EA2Bd,MAAM,OAAO;EAMb,MAAM,mBAAmB,IAAsB,MAAM,kBAAkB,aAAa,EAAE,GAAG,KAAI;EAC7F,MAAM,gBAAgB,SAA2B;GAC/C,WAAY,MAAM,eAAe,KAAA,IAAY,MAAM,aAAa,iBAAiB;GACjF,MAAM,MAAM;AACV,QAAI,MAAM,eAAe,KAAA,EAAW,kBAAiB,QAAQ;AAC7D,SAAK,qBAAqB,EAAC;;GAE9B,CAAA;EAED,SAAS,gBAAgB,OAA6C;AACpE,OAAI,UAAU,KAAA,EAAW,QAAO;GAChC,MAAM,UAAU,cAAc;AAC9B,OAAI,MAAM,QAAQ,QAAQ,CAAE,QAAO,QAAQ,SAAS,MAAK;AACzD,UAAO,YAAY;;EAGrB,SAAS,YAAY,OAAwB;AAC3C,OAAI,MAAM,kBAAkB,YAAY;IACtC,MAAM,UAAU,MAAM,QAAQ,cAAc,MAAM,GAAG,cAAc,QAAQ,EAAC;AAC5E,kBAAc,QAAQ,QAAQ,SAAS,MAAK,GACxC,QAAQ,QAAQ,MAAM,MAAM,MAAK,GACjC,CAAC,GAAG,SAAS,MAAK;SAGtB,eAAc,QAAQ,cAAc,UAAU,QAAQ,OAAO;;AAKjE,wBAAsB;GACpB,SAAS,MAAM,OAAO,UAAU;GAChC,OAAO,MAAM,OAAO,QAAQ;GAC5B,MAAM,MAAM,OAAO,OAAO;GAC1B,UAAU,MAAM,OAAO,WAAW;GAClC,WAAW,MAAM,OAAO,YAAY;GACpC,aAAa,MAAM,OAAO,cAAc;GACxC,eAAe,MAAM,OAAO,gBAAgB;GAC5C;GACA;GACA;GACD,CAAA;EAED,MAAM,UAAU,eACd,oBAAoB;GAClB,WAAW,MAAM;GACjB,aAAa,MAAM;GACpB,CAAA,CACH;;uBAIE,mBAkBM,OAAA;IAjBH,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI,CAAA;IAC3E,oBAAkB,MAAM;IACzB,MAAK;OAEW,MAAM,WAAA,UAAA,KAAA,EACpB,mBASyB,UAAA,EAAA,KAAA,GAAA,EAAA,WARF,MAAM,UAAnB,KAAK,QAAG;wBADlB,YASyB,gBAAA;KAPtB,KAAK;KACL,OAAO,IAAI;KACX,UAAU,IAAI;KACd,cAAY,IAAI;KAChB,SAAS,IAAI;KACb,OAAO,IAAI;KACX,OAAK,eAAE,IAAI,MAAK;;4BACH,CAAA,gBAAA,gBAAZ,IAAI,MAAK,EAAA,EAAA,CAAA,CAAA;;;;;;;;;;eAEf,WAAe,KAAA,QAAA,WAAA,EAAA,KAAA,GAAA,CAAA,CAAA,EAAA,IAAA,WAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleButtonGroup.js","names":[],"sources":["../../../src/components/button/ToggleButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef } from 'vue'\nimport { toggleButtonGroupVariants, type ToggleButtonVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useToggleButtonGroupProvide } from './toggle-button-group.context'\n\nconst props = withDefaults(defineProps<{\n variant?: ToggleButtonVariants['variant']\n size?: ToggleButtonVariants['size']\n disabled?: boolean\n fullWidth?: boolean\n orientation?: 'horizontal' | 'vertical'\n isDetached?: boolean\n selectionMode?: 'single' | 'multiple'\n modelValue?: string | string[]\n defaultValue?: string | string[]\n class?: ClassValue\n /** Additional class names to apply to component slots */\n classNames?: Partial<{\n base: ClassValue\n }>\n}>(), {\n variant: 'default',\n size: 'md',\n disabled: false,\n fullWidth: false,\n orientation: 'horizontal',\n isDetached: false,\n selectionMode: 'multiple',\n modelValue: undefined,\n defaultValue: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | string[]]\n}>()\n\n// Normalize modelValue / defaultValue to string[] for internal use\nconst internalSelected = ref<string[]>(\n props.modelValue !== undefined\n ? (Array.isArray(props.modelValue) ? [...props.modelValue] : [props.modelValue])\n : props.defaultValue !== undefined\n ? (Array.isArray(props.defaultValue) ? [...props.defaultValue] : [props.defaultValue])\n : []\n)\n\n// Keep internalSelected in sync when modelValue changes from outside (controlled mode)\nimport { watch } from 'vue'\nwatch(\n () => props.modelValue,\n (val) => {\n if (val === undefined) return\n internalSelected.value = Array.isArray(val) ? [...val] : [val]\n },\n)\n\n// The selectedValues exposed to children (always string[])\nconst selectedValues = computed(() => internalSelected.value)\n\nfunction toggleValue(value: string) {\n if (props.selectionMode === 'single') {\n const next = internalSelected.value.includes(value) ? [] : [value]\n internalSelected.value = next\n emit('update:modelValue', next[0] ?? '')\n } else {\n // multiple\n const idx = internalSelected.value.indexOf(value)\n const next = idx === -1\n ? [...internalSelected.value, value]\n : internalSelected.value.filter((v) => v !== value)\n internalSelected.value = next\n emit('update:modelValue', next)\n }\n}\n\n// Provide context to child ToggleButtons via toRef() for live reactivity\nuseToggleButtonGroupProvide({\n variant: toRef(props, 'variant'),\n size: toRef(props, 'size'),\n disabled: toRef(props, 'disabled'),\n fullWidth: toRef(props, 'fullWidth'),\n orientation: toRef(props, 'orientation'),\n selectionMode: toRef(props, 'selectionMode'),\n selectedValues,\n toggleValue,\n})\n\nconst slotFns = computed(() =>\n toggleButtonGroupVariants({\n fullWidth: props.fullWidth,\n orientation: props.orientation,\n isDetached: props.isDetached,\n })\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n role=\"group\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ToggleButtonGroup.js","names":[],"sources":["../../../src/components/button/ToggleButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef } from 'vue'\nimport { toggleButtonGroupVariants, type ToggleButtonVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useToggleButtonGroupProvide } from './toggle-button-group.context'\nimport ToggleButton from './ToggleButton.vue'\n\ntype ToggleButtonShorthandItem = { value: string; label?: string; isIconOnly?: boolean; disabled?: boolean; class?: string }\n\nconst props = withDefaults(defineProps<{\n variant?: ToggleButtonVariants['variant']\n size?: ToggleButtonVariants['size']\n disabled?: boolean\n fullWidth?: boolean\n orientation?: 'horizontal' | 'vertical'\n isDetached?: boolean\n selectionMode?: 'single' | 'multiple'\n modelValue?: string | string[]\n defaultValue?: string | string[]\n class?: ClassValue\n /** Additional class names to apply to component slots */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render toggle buttons from an array instead of the compound slot API */\n buttons?: ToggleButtonShorthandItem[]\n}>(), {\n variant: 'default',\n size: 'md',\n disabled: false,\n fullWidth: false,\n orientation: 'horizontal',\n isDetached: false,\n selectionMode: 'multiple',\n modelValue: undefined,\n defaultValue: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | string[]]\n}>()\n\n// Normalize modelValue / defaultValue to string[] for internal use\nconst internalSelected = ref<string[]>(\n props.modelValue !== undefined\n ? (Array.isArray(props.modelValue) ? [...props.modelValue] : [props.modelValue])\n : props.defaultValue !== undefined\n ? (Array.isArray(props.defaultValue) ? [...props.defaultValue] : [props.defaultValue])\n : []\n)\n\n// Keep internalSelected in sync when modelValue changes from outside (controlled mode)\nimport { watch } from 'vue'\nwatch(\n () => props.modelValue,\n (val) => {\n if (val === undefined) return\n internalSelected.value = Array.isArray(val) ? [...val] : [val]\n },\n)\n\n// The selectedValues exposed to children (always string[])\nconst selectedValues = computed(() => internalSelected.value)\n\nfunction toggleValue(value: string) {\n if (props.selectionMode === 'single') {\n const next = internalSelected.value.includes(value) ? [] : [value]\n internalSelected.value = next\n emit('update:modelValue', next[0] ?? '')\n } else {\n // multiple\n const idx = internalSelected.value.indexOf(value)\n const next = idx === -1\n ? [...internalSelected.value, value]\n : internalSelected.value.filter((v) => v !== value)\n internalSelected.value = next\n emit('update:modelValue', next)\n }\n}\n\n// Provide context to child ToggleButtons via toRef() for live reactivity\nuseToggleButtonGroupProvide({\n variant: toRef(props, 'variant'),\n size: toRef(props, 'size'),\n disabled: toRef(props, 'disabled'),\n fullWidth: toRef(props, 'fullWidth'),\n orientation: toRef(props, 'orientation'),\n selectionMode: toRef(props, 'selectionMode'),\n selectedValues,\n toggleValue,\n})\n\nconst slotFns = computed(() =>\n toggleButtonGroupVariants({\n fullWidth: props.fullWidth,\n orientation: props.orientation,\n isDetached: props.isDetached,\n })\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n role=\"group\"\n >\n <template v-if=\"props.buttons\">\n <ToggleButton\n v-for=\"btn in props.buttons\"\n :key=\"btn.value\"\n :value=\"btn.value\"\n :is-icon-only=\"btn.isIconOnly\"\n :disabled=\"btn.disabled\"\n :class=\"btn.class\"\n >{{ btn.label }}</ToggleButton>\n </template>\n <slot v-else />\n </div>\n</template>\n"],"mappings":""}
|