@nuxt/ui 4.8.1 → 4.9.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 (101) hide show
  1. package/dist/module.d.mts +7 -0
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +2 -2
  4. package/dist/runtime/components/Avatar.vue +1 -1
  5. package/dist/runtime/components/Banner.vue +0 -1
  6. package/dist/runtime/components/BlogPost.vue +8 -10
  7. package/dist/runtime/components/Calendar.d.vue.ts +42 -6
  8. package/dist/runtime/components/Calendar.vue +180 -61
  9. package/dist/runtime/components/Calendar.vue.d.ts +42 -6
  10. package/dist/runtime/components/ChatMessages.d.vue.ts +7 -3
  11. package/dist/runtime/components/ChatMessages.vue +4 -1
  12. package/dist/runtime/components/ChatMessages.vue.d.ts +7 -3
  13. package/dist/runtime/components/ChatPrompt.vue +8 -2
  14. package/dist/runtime/components/ChatPromptSubmit.d.vue.ts +2 -2
  15. package/dist/runtime/components/ChatPromptSubmit.vue +2 -2
  16. package/dist/runtime/components/ChatPromptSubmit.vue.d.ts +2 -2
  17. package/dist/runtime/components/CommandPalette.d.vue.ts +2 -2
  18. package/dist/runtime/components/CommandPalette.vue +10 -4
  19. package/dist/runtime/components/CommandPalette.vue.d.ts +2 -2
  20. package/dist/runtime/components/DashboardSearch.d.vue.ts +7 -1
  21. package/dist/runtime/components/DashboardSearch.vue +9 -2
  22. package/dist/runtime/components/DashboardSearch.vue.d.ts +7 -1
  23. package/dist/runtime/components/DashboardSearchButton.d.vue.ts +2 -2
  24. package/dist/runtime/components/DashboardSearchButton.vue +2 -2
  25. package/dist/runtime/components/DashboardSearchButton.vue.d.ts +2 -2
  26. package/dist/runtime/components/FileUpload.d.vue.ts +5 -2
  27. package/dist/runtime/components/FileUpload.vue +8 -6
  28. package/dist/runtime/components/FileUpload.vue.d.ts +5 -2
  29. package/dist/runtime/components/Form.d.vue.ts +3 -3
  30. package/dist/runtime/components/Form.vue +2 -1
  31. package/dist/runtime/components/Form.vue.d.ts +3 -3
  32. package/dist/runtime/components/InputDate.d.vue.ts +2 -2
  33. package/dist/runtime/components/InputDate.vue +1 -0
  34. package/dist/runtime/components/InputDate.vue.d.ts +2 -2
  35. package/dist/runtime/components/InputMenu.vue +12 -1
  36. package/dist/runtime/components/InputNumber.d.vue.ts +1 -1
  37. package/dist/runtime/components/InputNumber.vue +3 -2
  38. package/dist/runtime/components/InputNumber.vue.d.ts +1 -1
  39. package/dist/runtime/components/InputTime.d.vue.ts +2 -2
  40. package/dist/runtime/components/InputTime.vue +1 -0
  41. package/dist/runtime/components/InputTime.vue.d.ts +2 -2
  42. package/dist/runtime/components/Link.d.vue.ts +1 -0
  43. package/dist/runtime/components/Link.vue +1 -1
  44. package/dist/runtime/components/Link.vue.d.ts +1 -0
  45. package/dist/runtime/components/LinkBase.d.vue.ts +1 -1
  46. package/dist/runtime/components/LinkBase.vue +1 -1
  47. package/dist/runtime/components/LinkBase.vue.d.ts +1 -1
  48. package/dist/runtime/components/Modal.d.vue.ts +6 -0
  49. package/dist/runtime/components/Modal.vue +3 -1
  50. package/dist/runtime/components/Modal.vue.d.ts +6 -0
  51. package/dist/runtime/components/PinInput.d.vue.ts +14 -2
  52. package/dist/runtime/components/PinInput.vue +36 -11
  53. package/dist/runtime/components/PinInput.vue.d.ts +14 -2
  54. package/dist/runtime/components/Popover.d.vue.ts +2 -0
  55. package/dist/runtime/components/Popover.vue +2 -2
  56. package/dist/runtime/components/Popover.vue.d.ts +2 -0
  57. package/dist/runtime/components/ScrollArea.d.vue.ts +8 -0
  58. package/dist/runtime/components/ScrollArea.vue +10 -0
  59. package/dist/runtime/components/ScrollArea.vue.d.ts +8 -0
  60. package/dist/runtime/components/Select.vue +8 -1
  61. package/dist/runtime/components/SelectMenu.vue +23 -5
  62. package/dist/runtime/components/Sidebar.d.vue.ts +5 -0
  63. package/dist/runtime/components/Sidebar.vue +3 -1
  64. package/dist/runtime/components/Sidebar.vue.d.ts +5 -0
  65. package/dist/runtime/components/Slideover.d.vue.ts +6 -0
  66. package/dist/runtime/components/Slideover.vue +3 -1
  67. package/dist/runtime/components/Slideover.vue.d.ts +6 -0
  68. package/dist/runtime/components/Toast.d.vue.ts +8 -1
  69. package/dist/runtime/components/Toast.vue +5 -5
  70. package/dist/runtime/components/Toast.vue.d.ts +8 -1
  71. package/dist/runtime/components/content/ContentSearch.d.vue.ts +7 -1
  72. package/dist/runtime/components/content/ContentSearch.vue +9 -2
  73. package/dist/runtime/components/content/ContentSearch.vue.d.ts +7 -1
  74. package/dist/runtime/components/content/ContentSearchButton.d.vue.ts +2 -2
  75. package/dist/runtime/components/content/ContentSearchButton.vue +2 -2
  76. package/dist/runtime/components/content/ContentSearchButton.vue.d.ts +2 -2
  77. package/dist/runtime/components/prose/Kbd.d.vue.ts +2 -1
  78. package/dist/runtime/components/prose/Kbd.vue.d.ts +2 -1
  79. package/dist/runtime/components/prose/Pre.vue +0 -1
  80. package/dist/runtime/composables/index.d.ts +1 -0
  81. package/dist/runtime/composables/index.js +1 -0
  82. package/dist/runtime/composables/useComponentProps.d.ts +3 -3
  83. package/dist/runtime/composables/useTour.d.ts +80 -0
  84. package/dist/runtime/composables/useTour.js +102 -0
  85. package/dist/runtime/index.css +1 -1
  86. package/dist/runtime/keyframes.css +1 -1
  87. package/dist/runtime/locale/index.d.ts +1 -0
  88. package/dist/runtime/locale/index.js +1 -0
  89. package/dist/runtime/locale/lv.d.ts +3 -0
  90. package/dist/runtime/locale/lv.js +152 -0
  91. package/dist/runtime/plugins/colors.js +5 -4
  92. package/dist/runtime/types/tv.d.ts +15 -3
  93. package/dist/runtime/utils/tv.d.ts +41 -1
  94. package/dist/runtime/utils/tv.js +91 -2
  95. package/dist/runtime/vue/stubs/base.d.ts +1 -1
  96. package/dist/runtime/vue/stubs/base.js +1 -1
  97. package/dist/shared/{ui.BzjkAvk7.mjs → ui.BfHSFiIO.mjs} +377 -234
  98. package/dist/unplugin.d.mts +8 -0
  99. package/dist/unplugin.mjs +2 -2
  100. package/dist/vite.mjs +1 -1
  101. package/package.json +61 -44
