@treeui/vue 0.19.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/components/TAppShell.cjs.map +1 -1
  2. package/dist/components/TAppShell.js.map +1 -1
  3. package/dist/components/TAppShell.vue.d.ts +4 -0
  4. package/dist/components/TAppShell.vue.d.ts.map +1 -1
  5. package/dist/components/TAppShell.vue_vue_type_script_setup_true_lang.cjs +1 -1
  6. package/dist/components/TAppShell.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  7. package/dist/components/TAppShell.vue_vue_type_script_setup_true_lang.js +51 -44
  8. package/dist/components/TAppShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/TButton.cjs.map +1 -1
  10. package/dist/components/TButton.js.map +1 -1
  11. package/dist/components/TButton.vue.d.ts.map +1 -1
  12. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.cjs +1 -1
  13. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  14. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.js +36 -32
  15. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/TCard.cjs.map +1 -1
  17. package/dist/components/TCard.js.map +1 -1
  18. package/dist/components/TCard.vue.d.ts +8 -0
  19. package/dist/components/TCard.vue.d.ts.map +1 -1
  20. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.cjs +1 -1
  21. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  22. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.js +7 -2
  23. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/components/TLink.cjs.map +1 -1
  25. package/dist/components/TLink.js.map +1 -1
  26. package/dist/components/TLink.vue.d.ts +8 -0
  27. package/dist/components/TLink.vue.d.ts.map +1 -1
  28. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.cjs +1 -1
  29. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  30. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.js +5 -1
  31. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/TPopover.cjs.map +1 -1
  33. package/dist/components/TPopover.js.map +1 -1
  34. package/dist/components/TPopover.vue.d.ts +4 -1
  35. package/dist/components/TPopover.vue.d.ts.map +1 -1
  36. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.cjs +1 -1
  37. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  38. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.js +3 -1
  39. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/TStack.cjs.map +1 -1
  41. package/dist/components/TStack.js.map +1 -1
  42. package/dist/components/TStack.vue.d.ts +9 -0
  43. package/dist/components/TStack.vue.d.ts.map +1 -1
  44. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.cjs +1 -1
  45. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  46. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.js +3 -1
  47. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/TSteps.vue.d.ts +1 -1
  49. package/dist/components/TSteps.vue.d.ts.map +1 -1
  50. package/dist/components/TTable.cjs.map +1 -1
  51. package/dist/components/TTable.js.map +1 -1
  52. package/dist/components/TTable.vue.d.ts +16 -0
  53. package/dist/components/TTable.vue.d.ts.map +1 -1
  54. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.cjs +1 -1
  55. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  56. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.js +29 -9
  57. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/TText.cjs.map +1 -1
  59. package/dist/components/TText.js.map +1 -1
  60. package/dist/components/TText.vue.d.ts +9 -0
  61. package/dist/components/TText.vue.d.ts.map +1 -1
  62. package/dist/components/TText.vue_vue_type_script_setup_true_lang.cjs +1 -1
  63. package/dist/components/TText.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  64. package/dist/components/TText.vue_vue_type_script_setup_true_lang.js +2 -0
  65. package/dist/components/TText.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/index.d.ts +4 -4
  67. package/dist/components/index.d.ts.map +1 -1
  68. package/dist/style.css +1 -1
  69. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"TButton.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../src/components/TButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { tv } from '@treeui/utils';\nimport type { TSize, TVariant } from '../types/contracts';\nimport TSpinner from './TSpinner.vue';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TVariant | 'brand';\n size?: TSize;\n disabled?: boolean;\n loading?: boolean;\n /**\n * Accessible announcement while `loading`, forwarded to the spinner.\n * The default is English; pass the active locale's string to localize it.\n */\n loadingLabel?: string;\n /**\n * While `loading`, hide the `icon` slot so the spinner replaces the icon\n * instead of rendering beside it. Set to `false` to keep both visible.\n */\n hideIconWhileLoading?: boolean;\n /**\n * Square, icon-only button. The visible label is dropped, so an accessible\n * name is required — pass `label` (or `aria-label`).\n */\n iconOnly?: boolean;\n /** Accessible name, rendered as `aria-label`. Required when `iconOnly`. */\n label?: string;\n type?: 'button' | 'submit' | 'reset';\n /** Stretch to the full width of the container. */\n block?: boolean;\n /** Content alignment — only meaningful together with `block`. */\n align?: 'start' | 'center' | 'end';\n }>(),\n {\n as: 'button',\n variant: 'solid',\n size: 'md',\n disabled: false,\n loading: false,\n loadingLabel: 'Loading',\n hideIconWhileLoading: true,\n iconOnly: false,\n label: undefined,\n type: 'button',\n block: false,\n align: 'center',\n },\n);\n\nconst emit = defineEmits<{\n click: [event: MouseEvent];\n}>();\n\nconst buttonClass = tv({\n base: 't-button',\n variants: {\n variant: {\n solid: 't-button--solid',\n outline: 't-button--outline',\n ghost: 't-button--ghost',\n soft: 't-button--soft',\n danger: 't-button--danger',\n brand: 't-button--brand',\n },\n size: {\n sm: 't-button--sm',\n md: 't-button--md',\n lg: 't-button--lg',\n },\n },\n});\n\nconst isNativeButton = computed(() => props.as === 'button');\nconst isDisabled = computed(() => props.disabled || props.loading);\n\n// The spinner takes the icon's leading position, so rendering both would show\n// two glyphs and widen the button mid-action.\nconst isIconHidden = computed(() => props.loading && props.hideIconWhileLoading);\n\nconst classes = computed(() =>\n buttonClass({\n variant: props.variant,\n size: props.size,\n class: {\n 'is-loading': props.loading,\n 'is-disabled': isDisabled.value,\n 't-button--block': props.block,\n 't-button--icon': props.iconOnly,\n 't-button--align-start': props.align === 'start',\n 't-button--align-end': props.align === 'end',\n },\n }),\n);\n\nconst onClick = (event: MouseEvent) => {\n if (isDisabled.value) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n emit('click', event);\n};\n</script>\n\n<template>\n <component\n :is=\"as\"\n :type=\"isNativeButton ? type : undefined\"\n :class=\"classes\"\n :disabled=\"isNativeButton ? isDisabled : undefined\"\n :aria-disabled=\"!isNativeButton && isDisabled ? 'true' : undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-label=\"label\"\n :tabindex=\"!isNativeButton && isDisabled ? -1 : undefined\"\n @click=\"onClick\"\n >\n <span\n v-if=\"loading\"\n class=\"t-button__spinner\"\n >\n <TSpinner\n size=\"sm\"\n :label=\"loadingLabel\"\n />\n </span>\n <span\n v-if=\"$slots.icon && !isIconHidden\"\n class=\"t-button__icon\"\n aria-hidden=\"true\"\n >\n <slot name=\"icon\" />\n </span>\n <span\n v-if=\"!iconOnly\"\n class=\"t-button__label\"\n >\n <slot />\n </span>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMA,IAAM,IAAQ,GA8CR,IAAO,GAIP,IAAc,EAAG;GACrB,MAAM;GACN,UAAU;IACR,SAAS;KACP,OAAO;KACP,SAAS;KACT,OAAO;KACP,MAAM;KACN,QAAQ;KACR,OAAO;IACT;IACA,MAAM;KACJ,IAAI;KACJ,IAAI;KACJ,IAAI;IACN;GACF;EACF,CAAC,GAEK,IAAiB,QAAe,EAAM,OAAO,QAAQ,GACrD,IAAa,QAAe,EAAM,YAAY,EAAM,OAAO,GAI3D,IAAe,QAAe,EAAM,WAAW,EAAM,oBAAoB,GAEzE,IAAU,QACd,EAAY;GACV,SAAS,EAAM;GACf,MAAM,EAAM;GACZ,OAAO;IACL,cAAc,EAAM;IACpB,eAAe,EAAW;IAC1B,mBAAmB,EAAM;IACzB,kBAAkB,EAAM;IACxB,yBAAyB,EAAM,UAAU;IACzC,uBAAuB,EAAM,UAAU;GACzC;EACF,CAAC,CACH,GAEM,KAAW,MAAsB;GACrC,IAAI,EAAW,OAAO;IAEpB,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;IACtB;GACF;GAEA,EAAK,SAAS,CAAK;EACrB;yBAIE,EAiCY,EAhCL,EAAA,EAAE,GAAA;GACN,MAAM,EAAA,QAAiB,EAAA,OAAO,KAAA;GAC9B,OAAK,EAAE,EAAA,KAAO;GACd,UAAU,EAAA,QAAiB,EAAA,QAAa,KAAA;GACxC,iBAAa,CAAG,EAAA,SAAkB,EAAA,QAAU,SAAY,KAAA;GACxD,aAAW,EAAA,WAAW,KAAA;GACtB,cAAY,EAAA;GACZ,UAAQ,CAAG,EAAA,SAAkB,EAAA,QAAU,KAAQ,KAAA;GACxC;;oBAUD;IAPC,EAAA,WAAA,EAAA,GADR,EAQO,QARP,GAQO,CAJL,EAGE,GAAA;KAFA,MAAK;KACJ,OAAO,EAAA;;IAIJA,EAAAA,OAAO,QAAI,CAAK,EAAA,SAAA,EAAA,GADxB,EAMO,QANP,GAMO,CADL,EAAoB,EAAA,QAAA,MAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IAGb,EAAA,WAGC,EAAA,IAAA,EAAA,KAHD,EAAA,GADT,EAKO,QALP,GAKO,CADL,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"TButton.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../src/components/TButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs, watchEffect } from 'vue';\nimport { tv } from '@treeui/utils';\nimport type { TSize, TVariant } from '../types/contracts';\nimport TSpinner from './TSpinner.vue';\n\n// Left as a runtime reference (see vue vite.config `define`) so the consumer's\n// bundler — not TreeUI's build — decides dev vs prod. `typeof` guards raw ESM\n// where `process` is absent; the check tree-shakes out of production bundles.\nconst isDevEnv = (): boolean =>\n typeof process !== 'undefined' && process.env != null && process.env.NODE_ENV !== 'production';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TVariant | 'brand';\n size?: TSize;\n disabled?: boolean;\n loading?: boolean;\n /**\n * Accessible announcement while `loading`, forwarded to the spinner.\n * The default is English; pass the active locale's string to localize it.\n */\n loadingLabel?: string;\n /**\n * While `loading`, hide the `icon` slot so the spinner replaces the icon\n * instead of rendering beside it. Set to `false` to keep both visible.\n */\n hideIconWhileLoading?: boolean;\n /**\n * Square, icon-only button. The visible label is dropped, so an accessible\n * name is required — pass `label` (or `aria-label`).\n */\n iconOnly?: boolean;\n /** Accessible name, rendered as `aria-label`. Required when `iconOnly`. */\n label?: string;\n type?: 'button' | 'submit' | 'reset';\n /** Stretch to the full width of the container. */\n block?: boolean;\n /** Content alignment — only meaningful together with `block`. */\n align?: 'start' | 'center' | 'end';\n }>(),\n {\n as: 'button',\n variant: 'solid',\n size: 'md',\n disabled: false,\n loading: false,\n loadingLabel: 'Loading',\n hideIconWhileLoading: true,\n iconOnly: false,\n label: undefined,\n type: 'button',\n block: false,\n align: 'center',\n },\n);\n\nconst emit = defineEmits<{\n click: [event: MouseEvent];\n}>();\n\nconst buttonClass = tv({\n base: 't-button',\n variants: {\n variant: {\n solid: 't-button--solid',\n outline: 't-button--outline',\n ghost: 't-button--ghost',\n soft: 't-button--soft',\n danger: 't-button--danger',\n brand: 't-button--brand',\n },\n size: {\n sm: 't-button--sm',\n md: 't-button--md',\n lg: 't-button--lg',\n },\n },\n});\n\nconst attrs = useAttrs();\nconst isNativeButton = computed(() => props.as === 'button');\nconst isDisabled = computed(() => props.disabled || props.loading);\n\n// An icon-only button has no visible text and an aria-hidden icon, so without a\n// name it is unlabelled for assistive tech. Warn in development only; production\n// stays silent (and the check is stripped by the consumer's bundler).\nif (isDevEnv()) {\n watchEffect(() => {\n if (\n props.iconOnly &&\n !props.label &&\n !attrs['aria-label'] &&\n !attrs['aria-labelledby']\n ) {\n console.warn(\n '[TButton] `iconOnly` needs an accessible name — pass the `label` prop (or `aria-label`).',\n );\n }\n });\n}\n\n// The spinner takes the icon's leading position, so rendering both would show\n// two glyphs and widen the button mid-action.\nconst isIconHidden = computed(() => props.loading && props.hideIconWhileLoading);\n\nconst classes = computed(() =>\n buttonClass({\n variant: props.variant,\n size: props.size,\n class: {\n 'is-loading': props.loading,\n 'is-disabled': isDisabled.value,\n 't-button--block': props.block,\n 't-button--icon': props.iconOnly,\n 't-button--align-start': props.align === 'start',\n 't-button--align-end': props.align === 'end',\n },\n }),\n);\n\nconst onClick = (event: MouseEvent) => {\n if (isDisabled.value) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n emit('click', event);\n};\n</script>\n\n<template>\n <component\n :is=\"as\"\n :type=\"isNativeButton ? type : undefined\"\n :class=\"classes\"\n :disabled=\"isNativeButton ? isDisabled : undefined\"\n :aria-disabled=\"!isNativeButton && isDisabled ? 'true' : undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-label=\"label\"\n :tabindex=\"!isNativeButton && isDisabled ? -1 : undefined\"\n @click=\"onClick\"\n >\n <span\n v-if=\"loading\"\n class=\"t-button__spinner\"\n >\n <TSpinner\n size=\"sm\"\n :label=\"loadingLabel\"\n />\n </span>\n <span\n v-if=\"$slots.icon && !isIconHidden\"\n class=\"t-button__icon\"\n aria-hidden=\"true\"\n >\n <slot name=\"icon\" />\n </span>\n <span\n v-if=\"!iconOnly\"\n class=\"t-button__label\"\n >\n <slot />\n </span>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASA,IAAM,UACJ,OAAO,UAAY,OAAe,QAAQ,OAAO,QAAA,QAAA,IAAA,aAAiC,cAE9E,IAAQ,GA8CR,IAAO,GAIP,IAAc,EAAG;GACrB,MAAM;GACN,UAAU;IACR,SAAS;KACP,OAAO;KACP,SAAS;KACT,OAAO;KACP,MAAM;KACN,QAAQ;KACR,OAAO;IACT;IACA,MAAM;KACJ,IAAI;KACJ,IAAI;KACJ,IAAI;IACN;GACF;EACF,CAAC,GAEK,IAAQ,EAAS,GACjB,IAAiB,QAAe,EAAM,OAAO,QAAQ,GACrD,IAAa,QAAe,EAAM,YAAY,EAAM,OAAO;EAKjE,AAAI,EAAS,KACX,QAAkB;GAChB,AACE,EAAM,YACN,CAAC,EAAM,SACP,CAAC,EAAM,iBACP,CAAC,EAAM,sBAEP,QAAQ,KACN,0FACF;EAEJ,CAAC;EAKH,IAAM,IAAe,QAAe,EAAM,WAAW,EAAM,oBAAoB,GAEzE,IAAU,QACd,EAAY;GACV,SAAS,EAAM;GACf,MAAM,EAAM;GACZ,OAAO;IACL,cAAc,EAAM;IACpB,eAAe,EAAW;IAC1B,mBAAmB,EAAM;IACzB,kBAAkB,EAAM;IACxB,yBAAyB,EAAM,UAAU;IACzC,uBAAuB,EAAM,UAAU;GACzC;EACF,CAAC,CACH,GAEM,KAAW,MAAsB;GACrC,IAAI,EAAW,OAAO;IAEpB,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;IACtB;GACF;GAEA,EAAK,SAAS,CAAK;EACrB;yBAIE,EAiCY,EAhCL,EAAA,EAAE,GAAA;GACN,MAAM,EAAA,QAAiB,EAAA,OAAO,KAAA;GAC9B,OAAK,EAAE,EAAA,KAAO;GACd,UAAU,EAAA,QAAiB,EAAA,QAAa,KAAA;GACxC,iBAAa,CAAG,EAAA,SAAkB,EAAA,QAAU,SAAY,KAAA;GACxD,aAAW,EAAA,WAAW,KAAA;GACtB,cAAY,EAAA;GACZ,UAAQ,CAAG,EAAA,SAAkB,EAAA,QAAU,KAAQ,KAAA;GACxC;;oBAUD;IAPC,EAAA,WAAA,EAAA,GADR,EAQO,QARP,GAQO,CAJL,EAGE,GAAA;KAFA,MAAK;KACJ,OAAO,EAAA;;IAIJA,EAAAA,OAAO,QAAI,CAAK,EAAA,SAAA,EAAA,GADxB,EAMO,QANP,GAMO,CADL,EAAoB,EAAA,QAAA,MAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IAGb,EAAA,WAGC,EAAA,IAAA,EAAA,KAHD,EAAA,GADT,EAKO,QALP,GAKO,CADL,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TCard.cjs","names":[],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TCard.cjs","names":[],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n /**\n * Treat the card as an interactive surface — adds hover elevation and a\n * focus-visible ring. Use with `as=\"a\"` / `as=\"router-link\"` to make the\n * whole card a link without an inner `TLink` (which would underline the\n * card's text via decoration inheritance).\n */\n interactive?: boolean;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n interactive: false,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n { 't-card--interactive': props.interactive },\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"TCard.js","names":[],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TCard.js","names":[],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n /**\n * Treat the card as an interactive surface — adds hover elevation and a\n * focus-visible ring. Use with `as=\"a\"` / `as=\"router-link\"` to make the\n * whole card a link without an inner `TLink` (which would underline the\n * card's text via decoration inheritance).\n */\n interactive?: boolean;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n interactive: false,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n { 't-card--interactive': props.interactive },\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":""}
