@nuxt/ui 4.10.0 → 4.11.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 (97) hide show
  1. package/.nuxt/ui.static.css +11 -11
  2. package/README.md +1 -0
  3. package/cli/commands/make/locale.mjs +40 -11
  4. package/cli/templates.mjs +2 -2
  5. package/dist/module.d.mts +1 -1
  6. package/dist/module.json +2 -2
  7. package/dist/module.mjs +5 -2
  8. package/dist/runtime/components/AuthForm.d.vue.ts +7 -7
  9. package/dist/runtime/components/AuthForm.vue.d.ts +7 -7
  10. package/dist/runtime/components/Button.vue +11 -2
  11. package/dist/runtime/components/ChatPromptSubmit.d.vue.ts +2 -2
  12. package/dist/runtime/components/ChatPromptSubmit.vue.d.ts +2 -2
  13. package/dist/runtime/components/Checkbox.d.vue.ts +1 -1
  14. package/dist/runtime/components/Checkbox.vue +12 -6
  15. package/dist/runtime/components/Checkbox.vue.d.ts +1 -1
  16. package/dist/runtime/components/CheckboxGroup.d.vue.ts +6 -0
  17. package/dist/runtime/components/CheckboxGroup.vue +10 -4
  18. package/dist/runtime/components/CheckboxGroup.vue.d.ts +6 -0
  19. package/dist/runtime/components/Editor.vue +4 -1
  20. package/dist/runtime/components/Error.d.vue.ts +1 -1
  21. package/dist/runtime/components/Error.vue.d.ts +1 -1
  22. package/dist/runtime/components/FileUpload.vue +17 -10
  23. package/dist/runtime/components/Input.vue +12 -7
  24. package/dist/runtime/components/InputDate.vue +12 -8
  25. package/dist/runtime/components/InputMenu.vue +25 -11
  26. package/dist/runtime/components/InputNumber.vue +14 -9
  27. package/dist/runtime/components/InputRating.vue +10 -7
  28. package/dist/runtime/components/InputTags.vue +12 -7
  29. package/dist/runtime/components/InputTime.vue +12 -7
  30. package/dist/runtime/components/Listbox.vue +10 -6
  31. package/dist/runtime/components/Modal.vue +12 -5
  32. package/dist/runtime/components/PinInput.vue +13 -8
  33. package/dist/runtime/components/Popover.vue +0 -1
  34. package/dist/runtime/components/PricingTable.d.vue.ts +1 -1
  35. package/dist/runtime/components/PricingTable.vue.d.ts +1 -1
  36. package/dist/runtime/components/Progress.d.vue.ts +2 -1
  37. package/dist/runtime/components/Progress.vue +5 -6
  38. package/dist/runtime/components/Progress.vue.d.ts +2 -1
  39. package/dist/runtime/components/ProgressGroup.d.vue.ts +91 -0
  40. package/dist/runtime/components/ProgressGroup.vue +99 -0
  41. package/dist/runtime/components/ProgressGroup.vue.d.ts +91 -0
  42. package/dist/runtime/components/RadioGroup.d.vue.ts +7 -1
  43. package/dist/runtime/components/RadioGroup.vue +14 -5
  44. package/dist/runtime/components/RadioGroup.vue.d.ts +7 -1
  45. package/dist/runtime/components/Select.vue +21 -8
  46. package/dist/runtime/components/SelectMenu.vue +26 -12
  47. package/dist/runtime/components/Slider.vue +14 -7
  48. package/dist/runtime/components/Splitter.d.vue.ts +266 -0
  49. package/dist/runtime/components/Splitter.vue +99 -0
  50. package/dist/runtime/components/Splitter.vue.d.ts +266 -0
  51. package/dist/runtime/components/Switch.vue +8 -4
  52. package/dist/runtime/components/Textarea.vue +17 -7
  53. package/dist/runtime/components/Theme.d.vue.ts +1 -1
  54. package/dist/runtime/components/Theme.vue +4 -3
  55. package/dist/runtime/components/Theme.vue.d.ts +1 -1
  56. package/dist/runtime/components/Tree.vue +1 -1
  57. package/dist/runtime/components/content/ContentNavigation.vue +8 -1
  58. package/dist/runtime/components/content/ContentToc.vue +4 -1
  59. package/dist/runtime/composables/useComponentProps.d.ts +1 -1
  60. package/dist/runtime/composables/useComponentProps.js +6 -0
  61. package/dist/runtime/composables/useFormField.d.ts +10 -4
  62. package/dist/runtime/composables/useFormField.js +10 -3
  63. package/dist/runtime/keyframes.css +1 -1
  64. package/dist/runtime/locale/da.js +1 -1
  65. package/dist/runtime/locale/de_at.js +7 -0
  66. package/dist/runtime/locale/de_ch.js +1 -1
  67. package/dist/runtime/locale/eu.js +1 -1
  68. package/dist/runtime/locale/fi.js +1 -1
  69. package/dist/runtime/locale/he.js +1 -1
  70. package/dist/runtime/locale/hi.js +1 -1
  71. package/dist/runtime/locale/index.d.ts +2 -1
  72. package/dist/runtime/locale/index.js +2 -1
  73. package/dist/runtime/locale/is.js +1 -1
  74. package/dist/runtime/locale/lb.js +1 -1
  75. package/dist/runtime/locale/tg.d.ts +3 -0
  76. package/dist/runtime/locale/{tj.js → tg.js} +1 -1
  77. package/dist/runtime/locale/ur.js +1 -1
  78. package/dist/runtime/types/form.d.ts +1 -1
  79. package/dist/runtime/types/html.d.ts +3 -1
  80. package/dist/runtime/types/index.d.ts +2 -0
  81. package/dist/runtime/types/index.js +2 -0
  82. package/dist/runtime/types/theme.d.ts +2 -0
  83. package/dist/runtime/types/tv.d.ts +6 -2
  84. package/dist/runtime/utils/link-keys.d.ts +1 -0
  85. package/dist/runtime/utils/link-keys.js +40 -0
  86. package/dist/runtime/utils/link.d.ts +2 -1
  87. package/dist/runtime/utils/link.js +2 -40
  88. package/dist/runtime/utils/search.js +3 -12
  89. package/dist/runtime/utils/tv.d.ts +1 -1
  90. package/dist/runtime/utils/tv.js +103 -25
  91. package/dist/runtime/vue/components/Icon.vue +5 -2
  92. package/dist/shared/{ui.XkBrgXFP.mjs → ui.DNq7CNkE.mjs} +589 -213
  93. package/dist/unplugin.d.mts +1 -1
  94. package/dist/unplugin.mjs +22 -6
  95. package/dist/vite.mjs +4 -4
  96. package/package.json +51 -50
  97. /package/dist/runtime/locale/{tj.d.ts → de_at.d.ts} +0 -0
