@treeui/vue 0.13.0 → 0.15.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 (184) 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 +25 -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 +166 -104
  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 +8 -2
  12. package/dist/components/TButton.vue.d.ts.map +1 -1
  13. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.cjs +1 -1
  14. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  15. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.js +12 -3
  16. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/components/TChart.cjs.map +1 -1
  18. package/dist/components/TChart.js.map +1 -1
  19. package/dist/components/TChart.vue.d.ts.map +1 -1
  20. package/dist/components/TChart.vue_vue_type_script_setup_true_lang.cjs +1 -1
  21. package/dist/components/TChart.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  22. package/dist/components/TChart.vue_vue_type_script_setup_true_lang.js +58 -58
  23. package/dist/components/TChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/components/TColorSwatch.cjs +2 -0
  25. package/dist/components/TColorSwatch.cjs.map +1 -0
  26. package/dist/components/TColorSwatch.js +7 -0
  27. package/dist/components/TColorSwatch.js.map +1 -0
  28. package/dist/components/TColorSwatch.vue.d.ts +33 -0
  29. package/dist/components/TColorSwatch.vue.d.ts.map +1 -0
  30. package/dist/components/TColorSwatch.vue_vue_type_script_setup_true_lang.cjs +2 -0
  31. package/dist/components/TColorSwatch.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  32. package/dist/components/TColorSwatch.vue_vue_type_script_setup_true_lang.js +63 -0
  33. package/dist/components/TColorSwatch.vue_vue_type_script_setup_true_lang.js.map +1 -0
  34. package/dist/components/TDropdown.vue.d.ts +1 -1
  35. package/dist/components/TDropdown.vue.d.ts.map +1 -1
  36. package/dist/components/TFileUpload.cjs.map +1 -1
  37. package/dist/components/TFileUpload.js.map +1 -1
  38. package/dist/components/TFileUpload.vue.d.ts +77 -10
  39. package/dist/components/TFileUpload.vue.d.ts.map +1 -1
  40. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.cjs +1 -1
  41. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  42. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.js +393 -144
  43. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/components/TInput.cjs.map +1 -1
  45. package/dist/components/TInput.js.map +1 -1
  46. package/dist/components/TInput.vue.d.ts +4 -1
  47. package/dist/components/TInput.vue.d.ts.map +1 -1
  48. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.cjs +1 -1
  49. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  50. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.js +2 -0
  51. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/components/TKbd.cjs +2 -0
  53. package/dist/components/TKbd.cjs.map +1 -0
  54. package/dist/components/TKbd.js +7 -0
  55. package/dist/components/TKbd.js.map +1 -0
  56. package/dist/components/TKbd.vue.d.ts +18 -0
  57. package/dist/components/TKbd.vue.d.ts.map +1 -0
  58. package/dist/components/TKbd.vue_vue_type_script_setup_true_lang.cjs +2 -0
  59. package/dist/components/TKbd.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  60. package/dist/components/TKbd.vue_vue_type_script_setup_true_lang.js +12 -0
  61. package/dist/components/TKbd.vue_vue_type_script_setup_true_lang.js.map +1 -0
  62. package/dist/components/TNavMenu.cjs.map +1 -1
  63. package/dist/components/TNavMenu.js.map +1 -1
  64. package/dist/components/TNavMenu.vue.d.ts +9 -0
  65. package/dist/components/TNavMenu.vue.d.ts.map +1 -1
  66. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.cjs +1 -1
  67. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  68. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.js +67 -55
  69. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  70. package/dist/components/TPage.cjs +2 -0
  71. package/dist/components/TPage.cjs.map +1 -0
  72. package/dist/components/TPage.js +7 -0
  73. package/dist/components/TPage.js.map +1 -0
  74. package/dist/components/TPage.vue.d.ts +35 -0
  75. package/dist/components/TPage.vue.d.ts.map +1 -0
  76. package/dist/components/TPage.vue_vue_type_script_setup_true_lang.cjs +2 -0
  77. package/dist/components/TPage.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  78. package/dist/components/TPage.vue_vue_type_script_setup_true_lang.js +49 -0
  79. package/dist/components/TPage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  80. package/dist/components/TPageHeader.cjs +2 -0
  81. package/dist/components/TPageHeader.cjs.map +1 -0
  82. package/dist/components/TPageHeader.js +7 -0
  83. package/dist/components/TPageHeader.js.map +1 -0
  84. package/dist/components/TPageHeader.vue.d.ts +40 -0
  85. package/dist/components/TPageHeader.vue.d.ts.map +1 -0
  86. package/dist/components/TPageHeader.vue_vue_type_script_setup_true_lang.cjs +2 -0
  87. package/dist/components/TPageHeader.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  88. package/dist/components/TPageHeader.vue_vue_type_script_setup_true_lang.js +54 -0
  89. package/dist/components/TPageHeader.vue_vue_type_script_setup_true_lang.js.map +1 -0
  90. package/dist/components/TPopover.vue.d.ts +1 -1
  91. package/dist/components/TPopover.vue.d.ts.map +1 -1
  92. package/dist/components/TSelect.cjs.map +1 -1
  93. package/dist/components/TSelect.js.map +1 -1
  94. package/dist/components/TSelect.vue.d.ts +4 -1
  95. package/dist/components/TSelect.vue.d.ts.map +1 -1
  96. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.cjs +1 -1
  97. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  98. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.js +2 -0
  99. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.cjs +1 -1
  101. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  102. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.js +1 -4
  103. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/components/TSpacer.cjs +2 -0
  105. package/dist/components/TSpacer.cjs.map +1 -0
  106. package/dist/components/TSpacer.js +7 -0
  107. package/dist/components/TSpacer.js.map +1 -0
  108. package/dist/components/TSpacer.vue.d.ts +8 -0
  109. package/dist/components/TSpacer.vue.d.ts.map +1 -0
  110. package/dist/components/TSpacer.vue_vue_type_script_setup_true_lang.cjs +2 -0
  111. package/dist/components/TSpacer.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  112. package/dist/components/TSpacer.vue_vue_type_script_setup_true_lang.js +16 -0
  113. package/dist/components/TSpacer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  114. package/dist/components/TSplit.cjs +2 -0
  115. package/dist/components/TSplit.cjs.map +1 -0
  116. package/dist/components/TSplit.js +7 -0
  117. package/dist/components/TSplit.js.map +1 -0
  118. package/dist/components/TSplit.vue.d.ts +38 -0
  119. package/dist/components/TSplit.vue.d.ts.map +1 -0
  120. package/dist/components/TSplit.vue_vue_type_script_setup_true_lang.cjs +2 -0
  121. package/dist/components/TSplit.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  122. package/dist/components/TSplit.vue_vue_type_script_setup_true_lang.js +43 -0
  123. package/dist/components/TSplit.vue_vue_type_script_setup_true_lang.js.map +1 -0
  124. package/dist/components/TStack.cjs.map +1 -1
  125. package/dist/components/TStack.js.map +1 -1
  126. package/dist/components/TStack.vue.d.ts +3 -0
  127. package/dist/components/TStack.vue.d.ts.map +1 -1
  128. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.cjs +1 -1
  129. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  130. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.js +6 -1
  131. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/components/TStackItem.cjs +2 -0
  133. package/dist/components/TStackItem.cjs.map +1 -0
  134. package/dist/components/TStackItem.js +7 -0
  135. package/dist/components/TStackItem.js.map +1 -0
  136. package/dist/components/TStackItem.vue.d.ts +38 -0
  137. package/dist/components/TStackItem.vue.d.ts.map +1 -0
  138. package/dist/components/TStackItem.vue_vue_type_script_setup_true_lang.cjs +2 -0
  139. package/dist/components/TStackItem.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  140. package/dist/components/TStackItem.vue_vue_type_script_setup_true_lang.js +45 -0
  141. package/dist/components/TStackItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  142. package/dist/components/TText.cjs +2 -0
  143. package/dist/components/TText.cjs.map +1 -0
  144. package/dist/components/TText.js +7 -0
  145. package/dist/components/TText.js.map +1 -0
  146. package/dist/components/TText.vue.d.ts +39 -0
  147. package/dist/components/TText.vue.d.ts.map +1 -0
  148. package/dist/components/TText.vue_vue_type_script_setup_true_lang.cjs +2 -0
  149. package/dist/components/TText.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  150. package/dist/components/TText.vue_vue_type_script_setup_true_lang.js +32 -0
  151. package/dist/components/TText.vue_vue_type_script_setup_true_lang.js.map +1 -0
  152. package/dist/components/TTextarea.cjs.map +1 -1
  153. package/dist/components/TTextarea.js.map +1 -1
  154. package/dist/components/TTextarea.vue.d.ts +4 -1
  155. package/dist/components/TTextarea.vue.d.ts.map +1 -1
  156. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.cjs +1 -1
  157. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  158. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.js +2 -0
  159. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  160. package/dist/components/index.d.ts +12 -1
  161. package/dist/components/index.d.ts.map +1 -1
  162. package/dist/composables/useTheme.cjs +2 -0
  163. package/dist/composables/useTheme.cjs.map +1 -0
  164. package/dist/composables/useTheme.d.ts +38 -0
  165. package/dist/composables/useTheme.d.ts.map +1 -0
  166. package/dist/composables/useTheme.js +54 -0
  167. package/dist/composables/useTheme.js.map +1 -0
  168. package/dist/index.cjs +1 -1
  169. package/dist/index.d.ts +2 -0
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +64 -55
  172. package/dist/plugin.cjs +1 -1
  173. package/dist/plugin.cjs.map +1 -1
  174. package/dist/plugin.d.ts.map +1 -1
  175. package/dist/plugin.js +113 -97
  176. package/dist/plugin.js.map +1 -1
  177. package/dist/style.css +1 -1
  178. package/dist/types/contracts.cjs +1 -1
  179. package/dist/types/contracts.cjs.map +1 -1
  180. package/dist/types/contracts.d.ts +8 -1
  181. package/dist/types/contracts.d.ts.map +1 -1
  182. package/dist/types/contracts.js +8 -2
  183. package/dist/types/contracts.js.map +1 -1
  184. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"TNavMenu.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { getNextEnabledIndex, isActivationKey } from '@treeui/utils';\nimport { computed, getCurrentInstance, inject, nextTick, ref, useAttrs, watch, type Component, type ComponentPublicInstance } from 'vue';\nimport type { TSize } from '../types/contracts';\nimport { treeSidebarInjectionKey } from './sidebar';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nexport interface TNavMenuItem {\n label: string;\n value: string;\n shortLabel?: string;\n description?: string;\n icon?: Component;\n to?: string | Record<string, unknown>;\n badge?: string | number;\n disabled?: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n defaultValue?: string;\n items?: TNavMenuItem[];\n size?: TSize;\n collapsed?: boolean;\n disabled?: boolean;\n }>(),\n {\n modelValue: undefined,\n defaultValue: '',\n items: () => [],\n size: 'md',\n collapsed: undefined,\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n select: [value: string, item: TNavMenuItem];\n}>();\n\ndefineSlots<{\n item?: (props: {\n item: TNavMenuItem;\n selected: boolean;\n focused: boolean;\n collapsed: boolean;\n }) => unknown;\n empty?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst sidebar = inject(treeSidebarInjectionKey, null);\nconst internalValue = ref(props.defaultValue);\nconst itemRefs = ref<Map<string, HTMLElement>>(new Map());\nconst instance = getCurrentInstance();\n\nconst selectedValue = computed(() => props.modelValue ?? internalValue.value);\nconst resolvedCollapsed = computed(() => props.collapsed ?? sidebar?.collapsed.value ?? false);\n\nconst routerLinkComponent = computed<Component | null>(() => (\n (instance?.appContext.components.RouterLink as Component | undefined) ?? null\n));\n\nconst itemTag = (item: TNavMenuItem) => {\n if (item.to && routerLinkComponent.value) {\n return routerLinkComponent.value;\n }\n return 'button';\n};\n\nconst getInitialFocusedIndex = () => {\n const selectedIndex = props.items.findIndex((item) =>\n item.value === selectedValue.value && !item.disabled,\n );\n\n if (selectedIndex >= 0) {\n return selectedIndex;\n }\n\n return props.items.findIndex((item) => !item.disabled);\n};\n\nconst focusedIndex = ref(getInitialFocusedIndex());\n\nconst rootClasses = computed(() => [\n 't-nav-menu',\n `t-nav-menu--${props.size}`,\n {\n 'is-collapsed': resolvedCollapsed.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst isSelected = (value: string) => selectedValue.value === value;\n\nconst setItemRef = (element: Element | ComponentPublicInstance | null, value: string) => {\n const resolvedElement =\n element instanceof HTMLElement\n ? element\n : element && '$el' in element && element.$el instanceof HTMLElement\n ? element.$el\n : null;\n\n if (resolvedElement) {\n itemRefs.value.set(value, resolvedElement);\n } else {\n itemRefs.value.delete(value);\n }\n};\n\nconst focusItem = (index: number) => {\n const item = props.items[index];\n\n if (!item) {\n return;\n }\n\n focusedIndex.value = index;\n nextTick(() => itemRefs.value.get(item.value)?.focus());\n};\n\nconst selectItem = (item: TNavMenuItem) => {\n if (props.disabled || item.disabled) {\n return;\n }\n\n if (props.modelValue === undefined) {\n internalValue.value = item.value;\n }\n\n emit('update:modelValue', item.value);\n emit('select', item.value, item);\n};\n\nconst onItemKeydown = (event: KeyboardEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n const firstIndex = props.items.findIndex((item) => !item.disabled);\n\n if (firstIndex >= 0) {\n focusItem(firstIndex);\n }\n\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n const lastIndex = [...props.items].reverse().findIndex((item) => !item.disabled);\n\n if (lastIndex >= 0) {\n focusItem(props.items.length - 1 - lastIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n event.preventDefault();\n const nextIndex = getNextEnabledIndex(index, props.items, 1);\n\n if (nextIndex >= 0) {\n focusItem(nextIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {\n event.preventDefault();\n const previousIndex = getNextEnabledIndex(index, props.items, -1);\n\n if (previousIndex >= 0) {\n focusItem(previousIndex);\n }\n\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectItem(props.items[index]);\n }\n};\n\nconst getTabIndex = (index: number) => (focusedIndex.value === index ? 0 : -1);\n\nwatch(\n () => [props.items, props.modelValue] as const,\n () => {\n const nextIndex = getInitialFocusedIndex();\n focusedIndex.value = nextIndex >= 0 ? nextIndex : -1;\n },\n { deep: true },\n);\n</script>\n\n<template>\n <nav\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <ul\n v-if=\"items.length > 0\"\n class=\"t-nav-menu__list\"\n >\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.value\"\n class=\"t-nav-menu__entry\"\n >\n <component\n :is=\"itemTag(item)\"\n :ref=\"(element: Element | ComponentPublicInstance | null) => setItemRef(element, item.value)\"\n :type=\"item.to ? undefined : 'button'\"\n :to=\"item.to || undefined\"\n class=\"t-nav-menu__item\"\n :class=\"{\n 'is-selected': isSelected(item.value),\n 'is-disabled': disabled || item.disabled,\n }\"\n :disabled=\"(!item.to && (disabled || item.disabled)) || undefined\"\n :aria-disabled=\"(item.to && (disabled || item.disabled)) || undefined\"\n :aria-current=\"isSelected(item.value) ? 'page' : undefined\"\n :tabindex=\"disabled || item.disabled ? -1 : getTabIndex(index)\"\n :title=\"resolvedCollapsed ? item.label : undefined\"\n @click=\"selectItem(item)\"\n @keydown=\"onItemKeydown($event, index)\"\n @focus=\"focusedIndex = index\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :selected=\"isSelected(item.value)\"\n :focused=\"focusedIndex === index\"\n :collapsed=\"resolvedCollapsed\"\n >\n <component\n :is=\"item.icon\"\n v-if=\"item.icon\"\n class=\"t-nav-menu__icon\"\n aria-hidden=\"true\"\n />\n <span\n v-else\n class=\"t-nav-menu__marker\"\n aria-hidden=\"true\"\n >\n {{ (item.shortLabel ?? item.label.charAt(0)).toUpperCase() }}\n </span>\n\n <span class=\"t-nav-menu__copy\">\n <span class=\"t-nav-menu__label\">{{ item.label }}</span>\n <span\n v-if=\"item.description\"\n class=\"t-nav-menu__description\"\n >\n {{ item.description }}\n </span>\n </span>\n\n <span\n v-if=\"item.badge !== undefined && item.badge !== null\"\n class=\"t-nav-menu__badge\"\n >\n {{ item.badge }}\n </span>\n </slot>\n </component>\n </li>\n </ul>\n\n <div\n v-else\n class=\"t-nav-menu__empty\"\n >\n <slot name=\"empty\">\n No navigation items.\n </slot>\n </div>\n </nav>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TNavMenu.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { getNextEnabledIndex, isActivationKey } from '@treeui/utils';\nimport { computed, getCurrentInstance, inject, nextTick, ref, useAttrs, watch, type Component, type ComponentPublicInstance } from 'vue';\nimport type { TSize } from '../types/contracts';\nimport { treeSidebarInjectionKey } from './sidebar';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nexport interface TNavMenuItem {\n label: string;\n value: string;\n shortLabel?: string;\n description?: string;\n icon?: Component;\n to?: string | Record<string, unknown>;\n badge?: string | number;\n disabled?: boolean;\n /**\n * When the item renders as a router link, controls whether an inclusive\n * (prefix) route match also marks it active. Defaults to the menu-level\n * `exact` prop. Set to `false` for section roots that should stay active on\n * nested routes.\n */\n exact?: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n defaultValue?: string;\n items?: TNavMenuItem[];\n size?: TSize;\n collapsed?: boolean;\n disabled?: boolean;\n exact?: boolean;\n }>(),\n {\n modelValue: undefined,\n defaultValue: '',\n items: () => [],\n size: 'md',\n collapsed: undefined,\n disabled: false,\n exact: true,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n select: [value: string, item: TNavMenuItem];\n}>();\n\ndefineSlots<{\n item?: (props: {\n item: TNavMenuItem;\n selected: boolean;\n focused: boolean;\n collapsed: boolean;\n }) => unknown;\n empty?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst sidebar = inject(treeSidebarInjectionKey, null);\nconst internalValue = ref(props.defaultValue);\nconst itemRefs = ref<Map<string, HTMLElement>>(new Map());\nconst instance = getCurrentInstance();\n\nconst selectedValue = computed(() => props.modelValue ?? internalValue.value);\nconst resolvedCollapsed = computed(() => props.collapsed ?? sidebar?.collapsed.value ?? false);\n\nconst routerLinkComponent = computed<Component | null>(() => (\n (instance?.appContext.components.RouterLink as Component | undefined) ?? null\n));\n\nconst itemTag = (item: TNavMenuItem) => {\n if (item.to && routerLinkComponent.value) {\n return routerLinkComponent.value;\n }\n return 'button';\n};\n\nconst isRouterLinkItem = (item: TNavMenuItem) =>\n Boolean(item.to) && routerLinkComponent.value !== null;\n\n// Keep the active highlight deterministic when items render as router links.\n// Vue Router's default `router-link-active` uses inclusive (prefix) matching,\n// so several links can appear active at once. We map the router's active\n// classes onto TreeUI's own `is-selected`:\n// - Controlled menus (explicit `modelValue`) own selection, so the router adds\n// no class of its own — only the bound `is-selected` shows.\n// - Uncontrolled menus let the current route drive selection, using exact\n// matching by default (opt out per item, or menu-wide, via `exact`).\nconst routerActiveClass = (item: TNavMenuItem) => {\n if (!isRouterLinkItem(item)) {\n return undefined;\n }\n\n if (props.modelValue !== undefined) {\n return '';\n }\n\n return (item.exact ?? props.exact) ? '' : 'is-selected';\n};\n\nconst routerExactActiveClass = (item: TNavMenuItem) => {\n if (!isRouterLinkItem(item)) {\n return undefined;\n }\n\n return props.modelValue !== undefined ? '' : 'is-selected';\n};\n\nconst getInitialFocusedIndex = () => {\n const selectedIndex = props.items.findIndex((item) =>\n item.value === selectedValue.value && !item.disabled,\n );\n\n if (selectedIndex >= 0) {\n return selectedIndex;\n }\n\n return props.items.findIndex((item) => !item.disabled);\n};\n\nconst focusedIndex = ref(getInitialFocusedIndex());\n\nconst rootClasses = computed(() => [\n 't-nav-menu',\n `t-nav-menu--${props.size}`,\n {\n 'is-collapsed': resolvedCollapsed.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst isSelected = (value: string) => selectedValue.value === value;\n\nconst setItemRef = (element: Element | ComponentPublicInstance | null, value: string) => {\n const resolvedElement =\n element instanceof HTMLElement\n ? element\n : element && '$el' in element && element.$el instanceof HTMLElement\n ? element.$el\n : null;\n\n if (resolvedElement) {\n itemRefs.value.set(value, resolvedElement);\n } else {\n itemRefs.value.delete(value);\n }\n};\n\nconst focusItem = (index: number) => {\n const item = props.items[index];\n\n if (!item) {\n return;\n }\n\n focusedIndex.value = index;\n nextTick(() => itemRefs.value.get(item.value)?.focus());\n};\n\nconst selectItem = (item: TNavMenuItem) => {\n if (props.disabled || item.disabled) {\n return;\n }\n\n if (props.modelValue === undefined) {\n internalValue.value = item.value;\n }\n\n emit('update:modelValue', item.value);\n emit('select', item.value, item);\n};\n\nconst onItemKeydown = (event: KeyboardEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n const firstIndex = props.items.findIndex((item) => !item.disabled);\n\n if (firstIndex >= 0) {\n focusItem(firstIndex);\n }\n\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n const lastIndex = [...props.items].reverse().findIndex((item) => !item.disabled);\n\n if (lastIndex >= 0) {\n focusItem(props.items.length - 1 - lastIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n event.preventDefault();\n const nextIndex = getNextEnabledIndex(index, props.items, 1);\n\n if (nextIndex >= 0) {\n focusItem(nextIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {\n event.preventDefault();\n const previousIndex = getNextEnabledIndex(index, props.items, -1);\n\n if (previousIndex >= 0) {\n focusItem(previousIndex);\n }\n\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectItem(props.items[index]);\n }\n};\n\nconst getTabIndex = (index: number) => (focusedIndex.value === index ? 0 : -1);\n\nwatch(\n () => [props.items, props.modelValue] as const,\n () => {\n const nextIndex = getInitialFocusedIndex();\n focusedIndex.value = nextIndex >= 0 ? nextIndex : -1;\n },\n { deep: true },\n);\n</script>\n\n<template>\n <nav\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <ul\n v-if=\"items.length > 0\"\n class=\"t-nav-menu__list\"\n >\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.value\"\n class=\"t-nav-menu__entry\"\n >\n <component\n :is=\"itemTag(item)\"\n :ref=\"(element: Element | ComponentPublicInstance | null) => setItemRef(element, item.value)\"\n :type=\"item.to ? undefined : 'button'\"\n :to=\"item.to || undefined\"\n class=\"t-nav-menu__item\"\n :class=\"{\n 'is-selected': isSelected(item.value),\n 'is-disabled': disabled || item.disabled,\n }\"\n :active-class=\"routerActiveClass(item)\"\n :exact-active-class=\"routerExactActiveClass(item)\"\n :disabled=\"(!item.to && (disabled || item.disabled)) || undefined\"\n :aria-disabled=\"(item.to && (disabled || item.disabled)) || undefined\"\n :aria-current=\"isSelected(item.value) ? 'page' : undefined\"\n :tabindex=\"disabled || item.disabled ? -1 : getTabIndex(index)\"\n :title=\"resolvedCollapsed ? item.label : undefined\"\n @click=\"selectItem(item)\"\n @keydown=\"onItemKeydown($event, index)\"\n @focus=\"focusedIndex = index\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :selected=\"isSelected(item.value)\"\n :focused=\"focusedIndex === index\"\n :collapsed=\"resolvedCollapsed\"\n >\n <component\n :is=\"item.icon\"\n v-if=\"item.icon\"\n class=\"t-nav-menu__icon\"\n aria-hidden=\"true\"\n />\n <span\n v-else\n class=\"t-nav-menu__marker\"\n aria-hidden=\"true\"\n >\n {{ (item.shortLabel ?? item.label.charAt(0)).toUpperCase() }}\n </span>\n\n <span class=\"t-nav-menu__copy\">\n <span class=\"t-nav-menu__label\">{{ item.label }}</span>\n <span\n v-if=\"item.description\"\n class=\"t-nav-menu__description\"\n >\n {{ item.description }}\n </span>\n </span>\n\n <span\n v-if=\"item.badge !== undefined && item.badge !== null\"\n class=\"t-nav-menu__badge\"\n >\n {{ item.badge }}\n </span>\n </slot>\n </component>\n </li>\n </ul>\n\n <div\n v-else\n class=\"t-nav-menu__empty\"\n >\n <slot name=\"empty\">\n No navigation items.\n </slot>\n </div>\n </nav>\n</template>\n"],"mappings":"qqBA4BA,IAAM,EAAQ,EAqBR,EAAO,EAeP,GAAA,EAAA,EAAA,SAAA,CAAiB,EACjB,GAAA,EAAA,EAAA,OAAA,CAAiB,EAAA,wBAAyB,IAAI,EAC9C,GAAA,EAAA,EAAA,IAAA,CAAoB,EAAM,YAAY,EACtC,GAAA,EAAA,EAAA,IAAA,CAAyC,IAAI,GAAK,EAClD,GAAA,EAAA,EAAA,mBAAA,CAA8B,EAE9B,GAAA,EAAA,EAAA,SAAA,KAA+B,EAAM,YAAc,EAAc,KAAK,EACtE,GAAA,EAAA,EAAA,SAAA,KAAmC,EAAM,WAAa,GAAS,UAAU,OAAS,EAAK,EAEvF,GAAA,EAAA,EAAA,SAAA,KACH,GAAU,WAAW,WAAW,YAAwC,IAC1E,EAEK,EAAW,GACX,EAAK,IAAM,EAAoB,MAC1B,EAAoB,MAEtB,SAGH,EAAoB,GACxB,EAAQ,EAAK,IAAO,EAAoB,QAAU,KAU9C,EAAqB,GAAuB,CAC3C,KAAiB,CAAI,EAQ1B,OAJI,EAAM,aAAe,IAAA,GAIjB,EAAK,OAAS,EAAM,MAAS,GAAK,cAHjC,EAIX,EAEM,EAA0B,GAAuB,CAChD,KAAiB,CAAI,EAI1B,OAAO,EAAM,aAAe,IAAA,GAAiB,cAAL,EAC1C,EAEM,MAA+B,CACnC,IAAM,EAAgB,EAAM,MAAM,UAAW,GAC3C,EAAK,QAAU,EAAc,OAAS,CAAC,EAAK,QAC9C,EAMA,OAJI,GAAiB,EACZ,EAGF,EAAM,MAAM,UAAW,GAAS,CAAC,EAAK,QAAQ,CACvD,EAEM,GAAA,EAAA,EAAA,IAAA,CAAmB,EAAuB,CAAC,EAE3C,GAAA,EAAA,EAAA,SAAA,KAA6B,CACjC,aACA,eAAe,EAAM,OACrB,CACE,eAAgB,EAAkB,MAClC,cAAe,EAAM,QACvB,EACA,EAAM,KACR,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA2B,EAAM,KAAK,EAEtC,GAAA,EAAA,EAAA,SAAA,KAA2B,CAC/B,GAAM,CAAE,MAAO,EAAQ,MAAO,EAAQ,GAAG,GAAS,EAClD,OAAO,CACT,CAAC,EAEK,EAAc,GAAkB,EAAc,QAAU,EAExD,GAAc,EAAmD,IAAkB,CACvF,IAAM,EACJ,aAAmB,YACf,EACA,GAAW,QAAS,GAAW,EAAQ,eAAe,YACpD,EAAQ,IACR,KAEJ,EACF,EAAS,MAAM,IAAI,EAAO,CAAe,EAEzC,EAAS,MAAM,OAAO,CAAK,CAE/B,EAEM,EAAa,GAAkB,CACnC,IAAM,EAAO,EAAM,MAAM,GAEpB,IAIL,EAAa,MAAQ,GACrB,EAAA,EAAA,SAAA,KAAe,EAAS,MAAM,IAAI,EAAK,KAAK,CAAC,EAAE,MAAM,CAAC,EACxD,EAEM,EAAc,GAAuB,CACrC,EAAM,UAAY,EAAK,WAIvB,EAAM,aAAe,IAAA,KACvB,EAAc,MAAQ,EAAK,OAG7B,EAAK,oBAAqB,EAAK,KAAK,EACpC,EAAK,SAAU,EAAK,MAAO,CAAI,EACjC,EAEM,GAAiB,EAAsB,IAAkB,CACzD,MAAM,SAIV,IAAI,EAAM,MAAQ,OAAQ,CACxB,EAAM,eAAe,EACrB,IAAM,EAAa,EAAM,MAAM,UAAW,GAAS,CAAC,EAAK,QAAQ,EAE7D,GAAc,GAChB,EAAU,CAAU,EAGtB,MACF,CAEA,GAAI,EAAM,MAAQ,MAAO,CACvB,EAAM,eAAe,EACrB,IAAM,EAAY,CAAC,GAAG,EAAM,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAW,GAAS,CAAC,EAAK,QAAQ,EAE3E,GAAa,GACf,EAAU,EAAM,MAAM,OAAS,EAAI,CAAS,EAG9C,MACF,CAEA,GAAI,EAAM,MAAQ,aAAe,EAAM,MAAQ,aAAc,CAC3D,EAAM,eAAe,EACrB,IAAM,GAAA,EAAA,EAAA,oBAAA,CAAgC,EAAO,EAAM,MAAO,CAAC,EAEvD,GAAa,GACf,EAAU,CAAS,EAGrB,MACF,CAEA,GAAI,EAAM,MAAQ,WAAa,EAAM,MAAQ,YAAa,CACxD,EAAM,eAAe,EACrB,IAAM,GAAA,EAAA,EAAA,oBAAA,CAAoC,EAAO,EAAM,MAAO,EAAE,EAE5D,GAAiB,GACnB,EAAU,CAAa,EAGzB,MACF,EAEA,EAAA,EAAA,gBAAA,CAAoB,CAAK,IACvB,EAAM,eAAe,EACrB,EAAW,EAAM,MAAM,EAAM,EArC/B,CAuCF,EAEM,EAAe,GAAmB,EAAa,QAAU,EAAQ,EAAI,UAE3E,EAAA,EAAA,MAAA,KACQ,CAAC,EAAM,MAAO,EAAM,UAAU,MAC9B,CACJ,IAAM,EAAY,EAAuB,EACzC,EAAa,MAAQ,GAAa,EAAI,EAAY,EACpD,EACA,CAAE,KAAM,EAAK,CACf,qDAyFQ,OAAA,EAAA,EAAA,WAAA,CApFI,EAoFJ,MApFa,CAChB,MAAO,EAAA,MACP,MAAO,EAAA,SAGA,EAAA,MAAM,OAAM,IAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAqEf,KAtEL,EAsEK,GAAA,EAAA,EAAA,UAAA,CAAA,EAAA,GAAA,EAAA,EAAA,mBAAA,CADE,EAAA,SAAA,MAAA,EAAA,EAAA,WAAA,CAhEqB,EAAA,OAAhB,EAAM,gDAgEX,KAAA,CA/DF,IAAK,EAAK,MACX,MAAM,yFAGC,EAAQ,CAAI,CAAA,EAAA,YAChB,IAAM,GAAsD,EAAW,EAAS,EAAK,KAAK,EAC1F,KAAM,EAAK,GAAK,IAAA,GAAS,SACzB,GAAI,EAAK,IAAM,IAAA,GAChB,OAAA,EAAA,EAAA,eAAA,CAAK,CAAC,mBAAkB,eACa,EAAW,EAAK,KAAK,gBAA8B,EAAA,UAAY,EAAK,YAIxG,eAAc,EAAkB,CAAI,EACpC,qBAAoB,EAAuB,CAAI,EAC/C,SAAQ,CAAI,EAAK,KAAO,EAAA,UAAY,EAAK,WAAc,IAAA,GACvD,gBAAgB,EAAK,KAAO,EAAA,UAAY,EAAK,WAAc,IAAA,GAC3D,eAAc,EAAW,EAAK,KAAK,EAAA,OAAa,IAAA,GAChD,SAAU,EAAA,UAAY,EAAK,SAAQ,GAAQ,EAAY,CAAK,EAC5D,MAAO,EAAA,MAAoB,EAAK,MAAQ,IAAA,GACxC,QAAK,GAAE,EAAW,CAAI,EACtB,UAAO,GAAE,EAAc,EAAQ,CAAK,EACpC,QAAK,GAAE,EAAA,MAAe,8BAuChB,EAAA,EAAA,EAAA,WAAA,CAAA,EAAA,OAAA,OAAA,CAnCE,OACN,SAAU,EAAW,EAAK,KAAK,EAC/B,QAAS,EAAA,QAAiB,EAC1B,UAAW,EAAA,WAgCP,CA5BG,EAAK,OAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,wBAAA,CADN,EAAK,IAAI,EAAA,OAEd,MAAM,mBACN,cAAY,sDAQP,OANP,GAAA,EAAA,EAAA,gBAAA,EAKM,EAAK,YAAc,EAAK,MAAM,OAAM,CAAA,EAAA,CAAK,YAAW,CAAA,EAAA,CAAA,4BAWnD,OARP,EAQO,EAAA,EAAA,EAAA,mBAAA,CAPkD,OAAvD,GAAA,EAAA,EAAA,gBAAA,CAAmC,EAAK,KAAK,EAAA,CAAA,EAErC,EAAK,cAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIN,OALP,GAAA,EAAA,EAAA,gBAAA,CAIK,EAAK,WAAW,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAKf,EAAK,QAAU,IAAA,IAAa,EAAK,QAAK,OAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIvC,OALP,GAAA,EAAA,EAAA,gBAAA,CAIK,EAAK,KAAK,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,kOAcjB,MAPN,EAOM,EAAA,EAAA,EAAA,WAAA,CADG,EAAA,OAAA,QAAA,CAAA,MAAA,CAAA,AAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,CAFY,yBAEnB,EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA"}