@@ -4,6 +4,13 @@ type __VLS_Props = {
4
4
  variant?: TCardVariant;
5
5
  size?: TSize;
6
6
  title?: string;
7
+ /**
8
+ * Treat the card as an interactive surface — adds hover elevation and a
9
+ * focus-visible ring. Use with `as="a"` / `as="router-link"` to make the
10
+ * whole card a link without an inner `TLink` (which would underline the
11
+ * card's text via decoration inheritance).
12
+ */
13
+ interactive?: boolean;
7
14
  };
8
15
  declare function __VLS_template(): {
9
16
  attrs: Partial<{}>;
@@ -22,6 +29,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
22
29
  title: string;
23
30
  variant: TCardVariant;
24
31
  as: string;
32
+ interactive: boolean;
25
33
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
26
34
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
27
35
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"TCard.vue.d.ts","sourceRoot":"","sources":["../../src/components/TCard.vue"],"names":[],"mappings":"AAkEA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE9D,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2BJ,iBAAS,cAAc;WAkET,OAAO,IAA6B;;wBAbtB,GAAG;yBACF,GAAG;yBACH,GAAG;wBACH,GAAG;;;;EAe/B;AAWD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;UAhHV,KAAK;WACJ,MAAM;aAFJ,YAAY;QADjB,MAAM;6EA0Hb,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"TCard.vue.d.ts","sourceRoot":"","sources":["../../src/components/TCard.vue"],"names":[],"mappings":"AA2EA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE9D,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AA8BJ,iBAAS,cAAc;WAkET,OAAO,IAA6B;;wBAbtB,GAAG;yBACF,GAAG;yBACH,GAAG;wBACH,GAAG;;;;EAe/B;AAWD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;UA1HV,KAAK;WACJ,MAAM;aAFJ,YAAY;QADjB,MAAM;iBAUG,OAAO;6EA0HvB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,2 +1,2 @@
1
- let e=require("vue");var t={key:0,class:`t-card__header`},n={key:0,class:`t-card__title`},r={key:0,class:`t-card__actions`},i={class:`t-card__body`},a={key:1,class:`t-card__footer`},o=(0,e.defineComponent)({__name:`TCard`,props:{as:{default:`section`},variant:{default:`outline`},size:{default:`md`},title:{default:void 0}},setup(o){let s=o,c=(0,e.computed)(()=>[`t-card`,`t-card--${s.variant}`,`t-card--${s.size}`]),l=(0,e.computed)(()=>!!s.title);return(s,u)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(o.as),{class:(0,e.normalizeClass)(c.value)},{default:(0,e.withCtx)(()=>[s.$slots.header||l.value||s.$slots.actions?((0,e.openBlock)(),(0,e.createElementBlock)(`header`,t,[(0,e.renderSlot)(s.$slots,`header`,{},()=>[o.title?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,n,(0,e.toDisplayString)(o.title),1)):(0,e.createCommentVNode)(``,!0)]),s.$slots.actions?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,r,[(0,e.renderSlot)(s.$slots,`actions`)])):(0,e.createCommentVNode)(``,!0)])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,i,[(0,e.renderSlot)(s.$slots,`default`)]),s.$slots.footer?((0,e.openBlock)(),(0,e.createElementBlock)(`footer`,a,[(0,e.renderSlot)(s.$slots,`footer`)])):(0,e.createCommentVNode)(``,!0)]),_:3},8,[`class`]))}});exports.default=o;
1
+ let e=require("vue");var t={key:0,class:`t-card__header`},n={key:0,class:`t-card__title`},r={key:0,class:`t-card__actions`},i={class:`t-card__body`},a={key:1,class:`t-card__footer`},o=(0,e.defineComponent)({__name:`TCard`,props:{as:{default:`section`},variant:{default:`outline`},size:{default:`md`},title:{default:void 0},interactive:{type:Boolean,default:!1}},setup(o){let s=o,c=(0,e.computed)(()=>[`t-card`,`t-card--${s.variant}`,`t-card--${s.size}`,{"t-card--interactive":s.interactive}]),l=(0,e.computed)(()=>!!s.title);return(s,u)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(o.as),{class:(0,e.normalizeClass)(c.value)},{default:(0,e.withCtx)(()=>[s.$slots.header||l.value||s.$slots.actions?((0,e.openBlock)(),(0,e.createElementBlock)(`header`,t,[(0,e.renderSlot)(s.$slots,`header`,{},()=>[o.title?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,n,(0,e.toDisplayString)(o.title),1)):(0,e.createCommentVNode)(``,!0)]),s.$slots.actions?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,r,[(0,e.renderSlot)(s.$slots,`actions`)])):(0,e.createCommentVNode)(``,!0)])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,i,[(0,e.renderSlot)(s.$slots,`default`)]),s.$slots.footer?((0,e.openBlock)(),(0,e.createElementBlock)(`footer`,a,[(0,e.renderSlot)(s.$slots,`footer`)])):(0,e.createCommentVNode)(``,!0)]),_:3},8,[`class`]))}});exports.default=o;
2
2
  //# sourceMappingURL=TCard.vue_vue_type_script_setup_true_lang.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TCard.vue_vue_type_script_setup_true_lang.cjs","names":["$slots"],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":"6UAIA,IAAM,EAAQ,EAeR,GAAA,EAAA,EAAA,SAAA,KAAyB,CAC7B,SACA,WAAW,EAAM,UACjB,WAAW,EAAM,MACnB,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA2B,CAAC,CAAC,EAAM,KAAK,kFAKrC,EAAA,EAAE,EAAA,CACN,OAAA,EAAA,EAAA,eAAA,CAAO,EAAA,KAAO,CAAA,EAAA,2BAoBN,CAjBDA,EAAAA,OAAO,QAAU,EAAA,OAAaA,EAAAA,OAAO,UAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAiBpC,SAlBT,EAkBS,EAAA,EAAA,EAAA,WAAA,CAPA,EAAA,OAAA,SAAA,CAAA,MAAA,CALG,EAAA,QAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAID,OALP,GAAA,EAAA,EAAA,gBAAA,CAIK,EAAA,KAAK,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAIJA,EAAAA,OAAO,UAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIR,OALP,EAKO,EAAA,EAAA,EAAA,WAAA,CADkB,EAAA,OAAA,SAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,2BAKrB,MAFN,EAEM,EAAA,EAAA,EAAA,WAAA,CADI,EAAA,OAAA,SAAA,CAAA,CAAA,EAGFA,EAAAA,OAAO,SAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIN,SALT,EAKS,EAAA,EAAA,EAAA,WAAA,CADe,EAAA,OAAA,QAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"TCard.vue_vue_type_script_setup_true_lang.cjs","names":["$slots"],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n /**\n * Treat the card as an interactive surface — adds hover elevation and a\n * focus-visible ring. Use with `as=\"a\"` / `as=\"router-link\"` to make the\n * whole card a link without an inner `TLink` (which would underline the\n * card's text via decoration inheritance).\n */\n interactive?: boolean;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n interactive: false,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n { 't-card--interactive': props.interactive },\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":"mXAIA,IAAM,EAAQ,EAuBR,GAAA,EAAA,EAAA,SAAA,KAAyB,CAC7B,SACA,WAAW,EAAM,UACjB,WAAW,EAAM,OACjB,CAAE,sBAAuB,EAAM,WAAY,CAC7C,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA2B,CAAC,CAAC,EAAM,KAAK,kFAKrC,EAAA,EAAE,EAAA,CACN,OAAA,EAAA,EAAA,eAAA,CAAO,EAAA,KAAO,CAAA,EAAA,2BAoBN,CAjBDA,EAAAA,OAAO,QAAU,EAAA,OAAaA,EAAAA,OAAO,UAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAiBpC,SAlBT,EAkBS,EAAA,EAAA,EAAA,WAAA,CAPA,EAAA,OAAA,SAAA,CAAA,MAAA,CALG,EAAA,QAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAID,OALP,GAAA,EAAA,EAAA,gBAAA,CAIK,EAAA,KAAK,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAIJA,EAAAA,OAAO,UAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIR,OALP,EAKO,EAAA,EAAA,EAAA,WAAA,CADkB,EAAA,OAAA,SAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,2BAKrB,MAFN,EAEM,EAAA,EAAA,EAAA,WAAA,CADI,EAAA,OAAA,SAAA,CAAA,CAAA,EAGFA,EAAAA,OAAO,SAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIN,SALT,EAKS,EAAA,EAAA,EAAA,WAAA,CADe,EAAA,OAAA,QAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA"}