@@ -3,7 +3,7 @@ import theme from "#build/ui/textarea";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { useTemplateRef, computed, onMounted, nextTick, watch } from "vue";
6
+ import { useTemplateRef, computed, onMounted, onScopeDispose, nextTick, watch } from "vue";
7
7
  import { Primitive } from "reka-ui";
8
8
  import { useVModel } from "@vueuse/core";
9
9
  import { useAppConfig } from "#imports";
@@ -52,14 +52,18 @@ const slots = defineSlots();
52
52
  const props = useComponentProps("textarea", _props);
53
53
  const modelValue = useVModel(props, "modelValue", emits, { defaultValue: props.defaultValue });
54
54
  const appConfig = useAppConfig();
55
- const { emitFormFocus, emitFormBlur, emitFormInput, emitFormChange, size, color, id, name, highlight, disabled, ariaAttrs } = useFormField(_props, { deferInputValidation: true });
55
+ const { emitFormFocus, emitFormBlur, emitFormInput, emitFormChange, size: formFieldSize, color: formFieldColor, id, name, highlight: formFieldHighlight, disabled: formFieldDisabled, ariaAttrs } = useFormField(_props, { deferInputValidation: true });
56
+ const color = computed(() => formFieldColor.value ?? props.color);
57
+ const highlight = computed(() => formFieldHighlight.value ?? props.highlight);
58
+ const size = computed(() => formFieldSize.value ?? props.size);
59
+ const disabled = computed(() => formFieldDisabled.value ?? props.disabled);
56
60
  const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(props);
