vueless 0.0.579 → 0.0.580

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 (240) hide show
  1. package/composables/useUI.ts +46 -60
  2. package/constants.js +3 -0
  3. package/package.json +1 -1
  4. package/types.ts +39 -48
  5. package/ui.button/UButton.vue +2 -3
  6. package/ui.button/types.ts +2 -2
  7. package/ui.button-link/ULink.vue +23 -24
  8. package/ui.button-link/storybook/stories.ts +2 -2
  9. package/ui.button-link/types.ts +7 -6
  10. package/ui.button-toggle/UToggle.vue +15 -16
  11. package/ui.button-toggle/storybook/stories.ts +2 -2
  12. package/ui.button-toggle/types.ts +6 -4
  13. package/ui.button-toggle-item/UToggleItem.vue +29 -20
  14. package/ui.button-toggle-item/storybook/stories.ts +2 -2
  15. package/ui.button-toggle-item/types.ts +5 -4
  16. package/ui.container-accordion/UAccordion.vue +22 -17
  17. package/ui.container-accordion/storybook/stories.ts +2 -2
  18. package/ui.container-accordion/types.ts +5 -4
  19. package/ui.container-card/UCard.vue +12 -5
  20. package/ui.container-card/storybook/stories.ts +2 -2
  21. package/ui.container-card/types.ts +4 -3
  22. package/ui.container-col/UCol.vue +11 -12
  23. package/ui.container-col/storybook/stories.ts +2 -2
  24. package/ui.container-col/types.ts +5 -3
  25. package/ui.container-divider/UDivider.vue +13 -13
  26. package/ui.container-divider/storybook/stories.ts +2 -2
  27. package/ui.container-divider/types.ts +5 -3
  28. package/ui.container-group/UGroup.vue +10 -8
  29. package/ui.container-group/storybook/stories.ts +2 -2
  30. package/ui.container-group/types.ts +5 -3
  31. package/ui.container-groups/UGroups.vue +10 -7
  32. package/ui.container-groups/storybook/stories.ts +2 -2
  33. package/ui.container-groups/types.ts +5 -3
  34. package/ui.container-modal/UModal.vue +43 -43
  35. package/ui.container-modal/storybook/stories.ts +2 -3
  36. package/ui.container-modal/types.ts +5 -3
  37. package/ui.container-modal-confirm/UModalConfirm.vue +14 -17
  38. package/ui.container-modal-confirm/storybook/stories.ts +8 -6
  39. package/ui.container-modal-confirm/types.ts +5 -3
  40. package/ui.container-page/UPage.vue +32 -31
  41. package/ui.container-page/storybook/stories.ts +2 -2
  42. package/ui.container-page/types.ts +4 -3
  43. package/ui.container-row/URow.vue +10 -13
  44. package/ui.container-row/storybook/stories.ts +2 -2
  45. package/ui.container-row/types.ts +5 -3
  46. package/ui.data-list/UDataList.vue +40 -51
  47. package/ui.data-list/storybook/stories.ts +2 -2
  48. package/ui.data-list/types.ts +4 -4
  49. package/ui.data-table/UTable.vue +61 -60
  50. package/ui.data-table/types.ts +4 -3
  51. package/ui.dropdown-badge/UDropdownBadge.vue +21 -25
  52. package/ui.dropdown-badge/storybook/stories.ts +3 -3
  53. package/ui.dropdown-badge/types.ts +4 -3
  54. package/ui.dropdown-button/UDropdownButton.vue +20 -23
  55. package/ui.dropdown-button/storybook/stories.ts +3 -3
  56. package/ui.dropdown-button/types.ts +4 -3
  57. package/ui.dropdown-link/UDropdownLink.vue +20 -23
  58. package/ui.dropdown-link/storybook/stories.ts +3 -3
  59. package/ui.dropdown-link/types.ts +4 -3
  60. package/ui.dropdown-list/UDropdownList.vue +28 -32
  61. package/ui.dropdown-list/storybook/stories.ts +4 -4
  62. package/ui.dropdown-list/types.ts +4 -4
  63. package/ui.form-calendar/UCalendar.vue +36 -34
  64. package/ui.form-calendar/UCalendarDayView.vue +28 -23
  65. package/ui.form-calendar/UCalendarMonthView.vue +24 -19
  66. package/ui.form-calendar/UCalendarYearView.vue +24 -19
  67. package/ui.form-calendar/config.ts +2 -2
  68. package/ui.form-calendar/storybook/stories.ts +2 -2
  69. package/ui.form-calendar/types.ts +8 -7
  70. package/ui.form-checkbox/UCheckbox.vue +23 -21
  71. package/ui.form-checkbox/storybook/stories.ts +2 -2
  72. package/ui.form-checkbox/types.ts +7 -5
  73. package/ui.form-checkbox-group/UCheckboxGroup.vue +17 -14
  74. package/ui.form-checkbox-group/storybook/stories.ts +2 -2
  75. package/ui.form-checkbox-group/types.ts +6 -6
  76. package/ui.form-checkbox-multi-state/UCheckboxMultiState.vue +33 -14
  77. package/ui.form-checkbox-multi-state/storybook/stories.ts +2 -2
  78. package/ui.form-checkbox-multi-state/types.ts +4 -4
  79. package/ui.form-color-picker/UColorPicker.vue +23 -21
  80. package/ui.form-color-picker/storybook/stories.ts +2 -2
  81. package/ui.form-color-picker/types.ts +5 -5
  82. package/ui.form-date-picker/UDatePicker.vue +42 -27
  83. package/ui.form-date-picker/config.ts +5 -5
  84. package/ui.form-date-picker/types.ts +5 -2
  85. package/ui.form-date-picker-range/UDatePickerRange.vue +80 -53
  86. package/ui.form-date-picker-range/types.ts +7 -4
  87. package/ui.form-input/UInput.vue +32 -28
  88. package/ui.form-input/storybook/stories.ts +2 -2
  89. package/ui.form-input/types.ts +5 -3
  90. package/ui.form-input-file/UInputFile.vue +37 -32
  91. package/ui.form-input-file/storybook/stories.ts +2 -2
  92. package/ui.form-input-file/types.ts +6 -4
  93. package/ui.form-input-money/UInputMoney.vue +13 -18
  94. package/ui.form-input-money/storybook/stories.ts +2 -2
  95. package/ui.form-input-money/types.ts +5 -3
  96. package/ui.form-input-number/UInputNumber.vue +23 -24
  97. package/ui.form-input-number/types.ts +4 -2
  98. package/ui.form-input-rating/UInputRating.vue +24 -19
  99. package/ui.form-input-rating/storybook/stories.ts +2 -2
  100. package/ui.form-input-rating/types.ts +5 -3
  101. package/ui.form-input-search/UInputSearch.vue +22 -20
  102. package/ui.form-input-search/storybook/stories.ts +2 -2
  103. package/ui.form-input-search/types.ts +5 -3
  104. package/ui.form-label/ULabel.vue +19 -11
  105. package/ui.form-label/config.ts +0 -1
  106. package/ui.form-label/storybook/stories.ts +2 -2
  107. package/ui.form-label/types.ts +10 -8
  108. package/ui.form-radio/URadio.vue +22 -12
  109. package/ui.form-radio/storybook/stories.ts +2 -2
  110. package/ui.form-radio/types.ts +5 -5
  111. package/ui.form-radio-group/URadioGroup.vue +16 -12
  112. package/ui.form-radio-group/storybook/stories.ts +2 -2
  113. package/ui.form-radio-group/types.ts +7 -7
  114. package/ui.form-select/USelect.vue +53 -39
  115. package/ui.form-switch/USwitch.vue +30 -23
  116. package/ui.form-switch/storybook/stories.ts +2 -2
  117. package/ui.form-switch/types.ts +5 -3
  118. package/ui.form-textarea/UTextarea.vue +19 -15
  119. package/ui.form-textarea/storybook/stories.ts +2 -2
  120. package/ui.form-textarea/types.ts +5 -3
  121. package/ui.image-avatar/UAvatar.vue +12 -11
  122. package/ui.image-avatar/types.ts +4 -2
  123. package/ui.image-icon/UIcon.vue +31 -18
  124. package/ui.image-icon/storybook/stories.ts +2 -2
  125. package/ui.image-icon/types.ts +12 -5
  126. package/ui.loader/ULoader.vue +11 -9
  127. package/ui.loader/storybook/stories.ts +2 -2
  128. package/ui.loader/types.ts +10 -3
  129. package/ui.loader-overlay/ULoaderOverlay.vue +11 -7
  130. package/ui.loader-overlay/storybook/stories.ts +2 -2
  131. package/ui.loader-overlay/types.ts +4 -3
  132. package/ui.loader-progress/ULoaderProgress.vue +14 -10
  133. package/ui.loader-progress/storybook/stories.ts +2 -2
  134. package/ui.loader-progress/types.ts +4 -3
  135. package/ui.navigation-pagination/UPagination.vue +34 -33
  136. package/ui.navigation-pagination/storybook/stories.ts +2 -2
  137. package/ui.navigation-pagination/types.ts +4 -3
  138. package/ui.navigation-progress/StepperProgress.vue +25 -12
  139. package/ui.navigation-progress/UProgress.vue +12 -12
  140. package/ui.navigation-progress/types.ts +4 -3
  141. package/ui.navigation-tab/UTab.vue +18 -9
  142. package/ui.navigation-tab/storybook/stories.ts +2 -2
  143. package/ui.navigation-tab/types.ts +4 -3
  144. package/ui.navigation-tabs/UTabs.vue +13 -8
  145. package/ui.navigation-tabs/storybook/stories.ts +2 -2
  146. package/ui.navigation-tabs/types.ts +5 -5
  147. package/ui.other-dot/UDot.vue +10 -8
  148. package/ui.other-dot/storybook/stories.ts +2 -2
  149. package/ui.other-dot/types.ts +4 -3
  150. package/ui.text-alert/UAlert.vue +24 -27
  151. package/ui.text-alert/storybook/stories.ts +2 -2
  152. package/ui.text-alert/types.ts +4 -3
  153. package/ui.text-badge/UBadge.vue +25 -13
  154. package/ui.text-badge/storybook/stories.ts +2 -2
  155. package/ui.text-badge/types.ts +4 -3
  156. package/ui.text-block/UText.vue +10 -9
  157. package/ui.text-block/storybook/stories.ts +2 -2
  158. package/ui.text-block/types.ts +4 -3
  159. package/ui.text-empty/UEmpty.vue +22 -19
  160. package/ui.text-empty/storybook/stories.ts +2 -2
  161. package/ui.text-empty/types.ts +4 -3
  162. package/ui.text-file/UFile.vue +23 -20
  163. package/ui.text-file/storybook/stories.ts +2 -2
  164. package/ui.text-file/types.ts +4 -3
  165. package/ui.text-files/UFiles.vue +16 -10
  166. package/ui.text-files/storybook/stories.ts +2 -2
  167. package/ui.text-files/types.ts +4 -3
  168. package/ui.text-header/UHeader.vue +11 -11
  169. package/ui.text-header/storybook/stories.ts +2 -2
  170. package/ui.text-header/types.ts +4 -3
  171. package/ui.text-money/UMoney.vue +20 -27
  172. package/ui.text-money/storybook/stories.ts +2 -2
  173. package/ui.text-money/types.ts +4 -3
  174. package/ui.text-notify/UNotify.vue +58 -41
  175. package/ui.text-notify/config.ts +3 -3
  176. package/ui.text-notify/constants.ts +18 -20
  177. package/ui.text-notify/storybook/stories.ts +2 -2
  178. package/ui.text-notify/types.ts +10 -5
  179. package/ui.text-notify/utilNotify.ts +17 -11
  180. package/utils/helper.ts +5 -5
  181. package/utils/storybook.ts +11 -1
  182. package/utils/ui.ts +19 -9
  183. package/web-types.json +521 -368
  184. package/ui.button-link/useAttrs.ts +0 -20
  185. package/ui.button-toggle/useAttrs.ts +0 -12
  186. package/ui.button-toggle-item/useAttrs.ts +0 -29
  187. package/ui.container-accordion/useAttrs.ts +0 -26
  188. package/ui.container-card/useAttrs.ts +0 -12
  189. package/ui.container-col/useAttrs.ts +0 -12
  190. package/ui.container-divider/useAttrs.ts +0 -17
  191. package/ui.container-group/useAttrs.ts +0 -12
  192. package/ui.container-groups/useAttrs.ts +0 -12
  193. package/ui.container-modal/useAttrs.ts +0 -12
  194. package/ui.container-modal-confirm/useAttrs.ts +0 -12
  195. package/ui.container-page/useAttrs.ts +0 -12
  196. package/ui.container-row/useAttrs.ts +0 -12
  197. package/ui.data-list/useAttrs.ts +0 -12
  198. package/ui.data-table/useAttrs.ts +0 -31
  199. package/ui.dropdown-badge/useAttrs.ts +0 -26
  200. package/ui.dropdown-button/useAttrs.ts +0 -26
  201. package/ui.dropdown-link/useAttrs.ts +0 -26
  202. package/ui.dropdown-list/useAttrs.ts +0 -12
  203. package/ui.form-calendar/useAttrs.ts +0 -12
  204. package/ui.form-checkbox/useAttrs.ts +0 -29
  205. package/ui.form-checkbox-group/useAttrs.ts +0 -12
  206. package/ui.form-checkbox-multi-state/useAttrs.ts +0 -37
  207. package/ui.form-color-picker/useAttrs.ts +0 -15
  208. package/ui.form-date-picker/useAttrs.ts +0 -43
  209. package/ui.form-date-picker-range/useAttrs.ts +0 -53
  210. package/ui.form-input/useAttrs.ts +0 -31
  211. package/ui.form-input-file/useAttrs.ts +0 -21
  212. package/ui.form-input-money/useAttrs.ts +0 -15
  213. package/ui.form-input-number/useAttrs.ts +0 -15
  214. package/ui.form-input-rating/useAttrs.ts +0 -14
  215. package/ui.form-input-search/useAttrs.ts +0 -15
  216. package/ui.form-label/useAttrs.ts +0 -20
  217. package/ui.form-radio/useAttrs.ts +0 -29
  218. package/ui.form-radio-group/useAttrs.ts +0 -12
  219. package/ui.form-select/useAttrs.js +0 -19
  220. package/ui.form-switch/useAttrs.ts +0 -28
  221. package/ui.form-textarea/useAttrs.ts +0 -21
  222. package/ui.image-avatar/useAttrs.ts +0 -12
  223. package/ui.image-icon/useAttrs.ts +0 -12
  224. package/ui.loader/useAttrs.ts +0 -12
  225. package/ui.loader-overlay/useAttrs.ts +0 -12
  226. package/ui.loader-progress/useAttrs.ts +0 -12
  227. package/ui.navigation-pagination/useAttrs.ts +0 -12
  228. package/ui.navigation-progress/useAttrs.ts +0 -17
  229. package/ui.navigation-tab/useAttrs.ts +0 -28
  230. package/ui.navigation-tabs/useAttrs.ts +0 -12
  231. package/ui.other-dot/useAttrs.ts +0 -12
  232. package/ui.text-alert/useAttrs.ts +0 -12
  233. package/ui.text-badge/useAttrs.ts +0 -21
  234. package/ui.text-block/useAttrs.ts +0 -12
  235. package/ui.text-empty/useAttrs.ts +0 -12
  236. package/ui.text-file/useAttrs.ts +0 -12
  237. package/ui.text-files/useAttrs.ts +0 -12
  238. package/ui.text-header/useAttrs.ts +0 -12
  239. package/ui.text-money/useAttrs.ts +0 -12
  240. package/ui.text-notify/useAttrs.ts +0 -12
