vueless 0.0.531 → 0.0.533

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 (78) hide show
  1. package/package.json +1 -1
  2. package/types.ts +18 -0
  3. package/ui.container-group/types.ts +0 -1
  4. package/ui.image-avatar/UAvatar.vue +51 -115
  5. package/ui.image-avatar/storybook/Docs.mdx +2 -2
  6. package/ui.image-avatar/storybook/{stories.js → stories.ts} +13 -5
  7. package/ui.image-avatar/types.ts +71 -0
  8. package/ui.image-avatar/useAttrs.ts +18 -0
  9. package/ui.image-icon/UIcon.vue +28 -113
  10. package/ui.image-icon/storybook/Docs.mdx +1 -1
  11. package/ui.image-icon/storybook/{stories.js → stories.ts} +13 -5
  12. package/ui.image-icon/types.ts +83 -0
  13. package/ui.image-icon/useAttrs.ts +18 -0
  14. package/ui.loader/ULoader.vue +21 -41
  15. package/ui.loader/storybook/Docs.mdx +2 -2
  16. package/ui.loader/storybook/{stories.js → stories.ts} +15 -7
  17. package/ui.loader/types.ts +47 -0
  18. package/ui.loader/{useAttrs.js → useAttrs.ts} +6 -3
  19. package/ui.loader-overlay/ULoaderOverlay.vue +23 -35
  20. package/ui.loader-overlay/storybook/Docs.mdx +2 -2
  21. package/ui.loader-overlay/storybook/{stories.js → stories.ts} +22 -7
  22. package/ui.loader-overlay/types.ts +42 -0
  23. package/ui.loader-overlay/{useAttrs.js → useAttrs.ts} +5 -2
  24. package/ui.loader-overlay/useLoaderOverlay.ts +42 -0
  25. package/ui.loader-overlay/{utilLoaderOverlay.js → utilLoaderOverlay.ts} +2 -2
  26. package/ui.loader-progress/ULoaderProgress.vue +34 -49
  27. package/ui.loader-progress/{config.js → config.ts} +1 -0
  28. package/ui.loader-progress/storybook/Docs.mdx +2 -2
  29. package/ui.loader-progress/storybook/{stories.js → stories.ts} +24 -7
  30. package/ui.loader-progress/types.ts +46 -0
  31. package/ui.loader-progress/useAttrs.ts +36 -0
  32. package/ui.loader-progress/useLoaderProgress.ts +81 -0
  33. package/ui.loader-progress/utilLoaderProgress.ts +49 -0
  34. package/ui.navigation-pagination/UPagination.vue +141 -262
  35. package/ui.navigation-pagination/storybook/Docs.mdx +2 -2
  36. package/ui.navigation-pagination/storybook/{stories.js → stories.ts} +11 -4
  37. package/ui.navigation-pagination/types.ts +85 -0
  38. package/ui.navigation-pagination/{useAttrs.js → useAttrs.ts} +5 -2
  39. package/ui.navigation-progress/StepperProgress.vue +26 -47
  40. package/ui.navigation-progress/UProgress.vue +60 -118
  41. package/ui.navigation-progress/{config.js → config.ts} +1 -0
  42. package/ui.navigation-progress/storybook/Docs.mdx +2 -2
  43. package/ui.navigation-progress/storybook/{stories.js → stories.ts} +19 -7
  44. package/ui.navigation-progress/types.ts +93 -0
  45. package/ui.navigation-progress/{useAttrs.js → useAttrs.ts} +6 -3
  46. package/ui.navigation-tab/UTab.vue +18 -54
  47. package/ui.navigation-tab/storybook/Docs.mdx +2 -2
  48. package/ui.navigation-tab/storybook/{stories.js → stories.ts} +10 -5
  49. package/ui.navigation-tab/types.ts +30 -0
  50. package/ui.navigation-tab/{useAttrs.js → useAttrs.ts} +15 -3
  51. package/ui.navigation-tabs/UTabs.vue +29 -78
  52. package/ui.navigation-tabs/storybook/Docs.mdx +2 -2
  53. package/ui.navigation-tabs/storybook/{stories.js → stories.ts} +13 -5
  54. package/ui.navigation-tabs/types.ts +37 -0
  55. package/ui.navigation-tabs/useAttrs.ts +18 -0
  56. package/web-types.json +200 -84
  57. package/ui.image-avatar/useAttrs.js +0 -15
  58. package/ui.image-icon/useAttrs.js +0 -15
  59. package/ui.loader-overlay/useLoaderOverlay.js +0 -25
  60. package/ui.loader-progress/useAttrs.js +0 -15
  61. package/ui.loader-progress/useLoaderProgress.js +0 -65
  62. package/ui.loader-progress/utilLoaderProgress.js +0 -49
  63. package/ui.navigation-tabs/useAttrs.js +0 -15
  64. /package/ui.image-avatar/{config.js → config.ts} +0 -0
  65. /package/ui.image-avatar/{constants.js → constants.ts} +0 -0
  66. /package/ui.image-icon/{constants.js → constants.ts} +0 -0
  67. /package/ui.loader/{config.js → config.ts} +0 -0
  68. /package/ui.loader/{constants.js → constants.ts} +0 -0
  69. /package/ui.loader-overlay/{config.js → config.ts} +0 -0
  70. /package/ui.loader-overlay/{constants.js → constants.ts} +0 -0
  71. /package/ui.loader-progress/{constants.js → constants.ts} +0 -0
  72. /package/ui.navigation-pagination/{config.js → config.ts} +0 -0
  73. /package/ui.navigation-pagination/{constants.js → constants.ts} +0 -0
  74. /package/ui.navigation-progress/{constants.js → constants.ts} +0 -0
  75. /package/ui.navigation-tab/{config.js → config.ts} +0 -0
  76. /package/ui.navigation-tab/{constants.js → constants.ts} +0 -0
  77. /package/ui.navigation-tabs/{config.js → config.ts} +0 -0
  78. /package/ui.navigation-tabs/{constants.js → constants.ts} +0 -0
