@bitrix24/b24ui-nuxt 0.1.1
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/b24ui/advice.ts +52 -0
- package/.nuxt/b24ui/alert.ts +118 -0
- package/.nuxt/b24ui/avatar-group.ts +52 -0
- package/.nuxt/b24ui/avatar.ts +63 -0
- package/.nuxt/b24ui/badge.ts +256 -0
- package/.nuxt/b24ui/button-group.ts +27 -0
- package/.nuxt/b24ui/button.ts +342 -0
- package/.nuxt/b24ui/checkbox.ts +128 -0
- package/.nuxt/b24ui/chip.ts +205 -0
- package/.nuxt/b24ui/container.ts +3 -0
- package/.nuxt/b24ui/content/description-list.ts +62 -0
- package/.nuxt/b24ui/countdown.ts +94 -0
- package/.nuxt/b24ui/form-field.ts +57 -0
- package/.nuxt/b24ui/form.ts +3 -0
- package/.nuxt/b24ui/index.ts +28 -0
- package/.nuxt/b24ui/input.ts +472 -0
- package/.nuxt/b24ui/kbd.ts +31 -0
- package/.nuxt/b24ui/link.ts +20 -0
- package/.nuxt/b24ui/progress.ts +303 -0
- package/.nuxt/b24ui/radio-group.ts +135 -0
- package/.nuxt/b24ui/range.ts +172 -0
- package/.nuxt/b24ui/select.ts +550 -0
- package/.nuxt/b24ui/separator.ts +176 -0
- package/.nuxt/b24ui/skeleton.ts +3 -0
- package/.nuxt/b24ui/switch.ts +134 -0
- package/.nuxt/b24ui/tabs.ts +341 -0
- package/.nuxt/b24ui/textarea.ts +332 -0
- package/.nuxt/b24ui/toast.ts +89 -0
- package/.nuxt/b24ui/toaster.ts +91 -0
- package/.nuxt/b24ui/tooltip.ts +16 -0
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/cli/commands/make/component.mjs +95 -0
- package/cli/commands/make/index.mjs +14 -0
- package/cli/commands/make/locale.mjs +64 -0
- package/cli/index.mjs +15 -0
- package/cli/package.json +13 -0
- package/cli/templates.mjs +240 -0
- package/cli/utils.mjs +31 -0
- package/dist/meta.cjs +23610 -0
- package/dist/meta.d.cts +23608 -0
- package/dist/meta.d.mts +23608 -0
- package/dist/meta.d.ts +23608 -0
- package/dist/meta.mjs +23608 -0
- package/dist/module.cjs +54 -0
- package/dist/module.d.cts +14 -0
- package/dist/module.d.mts +14 -0
- package/dist/module.d.ts +14 -0
- package/dist/module.json +13 -0
- package/dist/module.mjs +51 -0
- package/dist/runtime/components/Advice.vue +115 -0
- package/dist/runtime/components/Alert.vue +136 -0
- package/dist/runtime/components/App.vue +52 -0
- package/dist/runtime/components/Avatar.vue +118 -0
- package/dist/runtime/components/AvatarGroup.vue +99 -0
- package/dist/runtime/components/Badge.vue +114 -0
- package/dist/runtime/components/Button.vue +177 -0
- package/dist/runtime/components/ButtonGroup.vue +58 -0
- package/dist/runtime/components/Checkbox.vue +110 -0
- package/dist/runtime/components/Chip.vue +81 -0
- package/dist/runtime/components/Container.vue +36 -0
- package/dist/runtime/components/Countdown.vue +498 -0
- package/dist/runtime/components/Form.vue +271 -0
- package/dist/runtime/components/FormField.vue +128 -0
- package/dist/runtime/components/Input.vue +224 -0
- package/dist/runtime/components/Kbd.vue +50 -0
- package/dist/runtime/components/Link.vue +219 -0
- package/dist/runtime/components/LinkBase.vue +63 -0
- package/dist/runtime/components/Progress.vue +182 -0
- package/dist/runtime/components/RadioGroup.vue +178 -0
- package/dist/runtime/components/Range.vue +114 -0
- package/dist/runtime/components/Select.vue +328 -0
- package/dist/runtime/components/Separator.vue +82 -0
- package/dist/runtime/components/Skeleton.vue +31 -0
- package/dist/runtime/components/Switch.vue +133 -0
- package/dist/runtime/components/Tabs.vue +127 -0
- package/dist/runtime/components/Textarea.vue +216 -0
- package/dist/runtime/components/Toast.vue +168 -0
- package/dist/runtime/components/Toaster.vue +143 -0
- package/dist/runtime/components/Tooltip.vue +94 -0
- package/dist/runtime/components/content/DescriptionList.vue +220 -0
- package/dist/runtime/composables/defineLocale.d.ts +9 -0
- package/dist/runtime/composables/defineLocale.js +4 -0
- package/dist/runtime/composables/defineShortcuts.d.ts +15 -0
- package/dist/runtime/composables/defineShortcuts.js +135 -0
- package/dist/runtime/composables/useAvatarGroup.d.ts +10 -0
- package/dist/runtime/composables/useAvatarGroup.js +10 -0
- package/dist/runtime/composables/useButtonGroup.d.ts +17 -0
- package/dist/runtime/composables/useButtonGroup.js +10 -0
- package/dist/runtime/composables/useComponentIcons.d.ts +20 -0
- package/dist/runtime/composables/useComponentIcons.js +25 -0
- package/dist/runtime/composables/useFormField.d.ts +42 -0
- package/dist/runtime/composables/useFormField.js +65 -0
- package/dist/runtime/composables/useKbd.d.ts +35 -0
- package/dist/runtime/composables/useKbd.js +52 -0
- package/dist/runtime/composables/useLocale.d.ts +4 -0
- package/dist/runtime/composables/useLocale.js +10 -0
- package/dist/runtime/composables/useToast.d.ts +12 -0
- package/dist/runtime/composables/useToast.js +62 -0
- package/dist/runtime/dictionary/icons.d.ts +20 -0
- package/dist/runtime/dictionary/icons.js +35 -0
- package/dist/runtime/index.css +1 -0
- package/dist/runtime/keyframes.css +1 -0
- package/dist/runtime/locale/en.d.ts +2 -0
- package/dist/runtime/locale/en.js +48 -0
- package/dist/runtime/locale/es.d.ts +2 -0
- package/dist/runtime/locale/es.js +48 -0
- package/dist/runtime/locale/index.d.ts +3 -0
- package/dist/runtime/locale/index.js +3 -0
- package/dist/runtime/locale/ru.d.ts +2 -0
- package/dist/runtime/locale/ru.js +48 -0
- package/dist/runtime/plugins/colors.d.ts +2 -0
- package/dist/runtime/plugins/colors.js +40 -0
- package/dist/runtime/types/app.config.d.ts +6 -0
- package/dist/runtime/types/form.d.ts +84 -0
- package/dist/runtime/types/form.js +12 -0
- package/dist/runtime/types/icons.d.ts +3 -0
- package/dist/runtime/types/icons.js +0 -0
- package/dist/runtime/types/index.d.ts +33 -0
- package/dist/runtime/types/index.js +33 -0
- package/dist/runtime/types/locale.d.ts +50 -0
- package/dist/runtime/types/locale.js +0 -0
- package/dist/runtime/types/utils.d.ts +22 -0
- package/dist/runtime/types/utils.js +0 -0
- package/dist/runtime/utils/form.d.ts +17 -0
- package/dist/runtime/utils/form.js +153 -0
- package/dist/runtime/utils/fuse.d.ts +4 -0
- package/dist/runtime/utils/fuse.js +63 -0
- package/dist/runtime/utils/index.d.ts +6 -0
- package/dist/runtime/utils/index.js +63 -0
- package/dist/runtime/utils/link.d.ts +29 -0
- package/dist/runtime/utils/link.js +4 -0
- package/dist/runtime/utils/locale.d.ts +15 -0
- package/dist/runtime/utils/locale.js +25 -0
- package/dist/runtime/utils/tv.d.ts +1 -0
- package/dist/runtime/utils/tv.js +4 -0
- package/dist/runtime/vue/components/Link.vue +203 -0
- package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
- package/dist/runtime/vue/plugins/color-mode.js +6 -0
- package/dist/runtime/vue/plugins/head.d.ts +4 -0
- package/dist/runtime/vue/plugins/head.js +6 -0
- package/dist/runtime/vue/stubs.d.ts +15 -0
- package/dist/runtime/vue/stubs.js +27 -0
- package/dist/shared/b24ui-nuxt.CNGvMe2S.mjs +4074 -0
- package/dist/shared/b24ui-nuxt.D22QQtm8.cjs +4079 -0
- package/dist/types.d.mts +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/unplugin.cjs +213 -0
- package/dist/unplugin.d.cts +22 -0
- package/dist/unplugin.d.mts +22 -0
- package/dist/unplugin.d.ts +22 -0
- package/dist/unplugin.mjs +202 -0
- package/dist/vite.cjs +21 -0
- package/dist/vite.d.cts +12 -0
- package/dist/vite.d.mts +12 -0
- package/dist/vite.d.ts +12 -0
- package/dist/vite.mjs +19 -0
- package/package.json +166 -0
- package/vue-plugin.d.ts +5 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter } from 'vue';
|
|
2
|
+
import type { AvatarProps, IconComponent } from '../types';
|
|
3
|
+
export interface UseComponentIconsProps {
|
|
4
|
+
/** Display an icon on the left side. */
|
|
5
|
+
icon?: IconComponent;
|
|
6
|
+
/** Display an avatar on the left side. */
|
|
7
|
+
avatar?: AvatarProps;
|
|
8
|
+
/** When `true`, the loading icon will be displayed. */
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
/** When `true`, the icon will be displayed on the right side. */
|
|
11
|
+
trailing?: boolean;
|
|
12
|
+
/** Display an icon on the right side. */
|
|
13
|
+
trailingIcon?: IconComponent;
|
|
14
|
+
}
|
|
15
|
+
export declare function useComponentIcons(componentProps: MaybeRefOrGetter<UseComponentIconsProps>): {
|
|
16
|
+
isLeading: import("vue").ComputedRef<any>;
|
|
17
|
+
isTrailing: import("vue").ComputedRef<boolean>;
|
|
18
|
+
leadingIconName: import("vue").ComputedRef<IconComponent | undefined>;
|
|
19
|
+
trailingIconName: import("vue").ComputedRef<IconComponent | undefined>;
|
|
20
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import icons from "../dictionary/icons.js";
|
|
3
|
+
export function useComponentIcons(componentProps) {
|
|
4
|
+
const props = computed(() => toValue(componentProps));
|
|
5
|
+
const isLeading = computed(() => props.value.icon && !props.value.trailing || props.value.loading && !props.value.trailing || props.value.avatar);
|
|
6
|
+
const isTrailing = computed(() => props.value.icon && props.value.trailing || props.value.loading && props.value.trailing || !!props.value.trailingIcon);
|
|
7
|
+
const leadingIconName = computed(() => {
|
|
8
|
+
if (props.value.loading) {
|
|
9
|
+
return icons.loading;
|
|
10
|
+
}
|
|
11
|
+
return props.value.icon;
|
|
12
|
+
});
|
|
13
|
+
const trailingIconName = computed(() => {
|
|
14
|
+
if (props.value.loading && !isLeading.value) {
|
|
15
|
+
return icons.loading;
|
|
16
|
+
}
|
|
17
|
+
return props.value.trailingIcon || props.value.icon;
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
isLeading,
|
|
21
|
+
isTrailing,
|
|
22
|
+
leadingIconName,
|
|
23
|
+
trailingIconName
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type InjectionKey, type Ref, type ComputedRef } from 'vue';
|
|
2
|
+
import { type UseEventBusReturn } from '@vueuse/core';
|
|
3
|
+
import type { FormFieldProps } from '../types';
|
|
4
|
+
import type { FormEvent, FormFieldInjectedOptions, FormInjectedOptions } from '../types/form';
|
|
5
|
+
import type { GetObjectField } from '../types/utils';
|
|
6
|
+
type Props<T> = {
|
|
7
|
+
id?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
size?: GetObjectField<T, 'size'>;
|
|
10
|
+
color?: GetObjectField<T, 'color'>;
|
|
11
|
+
highlight?: boolean;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare const formOptionsInjectionKey: InjectionKey<ComputedRef<FormInjectedOptions>>;
|
|
15
|
+
export declare const formBusInjectionKey: InjectionKey<UseEventBusReturn<FormEvent<any>, string>>;
|
|
16
|
+
export declare const formFieldInjectionKey: InjectionKey<ComputedRef<FormFieldInjectedOptions<FormFieldProps>>>;
|
|
17
|
+
export declare const inputIdInjectionKey: InjectionKey<Ref<string | undefined>>;
|
|
18
|
+
export declare const formInputsInjectionKey: InjectionKey<Ref<Record<string, {
|
|
19
|
+
id?: string;
|
|
20
|
+
pattern?: RegExp;
|
|
21
|
+
}>>>;
|
|
22
|
+
export declare const formLoadingInjectionKey: InjectionKey<Readonly<Ref<boolean>>>;
|
|
23
|
+
export declare function useFormField<T>(props?: Props<T>, opts?: {
|
|
24
|
+
bind?: boolean;
|
|
25
|
+
deferInputValidation?: boolean;
|
|
26
|
+
}): {
|
|
27
|
+
id: ComputedRef<string | undefined>;
|
|
28
|
+
name: ComputedRef<string | undefined>;
|
|
29
|
+
size: ComputedRef<any>;
|
|
30
|
+
color: ComputedRef<"danger" | GetObjectField<T, "color"> | undefined>;
|
|
31
|
+
highlight: ComputedRef<boolean | undefined>;
|
|
32
|
+
disabled: ComputedRef<boolean | undefined>;
|
|
33
|
+
emitFormBlur: () => void;
|
|
34
|
+
emitFormInput: import("@vueuse/core").PromisifyFn<() => void>;
|
|
35
|
+
emitFormChange: () => void;
|
|
36
|
+
emitFormFocus: () => void;
|
|
37
|
+
ariaAttrs: ComputedRef<{
|
|
38
|
+
'aria-describedby': string;
|
|
39
|
+
'aria-invalid': boolean;
|
|
40
|
+
} | undefined>;
|
|
41
|
+
};
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { inject, computed } from "vue";
|
|
2
|
+
import { useDebounceFn } from "@vueuse/core";
|
|
3
|
+
export const formOptionsInjectionKey = Symbol("bitrix24-ui.form-options");
|
|
4
|
+
export const formBusInjectionKey = Symbol("bitrix24-ui.form-events");
|
|
5
|
+
export const formFieldInjectionKey = Symbol("bitrix24-ui.form-field");
|
|
6
|
+
export const inputIdInjectionKey = Symbol("bitrix24-ui.input-id");
|
|
7
|
+
export const formInputsInjectionKey = Symbol("bitrix24-ui.form-inputs");
|
|
8
|
+
export const formLoadingInjectionKey = Symbol("bitrix24-ui.form-loading");
|
|
9
|
+
export function useFormField(props, opts) {
|
|
10
|
+
const formOptions = inject(formOptionsInjectionKey, void 0);
|
|
11
|
+
const formBus = inject(formBusInjectionKey, void 0);
|
|
12
|
+
const formField = inject(formFieldInjectionKey, void 0);
|
|
13
|
+
const formInputs = inject(formInputsInjectionKey, void 0);
|
|
14
|
+
const inputId = inject(inputIdInjectionKey, void 0);
|
|
15
|
+
if (formField && inputId) {
|
|
16
|
+
if (opts?.bind === false) {
|
|
17
|
+
inputId.value = void 0;
|
|
18
|
+
} else if (props?.id) {
|
|
19
|
+
inputId.value = props?.id;
|
|
20
|
+
}
|
|
21
|
+
if (formInputs && formField.value.name && inputId.value) {
|
|
22
|
+
formInputs.value[formField.value.name] = { id: inputId.value, pattern: formField.value.errorPattern };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function emitFormEvent(type, name, eager) {
|
|
26
|
+
if (formBus && formField && name) {
|
|
27
|
+
formBus.emit({ type, name, eager });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function emitFormBlur() {
|
|
31
|
+
emitFormEvent("blur", formField?.value.name);
|
|
32
|
+
}
|
|
33
|
+
function emitFormFocus() {
|
|
34
|
+
emitFormEvent("focus", formField?.value.name);
|
|
35
|
+
}
|
|
36
|
+
function emitFormChange() {
|
|
37
|
+
emitFormEvent("change", formField?.value.name);
|
|
38
|
+
}
|
|
39
|
+
const emitFormInput = useDebounceFn(
|
|
40
|
+
() => {
|
|
41
|
+
emitFormEvent("input", formField?.value.name, !opts?.deferInputValidation || formField?.value.eagerValidation);
|
|
42
|
+
},
|
|
43
|
+
formField?.value.validateOnInputDelay ?? formOptions?.value.validateOnInputDelay ?? 0
|
|
44
|
+
);
|
|
45
|
+
return {
|
|
46
|
+
id: computed(() => props?.id ?? inputId?.value),
|
|
47
|
+
name: computed(() => props?.name ?? formField?.value.name),
|
|
48
|
+
size: computed(() => props?.size ?? formField?.value.size),
|
|
49
|
+
color: computed(() => formField?.value.error ? "danger" : props?.color),
|
|
50
|
+
highlight: computed(() => formField?.value.error ? true : props?.highlight),
|
|
51
|
+
disabled: computed(() => formOptions?.value.disabled || props?.disabled),
|
|
52
|
+
emitFormBlur,
|
|
53
|
+
emitFormInput,
|
|
54
|
+
emitFormChange,
|
|
55
|
+
emitFormFocus,
|
|
56
|
+
ariaAttrs: computed(() => {
|
|
57
|
+
if (!formField?.value) return;
|
|
58
|
+
const descriptiveAttrs = ["error", "hint", "description"].filter((type) => formField?.value?.[type]).map((type) => `${formField?.value.ariaId}-${type}`) || [];
|
|
59
|
+
return {
|
|
60
|
+
"aria-describedby": descriptiveAttrs.join(" "),
|
|
61
|
+
"aria-invalid": !!formField?.value.error
|
|
62
|
+
};
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
type KbdKeysSpecificMap = {
|
|
2
|
+
meta: string;
|
|
3
|
+
alt: string;
|
|
4
|
+
ctrl: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const kbdKeysMap: {
|
|
7
|
+
meta: string;
|
|
8
|
+
ctrl: string;
|
|
9
|
+
alt: string;
|
|
10
|
+
win: string;
|
|
11
|
+
command: string;
|
|
12
|
+
shift: string;
|
|
13
|
+
option: string;
|
|
14
|
+
enter: string;
|
|
15
|
+
delete: string;
|
|
16
|
+
backspace: string;
|
|
17
|
+
escape: string;
|
|
18
|
+
tab: string;
|
|
19
|
+
capslock: string;
|
|
20
|
+
arrowup: string;
|
|
21
|
+
arrowright: string;
|
|
22
|
+
arrowdown: string;
|
|
23
|
+
arrowleft: string;
|
|
24
|
+
pageup: string;
|
|
25
|
+
pagedown: string;
|
|
26
|
+
home: string;
|
|
27
|
+
end: string;
|
|
28
|
+
};
|
|
29
|
+
export type KbdKey = keyof typeof kbdKeysMap;
|
|
30
|
+
export type KbdKeySpecific = keyof KbdKeysSpecificMap;
|
|
31
|
+
export declare const useKbd: () => {
|
|
32
|
+
macOS: import("vue").ComputedRef<false | "" | RegExpMatchArray | null | undefined>;
|
|
33
|
+
getKbdKey: (value?: KbdKey | string) => string | undefined;
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { reactive, computed, onMounted } from "vue";
|
|
2
|
+
import { createSharedComposable } from "@vueuse/core";
|
|
3
|
+
export const kbdKeysMap = {
|
|
4
|
+
meta: "",
|
|
5
|
+
ctrl: "",
|
|
6
|
+
alt: "",
|
|
7
|
+
win: "\u229E",
|
|
8
|
+
command: "\u2318",
|
|
9
|
+
shift: "\u21E7",
|
|
10
|
+
option: "\u2325",
|
|
11
|
+
enter: "\u21B5",
|
|
12
|
+
delete: "\u2326",
|
|
13
|
+
backspace: "\u232B",
|
|
14
|
+
escape: "\u238B",
|
|
15
|
+
tab: "\u21E5",
|
|
16
|
+
capslock: "\u21EA",
|
|
17
|
+
arrowup: "\u2191",
|
|
18
|
+
arrowright: "\u2192",
|
|
19
|
+
arrowdown: "\u2193",
|
|
20
|
+
arrowleft: "\u2190",
|
|
21
|
+
pageup: "\u21DE",
|
|
22
|
+
pagedown: "\u21DF",
|
|
23
|
+
home: "\u2196",
|
|
24
|
+
end: "\u2198"
|
|
25
|
+
};
|
|
26
|
+
const _useKbd = () => {
|
|
27
|
+
const macOS = computed(() => import.meta.client && navigator && navigator.userAgent && navigator.userAgent.match(/Macintosh;/));
|
|
28
|
+
const kbdKeysSpecificMap = reactive({
|
|
29
|
+
meta: " ",
|
|
30
|
+
alt: " ",
|
|
31
|
+
ctrl: " "
|
|
32
|
+
});
|
|
33
|
+
onMounted(() => {
|
|
34
|
+
kbdKeysSpecificMap.meta = macOS.value ? kbdKeysMap.command : kbdKeysMap.win;
|
|
35
|
+
kbdKeysSpecificMap.alt = macOS.value ? kbdKeysMap.option : "alt";
|
|
36
|
+
kbdKeysSpecificMap.ctrl = macOS.value ? "\u2303" : "ctrl";
|
|
37
|
+
});
|
|
38
|
+
function getKbdKey(value) {
|
|
39
|
+
if (!value) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (["meta", "alt", "ctrl"].includes(value)) {
|
|
43
|
+
return kbdKeysSpecificMap[value];
|
|
44
|
+
}
|
|
45
|
+
return kbdKeysMap[value] || value.toUpperCase();
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
macOS,
|
|
49
|
+
getKbdKey
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export const useKbd = createSharedComposable(_useKbd);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { InjectionKey, Ref } from 'vue';
|
|
2
|
+
import type { Locale } from '../types/locale';
|
|
3
|
+
export declare const localeContextInjectionKey: InjectionKey<Ref<Locale | undefined>>;
|
|
4
|
+
export declare const useLocale: (localeOverrides?: Ref<Locale | undefined>) => import("../utils/locale").LocaleContext;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { computed, inject, ref } from "vue";
|
|
2
|
+
import { buildLocaleContext } from "../utils/locale.js";
|
|
3
|
+
import en from "../locale/en.js";
|
|
4
|
+
import { createSharedComposable } from "@vueuse/core";
|
|
5
|
+
export const localeContextInjectionKey = Symbol("bitrix24-ui.locale-context");
|
|
6
|
+
const _useLocale = (localeOverrides) => {
|
|
7
|
+
const locale = localeOverrides || inject(localeContextInjectionKey, ref());
|
|
8
|
+
return buildLocaleContext(computed(() => locale.value || en));
|
|
9
|
+
};
|
|
10
|
+
export const useLocale = createSharedComposable(_useLocale);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToastProps } from '../types';
|
|
2
|
+
export interface Toast extends Omit<ToastProps, 'defaultOpen'> {
|
|
3
|
+
id: string | number;
|
|
4
|
+
click?: (toast: Toast) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function useToast(): {
|
|
7
|
+
toasts: import("vue").Ref<Toast[], Toast[]>;
|
|
8
|
+
add: (toast: Partial<Toast>) => Promise<Toast>;
|
|
9
|
+
update: (id: string | number, toast: Omit<Partial<Toast>, "id">) => void;
|
|
10
|
+
remove: (id: string | number) => void;
|
|
11
|
+
clear: () => void;
|
|
12
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ref, nextTick } from "vue";
|
|
2
|
+
import { useState } from "#imports";
|
|
3
|
+
export function useToast() {
|
|
4
|
+
const toasts = useState("toasts", () => []);
|
|
5
|
+
const maxToasts = 12;
|
|
6
|
+
const running = ref(false);
|
|
7
|
+
const queue = [];
|
|
8
|
+
const generateId = () => `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
9
|
+
async function processQueue() {
|
|
10
|
+
if (running.value || queue.length === 0) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
running.value = true;
|
|
14
|
+
while (queue.length > 0) {
|
|
15
|
+
const toast = queue.shift();
|
|
16
|
+
await nextTick();
|
|
17
|
+
toasts.value = [...toasts.value, toast].slice(-1 * maxToasts);
|
|
18
|
+
}
|
|
19
|
+
running.value = false;
|
|
20
|
+
}
|
|
21
|
+
async function add(toast) {
|
|
22
|
+
const body = {
|
|
23
|
+
id: generateId(),
|
|
24
|
+
open: true,
|
|
25
|
+
...toast
|
|
26
|
+
};
|
|
27
|
+
queue.push(body);
|
|
28
|
+
await processQueue();
|
|
29
|
+
return body;
|
|
30
|
+
}
|
|
31
|
+
function update(id, toast) {
|
|
32
|
+
const index = toasts.value.findIndex((t) => t.id === id);
|
|
33
|
+
if (index !== -1) {
|
|
34
|
+
toasts.value[index] = {
|
|
35
|
+
...toasts.value[index],
|
|
36
|
+
...toast
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function remove(id) {
|
|
41
|
+
const index = toasts.value.findIndex((t) => t.id === id);
|
|
42
|
+
if (index !== -1) {
|
|
43
|
+
toasts.value[index] = {
|
|
44
|
+
...toasts.value[index],
|
|
45
|
+
open: false
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
toasts.value = toasts.value.filter((t) => t.id !== id);
|
|
50
|
+
}, 200);
|
|
51
|
+
}
|
|
52
|
+
function clear() {
|
|
53
|
+
toasts.value = [];
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
toasts,
|
|
57
|
+
add,
|
|
58
|
+
update,
|
|
59
|
+
remove,
|
|
60
|
+
clear
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
arrowLeft: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
3
|
+
arrowRight: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
4
|
+
check: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
5
|
+
chevronDoubleLeft: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
6
|
+
chevronDoubleRight: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
7
|
+
chevronDown: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
8
|
+
chevronLeft: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
9
|
+
chevronRight: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
10
|
+
chevronUp: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
11
|
+
close: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
12
|
+
ellipsis: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
13
|
+
external: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
14
|
+
loading: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
15
|
+
refresh: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
16
|
+
minus: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
17
|
+
plus: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
18
|
+
search: import("vue").FunctionalComponent<import("vue").HTMLAttributes & import("vue").VNodeProps, {}, any, {}>;
|
|
19
|
+
};
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import ArrowToTheLeftIcon from "@bitrix24/b24icons-vue/actions/ArrowToTheLeftIcon";
|
|
2
|
+
import ArrowToTheRightIcon from "@bitrix24/b24icons-vue/actions/ArrowToTheRightIcon";
|
|
3
|
+
import CheckIcon from "@bitrix24/b24icons-vue/main/CheckIcon";
|
|
4
|
+
import ChevronUpIcon from "@bitrix24/b24icons-vue/actions/ChevronUpIcon";
|
|
5
|
+
import ChevronDownIcon from "@bitrix24/b24icons-vue/actions/ChevronDownIcon";
|
|
6
|
+
import ChevronToTheLeftIcon from "@bitrix24/b24icons-vue/actions/ChevronToTheLeftIcon";
|
|
7
|
+
import ChevronToTheRightIcon from "@bitrix24/b24icons-vue/actions/ChevronToTheRightIcon";
|
|
8
|
+
import DoubleShevronsRightIcon from "@bitrix24/b24icons-vue/actions/DoubleShevronsRightIcon";
|
|
9
|
+
import Cross30Icon from "@bitrix24/b24icons-vue/actions/Cross30Icon";
|
|
10
|
+
import DotsIcon from "@bitrix24/b24icons-vue/button/DotsIcon";
|
|
11
|
+
import OpenIn50Icon from "@bitrix24/b24icons-vue/actions/OpenIn50Icon";
|
|
12
|
+
import Refresh6Icon from "@bitrix24/b24icons-vue/actions/Refresh6Icon";
|
|
13
|
+
import Minus30Icon from "@bitrix24/b24icons-vue/actions/Minus30Icon";
|
|
14
|
+
import Plus30Icon from "@bitrix24/b24icons-vue/actions/Plus30Icon";
|
|
15
|
+
import Search2Icon from "@bitrix24/b24icons-vue/main/Search2Icon";
|
|
16
|
+
import LoaderWaitIcon from "@bitrix24/b24icons-vue/animated/LoaderWaitIcon";
|
|
17
|
+
export default {
|
|
18
|
+
arrowLeft: ArrowToTheLeftIcon,
|
|
19
|
+
arrowRight: ArrowToTheRightIcon,
|
|
20
|
+
check: CheckIcon,
|
|
21
|
+
chevronDoubleLeft: ChevronToTheLeftIcon,
|
|
22
|
+
chevronDoubleRight: DoubleShevronsRightIcon,
|
|
23
|
+
chevronDown: ChevronDownIcon,
|
|
24
|
+
chevronLeft: ChevronToTheLeftIcon,
|
|
25
|
+
chevronRight: ChevronToTheRightIcon,
|
|
26
|
+
chevronUp: ChevronUpIcon,
|
|
27
|
+
close: Cross30Icon,
|
|
28
|
+
ellipsis: DotsIcon,
|
|
29
|
+
external: OpenIn50Icon,
|
|
30
|
+
loading: LoaderWaitIcon,
|
|
31
|
+
refresh: Refresh6Icon,
|
|
32
|
+
minus: Minus30Icon,
|
|
33
|
+
plus: Plus30Icon,
|
|
34
|
+
search: Search2Icon
|
|
35
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@plugin "@bitrix24/b24style";@import "./keyframes.css";@variant light (&:where(.light, .light *));@variant dark (&:where(.dark, .dark *));@layer base{body{@apply antialiased scheme-light dark:scheme-dark}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@keyframes accordion-up{0%{height:var(--reka-accordion-content-height)}to{height:0}}@keyframes accordion-down{0%{height:0}to{height:var(--reka-accordion-content-height)}}@keyframes collapsible-up{0%{height:var(--reka-collapsible-content-height)}to{height:0}}@keyframes collapsible-down{0%{height:0}to{height:var(--reka-collapsible-content-height)}}@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:30%}0%{transform:translateX(-100%)}to{transform:translateX(370%)}}@keyframes carousel-rtl{0%,to{width:30%}0%{transform:translateX(100%)}to{transform:translateX(-370%)}}@keyframes carousel-vertical{0%,to{height:30%}0%{transform:translateY(-100%)}to{transform:translateY(370%)}}@keyframes carousel-inverse{0%,to{width:30%}0%{transform:translateX(370%)}to{transform:translateX(-100%)}}@keyframes carousel-inverse-rtl{0%,to{width:30%}0%{transform:translateX(-370%)}to{transform:translateX(100%)}}@keyframes carousel-inverse-vertical{0%,to{height:30%}0%{transform:translateY(370%)}to{transform:translateY(-100%)}}@keyframes swing{0%,to{width:30%}0%,to{transform:translateX(-25%)}50%{transform:translateX(275%)}}@keyframes swing-vertical{0%,to{height:30%}0%,to{transform:translateY(-25%)}50%{transform:translateY(275%)}}@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 progressbar-loading{0%,to{width:30%}0%{transform:translateX(-200%)}50%{transform:translateX(350%)}to{transform:translateX(-200%)}}@keyframes progressbar-loading-vertical{0%,to{height:30%}0%{transform:translateY(-200%)}50%{transform:translateY(350%)}to{transform:translateY(-200%)}}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { defineLocale } from "../composables/defineLocale.js";
|
|
2
|
+
export default defineLocale({
|
|
3
|
+
name: "English",
|
|
4
|
+
code: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
inputMenu: {
|
|
7
|
+
noMatch: "No matching data",
|
|
8
|
+
noData: "No data",
|
|
9
|
+
create: 'Create "{label}"'
|
|
10
|
+
},
|
|
11
|
+
inputNumber: {
|
|
12
|
+
increment: "Increment",
|
|
13
|
+
decrement: "Decrement"
|
|
14
|
+
},
|
|
15
|
+
commandPalette: {
|
|
16
|
+
placeholder: "Type a command or search...",
|
|
17
|
+
noMatch: "No matching data",
|
|
18
|
+
noData: "No data",
|
|
19
|
+
close: "Close"
|
|
20
|
+
},
|
|
21
|
+
selectMenu: {
|
|
22
|
+
noMatch: "No matching data",
|
|
23
|
+
noData: "No data",
|
|
24
|
+
create: 'Create "{label}"',
|
|
25
|
+
search: "Search..."
|
|
26
|
+
},
|
|
27
|
+
toast: {
|
|
28
|
+
close: "Close"
|
|
29
|
+
},
|
|
30
|
+
carousel: {
|
|
31
|
+
prev: "Prev",
|
|
32
|
+
next: "Next",
|
|
33
|
+
goto: "Go to slide {slide}"
|
|
34
|
+
},
|
|
35
|
+
modal: {
|
|
36
|
+
close: "Close"
|
|
37
|
+
},
|
|
38
|
+
slideover: {
|
|
39
|
+
close: "Close"
|
|
40
|
+
},
|
|
41
|
+
alert: {
|
|
42
|
+
close: "Close"
|
|
43
|
+
},
|
|
44
|
+
table: {
|
|
45
|
+
noData: "No data"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { defineLocale } from "../composables/defineLocale.js";
|
|
2
|
+
export default defineLocale({
|
|
3
|
+
name: "Espa\xF1ol",
|
|
4
|
+
code: "es",
|
|
5
|
+
messages: {
|
|
6
|
+
inputMenu: {
|
|
7
|
+
noMatch: "No hay datos coincidentes",
|
|
8
|
+
noData: "Sin datos",
|
|
9
|
+
create: 'Crear "{label}"'
|
|
10
|
+
},
|
|
11
|
+
inputNumber: {
|
|
12
|
+
increment: "Incremento",
|
|
13
|
+
decrement: "Decremento"
|
|
14
|
+
},
|
|
15
|
+
commandPalette: {
|
|
16
|
+
placeholder: "Escribe un comando o busca...",
|
|
17
|
+
noMatch: "No hay datos coincidentes",
|
|
18
|
+
noData: "Sin datos",
|
|
19
|
+
close: "Cerrar"
|
|
20
|
+
},
|
|
21
|
+
selectMenu: {
|
|
22
|
+
noMatch: "No hay datos coincidentes",
|
|
23
|
+
noData: "Sin datos",
|
|
24
|
+
create: 'Crear "{label}"',
|
|
25
|
+
search: "Buscar..."
|
|
26
|
+
},
|
|
27
|
+
toast: {
|
|
28
|
+
close: "Cerrar"
|
|
29
|
+
},
|
|
30
|
+
carousel: {
|
|
31
|
+
prev: "Anterior",
|
|
32
|
+
next: "Siguiente",
|
|
33
|
+
goto: "Ir a la diapositiva {slide}"
|
|
34
|
+
},
|
|
35
|
+
modal: {
|
|
36
|
+
close: "Cerrar"
|
|
37
|
+
},
|
|
38
|
+
slideover: {
|
|
39
|
+
close: "Cerrar"
|
|
40
|
+
},
|
|
41
|
+
alert: {
|
|
42
|
+
close: "Cerrar"
|
|
43
|
+
},
|
|
44
|
+
table: {
|
|
45
|
+
noData: "Sin datos"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { defineLocale } from "../composables/defineLocale.js";
|
|
2
|
+
export default defineLocale({
|
|
3
|
+
name: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439",
|
|
4
|
+
code: "ru",
|
|
5
|
+
messages: {
|
|
6
|
+
inputMenu: {
|
|
7
|
+
noMatch: "\u0421\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E",
|
|
8
|
+
noData: "\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445",
|
|
9
|
+
create: '\u0421\u043E\u0437\u0434\u0430\u0442\u044C "{label}"'
|
|
10
|
+
},
|
|
11
|
+
inputNumber: {
|
|
12
|
+
increment: "\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C",
|
|
13
|
+
decrement: "\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C"
|
|
14
|
+
},
|
|
15
|
+
commandPalette: {
|
|
16
|
+
placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0438\u043B\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u0438\u0441\u043A...",
|
|
17
|
+
noMatch: "\u0421\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E",
|
|
18
|
+
noData: "\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445",
|
|
19
|
+
close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"
|
|
20
|
+
},
|
|
21
|
+
selectMenu: {
|
|
22
|
+
noMatch: "\u0421\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E",
|
|
23
|
+
noData: "\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445",
|
|
24
|
+
create: '\u0421\u043E\u0437\u0434\u0430\u0442\u044C "{label}"',
|
|
25
|
+
search: "\u041F\u043E\u0438\u0441\u043A..."
|
|
26
|
+
},
|
|
27
|
+
toast: {
|
|
28
|
+
close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"
|
|
29
|
+
},
|
|
30
|
+
carousel: {
|
|
31
|
+
prev: "\u041D\u0430\u0437\u0430\u0434",
|
|
32
|
+
next: "\u0414\u0430\u043B\u0435\u0435",
|
|
33
|
+
goto: "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A {slide}"
|
|
34
|
+
},
|
|
35
|
+
modal: {
|
|
36
|
+
close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"
|
|
37
|
+
},
|
|
38
|
+
slideover: {
|
|
39
|
+
close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"
|
|
40
|
+
},
|
|
41
|
+
alert: {
|
|
42
|
+
close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"
|
|
43
|
+
},
|
|
44
|
+
table: {
|
|
45
|
+
noData: "\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { computed } from "vue";
|
|
2
|
+
import {
|
|
3
|
+
defineNuxtPlugin,
|
|
4
|
+
useNuxtApp,
|
|
5
|
+
useHead
|
|
6
|
+
} from "#imports";
|
|
7
|
+
export default defineNuxtPlugin(() => {
|
|
8
|
+
const nuxtApp = useNuxtApp();
|
|
9
|
+
const root = computed(() => {
|
|
10
|
+
return `@layer base {
|
|
11
|
+
:root {
|
|
12
|
+
${[].join("\n ")}
|
|
13
|
+
}
|
|
14
|
+
:root, .light {
|
|
15
|
+
${[].join("\n ")}
|
|
16
|
+
}
|
|
17
|
+
.dark {
|
|
18
|
+
${[].join("\n ")}
|
|
19
|
+
}
|
|
20
|
+
}`;
|
|
21
|
+
});
|
|
22
|
+
const headData = {
|
|
23
|
+
style: [{
|
|
24
|
+
innerHTML: () => root.value,
|
|
25
|
+
tagPriority: -2,
|
|
26
|
+
id: "bitrix24-ui-colors",
|
|
27
|
+
type: "text/css"
|
|
28
|
+
}]
|
|
29
|
+
};
|
|
30
|
+
if (import.meta.client && nuxtApp.isHydrating && !nuxtApp.payload.serverRendered) {
|
|
31
|
+
const style = document.createElement("style");
|
|
32
|
+
style.innerHTML = root.value;
|
|
33
|
+
style.setAttribute("data-bitrix24-ui-colors", "");
|
|
34
|
+
document.head.appendChild(style);
|
|
35
|
+
headData.script = [{
|
|
36
|
+
innerHTML: "document.head.removeChild(document.querySelector('[data-bitrix24-ui-colors]'))"
|
|
37
|
+
}];
|
|
38
|
+
}
|
|
39
|
+
useHead(headData);
|
|
40
|
+
});
|