@@ -1,27 +1,40 @@
1
1
  <script setup lang="ts">
2
- import colors from "tailwindcss/colors.js";
3
2
  import { computed } from "vue";
3
+ import colors from "tailwindcss/colors.js";
4
4
 
5
- import { GRAY_COLORS } from "../constants.js";
5
+ import useUI from "../composables/useUI.ts";
6
6
 
7
- import useAttrs from "./useAttrs.ts";
7
+ import defaultConfig from "./config.ts";
8
+ import { GRAY_COLORS } from "../constants.js";
8
9
 
9
- import type { StepperProgressProps } from "./types.ts";
10
+ import type { StepperProgressProps, Config } from "./types.ts";
10
11
 
11
12
  const props = withDefaults(defineProps<StepperProgressProps>(), {
12
13
  dataTest: "",
13
14
  });
14
15
 
15
- const { stepperCircleAttrs, stepperCountAttrs, stepperGradientAttrs, stepperSvgAttrs } =
16
- useAttrs(props);
17
-
18
16
  const stepperColor = computed(() => {
19
- return colors[props.color]
20
- ? colors[props.color][500]
21
- : GRAY_COLORS.includes(props.color)
22
- ? colors[props.color][900]
23
- : colors.zinc[900];
17
+ const isValidColor = (color: string): color is keyof typeof colors => color in colors;
18
+
19
+ const isGrayColor = (color: string): color is keyof typeof colors => GRAY_COLORS.includes(color);
20
+
21
+ if (isValidColor(props.color)) {
22
+ return colors[props.color][500];
23
+ }
24
+
25
+ if (isGrayColor(props.color)) {
26
+ return colors[props.color][900];
27
+ }
28
+
29
+ return colors.zinc[900];
24
30
  });