@@ -9,16 +9,16 @@ var T = {
9
9
  key: 1,
10
10
  class: "t-nav-menu__marker",
11
11
  "aria-hidden": "true"
12
- }, D = { class: "t-nav-menu__copy" }, O = { class: "t-nav-menu__label" }, k = {
12
+ }, D = { class: "t-nav-menu__copy" }, ee = { class: "t-nav-menu__label" }, te = {
13
13
  key: 0,
14
14
  class: "t-nav-menu__description"
15
- }, A = {
15
+ }, O = {
16
16
  key: 2,
17
17
  class: "t-nav-menu__badge"
18
- }, j = {
18
+ }, k = {
19
19
  key: 1,
20
20
  class: "t-nav-menu__empty"
21
- }, M = /*@__PURE__*/ c({
21
+ }, A = /*@__PURE__*/ c({
22
22
  inheritAttrs: !1,
23
23
  __name: "TNavMenu",
24
24
  props: {
@@ -33,107 +33,119 @@ var T = {
33
33
  disabled: {
34
34
  type: Boolean,
35
35
  default: !1
36
+ },
37
+ exact: {
38
+ type: Boolean,
39
+ default: !0
36
40
  }
37
41
  },
38
42
  emits: ["update:modelValue", "select"],
39
- setup(c, { emit: M }) {
40
- let N = c, P = M, F = b(), I = u(e, null), L = h(N.defaultValue), R = h(/* @__PURE__ */ new Map()), z = l(), B = n(() => N.modelValue ?? L.value), V = n(() => N.collapsed ?? I?.collapsed.value ?? !1), H = n(() => z?.appContext.components.RouterLink ?? null), U = (e) => e.to && H.value ? H.value : "button", W = () => {
41
- let e = N.items.findIndex((e) => e.value === B.value && !e.disabled);
42
- return e >= 0 ? e : N.items.findIndex((e) => !e.disabled);
43
- }, G = h(W()), K = n(() => [
43
+ setup(c, { emit: A }) {
44
+ let j = c, M = A, N = b(), P = u(e, null), F = h(j.defaultValue), I = h(/* @__PURE__ */ new Map()), L = l(), R = n(() => j.modelValue ?? F.value), z = n(() => j.collapsed ?? P?.collapsed.value ?? !1), B = n(() => L?.appContext.components.RouterLink ?? null), V = (e) => e.to && B.value ? B.value : "button", H = (e) => !!e.to && B.value !== null, U = (e) => {
45
+ if (H(e)) return j.modelValue === void 0 ? e.exact ?? j.exact ? "" : "is-selected" : "";
46
+ }, W = (e) => {
47
+ if (H(e)) return j.modelValue === void 0 ? "is-selected" : "";
48
+ }, G = () => {
49
+ let e = j.items.findIndex((e) => e.value === R.value && !e.disabled);
50
+ return e >= 0 ? e : j.items.findIndex((e) => !e.disabled);
51
+ }, K = h(G()), q = n(() => [
44
52
  "t-nav-menu",
45
- `t-nav-menu--${N.size}`,
53
+ `t-nav-menu--${j.size}`,
46
54
  {
47
- "is-collapsed": V.value,
48
- "is-disabled": N.disabled
55
+ "is-collapsed": z.value,
56
+ "is-disabled": j.disabled
49
57
  },
50
- F.class
51
- ]), q = n(() => F.style), J = n(() => {
52
- let { class: e, style: t, ...n } = F;
58
+ N.class
59
+ ]), J = n(() => N.style), Y = n(() => {
60
+ let { class: e, style: t, ...n } = N;
53
61
  return n;
54
- }), Y = (e) => B.value === e, X = (e, t) => {
62
+ }), X = (e) => R.value === e, Z = (e, t) => {
55
63
  let n = e instanceof HTMLElement ? e : e && "$el" in e && e.$el instanceof HTMLElement ? e.$el : null;
56
- n ? R.value.set(t, n) : R.value.delete(t);
57
- }, Z = (e) => {
58
- let t = N.items[e];
59
- t && (G.value = e, f(() => R.value.get(t.value)?.focus()));
64
+ n ? I.value.set(t, n) : I.value.delete(t);
60
65
  }, Q = (e) => {
61
- N.disabled || e.disabled || (N.modelValue === void 0 && (L.value = e.value), P("update:modelValue", e.value), P("select", e.value, e));
62
- }, $ = (e, t) => {
63
- if (!N.disabled) {
66
+ let t = j.items[e];
67
+ t && (K.value = e, f(() => I.value.get(t.value)?.focus()));
68
+ }, $ = (e) => {
69
+ j.disabled || e.disabled || (j.modelValue === void 0 && (F.value = e.value), M("update:modelValue", e.value), M("select", e.value, e));
70
+ }, ne = (e, t) => {
71
+ if (!j.disabled) {
64
72
  if (e.key === "Home") {
65
73
  e.preventDefault();
66
- let t = N.items.findIndex((e) => !e.disabled);
67
- t >= 0 && Z(t);
74
+ let t = j.items.findIndex((e) => !e.disabled);
75
+ t >= 0 && Q(t);
68
76
  return;
69
77
  }
70
78
  if (e.key === "End") {
71
79
  e.preventDefault();
72
- let t = [...N.items].reverse().findIndex((e) => !e.disabled);
73
- t >= 0 && Z(N.items.length - 1 - t);
80
+ let t = [...j.items].reverse().findIndex((e) => !e.disabled);
81
+ t >= 0 && Q(j.items.length - 1 - t);
74
82
  return;
75
83
  }
76
84
  if (e.key === "ArrowDown" || e.key === "ArrowRight") {
77
85
  e.preventDefault();
78
- let n = C(t, N.items, 1);
79
- n >= 0 && Z(n);
86
+ let n = C(t, j.items, 1);
87
+ n >= 0 && Q(n);
80
88
  return;
81
89
  }
82
90
  if (e.key === "ArrowUp" || e.key === "ArrowLeft") {
83
91
  e.preventDefault();
84
- let n = C(t, N.items, -1);
85
- n >= 0 && Z(n);
92
+ let n = C(t, j.items, -1);
93
+ n >= 0 && Q(n);
86
94
  return;
87
95
  }
88
- w(e) && (e.preventDefault(), Q(N.items[t]));
96
+ w(e) && (e.preventDefault(), $(j.items[t]));
89
97
  }
90
- }, ee = (e) => G.value === e ? 0 : -1;
91
- return x(() => [N.items, N.modelValue], () => {
92
- let e = W();
93
- G.value = e >= 0 ? e : -1;
94
- }, { deep: !0 }), (e, n) => (m(), a("nav", d(J.value, {
95
- class: K.value,
96
- style: q.value
98
+ }, re = (e) => K.value === e ? 0 : -1;
99
+ return x(() => [j.items, j.modelValue], () => {
100
+ let e = G();
101
+ K.value = e >= 0 ? e : -1;
102
+ }, { deep: !0 }), (e, n) => (m(), a("nav", d(Y.value, {
103
+ class: q.value,
104
+ style: J.value
97
105
  }), [c.items.length > 0 ? (m(), a("ul", T, [(m(!0), a(t, null, g(c.items, (t, n) => (m(), a("li", {
98
106
  key: t.value,
99
107
  class: "t-nav-menu__entry"
100
- }, [(m(), r(v(U(t)), {
108
+ }, [(m(), r(v(V(t)), {
101
109
  ref_for: !0,
102
- ref: (e) => X(e, t.value),
110
+ ref: (e) => Z(e, t.value),
103
111
  type: t.to ? void 0 : "button",
104
112
  to: t.to || void 0,
105
113
  class: p(["t-nav-menu__item", {
106
- "is-selected": Y(t.value),
114
+ "is-selected": X(t.value),
107
115
  "is-disabled": c.disabled || t.disabled
108
116
  }]),
117
+ "active-class": U(t),
118
+ "exact-active-class": W(t),
109
119
  disabled: !t.to && (c.disabled || t.disabled) || void 0,
110
120
  "aria-disabled": t.to && (c.disabled || t.disabled) || void 0,
111
- "aria-current": Y(t.value) ? "page" : void 0,
112
- tabindex: c.disabled || t.disabled ? -1 : ee(n),
113
- title: V.value ? t.label : void 0,
114
- onClick: (e) => Q(t),
115
- onKeydown: (e) => $(e, n),
116
- onFocus: (e) => G.value = n
121
+ "aria-current": X(t.value) ? "page" : void 0,
122
+ tabindex: c.disabled || t.disabled ? -1 : re(n),
123
+ title: z.value ? t.label : void 0,
124
+ onClick: (e) => $(t),
125
+ onKeydown: (e) => ne(e, n),
126
+ onFocus: (e) => K.value = n
117
127
  }, {
118
128
  default: S(() => [_(e.$slots, "item", {
119
129
  item: t,
120
- selected: Y(t.value),
121
- focused: G.value === n,
122
- collapsed: V.value
130
+ selected: X(t.value),
131
+ focused: K.value === n,
132
+ collapsed: z.value
123
133
  }, () => [
124
134
  t.icon ? (m(), r(v(t.icon), {
125
135
  key: 0,
126
136
  class: "t-nav-menu__icon",
127
137
  "aria-hidden": "true"
128
138
  })) : (m(), a("span", E, y((t.shortLabel ?? t.label.charAt(0)).toUpperCase()), 1)),
129
- o("span", D, [o("span", O, y(t.label), 1), t.description ? (m(), a("span", k, y(t.description), 1)) : i("", !0)]),
130
- t.badge !== void 0 && t.badge !== null ? (m(), a("span", A, y(t.badge), 1)) : i("", !0)
139
+ o("span", D, [o("span", ee, y(t.label), 1), t.description ? (m(), a("span", te, y(t.description), 1)) : i("", !0)]),
140
+ t.badge !== void 0 && t.badge !== null ? (m(), a("span", O, y(t.badge), 1)) : i("", !0)
131
141
  ])]),
132
142
  _: 2
133
143
  }, 1064, [
134
144
  "type",
135
145
  "to",
136
146
  "class",
147
+ "active-class",
148
+ "exact-active-class",
137
149
  "disabled",
138
150
  "aria-disabled",
139
151
  "aria-current",
@@ -142,10 +154,10 @@ var T = {
142
154
  "onClick",
143
155
  "onKeydown",
144
156
  "onFocus"
145
- ]))]))), 128))])) : (m(), a("div", j, [_(e.$slots, "empty", {}, () => [n[0] ||= s(" No navigation items. ", -1)])]))], 16));
157
+ ]))]))), 128))])) : (m(), a("div", k, [_(e.$slots, "empty", {}, () => [n[0] ||= s(" No navigation items. ", -1)])]))], 16));
146
158
  }
