@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
package/README.md CHANGED
@@ -30,16 +30,6 @@ Read more on [ui.nuxt.com](https://ui.nuxt.com)
30
30
  npx nuxi@latest module add ui
31
31
  ```
32
32
 
33
- Then, register the module in your `nuxt.config.ts`:
34
-
35
- ```js
36
- export default defineNuxtConfig({
37
- modules: [
38
- '@nuxt/ui'
39
- ]
40
- })
41
- ```
42
-
43
33
  If you want latest updates, please use `@nuxt/ui-edge` in your `package.json`:
44
34
 
45
35
  ```json
package/dist/module.d.mts CHANGED
@@ -7,6 +7,7 @@ declare const _default$H: {
7
7
  divide: string;
8
8
  thead: string;
9
9
  tbody: string;
10
+ caption: string;
10
11
  tr: {
11
12
  base: string;
12
13
  selected: string;
@@ -766,14 +767,6 @@ declare const _default$s: {
766
767
  placeholder: string;
767
768
  file: {
768
769
  base: string;
769
- padding: {
770
- '2xs': string;
771
- xs: string;
772
- sm: string;
773
- md: string;
774
- lg: string;
775
- xl: string;
776
- };
777
770
  };
778
771
  size: {
779
772
  '2xs': string;
@@ -979,14 +972,6 @@ declare const _default$p: {
979
972
  placeholder: string;
980
973
  file: {
981
974
  base: string;
982
- padding: {
983
- '2xs': string;
984
- xs: string;
985
- sm: string;
986
- md: string;
987
- lg: string;
988
- xl: string;
989
- };
990
975
  };
991
976
  size: {
992
977
  '2xs': string;
@@ -1098,14 +1083,6 @@ declare const _default$o: {
1098
1083
  rounded: string;
1099
1084
  file: {
1100
1085
  base: string;
1101
- padding: {
1102
- '2xs': string;
1103
- xs: string;
1104
- sm: string;
1105
- md: string;
1106
- lg: string;
1107
- xl: string;
1108
- };
1109
1086
  };
1110
1087
  size: {
1111
1088
  '2xs': string;
package/dist/module.d.ts CHANGED
@@ -7,6 +7,7 @@ declare const _default$H: {
7
7
  divide: string;
8
8
  thead: string;
9
9
  tbody: string;
10
+ caption: string;
10
11
  tr: {
11
12
  base: string;
12
13
  selected: string;
@@ -766,14 +767,6 @@ declare const _default$s: {
766
767
  placeholder: string;
767
768
  file: {
768
769
  base: string;
769
- padding: {
770
- '2xs': string;
771
- xs: string;
772
- sm: string;
773
- md: string;
774
- lg: string;
775
- xl: string;
776
- };
777
770
  };
778
771
  size: {
779
772
  '2xs': string;
@@ -979,14 +972,6 @@ declare const _default$p: {
979
972
  placeholder: string;
980
973
  file: {
981
974
  base: string;
982
- padding: {
983
- '2xs': string;
984
- xs: string;
985
- sm: string;
986
- md: string;
987
- lg: string;
988
- xl: string;
989
- };
990
975
  };
991
976
  size: {
992
977
  '2xs': string;
@@ -1098,14 +1083,6 @@ declare const _default$o: {
1098
1083
  rounded: string;
1099
1084
  file: {
1100
1085
  base: string;
1101
- padding: {
1102
- '2xs': string;
1103
- xs: string;
1104
- sm: string;
1105
- md: string;
1106
- lg: string;
1107
- xl: string;
1108
- };
1109
1086
  };
1110
1087
  size: {
1111
1088
  '2xs': string;
package/dist/module.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
  "configKey": "ui",
5
5
  "compatibility": {
6
6
  "nuxt": "^3.10.0"
package/dist/module.mjs CHANGED
@@ -1,8 +1,9 @@
1
1
  import { createRequire } from 'node:module';
2
- import { addTemplate, useNuxt, defineNuxtModule, createResolver, installModule, addPlugin, addComponentsDir, addImportsDir } from '@nuxt/kit';
3
- import { defaultExtractor as defaultExtractor$1 } from 'tailwindcss/lib/lib/defaultExtractor.js';
4
- import { iconsPlugin, getIconCollections } from '@egoist/tailwindcss-icons';
5
- import { kebabCase, upperFirst, camelCase } from 'scule';
2
+ import { addTemplate, useNuxt, installModule, createResolver, defineNuxtModule, addPlugin, addComponentsDir, addImportsDir } from '@nuxt/kit';
3
+ import { join } from 'pathe';
4
+ import { defu } from 'defu';
5
+ import { kebabCase } from 'scule';
6
+ import defaultColors$1 from 'tailwindcss/colors.js';
6
7
 
7
8
 
8
9
 
@@ -14,7 +15,7 @@ const __filename = __cjs_url__.fileURLToPath(import.meta.url);
14
15
  const __dirname = __cjs_path__.dirname(__filename);
15
16
  const require = __cjs_mod__.createRequire(import.meta.url);
16
17
  const name = "@nuxt/ui";
17
- const version = "2.15.2";
18
+ const version = "2.16.0";
18
19
 
19
20
  function createTemplates(nuxt = useNuxt()) {
20
21
  const template = addTemplate({
@@ -54,254 +55,113 @@ const colorsToExclude = [
54
55
  "stone",
55
56
  "cool"
56
57
  ];
57
- const safelistByComponent = {
58
- alert: (colorsAsRegex2) => [{
59
- pattern: new RegExp(`bg-(${colorsAsRegex2})-50`)
60
- }, {
61
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
62
- variants: ["dark"]
63
- }, {
64
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
65
- }, {
66
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
67
- variants: ["dark"]
68
- }, {
69
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
70
- }, {
71
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
72
- variants: ["dark"]
73
- }, {
74
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`)
75
- }],
76
- avatar: (colorsAsRegex2) => [{
77
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
78
- variants: ["dark"]
79
- }, {
80
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
81
- }],
82
- badge: (colorsAsRegex2) => [{
83
- pattern: new RegExp(`bg-(${colorsAsRegex2})-50`)
84
- }, {
85
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
86
- variants: ["dark"]
87
- }, {
88
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
89
- }, {
90
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
91
- variants: ["dark"]
92
- }, {
93
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
94
- }, {
95
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
96
- variants: ["dark"]
97
- }, {
98
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`)
99
- }],
100
- button: (colorsAsRegex2) => [{
101
- pattern: new RegExp(`bg-(${colorsAsRegex2})-50`),
102
- variants: ["hover", "disabled"]
103
- }, {
104
- pattern: new RegExp(`bg-(${colorsAsRegex2})-100`),
105
- variants: ["hover"]
106
- }, {
107
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
108
- variants: ["dark", "dark:disabled"]
109
- }, {
110
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`),
111
- variants: ["disabled", "dark:hover"]
112
- }, {
113
- pattern: new RegExp(`bg-(${colorsAsRegex2})-600`),
114
- variants: ["hover"]
115
- }, {
116
- pattern: new RegExp(`bg-(${colorsAsRegex2})-900`),
117
- variants: ["dark:hover"]
118
- }, {
119
- pattern: new RegExp(`bg-(${colorsAsRegex2})-950`),
120
- variants: ["dark", "dark:hover", "dark:disabled"]
121
- }, {
122
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
123
- variants: ["dark", "dark:disabled"]
124
- }, {
125
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`),
126
- variants: ["dark:hover", "disabled"]
127
- }, {
128
- pattern: new RegExp(`text-(${colorsAsRegex2})-600`),
129
- variants: ["hover"]
130
- }, {
131
- pattern: new RegExp(`outline-(${colorsAsRegex2})-400`),
132
- variants: ["dark:focus-visible"]
133
- }, {
134
- pattern: new RegExp(`outline-(${colorsAsRegex2})-500`),
135
- variants: ["focus-visible"]
136
- }, {
137
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
138
- variants: ["dark:focus-visible"]
139
- }, {
140
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
141
- variants: ["focus-visible"]
142
- }],
143
- input: (colorsAsRegex2) => [{
144
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
145
- variants: ["dark"]
146
- }, {
147
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
148
- }, {
149
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
150
- variants: ["dark", "dark:focus"]
151
- }, {
152
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
153
- variants: ["focus"]
154
- }],
155
- radio: (colorsAsRegex2) => [{
156
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
157
- variants: ["dark"]
158
- }, {
159
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
160
- }, {
161
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
162
- variants: ["dark:focus-visible"]
163
- }, {
164
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
165
- variants: ["focus-visible"]
166
- }],
167
- checkbox: (colorsAsRegex2) => [{
168
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
169
- variants: ["dark"]
170
- }, {
171
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
172
- }, {
173
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
174
- variants: ["dark:focus-visible"]
175
- }, {
176
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
177
- variants: ["focus-visible"]
178
- }],
179
- toggle: (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
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
191
- variants: ["dark:focus-visible"]
192
- }, {
193
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
194
- variants: ["focus-visible"]
195
- }],
196
- range: (colorsAsRegex2) => [{
197
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
198
- variants: ["dark"]
199
- }, {
200
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
201
- }, {
202
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
203
- variants: ["dark"]
204
- }, {
205
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
206
- }, {
207
- pattern: new RegExp(`ring-(${colorsAsRegex2})-400`),
208
- variants: ["dark:focus-visible"]
209
- }, {
210
- pattern: new RegExp(`ring-(${colorsAsRegex2})-500`),
211
- variants: ["focus-visible"]
212
- }],
213
- progress: (colorsAsRegex2) => [{
214
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
215
- variants: ["dark"]
216
- }, {
217
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
218
- }],
219
- meter: (colorsAsRegex2) => [{
220
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
221
- variants: ["dark"]
222
- }, {
223
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
224
- }, {
225
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
226
- variants: ["dark"]
227
- }, {
228
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
229
- }],
230
- notification: (colorsAsRegex2) => [{
231
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
232
- variants: ["dark"]
233
- }, {
234
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
235
- }, {
236
- pattern: new RegExp(`text-(${colorsAsRegex2})-400`),
237
- variants: ["dark"]
238
- }, {
239
- pattern: new RegExp(`text-(${colorsAsRegex2})-500`)
240
- }],
241
- chip: (colorsAsRegex2) => [{
242
- pattern: new RegExp(`bg-(${colorsAsRegex2})-400`),
243
- variants: ["dark"]
244
- }, {
245
- pattern: new RegExp(`bg-(${colorsAsRegex2})-500`)
246
- }]
247
- };
248
- const safelistComponentAliasesMap = {
249
- "USelect": "UInput",
250
- "USelectMenu": "UInput",
251
- "UTextarea": "UInput",
252
- "URadioGroup": "URadio",
253
- "UMeterGroup": "UMeter"
254
- };
255
- const colorsAsRegex = (colors) => colors.join("|");
256
58
  const excludeColors = (colors) => {
257
59
  return Object.entries(omit(colors, colorsToExclude)).filter(([, value]) => typeof value === "object").map(([key]) => kebabCase(key));
258
60
  };
259
- const generateSafelist = (colors, globalColors) => {
260
- const baseSafelist = Object.keys(safelistByComponent).flatMap((component) => safelistByComponent[component](colorsAsRegex(colors)));
261
- const formsSafelist = ["input", "radio", "checkbox", "toggle", "range"].flatMap((component) => safelistByComponent[component](colorsAsRegex(["red"])));
262
- return [
263
- ...baseSafelist,
264
- ...formsSafelist,
265
- // Ensure all global colors are safelisted for the Notification (toast.add)
266
- ...safelistByComponent["notification"](colorsAsRegex(globalColors)),
267
- // Gray safelist for Avatar & Notification
268
- "bg-gray-500",
269
- "dark:bg-gray-400",
270
- "text-gray-500",
271
- "dark:text-gray-400"
272
- ];
273
- };
274
- const customSafelistExtractor = (prefix, content, colors, safelistColors) => {
275
- const classes = [];
276
- const regex = /<([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z][A-Za-z0-9]*)*)\s+(?![^>]*:color\b)[^>]*\bcolor=["']([^"']+)["'][^>]*>/gs;
277
- const matches = content.matchAll(regex);
278
- const components = Object.keys(safelistByComponent).map((component) => `${prefix}${component.charAt(0).toUpperCase() + component.slice(1)}`);
279
- for (const match of matches) {
280
- const [, component, color] = match;
281
- const camelComponent = upperFirst(camelCase(component));
282
- if (!colors.includes(color) || safelistColors.includes(color)) {
283
- continue;
284
- }
285
- let name = safelistComponentAliasesMap[camelComponent] ? safelistComponentAliasesMap[camelComponent] : camelComponent;
286
- if (!components.includes(name)) {
287
- continue;
288
- }
289
- name = name.replace(prefix, "").toLowerCase();
290
- const matchClasses = safelistByComponent[name](color).flatMap((group) => {
291
- return ["", ...group.variants || []].flatMap((variant) => {
292
- const matches2 = group.pattern.source.match(/\(([^)]+)\)/g);
293
- return matches2.map((match2) => {
294
- const colorOptions = match2.substring(1, match2.length - 1).split("|");
295
- return colorOptions.map((color2) => `${variant ? variant + ":" : ""}` + group.pattern.source.replace(match2, color2));
296
- }).flat();
297
- });
298
- });
299
- classes.push(...matchClasses);
61
+ const setGlobalColors = (theme) => {
62
+ const globalColors = {
63
+ ...theme.colors || defaultColors$1,
64
+ ...theme.extend?.colors
65
+ };
66
+ globalColors.primary = theme.extend.colors.primary = {
67
+ 50: "rgb(var(--color-primary-50) / <alpha-value>)",
68
+ 100: "rgb(var(--color-primary-100) / <alpha-value>)",
69
+ 200: "rgb(var(--color-primary-200) / <alpha-value>)",
70
+ 300: "rgb(var(--color-primary-300) / <alpha-value>)",
71
+ 400: "rgb(var(--color-primary-400) / <alpha-value>)",
72
+ 500: "rgb(var(--color-primary-500) / <alpha-value>)",
73
+ 600: "rgb(var(--color-primary-600) / <alpha-value>)",
74
+ 700: "rgb(var(--color-primary-700) / <alpha-value>)",
75
+ 800: "rgb(var(--color-primary-800) / <alpha-value>)",
76
+ 900: "rgb(var(--color-primary-900) / <alpha-value>)",
77
+ 950: "rgb(var(--color-primary-950) / <alpha-value>)",
78
+ DEFAULT: "rgb(var(--color-primary-DEFAULT) / <alpha-value>)"
79
+ };
80
+ if (globalColors.gray) {
81
+ globalColors.cool = theme.extend.colors.cool = defaultColors$1.gray;
300
82
  }
301
- return classes;
83
+ globalColors.gray = theme.extend.colors.gray = {
84
+ 50: "rgb(var(--color-gray-50) / <alpha-value>)",
85
+ 100: "rgb(var(--color-gray-100) / <alpha-value>)",
86
+ 200: "rgb(var(--color-gray-200) / <alpha-value>)",
87
+ 300: "rgb(var(--color-gray-300) / <alpha-value>)",
88
+ 400: "rgb(var(--color-gray-400) / <alpha-value>)",
89
+ 500: "rgb(var(--color-gray-500) / <alpha-value>)",
90
+ 600: "rgb(var(--color-gray-600) / <alpha-value>)",
91
+ 700: "rgb(var(--color-gray-700) / <alpha-value>)",
92
+ 800: "rgb(var(--color-gray-800) / <alpha-value>)",
93
+ 900: "rgb(var(--color-gray-900) / <alpha-value>)",
94
+ 950: "rgb(var(--color-gray-950) / <alpha-value>)"
95
+ };
96
+ return excludeColors(globalColors);
302
97
  };
303
98
 
304
- const defaultExtractor = defaultExtractor$1({ tailwindConfig: { separator: ":" } });
99
+ async function installTailwind(moduleOptions, nuxt = useNuxt(), resolve = createResolver(import.meta.url).resolve) {
100
+ const runtimeDir = resolve("./runtime");
101
+ nuxt.hook("tailwindcss:config", function(tailwindConfig) {
102
+ tailwindConfig.theme = tailwindConfig.theme || {};
103
+ tailwindConfig.theme.extend = tailwindConfig.theme.extend || {};
104
+ tailwindConfig.theme.extend.colors = tailwindConfig.theme.extend.colors || {};
105
+ const colors = setGlobalColors(tailwindConfig.theme);
106
+ nuxt.options.appConfig.ui = {
107
+ primary: "green",
108
+ gray: "cool",
109
+ colors,
110
+ strategy: "merge"
111
+ };
112
+ });
113
+ const configTemplate = addTemplate({
114
+ filename: "nuxtui-tailwind.config.cjs",
115
+ write: true,
116
+ getContents: ({ nuxt: nuxt2 }) => `
117
+ const { defaultExtractor: createDefaultExtractor } = require('tailwindcss/lib/lib/defaultExtractor.js')
118
+ const { customSafelistExtractor, generateSafelist } = require(${JSON.stringify(resolve(runtimeDir, "utils", "colors"))})
119
+ const { iconsPlugin, getIconCollections } = require('@egoist/tailwindcss-icons')
120
+
121
+ const defaultExtractor = createDefaultExtractor({ tailwindConfig: { separator: ':' } })
122
+
123
+ module.exports = {
124
+ plugins: [
125
+ require('@tailwindcss/forms')({ strategy: 'class' }),
126
+ require('@tailwindcss/aspect-ratio'),
127
+ require('@tailwindcss/typography'),
128
+ require('@tailwindcss/container-queries'),
129
+ require('@headlessui/tailwindcss'),
130
+ iconsPlugin(${Array.isArray(moduleOptions.icons) || moduleOptions.icons === "all" ? `{ collections: getIconCollections(${JSON.stringify(moduleOptions.icons)}) }` : typeof moduleOptions.icons === "object" ? JSON.stringify(moduleOptions.icons) : {}})
131
+ ],
132
+ content: {
133
+ files: [
134
+ ${JSON.stringify(resolve(runtimeDir, "components/**/*.{vue,mjs,ts}"))},
135
+ ${JSON.stringify(resolve(runtimeDir, "ui.config/**/*.{mjs,js,ts}"))}
136
+ ],
137
+ transform: {
138
+ vue: (content) => {
139
+ return content.replaceAll(/(?:\\r\\n|\\r|\\n)/g, ' ')
140
+ }
141
+ },
142
+ extract: {
143
+ vue: (content) => {
144
+ return [
145
+ ...defaultExtractor(content),
146
+ ...customSafelistExtractor(${JSON.stringify(moduleOptions.prefix)}, content, ${JSON.stringify(nuxt2.options.appConfig.ui.colors)}, ${JSON.stringify(moduleOptions.safelistColors)})
147
+ ]
148
+ }
149
+ }
150
+ },
151
+ safelist: generateSafelist(${JSON.stringify(moduleOptions.safelistColors || [])}, ${JSON.stringify(nuxt2.options.appConfig.ui.colors)}),
152
+ }
153
+ `
154
+ });
155
+ await installModule("@nuxtjs/tailwindcss", defu({
156
+ exposeConfig: true,
157
+ config: { darkMode: "class" },
158
+ configPath: [
159
+ configTemplate.dst,
160
+ join(nuxt.options.rootDir, "tailwind.config")
161
+ ]
162
+ }, nuxt.options.tailwindcss));
163
+ }
164
+
305
165
  const _require = createRequire(import.meta.url);
306
166
  const defaultColors = _require("tailwindcss/colors.js");
307
167
  delete defaultColors.lightBlue;
@@ -333,91 +193,10 @@ const module = defineNuxtModule({
333
193
  if (!options.disableGlobalStyles) {
334
194
  nuxt.options.css.push(resolve(runtimeDir, "ui.css"));
335
195
  }
336
- nuxt.hook("tailwindcss:config", function(tailwindConfig) {
337
- tailwindConfig.theme = tailwindConfig.theme || {};
338
- tailwindConfig.theme.extend = tailwindConfig.theme.extend || {};
339
- tailwindConfig.theme.extend.colors = tailwindConfig.theme.extend.colors || {};
340
- const globalColors = {
341
- ...tailwindConfig.theme.colors || defaultColors,
342
- ...tailwindConfig.theme.extend?.colors
343
- };
344
- globalColors.primary = tailwindConfig.theme.extend.colors.primary = {
345
- 50: "rgb(var(--color-primary-50) / <alpha-value>)",
346
- 100: "rgb(var(--color-primary-100) / <alpha-value>)",
347
- 200: "rgb(var(--color-primary-200) / <alpha-value>)",
348
- 300: "rgb(var(--color-primary-300) / <alpha-value>)",
349
- 400: "rgb(var(--color-primary-400) / <alpha-value>)",
350
- 500: "rgb(var(--color-primary-500) / <alpha-value>)",
351
- 600: "rgb(var(--color-primary-600) / <alpha-value>)",
352
- 700: "rgb(var(--color-primary-700) / <alpha-value>)",
353
- 800: "rgb(var(--color-primary-800) / <alpha-value>)",
354
- 900: "rgb(var(--color-primary-900) / <alpha-value>)",
355
- 950: "rgb(var(--color-primary-950) / <alpha-value>)",
356
- DEFAULT: "rgb(var(--color-primary-DEFAULT) / <alpha-value>)"
357
- };
358
- if (globalColors.gray) {
359
- globalColors.cool = tailwindConfig.theme.extend.colors.cool = defaultColors.gray;
360
- }
361
- globalColors.gray = tailwindConfig.theme.extend.colors.gray = {
362
- 50: "rgb(var(--color-gray-50) / <alpha-value>)",
363
- 100: "rgb(var(--color-gray-100) / <alpha-value>)",
364
- 200: "rgb(var(--color-gray-200) / <alpha-value>)",
365
- 300: "rgb(var(--color-gray-300) / <alpha-value>)",
366
- 400: "rgb(var(--color-gray-400) / <alpha-value>)",
367
- 500: "rgb(var(--color-gray-500) / <alpha-value>)",
368
- 600: "rgb(var(--color-gray-600) / <alpha-value>)",
369
- 700: "rgb(var(--color-gray-700) / <alpha-value>)",
370
- 800: "rgb(var(--color-gray-800) / <alpha-value>)",
371
- 900: "rgb(var(--color-gray-900) / <alpha-value>)",
372
- 950: "rgb(var(--color-gray-950) / <alpha-value>)"
373
- };
374
- const colors = excludeColors(globalColors);
375
- nuxt.options.appConfig.ui = {
376
- primary: "green",
377
- gray: "cool",
378
- colors,
379
- strategy: "merge"
380
- };
381
- tailwindConfig.safelist = tailwindConfig.safelist || [];
382
- tailwindConfig.safelist.push(...generateSafelist(options.safelistColors || [], colors));
383
- });
384
196
  createTemplates(nuxt);
385
197
  await installModule("nuxt-icon");
386
198
  await installModule("@nuxtjs/color-mode", { classSuffix: "" });
387
- await installModule("@nuxtjs/tailwindcss", {
388
- exposeConfig: true,
389
- config: {
390
- darkMode: "class",
391
- plugins: [
392
- require("@tailwindcss/forms")({ strategy: "class" }),
393
- require("@tailwindcss/aspect-ratio"),
394
- require("@tailwindcss/typography"),
395
- require("@tailwindcss/container-queries"),
396
- require("@headlessui/tailwindcss"),
397
- iconsPlugin(Array.isArray(options.icons) || options.icons === "all" ? { collections: getIconCollections(options.icons) } : typeof options.icons === "object" ? options.icons : {})
398
- ],
399
- content: {
400
- files: [
401
- resolve(runtimeDir, "components/**/*.{vue,mjs,ts}"),
402
- resolve(runtimeDir, "ui.config/**/*.{mjs,js,ts}")
403
- ],
404
- transform: {
405
- vue: (content) => {
406
- return content.replaceAll(/(?:\r\n|\r|\n)/g, " ");
407
- }
408
- },
409
- extract: {
410
- vue: (content) => {
411
- return [
412
- ...defaultExtractor(content),
413
- // @ts-ignore
414
- ...customSafelistExtractor(options.prefix, content, nuxt.options.appConfig.ui.colors, options.safelistColors)
415
- ];
416
- }
417
- }
418
- }
419
- }
420
- });
199
+ await installTailwind(options, nuxt, resolve);
421
200
  addPlugin({
422
201
  src: resolve(runtimeDir, "plugins", "colors")
423
202
  });
@@ -1,13 +1,24 @@
1
1
  <template>
2
2
  <div :class="ui.wrapper" v-bind="attrs">
3
3
  <table :class="[ui.base, ui.divide]">
4
+ <slot v-if="$slots.caption || caption" name="caption">
5
+ <caption :class="ui.caption">
6
+ {{ caption }}
7
+ </caption>
8
+ </slot>
4
9
  <thead :class="ui.thead">
5
10
  <tr :class="ui.tr.base">
6
11
  <th v-if="modelValue" scope="col" :class="ui.checkbox.padding">
7
12
  <UCheckbox :model-value="indeterminate || selected.length === rows.length" :indeterminate="indeterminate" v-bind="ui.default.checkbox" aria-label="Select all" @change="onChange" />
8
13
  </th>
9
14
 
10
- <th v-for="(column, index) in columns" :key="index" scope="col" :class="[ui.th.base, ui.th.padding, ui.th.color, ui.th.font, ui.th.size, column.class]">
15
+ <th
16
+ v-for="(column, index) in columns"
17
+ :key="index"
18
+ scope="col"
19
+ :class="[ui.th.base, ui.th.padding, ui.th.color, ui.th.font, ui.th.size, column.class]"
20
+ :aria-sort="getAriaSort(column)"
21
+ >
11
22
  <slot :name="`${column.key}-header`" :column="column" :sort="sort" :on-sort="onSort">
12
23
  <UButton
13
24
  v-if="column.sortable"
@@ -160,6 +171,10 @@ export default defineComponent({
160
171
  type: Object,
161
172
  default: () => config.default.emptyState
162
173
  },
174
+ caption: {
175
+ type: String,
176
+ default: null
177
+ },
163
178
  progress: {
164
179
  type: Object,
165
180
  default: () => config.default.progress
@@ -259,6 +274,21 @@ export default defineComponent({
259
274
  function getRowData(row, rowKey, defaultValue = "") {
260
275
  return get(row, rowKey, defaultValue);
261
276
  }
277
+ function getAriaSort(column) {
278
+ if (!column.sortable) {
279
+ return void 0;
280
+ }
281
+ if (sort.value.column !== column.key) {
282
+ return "none";
283
+ }
284
+ if (sort.value.direction === "asc") {
285
+ return "ascending";
286
+ }
287
+ if (sort.value.direction === "desc") {
288
+ return "descending";
289
+ }
290
+ return void 0;
291
+ }
262
292
  return {
263
293
  // eslint-disable-next-line vue/no-dupe-keys
264
294
  ui,
@@ -279,7 +309,8 @@ export default defineComponent({
279
309
  onSort,
280
310
  onSelect,
281
311
  onChange,
282
- getRowData
312
+ getRowData,
313
+ getAriaSort
283
314
  };
284
315
  }
285
316
  });