31
+
32
+ /**
33
+ * Get element / nested component attributes for each config token ✨
34
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
35
+ */
36
+ const { stepperCircleAttrs, stepperCountAttrs, stepperGradientAttrs, stepperSvgAttrs } =
37
+ useUI<Config>(defaultConfig);
25
38
  </script>
26
39
 
27
40
  <template>
@@ -1,8 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from "vue";
3
3
 
4
- import { getDefault } from "../utils/ui.ts";
5
- import useAttrs from "./useAttrs.ts";
4
+ import useUI from "../composables/useUI.ts";
5
+ import { getDefaults } from "../utils/ui.ts";
6
6
 
7
7
  import defaultConfig from "./config.ts";
8
8
  import { UProgress, VARIANT } from "./constants.ts";
@@ -10,22 +10,15 @@ import { UProgress, VARIANT } from "./constants.ts";
10
10
  import StepperProgress from "./StepperProgress.vue";
11
11
  import UHeader from "../ui.text-header/UHeader.vue";
12
12
 
13
- import type { UProgressProps, HeaderSize } from "./types.ts";
13
+ import type { UProgressProps, HeaderSize, Config } from "./types.ts";
14
14
 
15
15
  defineOptions({ inheritAttrs: false });
16
16
 
17
17
  const props = withDefaults(defineProps<UProgressProps>(), {
18
- value: 0,
19
- max: getDefault<UProgressProps>(defaultConfig, UProgress).max as number,
20
- size: getDefault<UProgressProps>(defaultConfig, UProgress).size,
21
- color: getDefault<UProgressProps>(defaultConfig, UProgress).color,
22
- variant: getDefault<UProgressProps>(defaultConfig, UProgress).variant,
23
- indicator: getDefault<UProgressProps>(defaultConfig, UProgress).indicator,
24
- dataTest: "",
18
+ ...getDefaults<UProgressProps, Config>(defaultConfig, UProgress),
19
+ max: 100,
25
20
  });
