@alfakit/vue 0.1.1 → 0.1.2
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/CHANGELOG.md +8 -0
- package/dist/components/actions/ActionButton.js.map +1 -1
- package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionModal.js.map +1 -1
- package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +214 -214
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ColorPickerField.js.map +1 -1
- package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/FileUploadField.js.map +1 -1
- package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SelectField.js.map +1 -1
- package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/FormBlock.js.map +1 -1
- package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/form-context.js +25 -25
- package/dist/components/form/form-context.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/TabsComponent.js.map +1 -1
- package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearch.js.map +1 -1
- package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/TenantMenu.js.map +1 -1
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectCell.js.map +1 -1
- package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +24 -19
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TextInputCell.js.map +1 -1
- package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +38 -33
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components.css +347 -0
- package/dist/eject-manifest.json +2 -2
- package/dist/standalone/AlfakitToaster.js.map +1 -1
- package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone.css +47 -0
- package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/themes.css +2 -334
- package/package.json +3 -3
- package/src/components/actions/ActionButton.vue +14 -6
- package/src/components/actions/ActionModal.vue +3 -1
- package/src/components/fields/ColorPickerField.vue +1 -0
- package/src/components/fields/ComboboxSelect.vue +1 -1
- package/src/components/fields/FileUploadField.vue +14 -11
- package/src/components/fields/OneTimeCodeInputField.vue +1 -1
- package/src/components/fields/SelectField.vue +4 -2
- package/src/components/fields/TableColumnHeaders.vue +6 -1
- package/src/components/file-manager/FileManagerView.vue +1 -1
- package/src/components/form/FormBlock.vue +24 -0
- package/src/components/form/form-context.ts +2 -2
- package/src/components/layout/FusedGroupComponent.vue +1 -0
- package/src/components/layout/TabsComponent.vue +61 -5
- package/src/components/notifications/NotificationsMenu.vue +11 -0
- package/src/components/panel/GlobalSearch.vue +1 -0
- package/src/components/panel/ShortcutKeys.vue +1 -0
- package/src/components/panel/TenantMenu.vue +2 -2
- package/src/components/table/GroupHeaderRow.vue +27 -0
- package/src/components/table/SelectCell.vue +5 -2
- package/src/components/table/TextInputCell.vue +11 -5
- package/src/standalone/AlfakitToaster.vue +12 -2
- package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
- package/src/starter-kit/widgets/TenantChooser.vue +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @alfakit/vue
|
|
2
2
|
|
|
3
|
+
## 0.1.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixes from end-to-end QA in React, Vue and Svelte: modal field ids, errors in hidden tabs, per-row action spinners, one-time-code paste, RTL fixes (colours, key bindings, calendar), localised file sizes and named upload buttons, select placeholders, single toasts in starter kits, readable tab query values, enum group titles, tenant menu labels, Svelte hydration gate, plugin styles in starter-kit mode, and more (see the AlfaKit changelog for 0.1.2).
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @alfakit/core@0.1.2
|
|
10
|
+
|
|
3
11
|
## 0.1.1
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButton.js","names":["_sfc_main","ActionButton_vue_vue_type_script_setup_true_lang_default","ActionButton_default"],"sources":["../../../src/components/actions/ActionButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ActionContext, ActionSchema } from '@alfakit/core'\nimport {\n bindsKeyBindings,\n formatKeyBinding,\n iconButtonSize,\n registerKeyBindings,\n resolveActionSize,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { computed, watchEffect, type HTMLAttributes } from 'vue'\nimport { useStoreSelector } from '../../composables/use-store'\nimport { useActionRunner, useT } from '../../context'\nimport {\n badgeColorClasses,\n colorClass,\n ghostButtonColorClasses,\n outlineButtonColorClasses,\n solidButtonColorClasses,\n textColorClasses,\n} from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Button from '../ui/Button.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport Tooltip from '../ui/Tooltip.vue'\nimport TooltipContent from '../ui/TooltipContent.vue'\nimport TooltipTrigger from '../ui/TooltipTrigger.vue'\n\nexport interface ActionButtonProps {\n action: ActionSchema\n context: ActionContext\n size?: 'xs' | 'sm' | 'default' | 'lg'\n class?: HTMLAttributes['class']\n /** Force a variant (e.g. menu items render as plain rows). */\n variant?: ActionSchema['variant']\n /** Bind the action's key bindings globally while mounted. */\n withKeyBindings?: boolean\n /** Override how the action runs (e.g. a form submits its values). */\n onTrigger?: (action: ActionSchema, context: ActionContext) => void | Promise<void>\n}\n\nconst props = withDefaults(defineProps<ActionButtonProps>(), {\n size: 'default',\n withKeyBindings: true,\n})\n\nconst runner = useActionRunner()\nconst loading = useStoreSelector(runner.store, (state) => state.loading === props.action.name)\nconst processing = useStoreSelector(runner.store, (state) =>\n state.modals.some((modal) => modal.action.name === props.action.name && modal.processing),\n)\n\nconst variant = computed(\n () =>\n props.variant ??\n (props.action.outlined\n ? 'outline'\n : (props.action.variant ??\n (props.action.hasAction || props.action.hasModal || props.action.url ? 'link' : 'button'))),\n)\nconst isIconOnly = computed(() => variant.value === 'icon-button' || !props.action.label)\nconst busy = computed(() => loading.value || processing.value)\n// A disabled link renders as a disabled button so it cannot navigate.\nconst isPlainLink = computed(() =>\n Boolean(\n props.action.url && !props.action.hasAction && !props.action.hasModal && !props.action.disabled,\n ),\n)\n// Record actions repeat per row: a global shortcut would run them for every record.\nconst bindsKeys = computed(\n () => props.withKeyBindings && bindsKeyBindings(props.action, props.context),\n)\n\n/** The badge trigger style (`badge()` without an argument). */\nconst BADGE_TRIGGER_CLASSES =\n \"h-auto min-h-6 gap-1 rounded-md border px-2 py-0.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-3.5\"\n\nfunction buttonClasses(action: ActionSchema, kind: ActionSchema['variant']): string {\n const color = action.color ?? 'primary'\n\n switch (kind) {\n case 'outline':\n return cn('bg-background border', colorClass(outlineButtonColorClasses, color, 'gray'))\n case 'ghost':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'link':\n return cn(\n 'h-auto p-0 underline-offset-4 hover:underline',\n colorClass(textColorClasses, color, 'primary'),\n )\n case 'icon-button':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'badge':\n // `badge()`: a tinted pill in the action's colour.\n return cn(BADGE_TRIGGER_CLASSES, colorClass(badgeColorClasses, color, 'primary'))\n default:\n return colorClass(solidButtonColorClasses, color, 'primary')\n }\n}\n\nconst run = () =>\n void (props.onTrigger\n ? props.onTrigger(props.action, props.context)\n : runner.trigger(props.action, props.context))\n\nwatchEffect((onCleanup) => {\n if (!bindsKeys.value || !props.action.keyBindings) {\n return\n }\n\n onCleanup(registerKeyBindings([{ keys: props.action.keyBindings, handler: run }]))\n})\n\nconst onClick = (event: MouseEvent) => {\n if (isPlainLink.value) {\n return // Plain link: let Inertia Link / anchor handle it.\n }\n\n event.preventDefault()\n run()\n}\n\nconst sizeProp = computed(() => {\n const size = variant.value === 'badge' ? 'xs' : resolveActionSize(props.action.size, props.size)\n\n return isIconOnly.value ? iconButtonSize(size) : size\n})\n// `labeledFrom()`: icon only below the breakpoint; the label stays the accessible name.\nconst LABEL_FROM: Record<string, string> = {\n sm: 'hidden sm:inline',\n md: 'hidden md:inline',\n lg: 'hidden lg:inline',\n xl: 'hidden xl:inline',\n '2xl': 'hidden 2xl:inline',\n}\nconst ICON_ONLY_BELOW: Record<string, string> = {\n sm: 'max-sm:aspect-square max-sm:px-0',\n md: 'max-md:aspect-square max-md:px-0',\n lg: 'max-lg:aspect-square max-lg:px-0',\n xl: 'max-xl:aspect-square max-xl:px-0',\n '2xl': 'max-2xl:aspect-square max-2xl:px-0',\n}\nconst labeledFrom = computed(() =>\n !isIconOnly.value && props.action.icon && props.action.labeledFrom\n ? props.action.labeledFrom\n : null,\n)\nconst labelClass = computed(() => (labeledFrom.value ? LABEL_FROM[labeledFrom.value] : undefined))\nconst classes = computed(() =>\n cn(\n buttonClasses(props.action, variant.value),\n labeledFrom.value && ICON_ONLY_BELOW[labeledFrom.value],\n props.class,\n ),\n)\nconst t = useT()\nconst newTabHint = computed(() => t('opens_in_new_tab', {}, '(opens in a new tab)'))\nconst ariaLabel = computed(() => {\n if (!isIconOnly.value && !labeledFrom.value) return undefined\n\n const name = props.action.label ?? props.action.tooltip ?? props.action.name\n\n return isPlainLink.value && props.action.openUrlInNewTab ? `${name} ${newTabHint.value}` : name\n})\nconst tooltip = computed(\n () => props.action.tooltip ?? (isIconOnly.value ? props.action.label : undefined),\n)\nconst shortcut = computed(() => (bindsKeys.value ? props.action.keyBindings?.[0] : undefined))\nconst disabledTooltip = computed(() => Boolean(props.action.disabled && tooltip.value))\n</script>\n\n<template>\n <Tooltip v-if=\"tooltip || shortcut\">\n <!-- A disabled button gets no pointer or focus events: a focusable span carries the\n tooltip (e.g. the reason from `authorizationTooltip()`). -->\n <TooltipTrigger\n :as-child=\"!disabledTooltip\"\n :as=\"disabledTooltip ? 'span' : undefined\"\n :tabindex=\"disabledTooltip ? 0 : undefined\"\n :class=\"disabledTooltip ? 'inline-flex' : undefined\"\n :data-disabled-tooltip=\"disabledTooltip ? '' : undefined\"\n >\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {{ tooltip }}\n <kbd v-if=\"shortcut\" class=\"ms-2 rounded border border-white/20 px-1 font-mono text-[10px]\">{{\n formatKeyBinding(shortcut)\n }}</kbd>\n </TooltipContent>\n </Tooltip>\n <template v-else>\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </template>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ActionButton.js","names":["_sfc_main","ActionButton_vue_vue_type_script_setup_true_lang_default","ActionButton_default"],"sources":["../../../src/components/actions/ActionButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ActionContext, ActionSchema } from '@alfakit/core'\nimport {\n bindsKeyBindings,\n formatKeyBinding,\n iconButtonSize,\n isActionLoading,\n isActionProcessing,\n registerKeyBindings,\n resolveActionSize,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { computed, watchEffect, type HTMLAttributes } from 'vue'\nimport { useStoreSelector } from '../../composables/use-store'\nimport { useActionRunner, useT } from '../../context'\nimport {\n badgeColorClasses,\n colorClass,\n ghostButtonColorClasses,\n outlineButtonColorClasses,\n solidButtonColorClasses,\n textColorClasses,\n} from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Button from '../ui/Button.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport Tooltip from '../ui/Tooltip.vue'\nimport TooltipContent from '../ui/TooltipContent.vue'\nimport TooltipTrigger from '../ui/TooltipTrigger.vue'\n\nexport interface ActionButtonProps {\n action: ActionSchema\n context: ActionContext\n size?: 'xs' | 'sm' | 'default' | 'lg'\n class?: HTMLAttributes['class']\n /** Force a variant (e.g. menu items render as plain rows). */\n variant?: ActionSchema['variant']\n /** Bind the action's key bindings globally while mounted. */\n withKeyBindings?: boolean\n /** Override how the action runs (e.g. a form submits its values). */\n onTrigger?: (action: ActionSchema, context: ActionContext) => void | Promise<void>\n}\n\nconst props = withDefaults(defineProps<ActionButtonProps>(), {\n size: 'default',\n withKeyBindings: true,\n})\n\nconst runner = useActionRunner()\n// Only this run (this record's button), not the same action in every table row.\nconst loading = useStoreSelector(runner.store, (state) =>\n isActionLoading(state, props.action, props.context),\n)\nconst processing = useStoreSelector(runner.store, (state) =>\n isActionProcessing(state, props.action, props.context),\n)\n\nconst variant = computed(\n () =>\n props.variant ??\n (props.action.outlined\n ? 'outline'\n : (props.action.variant ??\n (props.action.hasAction || props.action.hasModal || props.action.url ? 'link' : 'button'))),\n)\nconst isIconOnly = computed(() => variant.value === 'icon-button' || !props.action.label)\nconst busy = computed(() => loading.value || processing.value)\n// A disabled link renders as a disabled button so it cannot navigate.\nconst isPlainLink = computed(() =>\n Boolean(\n props.action.url && !props.action.hasAction && !props.action.hasModal && !props.action.disabled,\n ),\n)\n// Record actions repeat per row: a global shortcut would run them for every record.\nconst bindsKeys = computed(\n () => props.withKeyBindings && bindsKeyBindings(props.action, props.context),\n)\n\n/** The badge trigger style (`badge()` without an argument). */\nconst BADGE_TRIGGER_CLASSES =\n \"h-auto min-h-6 gap-1 rounded-md border px-2 py-0.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-3.5\"\n\nfunction buttonClasses(action: ActionSchema, kind: ActionSchema['variant']): string {\n const color = action.color ?? 'primary'\n\n switch (kind) {\n case 'outline':\n return cn('bg-background border', colorClass(outlineButtonColorClasses, color, 'gray'))\n case 'ghost':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'link':\n return cn(\n 'h-auto p-0 underline-offset-4 hover:underline has-[>svg]:px-0',\n colorClass(textColorClasses, color, 'primary'),\n )\n case 'icon-button':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'badge':\n // `badge()`: a tinted pill in the action's colour.\n return cn(BADGE_TRIGGER_CLASSES, colorClass(badgeColorClasses, color, 'primary'))\n default:\n return colorClass(solidButtonColorClasses, color, 'primary')\n }\n}\n\nconst run = () =>\n void (props.onTrigger\n ? props.onTrigger(props.action, props.context)\n : runner.trigger(props.action, props.context))\n\nwatchEffect((onCleanup) => {\n if (!bindsKeys.value || !props.action.keyBindings) {\n return\n }\n\n onCleanup(registerKeyBindings([{ keys: props.action.keyBindings, handler: run }]))\n})\n\nconst onClick = (event: MouseEvent) => {\n if (isPlainLink.value) {\n return // Plain link: let Inertia Link / anchor handle it.\n }\n\n event.preventDefault()\n run()\n}\n\nconst sizeProp = computed(() => {\n const size = variant.value === 'badge' ? 'xs' : resolveActionSize(props.action.size, props.size)\n\n return isIconOnly.value ? iconButtonSize(size) : size\n})\n// `labeledFrom()`: icon only below the breakpoint; the label stays the accessible name.\nconst LABEL_FROM: Record<string, string> = {\n sm: 'hidden sm:inline',\n md: 'hidden md:inline',\n lg: 'hidden lg:inline',\n xl: 'hidden xl:inline',\n '2xl': 'hidden 2xl:inline',\n}\nconst ICON_ONLY_BELOW: Record<string, string> = {\n sm: 'max-sm:aspect-square max-sm:px-0',\n md: 'max-md:aspect-square max-md:px-0',\n lg: 'max-lg:aspect-square max-lg:px-0',\n xl: 'max-xl:aspect-square max-xl:px-0',\n '2xl': 'max-2xl:aspect-square max-2xl:px-0',\n}\nconst labeledFrom = computed(() =>\n !isIconOnly.value && props.action.icon && props.action.labeledFrom\n ? props.action.labeledFrom\n : null,\n)\nconst labelClass = computed(() => (labeledFrom.value ? LABEL_FROM[labeledFrom.value] : undefined))\nconst classes = computed(() =>\n cn(\n buttonClasses(props.action, variant.value),\n labeledFrom.value && ICON_ONLY_BELOW[labeledFrom.value],\n props.class,\n ),\n)\nconst t = useT()\nconst newTabHint = computed(() => t('opens_in_new_tab', {}, '(opens in a new tab)'))\nconst ariaLabel = computed(() => {\n if (!isIconOnly.value && !labeledFrom.value) return undefined\n\n const name = props.action.label ?? props.action.tooltip ?? props.action.name\n\n return isPlainLink.value && props.action.openUrlInNewTab ? `${name} ${newTabHint.value}` : name\n})\nconst tooltip = computed(\n () => props.action.tooltip ?? (isIconOnly.value ? props.action.label : undefined),\n)\nconst shortcut = computed(() => (bindsKeys.value ? props.action.keyBindings?.[0] : undefined))\nconst disabledTooltip = computed(() => Boolean(props.action.disabled && tooltip.value))\n</script>\n\n<template>\n <Tooltip v-if=\"tooltip || shortcut\">\n <!-- A disabled button gets no pointer or focus events: a focusable span carries the\n tooltip (e.g. the reason from `authorizationTooltip()`). -->\n <TooltipTrigger\n :as-child=\"!disabledTooltip\"\n :as=\"disabledTooltip ? 'span' : undefined\"\n :tabindex=\"disabledTooltip ? 0 : undefined\"\n :class=\"disabledTooltip ? 'inline-flex' : undefined\"\n :data-disabled-tooltip=\"disabledTooltip ? '' : undefined\"\n >\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {{ tooltip }}\n <kbd\n v-if=\"shortcut\"\n dir=\"ltr\"\n class=\"ms-2 rounded border border-white/20 px-1 font-mono text-[10px]\"\n >{{ formatKeyBinding(shortcut) }}</kbd\n >\n </TooltipContent>\n </Tooltip>\n <template v-else>\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </template>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButton.vue.d.ts","sourceRoot":"","sources":["../../../src/components/actions/ActionButton.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ActionButton.vue.d.ts","sourceRoot":"","sources":["../../../src/components/actions/ActionButton.vue"],"names":[],"mappings":"AAuYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAWhE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAA;AAoBhE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,aAAa,CAAA;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAA;IACrC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IACjC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnF;;UARQ,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;qBAKnB,OAAO;;AAoxB3B,wBAOG"}
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
import { useActionRunner as e, useT as t } from "../../context.js";
|
|
2
2
|
import { cn as n } from "../../lib/utils.js";
|
|
3
3
|
import { useStoreSelector as r } from "../../composables/use-store.js";
|
|
4
|
-
import { badgeColorClasses as i, colorClass as a, ghostButtonColorClasses as o, outlineButtonColorClasses as ee, solidButtonColorClasses as te, textColorClasses as
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import { bindsKeyBindings as f, formatKeyBinding as p, iconButtonSize as ae,
|
|
13
|
-
import { Link as
|
|
14
|
-
import { Fragment as
|
|
4
|
+
import { badgeColorClasses as i, colorClass as a, ghostButtonColorClasses as o, outlineButtonColorClasses as ee, solidButtonColorClasses as te, textColorClasses as ne } from "../../lib/colors.js";
|
|
5
|
+
import s from "../../lib/Icon.js";
|
|
6
|
+
import c from "../ui/Badge2.js";
|
|
7
|
+
import l from "../ui/Button2.js";
|
|
8
|
+
import u from "../ui/Spinner.js";
|
|
9
|
+
import re from "../ui/Tooltip.js";
|
|
10
|
+
import ie from "../ui/TooltipContent.js";
|
|
11
|
+
import d from "../ui/TooltipTrigger.js";
|
|
12
|
+
import { bindsKeyBindings as f, formatKeyBinding as p, iconButtonSize as ae, isActionLoading as oe, isActionProcessing as se, registerKeyBindings as m, resolveActionSize as h } from "@alfakit/core";
|
|
13
|
+
import { Link as g } from "@inertiajs/vue3";
|
|
14
|
+
import { Fragment as ce, computed as _, createBlock as v, createCommentVNode as y, createElementBlock as b, createElementVNode as x, createTextVNode as S, createVNode as C, defineComponent as w, mergeProps as T, normalizeClass as E, openBlock as D, toDisplayString as O, unref as k, watchEffect as le, withCtx as A } from "vue";
|
|
15
15
|
//#region src/components/actions/ActionButton.vue?vue&type=script&setup=true&lang.ts
|
|
16
|
-
var
|
|
16
|
+
var ue = ["href"], de = {
|
|
17
17
|
key: 3,
|
|
18
18
|
class: "sr-only"
|
|
19
|
-
},
|
|
19
|
+
}, fe = {
|
|
20
20
|
key: 0,
|
|
21
|
+
dir: "ltr",
|
|
21
22
|
class: "ms-2 rounded border border-white/20 px-1 font-mono text-[10px]"
|
|
22
|
-
},
|
|
23
|
+
}, pe = ["href"], j = {
|
|
23
24
|
key: 3,
|
|
24
25
|
class: "sr-only"
|
|
25
|
-
},
|
|
26
|
+
}, M = "h-auto min-h-6 gap-1 rounded-md border px-2 py-0.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-3.5", N = /*@__PURE__*/ w({
|
|
26
27
|
__name: "ActionButton",
|
|
27
28
|
props: {
|
|
28
29
|
action: {},
|
|
@@ -42,129 +43,129 @@ var A = ["href"], j = {
|
|
|
42
43
|
},
|
|
43
44
|
onTrigger: {}
|
|
44
45
|
},
|
|
45
|
-
setup(
|
|
46
|
-
let
|
|
47
|
-
function
|
|
46
|
+
setup(w) {
|
|
47
|
+
let N = w, P = e(), F = r(P.store, (e) => oe(e, N.action, N.context)), I = r(P.store, (e) => se(e, N.action, N.context)), L = _(() => N.variant ?? (N.action.outlined ? "outline" : N.action.variant ?? (N.action.hasAction || N.action.hasModal || N.action.url ? "link" : "button"))), R = _(() => L.value === "icon-button" || !N.action.label), z = _(() => F.value || I.value), B = _(() => !(!N.action.url || N.action.hasAction || N.action.hasModal || N.action.disabled)), V = _(() => N.withKeyBindings && f(N.action, N.context));
|
|
48
|
+
function me(e, t) {
|
|
48
49
|
let r = e.color ?? "primary";
|
|
49
50
|
switch (t) {
|
|
50
51
|
case "outline": return n("bg-background border", a(ee, r, "gray"));
|
|
51
52
|
case "ghost": return a(o, r, "gray");
|
|
52
|
-
case "link": return n("h-auto p-0 underline-offset-4 hover:underline", a(
|
|
53
|
+
case "link": return n("h-auto p-0 underline-offset-4 hover:underline has-[>svg]:px-0", a(ne, r, "primary"));
|
|
53
54
|
case "icon-button": return a(o, r, "gray");
|
|
54
|
-
case "badge": return n(
|
|
55
|
+
case "badge": return n(M, a(i, r, "primary"));
|
|
55
56
|
default: return a(te, r, "primary");
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
|
-
let
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
keys:
|
|
62
|
-
handler:
|
|
59
|
+
let H = () => void (N.onTrigger ? N.onTrigger(N.action, N.context) : P.trigger(N.action, N.context));
|
|
60
|
+
le((e) => {
|
|
61
|
+
V.value && N.action.keyBindings && e(m([{
|
|
62
|
+
keys: N.action.keyBindings,
|
|
63
|
+
handler: H
|
|
63
64
|
}]));
|
|
64
65
|
});
|
|
65
|
-
let
|
|
66
|
-
|
|
67
|
-
},
|
|
68
|
-
let e =
|
|
69
|
-
return
|
|
70
|
-
}),
|
|
66
|
+
let U = (e) => {
|
|
67
|
+
B.value || (e.preventDefault(), H());
|
|
68
|
+
}, W = _(() => {
|
|
69
|
+
let e = L.value === "badge" ? "xs" : h(N.action.size, N.size);
|
|
70
|
+
return R.value ? ae(e) : e;
|
|
71
|
+
}), G = {
|
|
71
72
|
sm: "hidden sm:inline",
|
|
72
73
|
md: "hidden md:inline",
|
|
73
74
|
lg: "hidden lg:inline",
|
|
74
75
|
xl: "hidden xl:inline",
|
|
75
76
|
"2xl": "hidden 2xl:inline"
|
|
76
|
-
},
|
|
77
|
+
}, he = {
|
|
77
78
|
sm: "max-sm:aspect-square max-sm:px-0",
|
|
78
79
|
md: "max-md:aspect-square max-md:px-0",
|
|
79
80
|
lg: "max-lg:aspect-square max-lg:px-0",
|
|
80
81
|
xl: "max-xl:aspect-square max-xl:px-0",
|
|
81
82
|
"2xl": "max-2xl:aspect-square max-2xl:px-0"
|
|
82
|
-
}, K =
|
|
83
|
-
if (!
|
|
84
|
-
let e =
|
|
85
|
-
return
|
|
86
|
-
}), Z =
|
|
87
|
-
return (e, t) => Z.value || Q.value ? (
|
|
88
|
-
default:
|
|
83
|
+
}, K = _(() => !R.value && N.action.icon && N.action.labeledFrom ? N.action.labeledFrom : null), q = _(() => K.value ? G[K.value] : void 0), J = _(() => n(me(N.action, L.value), K.value && he[K.value], N.class)), ge = t(), Y = _(() => ge("opens_in_new_tab", {}, "(opens in a new tab)")), X = _(() => {
|
|
84
|
+
if (!R.value && !K.value) return;
|
|
85
|
+
let e = N.action.label ?? N.action.tooltip ?? N.action.name;
|
|
86
|
+
return B.value && N.action.openUrlInNewTab ? `${e} ${Y.value}` : e;
|
|
87
|
+
}), Z = _(() => N.action.tooltip ?? (R.value ? N.action.label : void 0)), Q = _(() => V.value ? N.action.keyBindings?.[0] : void 0), $ = _(() => !!(N.action.disabled && Z.value));
|
|
88
|
+
return (e, t) => Z.value || Q.value ? (D(), v(re, { key: 0 }, {
|
|
89
|
+
default: A(() => [C(d, {
|
|
89
90
|
"as-child": !$.value,
|
|
90
91
|
as: $.value ? "span" : void 0,
|
|
91
92
|
tabindex: $.value ? 0 : void 0,
|
|
92
|
-
class:
|
|
93
|
+
class: E($.value ? "inline-flex" : void 0),
|
|
93
94
|
"data-disabled-tooltip": $.value ? "" : void 0
|
|
94
95
|
}, {
|
|
95
|
-
default:
|
|
96
|
+
default: A(() => [B.value && N.action.openUrlInNewTab ? (D(), v(l, T({
|
|
96
97
|
key: 0,
|
|
97
98
|
"as-child": "",
|
|
98
99
|
variant: "plain",
|
|
99
|
-
size:
|
|
100
|
+
size: W.value,
|
|
100
101
|
class: J.value,
|
|
101
|
-
disabled:
|
|
102
|
+
disabled: N.action.disabled,
|
|
102
103
|
"aria-label": X.value
|
|
103
|
-
},
|
|
104
|
-
default:
|
|
105
|
-
href:
|
|
104
|
+
}, N.action.extraAttributes), {
|
|
105
|
+
default: A(() => [x("a", {
|
|
106
|
+
href: N.action.url,
|
|
106
107
|
target: "_blank",
|
|
107
108
|
rel: "noopener noreferrer"
|
|
108
109
|
}, [
|
|
109
|
-
|
|
110
|
+
z.value ? (D(), v(u, { key: 0 })) : N.action.icon && N.action.iconPosition !== "after" ? (D(), v(k(s), {
|
|
110
111
|
key: 1,
|
|
111
|
-
name:
|
|
112
|
-
}, null, 8, ["name"])) :
|
|
113
|
-
|
|
112
|
+
name: N.action.icon
|
|
113
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
114
|
+
R.value ? y("", !0) : (D(), b("span", {
|
|
114
115
|
key: 2,
|
|
115
|
-
class:
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
class: E(q.value)
|
|
117
|
+
}, O(N.action.label), 3)),
|
|
118
|
+
R.value ? y("", !0) : (D(), b("span", de, O(Y.value), 1)),
|
|
119
|
+
N.action.icon && N.action.iconPosition === "after" && !z.value ? (D(), v(k(s), {
|
|
119
120
|
key: 4,
|
|
120
|
-
name:
|
|
121
|
-
}, null, 8, ["name"])) :
|
|
122
|
-
|
|
121
|
+
name: N.action.icon
|
|
122
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
123
|
+
N.action.badge !== void 0 && N.action.badge !== null ? (D(), v(c, {
|
|
123
124
|
key: 5,
|
|
124
125
|
variant: "outline",
|
|
125
|
-
class:
|
|
126
|
+
class: E(k(n)("ms-1 px-1.5 py-0", k(a)(k(i), N.action.badgeColor, "gray")))
|
|
126
127
|
}, {
|
|
127
|
-
default:
|
|
128
|
+
default: A(() => [S(O(N.action.badge), 1)]),
|
|
128
129
|
_: 1
|
|
129
|
-
}, 8, ["class"])) :
|
|
130
|
-
], 8,
|
|
130
|
+
}, 8, ["class"])) : y("", !0)
|
|
131
|
+
], 8, ue)]),
|
|
131
132
|
_: 1
|
|
132
133
|
}, 16, [
|
|
133
134
|
"size",
|
|
134
135
|
"class",
|
|
135
136
|
"disabled",
|
|
136
137
|
"aria-label"
|
|
137
|
-
])) :
|
|
138
|
+
])) : B.value ? (D(), v(l, T({
|
|
138
139
|
key: 1,
|
|
139
140
|
"as-child": "",
|
|
140
141
|
variant: "plain",
|
|
141
|
-
size:
|
|
142
|
+
size: W.value,
|
|
142
143
|
class: J.value,
|
|
143
|
-
disabled:
|
|
144
|
+
disabled: N.action.disabled,
|
|
144
145
|
"aria-label": X.value
|
|
145
|
-
},
|
|
146
|
-
default:
|
|
147
|
-
default:
|
|
148
|
-
|
|
146
|
+
}, N.action.extraAttributes), {
|
|
147
|
+
default: A(() => [C(k(g), { href: N.action.url ?? "#" }, {
|
|
148
|
+
default: A(() => [
|
|
149
|
+
z.value ? (D(), v(u, { key: 0 })) : N.action.icon && N.action.iconPosition !== "after" ? (D(), v(k(s), {
|
|
149
150
|
key: 1,
|
|
150
|
-
name:
|
|
151
|
-
}, null, 8, ["name"])) :
|
|
152
|
-
|
|
151
|
+
name: N.action.icon
|
|
152
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
153
|
+
R.value ? y("", !0) : (D(), b("span", {
|
|
153
154
|
key: 2,
|
|
154
|
-
class:
|
|
155
|
-
},
|
|
156
|
-
|
|
155
|
+
class: E(q.value)
|
|
156
|
+
}, O(N.action.label), 3)),
|
|
157
|
+
N.action.icon && N.action.iconPosition === "after" && !z.value ? (D(), v(k(s), {
|
|
157
158
|
key: 3,
|
|
158
|
-
name:
|
|
159
|
-
}, null, 8, ["name"])) :
|
|
160
|
-
|
|
159
|
+
name: N.action.icon
|
|
160
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
161
|
+
N.action.badge !== void 0 && N.action.badge !== null ? (D(), v(c, {
|
|
161
162
|
key: 4,
|
|
162
163
|
variant: "outline",
|
|
163
|
-
class:
|
|
164
|
+
class: E(k(n)("ms-1 px-1.5 py-0", k(a)(k(i), N.action.badgeColor, "gray")))
|
|
164
165
|
}, {
|
|
165
|
-
default:
|
|
166
|
+
default: A(() => [S(O(N.action.badge), 1)]),
|
|
166
167
|
_: 1
|
|
167
|
-
}, 8, ["class"])) :
|
|
168
|
+
}, 8, ["class"])) : y("", !0)
|
|
168
169
|
]),
|
|
169
170
|
_: 1
|
|
170
171
|
}, 8, ["href"])]),
|
|
@@ -174,36 +175,36 @@ var A = ["href"], j = {
|
|
|
174
175
|
"class",
|
|
175
176
|
"disabled",
|
|
176
177
|
"aria-label"
|
|
177
|
-
])) : (
|
|
178
|
+
])) : (D(), v(l, T({
|
|
178
179
|
key: 2,
|
|
179
180
|
type: "button",
|
|
180
181
|
variant: "plain",
|
|
181
|
-
size:
|
|
182
|
+
size: W.value,
|
|
182
183
|
class: J.value,
|
|
183
|
-
disabled:
|
|
184
|
+
disabled: N.action.disabled || z.value,
|
|
184
185
|
"aria-label": X.value
|
|
185
|
-
},
|
|
186
|
-
default:
|
|
187
|
-
|
|
186
|
+
}, N.action.extraAttributes, { onClick: U }), {
|
|
187
|
+
default: A(() => [
|
|
188
|
+
z.value ? (D(), v(u, { key: 0 })) : N.action.icon && N.action.iconPosition !== "after" ? (D(), v(k(s), {
|
|
188
189
|
key: 1,
|
|
189
|
-
name:
|
|
190
|
-
}, null, 8, ["name"])) :
|
|
191
|
-
|
|
190
|
+
name: N.action.icon
|
|
191
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
192
|
+
R.value ? y("", !0) : (D(), b("span", {
|
|
192
193
|
key: 2,
|
|
193
|
-
class:
|
|
194
|
-
},
|
|
195
|
-
|
|
194
|
+
class: E(q.value)
|
|
195
|
+
}, O(N.action.label), 3)),
|
|
196
|
+
N.action.icon && N.action.iconPosition === "after" && !z.value ? (D(), v(k(s), {
|
|
196
197
|
key: 3,
|
|
197
|
-
name:
|
|
198
|
-
}, null, 8, ["name"])) :
|
|
199
|
-
|
|
198
|
+
name: N.action.icon
|
|
199
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
200
|
+
N.action.badge !== void 0 && N.action.badge !== null ? (D(), v(c, {
|
|
200
201
|
key: 4,
|
|
201
202
|
variant: "outline",
|
|
202
|
-
class:
|
|
203
|
+
class: E(k(n)("ms-1 px-1.5 py-0", k(a)(k(i), N.action.badgeColor, "gray")))
|
|
203
204
|
}, {
|
|
204
|
-
default:
|
|
205
|
+
default: A(() => [S(O(N.action.badge), 1)]),
|
|
205
206
|
_: 1
|
|
206
|
-
}, 8, ["class"])) :
|
|
207
|
+
}, 8, ["class"])) : y("", !0)
|
|
207
208
|
]),
|
|
208
209
|
_: 1
|
|
209
210
|
}, 16, [
|
|
@@ -219,84 +220,84 @@ var A = ["href"], j = {
|
|
|
219
220
|
"tabindex",
|
|
220
221
|
"class",
|
|
221
222
|
"data-disabled-tooltip"
|
|
222
|
-
]),
|
|
223
|
-
default:
|
|
223
|
+
]), C(ie, null, {
|
|
224
|
+
default: A(() => [S(O(Z.value) + " ", 1), Q.value ? (D(), b("kbd", fe, O(k(p)(Q.value)), 1)) : y("", !0)]),
|
|
224
225
|
_: 1
|
|
225
226
|
})]),
|
|
226
227
|
_: 1
|
|
227
|
-
})) : (
|
|
228
|
+
})) : (D(), b(ce, { key: 1 }, [B.value && N.action.openUrlInNewTab ? (D(), v(l, T({
|
|
228
229
|
key: 0,
|
|
229
230
|
"as-child": "",
|
|
230
231
|
variant: "plain",
|
|
231
|
-
size:
|
|
232
|
+
size: W.value,
|
|
232
233
|
class: J.value,
|
|
233
|
-
disabled:
|
|
234
|
+
disabled: N.action.disabled,
|
|
234
235
|
"aria-label": X.value
|
|
235
|
-
},
|
|
236
|
-
default:
|
|
237
|
-
href:
|
|
236
|
+
}, N.action.extraAttributes), {
|
|
237
|
+
default: A(() => [x("a", {
|
|
238
|
+
href: N.action.url,
|
|
238
239
|
target: "_blank",
|
|
239
240
|
rel: "noopener noreferrer"
|
|
240
241
|
}, [
|
|
241
|
-
|
|
242
|
+
z.value ? (D(), v(u, { key: 0 })) : N.action.icon && N.action.iconPosition !== "after" ? (D(), v(k(s), {
|
|
242
243
|
key: 1,
|
|
243
|
-
name:
|
|
244
|
-
}, null, 8, ["name"])) :
|
|
245
|
-
|
|
244
|
+
name: N.action.icon
|
|
245
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
246
|
+
R.value ? y("", !0) : (D(), b("span", {
|
|
246
247
|
key: 2,
|
|
247
|
-
class:
|
|
248
|
-
},
|
|
249
|
-
|
|
250
|
-
|
|
248
|
+
class: E(q.value)
|
|
249
|
+
}, O(N.action.label), 3)),
|
|
250
|
+
R.value ? y("", !0) : (D(), b("span", j, O(Y.value), 1)),
|
|
251
|
+
N.action.icon && N.action.iconPosition === "after" && !z.value ? (D(), v(k(s), {
|
|
251
252
|
key: 4,
|
|
252
|
-
name:
|
|
253
|
-
}, null, 8, ["name"])) :
|
|
254
|
-
|
|
253
|
+
name: N.action.icon
|
|
254
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
255
|
+
N.action.badge !== void 0 && N.action.badge !== null ? (D(), v(c, {
|
|
255
256
|
key: 5,
|
|
256
257
|
variant: "outline",
|
|
257
|
-
class:
|
|
258
|
+
class: E(k(n)("ms-1 px-1.5 py-0", k(a)(k(i), N.action.badgeColor, "gray")))
|
|
258
259
|
}, {
|
|
259
|
-
default:
|
|
260
|
+
default: A(() => [S(O(N.action.badge), 1)]),
|
|
260
261
|
_: 1
|
|
261
|
-
}, 8, ["class"])) :
|
|
262
|
-
], 8,
|
|
262
|
+
}, 8, ["class"])) : y("", !0)
|
|
263
|
+
], 8, pe)]),
|
|
263
264
|
_: 1
|
|
264
265
|
}, 16, [
|
|
265
266
|
"size",
|
|
266
267
|
"class",
|
|
267
268
|
"disabled",
|
|
268
269
|
"aria-label"
|
|
269
|
-
])) :
|
|
270
|
+
])) : B.value ? (D(), v(l, T({
|
|
270
271
|
key: 1,
|
|
271
272
|
"as-child": "",
|
|
272
273
|
variant: "plain",
|
|
273
|
-
size:
|
|
274
|
+
size: W.value,
|
|
274
275
|
class: J.value,
|
|
275
|
-
disabled:
|
|
276
|
+
disabled: N.action.disabled,
|
|
276
277
|
"aria-label": X.value
|
|
277
|
-
},
|
|
278
|
-
default:
|
|
279
|
-
default:
|
|
280
|
-
|
|
278
|
+
}, N.action.extraAttributes), {
|
|
279
|
+
default: A(() => [C(k(g), { href: N.action.url ?? "#" }, {
|
|
280
|
+
default: A(() => [
|
|
281
|
+
z.value ? (D(), v(u, { key: 0 })) : N.action.icon && N.action.iconPosition !== "after" ? (D(), v(k(s), {
|
|
281
282
|
key: 1,
|
|
282
|
-
name:
|
|
283
|
-
}, null, 8, ["name"])) :
|
|
284
|
-
|
|
283
|
+
name: N.action.icon
|
|
284
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
285
|
+
R.value ? y("", !0) : (D(), b("span", {
|
|
285
286
|
key: 2,
|
|
286
|
-
class:
|
|
287
|
-
},
|
|
288
|
-
|
|
287
|
+
class: E(q.value)
|
|
288
|
+
}, O(N.action.label), 3)),
|
|
289
|
+
N.action.icon && N.action.iconPosition === "after" && !z.value ? (D(), v(k(s), {
|
|
289
290
|
key: 3,
|
|
290
|
-
name:
|
|
291
|
-
}, null, 8, ["name"])) :
|
|
292
|
-
|
|
291
|
+
name: N.action.icon
|
|
292
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
293
|
+
N.action.badge !== void 0 && N.action.badge !== null ? (D(), v(c, {
|
|
293
294
|
key: 4,
|
|
294
295
|
variant: "outline",
|
|
295
|
-
class:
|
|
296
|
+
class: E(k(n)("ms-1 px-1.5 py-0", k(a)(k(i), N.action.badgeColor, "gray")))
|
|
296
297
|
}, {
|
|
297
|
-
default:
|
|
298
|
+
default: A(() => [S(O(N.action.badge), 1)]),
|
|
298
299
|
_: 1
|
|
299
|
-
}, 8, ["class"])) :
|
|
300
|
+
}, 8, ["class"])) : y("", !0)
|
|
300
301
|
]),
|
|
301
302
|
_: 1
|
|
302
303
|
}, 8, ["href"])]),
|
|
@@ -306,36 +307,36 @@ var A = ["href"], j = {
|
|
|
306
307
|
"class",
|
|
307
308
|
"disabled",
|
|
308
309
|
"aria-label"
|
|
309
|
-
])) : (
|
|
310
|
+
])) : (D(), v(l, T({
|
|
310
311
|
key: 2,
|
|
311
312
|
type: "button",
|
|
312
313
|
variant: "plain",
|
|
313
|
-
size:
|
|
314
|
+
size: W.value,
|
|
314
315
|
class: J.value,
|
|
315
|
-
disabled:
|
|
316
|
+
disabled: N.action.disabled || z.value,
|
|
316
317
|
"aria-label": X.value
|
|
317
|
-
},
|
|
318
|
-
default:
|
|
319
|
-
|
|
318
|
+
}, N.action.extraAttributes, { onClick: U }), {
|
|
319
|
+
default: A(() => [
|
|
320
|
+
z.value ? (D(), v(u, { key: 0 })) : N.action.icon && N.action.iconPosition !== "after" ? (D(), v(k(s), {
|
|
320
321
|
key: 1,
|
|
321
|
-
name:
|
|
322
|
-
}, null, 8, ["name"])) :
|
|
323
|
-
|
|
322
|
+
name: N.action.icon
|
|
323
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
324
|
+
R.value ? y("", !0) : (D(), b("span", {
|
|
324
325
|
key: 2,
|
|
325
|
-
class:
|
|
326
|
-
},
|
|
327
|
-
|
|
326
|
+
class: E(q.value)
|
|
327
|
+
}, O(N.action.label), 3)),
|
|
328
|
+
N.action.icon && N.action.iconPosition === "after" && !z.value ? (D(), v(k(s), {
|
|
328
329
|
key: 3,
|
|
329
|
-
name:
|
|
330
|
-
}, null, 8, ["name"])) :
|
|
331
|
-
|
|
330
|
+
name: N.action.icon
|
|
331
|
+
}, null, 8, ["name"])) : y("", !0),
|
|
332
|
+
N.action.badge !== void 0 && N.action.badge !== null ? (D(), v(c, {
|
|
332
333
|
key: 4,
|
|
333
334
|
variant: "outline",
|
|
334
|
-
class:
|
|
335
|
+
class: E(k(n)("ms-1 px-1.5 py-0", k(a)(k(i), N.action.badgeColor, "gray")))
|
|
335
336
|
}, {
|
|
336
|
-
default:
|
|
337
|
+
default: A(() => [S(O(N.action.badge), 1)]),
|
|
337
338
|
_: 1
|
|
338
|
-
}, 8, ["class"])) :
|
|
339
|
+
}, 8, ["class"])) : y("", !0)
|
|
339
340
|
]),
|
|
340
341
|
_: 1
|
|
341
342
|
}, 16, [
|
|
@@ -347,6 +348,6 @@ var A = ["href"], j = {
|
|
|
347
348
|
}
|
|
348
349
|
});
|
|
349
350
|
//#endregion
|
|
350
|
-
export {
|
|
351
|
+
export { N as default };
|
|
351
352
|
|
|
352
353
|
//# sourceMappingURL=ActionButton.vue_vue_type_script_setup_true_lang.js.map
|