@@ -57,7 +57,9 @@ export interface SlideoverProps extends DialogRootProps {
57
57
  ui?: Slideover['slots'];
58
58
  }
59
59
  export interface SlideoverEmits extends DialogRootEmits {
60
+ 'leave': [];
60
61
  'after:leave': [];
62
+ 'enter': [];
61
63
  'after:enter': [];
62
64
  'close:prevent': [];
63
65
  }
@@ -87,13 +89,17 @@ export interface SlideoverSlots {
87
89
  declare const _default: typeof __VLS_export;
88
90
  export default _default;
89
91
  declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<SlideoverProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
92
+ enter: () => any;
90
93
  "update:open": (value: boolean) => any;
91
94
  "after:leave": () => any;
95
+ leave: () => any;
92
96
  "after:enter": () => any;
93
97
  "close:prevent": () => any;
94
98
  }, string, import("vue").PublicProps, Readonly<SlideoverProps> & Readonly<{
99
+ onEnter?: (() => any) | undefined;
95
100
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
96
101
  "onAfter:leave"?: (() => any) | undefined;
102
+ onLeave?: (() => any) | undefined;
97
103
  "onAfter:enter"?: (() => any) | undefined;
98
104
  "onClose:prevent"?: (() => any) | undefined;
99
105
  }>, {
@@ -6,7 +6,7 @@ import type { AvatarProps, ButtonProps, IconProps, ProgressProps, LinkPropsKeys
6
6
  import type { StringOrVNode } from '../types/utils';
7
7
  import type { ComponentConfig } from '../types/tv';
8
8
  type Toast = ComponentConfig<typeof theme, AppConfig, 'toast'>;
9
- export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type' | 'duration'> {
9
+ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type'> {
10
10
  /**
11
11
  * The element or component this component should render as.
12
12
  * @defaultValue 'li'
@@ -47,6 +47,13 @@ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open'
47
47
  * `{ size: 'xs' }`{lang="ts-type"}
48
48
  */
49
49
  actions?: ButtonProps[];
50
+ /**
51
+ * The time in milliseconds before the toast automatically closes. Overrides the global `toaster.duration`.
52
+ *
53
+ * Set to `0` to keep the toast open until it's manually closed.
54
+ * @defaultValue 5000
55
+ */
56
+ duration?: number;
50
57
  /**
51
58
  * Display a progress bar showing the toast's remaining duration.
52
59
  * `{ size: 'sm' }`{lang="ts-type"}
@@ -26,13 +26,13 @@ const _props = defineProps({
26
26
  close: { type: [Boolean, Object], required: false, default: true },
27
27
  closeIcon: { type: null, required: false },
28
28
  actions: { type: Array, required: false },
29
+ duration: { type: Number, required: false },
29
30
  progress: { type: [Boolean, Object], required: false, default: true },
30
31
  class: { type: null, required: false },
31
32
  ui: { type: Object, required: false },
32
33
  defaultOpen: { type: Boolean, required: false },
33
34
  open: { type: Boolean, required: false },
34
- type: { type: String, required: false },
35
- duration: { type: Number, required: false }
35
+ type: { type: String, required: false }
36
36
  });
37
37
  const emits = defineEmits(["escapeKeyDown", "pause", "resume", "swipeStart", "swipeMove", "swipeCancel", "swipeEnd", "update:open"]);
38
38
  const slots = defineSlots();
@@ -61,7 +61,7 @@ defineExpose({
61
61
  <template>
62
62
  <ToastRoot
63
63
  ref="rootRef"
64
- v-slot="{ remaining, duration, open }"
64
+ v-slot="{ remaining, duration: totalDuration, open }"
65
65
  v-bind="rootProps"
66
66
  :data-orientation="props.orientation"
67
67
  data-slot="root"
@@ -129,8 +129,8 @@ defineExpose({
129
129
  </div>
130
130
 
131
131
  <UProgress
132
- v-if="props.progress && open && remaining > 0 && duration"
133
- :model-value="remaining / duration * 100"
132
+ v-if="props.progress && open && remaining > 0 && totalDuration"
133
+ :model-value="remaining / totalDuration * 100"
134
134
  :color="props.color"
135
135
  v-bind="typeof props.progress === 'object' ? props.progress : {}"
136
136
  size="sm"
@@ -6,7 +6,7 @@ import type { AvatarProps, ButtonProps, IconProps, ProgressProps, LinkPropsKeys
6
6
  import type { StringOrVNode } from '../types/utils';
7
7
  import type { ComponentConfig } from '../types/tv';
8
8
  type Toast = ComponentConfig<typeof theme, AppConfig, 'toast'>;
9
- export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type' | 'duration'> {
9
+ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type'> {
10
10
  /**
11
11
  * The element or component this component should render as.
12
12
  * @defaultValue 'li'
@@ -47,6 +47,13 @@ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open'
47
47
  * `{ size: 'xs' }`{lang="ts-type"}
48
48
  */
49
49
  actions?: ButtonProps[];
50
+ /**
51
+ * The time in milliseconds before the toast automatically closes. Overrides the global `toaster.duration`.
52
+ *
53
+ * Set to `0` to keep the toast open until it's manually closed.
54
+ * @defaultValue 5000
55
+ */
56
+ duration?: number;
50
57
  /**
51
58
  * Display a progress bar showing the toast's remaining duration.
52
59
  * `{ size: 'sm' }`{lang="ts-type"}
@@ -3,7 +3,7 @@ import type { ContentNavigationItem } from '@nuxt/content';
3
3
  import type { AppConfig } from '@nuxt/schema';
4
4
  import type { UseFuseOptions } from '@vueuse/integrations/useFuse';
5
5
  import theme from '#build/ui/content/content-search';
6
- import type { ButtonProps, LinkProps, ModalProps, CommandPaletteProps, CommandPaletteSlots, CommandPaletteGroup, CommandPaletteItem, IconProps, LinkPropsKeys } from '../../types';
6
+ import type { ButtonProps, LinkProps, ModalProps, CommandPaletteProps, CommandPaletteSlots, CommandPaletteGroup, CommandPaletteItem, IconProps, InputProps, LinkPropsKeys } from '../../types';
7
7
  import type { ComponentConfig } from '../../types/tv';
8
8
  type ContentSearch = ComponentConfig<typeof theme, AppConfig, 'contentSearch'>;
9
9
  export interface ContentSearchLink extends Omit<LinkProps, 'custom'> {
@@ -56,6 +56,12 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
56
56
  * @defaultValue true
57
57
  */
58
58
  close?: boolean | Omit<ButtonProps, LinkPropsKeys>;
59
+ /**
60
+ * Configure the input or hide it with `false`.
61
+ * `{ fixed: true }`{lang="ts-type"}
62
+ * @defaultValue true
63
+ */
64
+ input?: boolean | Omit<InputProps, 'modelValue' | 'defaultValue'>;
59
65
  /**
60
66
  * Keyboard shortcut to open the search (used by [`defineShortcuts`](https://ui.nuxt.com/docs/composables/define-shortcuts))
61
67
  * @defaultValue 'meta_k'
@@ -18,6 +18,7 @@ import UCommandPalette from "../CommandPalette.vue";
18
18
  const _props = defineProps({
19
19
  size: { type: null, required: false },
20
20
  close: { type: [Boolean, Object], required: false, default: true },
21
+ input: { type: [Boolean, Object], required: false },
21
22
  shortcut: { type: String, required: false, default: "meta_k" },
22
23
  links: { type: Array, required: false },
23
24
  navigation: { type: Array, required: false },
@@ -38,7 +39,7 @@ const _props = defineProps({
38
39
  fullscreen: { type: Boolean, required: false, default: false },
39
40
  modal: { type: Boolean, required: false },
40
41
  portal: { type: [Boolean, String], required: false, skipCheck: true },
41
- icon: { type: null, required: false },
42
+ icon: { type: [String, Boolean], required: false, skipCheck: true },
42
43
  trailingIcon: { type: null, required: false },
43
44
  selectedIcon: { type: null, required: false },
44
45
  childrenIcon: { type: null, required: false },
@@ -66,6 +67,12 @@ const colorMode = useColorMode();
66
67
  const appConfig = useAppConfig();
67
68
  const commandPaletteProps = useForwardProps(reactivePick(props, "size", "icon", "trailingIcon", "selectedIcon", "childrenIcon", "placeholder", "autofocus", "loading", "loadingIcon", "close", "closeIcon", "back", "backIcon", "disabled", "highlightOnHover", "labelKey", "descriptionKey", "preserveGroupOrder", "virtualize", "searchDelay"));
68
69
  const modalProps = useForwardProps(reactivePick(props, "overlay", "transition", "content", "dismissible", "fullscreen", "modal", "portal"));
70
+ const inputProps = computed(() => {
71
+ if (props.input === false) {
72
+ return false;
73
+ }
74
+ return defu(typeof props.input === "object" ? props.input : {}, { fixed: true });
75
+ });
69
76
  const getProxySlots = () => omit(slots, ["content"]);
70
77
  const fuse = computed(() => defu({}, props.fuse, {
71
78
  fuseOptions: {
@@ -220,7 +227,7 @@ defineExpose({
220
227
  v-bind="commandPaletteProps"
221
228
  :groups="groups"
222
229
  :fuse="fuse"
223
- :input="{ fixed: true }"
230
+ :input="inputProps"
224
231
  :ui="transformUI(omit(ui, ['modal']), props.ui)"
225
232
  @update:model-value="onSelect"
226
233
  @update:open="open = $event"
@@ -3,7 +3,7 @@ import type { ContentNavigationItem } from '@nuxt/content';
3
3
  import type { AppConfig } from '@nuxt/schema';
4
4
  import type { UseFuseOptions } from '@vueuse/integrations/useFuse';
5
5
  import theme from '#build/ui/content/content-search';
6
- import type { ButtonProps, LinkProps, ModalProps, CommandPaletteProps, CommandPaletteSlots, CommandPaletteGroup, CommandPaletteItem, IconProps, LinkPropsKeys } from '../../types';
6
+ import type { ButtonProps, LinkProps, ModalProps, CommandPaletteProps, CommandPaletteSlots, CommandPaletteGroup, CommandPaletteItem, IconProps, InputProps, LinkPropsKeys } from '../../types';
7
7
  import type { ComponentConfig } from '../../types/tv';
8
8
  type ContentSearch = ComponentConfig<typeof theme, AppConfig, 'contentSearch'>;
9
9
  export interface ContentSearchLink extends Omit<LinkProps, 'custom'> {
@@ -56,6 +56,12 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
56
56
  * @defaultValue true
57
57
  */
58
58
  close?: boolean | Omit<ButtonProps, LinkPropsKeys>;
59
+ /**
60
+ * Configure the input or hide it with `false`.
61
+ * `{ fixed: true }`{lang="ts-type"}
62
+ * @defaultValue true
63
+ */
64
+ input?: boolean | Omit<InputProps, 'modelValue' | 'defaultValue'>;
59
65
  /**
60
66
  * Keyboard shortcut to open the search (used by [`defineShortcuts`](https://ui.nuxt.com/docs/composables/define-shortcuts))
61
67
  * @defaultValue 'meta_k'
@@ -5,11 +5,11 @@ import type { ComponentConfig } from '../../types/tv';
5
5
  type ContentSearchButton = ComponentConfig<typeof theme, AppConfig, 'contentSearchButton'>;
6
6
  export interface ContentSearchButtonProps extends Omit<ButtonProps, LinkPropsKeys | 'icon' | 'label' | 'color' | 'variant'> {
7
7
  /**
8
- * The icon displayed in the button.
8
+ * The icon displayed in the button. Set to `false` to hide the icon.
9
9
  * @defaultValue appConfig.ui.icons.search
10
10
  * @IconifyIcon
11
11
  */
12
- icon?: IconProps['name'];
12
+ icon?: IconProps['name'] | false;
13
13
  /**
14
14
  * The label displayed in the button.
15
15
  * @defaultValue t('contentSearchButton.label')
@@ -18,7 +18,7 @@ import UKbd from "../Kbd.vue";
18
18
  import UTooltip from "../Tooltip.vue";
19
19
  defineOptions({ inheritAttrs: false });
20
20
  const _props = defineProps({
21
- icon: { type: null, required: false },
21
+ icon: { type: [String, Boolean], required: false, skipCheck: true },
22
22
  label: { type: String, required: false },
23
23
  color: { type: null, required: false, default: "neutral" },
24
24
  variant: { type: null, required: false },
@@ -64,7 +64,7 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearch
64
64
  <template>
65
65
  <DefineButtonTemplate>
66
66
  <UButton
67
- :icon="props.icon || appConfig.ui.icons.search"
67
+ :icon="props.icon === false ? void 0 : props.icon ?? appConfig.ui.icons.search"
68
68
  :label="props.label || t('contentSearchButton.label')"
69
69
  :variant="props.variant || (props.collapsed ? 'ghost' : 'outline')"
70
70
  v-bind="{
@@ -5,11 +5,11 @@ import type { ComponentConfig } from '../../types/tv';
5
5
  type ContentSearchButton = ComponentConfig<typeof theme, AppConfig, 'contentSearchButton'>;
6
6
  export interface ContentSearchButtonProps extends Omit<ButtonProps, LinkPropsKeys | 'icon' | 'label' | 'color' | 'variant'> {
7
7
  /**
8
- * The icon displayed in the button.
8
+ * The icon displayed in the button. Set to `false` to hide the icon.
9
9
  * @defaultValue appConfig.ui.icons.search
10
10
  * @IconifyIcon
11
11
  */
12
- icon?: IconProps['name'];
12
+ icon?: IconProps['name'] | false;
13
13
  /**
14
14
  * The label displayed in the button.
15
15
  * @defaultValue t('contentSearchButton.label')
@@ -1,3 +1,4 @@
1
+ import type { VNode } from 'vue';
1
2
  export interface ProseKbdProps {
2
3
  value?: string;
3
4
  class?: any;
@@ -6,7 +7,7 @@ export interface ProseKbdProps {
6
7
  };
7
8
  }
8
9
  export interface ProseKbdSlots {
9
- default?(props?: {}): any;
10
+ default?(props?: {}): VNode[];
10
11
  }
11
12
  declare const _default: typeof __VLS_export;
12
13
  export default _default;
@@ -1,3 +1,4 @@
1
+ import type { VNode } from 'vue';
1
2
  export interface ProseKbdProps {
2
3
  value?: string;
3
4
  class?: any;
@@ -6,7 +7,7 @@ export interface ProseKbdProps {
6
7
  };
7
8
  }
8
9
  export interface ProseKbdSlots {
9
- default?(props?: {}): any;
10
+ default?(props?: {}): VNode[];
10
11
  }
11
12
  declare const _default: typeof __VLS_export;
12
13
  export default _default;
@@ -50,7 +50,6 @@ function copyCode() {
50
50
  size="sm"
51
51
  :aria-label="t('prose.pre.copy')"
52
52
  :class="ui.copy({ class: props.ui?.copy })"
53
- tabindex="-1"
54
53
  @click="copyCode"
55
54
  />
56
55
 
@@ -18,3 +18,4 @@ export * from './useResizable';
18
18
  export * from './useScrollShadow';
19
19
  export * from './useScrollspy';
20
20
  export * from './useToast';
21
+ export * from './useTour';
@@ -18,3 +18,4 @@ export * from "./useResizable.js";
18
18
  export * from "./useScrollShadow.js";
19
19
  export * from "./useScrollspy.js";
20
20
  export * from "./useToast.js";
21
+ export * from "./useTour.js";
@@ -1,13 +1,13 @@
1
1
  import type { ComputedRef } from 'vue';
2
- import type { ClassValue } from 'tailwind-variants';
3
2
  import type * as ComponentTypes from '../types';
3
+ import type { SlotClass } from '../types/tv';
4
4
  import type * as ui from '#build/ui';
5
5
  type ThemeSlotOverrides<T> = T extends {
6
6
  slots: infer S extends Record<string, any>;
7
7
  } ? {
8
- [K in keyof S]?: ClassValue;
8
+ [K in keyof S]?: SlotClass;
9
9
  } : {
10
- [K in keyof T]?: T[K] extends any[] ? ClassValue : T[K] extends Record<string, any> ? ThemeSlotOverrides<T[K]> : ClassValue;
10
+ [K in keyof T]?: T[K] extends any[] ? SlotClass : T[K] extends Record<string, any> ? ThemeSlotOverrides<T[K]> : SlotClass;
11
11
  };
12
12
  /**
13
13
  * Flat slot-class override shape: `{ button: { base: '...' }, modal: {...} }`.
@@ -0,0 +1,80 @@
1
+ import type { MaybeRefOrGetter, Ref, ComputedRef } from 'vue';
2
+ import type { ReferenceElement } from 'reka-ui';
3
+ export interface TourStep {
4
+ /**
5
+ * The element this step points to. Accepts:
6
+ * - a CSS selector (`'#id'`, `'.class'`, or a bare id resolved as `#id`)
7
+ * - an element or a virtual element (anything with `getBoundingClientRect`)
8
+ * - a ref or a getter returning any of the above
9
+ *
10
+ * Omit or pass `null` to anchor the step to the center of the viewport
11
+ * (useful for intro / summary steps with no target).
12
+ */
13
+ target?: MaybeRefOrGetter<string | ReferenceElement | null | undefined>;
14
+ /**
15
+ * Any other fields (title, body, side, …) are passed through untouched
16
+ * and available via `current` — you own the rendering and copy.
17
+ */
18
+ [key: string]: any;
19
+ }
20
+ export interface UseTourOptions {
21
+ /**
22
+ * The step index the tour starts on.
23
+ * @defaultValue 0
24
+ */
25
+ initialStep?: number;
26
+ /**
27
+ * Loop back to the first step after the last one.
28
+ * @defaultValue false
29
+ */
30
+ loop?: boolean;
31
+ /**
32
+ * Scroll the target into view when a step becomes active.
33
+ * @defaultValue true
34
+ */
35
+ scrollIntoView?: boolean | ScrollIntoViewOptions;
36
+ }
37
+ export interface UseTourReturn {
38
+ /** Whether the tour is currently open. */
39
+ open: Ref<boolean>;
40
+ /** The current step index (clamped to the steps range). */
41
+ index: Ref<number>;
42
+ /** The current step object, or `undefined` when there are no steps. */
43
+ current: ComputedRef<TourStep | undefined>;
44
+ /** The resolved anchor for the current step, to pass to `<UPopover :reference>`. */
45
+ reference: ComputedRef<ReferenceElement | undefined>;
46
+ /** Total number of steps. */
47
+ total: ComputedRef<number>;
48
+ /** Whether a next step exists. */
49
+ hasNext: ComputedRef<boolean>;
50
+ /** Whether a previous step exists. */
51
+ hasPrev: ComputedRef<boolean>;
52
+ /** Open the tour, optionally at a given index. */
53
+ start: (index?: number) => void;
54
+ /** Go to the next step (loops or finishes at the end depending on `loop`). */
55
+ next: () => void;
56
+ /** Go to the previous step. */
57
+ prev: () => void;
58
+ /** Jump to a specific step and open the tour. */
59
+ goTo: (index: number) => void;
60
+ /** Close the tour. */
61
+ finish: () => void;
62
+ }
63
+ /**
64
+ * Drive a guided tour with a single `<UPopover>` whose anchor moves between steps.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * const tour = useTour([
69
+ * { target: '#cta', title: 'Get started' },
70
+ * { target: () => card.value, title: 'Profile', side: 'right' },
71
+ * { target: null, title: 'All set' } // centered, no target
72
+ * ])
73
+ * ```
74
+ * ```vue
75
+ * <UPopover :open="tour.open.value" :reference="tour.reference.value">
76
+ * <template #content>…your content + buttons…</template>
77
+ * </UPopover>
78
+ * ```
79
+ */
80
+ export declare function useTour(steps: MaybeRefOrGetter<TourStep[]>, options?: UseTourOptions): UseTourReturn;
@@ -0,0 +1,102 @@
1
+ import { ref, computed, toValue, nextTick, watch } from "vue";
2
+ export function useTour(steps, options = {}) {
3
+ const { loop = false, scrollIntoView = true } = options;
4
+ const stepList = computed(() => toValue(steps) ?? []);
5
+ const total = computed(() => stepList.value.length);
6
+ const open = ref(false);
7
+ const rawIndex = ref(options.initialStep ?? 0);
8
+ function clamp(value) {
9
+ return Math.min(Math.max(value, 0), Math.max(total.value - 1, 0));
10
+ }
11
+ const index = computed({
12
+ get: () => clamp(rawIndex.value),
13
+ set: (value) => rawIndex.value = clamp(value)
14
+ });
15
+ const current = computed(() => stepList.value[index.value]);
16
+ const hasNext = computed(() => index.value < total.value - 1);
17
+ const hasPrev = computed(() => index.value > 0);
18
+ const centerAnchor = {
19
+ getBoundingClientRect() {
20
+ const x = typeof window === "undefined" ? 0 : window.innerWidth / 2;
21
+ const y = typeof window === "undefined" ? 0 : window.innerHeight / 2;
22
+ return { x, y, top: y, left: x, right: x, bottom: y, width: 0, height: 0, toJSON: () => ({}) };
23
+ }
24
+ };
25
+ const reference = computed(() => {
26
+ if (!open.value || typeof window === "undefined") {
27
+ return void 0;
28
+ }
29
+ const target = toValue(current.value?.target);
30
+ if (target == null) {
31
+ return centerAnchor;
32
+ }
33
+ if (typeof target === "string") {
34
+ const selector = target.startsWith("#") || target.startsWith(".") ? target : `#${target}`;
35
+ try {
36
+ return document.querySelector(selector) ?? void 0;
37
+ } catch {
38
+ return void 0;
39
+ }
40
+ }
41
+ return target;
42
+ });
43
+ function scrollTargetIntoView() {
44
+ if (!scrollIntoView) {
45
+ return;
46
+ }
47
+ const el = reference.value;
48
+ if (el instanceof Element) {
49
+ el.scrollIntoView(typeof scrollIntoView === "object" ? scrollIntoView : { behavior: "smooth", block: "center" });
50
+ }
51
+ }
52
+ function goTo(value) {
53
+ index.value = value;
54
+ if (total.value > 0) {
55
+ open.value = true;
56
+ }
57
+ }
58
+ function start(value = options.initialStep ?? 0) {
59
+ goTo(value);
60
+ }
61
+ function next() {
62
+ if (hasNext.value) {
63
+ index.value++;
64
+ } else if (loop) {
65
+ index.value = 0;
66
+ } else {
67
+ finish();
68
+ }
69
+ }
70
+ function prev() {
71
+ if (hasPrev.value) {
72
+ index.value--;
73
+ }
74
+ }
75
+ function finish() {
76
+ open.value = false;
77
+ }
78
+ watch(total, (value) => {
79
+ if (!value) {
80
+ open.value = false;
81
+ }
82
+ });
83
+ watch([open, index], () => {
84
+ if (open.value) {
85
+ nextTick(scrollTargetIntoView);
86
+ }
87
+ });
88
+ return {
89
+ open,
90
+ index,
91
+ current,
92
+ reference,
93
+ total,
94
+ hasNext,
95
+ hasPrev,
96
+ start,
97
+ next,
98
+ prev,
99
+ goTo,
100
+ finish
101
+ };
102
+ }
@@ -1 +1 @@
1
- @import "#build/ui.css";@import "./keyframes.css";@source "./components";@variant light (&:where(.light, .light *));@variant dark (&:where(.dark, .dark *));@layer theme{:host,:root{--ui-header-height:4rem;--ui-radius:0.25rem;--ui-container:80rem}.light,:host,:root{--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-text-inverted:#fff;--ui-bg:#fff;--ui-bg-muted:var(--ui-color-neutral-50);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-muted:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900)}.dark{--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:#fff;--ui-text-inverted:var(--ui-color-neutral-900);--ui-bg:var(--ui-color-neutral-900);--ui-bg-muted:var(--ui-color-neutral-800);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:#fff;--ui-border:var(--ui-color-neutral-800);--ui-border-muted:var(--ui-color-neutral-700);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:#fff}}
1
+ @import "#build/ui.css";@import "./keyframes.css";@source "./components";@variant light (&:where(.light, .light *));@variant dark (&:where(.dark, .dark *));@layer base{a:focus-visible{outline-offset:0}}@layer theme{:host,:root{--ui-header-height:4rem;--ui-radius:0.25rem;--ui-container:80rem}.light,:host,:root{--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-text-inverted:#fff;--ui-bg:#fff;--ui-bg-muted:var(--ui-color-neutral-50);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-muted:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900)}.dark{--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:#fff;--ui-text-inverted:var(--ui-color-neutral-900);--ui-bg:var(--ui-color-neutral-900);--ui-bg-muted:var(--ui-color-neutral-800);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:#fff;--ui-border:var(--ui-color-neutral-800);--ui-border-muted:var(--ui-color-neutral-700);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:#fff}}
@@ -1 +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-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{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%}}
@@ -36,6 +36,7 @@ export { default as ky } from './ky';
36
36
  export { default as lb } from './lb';
37
37
  export { default as lo } from './lo';
38
38
  export { default as lt } from './lt';
39
+ export { default as lv } from './lv';
39
40
  export { default as mn } from './mn';
40
41
  export { default as ms } from './ms';
41
42
  export { default as nb_no } from './nb_no';
@@ -36,6 +36,7 @@ export { default as ky } from "./ky.js";
36
36
  export { default as lb } from "./lb.js";
37
37
  export { default as lo } from "./lo.js";
38
38
  export { default as lt } from "./lt.js";
39
+ export { default as lv } from "./lv.js";
39
40
  export { default as mn } from "./mn.js";
40
41
  export { default as ms } from "./ms.js";
41
42
  export { default as nb_no } from "./nb_no.js";
@@ -0,0 +1,3 @@
1
+ import type { Messages } from '../types';
2
+ declare const _default: import("../types").Locale<Messages>;
3
+ export default _default;