26
21
 
27
- const { progressAttrs, wrapperAttrs, indicatorAttrs, stepAttrs, stepperAttrs } = useAttrs(props);
28
-
29
22
  const headerSize = computed(() => {
30
23
  const sizes = {
31
24
  "2xs": "xs",
@@ -69,6 +62,13 @@ const progressPercent = computed(() => {
69
62
  function isActiveStep(index: number) {
70
63
  return index === props.value;
71
64
  }
65
+
66
+ /**
67
+ * Get element / nested component attributes for each config token ✨
68
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
69
+ */
70
+ const { progressAttrs, wrapperAttrs, indicatorAttrs, stepAttrs, stepperAttrs } =
71
+ useUI<Config>(defaultConfig);
72
72
  </script>
73
73
 
74
74
  <template>
@@ -1,6 +1,7 @@
1
1
  import defaultConfig from "./config.ts";
2
+ import type { ComponentConfig } from "../types.ts";
2
3
 
3
- export type Config = Partial<typeof defaultConfig>;
4
+ export type Config = typeof defaultConfig;
4
5
 
5
6
  export type HeaderSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
6
7
 
@@ -59,7 +60,7 @@ export interface UProgressProps {
59
60
  /**
60
61
  * Component config object.
61
62
  */
62
- config?: Config;
63
+ config?: ComponentConfig<Config>;
63
64
 
64
65
  /**
65
66
  * Data-test attribute for automated testing.
@@ -86,7 +87,7 @@ export interface StepperProgressProps {
86
87
  /**
87
88
  * Component config object.
88
89
  */
89
- config?: Config;
90
+ config?: ComponentConfig<Config>;
90
91
 
91
92
  /**
92
93
  * Data-test attribute for automated testing.
@@ -1,13 +1,13 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, inject, toValue } from "vue";
3
3
 
4
- import { getDefault } from "../utils/ui.ts";
4
+ import useUI from "../composables/useUI.ts";
5
+ import { getDefaults } from "../utils/ui.ts";
5
6
 
6
7
  import { UTab } from "./constants.ts";
7
8
  import defaultConfig from "./config.ts";
8
- import useAttrs from "./useAttrs.ts";
9
9
 
10
- import type { UTabProps, UTabSize } from "./types.ts";
10
+ import type { Props, UTabSize, Config } from "./types.ts";
11
11
  import type { SetUTabsSelectedItem } from "../ui.navigation-tabs/types.ts";
12
12
 
13
13
  defineOptions({ inheritAttrs: false });
@@ -16,9 +16,8 @@ const setUTabsSelectedItem = inject<SetUTabsSelectedItem | null>("setUTabsSelect
16
16
  const getUTabsSelectedItem = inject("getUTabsSelectedItem", null);
17
17
  const getUTabsSize = inject("getUTabsSize", null);
18
18
 
19
- const props = withDefaults(defineProps<UTabProps>(), {
20
- disabled: getDefault<UTabProps>(defaultConfig, UTab).disabled,
21
- dataTest: "",
19
+ const props = withDefaults(defineProps<Props>(), {
20
+ ...getDefaults<Props, Config>(defaultConfig, UTab),
22
21
  });
23
22
 
24
23
  const selected = computed(() => {
@@ -26,16 +25,26 @@ const selected = computed(() => {
26
25
  });
27
26
 
28
27
  const size = computed(() => {
29
- return toValue(getUTabsSize) || getDefault<UTabSize>(defaultConfig, UTab).size;
28
+ return toValue(getUTabsSize) || getDefaults<UTabSize, Config>(defaultConfig, UTab).size;
30
29
  });
31
30
 
32
- const { tabAttrs } = useAttrs(props, { selected, size });
33
-
34
31
  async function onClickSetValue() {
35
32
  if (!props.disabled && setUTabsSelectedItem) {
36
33
  setUTabsSelectedItem(props.value ?? "");
37
34
  }
38
35
  }
36
+
37
+ /**
38
+ * Get element / nested component attributes for each config token ✨
39
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
40
+ */
41
+ const mutatedProps = computed(() => ({
42
+ size: size.value,
43
+ /* component state, not a props */
44
+ selected: selected.value,
45
+ }));
46
+
47
+ const { tabAttrs } = useUI<Config>(defaultConfig, mutatedProps);
39
48
  </script>
40
49
 
41
50
  <template>
@@ -9,9 +9,9 @@ import UTab from "../../ui.navigation-tab/UTab.vue";
9
9
  import UIcon from "../../ui.image-icon/UIcon.vue";
10
10
 
11
11
  import type { Meta, StoryFn } from "@storybook/vue3";
12
- import type { UTabProps } from "../types.ts";
12
+ import type { Props } from "../types.ts";
13
13
 
14
- interface UTabArgs extends UTabProps {
14
+ interface UTabArgs extends Props {
15
15
  slotTemplate?: string;
16
16
  }
17
17
 
@@ -1,12 +1,13 @@
1
1
  import defaultConfig from "./config.ts";
2
+ import type { ComponentConfig } from "../types.ts";
2
3
 
3
- export type Config = Partial<typeof defaultConfig>;
4
+ export type Config = typeof defaultConfig;
4
5
 
5
6
  export interface UTabSize {
6
7
  size: string;
7
8
  }
8
9
 
9
- export interface UTabProps {
10
+ export interface Props {
10
11
  /**
11
12
  * Tab label.
12
13
  */
@@ -25,7 +26,7 @@ export interface UTabProps {
25
26
  /**
26
27
  * Component config object.
27
28
  */
28
- config?: Config;
29
+ config?: ComponentConfig<Config>;
29
30
 
30
31
  /**
31
32
  * Data-test attribute for automated testing.
@@ -1,21 +1,22 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, provide } from "vue";
3
3
 
4
+ import useUI from "../composables/useUI.ts";
5
+ import { getDefaults } from "../utils/ui.ts";
6
+
4
7
  import UTab from "../ui.navigation-tab/UTab.vue";
5
- import { getDefault } from "../utils/ui.ts";
6
8
 
7
9
  import { UTabs } from "./constants.ts";
8
10
  import defaultConfig from "./config.ts";
9
- import useAttrs from "./useAttrs.ts";
10
11
 
11
- import type { UTabsProps } from "./types.ts";
12
+ import type { Props, Config } from "./types.ts";
12
13
 
13
14
  defineOptions({ inheritAttrs: false });
14
15
 
15
- const props = withDefaults(defineProps<UTabsProps>(), {
16
- size: getDefault<UTabsProps>(defaultConfig, UTabs).size,
17
- underlined: getDefault<UTabsProps>(defaultConfig, UTabs).underlined,
18
- dataTest: "",
16
+ const props = withDefaults(defineProps<Props>(), {
17
+ ...getDefaults<Props, Config>(defaultConfig, UTabs),
18
+ modelValue: "",
19
+ options: () => [],
19
20
  });
20
21
 
21
22
  const emit = defineEmits([
@@ -35,7 +36,11 @@ provide("setUTabsSelectedItem", (value: string) => (selectedItem.value = value))
35
36
  provide("getUTabsSelectedItem", () => selectedItem.value);
36
37
  provide("getUTabsSize", () => props.size);
37
38
 
38
- const { tabsAttrs, itemAttrs } = useAttrs(props);
39
+ /**
40
+ * Get element / nested component attributes for each config token ✨
41
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
42
+ */
43
+ const { tabsAttrs, itemAttrs } = useUI<Config>(defaultConfig);
39
44
  </script>
40
45
 
41
46
  <template>
@@ -8,9 +8,9 @@ import {
8
8
  import UTabs from "../../ui.navigation-tabs/UTabs.vue";
9
9
 
10
10
  import type { Meta, StoryFn } from "@storybook/vue3";
11
- import type { UTabsProps } from "../types.ts";
11
+ import type { Props } from "../types.ts";
12
12
 
13
- interface UTabsArgs extends UTabsProps {
13
+ interface UTabsArgs extends Props {
14
14
  slotTemplate?: string;
15
15
  enum: "size";
16
16
  }
@@ -1,8 +1,8 @@
1
1
  import defaultConfig from "./config.ts";
2
2
 
3
- import type { UnknownObject, UnknownArray } from "../types.ts";
3
+ import type { ComponentConfig, UnknownObject, UnknownArray } from "../types.ts";
4
4
 
5
- export type Config = Partial<typeof defaultConfig>;
5
+ export type Config = typeof defaultConfig;
6
6
 
7
7
  export type SetUTabsSelectedItem = (
8
8
  value: string | number | boolean | UnknownArray | UnknownObject,
@@ -11,10 +11,10 @@ export type SetUTabsSelectedItem = (
11
11
  interface UTabsOption {
12
12
  value: string | number;
13
13
  label: string;
14
- disabled: boolean;
14
+ disabled?: boolean;
15
15
  }
16
16
 
17
- export interface UTabsProps {
17
+ export interface Props {
18
18
  /**
19
19
  * Selected tab value.
20
20
  */
@@ -38,7 +38,7 @@ export interface UTabsProps {
38
38
  /**
39
39
  * Component config object.
40
40
  */
41
- config?: Config;
41
+ config?: ComponentConfig<Config>;
42
42
 
43
43
  /**
44
44
  * Data-test attribute for automated testing.
@@ -1,21 +1,23 @@
1
1
  <script setup lang="ts">
2
- import { getDefault } from "../utils/ui.ts";
2
+ import useUI from "../composables/useUI.ts";
3
+ import { getDefaults } from "../utils/ui.ts";
3
4
 
4
5
  import { UDot } from "./constants.ts";
5
6
  import defaultConfig from "./config.ts";
6
- import useAttrs from "./useAttrs.ts";
7
7
 
8
- import type { UDotProps } from "./types.ts";
8
+ import type { Props, Config } from "./types.ts";
9
9
 
10
10
  defineOptions({ inheritAttrs: false });
11
11
 
12
- const props = withDefaults(defineProps<UDotProps>(), {
13
- color: getDefault<UDotProps>(defaultConfig, UDot).color,
14
- size: getDefault<UDotProps>(defaultConfig, UDot).size,
15
- dataTest: "",
12
+ withDefaults(defineProps<Props>(), {
13
+ ...getDefaults<Props, Config>(defaultConfig, UDot),
16
14
  });
17
15
 
18
- const { dotAttrs } = useAttrs(props);
16
+ /**
17
+ * Get element / nested component attributes for each config token ✨
18
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
19
+ */
20
+ const { dotAttrs } = useUI<Config>(defaultConfig);
19
21
  </script>
20
22
 
21
23
  <template>
@@ -11,9 +11,9 @@ import UCol from "../../ui.container-col/UCol.vue";
11
11
  import UBadge from "../../ui.text-badge/UBadge.vue";
12
12
 
13
13
  import type { Meta, StoryFn } from "@storybook/vue3";
14
- import type { UDotProps } from "../types.ts";
14
+ import type { Props } from "../types.ts";
15
15
 
16
- interface UDotArgs extends UDotProps {
16
+ interface UDotArgs extends Props {
17
17
  slotTemplate?: string;
18
18
  enum: "size" | "color";
19
19
  }
@@ -1,8 +1,9 @@
1
1
  import defaultConfig from "./config.ts";
2
+ import type { ComponentConfig } from "../types.ts";
2
3
 
3
- export type Config = Partial<typeof defaultConfig>;
4
+ export type Config = typeof defaultConfig;
4
5
 
5
- export interface UDotProps {
6
+ export interface Props {
6
7
  /**
7
8
  * Dot color.
8
9
  */
@@ -37,7 +38,7 @@ export interface UDotProps {
37
38
  /**
38
39
  * Component config object.
39
40
  */
40
- config?: Config;
41
+ config?: ComponentConfig<Config>;
41
42
 
42
43
  /**
43
44
  * Data-test attribute for automated testing.
@@ -1,7 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import { onMounted, ref, computed } from "vue";
3
3
 
4
- import { getDefault } from "../utils/ui.ts";
4
+ import useUI from "../composables/useUI.ts";
5
+ import { getDefaults } from "../utils/ui.ts";
5
6
  import { hasSlotContent } from "../utils/helper.ts";
6
7
 
7
8
  import UIcon from "../ui.image-icon/UIcon.vue";
@@ -10,21 +11,13 @@ import UText from "../ui.text-block/UText.vue";
10
11
 
11
12
  import { UAlert } from "./constants.ts";
12
13
  import defaultConfig from "./config.ts";
13
- import useAttrs from "./useAttrs.ts";
14
14
 
15
- import type { UAlertProps, TextSize, CloseIconSize } from "./types.ts";
15
+ import type { Props, TextSize, CloseIconSize, Config } from "./types.ts";
16
16
 
17
17
  defineOptions({ inheritAttrs: false });
18
18
 
19
- const props = withDefaults(defineProps<UAlertProps>(), {
20
- variant: getDefault<UAlertProps>(defaultConfig, UAlert).variant,
21
- bordered: getDefault<UAlertProps>(defaultConfig, UAlert).bordered,
22
- size: getDefault<UAlertProps>(defaultConfig, UAlert).size,
23
- color: getDefault<UAlertProps>(defaultConfig, UAlert).color,
24
- timeout: getDefault<UAlertProps>(defaultConfig, UAlert).timeout,
25
- closable: getDefault<UAlertProps>(defaultConfig, UAlert).closable,
26
- dataTest: "",
27
- config: () => ({}),
19
+ const props = withDefaults(defineProps<Props>(), {
20
+ ...getDefaults<Props, Config>(defaultConfig, UAlert),
28
21
  });
29
22
 
30
23
  const emit = defineEmits([
@@ -36,19 +29,6 @@ const emit = defineEmits([
36
29
 
37
30
  const isShownAlert = ref(true);
38
31
 
39
- const {
40
- config,
41
- wrapperAttrs,
42
- bodyAttrs,
43
- contentAttrs,
44
- textAttrs,
45
- titleAttrs,
46
- descriptionAttrs,
47
- closeButtonAttrs,
48
- closeIconAttrs,
49
- contentWrapperAttrs,
50
- } = useAttrs(props);
51
-
52
32
  onMounted(() => {
53
33
  if (props.timeout > 0) {
54
34
  setTimeout(() => onClickClose(), props.timeout);
@@ -94,6 +74,23 @@ const iconColor = computed(() => {
94
74
 
95
75
  return props.variant === "primary" ? "white" : props.color;
96
76
  });
77
+
78
+ /**
79
+ * Get element / nested component attributes for each config token ✨
80
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
81
+ */
82
+ const {
83
+ config,
84
+ wrapperAttrs,
85
+ bodyAttrs,
86
+ contentAttrs,
87
+ textAttrs,
88
+ titleAttrs,
89
+ descriptionAttrs,
90
+ closeButtonAttrs,
91
+ closeIconAttrs,
92
+ contentWrapperAttrs,
93
+ } = useUI<Config>(defaultConfig);
97
94
  </script>
98
95
 
99
96
  <template>
@@ -154,7 +151,7 @@ const iconColor = computed(() => {
154
151
  -->
155
152
  <slot
156
153
  name="close"
157
- :icon-name="config?.defaults?.closeIcon"
154
+ :icon-name="config.defaults.closeIcon"
158
155
  :icon-size="closeIconSize"
159
156
  :icon-color="iconColor"
160
157
  >
@@ -162,7 +159,7 @@ const iconColor = computed(() => {
162
159
  internal
163
160
  :size="closeIconSize"
164
161
  :color="iconColor"
165
- :name="config.defaults?.closeIcon"
162
+ :name="config.defaults.closeIcon"
166
163
  v-bind="closeIconAttrs"
167
164
  :data-test="`${dataTest}-button`"
168
165
  />
@@ -12,9 +12,9 @@ import UIcon from "../../ui.image-icon/UIcon.vue";
12
12
  import UButton from "../../ui.button/UButton.vue";
13
13
 
14
14
  import type { Meta, StoryFn } from "@storybook/vue3";
15
- import type { UAlertProps } from "../types.ts";
15
+ import type { Props } from "../types.ts";
16
16
 
17
- interface UAlertArgs extends UAlertProps {
17
+ interface UAlertArgs extends Props {
18
18
  slotTemplate?: string;
19
19
  enum: "size" | "color" | "variant";
20
20
  }
@@ -1,11 +1,12 @@
1
1
  import defaultConfig from "./config.ts";
2
+ import type { ComponentConfig } from "../types.ts";
2
3
 
3
- export type Config = Partial<typeof defaultConfig>;
4
+ export type Config = typeof defaultConfig;
4
5
 
5
6
  export type TextSize = "sm" | "md" | "lg";
6
7
  export type CloseIconSize = "3xs" | "2xs" | "xs" | "sm";
7
8
 
8
- export interface UAlertProps {
9
+ export interface Props {
9
10
  /**
10
11
  * Alert title.
11
12
  */
@@ -70,7 +71,7 @@ export interface UAlertProps {
70
71
  /**
71
72
  * Component config object.
72
73
  */
73
- config?: Config;
74
+ config?: ComponentConfig<Config>;
74
75
 
75
76
  /**
76
77
  * Data-test attribute for automated testing.
@@ -1,25 +1,22 @@
1
1
  <script setup lang="ts">
2
- import { useTemplateRef, computed } from "vue";
2
+ import { useTemplateRef, computed, useSlots } from "vue";
3
+
4
+ import useUI from "../composables/useUI.ts";
5
+ import { hasSlotContent } from "../utils/helper.ts";
6
+ import { getDefaults } from "../utils/ui.ts";
3
7
 
4
- import { getDefault } from "../utils/ui.ts";
5
8
  import UIcon from "../ui.image-icon/UIcon.vue";
6
9
 
7
10
  import { UBadge } from "./constants.ts";
8
- import useAttrs from "./useAttrs.ts";
9
11
  import defaultConfig from "./config.ts";
10
12
 
11
- import type { UBadgeProps, IconSize } from "./types.ts";
13
+ import type { Props, IconSize, Config } from "./types.ts";
12
14
 
13
15
  defineOptions({ inheritAttrs: false });
14
16
 
15
- const props = withDefaults(defineProps<UBadgeProps>(), {
16
- variant: getDefault<UBadgeProps>(defaultConfig, UBadge).variant,
17
- bordered: getDefault<UBadgeProps>(defaultConfig, UBadge).bordered,
18
- size: getDefault<UBadgeProps>(defaultConfig, UBadge).size,
19
- color: getDefault<UBadgeProps>(defaultConfig, UBadge).color,
20
- round: getDefault<UBadgeProps>(defaultConfig, UBadge).round,
21
- tabindex: getDefault<UBadgeProps>(defaultConfig, UBadge).tabindex,
22
- dataTest: "",
17
+ const props = withDefaults(defineProps<Props>(), {
18
+ ...getDefaults<Props, Config>(defaultConfig, UBadge),
19
+ label: "",
23
20
  });
24
21
 
25
22
  const emit = defineEmits([
@@ -44,7 +41,7 @@ const emit = defineEmits([
44
41
  "click",
45
42
  ]);
46
43
 
47
- const { badgeAttrs, bodyAttrs, leftIconAttrs, centerIconAttrs, rightIconAttrs } = useAttrs(props);
44
+ const slots = useSlots();
48
45
 
49
46
  const wrapperRef = useTemplateRef<HTMLElement>("wrapper");
50
47
 
@@ -85,6 +82,21 @@ defineExpose({
85
82
  */
86
83
  wrapperRef,
87
84
  });
85
+
86
+ /**
87
+ * Get element / nested component attributes for each config token ✨
88
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
89
+ */
90
+ const mutatedProps = computed(() => ({
91
+ tabindex: Boolean(~Number(props.tabindex)),
92
+ leftIcon: Boolean(props.leftIcon) || hasSlotContent(slots["left"]),
93
+ rightIcon: Boolean(props.rightIcon) || hasSlotContent(slots["right"]),
94
+ }));
95
+
96
+ const { badgeAttrs, bodyAttrs, leftIconAttrs, centerIconAttrs, rightIconAttrs } = useUI<Config>(
97
+ defaultConfig,
98
+ mutatedProps,
99
+ );
88
100
  </script>
89
101
 
90
102
  <template>
@@ -11,9 +11,9 @@ import URow from "../../ui.container-row/URow.vue";
11
11
  import UCol from "../../ui.container-col/UCol.vue";
12
12
 
13
13
  import type { Meta, StoryFn } from "@storybook/vue3";
14
- import type { UBadgeProps } from "../types.ts";
14
+ import type { Props } from "../types.ts";
15
15
 
16
- interface UBadgeArgs extends UBadgeProps {
16
+ interface UBadgeArgs extends Props {
17
17
  slotTemplate?: string;
18
18
  enum: "variant" | "size";
19
19
  }
@@ -1,10 +1,11 @@
1
1
  import defaultConfig from "./config.ts";
2
+ import type { ComponentConfig } from "../types.ts";
2
3
 
3
- export type Config = Partial<typeof defaultConfig>;
4
+ export type Config = typeof defaultConfig;
4
5
 
5
6
  export type IconSize = "3xs" | "2xs" | "xs";
6
7
 
7
- export interface UBadgeProps {
8
+ export interface Props {
8
9
  /**
9
10
  * Badge label.
10
11
  */
@@ -79,7 +80,7 @@ export interface UBadgeProps {
79
80
  /**
80
81
  * Component config object.
81
82
  */
82
- config?: Config;
83
+ config?: ComponentConfig<Config>;
83
84
 
84
85
  /**
85
86
  * Data-test attribute for automated testing.
@@ -1,23 +1,24 @@
1
1
  <script setup lang="ts">
2
- import { getDefault } from "../utils/ui.ts";
2
+ import useUI from "../composables/useUI.ts";
3
+ import { getDefaults } from "../utils/ui.ts";
3
4
  import { hasSlotContent } from "../utils/helper.ts";
4
5
 
5
6
  import { UText } from "./constants.ts";
6
7
  import defaultConfig from "./config.ts";
7
- import useAttrs from "./useAttrs.ts";
8
8
 
9
- import type { UTextProps } from "./types.ts";
9
+ import type { Props, Config } from "./types.ts";
10
10
 
11
11
  defineOptions({ inheritAttrs: false });
12
12
 
13
- const props = withDefaults(defineProps<UTextProps>(), {
14
- size: getDefault<UTextProps>(defaultConfig, UText).size,
15
- align: getDefault<UTextProps>(defaultConfig, UText).align,
16
- line: getDefault<UTextProps>(defaultConfig, UText).line,
17
- dataTest: "",
13
+ withDefaults(defineProps<Props>(), {
14
+ ...getDefaults<Props, Config>(defaultConfig, UText),
18
15
  });
19
16
 
20
- const { wrapperAttrs, htmlAttrs } = useAttrs(props);
17
+ /**
18
+ * Get element / nested component attributes for each config token ✨
19
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
20
+ */
21
+ const { wrapperAttrs, htmlAttrs } = useUI<Config>(defaultConfig);
21
22
  </script>
22
23
 
23
24
  <template>
@@ -9,9 +9,9 @@ import UText from "../../ui.text-block/UText.vue";
9
9
  import URow from "../../ui.container-row/URow.vue";
10
10
 
11
11
  import type { Meta, StoryFn } from "@storybook/vue3";
12
- import type { UTextProps } from "../types.ts";
12
+ import type { Props } from "../types.ts";
13
13
 
14
- interface UTextArgs extends UTextProps {
14
+ interface UTextArgs extends Props {
15
15
  slotTemplate?: string;
16
16
  enum: "size";
17
17
  }