147
159
  });
148
160
  //#endregion
149
- export { M as default };
161
+ export { A as default };
150
162
 
151
163
  //# sourceMappingURL=TNavMenu.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TNavMenu.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { getNextEnabledIndex, isActivationKey } from '@treeui/utils';\nimport { computed, getCurrentInstance, inject, nextTick, ref, useAttrs, watch, type Component, type ComponentPublicInstance } from 'vue';\nimport type { TSize } from '../types/contracts';\nimport { treeSidebarInjectionKey } from './sidebar';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nexport interface TNavMenuItem {\n label: string;\n value: string;\n shortLabel?: string;\n description?: string;\n icon?: Component;\n to?: string | Record<string, unknown>;\n badge?: string | number;\n disabled?: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n defaultValue?: string;\n items?: TNavMenuItem[];\n size?: TSize;\n collapsed?: boolean;\n disabled?: boolean;\n }>(),\n {\n modelValue: undefined,\n defaultValue: '',\n items: () => [],\n size: 'md',\n collapsed: undefined,\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n select: [value: string, item: TNavMenuItem];\n}>();\n\ndefineSlots<{\n item?: (props: {\n item: TNavMenuItem;\n selected: boolean;\n focused: boolean;\n collapsed: boolean;\n }) => unknown;\n empty?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst sidebar = inject(treeSidebarInjectionKey, null);\nconst internalValue = ref(props.defaultValue);\nconst itemRefs = ref<Map<string, HTMLElement>>(new Map());\nconst instance = getCurrentInstance();\n\nconst selectedValue = computed(() => props.modelValue ?? internalValue.value);\nconst resolvedCollapsed = computed(() => props.collapsed ?? sidebar?.collapsed.value ?? false);\n\nconst routerLinkComponent = computed<Component | null>(() => (\n (instance?.appContext.components.RouterLink as Component | undefined) ?? null\n));\n\nconst itemTag = (item: TNavMenuItem) => {\n if (item.to && routerLinkComponent.value) {\n return routerLinkComponent.value;\n }\n return 'button';\n};\n\nconst getInitialFocusedIndex = () => {\n const selectedIndex = props.items.findIndex((item) =>\n item.value === selectedValue.value && !item.disabled,\n );\n\n if (selectedIndex >= 0) {\n return selectedIndex;\n }\n\n return props.items.findIndex((item) => !item.disabled);\n};\n\nconst focusedIndex = ref(getInitialFocusedIndex());\n\nconst rootClasses = computed(() => [\n 't-nav-menu',\n `t-nav-menu--${props.size}`,\n {\n 'is-collapsed': resolvedCollapsed.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst isSelected = (value: string) => selectedValue.value === value;\n\nconst setItemRef = (element: Element | ComponentPublicInstance | null, value: string) => {\n const resolvedElement =\n element instanceof HTMLElement\n ? element\n : element && '$el' in element && element.$el instanceof HTMLElement\n ? element.$el\n : null;\n\n if (resolvedElement) {\n itemRefs.value.set(value, resolvedElement);\n } else {\n itemRefs.value.delete(value);\n }\n};\n\nconst focusItem = (index: number) => {\n const item = props.items[index];\n\n if (!item) {\n return;\n }\n\n focusedIndex.value = index;\n nextTick(() => itemRefs.value.get(item.value)?.focus());\n};\n\nconst selectItem = (item: TNavMenuItem) => {\n if (props.disabled || item.disabled) {\n return;\n }\n\n if (props.modelValue === undefined) {\n internalValue.value = item.value;\n }\n\n emit('update:modelValue', item.value);\n emit('select', item.value, item);\n};\n\nconst onItemKeydown = (event: KeyboardEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n const firstIndex = props.items.findIndex((item) => !item.disabled);\n\n if (firstIndex >= 0) {\n focusItem(firstIndex);\n }\n\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n const lastIndex = [...props.items].reverse().findIndex((item) => !item.disabled);\n\n if (lastIndex >= 0) {\n focusItem(props.items.length - 1 - lastIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n event.preventDefault();\n const nextIndex = getNextEnabledIndex(index, props.items, 1);\n\n if (nextIndex >= 0) {\n focusItem(nextIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {\n event.preventDefault();\n const previousIndex = getNextEnabledIndex(index, props.items, -1);\n\n if (previousIndex >= 0) {\n focusItem(previousIndex);\n }\n\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectItem(props.items[index]);\n }\n};\n\nconst getTabIndex = (index: number) => (focusedIndex.value === index ? 0 : -1);\n\nwatch(\n () => [props.items, props.modelValue] as const,\n () => {\n const nextIndex = getInitialFocusedIndex();\n focusedIndex.value = nextIndex >= 0 ? nextIndex : -1;\n },\n { deep: true },\n);\n</script>\n\n<template>\n <nav\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <ul\n v-if=\"items.length > 0\"\n class=\"t-nav-menu__list\"\n >\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.value\"\n class=\"t-nav-menu__entry\"\n >\n <component\n :is=\"itemTag(item)\"\n :ref=\"(element: Element | ComponentPublicInstance | null) => setItemRef(element, item.value)\"\n :type=\"item.to ? undefined : 'button'\"\n :to=\"item.to || undefined\"\n class=\"t-nav-menu__item\"\n :class=\"{\n 'is-selected': isSelected(item.value),\n 'is-disabled': disabled || item.disabled,\n }\"\n :disabled=\"(!item.to && (disabled || item.disabled)) || undefined\"\n :aria-disabled=\"(item.to && (disabled || item.disabled)) || undefined\"\n :aria-current=\"isSelected(item.value) ? 'page' : undefined\"\n :tabindex=\"disabled || item.disabled ? -1 : getTabIndex(index)\"\n :title=\"resolvedCollapsed ? item.label : undefined\"\n @click=\"selectItem(item)\"\n @keydown=\"onItemKeydown($event, index)\"\n @focus=\"focusedIndex = index\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :selected=\"isSelected(item.value)\"\n :focused=\"focusedIndex === index\"\n :collapsed=\"resolvedCollapsed\"\n >\n <component\n :is=\"item.icon\"\n v-if=\"item.icon\"\n class=\"t-nav-menu__icon\"\n aria-hidden=\"true\"\n />\n <span\n v-else\n class=\"t-nav-menu__marker\"\n aria-hidden=\"true\"\n >\n {{ (item.shortLabel ?? item.label.charAt(0)).toUpperCase() }}\n </span>\n\n <span class=\"t-nav-menu__copy\">\n <span class=\"t-nav-menu__label\">{{ item.label }}</span>\n <span\n v-if=\"item.description\"\n class=\"t-nav-menu__description\"\n >\n {{ item.description }}\n </span>\n </span>\n\n <span\n v-if=\"item.badge !== undefined && item.badge !== null\"\n class=\"t-nav-menu__badge\"\n >\n {{ item.badge }}\n </span>\n </slot>\n </component>\n </li>\n </ul>\n\n <div\n v-else\n class=\"t-nav-menu__empty\"\n >\n <slot name=\"empty\">\n No navigation items.\n </slot>\n </div>\n </nav>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TNavMenu.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { getNextEnabledIndex, isActivationKey } from '@treeui/utils';\nimport { computed, getCurrentInstance, inject, nextTick, ref, useAttrs, watch, type Component, type ComponentPublicInstance } from 'vue';\nimport type { TSize } from '../types/contracts';\nimport { treeSidebarInjectionKey } from './sidebar';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nexport interface TNavMenuItem {\n label: string;\n value: string;\n shortLabel?: string;\n description?: string;\n icon?: Component;\n to?: string | Record<string, unknown>;\n badge?: string | number;\n disabled?: boolean;\n /**\n * When the item renders as a router link, controls whether an inclusive\n * (prefix) route match also marks it active. Defaults to the menu-level\n * `exact` prop. Set to `false` for section roots that should stay active on\n * nested routes.\n */\n exact?: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n defaultValue?: string;\n items?: TNavMenuItem[];\n size?: TSize;\n collapsed?: boolean;\n disabled?: boolean;\n exact?: boolean;\n }>(),\n {\n modelValue: undefined,\n defaultValue: '',\n items: () => [],\n size: 'md',\n collapsed: undefined,\n disabled: false,\n exact: true,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n select: [value: string, item: TNavMenuItem];\n}>();\n\ndefineSlots<{\n item?: (props: {\n item: TNavMenuItem;\n selected: boolean;\n focused: boolean;\n collapsed: boolean;\n }) => unknown;\n empty?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst sidebar = inject(treeSidebarInjectionKey, null);\nconst internalValue = ref(props.defaultValue);\nconst itemRefs = ref<Map<string, HTMLElement>>(new Map());\nconst instance = getCurrentInstance();\n\nconst selectedValue = computed(() => props.modelValue ?? internalValue.value);\nconst resolvedCollapsed = computed(() => props.collapsed ?? sidebar?.collapsed.value ?? false);\n\nconst routerLinkComponent = computed<Component | null>(() => (\n (instance?.appContext.components.RouterLink as Component | undefined) ?? null\n));\n\nconst itemTag = (item: TNavMenuItem) => {\n if (item.to && routerLinkComponent.value) {\n return routerLinkComponent.value;\n }\n return 'button';\n};\n\nconst isRouterLinkItem = (item: TNavMenuItem) =>\n Boolean(item.to) && routerLinkComponent.value !== null;\n\n// Keep the active highlight deterministic when items render as router links.\n// Vue Router's default `router-link-active` uses inclusive (prefix) matching,\n// so several links can appear active at once. We map the router's active\n// classes onto TreeUI's own `is-selected`:\n// - Controlled menus (explicit `modelValue`) own selection, so the router adds\n// no class of its own — only the bound `is-selected` shows.\n// - Uncontrolled menus let the current route drive selection, using exact\n// matching by default (opt out per item, or menu-wide, via `exact`).\nconst routerActiveClass = (item: TNavMenuItem) => {\n if (!isRouterLinkItem(item)) {\n return undefined;\n }\n\n if (props.modelValue !== undefined) {\n return '';\n }\n\n return (item.exact ?? props.exact) ? '' : 'is-selected';\n};\n\nconst routerExactActiveClass = (item: TNavMenuItem) => {\n if (!isRouterLinkItem(item)) {\n return undefined;\n }\n\n return props.modelValue !== undefined ? '' : 'is-selected';\n};\n\nconst getInitialFocusedIndex = () => {\n const selectedIndex = props.items.findIndex((item) =>\n item.value === selectedValue.value && !item.disabled,\n );\n\n if (selectedIndex >= 0) {\n return selectedIndex;\n }\n\n return props.items.findIndex((item) => !item.disabled);\n};\n\nconst focusedIndex = ref(getInitialFocusedIndex());\n\nconst rootClasses = computed(() => [\n 't-nav-menu',\n `t-nav-menu--${props.size}`,\n {\n 'is-collapsed': resolvedCollapsed.value,\n 'is-disabled': props.disabled,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst isSelected = (value: string) => selectedValue.value === value;\n\nconst setItemRef = (element: Element | ComponentPublicInstance | null, value: string) => {\n const resolvedElement =\n element instanceof HTMLElement\n ? element\n : element && '$el' in element && element.$el instanceof HTMLElement\n ? element.$el\n : null;\n\n if (resolvedElement) {\n itemRefs.value.set(value, resolvedElement);\n } else {\n itemRefs.value.delete(value);\n }\n};\n\nconst focusItem = (index: number) => {\n const item = props.items[index];\n\n if (!item) {\n return;\n }\n\n focusedIndex.value = index;\n nextTick(() => itemRefs.value.get(item.value)?.focus());\n};\n\nconst selectItem = (item: TNavMenuItem) => {\n if (props.disabled || item.disabled) {\n return;\n }\n\n if (props.modelValue === undefined) {\n internalValue.value = item.value;\n }\n\n emit('update:modelValue', item.value);\n emit('select', item.value, item);\n};\n\nconst onItemKeydown = (event: KeyboardEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n const firstIndex = props.items.findIndex((item) => !item.disabled);\n\n if (firstIndex >= 0) {\n focusItem(firstIndex);\n }\n\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n const lastIndex = [...props.items].reverse().findIndex((item) => !item.disabled);\n\n if (lastIndex >= 0) {\n focusItem(props.items.length - 1 - lastIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n event.preventDefault();\n const nextIndex = getNextEnabledIndex(index, props.items, 1);\n\n if (nextIndex >= 0) {\n focusItem(nextIndex);\n }\n\n return;\n }\n\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {\n event.preventDefault();\n const previousIndex = getNextEnabledIndex(index, props.items, -1);\n\n if (previousIndex >= 0) {\n focusItem(previousIndex);\n }\n\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectItem(props.items[index]);\n }\n};\n\nconst getTabIndex = (index: number) => (focusedIndex.value === index ? 0 : -1);\n\nwatch(\n () => [props.items, props.modelValue] as const,\n () => {\n const nextIndex = getInitialFocusedIndex();\n focusedIndex.value = nextIndex >= 0 ? nextIndex : -1;\n },\n { deep: true },\n);\n</script>\n\n<template>\n <nav\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <ul\n v-if=\"items.length > 0\"\n class=\"t-nav-menu__list\"\n >\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.value\"\n class=\"t-nav-menu__entry\"\n >\n <component\n :is=\"itemTag(item)\"\n :ref=\"(element: Element | ComponentPublicInstance | null) => setItemRef(element, item.value)\"\n :type=\"item.to ? undefined : 'button'\"\n :to=\"item.to || undefined\"\n class=\"t-nav-menu__item\"\n :class=\"{\n 'is-selected': isSelected(item.value),\n 'is-disabled': disabled || item.disabled,\n }\"\n :active-class=\"routerActiveClass(item)\"\n :exact-active-class=\"routerExactActiveClass(item)\"\n :disabled=\"(!item.to && (disabled || item.disabled)) || undefined\"\n :aria-disabled=\"(item.to && (disabled || item.disabled)) || undefined\"\n :aria-current=\"isSelected(item.value) ? 'page' : undefined\"\n :tabindex=\"disabled || item.disabled ? -1 : getTabIndex(index)\"\n :title=\"resolvedCollapsed ? item.label : undefined\"\n @click=\"selectItem(item)\"\n @keydown=\"onItemKeydown($event, index)\"\n @focus=\"focusedIndex = index\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :selected=\"isSelected(item.value)\"\n :focused=\"focusedIndex === index\"\n :collapsed=\"resolvedCollapsed\"\n >\n <component\n :is=\"item.icon\"\n v-if=\"item.icon\"\n class=\"t-nav-menu__icon\"\n aria-hidden=\"true\"\n />\n <span\n v-else\n class=\"t-nav-menu__marker\"\n aria-hidden=\"true\"\n >\n {{ (item.shortLabel ?? item.label.charAt(0)).toUpperCase() }}\n </span>\n\n <span class=\"t-nav-menu__copy\">\n <span class=\"t-nav-menu__label\">{{ item.label }}</span>\n <span\n v-if=\"item.description\"\n class=\"t-nav-menu__description\"\n >\n {{ item.description }}\n </span>\n </span>\n\n <span\n v-if=\"item.badge !== undefined && item.badge !== null\"\n class=\"t-nav-menu__badge\"\n >\n {{ item.badge }}\n </span>\n </slot>\n </component>\n </li>\n </ul>\n\n <div\n v-else\n class=\"t-nav-menu__empty\"\n >\n <slot name=\"empty\">\n No navigation items.\n </slot>\n </div>\n </nav>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=require("./TPage.vue_vue_type_script_setup_true_lang.cjs").default;exports.default=e;
