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
@@ -10,19 +10,19 @@ import {
10
10
  EXTENDS_PATTERN_REG_EXP,
11
11
  } from "../constants.js";
12
12
 
13
- import type { ComponentInternalInstance, ComputedRef } from "vue";
13
+ import type { ComponentInternalInstance, Ref, ComputedRef } from "vue";
14
14
  import type {
15
- BrandColors,
16
- Strategies,
17
- UnknownObject,
18
- Component,
19
- NestedComponent,
20
- ComponentNames,
21
15
  CVA,
22
16
  UseUI,
23
17
  KeyAttrs,
24
18
  KeysAttrs,
25
- ExtendedKeyClasses,
19
+ Strategies,
20
+ BrandColors,
21
+ MutatedProps,
22
+ UnknownObject,
23
+ ComponentNames,
24
+ ComponentConfig,
25
+ KeyAttrsWithConfig,
26
26
  } from "../types.ts";
27
27
 
28
28
  /**
@@ -33,45 +33,40 @@ import type {
33
33
  * 4. Component classes (class="...")
34
34
  */
35
35
  export default function useUI<T>(
36
- defaultConfig: T & Component,
37
- propsConfigGetter?: () => T & Component,
36
+ defaultConfig: T,
37
+ mutatedProps?: MutatedProps,
38
38
  topLevelClassKey?: string,
39
- mutatedProps?: ComputedRef,
40
- ): UseUI<T> {
39
+ ) {
41
40
  const { type, props } = getCurrentInstance() as ComponentInternalInstance;
41
+
42
42
  const componentName = type.__name as ComponentNames;
43
43
  const globalConfig = vuelessConfig?.component?.[componentName] || {};
44
44
 
45
- const isStrategyValid =
46
- vuelessConfig.strategy && Object.values(STRATEGY_TYPE).includes(vuelessConfig.strategy);
47
-
48
- const vuelessStrategy = isStrategyValid
45
+ const vuelessStrategy = Object.values(STRATEGY_TYPE).includes(vuelessConfig.strategy || "")
49
46
  ? (vuelessConfig.strategy as Strategies)
50
47
  : (STRATEGY_TYPE.merge as Strategies);
51
48
 
52
- const firstClassKey = defaultConfig ? Object.keys(defaultConfig)[0] : "";
53
- const config = ref({} as T & Component);
49
+ const firstClassKey = Object.keys(defaultConfig || {})[0];
50
+ const config = ref({}) as Ref<ComponentConfig<T>>;
54
51
  const attrs = useAttrs();
55
52
 
56
53
  watchEffect(() => {
57
- const propsConfig = propsConfigGetter ? propsConfigGetter() : {};
58
-
59
54
  config.value = getMergedConfig({
60
55
  defaultConfig,
61
56
  globalConfig,
62
- propsConfig,
57
+ propsConfig: props.config,
63
58
  vuelessStrategy,
64
- });
59
+ }) as ComponentConfig<T>;
65
60
  });
66
61
 
67
62
  /**
68
63
  * Get classes by given key (including CVA if config set).
69
64
  */
