@xleddyl/443-components-vue 0.2.3 → 0.4.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 (236) hide show
  1. package/README.md +106 -19
  2. package/dist/chart/BarChart.vue.d.ts +2 -2
  3. package/dist/chart/ChartLegend.vue.d.ts +4 -4
  4. package/dist/chart/ChartPanel.vue.d.ts +2 -2
  5. package/dist/chart/ChartSummary.vue.d.ts +2 -2
  6. package/dist/chart/DoughnutChart.vue.d.ts +2 -2
  7. package/dist/chart/LineChart.vue.d.ts +2 -2
  8. package/dist/components/core/Button.vue.d.ts +2 -2
  9. package/dist/components/core/FieldBoundary.vue +14 -0
  10. package/dist/components/core/FieldBoundary.vue.d.ts +15 -0
  11. package/dist/components/core/FieldMessage.vue +28 -0
  12. package/dist/components/core/FieldMessage.vue.d.ts +409 -0
  13. package/dist/components/core/Form.vue +109 -11
  14. package/dist/components/core/Form.vue.d.ts +45 -6
  15. package/dist/components/core/FormAlerts.vue +30 -0
  16. package/dist/components/core/FormAlerts.vue.d.ts +393 -0
  17. package/dist/components/core/FormField.vue +54 -17
  18. package/dist/components/core/FormField.vue.d.ts +5 -4
  19. package/dist/components/core/Icon.vue.d.ts +2 -2
  20. package/dist/components/core/Input.vue.d.ts +4 -4
  21. package/dist/components/core/Kbd.vue.d.ts +2 -2
  22. package/dist/components/core/Root.vue.d.ts +6 -6
  23. package/dist/components/core/Spinner.vue +13 -1
  24. package/dist/components/core/Spinner.vue.d.ts +4 -2
  25. package/dist/components/core/Textarea.vue.d.ts +4 -4
  26. package/dist/components/core/VisuallyHidden.vue.d.ts +6 -6
  27. package/dist/components/core/index.d.ts +3 -0
  28. package/dist/components/core/index.mjs +3 -0
  29. package/dist/components/data/Avatar.vue.d.ts +2 -2
  30. package/dist/components/data/AvatarGroup.vue.d.ts +2 -2
  31. package/dist/components/data/Badge.vue.d.ts +2 -2
  32. package/dist/components/data/DescriptionList.vue.d.ts +2 -2
  33. package/dist/components/data/FilterPill.vue +35 -0
  34. package/dist/components/data/FilterPill.vue.d.ts +445 -0
  35. package/dist/components/data/FilterPills.vue +100 -27
  36. package/dist/components/data/FilterPills.vue.d.ts +47 -411
  37. package/dist/components/data/Pagination.vue.d.ts +4 -4
  38. package/dist/components/data/SelectionBar.vue +81 -0
  39. package/dist/components/data/SelectionBar.vue.d.ts +427 -0
  40. package/dist/components/data/Stat.vue.d.ts +8 -8
  41. package/dist/components/data/Tag.vue.d.ts +4 -4
  42. package/dist/components/data/Timeline.vue.d.ts +2 -2
  43. package/dist/components/data/Tree.vue +245 -21
  44. package/dist/components/data/Tree.vue.d.ts +40 -10
  45. package/dist/components/data/index.d.ts +3 -0
  46. package/dist/components/data/index.mjs +3 -0
  47. package/dist/components/data/types.d.ts +26 -2
  48. package/dist/components/feedback/Alert.vue.d.ts +18 -18
  49. package/dist/components/feedback/EmptyState.vue.d.ts +2 -2
  50. package/dist/components/feedback/LoadingOverlay.vue.d.ts +2 -2
  51. package/dist/components/feedback/Meter.vue.d.ts +2 -2
  52. package/dist/components/feedback/Progress.vue.d.ts +2 -2
  53. package/dist/components/feedback/ProgressRing.vue.d.ts +2 -2
  54. package/dist/components/feedback/Skeleton.vue.d.ts +3 -3
  55. package/dist/components/forms/Calendar.vue.d.ts +4 -4
  56. package/dist/components/forms/CheckboxGroup.vue +2 -1
  57. package/dist/components/forms/ColorInput.vue.d.ts +6 -6
  58. package/dist/components/forms/DateInput.vue.d.ts +14 -14
  59. package/dist/components/forms/DatePicker.vue.d.ts +6 -6
  60. package/dist/components/forms/FileInput.vue +160 -34
  61. package/dist/components/forms/FileInput.vue.d.ts +43 -15
  62. package/dist/components/forms/InputAddon.vue.d.ts +2 -2
  63. package/dist/components/forms/InputGroup.vue.d.ts +2 -2
  64. package/dist/components/forms/NumberInput.vue.d.ts +6 -6
  65. package/dist/components/forms/PasswordInput.vue.d.ts +16 -16
  66. package/dist/components/forms/PinInput.vue.d.ts +6 -6
  67. package/dist/components/forms/Radio.vue.d.ts +2 -2
  68. package/dist/components/forms/RadioGroup.vue +2 -1
  69. package/dist/components/forms/SegmentedControl.vue +33 -8
  70. package/dist/components/forms/SegmentedControl.vue.d.ts +15 -7
  71. package/dist/components/forms/Slider.vue.d.ts +6 -6
  72. package/dist/components/forms/Switch.vue.d.ts +6 -6
  73. package/dist/components/forms/TimeInput.vue.d.ts +16 -16
  74. package/dist/components/forms/types.d.ts +17 -0
  75. package/dist/components/layout/Accordion.vue +25 -5
  76. package/dist/components/layout/Accordion.vue.d.ts +11 -8
  77. package/dist/components/layout/AppShell.vue +1 -1
  78. package/dist/components/layout/AppShell.vue.d.ts +7 -7
  79. package/dist/components/layout/Breadcrumbs.vue +28 -20
  80. package/dist/components/layout/Breadcrumbs.vue.d.ts +18 -3
  81. package/dist/components/layout/Card.vue +22 -3
  82. package/dist/components/layout/Card.vue.d.ts +10 -4
  83. package/dist/components/layout/CopyButton.vue.d.ts +4 -4
  84. package/dist/components/layout/Grid.vue.d.ts +2 -2
  85. package/dist/components/layout/NavLink.vue.d.ts +8 -8
  86. package/dist/components/layout/PageHeader.vue +10 -1
  87. package/dist/components/layout/PageHeader.vue.d.ts +17 -9
  88. package/dist/components/layout/Separator.vue.d.ts +2 -2
  89. package/dist/components/layout/Sidebar.vue.d.ts +2 -2
  90. package/dist/components/layout/SidebarSection.vue.d.ts +2 -2
  91. package/dist/components/layout/Stack.vue.d.ts +6 -6
  92. package/dist/components/layout/Tabs.vue +37 -7
  93. package/dist/components/layout/Tabs.vue.d.ts +11 -4
  94. package/dist/components/layout/ThemeSwitch.vue.d.ts +2 -2
  95. package/dist/components/layout/Toolbar.vue.d.ts +2 -2
  96. package/dist/components/layout/types.d.ts +8 -1
  97. package/dist/components/overlays/CommandPalette.vue +35 -8
  98. package/dist/components/overlays/CommandPalette.vue.d.ts +273 -497
  99. package/dist/components/overlays/ConfirmDialog.vue.d.ts +8 -6
  100. package/dist/components/overlays/ConfirmHost.vue +5 -1
  101. package/dist/components/overlays/ConfirmHost.vue.d.ts +10 -8
  102. package/dist/components/overlays/ContextMenu.vue.d.ts +4 -4
  103. package/dist/components/overlays/Drawer.vue +4 -2
  104. package/dist/components/overlays/Drawer.vue.d.ts +8 -6
  105. package/dist/components/overlays/DropdownMenu.vue.d.ts +2 -2
  106. package/dist/components/overlays/HoverCard.vue +2 -1
  107. package/dist/components/overlays/HoverCard.vue.d.ts +8 -8
  108. package/dist/components/overlays/Modal.vue +5 -3
  109. package/dist/components/overlays/Modal.vue.d.ts +8 -6
  110. package/dist/components/overlays/Popover.vue +2 -1
  111. package/dist/components/overlays/Popover.vue.d.ts +8 -8
  112. package/dist/components/overlays/Toaster.vue.d.ts +4 -4
  113. package/dist/components/overlays/Tooltip.vue.d.ts +2 -2
  114. package/dist/components/overlays/types.d.ts +11 -5
  115. package/dist/components/templates/AccountMenu.vue.d.ts +6 -6
  116. package/dist/components/templates/AppearanceSettings.vue.d.ts +2 -2
  117. package/dist/components/templates/AuthLayout.vue.d.ts +2 -2
  118. package/dist/components/templates/Brand.vue +34 -5
  119. package/dist/components/templates/Brand.vue.d.ts +20 -15
  120. package/dist/components/templates/DashboardLayout.vue +49 -10
  121. package/dist/components/templates/DashboardLayout.vue.d.ts +332 -553
  122. package/dist/components/templates/DashboardPage.vue.d.ts +2 -2
  123. package/dist/components/templates/DetailPage.vue.d.ts +4 -4
  124. package/dist/components/templates/EmptyPage.vue.d.ts +2 -2
  125. package/dist/components/templates/ErrorPage.vue.d.ts +2 -2
  126. package/dist/components/templates/ListPage.vue +17 -11
  127. package/dist/components/templates/ListPage.vue.d.ts +3 -3
  128. package/dist/components/templates/NotFoundPage.vue.d.ts +1 -1
  129. package/dist/components/templates/SaveBar.vue.d.ts +4 -4
  130. package/dist/components/templates/SettingsGroup.vue.d.ts +2 -2
  131. package/dist/components/templates/SettingsModal.vue +5 -2
  132. package/dist/components/templates/SettingsModal.vue.d.ts +13 -8
  133. package/dist/components/templates/SettingsPage.vue.d.ts +4 -4
  134. package/dist/components/templates/SettingsSection.vue.d.ts +12 -8
  135. package/dist/components/templates/types.d.ts +25 -2
  136. package/dist/composables/core.d.ts +1 -0
  137. package/dist/composables/core.mjs +1 -0
  138. package/dist/composables/useField.d.ts +8 -1
  139. package/dist/composables/useField.mjs +41 -10
  140. package/dist/composables/useFieldBoundary.d.ts +2 -0
  141. package/dist/composables/useFieldBoundary.mjs +9 -0
  142. package/dist/composables/useFileDrop.d.ts +20 -0
  143. package/dist/composables/useFileDrop.mjs +115 -7
  144. package/dist/composables/useForm.d.ts +36 -19
  145. package/dist/composables/useForm.mjs +258 -51
  146. package/dist/editor/RichTextEditor.vue +32 -4
  147. package/dist/editor/RichTextEditor.vue.d.ts +11 -6
  148. package/dist/editor/rich-text-editor.css +1 -1
  149. package/dist/editor/types.d.ts +3 -0
  150. package/dist/grid/GridToolbar.vue.d.ts +4 -4
  151. package/dist/grid/cells/BadgeCell.vue.d.ts +2 -2
  152. package/dist/grid/cells/BooleanCell.vue.d.ts +2 -2
  153. package/dist/grid/cells/DateCell.vue.d.ts +2 -2
  154. package/dist/grid/cells/ImageCell.vue.d.ts +2 -2
  155. package/dist/grid/cells/LinkCell.vue.d.ts +2 -2
  156. package/dist/internal/core/ButtonElement.d.ts +2 -0
  157. package/dist/internal/core/ButtonElement.mjs +8 -0
  158. package/dist/internal/data/tree.d.ts +8 -0
  159. package/dist/internal/data/tree.mjs +41 -0
  160. package/dist/internal/forms/files.d.ts +9 -0
  161. package/dist/internal/forms/files.mjs +32 -1
  162. package/dist/internal/forms/standard-schema.d.ts +17 -0
  163. package/dist/internal/forms/standard-schema.mjs +40 -0
  164. package/dist/internal/keys.d.ts +2 -1
  165. package/dist/internal/keys.mjs +1 -0
  166. package/dist/internal/overlays/DialogFrame.vue +17 -7
  167. package/dist/internal/overlays/DialogFrame.vue.d.ts +9 -5
  168. package/dist/internal/overlays/MenuList.vue +2 -0
  169. package/dist/internal/overlays/MenuList.vue.d.ts +5 -5
  170. package/dist/internal/overlays/OverlayView.vue +2 -0
  171. package/dist/internal/overlays/OverlayView.vue.d.ts +14 -12
  172. package/dist/internal/overlays/dialog.d.ts +4 -1
  173. package/dist/internal/overlays/dialog.mjs +39 -5
  174. package/dist/internal/overlays/stack.d.ts +2 -1
  175. package/dist/locale/en.mjs +19 -2
  176. package/dist/locale/it.mjs +19 -2
  177. package/dist/locale/types.d.ts +17 -0
  178. package/dist/nuxt/module.d.ts +1 -0
  179. package/dist/nuxt/module.mjs +6 -3
  180. package/dist/nuxt/runtime/layouts/auth.vue.d.ts +8 -8
  181. package/dist/nuxt/runtime/layouts/dashboard.vue.d.ts +8 -8
  182. package/dist/styles/base.css +2 -0
  183. package/dist/styles/core/button.css +1 -13
  184. package/dist/styles/core/field-message.css +34 -0
  185. package/dist/styles/core/form-field.css +0 -23
  186. package/dist/styles/core/form.css +11 -0
  187. package/dist/styles/core/kbd.css +2 -2
  188. package/dist/styles/core/spinner.css +19 -0
  189. package/dist/styles/core.css +1 -0
  190. package/dist/styles/data/avatar.css +1 -1
  191. package/dist/styles/data/badge.css +1 -1
  192. package/dist/styles/data/filter-pills.css +40 -4
  193. package/dist/styles/data/pagination.css +0 -1
  194. package/dist/styles/data/selection-bar.css +89 -0
  195. package/dist/styles/data/stat.css +1 -6
  196. package/dist/styles/data/table.css +1 -3
  197. package/dist/styles/data/tag.css +1 -4
  198. package/dist/styles/data/tree.css +163 -2
  199. package/dist/styles/data.css +1 -0
  200. package/dist/styles/feedback/alert.css +0 -1
  201. package/dist/styles/feedback/empty-state.css +0 -1
  202. package/dist/styles/forms/calendar.css +1 -1
  203. package/dist/styles/forms/color-input.css +1 -1
  204. package/dist/styles/forms/combobox.css +0 -1
  205. package/dist/styles/forms/date-picker.css +1 -1
  206. package/dist/styles/forms/file-input.css +17 -1
  207. package/dist/styles/forms/number-input.css +1 -1
  208. package/dist/styles/forms/password-input.css +1 -5
  209. package/dist/styles/forms/segmented.css +8 -0
  210. package/dist/styles/forms/select.css +1 -1
  211. package/dist/styles/forms/slider.css +2 -2
  212. package/dist/styles/forms/switch.css +0 -1
  213. package/dist/styles/layout/accordion.css +22 -1
  214. package/dist/styles/layout/app-shell.css +4 -0
  215. package/dist/styles/layout/breadcrumbs.css +16 -1
  216. package/dist/styles/layout/card.css +20 -6
  217. package/dist/styles/layout/copy-button.css +2 -2
  218. package/dist/styles/layout/nav-link.css +2 -3
  219. package/dist/styles/layout/sidebar-nav.css +1 -1
  220. package/dist/styles/layout/sidebar.css +2 -2
  221. package/dist/styles/layout/tabs.css +65 -3
  222. package/dist/styles/layout/theme-switch.css +1 -3
  223. package/dist/styles/overlays/command.css +21 -3
  224. package/dist/styles/overlays/confirm.css +0 -1
  225. package/dist/styles/overlays/menu.css +3 -5
  226. package/dist/styles/overlays/modal.css +38 -0
  227. package/dist/styles/overlays/toast.css +0 -1
  228. package/dist/styles/templates/auth-layout.css +0 -1
  229. package/dist/styles/templates/brand.css +15 -0
  230. package/dist/styles/templates/empty-page.css +4 -4
  231. package/dist/styles/templates/form-page.css +1 -1
  232. package/dist/styles/templates/list-page.css +2 -6
  233. package/dist/styles/templates/page.css +1 -1
  234. package/dist/styles/templates/settings-modal.css +2 -3
  235. package/dist/styles/tokens.css +1 -1
  236. package/package.json +1 -1