2
+ //# sourceMappingURL=TPage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPage.cjs","names":[],"sources":["../../src/components/TPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\nimport TContainer, { type TContainerSize } from './TContainer.vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treePageGaps = ['sm', 'md', 'lg'] as const;\n\nexport type TPageGap = (typeof _treePageGaps)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n /** Max-width of the centered content column. Mirrors `TContainer`'s sizes. */\n width?: TContainerSize;\n /** Block + inline padding around the content column. */\n padded?: boolean;\n /** Vertical rhythm between direct children (e.g. header, sections). */\n gap?: TPageGap;\n }>(),\n {\n as: 'div',\n width: 'lg',\n padded: true,\n gap: 'lg',\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-page',\n {\n 'is-padded': props.padded,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst innerClasses = computed(() => ['t-page__inner', `t-page__inner--gap-${props.gap}`]);\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <TContainer\n :size=\"width\"\n :padded=\"padded\"\n centered\n :class=\"innerClasses\"\n >\n <slot />\n </TContainer>\n </component>\n</template>\n"],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import e from "./TPage.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/TPage.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=TPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPage.js","names":[],"sources":["../../src/components/TPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\nimport TContainer, { type TContainerSize } from './TContainer.vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treePageGaps = ['sm', 'md', 'lg'] as const;\n\nexport type TPageGap = (typeof _treePageGaps)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n /** Max-width of the centered content column. Mirrors `TContainer`'s sizes. */\n width?: TContainerSize;\n /** Block + inline padding around the content column. */\n padded?: boolean;\n /** Vertical rhythm between direct children (e.g. header, sections). */\n gap?: TPageGap;\n }>(),\n {\n as: 'div',\n width: 'lg',\n padded: true,\n gap: 'lg',\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-page',\n {\n 'is-padded': props.padded,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst innerClasses = computed(() => ['t-page__inner', `t-page__inner--gap-${props.gap}`]);\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <TContainer\n :size=\"width\"\n :padded=\"padded\"\n centered\n :class=\"innerClasses\"\n >\n <slot />\n </TContainer>\n </component>\n</template>\n"],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { TContainerSize } from './TContainer.vue';
2
+ declare const _treePageGaps: readonly ["sm", "md", "lg"];
3
+ export type TPageGap = (typeof _treePageGaps)[number];
4
+ type __VLS_Props = {
5
+ as?: string;
6
+ /** Max-width of the centered content column. Mirrors `TContainer`'s sizes. */
7
+ width?: TContainerSize;
8
+ /** Block + inline padding around the content column. */
9
+ padded?: boolean;
10
+ /** Vertical rhythm between direct children (e.g. header, sections). */
11
+ gap?: TPageGap;
12
+ };
13
+ declare function __VLS_template(): {
14
+ attrs: Partial<{}>;
15
+ slots: {
16
+ default?(_: {}): any;
17
+ };
18
+ refs: {};
19
+ rootEl: any;
20
+ };
21
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
22
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
23
+ width: TContainerSize;
24
+ gap: TPageGap;
25
+ as: string;
26
+ padded: boolean;
27
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
28
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
29
+ export default _default;
30
+ type __VLS_WithTemplateSlots<T, S> = T & {
31
+ new (): {
32
+ $slots: S;
33
+ };
34
+ };
35
+ //# sourceMappingURL=TPage.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPage.vue.d.ts","sourceRoot":"","sources":["../../src/components/TPage.vue"],"names":[],"mappings":"AAsEA,OAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMnE,QAAA,MAAM,aAAa,6BAA8B,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,GAAG,CAAC,EAAE,QAAQ,CAAC;CAChB,CAAC;AAsCJ,iBAAS,cAAc;WAmDT,OAAO,IAA6B;;yBAVpB,GAAG;;;;EAehC;AAcD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;WAlHT,cAAc;SAIhB,QAAQ;QANT,MAAM;YAIF,OAAO;6EAuHlB,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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./TContainer.cjs");let t=require("vue");var n=(0,t.defineComponent)({inheritAttrs:!1,__name:`TPage`,props:{as:{default:`div`},width:{default:`lg`},padded:{type:Boolean,default:!0},gap:{default:`lg`}},setup(n){let r=n,i=(0,t.useAttrs)(),a=(0,t.computed)(()=>[`t-page`,{"is-padded":r.padded},i.class]),o=(0,t.computed)(()=>i.style),s=(0,t.computed)(()=>{let{class:e,style:t,...n}=i;return n}),c=(0,t.computed)(()=>[`t-page__inner`,`t-page__inner--gap-${r.gap}`]);return(r,i)=>((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)(n.as),(0,t.mergeProps)(s.value,{class:a.value,style:o.value}),{default:(0,t.withCtx)(()=>[(0,t.createVNode)(e.default,{size:n.width,padded:n.padded,centered:``,class:(0,t.normalizeClass)(c.value)},{default:(0,t.withCtx)(()=>[(0,t.renderSlot)(r.$slots,`default`)]),_:3},8,[`size`,`padded`,`class`])]),_:3},16,[`class`,`style`]))}});exports.default=n;
2
+ //# sourceMappingURL=TPage.vue_vue_type_script_setup_true_lang.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPage.vue_vue_type_script_setup_true_lang.cjs","names":[],"sources":["../../src/components/TPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\nimport TContainer, { type TContainerSize } from './TContainer.vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treePageGaps = ['sm', 'md', 'lg'] as const;\n\nexport type TPageGap = (typeof _treePageGaps)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n /** Max-width of the centered content column. Mirrors `TContainer`'s sizes. */\n width?: TContainerSize;\n /** Block + inline padding around the content column. */\n padded?: boolean;\n /** Vertical rhythm between direct children (e.g. header, sections). */\n gap?: TPageGap;\n }>(),\n {\n as: 'div',\n width: 'lg',\n padded: true,\n gap: 'lg',\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-page',\n {\n 'is-padded': props.padded,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst innerClasses = computed(() => ['t-page__inner', `t-page__inner--gap-${props.gap}`]);\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <TContainer\n :size=\"width\"\n :padded=\"padded\"\n centered\n :class=\"innerClasses\"\n >\n <slot />\n </TContainer>\n </component>\n</template>\n"],"mappings":"kOAYA,IAAM,EAAQ,EAkBR,GAAA,EAAA,EAAA,SAAA,CAAiB,EAEjB,GAAA,EAAA,EAAA,SAAA,KAA6B,CACjC,SACA,CACE,YAAa,EAAM,MACrB,EACA,EAAM,KACR,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA2B,EAAM,KAAK,EAEtC,GAAA,EAAA,EAAA,SAAA,KAA2B,CAC/B,GAAM,CAAE,MAAO,EAAQ,MAAO,EAAQ,GAAG,GAAS,EAClD,OAAO,CACT,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA8B,CAAC,gBAAiB,sBAAsB,EAAM,KAAK,CAAC,kFAK/E,EAAA,EAAE,GAAA,EAAA,EAAA,WAAA,CACC,EAYE,MAZO,CAChB,MAAO,EAAA,MACP,MAAO,EAAA,mCASK,EAAA,EAAA,EAAA,YAAA,CAAA,EAAA,QAAA,CANV,KAAM,EAAA,MACN,OAAQ,EAAA,OACT,SAAA,GACC,OAAA,EAAA,EAAA,eAAA,CAAO,EAAA,KAAY,8BAEZ,EAAA,EAAA,EAAA,WAAA,CAAA,EAAA,OAAA,SAAA,CAAA,CAAA"}
@@ -0,0 +1,49 @@
1
+ import e from "./TContainer.js";
2
+ import { computed as t, createBlock as n, createVNode as r, defineComponent as i, mergeProps as a, normalizeClass as o, openBlock as s, renderSlot as c, resolveDynamicComponent as l, useAttrs as u, withCtx as d } from "vue";
3
+ //#region src/components/TPage.vue?vue&type=script&setup=true&lang.ts
4
+ var f = /*@__PURE__*/ i({
5
+ inheritAttrs: !1,
6
+ __name: "TPage",
7
+ props: {
8
+ as: { default: "div" },
9
+ width: { default: "lg" },
10
+ padded: {
11
+ type: Boolean,
12
+ default: !0
13
+ },
14
+ gap: { default: "lg" }
15
+ },
16
+ setup(i) {
17
+ let f = i, p = u(), m = t(() => [
18
+ "t-page",
19
+ { "is-padded": f.padded },
20
+ p.class
21
+ ]), h = t(() => p.style), g = t(() => {
22
+ let { class: e, style: t, ...n } = p;
23
+ return n;
24
+ }), _ = t(() => ["t-page__inner", `t-page__inner--gap-${f.gap}`]);
25
+ return (t, u) => (s(), n(l(i.as), a(g.value, {
26
+ class: m.value,
27
+ style: h.value
28
+ }), {
29
+ default: d(() => [r(e, {
30
+ size: i.width,
31
+ padded: i.padded,
32
+ centered: "",
33
+ class: o(_.value)
34
+ }, {
35
+ default: d(() => [c(t.$slots, "default")]),
36
+ _: 3
37
+ }, 8, [
38
+ "size",
39
+ "padded",
40
+ "class"
41
+ ])]),
42
+ _: 3
43
+ }, 16, ["class", "style"]));
44
+ }
45
+ });
46
+ //#endregion
47
+ export { f as default };
48
+
49
+ //# sourceMappingURL=TPage.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPage.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/TPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue';\nimport TContainer, { type TContainerSize } from './TContainer.vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst _treePageGaps = ['sm', 'md', 'lg'] as const;\n\nexport type TPageGap = (typeof _treePageGaps)[number];\n\nconst props = withDefaults(\n defineProps<{\n as?: string;\n /** Max-width of the centered content column. Mirrors `TContainer`'s sizes. */\n width?: TContainerSize;\n /** Block + inline padding around the content column. */\n padded?: boolean;\n /** Vertical rhythm between direct children (e.g. header, sections). */\n gap?: TPageGap;\n }>(),\n {\n as: 'div',\n width: 'lg',\n padded: true,\n gap: 'lg',\n },\n);\n\nconst attrs = useAttrs();\n\nconst rootClasses = computed(() => [\n 't-page',\n {\n 'is-padded': props.padded,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst innerClasses = computed(() => ['t-page__inner', `t-page__inner--gap-${props.gap}`]);\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <TContainer\n :size=\"width\"\n :padded=\"padded\"\n centered\n :class=\"innerClasses\"\n >\n <slot />\n </TContainer>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAYA,IAAM,IAAQ,GAkBR,IAAQ,EAAS,GAEjB,IAAc,QAAe;GACjC;GACA,EACE,aAAa,EAAM,OACrB;GACA,EAAM;EACR,CAAC,GAEK,IAAY,QAAe,EAAM,KAAK,GAEtC,IAAY,QAAe;GAC/B,IAAM,EAAE,OAAO,GAAQ,OAAO,GAAQ,GAAG,MAAS;GAClD,OAAO;EACT,CAAC,GAEK,IAAe,QAAe,CAAC,iBAAiB,sBAAsB,EAAM,KAAK,CAAC;yBAItF,EAcY,EAbL,EAAA,EAAE,GADT,EAEU,EAYE,OAZO;GAChB,OAAO,EAAA;GACP,OAAO,EAAA;;oBASK,CAPb,EAOa,GAAA;IANV,MAAM,EAAA;IACN,QAAQ,EAAA;IACT,UAAA;IACC,OAAK,EAAE,EAAA,KAAY;;qBAEZ,CAAR,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ var e=require("./TPageHeader.vue_vue_type_script_setup_true_lang.cjs").default;exports.default=e;
2
+ //# sourceMappingURL=TPageHeader.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPageHeader.cjs","names":[],"sources":["../../src/components/TPageHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs, useSlots } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n subtitle?: string;\n /** Heading level for the title element. Defaults to the page-level `1`. */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n as?: string;\n }>(),\n {\n title: '',\n subtitle: '',\n level: 1,\n as: 'header',\n },\n);\n\ndefineSlots<{\n breadcrumb?: () => unknown;\n title?: () => unknown;\n subtitle?: () => unknown;\n actions?: () => unknown;\n default?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\n\nconst rootClasses = computed(() => ['t-page-header', attrs.class]);\nconst rootStyle = computed(() => attrs.style);\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst titleTag = computed(() => `h${props.level}`);\nconst hasTitle = computed(() => Boolean(slots.title || props.title));\nconst hasSubtitle = computed(() => Boolean(slots.subtitle || props.subtitle));\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <div\n v-if=\"$slots.breadcrumb\"\n class=\"t-page-header__breadcrumb\"\n >\n <slot name=\"breadcrumb\" />\n </div>\n\n <div class=\"t-page-header__bar\">\n <div\n v-if=\"hasTitle || hasSubtitle\"\n class=\"t-page-header__heading\"\n >\n <component\n :is=\"titleTag\"\n v-if=\"hasTitle\"\n class=\"t-page-header__title\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </component>\n\n <p\n v-if=\"hasSubtitle\"\n class=\"t-page-header__subtitle\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </p>\n </div>\n\n <div\n v-if=\"$slots.actions\"\n class=\"t-page-header__actions\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.default\"\n class=\"t-page-header__content\"\n >\n <slot />\n </div>\n </component>\n</template>\n"],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import e from "./TPageHeader.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/TPageHeader.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=TPageHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPageHeader.js","names":[],"sources":["../../src/components/TPageHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs, useSlots } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n subtitle?: string;\n /** Heading level for the title element. Defaults to the page-level `1`. */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n as?: string;\n }>(),\n {\n title: '',\n subtitle: '',\n level: 1,\n as: 'header',\n },\n);\n\ndefineSlots<{\n breadcrumb?: () => unknown;\n title?: () => unknown;\n subtitle?: () => unknown;\n actions?: () => unknown;\n default?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\n\nconst rootClasses = computed(() => ['t-page-header', attrs.class]);\nconst rootStyle = computed(() => attrs.style);\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst titleTag = computed(() => `h${props.level}`);\nconst hasTitle = computed(() => Boolean(slots.title || props.title));\nconst hasSubtitle = computed(() => Boolean(slots.subtitle || props.subtitle));\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <div\n v-if=\"$slots.breadcrumb\"\n class=\"t-page-header__breadcrumb\"\n >\n <slot name=\"breadcrumb\" />\n </div>\n\n <div class=\"t-page-header__bar\">\n <div\n v-if=\"hasTitle || hasSubtitle\"\n class=\"t-page-header__heading\"\n >\n <component\n :is=\"titleTag\"\n v-if=\"hasTitle\"\n class=\"t-page-header__title\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </component>\n\n <p\n v-if=\"hasSubtitle\"\n class=\"t-page-header__subtitle\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </p>\n </div>\n\n <div\n v-if=\"$slots.actions\"\n class=\"t-page-header__actions\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.default\"\n class=\"t-page-header__content\"\n >\n <slot />\n </div>\n </component>\n</template>\n"],"mappings":""}
@@ -0,0 +1,40 @@
1
+ type __VLS_Props = {
2
+ title?: string;
3
+ subtitle?: string;
4
+ /** Heading level for the title element. Defaults to the page-level `1`. */
5
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
6
+ as?: string;
7
+ };
8
+ declare function __VLS_template(): {
9
+ attrs: Partial<{}>;
10
+ slots: Readonly<{
11
+ breadcrumb?: () => unknown;
12
+ title?: () => unknown;
13
+ subtitle?: () => unknown;
14
+ actions?: () => unknown;
15
+ default?: () => unknown;
16
+ }> & {
17
+ breadcrumb?: () => unknown;
18
+ title?: () => unknown;
19
+ subtitle?: () => unknown;
20
+ actions?: () => unknown;
21
+ default?: () => unknown;
22
+ };
23
+ refs: {};
24
+ rootEl: any;
25
+ };
26
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
27
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
28
+ title: string;
29
+ as: string;
30
+ level: 1 | 2 | 3 | 4 | 5 | 6;
31
+ subtitle: string;
32
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
33
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
34
+ export default _default;
35
+ type __VLS_WithTemplateSlots<T, S> = T & {
36
+ new (): {
37
+ $slots: S;
38
+ };
39
+ };
40
+ //# sourceMappingURL=TPageHeader.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPageHeader.vue.d.ts","sourceRoot":"","sources":["../../src/components/TPageHeader.vue"],"names":[],"mappings":"AA6GA,KAAK,WAAW,GAAG;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAyCJ,iBAAS,cAAc;WAoFT,OAAO,IAA6B;;qBAjHnC,MAAM,OAAO;gBAClB,MAAM,OAAO;mBACV,MAAM,OAAO;kBACd,MAAM,OAAO;kBACb,MAAM,OAAO;;qBAJV,MAAM,OAAO;gBAClB,MAAM,OAAO;mBACV,MAAM,OAAO;kBACd,MAAM,OAAO;kBACb,MAAM,OAAO;;;;EAkHxB;AAeD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;WAvJT,MAAM;QAIT,MAAM;WADH,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;cAFlB,MAAM;6EA6JnB,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"}
@@ -0,0 +1,2 @@
1
+ let e=require("vue");var t={key:0,class:`t-page-header__breadcrumb`},n={class:`t-page-header__bar`},r={key:0,class:`t-page-header__heading`},i={key:1,class:`t-page-header__subtitle`},a={key:1,class:`t-page-header__actions`},o={key:1,class:`t-page-header__content`},s=(0,e.defineComponent)({inheritAttrs:!1,__name:`TPageHeader`,props:{title:{default:``},subtitle:{default:``},level:{default:1},as:{default:`header`}},setup(s){let c=s,l=(0,e.useAttrs)(),u=(0,e.useSlots)(),d=(0,e.computed)(()=>[`t-page-header`,l.class]),f=(0,e.computed)(()=>l.style),p=(0,e.computed)(()=>{let{class:e,style:t,...n}=l;return n}),m=(0,e.computed)(()=>`h${c.level}`),h=(0,e.computed)(()=>!!(u.title||c.title)),g=(0,e.computed)(()=>!!(u.subtitle||c.subtitle));return(c,l)=>((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(s.as),(0,e.mergeProps)(p.value,{class:d.value,style:f.value}),{default:(0,e.withCtx)(()=>[c.$slots.breadcrumb?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,t,[(0,e.renderSlot)(c.$slots,`breadcrumb`)])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,n,[h.value||g.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,r,[h.value?((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(m.value),{key:0,class:`t-page-header__title`},{default:(0,e.withCtx)(()=>[(0,e.renderSlot)(c.$slots,`title`,{},()=>[(0,e.createTextVNode)((0,e.toDisplayString)(s.title),1)])]),_:3})):(0,e.createCommentVNode)(``,!0),g.value?((0,e.openBlock)(),(0,e.createElementBlock)(`p`,i,[(0,e.renderSlot)(c.$slots,`subtitle`,{},()=>[(0,e.createTextVNode)((0,e.toDisplayString)(s.subtitle),1)])])):(0,e.createCommentVNode)(``,!0)])):(0,e.createCommentVNode)(``,!0),c.$slots.actions?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,a,[(0,e.renderSlot)(c.$slots,`actions`)])):(0,e.createCommentVNode)(``,!0)]),c.$slots.default?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,o,[(0,e.renderSlot)(c.$slots,`default`)])):(0,e.createCommentVNode)(``,!0)]),_:3},16,[`class`,`style`]))}});exports.default=s;
2
+ //# sourceMappingURL=TPageHeader.vue_vue_type_script_setup_true_lang.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TPageHeader.vue_vue_type_script_setup_true_lang.cjs","names":["$slots"],"sources":["../../src/components/TPageHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs, useSlots } from 'vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n subtitle?: string;\n /** Heading level for the title element. Defaults to the page-level `1`. */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n as?: string;\n }>(),\n {\n title: '',\n subtitle: '',\n level: 1,\n as: 'header',\n },\n);\n\ndefineSlots<{\n breadcrumb?: () => unknown;\n title?: () => unknown;\n subtitle?: () => unknown;\n actions?: () => unknown;\n default?: () => unknown;\n}>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\n\nconst rootClasses = computed(() => ['t-page-header', attrs.class]);\nconst rootStyle = computed(() => attrs.style);\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst titleTag = computed(() => `h${props.level}`);\nconst hasTitle = computed(() => Boolean(slots.title || props.title));\nconst hasSubtitle = computed(() => Boolean(slots.subtitle || props.subtitle));\n</script>\n\n<template>\n <component\n :is=\"as\"\n v-bind=\"rootAttrs\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n >\n <div\n v-if=\"$slots.breadcrumb\"\n class=\"t-page-header__breadcrumb\"\n >\n <slot name=\"breadcrumb\" />\n </div>\n\n <div class=\"t-page-header__bar\">\n <div\n v-if=\"hasTitle || hasSubtitle\"\n class=\"t-page-header__heading\"\n >\n <component\n :is=\"titleTag\"\n v-if=\"hasTitle\"\n class=\"t-page-header__title\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </component>\n\n <p\n v-if=\"hasSubtitle\"\n class=\"t-page-header__subtitle\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </p>\n </div>\n\n <div\n v-if=\"$slots.actions\"\n class=\"t-page-header__actions\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.default\"\n class=\"t-page-header__content\"\n >\n <slot />\n </div>\n </component>\n</template>\n"],"mappings":"yaAOA,IAAM,EAAQ,EAwBR,GAAA,EAAA,EAAA,SAAA,CAAiB,EACjB,GAAA,EAAA,EAAA,SAAA,CAAiB,EAEjB,GAAA,EAAA,EAAA,SAAA,KAA6B,CAAC,gBAAiB,EAAM,KAAK,CAAC,EAC3D,GAAA,EAAA,EAAA,SAAA,KAA2B,EAAM,KAAK,EACtC,GAAA,EAAA,EAAA,SAAA,KAA2B,CAC/B,GAAM,CAAE,MAAO,EAAQ,MAAO,EAAQ,GAAG,GAAS,EAClD,OAAO,CACT,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA0B,IAAI,EAAM,OAAO,EAC3C,GAAA,EAAA,EAAA,SAAA,KAA0B,GAAQ,EAAM,OAAS,EAAM,MAAM,EAC7D,GAAA,EAAA,EAAA,SAAA,KAA6B,GAAQ,EAAM,UAAY,EAAM,SAAS,kFAKnE,EAAA,EAAE,GAAA,EAAA,EAAA,WAAA,CACC,EAkDE,MAlDO,CAChB,MAAO,EAAA,MACP,MAAO,EAAA,mCAOF,CAJEA,EAAAA,OAAO,aAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIT,MALN,EAKM,EAAA,EAAA,EAAA,WAAA,CADsB,EAAA,OAAA,YAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,2BAkCtB,MA/BN,EA+BM,CA7BI,EAAA,OAAY,EAAA,QAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAqBd,MAtBN,EAsBM,CAhBI,EAAA,QAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,wBAAA,CADD,EAAA,KAAQ,EAAA,OAEb,MAAM,mDAIC,EAAA,EAAA,EAAA,WAAA,CAAA,EAAA,OAAA,QAAA,CAAA,MAAA,EAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CADF,EAAA,KAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,yCAKJ,EAAA,QAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAMJ,IAPJ,EAOI,EAAA,EAAA,EAAA,WAAA,CADK,EAAA,OAAA,WAAA,CAAA,MAAA,EAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CADF,EAAA,QAAQ,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,EAMTA,EAAAA,OAAO,UAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIT,MALN,EAKM,EAAA,EAAA,EAAA,WAAA,CADmB,EAAA,OAAA,SAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAKnBA,EAAAA,OAAO,UAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAIT,MALN,EAKM,EAAA,EAAA,EAAA,WAAA,CADI,EAAA,OAAA,SAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA"}