@@ -18,13 +18,18 @@ var f = {
18
18
  as: { default: "section" },
19
19
  variant: { default: "outline" },
20
20
  size: { default: "md" },
21
- title: { default: void 0 }
21
+ title: { default: void 0 },
22
+ interactive: {
23
+ type: Boolean,
24
+ default: !1
25
+ }
22
26
  },
23
27
  setup(a) {
24
28
  let _ = a, v = e(() => [
25
29
  "t-card",
26
30
  `t-card--${_.variant}`,
27
- `t-card--${_.size}`
31
+ `t-card--${_.size}`,
32
+ { "t-card--interactive": _.interactive }
28
33
  ]), y = e(() => !!_.title);
29
34
  return (e, _) => (s(), t(l(a.as), { class: o(v.value) }, {
30
35
  default: d(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"TCard.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;EAIA,IAAM,IAAQ,GAeR,IAAU,QAAe;GAC7B;GACA,WAAW,EAAM;GACjB,WAAW,EAAM;EACnB,CAAC,GAEK,IAAY,QAAe,CAAC,CAAC,EAAM,KAAK;yBAI5C,EAgCY,EA/BL,EAAA,EAAE,GAAA,EACN,OAAK,EAAE,EAAA,KAAO,EAAA,GAAA;oBAoBN;IAjBDA,EAAAA,OAAO,UAAU,EAAA,SAAaA,EAAAA,OAAO,WAAA,EAAA,GAD7C,EAkBS,UAlBT,GAkBS,CAdP,EAOO,EAAA,QAAA,UAAA,CAAA,SAAA,CALG,EAAA,SAAA,EAAA,GADR,EAKO,QALP,GAKO,EADF,EAAA,KAAK,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA,GAIJA,EAAAA,OAAO,WAAA,EAAA,GADf,EAKO,QALP,GAKO,CADL,EAAuB,EAAA,QAAA,SAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IAG3B,EAEM,OAFN,GAEM,CADJ,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA;IAGFA,EAAAA,OAAO,UAAA,EAAA,GADf,EAKS,UALT,GAKS,CADP,EAAsB,EAAA,QAAA,QAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA"}
1
+ {"version":3,"file":"TCard.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../src/components/TCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TCardVariant, TSize } from '../types/contracts';\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n variant?: TCardVariant;\n size?: TSize;\n title?: string;\n /**\n * Treat the card as an interactive surface — adds hover elevation and a\n * focus-visible ring. Use with `as=\"a\"` / `as=\"router-link\"` to make the\n * whole card a link without an inner `TLink` (which would underline the\n * card's text via decoration inheritance).\n */\n interactive?: boolean;\n }>(),\n {\n as: 'section',\n variant: 'outline',\n size: 'md',\n title: undefined,\n interactive: false,\n },\n);\n\nconst classes = computed(() => [\n 't-card',\n `t-card--${props.variant}`,\n `t-card--${props.size}`,\n { 't-card--interactive': props.interactive },\n]);\n\nconst hasHeader = computed(() => !!props.title);\n</script>\n\n<template>\n <component\n :is=\"as\"\n :class=\"classes\"\n >\n <header\n v-if=\"$slots.header || hasHeader || $slots.actions\"\n class=\"t-card__header\"\n >\n <slot name=\"header\">\n <span\n v-if=\"title\"\n class=\"t-card__title\"\n >\n {{ title }}\n </span>\n </slot>\n <span\n v-if=\"$slots.actions\"\n class=\"t-card__actions\"\n >\n <slot name=\"actions\" />\n </span>\n </header>\n <div class=\"t-card__body\">\n <slot />\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"t-card__footer\"\n >\n <slot name=\"footer\" />\n </footer>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;EAIA,IAAM,IAAQ,GAuBR,IAAU,QAAe;GAC7B;GACA,WAAW,EAAM;GACjB,WAAW,EAAM;GACjB,EAAE,uBAAuB,EAAM,YAAY;EAC7C,CAAC,GAEK,IAAY,QAAe,CAAC,CAAC,EAAM,KAAK;yBAI5C,EAgCY,EA/BL,EAAA,EAAE,GAAA,EACN,OAAK,EAAE,EAAA,KAAO,EAAA,GAAA;oBAoBN;IAjBDA,EAAAA,OAAO,UAAU,EAAA,SAAaA,EAAAA,OAAO,WAAA,EAAA,GAD7C,EAkBS,UAlBT,GAkBS,CAdP,EAOO,EAAA,QAAA,UAAA,CAAA,SAAA,CALG,EAAA,SAAA,EAAA,GADR,EAKO,QALP,GAKO,EADF,EAAA,KAAK,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA,GAIJA,EAAAA,OAAO,WAAA,EAAA,GADf,EAKO,QALP,GAKO,CADL,EAAuB,EAAA,QAAA,SAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IAG3B,EAEM,OAFN,GAEM,CADJ,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA;IAGFA,EAAAA,OAAO,UAAA,EAAA,GADf,EAKS,UALT,GAKS,CADP,EAAsB,EAAA,QAAA,QAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TLink.cjs","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TLink.cjs","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\nexport type TLinkUnderline = 'always' | 'hover' | 'none';\nexport type TLinkWeight = 'regular' | 'medium' | 'semibold';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n /** When the underline shows. `always` (default), `hover`, or `none`. */\n underline?: TLinkUnderline;\n /** Text weight. Defaults to `medium`, matching the base link. */\n weight?: TLinkWeight;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n underline: 'always',\n weight: 'medium',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n props.underline !== 'always' ? `t-link--underline-${props.underline}` : null,\n props.weight !== 'medium' ? `t-link--weight-${props.weight}` : null,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"TLink.js","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TLink.js","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\nexport type TLinkUnderline = 'always' | 'hover' | 'none';\nexport type TLinkWeight = 'regular' | 'medium' | 'semibold';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n /** When the underline shows. `always` (default), `hover`, or `none`. */\n underline?: TLinkUnderline;\n /** Text weight. Defaults to `medium`, matching the base link. */\n weight?: TLinkWeight;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n underline: 'always',\n weight: 'medium',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n props.underline !== 'always' ? `t-link--underline-${props.underline}` : null,\n props.weight !== 'medium' ? `t-link--weight-${props.weight}` : null,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
@@ -1,10 +1,16 @@
1
1
  export type TLinkVariant = 'default' | 'muted' | 'danger';
2
+ export type TLinkUnderline = 'always' | 'hover' | 'none';
3
+ export type TLinkWeight = 'regular' | 'medium' | 'semibold';
2
4
  type __VLS_Props = {
3
5
  to?: string | Record<string, unknown>;
4
6
  href?: string;
5
7
  external?: boolean;
6
8
  disabled?: boolean;
7
9
  variant?: TLinkVariant;
10
+ /** When the underline shows. `always` (default), `hover`, or `none`. */
11
+ underline?: TLinkUnderline;
12
+ /** Text weight. Defaults to `medium`, matching the base link. */
13
+ weight?: TLinkWeight;
8
14
  };
9
15
  declare function __VLS_template(): {
10
16
  attrs: Partial<{}>;
@@ -20,6 +26,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
20
26
  variant: TLinkVariant;
21
27
  href: string;
22
28
  to: string | Record<string, unknown>;
29
+ weight: TLinkWeight;
30
+ underline: TLinkUnderline;
23
31
  external: boolean;
24
32
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
25
33
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
@@ -1 +1 @@
1
- {"version":3,"file":"TLink.vue.d.ts","sourceRoot":"","sources":["../../src/components/TLink.vue"],"names":[],"mappings":"AA0EA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAyDJ,iBAAS,cAAc;WAqCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAYD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;cAlHN,OAAO;aACR,YAAY;UAHf,MAAM;QADR,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;cAE1B,OAAO;6EA2HpB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"TLink.vue.d.ts","sourceRoot":"","sources":["../../src/components/TLink.vue"],"names":[],"mappings":"AAoFA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5D,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,wEAAwE;IACxE,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,iEAAiE;IACjE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AA+DJ,iBAAS,cAAc;WAqCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAYD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;cA5HN,OAAO;aACR,YAAY;UAHf,MAAM;QADR,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;YAQ5B,WAAW;eAFR,cAAc;cAJf,OAAO;6EAqIpB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,2 +1,2 @@
1
- let e=require("vue");var t=(0,e.defineComponent)({__name:`TLink`,props:{to:{default:void 0},href:{default:void 0},external:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},variant:{default:`default`}},setup(t){let n=t,r=(0,e.getCurrentInstance)(),i=(0,e.computed)(()=>n.to?r?.appContext.components.RouterLink??null:null),a=(0,e.computed)(()=>!!i.value),o=(0,e.computed)(()=>n.disabled?`span`:n.to&&i.value?i.value:`a`),s=(0,e.computed)(()=>n.disabled?{}:n.to&&a.value?{to:n.to}:{href:n.href??(typeof n.to==`string`?n.to:void 0),...n.external?{target:`_blank`,rel:`noopener noreferrer`}:{}}),c=(0,e.computed)(()=>[`t-link`,`t-link--${n.variant}`,{"is-disabled":n.disabled}]);return(n,r)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(o.value),(0,e.mergeProps)(s.value,{class:c.value,"aria-disabled":t.disabled||void 0,tabindex:t.disabled?-1:void 0}),{default:(0,e.withCtx)(()=>[(0,e.renderSlot)(n.$slots,`default`)]),_:3},16,[`class`,`aria-disabled`,`tabindex`]))}});exports.default=t;
1
+ let e=require("vue");var t=(0,e.defineComponent)({__name:`TLink`,props:{to:{default:void 0},href:{default:void 0},external:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},variant:{default:`default`},underline:{default:`always`},weight:{default:`medium`}},setup(t){let n=t,r=(0,e.getCurrentInstance)(),i=(0,e.computed)(()=>n.to?r?.appContext.components.RouterLink??null:null),a=(0,e.computed)(()=>!!i.value),o=(0,e.computed)(()=>n.disabled?`span`:n.to&&i.value?i.value:`a`),s=(0,e.computed)(()=>n.disabled?{}:n.to&&a.value?{to:n.to}:{href:n.href??(typeof n.to==`string`?n.to:void 0),...n.external?{target:`_blank`,rel:`noopener noreferrer`}:{}}),c=(0,e.computed)(()=>[`t-link`,`t-link--${n.variant}`,n.underline===`always`?null:`t-link--underline-${n.underline}`,n.weight===`medium`?null:`t-link--weight-${n.weight}`,{"is-disabled":n.disabled}]);return(n,r)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(o.value),(0,e.mergeProps)(s.value,{class:c.value,"aria-disabled":t.disabled||void 0,tabindex:t.disabled?-1:void 0}),{default:(0,e.withCtx)(()=>[(0,e.renderSlot)(n.$slots,`default`)]),_:3},16,[`class`,`aria-disabled`,`tabindex`]))}});exports.default=t;
2
2
  //# sourceMappingURL=TLink.vue_vue_type_script_setup_true_lang.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TLink.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":"8NAKA,IAAM,EAAQ,EAiBR,GAAA,EAAA,EAAA,mBAAA,CAA8B,EAE9B,GAAA,EAAA,EAAA,SAAA,KACC,EAAM,GAEH,GAAU,WAAW,WAAW,YAAwC,KAF1D,IAGvB,EAEK,GAAA,EAAA,EAAA,SAAA,KACG,EAAQ,EAAoB,KACpC,EAEK,GAAA,EAAA,EAAA,SAAA,KACA,EAAM,SAAiB,OACvB,EAAM,IAAM,EAAoB,MAAc,EAAoB,MAC/D,GACR,EAEK,GAAA,EAAA,EAAA,SAAA,KACA,EAAM,SAAiB,CAAC,EACxB,EAAM,IAAM,EAAc,MAAc,CAAE,GAAI,EAAM,EAAG,EAEpD,CACL,KAFW,EAAM,OAAS,OAAO,EAAM,IAAO,SAAW,EAAM,GAAK,IAAA,IAGpE,GAAI,EAAM,SAAW,CAAE,OAAQ,SAAU,IAAK,qBAAsB,EAAI,CAAC,CAC3E,CACD,EAEK,GAAA,EAAA,EAAA,SAAA,KAAyB,CAC7B,SACA,WAAW,EAAM,UACjB,CACE,cAAe,EAAM,QACvB,CACF,CAAC,kFAKQ,EAAA,KAAG,GAAA,EAAA,EAAA,WAAA,CACA,EAME,MANO,CAChB,MAAO,EAAA,MACP,gBAAe,EAAA,UAAY,IAAA,GAC3B,SAAU,EAAA,SAAQ,GAAQ,IAAA,gCAEnB,EAAA,EAAA,EAAA,WAAA,CAAA,EAAA,OAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"TLink.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\nexport type TLinkUnderline = 'always' | 'hover' | 'none';\nexport type TLinkWeight = 'regular' | 'medium' | 'semibold';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n /** When the underline shows. `always` (default), `hover`, or `none`. */\n underline?: TLinkUnderline;\n /** Text weight. Defaults to `medium`, matching the base link. */\n weight?: TLinkWeight;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n underline: 'always',\n weight: 'medium',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n props.underline !== 'always' ? `t-link--underline-${props.underline}` : null,\n props.weight !== 'medium' ? `t-link--weight-${props.weight}` : null,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":"qRAOA,IAAM,EAAQ,EAuBR,GAAA,EAAA,EAAA,mBAAA,CAA8B,EAE9B,GAAA,EAAA,EAAA,SAAA,KACC,EAAM,GAEH,GAAU,WAAW,WAAW,YAAwC,KAF1D,IAGvB,EAEK,GAAA,EAAA,EAAA,SAAA,KACG,EAAQ,EAAoB,KACpC,EAEK,GAAA,EAAA,EAAA,SAAA,KACA,EAAM,SAAiB,OACvB,EAAM,IAAM,EAAoB,MAAc,EAAoB,MAC/D,GACR,EAEK,GAAA,EAAA,EAAA,SAAA,KACA,EAAM,SAAiB,CAAC,EACxB,EAAM,IAAM,EAAc,MAAc,CAAE,GAAI,EAAM,EAAG,EAEpD,CACL,KAFW,EAAM,OAAS,OAAO,EAAM,IAAO,SAAW,EAAM,GAAK,IAAA,IAGpE,GAAI,EAAM,SAAW,CAAE,OAAQ,SAAU,IAAK,qBAAsB,EAAI,CAAC,CAC3E,CACD,EAEK,GAAA,EAAA,EAAA,SAAA,KAAyB,CAC7B,SACA,WAAW,EAAM,UACjB,EAAM,YAAc,SAAoD,KAAzC,qBAAqB,EAAM,YAC1D,EAAM,SAAW,SAA8C,KAAnC,kBAAkB,EAAM,SACpD,CACE,cAAe,EAAM,QACvB,CACF,CAAC,kFAKQ,EAAA,KAAG,GAAA,EAAA,EAAA,WAAA,CACA,EAME,MANO,CAChB,MAAO,EAAA,MACP,gBAAe,EAAA,UAAY,IAAA,GAC3B,SAAU,EAAA,SAAQ,GAAQ,IAAA,gCAEnB,EAAA,EAAA,EAAA,WAAA,CAAA,EAAA,OAAA,SAAA,CAAA,CAAA"}
@@ -13,7 +13,9 @@ var l = /*@__PURE__*/ n({
13
13
  type: Boolean,
14
14
  default: !1
15
15
  },
16
- variant: { default: "default" }
16
+ variant: { default: "default" },
17
+ underline: { default: "always" },
18
+ weight: { default: "medium" }
17
19
  },
18
20
  setup(n) {
19
21
  let l = n, u = r(), d = e(() => l.to ? u?.appContext.components.RouterLink ?? null : null), f = e(() => !!d.value), p = e(() => l.disabled ? "span" : l.to && d.value ? d.value : "a"), m = e(() => l.disabled ? {} : l.to && f.value ? { to: l.to } : {
@@ -25,6 +27,8 @@ var l = /*@__PURE__*/ n({
25
27
  }), h = e(() => [
26
28
  "t-link",
27
29
  `t-link--${l.variant}`,
30
+ l.underline === "always" ? null : `t-link--underline-${l.underline}`,
31
+ l.weight === "medium" ? null : `t-link--weight-${l.weight}`,
28
32
  { "is-disabled": l.disabled }
29
33
  ]);
30
34
  return (e, r) => (a(), t(s(p.value), i(m.value, {
@@ -1 +1 @@
1
- {"version":3,"file":"TLink.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAKA,IAAM,IAAQ,GAiBR,IAAW,EAAmB,GAE9B,IAAsB,QACrB,EAAM,KAEH,GAAU,WAAW,WAAW,cAAwC,OAF1D,IAGvB,GAEK,IAAgB,QACb,EAAQ,EAAoB,KACpC,GAEK,IAAM,QACN,EAAM,WAAiB,SACvB,EAAM,MAAM,EAAoB,QAAc,EAAoB,QAC/D,GACR,GAEK,IAAY,QACZ,EAAM,WAAiB,CAAC,IACxB,EAAM,MAAM,EAAc,QAAc,EAAE,IAAI,EAAM,GAAG,IAEpD;GACL,MAFW,EAAM,SAAS,OAAO,EAAM,MAAO,WAAW,EAAM,KAAK,KAAA;GAGpE,GAAI,EAAM,WAAW;IAAE,QAAQ;IAAU,KAAK;GAAsB,IAAI,CAAC;EAC3E,CACD,GAEK,IAAU,QAAe;GAC7B;GACA,WAAW,EAAM;GACjB,EACE,eAAe,EAAM,SACvB;EACF,CAAC;yBAIC,EAQY,EAPL,EAAA,KAAG,GADV,EAEU,EAME,OANO;GAChB,OAAO,EAAA;GACP,iBAAe,EAAA,YAAY,KAAA;GAC3B,UAAU,EAAA,WAAQ,KAAQ,KAAA;;oBAEnB,CAAR,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"TLink.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, type Component } from 'vue';\n\nexport type TLinkVariant = 'default' | 'muted' | 'danger';\nexport type TLinkUnderline = 'always' | 'hover' | 'none';\nexport type TLinkWeight = 'regular' | 'medium' | 'semibold';\n\nconst props = withDefaults(\n defineProps<{\n to?: string | Record<string, unknown>;\n href?: string;\n external?: boolean;\n disabled?: boolean;\n variant?: TLinkVariant;\n /** When the underline shows. `always` (default), `hover`, or `none`. */\n underline?: TLinkUnderline;\n /** Text weight. Defaults to `medium`, matching the base link. */\n weight?: TLinkWeight;\n }>(),\n {\n to: undefined,\n href: undefined,\n external: false,\n disabled: false,\n variant: 'default',\n underline: 'always',\n weight: 'medium',\n },\n);\n\nconst instance = getCurrentInstance();\n\nconst routerLinkComponent = computed<Component | null>(() => {\n if (!props.to) return null;\n\n return (instance?.appContext.components.RouterLink as Component | undefined) ?? null;\n});\n\nconst hasRouterLink = computed(() => {\n return Boolean(routerLinkComponent.value);\n});\n\nconst tag = computed<string | Component>(() => {\n if (props.disabled) return 'span';\n if (props.to && routerLinkComponent.value) return routerLinkComponent.value;\n return 'a';\n});\n\nconst linkProps = computed(() => {\n if (props.disabled) return {};\n if (props.to && hasRouterLink.value) return { to: props.to };\n const href = props.href ?? (typeof props.to === 'string' ? props.to : undefined);\n return {\n href,\n ...(props.external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n };\n});\n\nconst classes = computed(() => [\n 't-link',\n `t-link--${props.variant}`,\n props.underline !== 'always' ? `t-link--underline-${props.underline}` : null,\n props.weight !== 'medium' ? `t-link--weight-${props.weight}` : null,\n {\n 'is-disabled': props.disabled,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-bind=\"linkProps\"\n :class=\"classes\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAOA,IAAM,IAAQ,GAuBR,IAAW,EAAmB,GAE9B,IAAsB,QACrB,EAAM,KAEH,GAAU,WAAW,WAAW,cAAwC,OAF1D,IAGvB,GAEK,IAAgB,QACb,EAAQ,EAAoB,KACpC,GAEK,IAAM,QACN,EAAM,WAAiB,SACvB,EAAM,MAAM,EAAoB,QAAc,EAAoB,QAC/D,GACR,GAEK,IAAY,QACZ,EAAM,WAAiB,CAAC,IACxB,EAAM,MAAM,EAAc,QAAc,EAAE,IAAI,EAAM,GAAG,IAEpD;GACL,MAFW,EAAM,SAAS,OAAO,EAAM,MAAO,WAAW,EAAM,KAAK,KAAA;GAGpE,GAAI,EAAM,WAAW;IAAE,QAAQ;IAAU,KAAK;GAAsB,IAAI,CAAC;EAC3E,CACD,GAEK,IAAU,QAAe;GAC7B;GACA,WAAW,EAAM;GACjB,EAAM,cAAc,WAAoD,OAAzC,qBAAqB,EAAM;GAC1D,EAAM,WAAW,WAA8C,OAAnC,kBAAkB,EAAM;GACpD,EACE,eAAe,EAAM,SACvB;EACF,CAAC;yBAIC,EAQY,EAPL,EAAA,KAAG,GADV,EAEU,EAME,OANO;GAChB,OAAO,EAAA;GACP,iBAAe,EAAA,YAAY,KAAA;GAC3B,UAAU,EAAA,WAAQ,KAAQ,KAAA;;oBAEnB,CAAR,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TPopover.cjs","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TPopover.cjs","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize, TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n /** Panel density. Scales the content padding by the shared size tokens. */\n size?: TSize;\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n size: 'md',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n `t-popover__content--${props.size}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"TPopover.js","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TPopover.js","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize, TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n /** Panel density. Scales the content padding by the shared size tokens. */\n size?: TSize;\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n size: 'md',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n `t-popover__content--${props.size}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":""}
@@ -1,10 +1,12 @@
1
- import { TTooltipSide } from '../types/contracts';
1
+ import { TSize, TTooltipSide } from '../types/contracts';
2
2
  type __VLS_Props = {
3
3
  open?: boolean;
4
4
  defaultOpen?: boolean;
5
5
  disabled?: boolean;
6
6
  side?: TTooltipSide;
7
7
  align?: 'start' | 'center' | 'end';
8
+ /** Panel density. Scales the content padding by the shared size tokens. */
9
+ size?: TSize;
8
10
  id?: string;
9
11
  };
10
12
  declare function __VLS_template(): {
@@ -38,6 +40,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
38
40
  "onOpen-change"?: ((value: boolean) => any) | undefined;
39
41
  }>, {
40
42
  disabled: boolean;
43
+ size: TSize;
41
44
  id: string;
42
45
  align: "start" | "center" | "end";
43
46
  open: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"TPopover.vue.d.ts","sourceRoot":"","sources":["../../src/components/TPopover.vue"],"names":[],"mappings":"AAoMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,KAAK,WAAW,GAAG;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AA4IJ,iBAAS,cAAc;WA0ET,OAAO,IAA6B;;uBAlMjC;YAAE,MAAM,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO;mBACpD,OAAO;;uBADH;YAAE,MAAM,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO;mBACpD,OAAO;;;;;;;;EAsMnB;AAsBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;cAtPN,OAAO;QAGb,MAAM;WADH,OAAO,GAAG,QAAQ,GAAG,KAAK;UAJ3B,OAAO;iBACA,OAAO;UAEd,YAAY;;;;;OA8PrB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"TPopover.vue.d.ts","sourceRoot":"","sources":["../../src/components/TPopover.vue"],"names":[],"mappings":"AAwMA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAM9D,KAAK,WAAW,GAAG;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AA+IJ,iBAAS,cAAc;WA0ET,OAAO,IAA6B;;uBApMjC;YAAE,MAAM,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO;mBACpD,OAAO;;uBADH;YAAE,MAAM,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO;mBACpD,OAAO;;;;;;;;EAwMnB;AAsBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;cA3PN,OAAO;UAIX,KAAK;QACP,MAAM;WAHH,OAAO,GAAG,QAAQ,GAAG,KAAK;UAJ3B,OAAO;iBACA,OAAO;UAEd,YAAY;;;;;OAmQrB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,2 +1,2 @@
1
- const e=require("../composables/useControllableOpen.cjs");let t=require("vue"),n=require("@treeui/utils");var r=[`data-state`],i=[`disabled`,`aria-expanded`,`aria-controls`],a=[`id`,`data-state`],o=(0,t.defineComponent)({inheritAttrs:!1,__name:`TPopover`,props:{open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},side:{default:`bottom`},align:{default:`center`},id:{default:void 0}},emits:[`update:open`,`open-change`],setup(o,{emit:s}){let c=o,l=s,u=(0,t.useAttrs)(),d=c.id??(0,n.createId)(`t-popover`),f=(0,t.ref)(null),p=(0,t.ref)(null),m=(0,t.ref)(null),h=(0,t.computed)(()=>{let{class:e,style:t,...n}=u;return n}),{value:g,setValue:_}=e.useControllableOpen((0,t.toRef)(c,`open`),c.defaultOpen,e=>{l(`update:open`,e),l(`open-change`,e)}),v=(0,t.computed)(()=>[`t-popover`,{"is-open":g.value,"is-disabled":c.disabled},u.class]),y=(0,t.computed)(()=>u.style),b=(0,t.computed)(()=>[`t-popover__content`,`t-popover__content--${c.side}`,`t-popover__content--align-${c.align}`]),x=()=>{c.disabled||(_(!0),(0,t.nextTick)(()=>{m.value&&((0,n.focusFirst)(m.value)||m.value.focus())}))},S=(e=!1)=>{_(!1),e&&(0,t.nextTick)(()=>{p.value&&(0,n.focusFirst)(p.value)})},C=()=>{g.value?S():x()},w=e=>{c.disabled||(0,n.isEscapeKey)(e)&&g.value&&(e.preventDefault(),S())},T=e=>{(0,n.isEscapeKey)(e)&&(e.preventDefault(),S(!0))},E=e=>{if(!g.value)return;let t=e.target;t instanceof Node&&(f.value?.contains(t)||S())};return(0,t.watch)(g,e=>{e?document.addEventListener(`pointerdown`,E):document.removeEventListener(`pointerdown`,E)}),(0,t.onBeforeUnmount)(()=>{document.removeEventListener(`pointerdown`,E)}),(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{ref_key:`rootRef`,ref:f,class:(0,t.normalizeClass)(v.value),style:(0,t.normalizeStyle)(y.value),"data-state":(0,t.unref)(g)?`open`:`closed`},[(0,t.createElementVNode)(`div`,{ref_key:`triggerRef`,ref:p,class:`t-popover__anchor`,onClick:C,onKeydown:w},[(0,t.renderSlot)(e.$slots,`trigger`,{isOpen:(0,t.unref)(g),contentId:(0,t.unref)(d)},()=>[(0,t.createElementVNode)(`button`,(0,t.mergeProps)({type:`button`,class:`t-popover__trigger`,disabled:o.disabled,"aria-expanded":(0,t.unref)(g),"aria-controls":(0,t.unref)(g)?(0,t.unref)(d):void 0,"aria-haspopup":`dialog`},h.value),null,16,i)])],544),(0,t.createVNode)(t.Transition,{name:`t-popover-fade`},{default:(0,t.withCtx)(()=>[(0,t.unref)(g)&&!o.disabled?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,id:(0,t.unref)(d),ref_key:`contentRef`,ref:m,role:`dialog`,class:(0,t.normalizeClass)(b.value),"data-state":(0,t.unref)(g)?`open`:`closed`,tabindex:`-1`,onKeydown:T},[(0,t.renderSlot)(e.$slots,`default`)],42,a)):(0,t.createCommentVNode)(``,!0)]),_:3})],14,r))}});exports.default=o;
1
+ const e=require("../composables/useControllableOpen.cjs");let t=require("vue"),n=require("@treeui/utils");var r=[`data-state`],i=[`disabled`,`aria-expanded`,`aria-controls`],a=[`id`,`data-state`],o=(0,t.defineComponent)({inheritAttrs:!1,__name:`TPopover`,props:{open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},side:{default:`bottom`},align:{default:`center`},size:{default:`md`},id:{default:void 0}},emits:[`update:open`,`open-change`],setup(o,{emit:s}){let c=o,l=s,u=(0,t.useAttrs)(),d=c.id??(0,n.createId)(`t-popover`),f=(0,t.ref)(null),p=(0,t.ref)(null),m=(0,t.ref)(null),h=(0,t.computed)(()=>{let{class:e,style:t,...n}=u;return n}),{value:g,setValue:_}=e.useControllableOpen((0,t.toRef)(c,`open`),c.defaultOpen,e=>{l(`update:open`,e),l(`open-change`,e)}),v=(0,t.computed)(()=>[`t-popover`,{"is-open":g.value,"is-disabled":c.disabled},u.class]),y=(0,t.computed)(()=>u.style),b=(0,t.computed)(()=>[`t-popover__content`,`t-popover__content--${c.side}`,`t-popover__content--align-${c.align}`,`t-popover__content--${c.size}`]),x=()=>{c.disabled||(_(!0),(0,t.nextTick)(()=>{m.value&&((0,n.focusFirst)(m.value)||m.value.focus())}))},S=(e=!1)=>{_(!1),e&&(0,t.nextTick)(()=>{p.value&&(0,n.focusFirst)(p.value)})},C=()=>{g.value?S():x()},w=e=>{c.disabled||(0,n.isEscapeKey)(e)&&g.value&&(e.preventDefault(),S())},T=e=>{(0,n.isEscapeKey)(e)&&(e.preventDefault(),S(!0))},E=e=>{if(!g.value)return;let t=e.target;t instanceof Node&&(f.value?.contains(t)||S())};return(0,t.watch)(g,e=>{e?document.addEventListener(`pointerdown`,E):document.removeEventListener(`pointerdown`,E)}),(0,t.onBeforeUnmount)(()=>{document.removeEventListener(`pointerdown`,E)}),(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{ref_key:`rootRef`,ref:f,class:(0,t.normalizeClass)(v.value),style:(0,t.normalizeStyle)(y.value),"data-state":(0,t.unref)(g)?`open`:`closed`},[(0,t.createElementVNode)(`div`,{ref_key:`triggerRef`,ref:p,class:`t-popover__anchor`,onClick:C,onKeydown:w},[(0,t.renderSlot)(e.$slots,`trigger`,{isOpen:(0,t.unref)(g),contentId:(0,t.unref)(d)},()=>[(0,t.createElementVNode)(`button`,(0,t.mergeProps)({type:`button`,class:`t-popover__trigger`,disabled:o.disabled,"aria-expanded":(0,t.unref)(g),"aria-controls":(0,t.unref)(g)?(0,t.unref)(d):void 0,"aria-haspopup":`dialog`},h.value),null,16,i)])],544),(0,t.createVNode)(t.Transition,{name:`t-popover-fade`},{default:(0,t.withCtx)(()=>[(0,t.unref)(g)&&!o.disabled?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,id:(0,t.unref)(d),ref_key:`contentRef`,ref:m,role:`dialog`,class:(0,t.normalizeClass)(b.value),"data-state":(0,t.unref)(g)?`open`:`closed`,tabindex:`-1`,onKeydown:T},[(0,t.renderSlot)(e.$slots,`default`)],42,a)):(0,t.createCommentVNode)(``,!0)]),_:3})],14,r))}});exports.default=o;
2
2
  //# sourceMappingURL=TPopover.vue_vue_type_script_setup_true_lang.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TPopover.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TPopover.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize, TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n /** Panel density. Scales the content padding by the shared size tokens. */\n size?: TSize;\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n size: 'md',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n `t-popover__content--${props.size}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":"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"}
@@ -24,6 +24,7 @@ var w = ["data-state"], T = [
24
24
  },
25
25
  side: { default: "bottom" },
26
26
  align: { default: "center" },
27
+ size: { default: "md" },
27
28
  id: { default: void 0 }
28
29
  },
29
30
  emits: ["update:open", "open-change"],
@@ -43,7 +44,8 @@ var w = ["data-state"], T = [
43
44
  ]), z = n(() => A.style), B = n(() => [
44
45
  "t-popover__content",
45
46
  `t-popover__content--${O.side}`,
46
- `t-popover__content--align-${O.align}`
47
+ `t-popover__content--align-${O.align}`,
48
+ `t-popover__content--${O.size}`
47
49
  ]), V = () => {
48
50
  O.disabled || (L(!0), l(() => {
49
51
  P.value && (S(P.value) || P.value.focus());
@@ -1 +1 @@
1
- {"version":3,"file":"TPopover.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TPopover.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, toRef, useAttrs, watch } from 'vue';\nimport { createId, focusFirst, isEscapeKey } from '@treeui/utils';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize, TTooltipSide } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n side?: TTooltipSide;\n align?: 'start' | 'center' | 'end';\n /** Panel density. Scales the content padding by the shared size tokens. */\n size?: TSize;\n id?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n disabled: false,\n side: 'bottom',\n align: 'center',\n size: 'md',\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n}>();\n\ndefineSlots<{\n trigger(props: { isOpen: boolean; contentId: string }): unknown;\n default(): unknown;\n}>();\n\nconst attrs = useAttrs();\nconst contentId = props.id ?? createId('t-popover');\nconst rootRef = ref<HTMLElement | null>(null);\n// Bound to the anchor wrapper, not the fallback button: the fallback does not\n// render when a consumer supplies a `trigger` slot, so a ref on it would be\n// null exactly when focus restoration matters most. focusFirst() resolves the\n// real trigger either way. Mirrors TDropdown's trigger-wrapper ref.\nconst triggerRef = ref<HTMLElement | null>(null);\nconst contentRef = ref<HTMLElement | null>(null);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst rootClasses = computed(() => [\n 't-popover',\n {\n 'is-open': isOpen.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst contentClasses = computed(() => [\n 't-popover__content',\n `t-popover__content--${props.side}`,\n `t-popover__content--align-${props.align}`,\n `t-popover__content--${props.size}`,\n]);\n\nconst openPopover = () => {\n if (props.disabled) return;\n setValue(true);\n nextTick(() => {\n if (contentRef.value) {\n if (!focusFirst(contentRef.value)) {\n contentRef.value.focus();\n }\n }\n });\n};\n\nconst closePopover = (restoreFocus = false) => {\n setValue(false);\n if (restoreFocus) {\n nextTick(() => {\n if (triggerRef.value) focusFirst(triggerRef.value);\n });\n }\n};\n\nconst togglePopover = () => {\n if (isOpen.value) {\n closePopover();\n } else {\n openPopover();\n }\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closePopover();\n }\n};\n\nconst onContentKeydown = (event: KeyboardEvent) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closePopover(true);\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return;\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (rootRef.value?.contains(target)) return;\n closePopover();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n } else {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n }\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <div\n ref=\"triggerRef\"\n class=\"t-popover__anchor\"\n @click=\"togglePopover\"\n @keydown=\"onTriggerKeydown\"\n >\n <slot\n name=\"trigger\"\n :is-open=\"isOpen\"\n :content-id=\"contentId\"\n >\n <button\n type=\"button\"\n class=\"t-popover__trigger\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? contentId : undefined\"\n aria-haspopup=\"dialog\"\n v-bind=\"triggerAttrs\"\n />\n </slot>\n </div>\n <transition name=\"t-popover-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"contentId\"\n ref=\"contentRef\"\n role=\"dialog\"\n :class=\"contentClasses\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n tabindex=\"-1\"\n @keydown=\"onContentKeydown\"\n >\n <slot />\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TStack.cjs","names":[],"sources":["../../src/components/TStack.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treeStackDirections = ['vertical', 'horizontal'] as const;\n\nexport type TStackDirection = (typeof _treeStackDirections)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n direction?: TStackDirection;\n gap?: string;\n align?: string;\n justify?: string;\n wrap?: boolean;\n reverse?: boolean;\n /** Expand to fill available space along the parent's main axis. */\n grow?: boolean;\n }>(),\n {\n as: 'div',\n direction: 'vertical',\n gap: 'var(--tree-space-4)',\n align: 'stretch',\n justify: 'flex-start',\n wrap: false,\n reverse: false,\n grow: false,\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-stack',\n `t-stack--${props.direction}`,\n {\n 'is-wrapping': props.wrap,\n 'is-reversed': props.reverse,\n 'is-grow': props.grow,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => [\n {\n gap: props.gap,\n alignItems: props.align,\n justifyContent: props.justify,\n },\n attrs.style,\n]);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TStack.cjs","names":[],"sources":["../../src/components/TStack.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treeStackDirections = ['vertical', 'horizontal'] as const;\nconst _treeStackFills = ['viewport', 'parent'] as const;\n\nexport type TStackDirection = (typeof _treeStackDirections)[number];\nexport type TStackFill = (typeof _treeStackFills)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n direction?: TStackDirection;\n gap?: string;\n align?: string;\n justify?: string;\n wrap?: boolean;\n reverse?: boolean;\n /** Expand to fill available space along the parent's main axis. */\n grow?: boolean;\n /**\n * Give the stack a minimum block size so a centered child fills the screen\n * or its parent: `viewport` → `100dvh`, `parent` → `100%`. Compose with\n * `align`/`justify=\"center\"` for a centered loading or empty state.\n */\n fill?: TStackFill;\n }>(),\n {\n as: 'div',\n direction: 'vertical',\n gap: 'var(--tree-space-4)',\n align: 'stretch',\n justify: 'flex-start',\n wrap: false,\n reverse: false,\n grow: false,\n fill: undefined,\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-stack',\n `t-stack--${props.direction}`,\n props.fill ? `t-stack--fill-${props.fill}` : null,\n {\n 'is-wrapping': props.wrap,\n 'is-reversed': props.reverse,\n 'is-grow': props.grow,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => [\n {\n gap: props.gap,\n alignItems: props.align,\n justifyContent: props.justify,\n },\n attrs.style,\n]);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"TStack.js","names":[],"sources":["../../src/components/TStack.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treeStackDirections = ['vertical', 'horizontal'] as const;\n\nexport type TStackDirection = (typeof _treeStackDirections)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n direction?: TStackDirection;\n gap?: string;\n align?: string;\n justify?: string;\n wrap?: boolean;\n reverse?: boolean;\n /** Expand to fill available space along the parent's main axis. */\n grow?: boolean;\n }>(),\n {\n as: 'div',\n direction: 'vertical',\n gap: 'var(--tree-space-4)',\n align: 'stretch',\n justify: 'flex-start',\n wrap: false,\n reverse: false,\n grow: false,\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-stack',\n `t-stack--${props.direction}`,\n {\n 'is-wrapping': props.wrap,\n 'is-reversed': props.reverse,\n 'is-grow': props.grow,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => [\n {\n gap: props.gap,\n alignItems: props.align,\n justifyContent: props.justify,\n },\n attrs.style,\n]);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TStack.js","names":[],"sources":["../../src/components/TStack.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treeStackDirections = ['vertical', 'horizontal'] as const;\nconst _treeStackFills = ['viewport', 'parent'] as const;\n\nexport type TStackDirection = (typeof _treeStackDirections)[number];\nexport type TStackFill = (typeof _treeStackFills)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n direction?: TStackDirection;\n gap?: string;\n align?: string;\n justify?: string;\n wrap?: boolean;\n reverse?: boolean;\n /** Expand to fill available space along the parent's main axis. */\n grow?: boolean;\n /**\n * Give the stack a minimum block size so a centered child fills the screen\n * or its parent: `viewport` → `100dvh`, `parent` → `100%`. Compose with\n * `align`/`justify=\"center\"` for a centered loading or empty state.\n */\n fill?: TStackFill;\n }>(),\n {\n as: 'div',\n direction: 'vertical',\n gap: 'var(--tree-space-4)',\n align: 'stretch',\n justify: 'flex-start',\n wrap: false,\n reverse: false,\n grow: false,\n fill: undefined,\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-stack',\n `t-stack--${props.direction}`,\n props.fill ? `t-stack--fill-${props.fill}` : null,\n {\n 'is-wrapping': props.wrap,\n 'is-reversed': props.reverse,\n 'is-grow': props.grow,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => [\n {\n gap: props.gap,\n alignItems: props.align,\n justifyContent: props.justify,\n },\n attrs.style,\n]);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <slot />\n </component>\n</template>\n"],"mappings":""}
@@ -1,5 +1,7 @@
1
1
  declare const _treeStackDirections: readonly ["vertical", "horizontal"];
2
+ declare const _treeStackFills: readonly ["viewport", "parent"];
2
3
  export type TStackDirection = (typeof _treeStackDirections)[number];
4
+ export type TStackFill = (typeof _treeStackFills)[number];
3
5
  type __VLS_Props = {
4
6
  as?: string;
5
7
  direction?: TStackDirection;
@@ -10,6 +12,12 @@ type __VLS_Props = {
10
12
  reverse?: boolean;
11
13
  /** Expand to fill available space along the parent's main axis. */
12
14
  grow?: boolean;
15
+ /**
16
+ * Give the stack a minimum block size so a centered child fills the screen
17
+ * or its parent: `viewport` → `100dvh`, `parent` → `100%`. Compose with
18
+ * `align`/`justify="center"` for a centered loading or empty state.
19
+ */
20
+ fill?: TStackFill;
13
21
  };
14
22
  declare function __VLS_template(): {
15
23
  attrs: Partial<{}>;
@@ -22,6 +30,7 @@ declare function __VLS_template(): {
22
30
  type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
23
31
  declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
24
32
  reverse: boolean;
33
+ fill: TStackFill;
25
34
  gap: string;
26
35
  as: string;
27
36
  align: string;
@@ -1 +1 @@
1
- {"version":3,"file":"TStack.vue.d.ts","sourceRoot":"","sources":["../../src/components/TStack.vue"],"names":[],"mappings":"AAiFA,QAAA,MAAM,oBAAoB,qCAAsC,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAsDJ,iBAAS,cAAc;WAkCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAYD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;aA7GP,OAAO;SAJX,MAAM;QAFP,MAAM;WAGH,MAAM;aACJ,MAAM;UACT,OAAO;eAJF,eAAe;UAOpB,OAAO;6EAkHhB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"TStack.vue.d.ts","sourceRoot":"","sources":["../../src/components/TStack.vue"],"names":[],"mappings":"AA2FA,QAAA,MAAM,oBAAoB,qCAAsC,CAAC;AACjE,QAAA,MAAM,eAAe,iCAAkC,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAyDJ,iBAAS,cAAc;WAkCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAYD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;aAtHP,OAAO;UAQV,UAAU;SAZX,MAAM;QAFP,MAAM;WAGH,MAAM;aACJ,MAAM;UACT,OAAO;eAJF,eAAe;UAOpB,OAAO;6EA2HhB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,2 +1,2 @@
1
- let e=require("vue");var t=(0,e.defineComponent)({inheritAttrs:!1,__name:`TStack`,props:{as:{default:`div`},direction:{default:`vertical`},gap:{default:`var(--tree-space-4)`},align:{default:`stretch`},justify:{default:`flex-start`},wrap:{type:Boolean,default:!1},reverse:{type:Boolean,default:!1},grow:{type:Boolean,default:!1}},setup(t){let n=t,r=(0,e.useAttrs)(),i=(0,e.computed)(()=>[`t-stack`,`t-stack--${n.direction}`,{"is-wrapping":n.wrap,"is-reversed":n.reverse,"is-grow":n.grow},r.class]),a=(0,e.computed)(()=>[{gap:n.gap,alignItems:n.align,justifyContent:n.justify},r.style]),o=(0,e.computed)(()=>{let{class:e,style:t,...n}=r;return n});return(n,r)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(t.as),(0,e.mergeProps)(o.value,{class:i.value,style:a.value}),{default:(0,e.withCtx)(()=>[(0,e.renderSlot)(n.$slots,`default`)]),_:3},16,[`class`,`style`]))}});exports.default=t;
1
+ let e=require("vue");var t=(0,e.defineComponent)({inheritAttrs:!1,__name:`TStack`,props:{as:{default:`div`},direction:{default:`vertical`},gap:{default:`var(--tree-space-4)`},align:{default:`stretch`},justify:{default:`flex-start`},wrap:{type:Boolean,default:!1},reverse:{type:Boolean,default:!1},grow:{type:Boolean,default:!1},fill:{default:void 0}},setup(t){let n=t,r=(0,e.useAttrs)(),i=(0,e.computed)(()=>[`t-stack`,`t-stack--${n.direction}`,n.fill?`t-stack--fill-${n.fill}`:null,{"is-wrapping":n.wrap,"is-reversed":n.reverse,"is-grow":n.grow},r.class]),a=(0,e.computed)(()=>[{gap:n.gap,alignItems:n.align,justifyContent:n.justify},r.style]),o=(0,e.computed)(()=>{let{class:e,style:t,...n}=r;return n});return(n,r)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(t.as),(0,e.mergeProps)(o.value,{class:i.value,style:a.value}),{default:(0,e.withCtx)(()=>[(0,e.renderSlot)(n.$slots,`default`)]),_:3},16,[`class`,`style`]))}});exports.default=t;
2
2
  //# sourceMappingURL=TStack.vue_vue_type_script_setup_true_lang.cjs.map