57
61
  const ui = computed(() => tv({ extend: theme, ...appConfig.ui?.textarea || {} })({
58
- color: color.value ?? props.color,
62
+ color: color.value,
59
63
  variant: props.variant,
60
- size: size?.value ?? props.size,
64
+ size: size.value,
61
65
  loading: props.loading,
62
- highlight: highlight.value ?? props.highlight,
66
+ highlight: highlight.value,
63
67
  fixed: props.fixed,
64
68
  autoresize: props.autoresize,
65
69
  leading: isLeading.value || !!props.avatar || !!slots.leading,
@@ -129,15 +133,21 @@ function autoResize() {
129
133
  watch(modelValue, () => {
130
134
  nextTick(autoResize);
131
135
  });
136
+ let autofocusTimeoutId;
137
+ let autoresizeTimeoutId;
132
138
  onMounted(() => {
133
- setTimeout(() => {
139
+ autofocusTimeoutId = setTimeout(() => {
134
140
  autoFocus();
135
141
  }, props.autofocusDelay);
136
- setTimeout(async () => {
142
+ autoresizeTimeoutId = setTimeout(async () => {
137
143
  await nextTick();
138
144
  autoResize();
139
145
  }, props.autoresizeDelay);
140
146
  });
147
+ onScopeDispose(() => {
148
+ clearTimeout(autofocusTimeoutId);
149
+ clearTimeout(autoresizeTimeoutId);
150
+ });
141
151
  defineExpose({
142
152
  textareaRef,
143
153
  autoResize
@@ -1,4 +1,4 @@
1
- import { type VNode } from 'vue';
1
+ import type { VNode } from 'vue';
2
2
  import type { ThemeDefaults, ThemeUI } from '../types/theme';
3
3
  export interface ThemeProps {
4
4
  /**
@@ -1,10 +1,11 @@
1
1
  <script>
2
- import { computed } from "vue";
3
- import defu from "defu";
4
- import { injectThemeContext, provideThemeContext } from "../composables/useComponentProps";
2
+
5
3
  </script>
6
4
 
7
5
  <script setup>
6
+ import { computed } from "vue";
7
+ import defu from "defu";
8
+ import { injectThemeContext, provideThemeContext } from "../composables/useComponentProps";
8
9
  const _props = defineProps({
9
10
  props: { type: Object, required: false },
10
11
  ui: { type: null, required: false }
@@ -1,4 +1,4 @@
1
- import { type VNode } from 'vue';
1
+ import type { VNode } from 'vue';
2
2
  import type { ThemeDefaults, ThemeUI } from '../types/theme';
3
3
  export interface ThemeProps {
4
4
  /**
@@ -142,7 +142,7 @@ defineExpose({
142
142
  :disabled="item.disabled || props.disabled"
143
143
  data-slot="link"
144
144
  :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], selected: isSelected, disabled: item.disabled || props.disabled })"
145
- :style="!nested && level > 1 ? { paddingLeft: flattenedPaddingFormula(level) } : void 0"
145
+ :style="!nested && level > 1 ? { paddingInlineStart: flattenedPaddingFormula(level) } : void 0"
146
146
  >
147
147
  <slot
148
148
  :name="item.slot || 'item'"
@@ -106,7 +106,14 @@ const defaultValue = computed(() => {
106
106
  </DefineLinkTemplate>
107
107
 
108
108
  <Primitive :as="props.as" data-slot="root" v-bind="$attrs" :as-child="props.level > 0" :class="ui.root({ class: [props.ui?.root, props.class] })">
109
- <AccordionRoot as="ul" :disabled="disabled" v-bind="rootProps" :default-value="defaultValue" :class="props.level > 0 ? ui.listWithChildren({ class: props.ui?.listWithChildren }) : ui.list({ class: props.ui?.list })">
109
+ <AccordionRoot
110
+ as="ul"
111
+ :disabled="disabled"
112
+ v-bind="rootProps"
113
+ :model-value="disabled ? defaultValue : void 0"
114
+ :default-value="disabled ? void 0 : defaultValue"
115
+ :class="props.level > 0 ? ui.listWithChildren({ class: props.ui?.listWithChildren }) : ui.list({ class: props.ui?.list })"
116
+ >
110
117
  <template v-for="(link, index) in props.navigation" :key="`${index}-${link.path}`">
111
118
  <AccordionItem
112
119
  v-if="link.children?.length"
@@ -76,6 +76,9 @@ const activeIndex = computed(() => {
76
76
  }
77
77
  return flattenLinks(props.links || []).findIndex((link) => activeHeadings.value.includes(link.id));
78
78
  });
79
+ const listStyle = computed(() => ({
80
+ "--list-height": `${flattenLinks(props.links || []).length * linkHeight}rem`
81
+ }));
79
82
  const indicatorStyle = computed(() => {
80
83
  if (!activeHeadings.value?.length) {
81
84
  return;
@@ -219,7 +222,7 @@ onUnmounted(() => {
219
222
  <ReuseTriggerTemplate :open="open" />
220
223
  </p>
221
224
 
222
- <div ref="contentRef" data-slot="content" :class="ui.content({ class: [props.ui?.content, prefix('hidden lg:flex')] })" :style="scrollShadowStyle">
225
+ <div ref="contentRef" data-slot="content" :class="ui.content({ class: [props.ui?.content, prefix('hidden lg:flex')] })" :style="[listStyle, scrollShadowStyle]">
223
226
  <ReuseContentTemplate />
224
227
  </div>
225
228
  </template>
@@ -20,7 +20,7 @@ export { provideThemeContext };
20
20
  * defaults. The component's tv() `defaultVariants` are intentionally left out
21
21
  * of the proxy fallback — they continue to drive `tv()`-internal class
22
22
  * resolution (the original semantics) without leaking into prop reads. The
23
- * `ui` prop is deep-merged (explicit slot classes override theme slot classes)
23
+ * `ui` and `class` props are merged (explicit classes override theme classes)
24
24
  * instead of being replaced.
25
25
  */
26
26
  export declare function useComponentProps<T extends object>(name: string, props: T): T;
@@ -37,6 +37,12 @@ export function useComponentProps(name, props) {
37
37
  if (!raw && !themeUi) return raw;
38
38
  return defu(raw ?? {}, themeUi ?? {});
39
39
  }
40
+ if (prop === "class") {
41
+ const themeClass = themeEntry?.class;
42
+ if (themeClass === void 0) return raw;
43
+ if (raw === void 0) return themeClass;
44
+ return [themeClass, raw];
45
+ }
40
46
  if (vm && propIsDefined(vm.vnode, prop)) return raw;
41
47
  const themeValue = themeEntry?.[prop];
42
48
  if (themeValue !== void 0) return themeValue;
@@ -37,10 +37,16 @@ export declare const formErrorsInjectionKey: InjectionKey<Readonly<Ref<FormError
37
37
  * ```ts
38
38
  * size: size.value ?? props.size,
39
39
  * color: color.value ?? props.color,
40
- * highlight: highlight.value ?? props.highlight
40
+ * highlight: highlight.value ?? props.highlight,
41
+ * disabled: disabled.value ?? props.disabled
41
42
  * ```
42
43
  *
43
- * Final precedence: `explicit > FormField > <UTheme :props> > withDefaults > app.config > tv defaults`.
44
+ * `highlight` and `disabled` are Boolean props, which Vue auto-casts to `false`
45
+ * when unset, so they are normalized back to `undefined` here. Otherwise the
46
+ * `??` above would short-circuit on `false` and the proxy would never be read.
47
+ *
48
+ * Final precedence: `explicit > FormField > <UTheme :props> > app.config > withDefaults > tv defaults`,
49
+ * matching what `useComponentProps` resolves.
44
50
  */
45
51
  export declare function useFormField<T>(props?: Props<T>, opts?: {
46
52
  bind?: boolean;
@@ -50,8 +56,8 @@ export declare function useFormField<T>(props?: Props<T>, opts?: {
50
56
  name: ComputedRef<string | undefined>;
51
57
  size: ComputedRef<"xs" | "sm" | "md" | "lg" | "xl" | NonNullable<GetObjectField<T, "size">> | undefined>;
52
58
  color: ComputedRef<"error" | GetObjectField<T, "color"> | undefined>;
53
- highlight: ComputedRef<boolean | undefined>;
54
- disabled: ComputedRef<boolean | undefined>;
59
+ highlight: ComputedRef<true | undefined>;
60
+ disabled: ComputedRef<true | undefined>;
55
61
  emitFormBlur: () => void;
56
62
  emitFormInput: import("@vueuse/shared").UseDebounceFnReturn<() => void>;
57
63
  emitFormChange: () => void;
@@ -1,4 +1,4 @@
1
- import { inject, computed, provide } from "vue";
1
+ import { inject, computed, provide, getCurrentScope, onScopeDispose } from "vue";
2
2
  import { useDebounceFn } from "@vueuse/core";
3
3
  export const formOptionsInjectionKey = Symbol("nuxt-ui.form-options");
4
4
  export const formBusInjectionKey = Symbol("nuxt-ui.form-events");
@@ -35,8 +35,15 @@ export function useFormField(props, opts) {
35
35
  function emitFormChange() {
36
36
  emitFormEvent("change", formField?.value.name);
37
37
  }
38
+ let disposed = false;
39
+ if (getCurrentScope()) {
40
+ onScopeDispose(() => {
41
+ disposed = true;
42
+ });
43
+ }
38
44
  const emitFormInput = useDebounceFn(
39
45
  () => {
46
+ if (disposed) return;
40
47
  emitFormEvent("input", formField?.value.name, !opts?.deferInputValidation || formField?.value.eagerValidation);
41
48
  },
42
49
  formField?.value.validateOnInputDelay ?? formOptions?.value.validateOnInputDelay ?? 0
@@ -46,8 +53,8 @@ export function useFormField(props, opts) {
46
53
  name: computed(() => props?.name ?? formField?.value.name),
47
54
  size: computed(() => props?.size ?? formField?.value.size),
48
55
  color: computed(() => formField?.value.error ? "error" : props?.color),
49
- highlight: computed(() => formField?.value.error ? true : props?.highlight),
50
- disabled: computed(() => formOptions?.value.disabled || props?.disabled),
56
+ highlight: computed(() => formField?.value.error ? true : props?.highlight || void 0),
57
+ disabled: computed(() => formOptions?.value.disabled || props?.disabled || void 0),
51
58
  emitFormBlur,
52
59
  emitFormInput,
53
60
  emitFormChange,
@@ -1 +1 @@
1
- @keyframes accordion-up{0%{height:var(--reka-accordion-content-height);overflow:hidden}to{height:0;overflow:hidden}}@keyframes accordion-down{0%{height:0;overflow:hidden}to{height:var(--reka-accordion-content-height);overflow:hidden}}@keyframes collapsible-up{0%{height:var(--reka-collapsible-content-height);overflow:hidden}to{height:0;overflow:hidden}}@keyframes collapsible-down{0%{height:0;overflow:hidden}to{height:var(--reka-collapsible-content-height);overflow:hidden}}@keyframes toast-slide-in-from-top{0%{transform:translateY(-100%)}to{transform:var(--transform)}}@keyframes toast-slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:var(--transform)}}@keyframes toast-slide-up{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(0) translateY(calc(var(--translate) - 100%))}}@keyframes toast-slide-down{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(0) translateY(calc(var(--translate) + 100%))}}@keyframes toast-pulse-a{0%,to{scale:1}50%{scale:1.04}}@keyframes toast-pulse-b{0%,to{scale:1}50%{scale:1.04}}@keyframes toast-collapsed-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--before) - var(--height))*var(--gap))) scale(var(--scale))}}@keyframes toast-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--offset) - var(--height))*var(--translate-factor)))}}@keyframes toast-slide-left{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(-100%) translateY(var(--translate))}}@keyframes toast-slide-right{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(100%) translateY(var(--translate))}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes slide-in-from-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes slide-out-to-top{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes slide-in-from-right{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out-to-right{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes slide-in-from-left{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes slide-out-to-left{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-from-top-and-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-top-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes slide-in-from-right-and-fade{0%{opacity:0;transform:translateX(4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-right-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(4px)}}@keyframes slide-in-from-bottom-and-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes slide-in-from-left-and-fade{0%{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-left-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-4px)}}@keyframes enter-from-right{0%{opacity:0;transform:translateX(200px)}to{opacity:1;transform:translateX(0)}}@keyframes enter-from-left{0%{opacity:0;transform:translateX(-200px)}to{opacity:1;transform:translateX(0)}}@keyframes exit-to-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(200px)}}@keyframes exit-to-left{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-200px)}}@keyframes carousel{0%,to{width:50%}0%{transform:translateX(-100%)}to{transform:translateX(200%)}}@keyframes carousel-rtl{0%,to{width:50%}0%{transform:translateX(100%)}to{transform:translateX(-200%)}}@keyframes carousel-vertical{0%,to{height:50%}0%{transform:translateY(-100%)}to{transform:translateY(200%)}}@keyframes carousel-inverse{0%,to{width:50%}0%{transform:translateX(200%)}to{transform:translateX(-100%)}}@keyframes carousel-inverse-rtl{0%,to{width:50%}0%{transform:translateX(-200%)}to{transform:translateX(100%)}}@keyframes carousel-inverse-vertical{0%,to{height:50%}0%{transform:translateY(200%)}to{transform:translateY(-100%)}}@keyframes swing{0%,to{width:50%}0%,to{transform:translateX(-25%)}50%{transform:translateX(125%)}}@keyframes swing-vertical{0%,to{height:50%}0%,to{transform:translateY(-25%)}50%{transform:translateY(125%)}}@keyframes elastic{0%,to{margin-left:25%;width:50%}50%{margin-left:5%;width:90%}}@keyframes elastic-vertical{0%,to{height:50%;margin-top:25%}50%{height:90%;margin-top:5%}}@keyframes marquee{0%{transform:translateZ(0)}to{transform:translate3d(calc(-100% - var(--gap)),0,0)}}@keyframes marquee-rtl{0%{transform:translateZ(0)}to{transform:translate3d(calc(100% + var(--gap)),0,0)}}@keyframes marquee-vertical{0%{transform:translateZ(0)}to{transform:translate3d(0,calc(-100% - var(--gap)),0)}}@keyframes marquee-vertical-rtl{0%{transform:translate3d(0,calc(-100% - var(--gap)),0)}to{transform:translate3d(0,calc(-100%*var(--gap)),0)}}@keyframes shimmer{0%{background-position:100%}to{background-position:0}}@keyframes shimmer-rtl{0%{background-position:0}to{background-position:100%}}
1
+ @keyframes accordion-up{0%{height:var(--reka-accordion-content-height);overflow:hidden}to{height:0;overflow:hidden}}@keyframes accordion-down{0%{height:0;overflow:hidden}to{height:var(--reka-accordion-content-height);overflow:hidden}}@keyframes collapsible-up{0%{height:var(--reka-collapsible-content-height);overflow:hidden}to{height:0;overflow:hidden}}@keyframes collapsible-down{0%{height:0;overflow:hidden}to{height:var(--reka-collapsible-content-height);overflow:hidden}}@keyframes toast-slide-in-from-top{0%{transform:translateY(-100%)}to{transform:var(--transform)}}@keyframes toast-slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:var(--transform)}}@keyframes toast-slide-up{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(0) translateY(calc(var(--translate) - 100%))}}@keyframes toast-slide-down{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(0) translateY(calc(var(--translate) + 100%))}}@keyframes toast-pulse-a{0%,to{scale:1}50%{scale:1.04}}@keyframes toast-pulse-b{0%,to{scale:1}50%{scale:1.04}}@keyframes toast-collapsed-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--before) - var(--height))*var(--gap))) scale(var(--scale))}}@keyframes toast-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--offset) - var(--height))*var(--translate-factor)))}}@keyframes toast-slide-left{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(-100%) translateY(var(--translate))}}@keyframes toast-slide-right{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(100%) translateY(var(--translate))}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes slide-in-from-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes slide-out-to-top{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes slide-in-from-right{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out-to-right{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes slide-in-from-left{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes slide-out-to-left{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-from-top-and-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-top-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes slide-in-from-right-and-fade{0%{opacity:0;transform:translateX(4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-right-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(4px)}}@keyframes slide-in-from-bottom-and-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes slide-in-from-left-and-fade{0%{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-left-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-4px)}}@keyframes enter-from-right{0%{opacity:0;transform:translateX(200px)}to{opacity:1;transform:translateX(0)}}@keyframes enter-from-left{0%{opacity:0;transform:translateX(-200px)}to{opacity:1;transform:translateX(0)}}@keyframes exit-to-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(200px)}}@keyframes exit-to-left{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-200px)}}@keyframes carousel{0%,to{width:50%}0%{transform:translateX(-100%)}to{transform:translateX(200%)}}@keyframes carousel-rtl{0%,to{width:50%}0%{transform:translateX(100%)}to{transform:translateX(-200%)}}@keyframes carousel-vertical{0%,to{height:50%}0%{transform:translateY(-100%)}to{transform:translateY(200%)}}@keyframes carousel-inverse{0%,to{width:50%}0%{transform:translateX(200%)}to{transform:translateX(-100%)}}@keyframes carousel-inverse-rtl{0%,to{width:50%}0%{transform:translateX(-200%)}to{transform:translateX(100%)}}@keyframes carousel-inverse-vertical{0%,to{height:50%}0%{transform:translateY(200%)}to{transform:translateY(-100%)}}@keyframes swing{0%,to{width:50%}0%,to{transform:translateX(-25%)}50%{transform:translateX(125%)}}@keyframes swing-vertical{0%,to{height:50%}0%,to{transform:translateY(-25%)}50%{transform:translateY(125%)}}@keyframes elastic{0%,to{left:25%;width:50%}50%{left:0;width:100%}}@keyframes elastic-vertical{0%,to{height:50%;top:25%}50%{height:100%;top:0}}@keyframes marquee{0%{transform:translateZ(0)}to{transform:translate3d(calc(-100% - var(--gap)),0,0)}}@keyframes marquee-rtl{0%{transform:translateZ(0)}to{transform:translate3d(calc(100% + var(--gap)),0,0)}}@keyframes marquee-vertical{0%{transform:translateZ(0)}to{transform:translate3d(0,calc(-100% - var(--gap)),0)}}@keyframes shimmer{0%{background-position:100%}to{background-position:0}}@keyframes shimmer-rtl{0%{background-position:0}to{background-position:100%}}@media (prefers-reduced-motion:reduce){@keyframes scale-in{0%{opacity:0}to{opacity:1}}@keyframes scale-out{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-top{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-top{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-right{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-right{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-bottom{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-bottom{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-left{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-left{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-top-and-fade{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-top-and-fade{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-right-and-fade{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-right-and-fade{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-bottom-and-fade{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-bottom-and-fade{0%{opacity:1}to{opacity:0}}@keyframes slide-in-from-left-and-fade{0%{opacity:0}to{opacity:1}}@keyframes slide-out-to-left-and-fade{0%{opacity:1}to{opacity:0}}@keyframes enter-from-right{0%{opacity:0}to{opacity:1}}@keyframes enter-from-left{0%{opacity:0}to{opacity:1}}@keyframes exit-to-right{0%{opacity:1}to{opacity:0}}@keyframes exit-to-left{0%{opacity:1}to{opacity:0}}@keyframes toast-slide-in-from-top{0%{opacity:0}to{opacity:1}}@keyframes toast-slide-in-from-bottom{0%{opacity:0}to{opacity:1}}@keyframes toast-closed{0%{opacity:1}to{opacity:0}}@keyframes toast-collapsed-closed{0%{opacity:1}to{opacity:0}}}
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Danish",
3
+ name: "Dansk",
4
4
  code: "da",
5
5
  messages: {
6
6
  alert: {
@@ -0,0 +1,7 @@
1
+ import { defineLocale } from "../composables/defineLocale.js";
2
+ import de from "./de.js";
3
+ export default defineLocale({
4
+ name: "Deutsch (\xD6sterreich)",
5
+ code: "de-AT",
6
+ messages: de.messages
7
+ });
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Schweizerdeutsch",
3
+ name: "Schweizer Hochdeutsch",
4
4
  code: "de-CH",
5
5
  messages: {
6
6
  alert: {
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Euskera",
3
+ name: "Euskara",
4
4
  code: "eu",
5
5
  messages: {
6
6
  alert: {
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Suomeksi",
3
+ name: "Suomi",
4
4
  code: "fi",
5
5
  messages: {
6
6
  alert: {
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Hebrew",
3
+ name: "\u05E2\u05D1\u05E8\u05D9\u05EA",
4
4
  code: "he",
5
5
  dir: "rtl",
6
6
  messages: {
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Hindi",
3
+ name: "\u0939\u093F\u0928\u094D\u0926\u0940",
4
4
  code: "hi",
5
5
  messages: {
6
6
  alert: {
@@ -8,6 +8,7 @@ export { default as ckb } from './ckb';
8
8
  export { default as cs } from './cs';
9
9
  export { default as da } from './da';
10
10
  export { default as de } from './de';
11
+ export { default as de_at } from './de_at';
11
12
  export { default as de_ch } from './de_ch';
12
13
  export { default as el } from './el';
13
14
  export { default as en } from './en';
@@ -50,8 +51,8 @@ export { default as sk } from './sk';
50
51
  export { default as sl } from './sl';
51
52
  export { default as sq } from './sq';
52
53
  export { default as sv } from './sv';
54
+ export { default as tg } from './tg';
53
55
  export { default as th } from './th';
54
- export { default as tj } from './tj';
55
56
  export { default as tr } from './tr';
56
57
  export { default as ug_cn } from './ug_cn';
57
58
  export { default as uk } from './uk';
@@ -8,6 +8,7 @@ export { default as ckb } from "./ckb.js";
8
8
  export { default as cs } from "./cs.js";
9
9
  export { default as da } from "./da.js";
10
10
  export { default as de } from "./de.js";
11
+ export { default as de_at } from "./de_at.js";
11
12
  export { default as de_ch } from "./de_ch.js";
12
13
  export { default as el } from "./el.js";
13
14
  export { default as en } from "./en.js";
@@ -50,8 +51,8 @@ export { default as sk } from "./sk.js";
50
51
  export { default as sl } from "./sl.js";
51
52
  export { default as sq } from "./sq.js";
52
53
  export { default as sv } from "./sv.js";
54
+ export { default as tg } from "./tg.js";
53
55
  export { default as th } from "./th.js";
54
- export { default as tj } from "./tj.js";
55
56
  export { default as tr } from "./tr.js";
56
57
  export { default as ug_cn } from "./ug_cn.js";
57
58
  export { default as uk } from "./uk.js";
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Icelandic",
3
+ name: "\xCDslenska",
4
4
  code: "is",
5
5
  messages: {
6
6
  alert: {
@@ -22,7 +22,7 @@ export default defineLocale({
22
22
  },
23
23
  carousel: {
24
24
  dots: "Wielt Dia fir ze weisen",
25
- goto: "Gitt op d'Slide {Slide}",
25
+ goto: "Gitt op d'Slide {slide}",
26
26
  next: "N\xE4ch.",
27
27
  prev: "Pr\xE4z."
28
28
  },
@@ -0,0 +1,3 @@
1
+ import type { Messages } from '../types/locale';
2
+ declare const _default: import("../types").Locale<Messages>;
3
+ export default _default;
@@ -1,7 +1,7 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
3
  name: "\u0422\u043E\u04B7\u0438\u043A\u04E3",
4
- code: "tj",
4
+ code: "tg",
5
5
  messages: {
6
6
  alert: {
7
7
  close: "\u0411\u0430\u0441\u0442\u0430\u043D"
@@ -1,6 +1,6 @@
1
1
  import { defineLocale } from "../composables/defineLocale.js";
2
2
  export default defineLocale({
3
- name: "Urdu",
3
+ name: "\u0627\u0631\u062F\u0648",
4
4
  code: "ur",
5
5
  dir: "rtl",
6
6
  messages: {
@@ -22,7 +22,7 @@ export interface Form<S extends FormSchema> {
22
22
  blurredFields: ReadonlySet<DeepReadonly<keyof FormData<S, false>>>;
23
23
  }
24
24
  export type FormSchema<I extends object = object, O extends object = I> = SuperstructSchema<any, any> | StandardSchemaV1<I, O>;
25
- export type InferInput<Schema> = Schema extends StandardSchemaV1 ? StandardSchemaV1.InferInput<Schema> : Schema extends SuperstructSchema<infer I, any> ? I : Schema extends StandardSchemaV1 ? StandardSchemaV1.InferInput<Schema> : never;
25
+ export type InferInput<Schema> = Schema extends StandardSchemaV1 ? StandardSchemaV1.InferInput<Schema> : Schema extends SuperstructSchema<infer I, any> ? I : never;
26
26
  export type InferOutput<Schema> = Schema extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<Schema> : Schema extends SuperstructSchema<infer O, any> ? O : never;
27
27
  export type FormData<S extends FormSchema, T extends boolean = true> = T extends true ? InferOutput<S> : InferInput<S>;
28
28
  export type FormInputEvents = 'input' | 'blur' | 'change' | 'focus';
@@ -2,7 +2,9 @@ import type { AnchorHTMLAttributes as VueAnchorHTMLAttributes, ButtonHTMLAttribu
2
2
  export type AnchorHTMLAttributes = Pick<VueAnchorHTMLAttributes, 'download' | 'href' | 'hreflang' | 'media' | 'ping' | 'rel' | 'target' | 'type' | 'referrerpolicy'>;
3
3
  export type ButtonHTMLAttributes = Pick<VueButtonHTMLAttributes, 'autofocus' | 'disabled' | 'form' | 'formaction' | 'formenctype' | 'formmethod' | 'formnovalidate' | 'formtarget' | 'name' | 'type'>;
4
4
  export type FormHTMLAttributes = Pick<VueFormHTMLAttributes, 'acceptcharset' | 'action' | 'autocomplete' | 'enctype' | 'method' | 'name' | 'novalidate' | 'target'>;
5
- export type ImgHTMLAttributes = Pick<VueImgHTMLAttributes, 'alt' | 'crossorigin' | 'decoding' | 'height' | 'loading' | 'referrerpolicy' | 'sizes' | 'src' | 'srcset' | 'usemap' | 'width'>;
5
+ export type ImgHTMLAttributes = Pick<VueImgHTMLAttributes, 'alt' | 'decoding' | 'height' | 'loading' | 'referrerpolicy' | 'sizes' | 'src' | 'srcset' | 'usemap' | 'width'> & {
6
+ crossorigin?: 'anonymous' | 'use-credentials';
7
+ };
6
8
  export type InputHTMLAttributes = Pick<VueInputHTMLAttributes, 'autofocus' | 'disabled' | 'enterKeyHint' | 'form' | 'formaction' | 'formenctype' | 'formmethod' | 'formnovalidate' | 'formtarget' | 'list' | 'max' | 'maxlength' | 'min' | 'minlength' | 'name' | 'pattern' | 'placeholder' | 'readonly' | 'required' | 'size' | 'step' | 'type'> & {
7
9
  autocomplete?: 'on' | 'off' | (string & {});
8
10
  };
@@ -95,6 +95,7 @@ export * from '../components/PricingPlan.vue';
95
95
  export * from '../components/PricingPlans.vue';
96
96
  export * from '../components/PricingTable.vue';
97
97
  export * from '../components/Progress.vue';
98
+ export * from '../components/ProgressGroup.vue';
98
99
  export * from '../components/RadioGroup.vue';
99
100
  export * from '../components/ScrollArea.vue';
100
101
  export * from '../components/Select.vue';
@@ -104,6 +105,7 @@ export * from '../components/Sidebar.vue';
104
105
  export * from '../components/Skeleton.vue';
105
106
  export * from '../components/Slideover.vue';
106
107
  export * from '../components/Slider.vue';
108
+ export * from '../components/Splitter.vue';
107
109
  export * from '../components/Stepper.vue';
108
110
  export * from '../components/Switch.vue';
109
111
  export * from '../components/Table.vue';
@@ -95,6 +95,7 @@ export * from "../components/PricingPlan.vue";
95
95
  export * from "../components/PricingPlans.vue";
96
96
  export * from "../components/PricingTable.vue";
97
97
  export * from "../components/Progress.vue";
98
+ export * from "../components/ProgressGroup.vue";
98
99
  export * from "../components/RadioGroup.vue";
99
100
  export * from "../components/ScrollArea.vue";
100
101
  export * from "../components/Select.vue";
@@ -104,6 +105,7 @@ export * from "../components/Sidebar.vue";
104
105
  export * from "../components/Skeleton.vue";
105
106
  export * from "../components/Slideover.vue";
106
107
  export * from "../components/Slider.vue";
108
+ export * from "../components/Splitter.vue";
107
109
  export * from "../components/Stepper.vue";
108
110
  export * from "../components/Switch.vue";
109
111
  export * from "../components/Table.vue";
@@ -124,6 +124,7 @@ export interface ThemeDefaults {
124
124
  pricingPlans?: Partial<ComponentTypes.PricingPlansProps>;
125
125
  pricingTable?: Partial<ComponentTypes.PricingTableProps>;
126
126
  progress?: Partial<ComponentTypes.ProgressProps>;
127
+ progressGroup?: Partial<ComponentTypes.ProgressGroupProps>;
127
128
  /**
128
129
  * Prose components that expose overridable props, under a `prose` namespace
129
130
  * (mirrors `app.config.ui.prose` and `useComponentProps('prose.<tag>', …)`).
@@ -164,6 +165,7 @@ export interface ThemeDefaults {
164
165
  skeleton?: Partial<ComponentTypes.SkeletonProps>;
165
166
  slideover?: Partial<ComponentTypes.SlideoverProps>;
166
167
  slider?: Partial<ComponentTypes.SliderProps>;
168
+ splitter?: Partial<ComponentTypes.SplitterProps>;
167
169
  stepper?: Partial<ComponentTypes.StepperProps>;
168
170
  switch?: Partial<ComponentTypes.SwitchProps>;
169
171
  table?: Partial<ComponentTypes.TableProps>;
@@ -1,8 +1,12 @@
1
1
  import type { ClassValue, TVVariants, TVCompoundVariants, TVDefaultVariants } from 'tailwind-variants';
2
2
  /**
3
3
  * A function form for a slot class that **replaces** the slot's default classes
4
- * instead of merging onto them. It receives the slot's fully resolved default
5
- * class string and returns the classes to use in its place.
4
+ * instead of merging onto them, returning the classes to use in their place.
5
+ * In `app.config.ui` it receives the slot's own theme classes and replaces only
6
+ * those — `variants` and `compoundVariants` still apply on top. In `:ui` / `class`
7
+ * it runs after variant resolution, so it receives the fully resolved class
8
+ * string and replaces it, keeping only the plain classes passed alongside the
9
+ * replacer (e.g. `[() => 'text-xl', 'opacity-50']` resolves to both).
6
10
  * @example title: defaults => 'text-xl font-bold'
7
11
  */
8
12
  export type SlotClassReplacer = (defaults: string) => ClassValue;
@@ -0,0 +1 @@
1
+ export declare const linkKeys: readonly ["active", "activeClass", "ariaCurrentValue", "as", "disabled", "download", "exact", "exactActiveClass", "exactHash", "exactQuery", "external", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "href", "hreflang", "inactiveClass", "locale", "media", "noPrefetch", "noRel", "onClick", "ping", "prefetch", "prefetchOn", "prefetchedClass", "referrerpolicy", "rel", "replace", "target", "title", "to", "trailingSlash", "type", "viewTransition"];
@@ -0,0 +1,40 @@
1
+ export const linkKeys = [
2
+ "active",
3
+ "activeClass",
4
+ "ariaCurrentValue",
5
+ "as",
6
+ "disabled",
7
+ "download",
8
+ "exact",
9
+ "exactActiveClass",
10
+ "exactHash",
11
+ "exactQuery",
12
+ "external",
13
+ "form",
14
+ "formaction",
15
+ "formenctype",
16
+ "formmethod",
17
+ "formnovalidate",
18
+ "formtarget",
19
+ "href",
20
+ "hreflang",
21
+ "inactiveClass",
22
+ "locale",
23
+ "media",
24
+ "noPrefetch",
25
+ "noRel",
26
+ "onClick",
27
+ "ping",
28
+ "prefetch",
29
+ "prefetchOn",
30
+ "prefetchedClass",
31
+ "referrerpolicy",
32
+ "rel",
33
+ "replace",
34
+ "target",
35
+ "title",
36
+ "to",
37
+ "trailingSlash",
38
+ "type",
39
+ "viewTransition"
40
+ ];
@@ -1,5 +1,6 @@
1
1
  import type { LinkProps } from '../components/Link.vue';
2
- export declare const linkKeys: readonly ["active", "activeClass", "ariaCurrentValue", "as", "disabled", "download", "exact", "exactActiveClass", "exactHash", "exactQuery", "external", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "href", "hreflang", "inactiveClass", "locale", "media", "noPrefetch", "noRel", "onClick", "ping", "prefetch", "prefetchOn", "prefetchedClass", "referrerpolicy", "rel", "replace", "target", "title", "to", "trailingSlash", "type", "viewTransition"];
2
+ import { linkKeys } from './link-keys';
3
+ export { linkKeys };
3
4
  export declare function pickLinkProps(link: LinkProps & {
4
5
  [key: string]: any;
5
6
  }): import("@vueuse/shared").ReactivePickReturn<LinkProps & {
@@ -1,45 +1,7 @@
1
1
  import { reactivePick } from "@vueuse/core";
2
2
  import { isEqual, diff } from "ohash/utils";
3
- export const linkKeys = [
4
- "active",
5
- "activeClass",
6
- "ariaCurrentValue",
7
- "as",
8
- "disabled",
9
- "download",
10
- "exact",
11
- "exactActiveClass",
12
- "exactHash",
13
- "exactQuery",
14
- "external",
15
- "form",
16
- "formaction",
17
- "formenctype",
18
- "formmethod",
19
- "formnovalidate",
20
- "formtarget",
21
- "href",
22
- "hreflang",
23
- "inactiveClass",
24
- "locale",
25
- "media",
26
- "noPrefetch",
27
- "noRel",
28
- "onClick",
29
- "ping",
30
- "prefetch",
31
- "prefetchOn",
32
- "prefetchedClass",
33
- "referrerpolicy",
34
- "rel",
35
- "replace",
36
- "target",
37
- "title",
38
- "to",
39
- "trailingSlash",
40
- "type",
41
- "viewTransition"
42
- ];
3
+ import { linkKeys } from "./link-keys.js";
4
+ export { linkKeys };
43
5
  export function pickLinkProps(link) {
44
6
  const keys = Object.keys(link);
45
7
  const ariaKeys = keys.filter((key) => key.startsWith("aria-"));
@@ -8,15 +8,6 @@ const htmlEscapes = {
8
8
  function escapeHTML(str) {
9
9
  return str.replace(/[&<>"']/g, (char) => htmlEscapes[char]);
10
10
  }
11
- function isAlreadyEscaped(str) {
12
- return /&(?:amp|lt|gt|quot|#39);/.test(str);
13
- }
14
- function sanitize(str) {
15
- if (isAlreadyEscaped(str)) {
16
- return str;
17
- }
18
- return escapeHTML(str);
19
- }
20
11
  function truncateHTMLFromStart(html, maxLength) {
21
12
  let truncated = "";
22
13
  let totalLength = 0;
@@ -62,14 +53,14 @@ export function highlight(item, searchTerm, forceKey, omitKeys, useTokenSearch)
62
53
  const lastIndiceNextIndex = region[1] + 1;
63
54
  const isMatched = lastIndiceNextIndex - region[0] >= minTokenLength;
64
55
  content += [
65
- sanitize(value.substring(nextUnhighlightedRegionStartingIndex, region[0])),
56
+ escapeHTML(value.substring(nextUnhighlightedRegionStartingIndex, region[0])),
66
57
  isMatched && `<mark>`,
67
- sanitize(value.substring(region[0], lastIndiceNextIndex)),
58
+ escapeHTML(value.substring(region[0], lastIndiceNextIndex)),
68
59
  isMatched && "</mark>"
69
60
  ].filter(Boolean).join("");
70
61
  nextUnhighlightedRegionStartingIndex = lastIndiceNextIndex;
71
62
  });
72
- content += sanitize(value.substring(nextUnhighlightedRegionStartingIndex));
63
+ content += escapeHTML(value.substring(nextUnhighlightedRegionStartingIndex));
73
64
  const markIndex = content.indexOf("<mark>");
74
65
  if (markIndex !== -1) {
75
66
  content = truncateHTMLFromStart(content, content.length - markIndex);