@nuxt/ui 2.15.2 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +0 -10
  2. package/dist/module.d.mts +1 -24
  3. package/dist/module.d.ts +1 -24
  4. package/dist/module.json +1 -1
  5. package/dist/module.mjs +108 -329
  6. package/dist/runtime/components/data/Table.vue +33 -2
  7. package/dist/runtime/components/data/Table.vue.d.ts +25 -35
  8. package/dist/runtime/components/elements/Accordion.vue.d.ts +1 -1
  9. package/dist/runtime/components/elements/Alert.vue.d.ts +6 -6
  10. package/dist/runtime/components/elements/Avatar.vue.d.ts +10 -10
  11. package/dist/runtime/components/elements/Badge.vue.d.ts +5 -5
  12. package/dist/runtime/components/elements/Button.vue.d.ts +9 -9
  13. package/dist/runtime/components/elements/Carousel.vue.d.ts +1 -1
  14. package/dist/runtime/components/elements/Chip.vue.d.ts +8 -8
  15. package/dist/runtime/components/elements/Dropdown.vue.d.ts +1 -1
  16. package/dist/runtime/components/elements/Kbd.vue.d.ts +2 -2
  17. package/dist/runtime/components/elements/Link.vue.d.ts +3 -3
  18. package/dist/runtime/components/elements/Meter.vue.d.ts +5 -5
  19. package/dist/runtime/components/elements/Progress.vue.d.ts +3 -3
  20. package/dist/runtime/components/forms/Checkbox.vue.d.ts +10 -10
  21. package/dist/runtime/components/forms/Form.vue.d.ts +2 -2
  22. package/dist/runtime/components/forms/FormGroup.vue.d.ts +7 -7
  23. package/dist/runtime/components/forms/Input.vue +1 -1
  24. package/dist/runtime/components/forms/Input.vue.d.ts +14 -14
  25. package/dist/runtime/components/forms/InputMenu.vue +6 -0
  26. package/dist/runtime/components/forms/InputMenu.vue.d.ts +30 -21
  27. package/dist/runtime/components/forms/Radio.vue.d.ts +11 -11
  28. package/dist/runtime/components/forms/RadioGroup.vue.d.ts +8 -8
  29. package/dist/runtime/components/forms/Range.vue.d.ts +8 -8
  30. package/dist/runtime/components/forms/Select.vue.d.ts +13 -13
  31. package/dist/runtime/components/forms/SelectMenu.vue +6 -0
  32. package/dist/runtime/components/forms/SelectMenu.vue.d.ts +30 -21
  33. package/dist/runtime/components/forms/Textarea.vue.d.ts +12 -12
  34. package/dist/runtime/components/forms/Toggle.vue.d.ts +7 -7
  35. package/dist/runtime/components/layout/Card.vue.d.ts +1 -1
  36. package/dist/runtime/components/layout/Container.vue.d.ts +1 -1
  37. package/dist/runtime/components/layout/Divider.vue.d.ts +5 -5
  38. package/dist/runtime/components/layout/Skeleton.vue.d.ts +1 -1
  39. package/dist/runtime/components/navigation/Breadcrumb.vue +1 -0
  40. package/dist/runtime/components/navigation/Breadcrumb.vue.d.ts +1 -1
  41. package/dist/runtime/components/navigation/CommandPalette.vue.d.ts +10 -10
  42. package/dist/runtime/components/navigation/HorizontalNavigation.vue.d.ts +1 -1
  43. package/dist/runtime/components/navigation/Pagination.vue +5 -0
  44. package/dist/runtime/components/navigation/Pagination.vue.d.ts +10 -1
  45. package/dist/runtime/components/navigation/Tabs.vue.d.ts +2 -2
  46. package/dist/runtime/components/navigation/VerticalNavigation.vue.d.ts +1 -1
  47. package/dist/runtime/components/overlays/ContextMenu.vue.d.ts +3 -3
  48. package/dist/runtime/components/overlays/Modal.vue.d.ts +5 -5
  49. package/dist/runtime/components/overlays/Notification.vue +8 -3
  50. package/dist/runtime/components/overlays/Notification.vue.d.ts +8 -8
  51. package/dist/runtime/components/overlays/Notifications.vue.d.ts +3 -1
  52. package/dist/runtime/components/overlays/Popover.vue.d.ts +2 -2
  53. package/dist/runtime/components/overlays/Slideover.vue.d.ts +8 -8
  54. package/dist/runtime/components/overlays/Tooltip.vue.d.ts +2 -2
  55. package/dist/runtime/composables/useFormGroup.d.ts +1 -1
  56. package/dist/runtime/composables/usePopper.d.ts +8 -8
  57. package/dist/runtime/composables/useToast.d.ts +2 -0
  58. package/dist/runtime/composables/useToast.mjs +13 -1
  59. package/dist/runtime/types/slideover.d.ts +11 -12
  60. package/dist/runtime/ui.config/data/table.d.ts +1 -0
  61. package/dist/runtime/ui.config/data/table.mjs +1 -0
  62. package/dist/runtime/ui.config/forms/input.d.ts +0 -8
  63. package/dist/runtime/ui.config/forms/input.mjs +1 -9
  64. package/dist/runtime/ui.config/forms/select.d.ts +0 -8
  65. package/dist/runtime/ui.config/forms/textarea.d.ts +0 -8
  66. package/dist/runtime/utils/colors.d.ts +11 -0
  67. package/dist/runtime/utils/colors.mjs +299 -0
  68. package/package.json +19 -22