@@ -0,0 +1,83 @@
1
+ import defaultConfig from "./config.ts";
2
+
3
+ export type Config = Partial<typeof defaultConfig>;
4
+
5
+ export interface UIconProps {
6
+ /**
7
+ * Icon name.
8
+ */
9
+ name?: string;
10
+
11
+ /**
12
+ * Icon source (svg as a vue component).
13
+ */
14
+ src?: object;
15
+
16
+ /**
17
+ * Icon color.
18
+ */
19
+ color?:
20
+ | "brand"
21
+ | "grayscale"
22
+ | "gray"
23
+ | "red"
24
+ | "orange"
25
+ | "amber"
26
+ | "yellow"
27
+ | "lime"
28
+ | "green"
29
+ | "emerald"
30
+ | "teal"
31
+ | "cyan"
32
+ | "sky"
33
+ | "blue"
34
+ | "indigo"
35
+ | "violet"
36
+ | "purple"
37
+ | "fuchsia"
38
+ | "pink"
39
+ | "rose"
40
+ | "black"
41
+ | "white";
42
+
43
+ /**
44
+ * Icon size.
45
+ */
46
+ size?: "4xs" | "3xs" | "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl" | "5xl";
47
+
48
+ /**
49
+ * Icon variant.
50
+ */
51
+ variant?: "light" | "default" | "dark";
52
+
53
+ /**
54
+ * Make the icon interactive (cursor pointer, etc.).
55
+ */
56
+ interactive?: boolean;
57
+
58
+ /**
59
+ * Add tooltip text on hover.
60
+ */
61
+ tooltip?: string;
62
+
63
+ /**
64
+ * Tooltip settings.
65
+ * [See all settings here](https://kabbouchi.github.io/vue-tippy/4.0/features/placement.html).
66
+ */
67
+ tooltipSettings?: object;
68
+
69
+ /**
70
+ * Mark that Icon used inside Vueless components (used to get icons from vueless library).
71
+ */
72
+ internal?: boolean;
73
+
74
+ /**
75
+ * Component config object.
76
+ */
77
+ config?: Partial<typeof defaultConfig>;
78
+
79
+ /**
80
+ * Data-test attribute for automated testing.
81
+ */
82
+ dataTest?: string;
83
+ }
@@ -0,0 +1,18 @@
1
+ import useUI from "../composables/useUI.ts";
2
+
3
+ import defaultConfig from "./config.ts";
4
+
5
+ import type { UseAttrs } from "../types.ts";
6
+ import type { UIconProps, Config } from "./types.ts";
7
+
8
+ export default function useAttrs(props: UIconProps): UseAttrs<Config> {
9
+ const { config, getKeysAttrs, hasSlotContent } = useUI<Config>(defaultConfig, () => props.config);
10
+
11
+ const keysAttrs = getKeysAttrs();
12
+
13
+ return {
14
+ config,
15
+ ...keysAttrs,
16
+ hasSlotContent,
17
+ };
18
+ }
@@ -1,54 +1,34 @@
1
- <template>
2
- <Transition v-bind="config.transition">
3
- <div v-if="loading" v-bind="loaderAttrs">
4
- <!-- @slot Use it to add something instead of the default loader. -->
5
- <slot>
6
- <div v-for="ellipse in ELLIPSES_AMOUNT" :key="ellipse" v-bind="ellipseAttrs" />
7
- </slot>
8
- </div>
9
- </Transition>
10
- </template>
11
-
12
- <script setup>
1
+ <script lang="ts" setup>
13
2
  import { getDefault } from "../utils/ui.ts";