@@ -11,6 +11,35 @@ export function useModalDialog(options) {
11
11
  const scrollLock = useScrollLock();
12
12
  let returnTarget = null;
13
13
  let pressedOnBackdrop = false;
14
+ let closing = false;
15
+ async function allowClose(reason) {
16
+ const guard = options.beforeClose?.();
17
+ if (!guard) return true;
18
+ if (closing) return false;
19
+ closing = true;
20
+ try {
21
+ return await guard(reason) !== false;
22
+ } catch {
23
+ return false;
24
+ } finally {
25
+ closing = false;
26
+ }
27
+ }
28
+ async function requestClose(reason) {
29
+ if (!options.open.value) return true;
30
+ if (!await allowClose(reason)) return false;
31
+ options.open.value = false;
32
+ return true;
33
+ }
34
+ function reopen() {
35
+ const dialog = options.dialog.value;
36
+ if (!dialog || dialog.open || !options.open.value) return;
37
+ try {
38
+ dialog.showModal();
39
+ } catch {
40
+ dialog.setAttribute("open", "");
41
+ }
42
+ }
14
43
  async function show() {
15
44
  present.value = true;
16
45
  await nextTick();
@@ -63,10 +92,15 @@ export function useModalDialog(options) {
63
92
  });
64
93
  function onCancel(event) {
65
94
  event.preventDefault();
66
- if (options.dismissible()) options.open.value = false;
95
+ if (options.dismissible()) requestClose("escape");
67
96
  }
68
- function onClose() {
69
- if (options.open.value) options.open.value = false;
97
+ async function onClose() {
98
+ if (!options.open.value) return;
99
+ if (!options.beforeClose?.()) {
100
+ options.open.value = false;
101
+ return;
102
+ }
103
+ if (!options.dismissible() || !await requestClose("escape")) reopen();
70
104
  }
71
105
  function onPointerDown(event) {
72
106
  pressedOnBackdrop = event.target === event.currentTarget;
@@ -74,7 +108,7 @@ export function useModalDialog(options) {
74
108
  function onClick(event) {
75
109
  const fromBackdrop = pressedOnBackdrop && event.target === event.currentTarget;
76
110
  pressedOnBackdrop = false;
77
- if (fromBackdrop && options.dismissible()) options.open.value = false;
111
+ if (fromBackdrop && options.dismissible()) requestClose("backdrop");
78
112
  }
79
- return { present, onCancel, onClose, onPointerDown, onClick };
113
+ return { present, requestClose, onCancel, onClose, onPointerDown, onClick };
80
114
  }
@@ -1,5 +1,5 @@
1
1
  import type { Component, InjectionKey } from 'vue';
2
- import type { DrawerSide, DrawerSize, ModalSize } from '../../components/overlays/types';
2
+ import type { DialogBeforeClose, DrawerSide, DrawerSize, ModalSize } from '../../components/overlays/types';
3
3
  export type OverlayKind = 'modal' | 'drawer';
4
4
  export interface OverlayOptions {
5
5
  as?: OverlayKind;
@@ -12,6 +12,7 @@ export interface OverlayOptions {
12
12
  dismissible?: boolean;
13
13
  hideClose?: boolean;
14
14
  closeLabel?: string;
15
+ beforeClose?: DialogBeforeClose;
15
16
  }
16
17
  export interface OverlayContext<R = unknown> {
17
18
  id: number;
@@ -187,7 +187,12 @@ export const en = {
187
187
  title: "Drop files here or click to browse",
188
188
  drop: "Release to add files",
189
189
  list: "Selected files",
190
- selected: "{count} file selected | {count} files selected"
190
+ selected: "{count} file selected | {count} files selected",
191
+ directoryTitle: "Drop a folder here or click to browse",
192
+ mixedTitle: "Drop files or folders here or click to browse",
193
+ browseDirectory: "Upload a folder",
194
+ loading: "Uploading",
195
+ added: "{count} file added | {count} files added"
191
196
  },
192
197
  filterPills: {
193
198
  label: "Filters"
@@ -239,6 +244,13 @@ export const en = {
239
244
  saveBar: {
240
245
  message: "You have unsaved changes"
241
246
  },
247
+ selectionBar: {
248
+ label: "Selection",
249
+ selectedOf: "{count} of {total} selected",
250
+ selectAll: "Select all {count}",
251
+ clear: "Clear selection",
252
+ cleared: "Selection cleared"
253
+ },
242
254
  settings: {
243
255
  title: "Settings",
244
256
  close: "Close settings",
@@ -278,7 +290,12 @@ export const en = {
278
290
  dismiss: "Dismiss notification"
279
291
  },
280
292
  tree: {
281
- label: "Tree"
293
+ label: "Tree",
294
+ empty: "No items",
295
+ reorderHint: "Press Alt with the up or down arrow to move",
296
+ reorderNestedHint: "Press Alt with the arrow keys to move: up and down change the position, left and right change the level",
297
+ moved: "{label} moved to position {position} of {count}",
298
+ movedInto: "{label} moved into {parent}, position {position} of {count}"
282
299
  }
283
300
  }
284
301
  };
@@ -187,7 +187,12 @@ export const it = {
187
187
  title: "Trascina i file qui o fai clic per sfogliare",
188
188
  drop: "Rilascia per aggiungere i file",
189
189
  list: "File selezionati",
190
- selected: "{count} file selezionato | {count} file selezionati"
190
+ selected: "{count} file selezionato | {count} file selezionati",
191
+ directoryTitle: "Trascina una cartella qui o fai clic per sfogliare",
192
+ mixedTitle: "Trascina file o cartelle qui o fai clic per sfogliare",
193
+ browseDirectory: "Carica una cartella",
194
+ loading: "Caricamento in corso",
195
+ added: "{count} file aggiunto | {count} file aggiunti"
191
196
  },
192
197
  filterPills: {
193
198
  label: "Filtri"
@@ -239,6 +244,13 @@ export const it = {
239
244
  saveBar: {
240
245
  message: "Hai modifiche non salvate"
241
246
  },
247
+ selectionBar: {
248
+ label: "Selezione",
249
+ selectedOf: "{count} di {total} selezionato | {count} di {total} selezionati",
250
+ selectAll: "Seleziona tutti e {count}",
251
+ clear: "Deseleziona tutto",
252
+ cleared: "Selezione annullata"
253
+ },
242
254
  settings: {
243
255
  title: "Impostazioni",
244
256
  close: "Chiudi impostazioni",
@@ -278,7 +290,12 @@ export const it = {
278
290
  dismiss: "Chiudi notifica"
279
291
  },
280
292
  tree: {
281
- label: "Albero"
293
+ label: "Albero",
294
+ empty: "Nessun elemento",
295
+ reorderHint: "Premi Alt con la freccia su o gi\xF9 per spostare",
296
+ reorderNestedHint: "Premi Alt con le frecce per spostare: su e gi\xF9 cambiano la posizione, sinistra e destra il livello",
297
+ moved: "{label} ora in posizione {position} di {count}",
298
+ movedInto: "{label} ora dentro {parent}, in posizione {position} di {count}"
282
299
  }
283
300
  }
284
301
  };
@@ -186,6 +186,11 @@ export interface KMessages {
186
186
  drop: string;
187
187
  list: string;
188
188
  selected: string;
189
+ directoryTitle: string;
190
+ mixedTitle: string;
191
+ browseDirectory: string;
192
+ loading: string;
193
+ added: string;
189
194
  };
190
195
  filterPills: {
191
196
  label: string;
@@ -237,6 +242,13 @@ export interface KMessages {
237
242
  saveBar: {
238
243
  message: string;
239
244
  };
245
+ selectionBar: {
246
+ label: string;
247
+ selectedOf: string;
248
+ selectAll: string;
249
+ clear: string;
250
+ cleared: string;
251
+ };
240
252
  settings: {
241
253
  title: string;
242
254
  close: string;
@@ -277,6 +289,11 @@ export interface KMessages {
277
289
  };
278
290
  tree: {
279
291
  label: string;
292
+ empty: string;
293
+ reorderHint: string;
294
+ reorderNestedHint: string;
295
+ moved: string;
296
+ movedInto: string;
280
297
  };
281
298
  }
282
299
  export interface KLocale {
@@ -5,6 +5,7 @@ import type { DeepPartial, KMessages } from '../locale/types';
5
5
  export type { KAppConfig } from '../components/templates/types';
6
6
  export interface IconCollectionOption {
7
7
  prefix: string;
8
+ from?: string;
8
9
  include?: string[];
9
10
  exclude?: string[];
10
11
  }
@@ -149,12 +149,15 @@ export default defineNuxtModule({
149
149
  ].join("\n")
150
150
  });
151
151
  const collections = [];
152
+ const seenPrefixes = /* @__PURE__ */ new Set();
152
153
  for (const entry of options.icons.collections ?? []) {
153
154
  const collection = typeof entry === "string" ? { prefix: entry } : entry;
154
- const file = await resolveCollectionFile(collection.prefix, searchPaths);
155
- if (!file) {
155
+ if (seenPrefixes.has(collection.prefix)) continue;
156
+ seenPrefixes.add(collection.prefix);
157
+ const file = collection.from ? resolveIconsDir(collection.from, nuxt.options.rootDir) : await resolveCollectionFile(collection.prefix, searchPaths);
158
+ if (!file || !existsSync(file)) {
156
159
  console.warn(
157
- `[@xleddyl/443-components-vue] icon collection "${collection.prefix}" not installed: pnpm add -D @iconify-json/${collection.prefix}`
160
+ collection.from ? `[@xleddyl/443-components-vue] icon collection "${collection.prefix}" not found: ${file}` : `[@xleddyl/443-components-vue] icon collection "${collection.prefix}" not installed: pnpm add -D @iconify-json/${collection.prefix}`
158
161
  );
159
162
  continue;
160
163
  }
@@ -21,9 +21,6 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
21
21
  readonly results?: (string | number) | undefined;
22
22
  readonly placeholder?: string | undefined | undefined;
23
23
  readonly bind?: Record<string, unknown> | undefined;
24
- readonly type?: string | undefined | undefined;
25
- readonly ref?: import("vue").VNodeRef | undefined;
26
- readonly target?: string | undefined | undefined;
27
24
  readonly class?: import("vue").ClassValue;
28
25
  readonly role?: string | undefined | undefined;
29
26
  readonly 'aria-label'?: string | undefined | undefined;
@@ -127,6 +124,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
127
124
  readonly id?: string | undefined | undefined;
128
125
  readonly lang?: string | undefined | undefined;
129
126
  readonly media?: string | undefined | undefined;
127
+ readonly target?: string | undefined | undefined;
128
+ readonly type?: string | undefined | undefined;
130
129
  readonly tabindex?: (string | number) | undefined;
131
130
  readonly href?: string | undefined | undefined;
132
131
  readonly 'aria-activedescendant'?: string | undefined | undefined;
@@ -138,7 +137,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
138
137
  readonly 'aria-colindex'?: (string | number) | undefined;
139
138
  readonly 'aria-colspan'?: (string | number) | undefined;
140
139
  readonly 'aria-controls'?: string | undefined | undefined;
141
- readonly 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
140
+ readonly 'aria-current'?: "page" | "time" | (boolean | "true" | "false") | "step" | "location" | "date" | undefined;
142
141
  readonly 'aria-describedby'?: string | undefined | undefined;
143
142
  readonly 'aria-details'?: string | undefined | undefined;
144
143
  readonly 'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -175,6 +174,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
175
174
  readonly 'aria-valuemin'?: (string | number) | undefined;
176
175
  readonly 'aria-valuenow'?: (string | number) | undefined;
177
176
  readonly 'aria-valuetext'?: string | undefined | undefined;
177
+ readonly ref?: import("vue").VNodeRef | undefined;
178
178
  readonly ref_for?: boolean | undefined;
179
179
  readonly ref_key?: string | undefined;
180
180
  readonly accesskey?: string | undefined | undefined;
@@ -239,9 +239,6 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
239
239
  readonly results?: (string | number) | undefined;
240
240
  readonly placeholder?: string | undefined | undefined;
241
241
  readonly bind?: Record<string, unknown> | undefined;
242
- readonly type?: string | undefined | undefined;
243
- readonly ref?: import("vue").VNodeRef | undefined;
244
- readonly target?: string | undefined | undefined;
245
242
  readonly class?: import("vue").ClassValue;
246
243
  readonly role?: string | undefined | undefined;
247
244
  readonly 'aria-label'?: string | undefined | undefined;
@@ -345,6 +342,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
345
342
  readonly id?: string | undefined | undefined;
346
343
  readonly lang?: string | undefined | undefined;
347
344
  readonly media?: string | undefined | undefined;
345
+ readonly target?: string | undefined | undefined;
346
+ readonly type?: string | undefined | undefined;
348
347
  readonly tabindex?: (string | number) | undefined;
349
348
  readonly href?: string | undefined | undefined;
350
349
  readonly 'aria-activedescendant'?: string | undefined | undefined;
@@ -356,7 +355,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
356
355
  readonly 'aria-colindex'?: (string | number) | undefined;
357
356
  readonly 'aria-colspan'?: (string | number) | undefined;
358
357
  readonly 'aria-controls'?: string | undefined | undefined;
359
- readonly 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
358
+ readonly 'aria-current'?: "page" | "time" | (boolean | "true" | "false") | "step" | "location" | "date" | undefined;
360
359
  readonly 'aria-describedby'?: string | undefined | undefined;
361
360
  readonly 'aria-details'?: string | undefined | undefined;
362
361
  readonly 'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -393,6 +392,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
393
392
  readonly 'aria-valuemin'?: (string | number) | undefined;
394
393
  readonly 'aria-valuenow'?: (string | number) | undefined;
395
394
  readonly 'aria-valuetext'?: string | undefined | undefined;
395
+ readonly ref?: import("vue").VNodeRef | undefined;
396
396
  readonly ref_for?: boolean | undefined;
397
397
  readonly ref_key?: string | undefined;
398
398
  readonly accesskey?: string | undefined | undefined;
@@ -21,9 +21,6 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
21
21
  readonly results?: (string | number) | undefined;
22
22
  readonly placeholder?: string | undefined | undefined;
23
23
  readonly bind?: Record<string, unknown> | undefined;
24
- readonly type?: string | undefined | undefined;
25
- readonly ref?: import("vue").VNodeRef | undefined;
26
- readonly target?: string | undefined | undefined;
27
24
  readonly class?: import("vue").ClassValue;
28
25
  readonly role?: string | undefined | undefined;
29
26
  readonly 'aria-label'?: string | undefined | undefined;
@@ -127,6 +124,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
127
124
  readonly id?: string | undefined | undefined;
128
125
  readonly lang?: string | undefined | undefined;
129
126
  readonly media?: string | undefined | undefined;
127
+ readonly target?: string | undefined | undefined;
128
+ readonly type?: string | undefined | undefined;
130
129
  readonly tabindex?: (string | number) | undefined;
131
130
  readonly href?: string | undefined | undefined;
132
131
  readonly 'aria-activedescendant'?: string | undefined | undefined;
@@ -138,7 +137,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
138
137
  readonly 'aria-colindex'?: (string | number) | undefined;
139
138
  readonly 'aria-colspan'?: (string | number) | undefined;
140
139
  readonly 'aria-controls'?: string | undefined | undefined;
141
- readonly 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
140
+ readonly 'aria-current'?: "page" | "time" | (boolean | "true" | "false") | "step" | "location" | "date" | undefined;
142
141
  readonly 'aria-describedby'?: string | undefined | undefined;
143
142
  readonly 'aria-details'?: string | undefined | undefined;
144
143
  readonly 'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -175,6 +174,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
175
174
  readonly 'aria-valuemin'?: (string | number) | undefined;
176
175
  readonly 'aria-valuenow'?: (string | number) | undefined;
177
176
  readonly 'aria-valuetext'?: string | undefined | undefined;
177
+ readonly ref?: import("vue").VNodeRef | undefined;
178
178
  readonly ref_for?: boolean | undefined;
179
179
  readonly ref_key?: string | undefined;
180
180
  readonly accesskey?: string | undefined | undefined;
@@ -239,9 +239,6 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
239
239
  readonly results?: (string | number) | undefined;
240
240
  readonly placeholder?: string | undefined | undefined;
241
241
  readonly bind?: Record<string, unknown> | undefined;
242
- readonly type?: string | undefined | undefined;
243
- readonly ref?: import("vue").VNodeRef | undefined;
244
- readonly target?: string | undefined | undefined;
245
242
  readonly class?: import("vue").ClassValue;
246
243
  readonly role?: string | undefined | undefined;
247
244
  readonly 'aria-label'?: string | undefined | undefined;
@@ -345,6 +342,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
345
342
  readonly id?: string | undefined | undefined;
346
343
  readonly lang?: string | undefined | undefined;
347
344
  readonly media?: string | undefined | undefined;
345
+ readonly target?: string | undefined | undefined;
346
+ readonly type?: string | undefined | undefined;
348
347
  readonly tabindex?: (string | number) | undefined;
349
348
  readonly href?: string | undefined | undefined;
350
349
  readonly 'aria-activedescendant'?: string | undefined | undefined;
@@ -356,7 +355,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
356
355
  readonly 'aria-colindex'?: (string | number) | undefined;
357
356
  readonly 'aria-colspan'?: (string | number) | undefined;
358
357
  readonly 'aria-controls'?: string | undefined | undefined;
359
- readonly 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
358
+ readonly 'aria-current'?: "page" | "time" | (boolean | "true" | "false") | "step" | "location" | "date" | undefined;
360
359
  readonly 'aria-describedby'?: string | undefined | undefined;
361
360
  readonly 'aria-details'?: string | undefined | undefined;
362
361
  readonly 'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -393,6 +392,7 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
393
392
  readonly 'aria-valuemin'?: (string | number) | undefined;
394
393
  readonly 'aria-valuenow'?: (string | number) | undefined;
395
394
  readonly 'aria-valuetext'?: string | undefined | undefined;
395
+ readonly ref?: import("vue").VNodeRef | undefined;
396
396
  readonly ref_for?: boolean | undefined;
397
397
  readonly ref_key?: string | undefined;
398
398
  readonly accesskey?: string | undefined | undefined;
@@ -10,11 +10,13 @@
10
10
  }
11
11
 
12
12
  html.k-root {
13
+ font-size: 100%;
13
14
  background: var(--k-canvas);
14
15
  }
15
16
 
16
17
  html.k-root > body {
17
18
  margin: 0;
19
+ font-size: var(--k-font-size);
18
20
  }
19
21
 
20
22
  :where(.k-root, .k-root *, .k-root *::before, .k-root *::after) {
@@ -64,7 +64,7 @@
64
64
  }
65
65
 
66
66
  .k-btn > .k-icon {
67
- transition: transform var(--k-duration-lg) var(--k-ease-spring);
67
+ transition: transform var(--k-duration-lg) var(--k-ease-out);
68
68
  }
69
69
 
70
70
  .k-btn:hover > .k-icon[data-icon='arrow-right'],
@@ -77,18 +77,6 @@
77
77
  transform: translateX(-2px);
78
78
  }
79
79
 
80
- .k-btn:hover > .k-icon[data-icon='plus'] {
81
- transform: rotate(90deg);
82
- }
83
-
84
- .k-btn:hover > .k-icon[data-icon='arrow-path'] {
85
- transform: rotate(60deg);
86
- }
87
-
88
- .k-btn:hover > .k-icon[data-icon='arrow-up-tray'] {
89
- transform: translateY(-1px);
90
- }
91
-
92
80
  .k-btn-xs {
93
81
  --k-btn-size: var(--k-size-xs);
94
82
  --k-icon-size: 0.875rem;
@@ -0,0 +1,34 @@
1
+ .k-field-message,
2
+ .k-form-field-error,
3
+ .k-form-field-warning {
4
+ --k-icon-size: 0.875rem;
5
+ --k-field-message-tone: var(--k-danger);
6
+ display: flex;
7
+ align-items: flex-start;
8
+ gap: 0.375rem;
9
+ font-size: 0.8125rem;
10
+ line-height: 1.35;
11
+ color: var(--k-field-message-tone);
12
+ animation: k-enter var(--k-duration-lg) var(--k-ease-out) backwards;
13
+ }
14
+
15
+ .k-field-message-warning,
16
+ .k-form-field-warning {
17
+ --k-field-message-tone: var(--k-warning);
18
+ }
19
+
20
+ .k-field-message-neutral {
21
+ --k-field-message-tone: var(--k-text-muted);
22
+ }
23
+
24
+ .k-field-message > .k-icon,
25
+ .k-form-field-error > .k-icon,
26
+ .k-form-field-warning > .k-icon {
27
+ flex: none;
28
+ margin-top: 0.0625rem;
29
+ }
30
+
31
+ .k-field-message-text {
32
+ min-width: 0;
33
+ overflow-wrap: anywhere;
34
+ }
@@ -50,29 +50,6 @@
50
50
  color: var(--k-text-muted);
51
51
  }
52
52
 
53
- .k-form-field-error,
54
- .k-form-field-warning {
55
- display: flex;
56
- align-items: flex-start;
57
- gap: 0.375rem;
58
- font-size: 0.8125rem;
59
- line-height: 1.35;
60
- animation: k-enter var(--k-duration-lg) var(--k-ease-out) backwards;
61
- }
62
-
63
- .k-form-field-error > .k-icon,
64
- .k-form-field-warning > .k-icon {
65
- margin-top: 0.0625rem;
66
- }
67
-
68
- .k-form-field-error {
69
- color: var(--k-danger);
70
- }
71
-
72
- .k-form-field-warning {
73
- color: var(--k-warning);
74
- }
75
-
76
53
  .k-form-field.is-shaking :is(.k-field, .k-input, [data-k-shake]) {
77
54
  animation: k-shake 320ms var(--k-ease);
78
55
  }
@@ -8,3 +8,14 @@
8
8
  .k-form[aria-busy='true'] {
9
9
  cursor: progress;
10
10
  }
11
+
12
+ .k-form-alerts {
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: 0.5rem;
16
+ border-radius: var(--k-radius-md);
17
+ }
18
+
19
+ .k-form-alerts:focus {
20
+ outline: none;
21
+ }
@@ -6,7 +6,7 @@
6
6
  height: 1.25rem;
7
7
  padding: 0 0.3125rem;
8
8
  font-family: var(--k-font-mono);
9
- font-size: 0.6875rem;
9
+ font-size: 0.75rem;
10
10
  font-weight: 500;
11
11
  line-height: 1;
12
12
  color: var(--k-text-muted);
@@ -21,5 +21,5 @@
21
21
  min-width: 1.125rem;
22
22
  height: 1.125rem;
23
23
  padding: 0 0.25rem;
24
- font-size: 0.625rem;
24
+ font-size: 0.75rem;
25
25
  }
@@ -28,3 +28,22 @@
28
28
  --k-spinner-size: 1.75rem;
29
29
  --k-spinner-width: 2.5px;
30
30
  }
31
+
32
+ .k-spinner-block {
33
+ display: flex;
34
+ flex: 1;
35
+ flex-direction: column;
36
+ align-items: center;
37
+ justify-content: center;
38
+ gap: 0.75rem;
39
+ width: 100%;
40
+ min-height: 10rem;
41
+ padding: 1.5rem;
42
+ font-size: 0.8125rem;
43
+ color: var(--k-text-muted);
44
+ text-align: center;
45
+ }
46
+
47
+ .k-spinner-label {
48
+ animation: k-fade 300ms var(--k-ease) 120ms backwards;
49
+ }
@@ -4,6 +4,7 @@
4
4
  @import './core/button.css';
5
5
  @import './core/input.css';
6
6
  @import './core/textarea.css';
7
+ @import './core/field-message.css';
7
8
  @import './core/form-field.css';
8
9
  @import './core/form.css';
9
10
  @import './core/kbd.css';
@@ -118,7 +118,7 @@
118
118
 
119
119
  .k-avatar-group > .k-avatar {
120
120
  box-shadow: 0 0 0 2px var(--k-surface);
121
- transition: translate var(--k-duration-lg) var(--k-ease-spring);
121
+ transition: translate var(--k-duration-lg) var(--k-ease-out);
122
122
  }
123
123
 
124
124
  .k-avatar-group > .k-avatar + .k-avatar {
@@ -27,7 +27,7 @@
27
27
  gap: 0.25rem;
28
28
  height: 1.125rem;
29
29
  padding: 0 0.375rem;
30
- font-size: 0.6875rem;
30
+ font-size: 0.75rem;
31
31
  }
32
32
 
33
33
  .k-badge-accent {
@@ -36,7 +36,7 @@
36
36
  scale: 0.97;
37
37
  }
38
38
 
39
- .k-filter-pill[aria-pressed='true'] {
39
+ .k-filter-pill:is([aria-pressed='true'], .is-active) {
40
40
  border-style: solid;
41
41
  border-color: var(--k-accent-line);
42
42
  background: var(--k-accent-soft);
@@ -71,7 +71,6 @@
71
71
  }
72
72
 
73
73
  .k-filter-pill[aria-pressed='true'] .k-filter-pill-check > .k-icon {
74
- animation: k-icon-pop 300ms var(--k-ease-spring);
75
74
  }
76
75
 
77
76
  .k-filter-pill-count {
@@ -79,18 +78,19 @@
79
78
  padding: 0.125rem 0.3125rem;
80
79
  border-radius: var(--k-radius-full);
81
80
  background: var(--k-fill);
82
- font-size: 0.6875rem;
81
+ font-size: 0.75rem;
83
82
  font-variant-numeric: tabular-nums;
84
83
  line-height: 1;
85
84
  text-align: center;
86
85
  color: var(--k-text-muted);
87
86
  }
88
87
 
89
- .k-filter-pill[aria-pressed='true'] .k-filter-pill-count {
88
+ .k-filter-pill:is([aria-pressed='true'], .is-active) .k-filter-pill-count {
90
89
  background: color-mix(in oklab, var(--k-accent) 16%, transparent);
91
90
  color: var(--k-accent-text);
92
91
  }
93
92
 
93
+ .k-filter-pill-sm,
94
94
  .k-filter-pills-sm .k-filter-pill {
95
95
  height: var(--k-size-xs);
96
96
  padding: 0 0.5625rem;
@@ -100,3 +100,39 @@
100
100
  .k-filter-pills-clear {
101
101
  margin-left: 0.25rem;
102
102
  }
103
+
104
+ .k-filter-pill[aria-expanded='true'] {
105
+ border-style: solid;
106
+ background: var(--k-hover);
107
+ color: var(--k-text);
108
+ }
109
+
110
+ .k-filter-pill.is-active[aria-expanded='true'] {
111
+ background: color-mix(in oklab, var(--k-accent) 18%, transparent);
112
+ color: var(--k-accent-text);
113
+ }
114
+
115
+ .k-filter-pill-value {
116
+ padding-left: 0.3125rem;
117
+ border-left: 1px solid currentColor;
118
+ border-left-color: color-mix(in oklab, currentColor 30%, transparent);
119
+ font-weight: 600;
120
+ overflow: hidden;
121
+ text-overflow: ellipsis;
122
+ max-width: 14rem;
123
+ }
124
+
125
+ .k-filter-pill-caret {
126
+ --k-icon-size: 0.75rem;
127
+ margin-right: -0.125rem;
128
+ color: var(--k-text-dimmed);
129
+ transition: transform var(--k-duration-lg) var(--k-ease-out);
130
+ }
131
+
132
+ .k-filter-pill.is-active .k-filter-pill-caret {
133
+ color: inherit;
134
+ }
135
+
136
+ .k-filter-pill[aria-expanded='true'] .k-filter-pill-caret {
137
+ transform: rotate(180deg);
138
+ }
@@ -94,7 +94,6 @@
94
94
  border-color: var(--k-field-line);
95
95
  box-shadow: var(--k-shadow-xs);
96
96
  color: var(--k-text);
97
- animation: k-icon-pop 300ms var(--k-ease-spring);
98
97
  }
99
98
 
100
99
  .k-pagination-page:disabled {