@@ -0,0 +1,299 @@
1
+ import { omit } from "./lodash.mjs";
2
+ import { kebabCase, camelCase, upperFirst } from "scule";
3
+ import defaultColors from "tailwindcss/colors.js";
4
+ const colorsToExclude = [
5
+ "inherit",
6
+ "transparent",
7
+ "current",
8
+ "white",
9
+ "black",
10
+ "slate",
11
+ "gray",
12
+ "zinc",
13
+ "neutral",
14
+ "stone",
15
+ "cool"
16
+ ];
17
+ const safelistByComponent = {
18
+ alert: (colorsAsRegex2) => [{
19
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-50`)
20
+ }, {
21
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
22
+ variants: ["dark"]
23
+ }, {
24
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
25
+ }, {
26
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
27
+ variants: ["dark"]
28
+ }, {
29
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
30
+ }, {
31
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
32
+ variants: ["dark"]
33
+ }, {
34
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`)
35
+ }],
36
+ avatar: (colorsAsRegex2) => [{
37
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
38
+ variants: ["dark"]
39
+ }, {
40
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
41
+ }],
42
+ badge: (colorsAsRegex2) => [{
43
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-50`)
44
+ }, {
45
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
46
+ variants: ["dark"]
47
+ }, {
48
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
49
+ }, {
50
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
51
+ variants: ["dark"]
52
+ }, {
53
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
54
+ }, {
55
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
56
+ variants: ["dark"]
57
+ }, {
58
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`)
59
+ }],
60
+ button: (colorsAsRegex2) => [{
61
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-50`),
62
+ variants: ["hover", "disabled"]
63
+ }, {
64
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-100`),
65
+ variants: ["hover"]
66
+ }, {
67
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
68
+ variants: ["dark", "dark:disabled"]
69
+ }, {
70
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`),
71
+ variants: ["disabled", "dark:hover"]
72
+ }, {
73
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-600`),
74
+ variants: ["hover"]
75
+ }, {
76
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-900`),
77
+ variants: ["dark:hover"]
78
+ }, {
79
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-950`),
80
+ variants: ["dark", "dark:hover", "dark:disabled"]
81
+ }, {
82
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
83
+ variants: ["dark", "dark:disabled"]
84
+ }, {
85
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`),
86
+ variants: ["dark:hover", "disabled"]
87
+ }, {
88
+ pattern: new RegExp(`text-(${colorsAsRegex2})-600`),
89
+ variants: ["hover"]
90
+ }, {
91
+ pattern: new RegExp(`outline-(${colorsAsRegex2})-400`),
92
+ variants: ["dark:focus-visible"]
93
+ }, {
94
+ pattern: new RegExp(`outline-(${colorsAsRegex2})-500`),
95
+ variants: ["focus-visible"]
96
+ }, {
97
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
98
+ variants: ["dark:focus-visible"]
99
+ }, {
100
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
101
+ variants: ["focus-visible"]
102
+ }],
103
+ input: (colorsAsRegex2) => [{
104
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
105
+ variants: ["dark"]
106
+ }, {
107
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
108
+ }, {
109
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
110
+ variants: ["dark", "dark:focus"]
111
+ }, {
112
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
113
+ variants: ["focus"]
114
+ }],
115
+ radio: (colorsAsRegex2) => [{
116
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
117
+ variants: ["dark"]
118
+ }, {
119
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
120
+ }, {
121
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
122
+ variants: ["dark:focus-visible"]
123
+ }, {
124
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
125
+ variants: ["focus-visible"]
126
+ }],
127
+ checkbox: (colorsAsRegex2) => [{
128
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
129
+ variants: ["dark"]
130
+ }, {
131
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
132
+ }, {
133
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
134
+ variants: ["dark:focus-visible"]
135
+ }, {
136
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
137
+ variants: ["focus-visible"]
138
+ }],
139
+ toggle: (colorsAsRegex2) => [{
140
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
141
+ variants: ["dark"]
142
+ }, {
143
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
144
+ }, {
145
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
146
+ variants: ["dark"]
147
+ }, {
148
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
149
+ }, {
150
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
151
+ variants: ["dark:focus-visible"]
152
+ }, {
153
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
154
+ variants: ["focus-visible"]
155
+ }],
156
+ range: (colorsAsRegex2) => [{
157
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
158
+ variants: ["dark"]
159
+ }, {
160
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
161
+ }, {
162
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
163
+ variants: ["dark"]
164
+ }, {
165
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
166
+ }, {
167
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
168
+ variants: ["dark:focus-visible"]
169
+ }, {
170
+ pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
171
+ variants: ["focus-visible"]
172
+ }],
173
+ progress: (colorsAsRegex2) => [{
174
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
175
+ variants: ["dark"]
176
+ }, {
177
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
178
+ }],
179
+ meter: (colorsAsRegex2) => [{
180
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
181
+ variants: ["dark"]
182
+ }, {
183
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
184
+ }, {
185
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
186
+ variants: ["dark"]
187
+ }, {
188
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
189
+ }],
190
+ notification: (colorsAsRegex2) => [{
191
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
192
+ variants: ["dark"]
193
+ }, {
194
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
195
+ }, {
196
+ pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
197
+ variants: ["dark"]
198
+ }, {
199
+ pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
200
+ }],
201
+ chip: (colorsAsRegex2) => [{
202
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
203
+ variants: ["dark"]
204
+ }, {
205
+ pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
206
+ }]
207
+ };
208
+ const safelistComponentAliasesMap = {
209
+ "USelect": "UInput",
210
+ "USelectMenu": "UInput",
211
+ "UTextarea": "UInput",
212
+ "URadioGroup": "URadio",
213
+ "UMeterGroup": "UMeter"
214
+ };
215
+ const colorsAsRegex = (colors) => colors.join("|");
216
+ export const excludeColors = (colors) => {
217
+ return Object.entries(omit(colors, colorsToExclude)).filter(([, value]) => typeof value === "object").map(([key]) => kebabCase(key));
218
+ };
219
+ export const setGlobalColors = (theme) => {
220
+ const globalColors = {
221
+ ...theme.colors || defaultColors,
222
+ ...theme.extend?.colors
223
+ };
224
+ globalColors.primary = theme.extend.colors.primary = {
225
+ 50: "rgb(var(--color-primary-50) / <alpha-value>)",
226
+ 100: "rgb(var(--color-primary-100) / <alpha-value>)",
227
+ 200: "rgb(var(--color-primary-200) / <alpha-value>)",
228
+ 300: "rgb(var(--color-primary-300) / <alpha-value>)",
229
+ 400: "rgb(var(--color-primary-400) / <alpha-value>)",
230
+ 500: "rgb(var(--color-primary-500) / <alpha-value>)",
231
+ 600: "rgb(var(--color-primary-600) / <alpha-value>)",
232
+ 700: "rgb(var(--color-primary-700) / <alpha-value>)",
233
+ 800: "rgb(var(--color-primary-800) / <alpha-value>)",
234
+ 900: "rgb(var(--color-primary-900) / <alpha-value>)",
235
+ 950: "rgb(var(--color-primary-950) / <alpha-value>)",
236
+ DEFAULT: "rgb(var(--color-primary-DEFAULT) / <alpha-value>)"
237
+ };
238
+ if (globalColors.gray) {
239
+ globalColors.cool = theme.extend.colors.cool = defaultColors.gray;
240
+ }
241
+ globalColors.gray = theme.extend.colors.gray = {
242
+ 50: "rgb(var(--color-gray-50) / <alpha-value>)",
243
+ 100: "rgb(var(--color-gray-100) / <alpha-value>)",
244
+ 200: "rgb(var(--color-gray-200) / <alpha-value>)",
245
+ 300: "rgb(var(--color-gray-300) / <alpha-value>)",
246
+ 400: "rgb(var(--color-gray-400) / <alpha-value>)",
247
+ 500: "rgb(var(--color-gray-500) / <alpha-value>)",
248
+ 600: "rgb(var(--color-gray-600) / <alpha-value>)",
249
+ 700: "rgb(var(--color-gray-700) / <alpha-value>)",
250
+ 800: "rgb(var(--color-gray-800) / <alpha-value>)",
251
+ 900: "rgb(var(--color-gray-900) / <alpha-value>)",
252
+ 950: "rgb(var(--color-gray-950) / <alpha-value>)"
253
+ };
254
+ return excludeColors(globalColors);
255
+ };
256
+ export const generateSafelist = (colors, globalColors) => {
257
+ const baseSafelist = Object.keys(safelistByComponent).flatMap((component) => safelistByComponent[component](colorsAsRegex(colors)));
258
+ const formsSafelist = ["input", "radio", "checkbox", "toggle", "range"].flatMap((component) => safelistByComponent[component](colorsAsRegex(["red"])));
259
+ return [
260
+ ...baseSafelist,
261
+ ...formsSafelist,
262
+ // Ensure all global colors are safelisted for the Notification (toast.add)
263
+ ...safelistByComponent["notification"](colorsAsRegex(globalColors)),
264
+ // Gray safelist for Avatar & Notification
265
+ "bg-gray-500",
266
+ "dark:bg-gray-400",
267
+ "text-gray-500",
268
+ "dark:text-gray-400"
269
+ ];
270
+ };
271
+ export const customSafelistExtractor = (prefix, content, colors, safelistColors) => {
272
+ const classes = [];
273
+ const regex = /<([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z][A-Za-z0-9]*)*)\s+(?![^>]*:color\b)[^>]*\bcolor=["']([^"']+)["'][^>]*>/gs;
274
+ const matches = content.matchAll(regex);
275
+ const components = Object.keys(safelistByComponent).map((component) => `${prefix}${component.charAt(0).toUpperCase() + component.slice(1)}`);
276
+ for (const match of matches) {
277
+ const [, component, color] = match;
278
+ const camelComponent = upperFirst(camelCase(component));
279
+ if (!colors.includes(color) || safelistColors.includes(color)) {
280
+ continue;
281
+ }
282
+ let name = safelistComponentAliasesMap[camelComponent] ? safelistComponentAliasesMap[camelComponent] : camelComponent;
283
+ if (!components.includes(name)) {
284
+ continue;
285
+ }
286
+ name = name.replace(prefix, "").toLowerCase();
287
+ const matchClasses = safelistByComponent[name](color).flatMap((group) => {
288
+ return typeof group === "string" ? "" : ["", ...group.variants || []].flatMap((variant) => {
289
+ const matches2 = group.pattern.source.match(/\(([^)]+)\)/g);
290
+ return matches2.map((match2) => {
291
+ const colorOptions = match2.substring(1, match2.length - 1).split("|");
292
+ return colorOptions.map((color2) => `${variant ? variant + ":" : ""}` + group.pattern.source.replace(match2, color2));
293
+ }).flat();
294
+ });
295
+ });
296
+ classes.push(...matchClasses);
297
+ }
298
+ return classes;
299
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuxt/ui",
3
- "version": "2.15.2",
3
+ "version": "2.16.0",
4
4
  "repository": "nuxt/ui",
5
5
  "homepage": "https://ui.nuxt.com",
6
6
  "type": "module",
@@ -33,18 +33,18 @@
33
33
  "test": "vitest"
34
34
  },
35
35
  "dependencies": {
36
- "@egoist/tailwindcss-icons": "^1.7.4",
36
+ "@egoist/tailwindcss-icons": "^1.8.0",
37
37
  "@headlessui/tailwindcss": "^0.2.0",
38
- "@headlessui/vue": "^1.7.19",
39
- "@iconify-json/heroicons": "^1.1.20",
38
+ "@headlessui/vue": "^1.7.21",
39
+ "@iconify-json/heroicons": "^1.1.21",
40
40
  "@nuxt/kit": "^3.11.2",
41
- "@nuxtjs/color-mode": "^3.4.0",
42
- "@nuxtjs/tailwindcss": "^6.11.4",
41
+ "@nuxtjs/color-mode": "^3.4.1",
42
+ "@nuxtjs/tailwindcss": "^6.12.0",
43
43
  "@popperjs/core": "^2.11.8",
44
44
  "@tailwindcss/aspect-ratio": "^0.4.2",
45
45
  "@tailwindcss/container-queries": "^0.1.1",
46
46
  "@tailwindcss/forms": "^0.5.7",
47
- "@tailwindcss/typography": "^0.5.12",
47
+ "@tailwindcss/typography": "^0.5.13",
48
48
  "@vueuse/core": "^10.9.0",
49
49
  "@vueuse/integrations": "^10.9.0",
50
50
  "@vueuse/math": "^10.9.0",
@@ -54,34 +54,31 @@
54
54
  "ohash": "^1.1.3",
55
55
  "pathe": "^1.1.2",
56
56
  "scule": "^1.3.0",
57
- "tailwind-merge": "^2.2.2",
57
+ "tailwind-merge": "^2.3.0",
58
58
  "tailwindcss": "^3.4.3"
59
59
  },
60
60
  "devDependencies": {
61
- "@nuxt/eslint-config": "^0.3.6",
61
+ "@nuxt/eslint-config": "^0.3.10",
62
62
  "@nuxt/module-builder": "^0.5.5",
63
- "@nuxt/test-utils": "^3.12.0",
63
+ "@nuxt/test-utils": "^3.12.1",
64
64
  "@release-it/conventional-changelog": "^8.0.1",
65
- "@vue/test-utils": "^2.4.5",
65
+ "@vue/test-utils": "^2.4.6",
66
66
  "eslint": "^8.57.0",
67
- "happy-dom": "^14.7.1",
68
- "joi": "^17.12.3",
67
+ "happy-dom": "^14.10.1",
68
+ "joi": "^17.13.1",
69
69
  "nuxt": "^3.11.2",
70
- "release-it": "^17.2.0",
70
+ "release-it": "^17.2.1",
71
71
  "typescript": "^5.4.5",
72
72
  "unbuild": "^2.0.0",
73
73
  "valibot": "^0.30.0",
74
- "vitest": "^1.5.0",
74
+ "vitest": "^1.6.0",
75
75
  "vitest-environment-nuxt": "^1.0.0",
76
- "vue-tsc": "^2.0.13",
76
+ "vue-tsc": "^2.0.16",
77
77
  "yup": "^1.4.0",
78
- "zod": "^3.22.4"
78
+ "zod": "^3.23.6"
79
79
  },
80
80
  "resolutions": {
81
- "@nuxt/kit": "^3.11.2",
82
- "@nuxt/schema": "3.11.2",
83
- "tailwindcss": "^3.4.3",
84
- "@headlessui/vue": "1.7.19",
85
- "vue": "3.4.21"
81
+ "@nuxt/ui": "workspace:*",
82
+ "@nuxt/module-builder": "0.5.5"
86
83
  }
87
84
  }