vueless 0.0.530 → 0.0.532

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 (34) hide show
  1. package/package.json +1 -1
  2. package/types.ts +6 -0
  3. package/ui.button/storybook/stories.ts +2 -2
  4. package/ui.container-group/types.ts +0 -1
  5. package/ui.loader/ULoader.vue +21 -41
  6. package/ui.loader/storybook/Docs.mdx +2 -2
  7. package/ui.loader/storybook/{stories.js → stories.ts} +15 -7
  8. package/ui.loader/types.ts +47 -0
  9. package/ui.loader/{useAttrs.js → useAttrs.ts} +6 -3
  10. package/ui.loader-overlay/ULoaderOverlay.vue +23 -35
  11. package/ui.loader-overlay/storybook/Docs.mdx +2 -2
  12. package/ui.loader-overlay/storybook/{stories.js → stories.ts} +22 -7
  13. package/ui.loader-overlay/types.ts +42 -0
  14. package/ui.loader-overlay/{useAttrs.js → useAttrs.ts} +5 -2
  15. package/ui.loader-overlay/useLoaderOverlay.ts +42 -0
  16. package/ui.loader-overlay/{utilLoaderOverlay.js → utilLoaderOverlay.ts} +2 -2
  17. package/ui.loader-progress/ULoaderProgress.vue +34 -49
  18. package/ui.loader-progress/{config.js → config.ts} +1 -0
  19. package/ui.loader-progress/storybook/Docs.mdx +2 -2
  20. package/ui.loader-progress/storybook/{stories.js → stories.ts} +24 -7
  21. package/ui.loader-progress/types.ts +46 -0
  22. package/ui.loader-progress/useAttrs.ts +36 -0
  23. package/ui.loader-progress/useLoaderProgress.ts +81 -0
  24. package/ui.loader-progress/utilLoaderProgress.ts +49 -0
  25. package/web-types.json +55 -8
  26. package/ui.loader-overlay/useLoaderOverlay.js +0 -25
  27. package/ui.loader-progress/useAttrs.js +0 -15
  28. package/ui.loader-progress/useLoaderProgress.js +0 -65
  29. package/ui.loader-progress/utilLoaderProgress.js +0 -49
  30. /package/ui.loader/{config.js → config.ts} +0 -0
  31. /package/ui.loader/{constants.js → constants.ts} +0 -0
  32. /package/ui.loader-overlay/{config.js → config.ts} +0 -0
  33. /package/ui.loader-overlay/{constants.js → constants.ts} +0 -0
  34. /package/ui.loader-progress/{constants.js → constants.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.530",
3
+ "version": "0.0.532",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless UI Component Library, powered by Tailwind CSS.",
6
6
  "keywords": [
package/types.ts CHANGED
@@ -32,6 +32,9 @@ import UModalConfig from "./ui.container-modal/config.ts";
32
32
  import UModalConfirmConfig from "./ui.container-modal-confirm/config.ts";
33
33
  import UPageConfig from "./ui.container-page/config.ts";
34
34
  import URowConfig from "./ui.container-row/config.ts";
35
+ import ULoaderConfig from "./ui.loader/config.ts";
36
+ import ULoaderOverlayConfig from "./ui.loader-overlay/config.ts";
37
+ import ULoaderProgressConfig from "./ui.loader-progress/config.ts";
35
38
 
36
39
  import type { ComputedRef, MaybeRef, Ref } from "vue";
37
40
  import type { Props } from "tippy.js";
@@ -175,6 +178,9 @@ export interface Components {
175
178
  UModalConfirm?: Partial<typeof UModalConfirmConfig>;
176
179
  UPage?: Partial<typeof UPageConfig>;
177
180
  URow?: Partial<typeof URowConfig>;
181
+ ULoader?: Partial<typeof ULoaderConfig>;
182
+ ULoaderOverlay?: Partial<typeof ULoaderOverlayConfig>;
183
+ ULoaderProgress?: Partial<typeof ULoaderProgressConfig>;
178
184
  }
179
185
 
180
186
  export interface Directives {
@@ -170,11 +170,11 @@ export const IconProps: StoryFn<UButtonArgs> = (args) => ({
170
170
  template: `
171
171
  <URow no-mobile>
172
172
  <UButton
173
- leftIcon="download"
173
+ left-icon="download"
174
174
  label="Download"
175
175
  />
176
176
  <UButton
177
- rightIcon="menu"
177
+ right-icon="menu"
178
178
  label="Menu"
179
179
  />
180
180
  </URow>
@@ -10,7 +10,6 @@ export interface UGroupProps {
10
10
 
11
11
  /**
12
12
  * The distance between nested elements.
13
- * @values none, xs, sm, md, lg, xl
14
13
  */
15
14
  gap?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
16
15
 
@@ -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
  }