@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.
- package/.nuxt/ui.static.css +11 -11
- package/README.md +1 -0
- package/cli/commands/make/locale.mjs +40 -11
- package/cli/templates.mjs +2 -2
- package/dist/module.d.mts +1 -1
- package/dist/module.json +2 -2
- package/dist/module.mjs +5 -2
- package/dist/runtime/components/AuthForm.d.vue.ts +7 -7
- package/dist/runtime/components/AuthForm.vue.d.ts +7 -7
- package/dist/runtime/components/Button.vue +11 -2
- package/dist/runtime/components/ChatPromptSubmit.d.vue.ts +2 -2
- package/dist/runtime/components/ChatPromptSubmit.vue.d.ts +2 -2
- package/dist/runtime/components/Checkbox.d.vue.ts +1 -1
- package/dist/runtime/components/Checkbox.vue +12 -6
- package/dist/runtime/components/Checkbox.vue.d.ts +1 -1
- package/dist/runtime/components/CheckboxGroup.d.vue.ts +6 -0
- package/dist/runtime/components/CheckboxGroup.vue +10 -4
- package/dist/runtime/components/CheckboxGroup.vue.d.ts +6 -0
- package/dist/runtime/components/Editor.vue +4 -1
- package/dist/runtime/components/Error.d.vue.ts +1 -1
- package/dist/runtime/components/Error.vue.d.ts +1 -1
- package/dist/runtime/components/FileUpload.vue +17 -10
- package/dist/runtime/components/Input.vue +12 -7
- package/dist/runtime/components/InputDate.vue +12 -8
- package/dist/runtime/components/InputMenu.vue +25 -11
- package/dist/runtime/components/InputNumber.vue +14 -9
- package/dist/runtime/components/InputRating.vue +10 -7
- package/dist/runtime/components/InputTags.vue +12 -7
- package/dist/runtime/components/InputTime.vue +12 -7
- package/dist/runtime/components/Listbox.vue +10 -6
- package/dist/runtime/components/Modal.vue +12 -5
- package/dist/runtime/components/PinInput.vue +13 -8
- package/dist/runtime/components/Popover.vue +0 -1
- package/dist/runtime/components/PricingTable.d.vue.ts +1 -1
- package/dist/runtime/components/PricingTable.vue.d.ts +1 -1
- package/dist/runtime/components/Progress.d.vue.ts +2 -1
- package/dist/runtime/components/Progress.vue +5 -6
- package/dist/runtime/components/Progress.vue.d.ts +2 -1
- package/dist/runtime/components/ProgressGroup.d.vue.ts +91 -0
- package/dist/runtime/components/ProgressGroup.vue +99 -0
- package/dist/runtime/components/ProgressGroup.vue.d.ts +91 -0
- package/dist/runtime/components/RadioGroup.d.vue.ts +7 -1
- package/dist/runtime/components/RadioGroup.vue +14 -5
- package/dist/runtime/components/RadioGroup.vue.d.ts +7 -1
- package/dist/runtime/components/Select.vue +21 -8
- package/dist/runtime/components/SelectMenu.vue +26 -12
- package/dist/runtime/components/Slider.vue +14 -7
- package/dist/runtime/components/Splitter.d.vue.ts +266 -0
- package/dist/runtime/components/Splitter.vue +99 -0
- package/dist/runtime/components/Splitter.vue.d.ts +266 -0
- package/dist/runtime/components/Switch.vue +8 -4
- package/dist/runtime/components/Textarea.vue +17 -7
- package/dist/runtime/components/Theme.d.vue.ts +1 -1
- package/dist/runtime/components/Theme.vue +4 -3
- package/dist/runtime/components/Theme.vue.d.ts +1 -1
- package/dist/runtime/components/Tree.vue +1 -1
- package/dist/runtime/components/content/ContentNavigation.vue +8 -1
- package/dist/runtime/components/content/ContentToc.vue +4 -1
- package/dist/runtime/composables/useComponentProps.d.ts +1 -1
- package/dist/runtime/composables/useComponentProps.js +6 -0
- package/dist/runtime/composables/useFormField.d.ts +10 -4
- package/dist/runtime/composables/useFormField.js +10 -3
- package/dist/runtime/keyframes.css +1 -1
- package/dist/runtime/locale/da.js +1 -1
- package/dist/runtime/locale/de_at.js +7 -0
- package/dist/runtime/locale/de_ch.js +1 -1
- package/dist/runtime/locale/eu.js +1 -1
- package/dist/runtime/locale/fi.js +1 -1
- package/dist/runtime/locale/he.js +1 -1
- package/dist/runtime/locale/hi.js +1 -1
- package/dist/runtime/locale/index.d.ts +2 -1
- package/dist/runtime/locale/index.js +2 -1
- package/dist/runtime/locale/is.js +1 -1
- package/dist/runtime/locale/lb.js +1 -1
- package/dist/runtime/locale/tg.d.ts +3 -0
- package/dist/runtime/locale/{tj.js → tg.js} +1 -1
- package/dist/runtime/locale/ur.js +1 -1
- package/dist/runtime/types/form.d.ts +1 -1
- package/dist/runtime/types/html.d.ts +3 -1
- package/dist/runtime/types/index.d.ts +2 -0
- package/dist/runtime/types/index.js +2 -0
- package/dist/runtime/types/theme.d.ts +2 -0
- package/dist/runtime/types/tv.d.ts +6 -2
- package/dist/runtime/utils/link-keys.d.ts +1 -0
- package/dist/runtime/utils/link-keys.js +40 -0
- package/dist/runtime/utils/link.d.ts +2 -1
- package/dist/runtime/utils/link.js +2 -40
- package/dist/runtime/utils/search.js +3 -12
- package/dist/runtime/utils/tv.d.ts +1 -1
- package/dist/runtime/utils/tv.js +103 -25
- package/dist/runtime/vue/components/Icon.vue +5 -2
- package/dist/shared/{ui.XkBrgXFP.mjs → ui.DNq7CNkE.mjs} +589 -213
- package/dist/unplugin.d.mts +1 -1
- package/dist/unplugin.mjs +22 -6
- package/dist/vite.mjs +4 -4
- package/package.json +51 -50
- /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
|
|
62
|
+
color: color.value,
|
|
59
63
|
variant: props.variant,
|
|
60
|
-
size: size
|
|
64
|
+
size: size.value,
|
|
61
65
|
loading: props.loading,
|
|
62
|
-
highlight: highlight.value
|
|
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,10 +1,11 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
|
|
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 }
|
|
@@ -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 ? {
|
|
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
|
|
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`
|
|
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
|
-
*
|
|
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<
|
|
54
|
-
disabled: ComputedRef<
|
|
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{
|
|
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}}}
|
|
@@ -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";
|
|
@@ -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 :
|
|
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' | '
|
|
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
|
|
5
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
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
|
-
|
|
56
|
+
escapeHTML(value.substring(nextUnhighlightedRegionStartingIndex, region[0])),
|
|
66
57
|
isMatched && `<mark>`,
|
|
67
|
-
|
|
58
|
+
escapeHTML(value.substring(region[0], lastIndiceNextIndex)),
|
|
68
59
|
isMatched && "</mark>"
|
|
69
60
|
].filter(Boolean).join("");
|
|
70
61
|
nextUnhighlightedRegionStartingIndex = lastIndiceNextIndex;
|
|
71
62
|
});
|
|
72
|
-
content +=
|
|
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);
|