70
- function getClasses(key: string, mutatedProps: UnknownObject): ComputedRef<string> {
65
+ function getClasses(key: string, mutatedProps?: MutatedProps) {
71
66
  return computed(() => {
72
67
  const mutatedPropsValue = toValue(mutatedProps);
73
- const color = (toValue(mutatedProps)?.color as BrandColors) || props?.color;
74
- const value = config.value[key] as (CVA & NestedComponent) | string;
68
+ const color = (toValue(mutatedProps || {}).color || props.color) as BrandColors;
69
+ const value = (config.value as ComponentConfig<T>)[key];
75
70
 
76
71
  let classes = "";
77
72
 
@@ -95,28 +90,13 @@ export default function useUI<T>(
95
90
  });
96
91
  }
97
92
 
98
- /**
99
- * Get an object where:
100
- * – key: extendingKey
101
- * – value: reactive string of extendingKey classes.
102
- */
103
- function getExtendingKeysClasses(extendingKeys: string[], mutatedProps = {}) {
104
- const extendingClasses: ExtendedKeyClasses = {};
105
-
106
- for (const key of extendingKeys) {
107
- extendingClasses[key] = getClasses(key, mutatedProps);
108
- }
109
-
110
- return extendingClasses;
111
- }
112
-
113
93
  /**
114
94
  * Returns an object where:
115
95
  * – key: elementKey
116
96
  * – value: reactive object of string element attributes (with classes).
117
97
  */
118
- function getKeysAttrs(mutatedProps = {}): KeysAttrs {
119
- const keysAttrs: KeysAttrs = {};
98
+ function getKeysAttrs(mutatedProps?: MutatedProps) {
99
+ const keysAttrs: KeysAttrs<T> = {};
120
100
 
121
101
  for (const key in config.value) {
122
102
  if (isSystemKey(key)) continue;
@@ -127,10 +107,9 @@ export default function useUI<T>(
127
107
  const extendsKeys = getExtendsKeys(baseClasses);
128
108
 
129
109
  if (extendsKeys.length) {
130
- const classes = getExtendingKeysClasses(extendsKeys, mutatedProps);
131
- const extendsClasses = Object.values(classes).map((item) => toValue(item));
110
+ const extendsClasses = extendsKeys.map((key) => toValue(getClasses(key, mutatedProps)));
132
111
 
133
- const keyAttrs = keysAttrs[`${key}Attrs`] as ComputedRef<KeyAttrs>;
112
+ const keyAttrs = keysAttrs[`${key}Attrs`];
134
113
 
135
114
  keysAttrs[`${key}Attrs`] = computed(() => ({
136
115
  ...keyAttrs.value,
@@ -140,9 +119,9 @@ export default function useUI<T>(
140
119
  ]),
141
120
  config: getMergedConfig({
142
121
  defaultConfig: config.value[extendsKeys[0]],
143
- globalConfig: keyAttrs.value.config as Component,
122
+ globalConfig: keyAttrs.value.config,
144
123
  }),
145
- }));
124
+ })) as ComputedRef<KeyAttrsWithConfig<T>>;
146
125
  }
147
126
  }
148
127
 
@@ -152,24 +131,24 @@ export default function useUI<T>(
152
131
  /**
153
132
  * Get an element attributes for a given key.
154
133
  */
155
- function getAttrs(configKey: string, classes: ComputedRef) {
134
+ function getAttrs(configKey: string, classes: ComputedRef<string>) {
156
135
  const nestedComponent = getNestedComponent(config.value[configKey] || "");
157
136
 
158
- const attrs = useAttrs();
137
+ const attrs = useAttrs() as KeyAttrs;
159
138
  const isDev = isCSR && import.meta.env?.DEV;
160
139
  const vuelessAttrs = ref({});
161
140
  const isTopLevelKey = (topLevelClassKey || firstClassKey) === configKey;
162
141
 
163
142
  const commonAttrs: KeyAttrs = {
164
143
  ...(isTopLevelKey ? attrs : {}),
165
- "vl-component": isDev ? (attrs["vl-component"] as string) || componentName || null : null,
166
- "vl-key": isDev ? (attrs["vl-config-key"] as string) || configKey || null : null,
144
+ "vl-component": isDev ? attrs["vl-component"] || componentName || null : null,
145
+ "vl-key": isDev ? attrs["vl-key"] || configKey || null : null,
167
146
  "vl-child-component":
168
147
  isDev && attrs["vl-component"] ? nestedComponent || componentName : null,
169
148
  "vl-child-key": isDev && attrs["vl-component"] ? configKey : null,
170
149
  };
171
150
 
172
- // Delete value key to prevent v-model overwrite
151
+ /* Delete value key to prevent v-model overwrite. */
173
152
  delete commonAttrs.value;
174
153
 
175
154
  watch(config, updateVuelessAttrs, { immediate: true });
@@ -180,28 +159,35 @@ export default function useUI<T>(
180
159
  }
181
160
 
182
161
  function updateVuelessAttrs() {
183
- const configKeyValue = config.value[configKey] as Component | string;
184
- const isObject = typeof configKeyValue === "object";
162
+ const configKeyValue = config.value[configKey];
163
+
164
+ let configAttr = {};
165
+ let defaultAttrs = {};
166
+
167
+ if (typeof configKeyValue === "object") {
168
+ configAttr = configKeyValue;
169
+ defaultAttrs = configKeyValue?.defaults;
170
+ }
185
171
 
186
172
  vuelessAttrs.value = {
187
173
  ...commonAttrs,
188
174
  class: toValue(classes),
189
- ...(isObject ? { config: configKeyValue } : {}),
190
- ...(isObject ? configKeyValue.defaults : {}),
175
+ config: configAttr,
176
+ ...defaultAttrs,
191
177
  };
192
178
  }
193
179
 
194
180
  return vuelessAttrs;
195
181
  }
196
182
 
197
- return { config, getKeysAttrs, ...getKeysAttrs(mutatedProps) };
183
+ return { config, getKeysAttrs, ...getKeysAttrs(mutatedProps) } as UseUI<T>;
198
184
  }
199
185
 
200
186
  /**
201
187
  * Return base classes.
202
188
  */
203
- function getBaseClasses(value: string | CVA | NestedComponent) {
204
- return typeof value === "object" ? (value.base as string) || "" : value || "";
189
+ function getBaseClasses(value: string | CVA) {
190
+ return typeof value === "object" ? value.base || "" : value || "";
205
191
  }
206
192
 
207
193
  /**
@@ -217,7 +203,7 @@ function getExtendsKeys(values: string = ""): string[] {
217
203
  /**
218
204
  * Check is config key contains component name and returns it.
219
205
  */
220
- function getNestedComponent(value: string | NestedComponent | CVA) {
206
+ function getNestedComponent(value: string | CVA) {
221
207
  const classes = getBaseClasses(value);
222
208
  const match = classes.match(NESTED_COMPONENT_PATTERN_REG_EXP);
223
209
 
package/constants.js CHANGED
@@ -72,6 +72,9 @@ export const SYSTEM_CONFIG_KEY = {
72
72
  ...CVA_CONFIG_KEY,
73
73
  };
74
74
 
75
+ /* Vueless system non-props defaults */
76
+ export const SYSTEM_NON_PROPS_DEFAULTS = ["library", "style", "weight"];
77
+
75
78
  /* Component to folder mapping. */
76
79
  export const COMPONENTS = {
77
80
  /* Buttons & Links */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.579",
3
+ "version": "0.0.580",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless UI Component Library, powered by Tailwind CSS.",
6
6
  "keywords": [
package/types.ts CHANGED
@@ -55,7 +55,7 @@ import UInputFileConfig from "./ui.form-input-file/config.ts";
55
55
  import UInputMoneyConfig from "./ui.form-input-money/config.ts";
56
56
  import UDataListConfig from "./ui.data-list/config.ts";
57
57
 
58
- import type { ComputedRef, MaybeRef, Ref, UnwrapRef } from "vue";
58
+ import type { ComputedRef, MaybeRef, Ref } from "vue";
59
59
  import type { Props } from "tippy.js";
60
60
  import type { LocaleOptions } from "./adatper.locale/vueless.ts";
61
61
 
@@ -67,10 +67,6 @@ export enum ColorMode {
67
67
  Auto = "auto",
68
68
  }
69
69
 
70
- export interface ExtendedKeyClasses {
71
- [key: string]: Ref<string>;
72
- }
73
-
74
70
  export interface ThemeConfig {
75
71
  /**
76
72
  * Components brand (primary) color.
@@ -141,10 +137,12 @@ export interface Config extends ThemeConfig {
141
137
  }
142
138
 
143
139
  export type UnknownObject = Record<string, unknown>;
144
- export type UnknownArray = Array<unknown>;
140
+ export type UnknownArray = unknown[];
145
141
  export type UnknownType = string | number | boolean | UnknownObject | undefined | null;
142
+
146
143
  export type ComponentNames = keyof Components; // keys union
147
144
  export type Strategies = "merge" | "replace" | "override";
145
+
148
146
  export type Gray = "gray";
149
147
  export type GrayColors = "slate" | "cool" | "zinc" | "neutral" | "stone";
150
148
  export type BrandColors =
@@ -167,6 +165,10 @@ export type BrandColors =
167
165
  | "pink"
168
166
  | "rose";
169
167
 
168
+ export interface Directives {
169
+ tooltip?: Partial<Props>;
170
+ }
171
+
170
172
  export interface Components {
171
173
  UText?: Partial<typeof UTextDefaultConfig>;
172
174
  UAlert?: Partial<typeof UAlertDefaultConfig>;
@@ -226,49 +228,30 @@ export interface Components {
226
228
  UDataList?: Partial<typeof UDataListConfig>;
227
229
  }
228
230
 
229
- export interface Directives {
230
- tooltip?: Partial<Props>;
231
- }
232
-
233
- export interface Component {
231
+ export type Component = {
234
232
  i18n?: UnknownObject;
235
233
  defaults?: Defaults;
236
234
  safelist?: (string: string) => TailwindSafelist[];
237
235
  strategy?: Strategies;
238
236
  transition?: Transition;
239
- safelistColors?: BrandColors;
240
- [key: string]: (CVA & NestedComponent) | object | string | undefined;
241
- }
242
-
243
- export type Defaults = {
244
- color?: string;
245
- [key: string]: unknown;
246
- };
247
-
248
- export interface NestedComponent {
249
- component: string;
250
- [key: string]: Record<string, string | object> | string;
251
- }
237
+ safelistColors?: BrandColors[];
238
+ } & (CVA & NestedComponent);
252
239
 
253
240
  /* Make all config keys optional and allow to have string and object values. */
254
241
  export type ComponentConfig<T> = Partial<{
255
- [K in keyof T]: T[K] | string;
242
+ [K in keyof T]: T[K] | string | UnknownObject;
256
243
  }> &
257
244
  Component;
258
245
 
259
- export type ComponentConfigRef<T> = [T & Component] extends [Ref]
260
- ? Ref<T & Component>
261
- : Ref<UnwrapRef<T & Component>, T & Component>;
262
-
263
- export interface UseUI<T> {
264
- config: ComponentConfigRef<T>;
265
- getKeysAttrs: (mutatedProps?: ComputedRef) => KeysAttrs;
266
- [key: string]:
267
- | ComputedRef<KeyAttrs>
268
- | ComponentConfigRef<T>
269
- | ((mutatedProps?: ComputedRef) => KeysAttrs);
246
+ export interface NestedComponent {
247
+ [key: string]: Record<string, string | UnknownObject> | string;
270
248
  }
271
249
 
250
+ export type Defaults = {
251
+ color?: string;
252
+ [key: string]: unknown;
253
+ };
254
+
272
255
  export interface Transition {
273
256
  enterFromClass?: string;
274
257
  enterActiveClass?: string;
@@ -290,26 +273,34 @@ export interface CVACompoundVariants {
290
273
  [key: string]: string | number | undefined | null;
291
274
  }
292
275
 
293
- export interface VueAttrs {
294
- id?: string;
295
- class?: string;
296
- value?: string;
297
- }
276
+ export type MutatedProps = ComputedRef<UnknownObject>;
298
277
 
299
- export type KeysAttrs = Record<string, Ref<UnknownObject | undefined>>;
278
+ export type UseUI<T> = {
279
+ config: Ref<T & ComponentConfig<T>>;
280
+ getKeysAttrs: (mutatedProps?: MutatedProps) => KeysAttrs<T>;
281
+ } & KeysAttrs<T>;
300
282
 
301
- export interface UseAttrs<TConfig> {
302
- config: Ref<TConfig | undefined>;
303
- [key: string]: Ref<TConfig | undefined>;
304
- }
283
+ export type KeysAttrs<T> = Record<
284
+ string,
285
+ Ref<KeyAttrsWithConfig<T>> | ComputedRef<KeyAttrsWithConfig<T>>
286
+ >;
287
+
288
+ export type KeyAttrsWithConfig<T> = {
289
+ config?: ComponentConfig<T>;
290
+ } & KeyAttrs;
305
291
 
306
292
  export interface KeyAttrs extends VueAttrs {
307
293
  "vl-component"?: string | null;
308
294
  "vl-key"?: string | null;
309
295
  "vl-child-component"?: string | null;
310
296
  "vl-child-key"?: string | null;
311
- config?: UnknownObject;
312
- [key: string]: string | UnknownObject | undefined | null;
297
+ [key: string]: string | undefined | null;
298
+ }
299
+
300
+ export interface VueAttrs {
301
+ id?: string;
302
+ class?: string;
303
+ value?: string;
313
304
  }
314
305
 
315
306
  export interface CreateVuelessOptions {
@@ -17,7 +17,8 @@ import type { Props, LoaderSize, IconSize, Config } from "./types.ts";
17
17
  defineOptions({ inheritAttrs: false });
18
18
 
19
19
  const props = withDefaults(defineProps<Props>(), {
20
- ...getDefaults<Props>(defaultConfig, UButton),
20
+ ...getDefaults<Props, Config>(defaultConfig, UButton),
21
+ label: "",
21
22
  });
22
23
 
23
24
  const slots = useSlots();
@@ -102,8 +103,6 @@ const mutatedProps = computed(() => ({
102
103
 
103
104
  const { buttonAttrs, loaderAttrs, leftIconAttrs, rightIconAttrs, centerIconAttrs } = useUI<Config>(
104
105
  defaultConfig,
105
- () => props.config,
106
- "",
107
106
  mutatedProps,
108
107
  );
109
108
  </script>
@@ -1,7 +1,7 @@
1
1
  import defaultConfig from "./config.ts";
2
2
  import type { ComponentConfig } from "../types.ts";
3
3
 
4
- export type Config = ComponentConfig<typeof defaultConfig>;
4
+ export type Config = typeof defaultConfig;
5
5
 
6
6
  export type LoaderSize = "sm" | "md" | "lg";
7
7
  export type IconSize = "2xs" | "xs" | "sm" | "md";
@@ -116,7 +116,7 @@ export interface Props {
116
116
  /**
117
117
  * Component config object.
118
118
  */
119
- config?: Config;
119
+ config?: ComponentConfig<Config>;
120
120
 
121
121
  /**
122
122
  * Data-test attribute for automated testing.
@@ -1,34 +1,22 @@
1
1
  <script setup lang="ts">
2
- import { computed, ref } from "vue";
2
+ import { computed, ref, useSlots } from "vue";
3
3
  import { RouterLink, useLink } from "vue-router";
4
- import { getDefault } from "../utils/ui.ts";
5
4
 
6
- import useAttrs from "./useAttrs.ts";
5
+ import useUI from "../composables/useUI.ts";
6
+ import { hasSlotContent } from "../utils/helper.ts";
7
+ import { getDefaults } from "../utils/ui.ts";
8
+
7
9
  import defaultConfig from "./config.ts";
8
10
  import { ULink } from "./constants.ts";
9
11
 
10
- import type { ULinkProps } from "./types.ts";
12
+ import type { Props, Config } from "./types.ts";
11
13
 
12
14
  defineOptions({ inheritAttrs: false });
13
15
 
14
- const props = withDefaults(defineProps<ULinkProps>(), {
15
- size: getDefault<ULinkProps>(defaultConfig, ULink).size,
16
- color: getDefault<ULinkProps>(defaultConfig, ULink).color,
17
- type: getDefault<ULinkProps>(defaultConfig, ULink).type,
18
- targetBlank: getDefault<ULinkProps>(defaultConfig, ULink).targetBlank,
19
- ariaCurrentValue: getDefault<ULinkProps>(defaultConfig, ULink).ariaCurrentValue,
20
- custom: getDefault<ULinkProps>(defaultConfig, ULink).custom,
21
- replace: getDefault<ULinkProps>(defaultConfig, ULink).replace,
22
- activeClass: getDefault<ULinkProps>(defaultConfig, ULink).activeClass,
23
- exactActiveClass: getDefault<ULinkProps>(defaultConfig, ULink).exactActiveClass,
24
- wrapperActiveClass: getDefault<ULinkProps>(defaultConfig, ULink).wrapperActiveClass,
25
- wrapperExactActiveClass: getDefault<ULinkProps>(defaultConfig, ULink).wrapperExactActiveClass,
26
- underlined: getDefault<ULinkProps>(defaultConfig, ULink).underlined,
27
- dashed: getDefault<ULinkProps>(defaultConfig, ULink).dashed,
28
- disabled: getDefault<ULinkProps>(defaultConfig, ULink).disabled,
29
- block: getDefault<ULinkProps>(defaultConfig, ULink).block,
30
- noRing: getDefault<ULinkProps>(defaultConfig, ULink).noRing,
31
- dataTest: "",
16
+ const props = withDefaults(defineProps<Props>(), {
17
+ ...getDefaults<Props, Config>(defaultConfig, ULink),
18
+ label: "",
19
+ to: undefined,
32
20
  });
33
21
 
34
22
  const emit = defineEmits([
@@ -58,6 +46,8 @@ const emit = defineEmits([
58
46
  "keydown",
59
47
  ]);
60
48
 
49
+ const slots = useSlots();
50
+
61
51
  const isPresentRoute = computed(() => {
62
52
  return typeof props.to === "string" || typeof props.to === "object";
63
53
  });
@@ -83,8 +73,6 @@ const { route, isActive, isExactActive } = useLink(useLinkOptions);
83
73
 
84
74
  const wrapperRef = ref(null);
85
75
 
86
- const { wrapperAttrs, linkAttrs } = useAttrs(props);
87
-
88
76
  const wrapperActiveClasses = computed(() => [
89
77
  isActive.value && props.wrapperActiveClass,
90
78
  isExactActive.value && props.wrapperExactActiveClass,
@@ -136,6 +124,17 @@ defineExpose({
136
124
  */
137
125
  wrapperRef,
138
126
  });
127
+
128
+ /**
129
+ * Get element / nested component attributes for each config token ✨
130
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
131
+ */
132
+ const mutatedProps = computed(() => ({
133
+ /* component state, not a props */
134
+ defaultSlot: hasSlotContent(slots["default"]),
135
+ }));
136
+
137
+ const { wrapperAttrs, linkAttrs } = useUI<Config>(defaultConfig, mutatedProps);
139
138
  </script>
140
139
 
141
140
  <template>
@@ -11,9 +11,9 @@ import UButton from "../../ui.button/UButton.vue";
11
11
  import URow from "../../ui.container-row/URow.vue";
12
12
 
13
13
  import type { Meta, StoryFn } from "@storybook/vue3";
14
- import type { ULinkProps } from "../types.ts";
14
+ import type { Props } from "../types.ts";
15
15
 
16
- interface ULinkArgs extends ULinkProps {
16
+ interface ULinkArgs extends Props {
17
17
  slotTemplate?: string;
18
18
  enum: "size" | "color";
19
19
  }
@@ -1,10 +1,11 @@
1
1
  import defaultConfig from "./config.ts";
2
+ import type { ComponentConfig } from "../types.ts";
2
3
 
3
4
  import type { RouteLocationRaw } from "vue-router";
4
5
 
5
- export type Config = Partial<typeof defaultConfig>;
6
+ export type Config = typeof defaultConfig;
6
7
 
7
- export interface ULinkProps {
8
+ export interface Props {
8
9
  /**
9
10
  * Button label.
10
11
  */
@@ -52,7 +53,7 @@ export interface ULinkProps {
52
53
  | "brand";
53
54
 
54
55
  /**
55
- * Link open type behaviour.
56
+ * Link open type behavior.
56
57
  */
57
58
  type?: "phone" | "email" | "link";
58
59
 
@@ -67,12 +68,12 @@ export interface ULinkProps {
67
68
  ariaCurrentValue?: string;
68
69
 
69
70
  /**
70
- * Whether RouterLink should not wrap its content in an a tag.
71
+ * Whether RouterLink should not wrap its content in a tag.
71
72
  */
72
73
  custom?: boolean;
73
74
 
74
75
  /**
75
- * Whether RouterLink should not wrap its content in an a tag.
76
+ * Whether RouterLink should not wrap its content in a tag.
76
77
  */
77
78
  replace?: boolean;
78
79
 
@@ -124,7 +125,7 @@ export interface ULinkProps {
124
125
  /**
125
126
  * Component config object.
126
127
  */
127
- config?: Config;
128
+ config?: ComponentConfig<Config>;
128
129
 
129
130
  /**
130
131
  * Data-test attribute for automated testing.
@@ -3,27 +3,22 @@ import { computed, provide, readonly } from "vue";
3
3
 
4
4
  import ULabel from "../ui.form-label/ULabel.vue";
5
5
  import UToggleItem from "../ui.button-toggle-item/UToggleItem.vue";
6
- import { getDefault } from "../utils/ui.ts";
6
+
7
+ import useUI from "../composables/useUI.ts";
8
+ import { getDefaults } from "../utils/ui.ts";
7
9
 
8
10
  import defaultConfig from "./config.ts";
9
11
  import { UToggle, TYPE_RADIO, TYPE_CHECKBOX } from "./constants.ts";
10
- import useAttrs from "./useAttrs.ts";
11
12
 
12
- import type { UToggleProps, LabelSize } from "./types.ts";
13
+ import type { Props, LabelSize, Config } from "./types.ts";
13
14
 
14
15
  defineOptions({ inheritAttrs: false });
15
16
 
16
- const props = withDefaults(defineProps<UToggleProps>(), {
17
- variant: getDefault<UToggleProps>(defaultConfig, UToggle).variant,
18
- size: getDefault<UToggleProps>(defaultConfig, UToggle).size,
19
- labelAlign: getDefault<UToggleProps>(defaultConfig, UToggle).labelAlign,
20
- multiple: getDefault<UToggleProps>(defaultConfig, UToggle).multiple,
21
- separated: getDefault<UToggleProps>(defaultConfig, UToggle).separated,
22
- disabled: getDefault<UToggleProps>(defaultConfig, UToggle).disabled,
23
- block: getDefault<UToggleProps>(defaultConfig, UToggle).block,
24
- round: getDefault<UToggleProps>(defaultConfig, UToggle).round,
25
- square: getDefault<UToggleProps>(defaultConfig, UToggle).square,
26
- dataTest: "",
17
+ const props = withDefaults(defineProps<Props>(), {
18
+ ...getDefaults<Props, Config>(defaultConfig, UToggle),
19
+ options: () => [],
20
+ modelValue: "",
21
+ label: "",
27
22
  });
28
23
 
29
24
  const emit = defineEmits([
@@ -34,8 +29,6 @@ const emit = defineEmits([
34
29
  "update:modelValue",
35
30
  ]);
36
31
 
37
- const { toggleLabelAttrs, itemsAttrs, itemAttrs } = useAttrs(props);
38
-
39
32
  const selectedValue = computed({
40
33
  get: () => props.modelValue,
41
34
  set: (value) => emit("update:modelValue", value),
@@ -88,6 +81,12 @@ provide("toggleSelectedValue", {
88
81
  selectedValue: readonly(selectedValue),
89
82
  updateSelectedValue,
90
83
  });
84
+
85
+ /**
86
+ * Get element / nested component attributes for each config token ✨
87
+ * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
88
+ */
89
+ const { toggleLabelAttrs, itemsAttrs, itemAttrs } = useUI<Config>(defaultConfig);
91
90
  </script>
92
91
 
93
92
  <template>
@@ -12,9 +12,9 @@ import UToggleItem from "../../ui.button-toggle-item/UToggleItem.vue";
12
12
  import URow from "../../ui.container-row/URow.vue";
13
13
 
14
14
  import type { Meta, StoryFn } from "@storybook/vue3";
15
- import type { UToggleProps } from "../types.ts";
15
+ import type { Props } from "../types.ts";
16
16
 
17
- interface UToggleArgs extends UToggleProps {
17
+ interface UToggleArgs extends Props {
18
18
  slotTemplate?: string;
19
19
  enum: "variant" | "size";
20
20
  }
@@ -1,6 +1,8 @@
1
1
  import defaultConfig from "./config.ts";
2
2
 
3
- export type Config = Partial<typeof defaultConfig>;
3
+ import type { ComponentConfig } from "../types.ts";
4
+
5
+ export type Config = typeof defaultConfig;
4
6
 
5
7
  export type LabelSize = "sm" | "md" | "lg";
6
8
 
@@ -9,11 +11,11 @@ export interface UToggleOption {
9
11
  label: string;
10
12
  }
11
13
 
12
- export interface UToggleProps {
14
+ export interface Props {
13
15
  /**
14
16
  * Selected value.
15
17
  */
16
- modelValue?: string | number | Array<string | number>;
18
+ modelValue?: string | number | (string | number)[];
17
19
 
18
20
  /**
19
21
  * Toggle item options.
@@ -83,7 +85,7 @@ export interface UToggleProps {
83
85
  /**
84
86
  * Component config object.
85
87
  */
86
- config?: Config;
88
+ config?: ComponentConfig<Config>;
87
89
 
88
90
  /**
89
91
  * Data-test attribute for automated testing.