14
3
 
15
- import { ULoader, ELLIPSES_AMOUNT } from "./constants.js";
16
- import defaultConfig from "./config.js";
17
- import useAttrs from "./useAttrs.js";
4
+ import { ULoader, ELLIPSES_AMOUNT } from "./constants.ts";
5
+ import defaultConfig from "./config.ts";
6
+ import useAttrs from "./useAttrs.ts";
7
+
8
+ import type { ULoaderProps } from "./types.ts";
18
9
 
19
10
  defineOptions({ inheritAttrs: false });
20
11
 
21
- const props = defineProps({
22
- /**
23
- * Loader state (shown / hidden).
24
- */
25
- loading: {
26
- type: Boolean,
27
- default: getDefault(defaultConfig, ULoader).loading,
28
- },
29
-
30
- /**
31
- * Loader color.
32
- * @values brand, grayscale, gray, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose, black, white
33
- */
34
- color: {
35
- type: String,
36
- default: getDefault(defaultConfig, ULoader).color,
37
- },
38
-
39
- /**
40
- * Loader size.
41
- * @values sm, md, lg
42
- */
43
- size: {
44
- type: String,
45
- default: getDefault(defaultConfig, ULoader).size,
46
- },
12
+ const props = withDefaults(defineProps<ULoaderProps>(), {
13
+ loading: getDefault<ULoaderProps>(defaultConfig, ULoader).loading,
14
+ color: getDefault<ULoaderProps>(defaultConfig, ULoader).color,
15
+ size: getDefault<ULoaderProps>(defaultConfig, ULoader).size,
47
16
  });
48
17
 
49
18
  const { loaderAttrs, ellipseAttrs, config } = useAttrs(props);
50
19
  </script>
51
20
 
21
+ <template>
22
+ <Transition v-bind="config?.transition">
23
+ <div v-if="loading" v-bind="loaderAttrs">
24
+ <!-- @slot Use it to add something instead of the default loader. -->
25
+ <slot>
26
+ <div v-for="ellipse in ELLIPSES_AMOUNT" :key="ellipse" v-bind="ellipseAttrs" />
27
+ </slot>
28
+ </div>
29
+ </Transition>
30
+ </template>
31
+
52
32
  <style scoped lang="postcss">
53
33
  .vueless-loader-ellipse:nth-child(1) {
54
34
  animation: ellipse-1 0.6s infinite;
@@ -1,8 +1,8 @@
1
1
  import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Source } from "@storybook/blocks";
2
2
  import { getSource } from "../../utils/storybook.ts";
3
3
 
4
- import * as stories from "./stories.js";
5
- import defaultConfig from "../config.js?raw"
4
+ import * as stories from "./stories.ts";
5
+ import defaultConfig from "../config.ts?raw"
6
6
 
7
7
  <Meta of={stories} />
8
8
  <Title of={stories} />
@@ -5,6 +5,14 @@ import URow from "../../ui.container-row/URow.vue";
5
5
  import UButton from "../../ui.button/UButton.vue";
6
6
  import { ref } from "vue";
7
7
 
8
+ import type { Meta, StoryFn } from "@storybook/vue3";
9
+ import type { ULoaderProps } from "../types.ts";
10
+
11
+ interface ULoaderArgs extends ULoaderProps {
12
+ slotTemplate?: string;
13
+ enum: "size" | "color";
14
+ }
15
+
8
16
  /**
9
17
  * The `ULoader` component. | [View on GitHub](https://github.com/vuelessjs/vueless/tree/main/src/ui.loader)
10
18
  */
@@ -18,9 +26,9 @@ export default {
18
26
  argTypes: {
19
27
  ...getArgTypes(ULoader.__name),
20
28
  },
21
- };
29
+ } as Meta;
22
30
 
23
- const DefaultTemplate = (args) => ({
31
+ const DefaultTemplate: StoryFn<ULoaderArgs> = (args: ULoaderArgs) => ({
24
32
  components: { ULoader },
25
33
  setup() {
26
34
  const slots = getSlotNames(ULoader.__name);
@@ -29,17 +37,17 @@ const DefaultTemplate = (args) => ({
29
37
  },
30
38
  template: `
31
39
  <ULoader v-bind="args">
32
- ${args.slotTemplate || getSlotsFragment()}
40
+ ${args.slotTemplate || getSlotsFragment("")}
33
41
  </ULoader>
34
42
  `,
35
43
  });
36
44
 
37
- const EnumVariantTemplate = (args, { argTypes }) => ({
45
+ const EnumVariantTemplate: StoryFn<ULoaderArgs> = (args: ULoaderArgs, { argTypes }) => ({
38
46
  components: { ULoader, URow },
39
47
  setup() {
40
48
  return {
41
49
  args,
42
- options: argTypes[args.enum].options,
50
+ options: argTypes?.[args.enum]?.options,
43
51
  };
44
52
  },
45
53
  template: `
@@ -54,7 +62,7 @@ const EnumVariantTemplate = (args, { argTypes }) => ({
54
62
  `,
55
63
  });
56
64
 
57
- const LoadingTemplate = (args) => ({
65
+ const LoadingTemplate: StoryFn<ULoaderArgs> = (args: ULoaderArgs) => ({
58
66
  components: { ULoader, UButton, URow },
59
67
  setup() {
60
68
  function toggleLoader() {
@@ -66,7 +74,7 @@ const LoadingTemplate = (args) => ({
66
74
  return { args, isLoading, toggleLoader };
67
75
  },
68
76
  template: `
69
- <URow>
77
+ <URow align="center">
70
78
  <ULoader v-bind="args" :loading="isLoading" />
71
79
  <UButton @click="toggleLoader" size="sm">ToggleLoader</UButton>
72
80
  </URow>
@@ -0,0 +1,47 @@
1
+ import defaultConfig from "./config.ts";
2
+
3
+ export type Config = Partial<typeof defaultConfig>;
4
+
5
+ export interface ULoaderProps {
6
+ /**
7
+ * Loader state (shown / hidden).
8
+ */
9
+ loading?: boolean;
10
+
11
+ /**
12
+ * Loader color.
13
+ */
14
+ color?:
15
+ | "brand"
16
+ | "grayscale"
17
+ | "gray"
18
+ | "red"
19
+ | "orange"
20
+ | "amber"
21
+ | "yellow"
22
+ | "lime"
23
+ | "green"
24
+ | "emerald"
25
+ | "teal"
26
+ | "cyan"
27
+ | "sky"
28
+ | "blue"
29
+ | "indigo"
30
+ | "violet"
31
+ | "purple"
32
+ | "fuchsia"
33
+ | "pink"
34
+ | "rose"
35
+ | "black"
36
+ | "white";
37
+
38
+ /**
39
+ * Loader size.
40
+ */
41
+ size?: "sm" | "md" | "lg";
42
+
43
+ /**
44
+ * Component config object.
45
+ */
46
+ config?: Partial<typeof defaultConfig>;
47
+ }
@@ -1,10 +1,13 @@
1
1
  import { computed } from "vue";
2
2
  import useUI from "../composables/useUI.ts";
3
3
 
4
- import defaultConfig from "./config.js";
4
+ import defaultConfig from "./config.ts";
5
5
 
6
- export default function useAttrs(props) {
7
- const { config, getKeysAttrs, hasSlotContent } = useUI(
6
+ import type { UseAttrs } from "../types.ts";
7
+ import type { ULoaderProps, Config } from "./types.ts";
8
+
9
+ export default function useAttrs(props: ULoaderProps): UseAttrs<Config> {
10
+ const { config, getKeysAttrs, hasSlotContent } = useUI<Config>(
8
11
  defaultConfig,
9
12
  () => props.config,
10
13
  "loader",
@@ -1,15 +1,4 @@
1
- <template>
2
- <Transition v-bind="config.transition">
3
- <div v-if="showLoader" v-bind="overlayAttrs">
4
- <!-- @slot Use it to add something instead of the default loader. -->
5
- <slot>
6
- <ULoader :loading="showLoader" size="lg" :color="loaderColor" v-bind="nestedLoaderAttrs" />
7
- </slot>
8
- </div>
9
- </Transition>
10
- </template>
11
-
12
- <script setup>
1
+ <script lang="ts" setup>
13
2
  import { computed, onMounted, onUnmounted } from "vue";
14
3
 
15
4
  import { getDefault } from "../utils/ui.ts";
@@ -17,34 +6,22 @@ import { useDarkMode } from "../composables/useDarkMode.ts";
17
6
 
18
7
  import ULoader from "../ui.loader/ULoader.vue";
19
8
 
20
- import { ULoaderOverlay } from "./constants.js";
21
- import defaultConfig from "./config.js";
22
- import useAttrs from "./useAttrs.js";
23
- import { useLoaderOverlay } from "./useLoaderOverlay.js";
9
+ import { ULoaderOverlay } from "./constants.ts";
10
+ import defaultConfig from "./config.ts";
11
+ import useAttrs from "./useAttrs.ts";
12
+ import { useLoaderOverlay } from "./useLoaderOverlay.ts";
24
13
 
25
- defineOptions({ inheritAttrs: false });
14
+ import type { ULoaderOverlayProps } from "./types.ts";
26
15
 
27
- const props = defineProps({
28
- /**
29
- * Loader state (shown / hidden).
30
- */
31
- loading: {
32
- type: Boolean,
33
- default: getDefault(defaultConfig, ULoaderOverlay).loading,
34
- },
16
+ defineOptions({ inheritAttrs: false });
35
17
 
36
- /**
37
- * Loader color.
38
- * @values brand, grayscale, gray, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose, black, white
39
- */
40
- color: {
41
- type: String,
42
- default: getDefault(defaultConfig, ULoaderOverlay).color,
43
- },
18
+ const props = withDefaults(defineProps<ULoaderOverlayProps>(), {
19
+ loading: getDefault<ULoaderOverlayProps>(defaultConfig, ULoaderOverlay).loading,
20
+ color: getDefault<ULoaderOverlayProps>(defaultConfig, ULoaderOverlay).color,
44
21
  });
45
22
 
46
23
  const { overlayAttrs, nestedLoaderAttrs, config } = useAttrs(props);
47
- const { isLoading, loaderOverlayOn, loaderOverlayOff } = useLoaderOverlay();
24
+ const { loaderOverlayOn, loaderOverlayOff, isLoading } = useLoaderOverlay();
48
25
  const { isDarkMode } = useDarkMode();
49
26
 
50
27
  const loaderColor = computed(() => {
@@ -65,6 +42,17 @@ onUnmounted(() => {
65
42
  });
66
43
 
67
44
  const showLoader = computed(() => {
68
- return props.loading === undefined ? isLoading.value : props.loading;
45
+ return props.loading === undefined ? (isLoading.value ?? false) : props.loading;
69
46
  });
70
47
  </script>
48
+
49
+ <template>
50
+ <Transition v-bind="config?.transition">
51
+ <div v-if="showLoader" v-bind="overlayAttrs">
52
+ <!-- @slot Use it to add something instead of the default loader. -->
53
+ <slot>
54
+ <ULoader :loading="showLoader" size="lg" :color="loaderColor" v-bind="nestedLoaderAttrs" />
55
+ </slot>
56
+ </div>
57
+ </Transition>
58
+ </template>
@@ -1,8 +1,8 @@
1
1
  import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Source } from "@storybook/blocks";
2
2
  import { getSource } from "../../utils/storybook.ts";
3
3
 
4
- import * as stories from "./stories.js";
5
- import defaultConfig from "../config.js?raw"
4
+ import * as stories from "./stories.ts";
5
+ import defaultConfig from "../config.ts?raw"
6
6
 
7
7
  <Meta of={stories} />
8
8
  <Title of={stories} />
@@ -4,7 +4,14 @@ import ULoaderOverlay from "../ULoaderOverlay.vue";
4
4
  import UButton from "../../ui.button/UButton.vue";
5
5
  import UCol from "../../ui.container-col/UCol.vue";
6
6
 
7
- import { useLoaderOverlay } from "../useLoaderOverlay.js";
7
+ import { useLoaderOverlay } from "../useLoaderOverlay.ts";
8
+
9
+ import type { Meta, StoryFn } from "@storybook/vue3";
10
+ import type { ULoaderOverlayProps } from "../types.ts";
11
+
12
+ interface ULoaderOverlayArgs extends ULoaderOverlayProps {
13
+ slotTemplate?: string;
14
+ }
8
15
 
9
16
  /**
10
17
  * The `ULoaderOverlay` component. | [View on GitHub](https://github.com/vuelessjs/vueless/tree/main/src/ui.loader-overlay)
@@ -23,9 +30,9 @@ export default {
23
30
  },
24
31
  },
25
32
  },
26
- };
33
+ } as Meta;
27
34
 
28
- const DefaultTemplate = (args) => ({
35
+ const DefaultTemplate: StoryFn<ULoaderOverlayArgs> = (args: ULoaderOverlayArgs) => ({
29
36
  components: { ULoaderOverlay },
30
37
  setup() {
31
38
  const slots = getSlotNames(ULoaderOverlay.__name);
@@ -34,18 +41,26 @@ const DefaultTemplate = (args) => ({
34
41
  },
35
42
  template: `
36
43
  <ULoaderOverlay v-bind="args" class="w-full h-full">
37
- ${args.slotTemplate || getSlotsFragment()}
44
+ ${args.slotTemplate || getSlotsFragment("")}
38
45
  </ULoaderOverlay>
39
46
  `,
40
47
  });
41
48
 
42
- const LoadingTemplate = (args) => ({
49
+ const LoadingTemplate: StoryFn<ULoaderOverlayArgs> = (args: ULoaderOverlayArgs) => ({
43
50
  components: { ULoaderOverlay, UButton, UCol },
44
51
  setup() {
45
- const { loaderOverlayOn, loaderOverlayOff, isLoading } = useLoaderOverlay();
52
+ const loaderOverlay = useLoaderOverlay();
53
+
54
+ const loaderOverlayOn = loaderOverlay?.loaderOverlayOn || (() => {});
55
+ const loaderOverlayOff = loaderOverlay?.loaderOverlayOff || (() => {});
56
+ const isLoading = loaderOverlay?.isLoading || { value: false };
46
57
 
47
58
  function toggleLoading() {
48
- isLoading.value ? loaderOverlayOff() : loaderOverlayOn();
59
+ if (isLoading.value) {
60
+ loaderOverlayOff();
61
+ } else {
62
+ loaderOverlayOn();
63
+ }
49
64
  }
50
65
 
51
66
  return { args, loaderOverlayOn, loaderOverlayOff, isLoading, toggleLoading };
@@ -0,0 +1,42 @@
1
+ import defaultConfig from "./config.ts";
2
+
3
+ export type Config = Partial<typeof defaultConfig>;
4
+
5
+ export interface ULoaderOverlayProps {
6
+ /**
7
+ * Loader state (shown / hidden).
8
+ */
9
+ loading?: boolean;
10
+
11
+ /**
12
+ * Loader color.
13
+ */
14
+ color?:
15
+ | "brand"
16
+ | "grayscale"
17
+ | "gray"
18
+ | "red"
19
+ | "orange"
20
+ | "amber"
21
+ | "yellow"
22
+ | "lime"
23
+ | "green"
24
+ | "emerald"
25
+ | "teal"
26
+ | "cyan"
27
+ | "sky"
28
+ | "blue"
29
+ | "indigo"
30
+ | "violet"
31
+ | "purple"
32
+ | "fuchsia"
33
+ | "pink"
34
+ | "rose"
35
+ | "black"
36
+ | "white";
37
+
38
+ /**
39
+ * Component config object.
40
+ */
41
+ config?: Partial<typeof defaultConfig>;
42
+ }
@@ -2,8 +2,11 @@ import useUI from "../composables/useUI.ts";
2
2
 
3
3
  import defaultConfig from "./config.js";
4
4
 
5
- export default function useAttrs(props) {
6
- const { config, getKeysAttrs, hasSlotContent } = useUI(
5
+ import type { UseAttrs } from "../types.ts";
6
+ import type { ULoaderOverlayProps, Config } from "./types.ts";
7
+
8
+ export default function useAttrs(props: ULoaderOverlayProps): UseAttrs<Config> {
9
+ const { config, getKeysAttrs, hasSlotContent } = useUI<Config>(
7
10
  defaultConfig,
8
11
  () => props.config,
9
12
  "overlay",
@@ -0,0 +1,42 @@
1
+ import { inject, readonly, ref } from "vue";
2
+
3
+ import type { Ref, InjectionKey } from "vue";
4
+
5
+ export const LoaderOverlaySymbol: InjectionKey<LoaderOverlay> =
6
+ Symbol.for("vueless:loader-overlay");
7
+
8
+ interface LoaderOverlay {
9
+ isLoading: Readonly<Ref<boolean, boolean>>;
10
+ loaderOverlayOn: () => void;
11
+ loaderOverlayOff: () => void;
12
+ }
13
+
14
+ const isLoading = ref(true);
15
+
16
+ function loaderOverlayOn(): void {
17
+ isLoading.value = true;
18
+ }
19
+
20
+ function loaderOverlayOff(): void {
21
+ isLoading.value = false;
22
+ }
23
+
24
+ export function createLoaderOverlay(): LoaderOverlay {
25
+ return {
26
+ isLoading: readonly(isLoading),
27
+ loaderOverlayOn,
28
+ loaderOverlayOff,
29
+ };
30
+ }
31
+
32
+ export function useLoaderOverlay(): LoaderOverlay {
33
+ const loaderOverlay = inject(LoaderOverlaySymbol);
34
+
35
+ if (!loaderOverlay) {
36
+ throw new Error(
37
+ "LoaderOverlay not provided. Ensure you are using `provide` with `LoaderOverlaySymbol`.",
38
+ );
39
+ }
40
+
41
+ return loaderOverlay;
42
+ }
@@ -1,7 +1,7 @@
1
- export function loaderOverlayOn() {
1
+ export function loaderOverlayOn(): void {
2
2
  window.dispatchEvent(new Event("loaderOverlayOn"));
3
3
  }
4
4
 
5
- export function loaderOverlayOff() {
5
+ export function loaderOverlayOff(): void {
6
6
  window.dispatchEvent(new Event("loaderOverlayOff"));
7
7
  }