nuxt-ui-tools 0.1.0 → 0.1.2

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 (186) hide show
  1. package/dist/module.d.mts +4 -0
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +30 -15
  4. package/dist/runtime/form/components/actions/FormActions.d.vue.ts +0 -2
  5. package/dist/runtime/form/components/actions/FormActions.vue +5 -8
  6. package/dist/runtime/form/components/actions/FormActions.vue.d.ts +0 -2
  7. package/dist/runtime/form/components/layout/DrawerLayout.vue +5 -1
  8. package/dist/runtime/form/components/layout/ModalLayout.vue +5 -1
  9. package/dist/runtime/form/components/renderer/FormCompositeControl.d.vue.ts +15 -0
  10. package/dist/runtime/form/components/renderer/FormCompositeControl.vue +13 -0
  11. package/dist/runtime/form/components/renderer/FormCompositeControl.vue.d.ts +15 -0
  12. package/dist/runtime/form/components/renderer/FormFieldRenderer.d.vue.ts +1 -0
  13. package/dist/runtime/form/components/renderer/FormFieldRenderer.vue +19 -3
  14. package/dist/runtime/form/components/renderer/FormFieldRenderer.vue.d.ts +1 -0
  15. package/dist/runtime/form/components/renderer/FormFieldShell.d.vue.ts +4 -4
  16. package/dist/runtime/form/components/renderer/FormFieldShell.vue +15 -1
  17. package/dist/runtime/form/components/renderer/FormFieldShell.vue.d.ts +4 -4
  18. package/dist/runtime/form/components/root/Form.d.vue.ts +2 -2
  19. package/dist/runtime/form/components/root/Form.vue +5 -3
  20. package/dist/runtime/form/components/root/Form.vue.d.ts +2 -2
  21. package/dist/runtime/form/composables/use-field-control.d.ts +1 -1
  22. package/dist/runtime/form/composables/use-field-control.js +4 -0
  23. package/dist/runtime/form/composables/use-field-options.d.ts +1 -1
  24. package/dist/runtime/form/composables/use-field-options.js +75 -31
  25. package/dist/runtime/form/composables/use-form-field-chrome.d.ts +3 -0
  26. package/dist/runtime/form/composables/use-form-field-chrome.js +9 -0
  27. package/dist/runtime/form/composables/use-form-runtime.js +17 -5
  28. package/dist/runtime/form/fields/array-list/component.vue +4 -1
  29. package/dist/runtime/form/fields/auto-complete/component.vue +23 -16
  30. package/dist/runtime/form/fields/checkbox-card/component.vue +28 -29
  31. package/dist/runtime/form/fields/checkbox-group/component.vue +28 -29
  32. package/dist/runtime/form/fields/color-picker/component.vue +4 -2
  33. package/dist/runtime/form/fields/date-family/component.vue +9 -4
  34. package/dist/runtime/form/fields/hierarchy/SelectionCheckbox.d.vue.ts +13 -0
  35. package/dist/runtime/form/fields/hierarchy/SelectionCheckbox.vue +24 -0
  36. package/dist/runtime/form/fields/hierarchy/SelectionCheckbox.vue.d.ts +13 -0
  37. package/dist/runtime/form/fields/hierarchy/SelectionRadio.d.vue.ts +14 -0
  38. package/dist/runtime/form/fields/hierarchy/SelectionRadio.vue +27 -0
  39. package/dist/runtime/form/fields/hierarchy/SelectionRadio.vue.d.ts +14 -0
  40. package/dist/runtime/form/fields/hierarchy/component.vue +257 -142
  41. package/dist/runtime/form/fields/hierarchy/utils.d.ts +9 -0
  42. package/dist/runtime/form/fields/hierarchy/utils.js +32 -0
  43. package/dist/runtime/form/fields/input-group/component.vue +7 -30
  44. package/dist/runtime/form/fields/matrix/component.vue +9 -3
  45. package/dist/runtime/form/fields/phone-number/component.vue +7 -2
  46. package/dist/runtime/form/fields/rating/component.vue +25 -2
  47. package/dist/runtime/form/fields/select/component.vue +29 -21
  48. package/dist/runtime/form/fields/switch-group/component.vue +8 -3
  49. package/dist/runtime/form/fields/time/component.vue +7 -5
  50. package/dist/runtime/form/fields/upload/component.vue +5 -3
  51. package/dist/runtime/form/types/api.d.ts +9 -3
  52. package/dist/runtime/form/types/field-base.d.ts +3 -1
  53. package/dist/runtime/form/types/runtime.d.ts +2 -0
  54. package/dist/runtime/form/types/ui.d.ts +1 -0
  55. package/dist/runtime/form/utils/api.js +3 -0
  56. package/dist/runtime/form/utils/options.d.ts +11 -2
  57. package/dist/runtime/form/utils/options.js +57 -9
  58. package/dist/runtime/form/utils/state.js +10 -2
  59. package/dist/runtime/i18n/locales/en.js +38 -0
  60. package/dist/runtime/i18n/locales/fr.js +38 -0
  61. package/dist/runtime/i18n/types.d.ts +38 -0
  62. package/dist/runtime/i18n/use-locale.d.ts +2 -2
  63. package/dist/runtime/i18n/use-locale.js +3 -3
  64. package/dist/runtime/spreadsheet/components/layout/SpreadsheetImportFooter.d.vue.ts +2 -2
  65. package/dist/runtime/spreadsheet/components/layout/SpreadsheetImportFooter.vue.d.ts +2 -2
  66. package/dist/runtime/spreadsheet/components/steps/review/SpreadsheetReviewInspection.d.vue.ts +2 -2
  67. package/dist/runtime/spreadsheet/components/steps/review/SpreadsheetReviewInspection.vue.d.ts +2 -2
  68. package/dist/runtime/spreadsheet/composables/use-spreadsheet-internals.d.ts +15 -15
  69. package/dist/runtime/spreadsheet/composables/use-spreadsheet-resolutions.d.ts +2 -2
  70. package/dist/runtime/spreadsheet/schema/normalize.d.ts +1 -1
  71. package/dist/runtime/spreadsheet/utils/references/sources.d.ts +1 -1
  72. package/dist/runtime/table/components/DataList.d.vue.ts +2 -0
  73. package/dist/runtime/table/components/DataList.vue.d.ts +2 -0
  74. package/dist/runtime/table/components/actions/RowActions.d.vue.ts +4 -2
  75. package/dist/runtime/table/components/actions/RowActions.vue +2 -0
  76. package/dist/runtime/table/components/actions/RowActions.vue.d.ts +4 -2
  77. package/dist/runtime/table/components/data-list/DataListAddFilter.d.vue.ts +5 -3
  78. package/dist/runtime/table/components/data-list/DataListAddFilter.vue +6 -1
  79. package/dist/runtime/table/components/data-list/DataListAddFilter.vue.d.ts +5 -3
  80. package/dist/runtime/table/components/data-list/DataListContent.d.vue.ts +24 -17
  81. package/dist/runtime/table/components/data-list/DataListContent.vue +70 -17
  82. package/dist/runtime/table/components/data-list/DataListContent.vue.d.ts +24 -17
  83. package/dist/runtime/table/components/data-list/DataListDefault.d.vue.ts +2 -0
  84. package/dist/runtime/table/components/data-list/DataListDefault.vue.d.ts +2 -0
  85. package/dist/runtime/table/components/data-list/DataListFilterTags.d.vue.ts +2 -0
  86. package/dist/runtime/table/components/data-list/DataListFilterTags.vue.d.ts +2 -0
  87. package/dist/runtime/table/components/data-list/DataListInfiniteLoader.d.vue.ts +1 -1
  88. package/dist/runtime/table/components/data-list/DataListInfiniteLoader.vue.d.ts +1 -1
  89. package/dist/runtime/table/components/data-list/DataListLayoutSwitch.vue +17 -11
  90. package/dist/runtime/table/components/data-list/DataListPagination.d.vue.ts +1 -1
  91. package/dist/runtime/table/components/data-list/DataListPagination.vue.d.ts +1 -1
  92. package/dist/runtime/table/components/data-list/DataListRoot.vue +2 -46
  93. package/dist/runtime/table/components/data-list/DataListSortMenu.d.vue.ts +1 -1
  94. package/dist/runtime/table/components/data-list/DataListSortMenu.vue +6 -0
  95. package/dist/runtime/table/components/data-list/DataListSortMenu.vue.d.ts +1 -1
  96. package/dist/runtime/table/components/filters/shared/DynamicFilterPicker.d.vue.ts +5 -0
  97. package/dist/runtime/table/components/filters/shared/DynamicFilterPicker.vue +182 -59
  98. package/dist/runtime/table/components/filters/shared/DynamicFilterPicker.vue.d.ts +5 -0
  99. package/dist/runtime/table/components/filters/shared/FilterMatchModeButton.d.vue.ts +3 -1
  100. package/dist/runtime/table/components/filters/shared/FilterMatchModeButton.vue +29 -5
  101. package/dist/runtime/table/components/filters/shared/FilterMatchModeButton.vue.d.ts +3 -1
  102. package/dist/runtime/table/components/filters/shared/FilterMatchModePanel.d.vue.ts +17 -0
  103. package/dist/runtime/table/components/filters/shared/FilterMatchModePanel.vue +47 -0
  104. package/dist/runtime/table/components/filters/shared/FilterMatchModePanel.vue.d.ts +17 -0
  105. package/dist/runtime/table/components/filters/shared/FilterOptionMultipleList.d.vue.ts +3 -1
  106. package/dist/runtime/table/components/filters/shared/FilterOptionMultipleList.vue +12 -3
  107. package/dist/runtime/table/components/filters/shared/FilterOptionMultipleList.vue.d.ts +3 -1
  108. package/dist/runtime/table/components/filters/shared/FilterOptionPickerContent.d.vue.ts +3 -0
  109. package/dist/runtime/table/components/filters/shared/FilterOptionPickerContent.vue +11 -1
  110. package/dist/runtime/table/components/filters/shared/FilterOptionPickerContent.vue.d.ts +3 -0
  111. package/dist/runtime/table/components/filters/shared/FilterOptionRow.d.vue.ts +3 -0
  112. package/dist/runtime/table/components/filters/shared/FilterOptionRow.vue +48 -9
  113. package/dist/runtime/table/components/filters/shared/FilterOptionRow.vue.d.ts +3 -0
  114. package/dist/runtime/table/components/filters/shared/FilterOptionSingleList.d.vue.ts +3 -0
  115. package/dist/runtime/table/components/filters/shared/FilterOptionSingleList.vue +35 -9
  116. package/dist/runtime/table/components/filters/shared/FilterOptionSingleList.vue.d.ts +3 -0
  117. package/dist/runtime/table/components/filters/shared/FilterOptionTreeContent.d.vue.ts +3 -0
  118. package/dist/runtime/table/components/filters/shared/FilterOptionTreeContent.vue +77 -20
  119. package/dist/runtime/table/components/filters/shared/FilterOptionTreeContent.vue.d.ts +3 -0
  120. package/dist/runtime/table/components/filters/shared/FilterPopoverShell.d.vue.ts +27 -0
  121. package/dist/runtime/table/components/filters/shared/FilterPopoverShell.vue +36 -0
  122. package/dist/runtime/table/components/filters/shared/FilterPopoverShell.vue.d.ts +27 -0
  123. package/dist/runtime/table/components/filters/shared/FilterSearchablePanel.d.vue.ts +3 -0
  124. package/dist/runtime/table/components/filters/shared/FilterSearchablePanel.vue +40 -10
  125. package/dist/runtime/table/components/filters/shared/FilterSearchablePanel.vue.d.ts +3 -0
  126. package/dist/runtime/table/components/filters/shared/FilterStageTransition.d.vue.ts +23 -0
  127. package/dist/runtime/table/components/filters/shared/FilterStageTransition.vue +21 -0
  128. package/dist/runtime/table/components/filters/shared/FilterStageTransition.vue.d.ts +23 -0
  129. package/dist/runtime/table/components/filters/shared/FilterTriggerTag.d.vue.ts +3 -2
  130. package/dist/runtime/table/components/filters/shared/FilterTriggerTag.vue +26 -25
  131. package/dist/runtime/table/components/filters/shared/FilterTriggerTag.vue.d.ts +3 -2
  132. package/dist/runtime/table/components/filters/tags/BooleanFilterTag.d.vue.ts +1 -1
  133. package/dist/runtime/table/components/filters/tags/BooleanFilterTag.vue +75 -22
  134. package/dist/runtime/table/components/filters/tags/BooleanFilterTag.vue.d.ts +1 -1
  135. package/dist/runtime/table/components/filters/tags/DateFilterTag.d.vue.ts +3 -1
  136. package/dist/runtime/table/components/filters/tags/DateFilterTag.vue +254 -160
  137. package/dist/runtime/table/components/filters/tags/DateFilterTag.vue.d.ts +3 -1
  138. package/dist/runtime/table/components/filters/tags/FilterTagsBar.d.vue.ts +7 -6
  139. package/dist/runtime/table/components/filters/tags/FilterTagsBar.vue +12 -27
  140. package/dist/runtime/table/components/filters/tags/FilterTagsBar.vue.d.ts +7 -6
  141. package/dist/runtime/table/components/filters/tags/NumberFilterTag.d.vue.ts +3 -2
  142. package/dist/runtime/table/components/filters/tags/NumberFilterTag.vue +192 -106
  143. package/dist/runtime/table/components/filters/tags/NumberFilterTag.vue.d.ts +3 -2
  144. package/dist/runtime/table/components/filters/tags/OptionFilterTag.d.vue.ts +3 -2
  145. package/dist/runtime/table/components/filters/tags/OptionFilterTag.vue +110 -48
  146. package/dist/runtime/table/components/filters/tags/OptionFilterTag.vue.d.ts +3 -2
  147. package/dist/runtime/table/components/filters/tags/TextFilterTag.d.vue.ts +3 -2
  148. package/dist/runtime/table/components/filters/tags/TextFilterTag.vue +120 -57
  149. package/dist/runtime/table/components/filters/tags/TextFilterTag.vue.d.ts +3 -2
  150. package/dist/runtime/table/components/grid/GridRenderer.vue +1 -1
  151. package/dist/runtime/table/components/layout/TableFooter.d.vue.ts +1 -1
  152. package/dist/runtime/table/components/layout/TableFooter.vue +1 -0
  153. package/dist/runtime/table/components/layout/TableFooter.vue.d.ts +1 -1
  154. package/dist/runtime/table/components/table/TableCellEllipsis.d.ts +1 -1
  155. package/dist/runtime/table/components/table/TableRenderer.vue +24 -12
  156. package/dist/runtime/table/composables/use-filter-tag-session.d.ts +3 -4
  157. package/dist/runtime/table/composables/use-filter-tag-session.js +12 -32
  158. package/dist/runtime/table/composables/use-query-state.d.ts +5 -5
  159. package/dist/runtime/table/composables/use-query-state.js +7 -32
  160. package/dist/runtime/table/composables/use-table-api.js +2 -2
  161. package/dist/runtime/table/composables/use-table-columns.d.ts +4 -14
  162. package/dist/runtime/table/composables/use-table-filter-presentation.d.ts +0 -3
  163. package/dist/runtime/table/composables/use-table-filter-presentation.js +0 -9
  164. package/dist/runtime/table/composables/use-table-filters.js +18 -7
  165. package/dist/runtime/table/composables/use-table-internals.d.ts +24 -63
  166. package/dist/runtime/table/composables/use-table-pagination.d.ts +2 -2
  167. package/dist/runtime/table/composables/use-table-state.d.ts +2 -2
  168. package/dist/runtime/table/types/actions.d.ts +1 -1
  169. package/dist/runtime/table/types/data-list.d.ts +41 -8
  170. package/dist/runtime/table/types/filters.d.ts +4 -0
  171. package/dist/runtime/table/utils/actions.d.ts +1 -1
  172. package/dist/runtime/table/utils/columns/menu.d.ts +2 -11
  173. package/dist/runtime/table/utils/columns/render.d.ts +2 -9
  174. package/dist/runtime/table/utils/columns/render.js +39 -30
  175. package/dist/runtime/table/utils/columns/state.d.ts +1 -1
  176. package/dist/runtime/table/utils/data-list-ui.d.ts +3 -1
  177. package/dist/runtime/table/utils/data-list-ui.js +45 -0
  178. package/dist/runtime/table/utils/filters/editor-size.d.ts +11 -0
  179. package/dist/runtime/table/utils/filters/editor-size.js +45 -0
  180. package/dist/runtime/table/utils/filters/index.d.ts +1 -1
  181. package/dist/runtime/table/utils/filters/index.js +1 -1
  182. package/dist/runtime/table/utils/query-state.d.ts +18 -1
  183. package/dist/runtime/table/utils/query-state.js +109 -0
  184. package/package.json +4 -2
  185. package/dist/runtime/table/utils/filters/operators.d.ts +0 -4
  186. package/dist/runtime/table/utils/filters/operators.js +0 -6
@@ -26,8 +26,40 @@ export interface DataListSearchUi {
26
26
  trailing?: DataListUiClass;
27
27
  trailingIcon?: DataListUiClass;
28
28
  }
29
- /** UI slots rendered by filter tags and their adjacent actions. */
30
- export interface DataListFilterTagsUi {
29
+ /** Shared UI slots rendered by a progressive filter editor popover. */
30
+ export interface DataListFilterEditorUi {
31
+ popoverContent?: DataListUiClass;
32
+ operatorContent?: DataListUiClass;
33
+ operatorItem?: DataListUiClass;
34
+ operatorLabel?: DataListUiClass;
35
+ operatorTrigger?: DataListUiClass;
36
+ editor?: DataListUiClass;
37
+ searchHeader?: DataListUiClass;
38
+ search?: DataListUiClass;
39
+ searchInput?: DataListUiClass;
40
+ scrollArea?: DataListUiClass;
41
+ scrollViewport?: DataListUiClass;
42
+ list?: DataListUiClass;
43
+ listDivider?: DataListUiClass;
44
+ option?: DataListUiClass;
45
+ optionCheckbox?: DataListUiClass;
46
+ optionExpander?: DataListUiClass;
47
+ optionSpacer?: DataListUiClass;
48
+ optionIcon?: DataListUiClass;
49
+ optionLabel?: DataListUiClass;
50
+ optionCount?: DataListUiClass;
51
+ empty?: DataListUiClass;
52
+ footer?: DataListUiClass;
53
+ clear?: DataListUiClass;
54
+ apply?: DataListUiClass;
55
+ inputs?: DataListUiClass;
56
+ presets?: DataListUiClass;
57
+ preset?: DataListUiClass;
58
+ calendar?: DataListUiClass;
59
+ slider?: DataListUiClass;
60
+ }
61
+ /** UI slots rendered by filter tags, their editors, and adjacent actions. */
62
+ export interface DataListFilterTagsUi extends DataListFilterEditorUi {
31
63
  root?: DataListUiClass;
32
64
  trigger?: DataListUiClass;
33
65
  label?: DataListUiClass;
@@ -36,14 +68,10 @@ export interface DataListFilterTagsUi {
36
68
  addTrigger?: DataListUiClass;
37
69
  clearTrigger?: DataListUiClass;
38
70
  }
39
- /** UI slots rendered by the add-filter picker. */
40
- export interface DataListAddFilterUi {
71
+ /** UI slots rendered by the progressive add-filter picker. */
72
+ export interface DataListAddFilterUi extends DataListFilterEditorUi {
41
73
  trigger?: DataListUiClass;
42
- popoverContent?: DataListUiClass;
43
74
  panel?: DataListUiClass;
44
- option?: DataListUiClass;
45
- optionIcon?: DataListUiClass;
46
- optionLabel?: DataListUiClass;
47
75
  optionTrailingIcon?: DataListUiClass;
48
76
  }
49
77
  /** UI slots rendered by the filter slideover. */
@@ -130,11 +158,15 @@ export interface DataListContentUi {
130
158
  root?: DataListUiClass;
131
159
  error?: DataListUiClass;
132
160
  errorBody?: DataListUiClass;
161
+ errorIcon?: DataListUiClass;
162
+ errorCopy?: DataListUiClass;
133
163
  errorTitle?: DataListUiClass;
164
+ errorDescription?: DataListUiClass;
134
165
  retry?: DataListUiClass;
135
166
  }
136
167
  /** UI slots rendered by the table mode. Nuxt UI table slots are forwarded unchanged. */
137
168
  export interface DataListTableUi {
169
+ wrapper?: DataListUiClass;
138
170
  root?: DataListUiClass;
139
171
  base?: DataListUiClass;
140
172
  caption?: DataListUiClass;
@@ -157,6 +189,7 @@ export interface DataListGridUi {
157
189
  canvas?: DataListUiClass;
158
190
  row?: DataListUiClass;
159
191
  item?: DataListUiClass;
192
+ flowRoot?: DataListUiClass;
160
193
  flow?: DataListUiClass;
161
194
  loading?: DataListUiClass;
162
195
  error?: DataListUiClass;
@@ -17,6 +17,10 @@ export type TableFilterPreviewMode = 'auto' | 'summary' | 'tags';
17
17
  export type TableFilterDisplayLocation = 'tag' | 'panel' | 'tag-dynamic';
18
18
  export type TableFilterDisplayLocationValue = TableFilterDisplayLocation | string;
19
19
  export interface TableFilterBehaviorCommon<TOperator extends TableFilterOperator = TableFilterOperator> {
20
+ /**
21
+ * Effective filter value when the URL has no override for this definition.
22
+ * The default stays active but is omitted from the URL; clearing the filter restores it.
23
+ */
20
24
  defaultValue?: TableQueryStateFilterValue;
21
25
  operators?: TOperator[];
22
26
  defaultOperator?: TOperator;
@@ -1,4 +1,4 @@
1
- import type { DropdownMenuItem } from '@nuxt/ui';
1
+ import type { DropdownMenuItem } from '@nuxt/ui/components/DropdownMenu.vue';
2
2
  import type { TableInjectedRowActionScope } from '../composables/use-table-row-actions.js';
3
3
  import type { GenericObject, TableRowAction, TableSchemaView } from '../types/index.js';
4
4
  type RowActionSchemaSource = {
@@ -1,3 +1,4 @@
1
+ import type { DropdownMenuItem } from '@nuxt/ui/components/DropdownMenu.vue';
1
2
  import type { TableSchemaView } from '../../types/index.js';
2
3
  export declare function createColumnMenuItems(options: {
3
4
  columnId: string;
@@ -24,17 +25,7 @@ export declare function createColumnMenuItems(options: {
24
25
  key: string;
25
26
  dir: 'asc' | 'desc';
26
27
  } | null) => void;
27
- }): ({
28
- label: string;
29
- icon: string;
30
- color: string;
31
- onSelect: () => void;
32
- } | {
33
- label: string;
34
- icon: string;
35
- onSelect: () => void;
36
- color?: undefined;
37
- })[][];
28
+ }): DropdownMenuItem[][];
38
29
  export declare function getColumnHeaderIcon(options: {
39
30
  columnId: string;
40
31
  getSortState: (options: {
@@ -1,14 +1,8 @@
1
1
  /** @jsxImportSource vue */
2
+ import type { DropdownMenuItem } from '@nuxt/ui/components/DropdownMenu.vue';
2
3
  import type { VNodeChild } from 'vue';
3
4
  import type { GenericObject } from '../../types/index.js';
4
5
  import { type SchemaTableColumn, type TableColumnRenderParams, type TableRuntimeColumn, type UseTableColumnsParams } from './types.js';
5
- type ColumnMenuItem = {
6
- label?: string;
7
- icon?: string;
8
- color?: string;
9
- class?: string;
10
- onSelect?: () => void;
11
- };
12
6
  export declare function createSelectionColumn(options: {
13
7
  params: UseTableColumnsParams;
14
8
  }): {
@@ -48,7 +42,7 @@ export declare function createDataColumns(options: {
48
42
  visibleOrderedColumns: TableRuntimeColumn[];
49
43
  getMenuItems: (options: {
50
44
  columnId: string;
51
- }) => ColumnMenuItem[][];
45
+ }) => DropdownMenuItem[][];
52
46
  getPinnedState: (options: {
53
47
  columnId: string;
54
48
  }) => 'left' | 'right' | null;
@@ -155,4 +149,3 @@ export declare function getColumnCellClass(options: {
155
149
  export declare function normalizeColumnSize(options: {
156
150
  size?: number | string;
157
151
  }): number | undefined;
158
- export {};
@@ -34,8 +34,7 @@ export function createSelectionColumn(options) {
34
34
  UCheckbox,
35
35
  {
36
36
  modelValue: options.params.selection.allSelected.value ? true : options.params.selection.partiallySelected.value ? "indeterminate" : false,
37
- color: "neutral",
38
- ui: { base: "!rounded-md", indicator: "!rounded-none" }
37
+ color: "neutral"
39
38
  }
40
39
  )
41
40
  }
@@ -59,8 +58,7 @@ export function createSelectionColumn(options) {
59
58
  UCheckbox,
60
59
  {
61
60
  modelValue: options.params.selection.isRowSelected({ rowId: String(row.id) }),
62
- color: "neutral",
63
- ui: { base: "!rounded-md", indicator: "!rounded-none" }
61
+ color: "neutral"
64
62
  }
65
63
  )
66
64
  }
@@ -114,36 +112,46 @@ export function createDataColumns(options) {
114
112
  /* @__PURE__ */ jsx(
115
113
  UDropdownMenu,
116
114
  {
115
+ size: "sm",
117
116
  items: options.getMenuItems({ columnId: runtimeColumn.id }),
118
117
  content: { align: "start", side: "bottom", sideOffset: 10 },
119
118
  modal: false,
120
119
  ui: { content: "w-fit p-1 shadow-none" },
121
- children: /* @__PURE__ */ jsxs(
122
- "button",
123
- {
124
- type: "button",
125
- class: "inline-flex h-8 min-w-0 max-w-full items-center gap-2 rounded-md px-2.5 text-left text-sm text-default transition-colors hover:bg-elevated",
126
- children: [
127
- /* @__PURE__ */ jsxs("div", { class: "flex min-w-0 items-center gap-2.5", children: [
128
- runtimeColumn.icon ? /* @__PURE__ */ jsx(UIcon, { name: runtimeColumn.icon, class: "size-4 shrink-0 text-muted" }) : null,
129
- /* @__PURE__ */ jsx(TableCellEllipsis, { title: runtimeColumn.label, wrapperClass: "min-w-0 max-w-full", children: runtimeColumn.label })
130
- ] }),
131
- /* @__PURE__ */ jsx(
132
- UIcon,
133
- {
134
- name: getColumnHeaderIcon({
135
- columnId: runtimeColumn.id,
136
- canHide: tableColumn.getCanHide?.(),
137
- getSortState: options.getSortState,
138
- getPinnedState: options.getPinnedState
139
- }),
140
- class: "size-4 shrink-0 text-muted"
141
- }
142
- ),
143
- options.getPinnedState({ columnId: runtimeColumn.id }) ? /* @__PURE__ */ jsx(UIcon, { name: "i-lucide-pin", class: "size-3.5 shrink-0 text-muted" }) : null
144
- ]
145
- }
146
- )
120
+ "v-slots": {
121
+ default: () => /* @__PURE__ */ jsxs(
122
+ "button",
123
+ {
124
+ type: "button",
125
+ class: "inline-flex h-8 min-w-0 max-w-full items-center gap-2 rounded-md px-2.5 text-left text-sm text-default transition-colors hover:bg-elevated",
126
+ children: [
127
+ /* @__PURE__ */ jsxs("div", { class: "flex min-w-0 items-center gap-2.5", children: [
128
+ runtimeColumn.icon ? /* @__PURE__ */ jsx(UIcon, { name: runtimeColumn.icon, class: "size-4 shrink-0 text-muted" }) : null,
129
+ /* @__PURE__ */ jsx(
130
+ TableCellEllipsis,
131
+ {
132
+ title: runtimeColumn.label,
133
+ wrapperClass: "min-w-0 max-w-full",
134
+ children: runtimeColumn.label
135
+ }
136
+ )
137
+ ] }),
138
+ /* @__PURE__ */ jsx(
139
+ UIcon,
140
+ {
141
+ name: getColumnHeaderIcon({
142
+ columnId: runtimeColumn.id,
143
+ canHide: tableColumn.getCanHide?.(),
144
+ getSortState: options.getSortState,
145
+ getPinnedState: options.getPinnedState
146
+ }),
147
+ class: "size-4 shrink-0 text-muted"
148
+ }
149
+ ),
150
+ options.getPinnedState({ columnId: runtimeColumn.id }) ? /* @__PURE__ */ jsx(UIcon, { name: "i-lucide-pin", class: "size-3.5 shrink-0 text-muted" }) : null
151
+ ]
152
+ }
153
+ )
154
+ }
147
155
  }
148
156
  ),
149
157
  column.resizable !== false ? /* @__PURE__ */ jsx(
@@ -324,6 +332,7 @@ function createRowActionsColumn(options) {
324
332
  return /* @__PURE__ */ jsx(TableRowScopeProvider, { scope, children: /* @__PURE__ */ jsx("div", { class: "flex justify-end", children: /* @__PURE__ */ jsx(
325
333
  RowActions,
326
334
  {
335
+ size: "sm",
327
336
  content: { align: "end", side: "bottom", sideOffset: 8 },
328
337
  modal: false,
329
338
  portal: true,
@@ -186,4 +186,4 @@ export declare function createResetColumnState(options: {
186
186
  export declare function getPinnedState(options: {
187
187
  currentState: TableColumnState;
188
188
  columnId: string;
189
- }): "right" | "left" | null;
189
+ }): "left" | "right" | null;
@@ -1,3 +1,5 @@
1
- import type { DataListUiClass } from '../types/index.js';
1
+ import type { DataListDensity, DataListUiClass, DataListUiConfig } from '../types/index.js';
2
2
  /** Merges DataList slot classes with the same conflict resolution used by Nuxt UI. */
3
3
  export declare function mergeDataListUiClass(defaults?: DataListUiClass, root?: DataListUiClass, local?: DataListUiClass): string;
4
+ /** Merges application and root DataList defaults without losing nested UI slots. */
5
+ export declare function mergeDataListUiConfig(appUi: DataListUiConfig | undefined, componentUi: DataListUiConfig | undefined, density: DataListDensity | undefined): DataListUiConfig;
@@ -2,3 +2,48 @@ import { twMerge } from "tailwind-merge";
2
2
  export function mergeDataListUiClass(defaults, root, local) {
3
3
  return twMerge(defaults, root, local);
4
4
  }
5
+ export function mergeDataListUiConfig(appUi, componentUi, density) {
6
+ return {
7
+ ...appUi,
8
+ ...componentUi,
9
+ density: density ?? componentUi?.density ?? appUi?.density,
10
+ control: { ...appUi?.control, ...componentUi?.control },
11
+ default: mergeUiConfig(appUi?.default, componentUi?.default),
12
+ search: mergeSearchConfig(appUi?.search, componentUi?.search),
13
+ filterTags: mergePartConfig(appUi?.filterTags, componentUi?.filterTags),
14
+ addFilter: mergePartConfig(appUi?.addFilter, componentUi?.addFilter),
15
+ filterPanel: mergePartConfig(appUi?.filterPanel, componentUi?.filterPanel),
16
+ clearFilters: mergePartConfig(appUi?.clearFilters, componentUi?.clearFilters),
17
+ resultCount: mergeUiConfig(appUi?.resultCount, componentUi?.resultCount),
18
+ columnPanel: mergePartConfig(appUi?.columnPanel, componentUi?.columnPanel),
19
+ sortMenu: mergePartConfig(appUi?.sortMenu, componentUi?.sortMenu),
20
+ layoutSwitch: mergePartConfig(appUi?.layoutSwitch, componentUi?.layoutSwitch),
21
+ refresh: mergePartConfig(appUi?.refresh, componentUi?.refresh),
22
+ content: mergeUiConfig(appUi?.content, componentUi?.content),
23
+ table: mergeUiConfig(appUi?.table, componentUi?.table),
24
+ grid: mergeUiConfig(appUi?.grid, componentUi?.grid),
25
+ pagination: mergePartConfig(appUi?.pagination, componentUi?.pagination),
26
+ infiniteLoader: mergePartConfig(appUi?.infiniteLoader, componentUi?.infiniteLoader)
27
+ };
28
+ }
29
+ function mergeUiConfig(appDefaults, componentConfig) {
30
+ return {
31
+ ...appDefaults,
32
+ ...componentConfig,
33
+ ui: { ...appDefaults?.ui, ...componentConfig?.ui }
34
+ };
35
+ }
36
+ function mergePartConfig(appDefaults, componentConfig) {
37
+ return {
38
+ ...appDefaults,
39
+ ...componentConfig,
40
+ ui: { ...appDefaults?.ui, ...componentConfig?.ui }
41
+ };
42
+ }
43
+ function mergeSearchConfig(appDefaults, componentConfig) {
44
+ return {
45
+ ...appDefaults,
46
+ ...componentConfig,
47
+ ui: { ...appDefaults?.ui, ...componentConfig?.ui }
48
+ };
49
+ }
@@ -0,0 +1,11 @@
1
+ import type { DataListControlSize } from '../../types/index.js';
2
+ export declare function resolveFilterEditorSizeClasses(size: DataListControlSize | undefined): {
3
+ editor: string;
4
+ searchHeader: string;
5
+ scrollArea: string;
6
+ option: string;
7
+ optionIcon: string;
8
+ optionLabel: string;
9
+ footer: string;
10
+ empty: string;
11
+ };
@@ -0,0 +1,45 @@
1
+ const filterEditorSizeClasses = {
2
+ xs: {
3
+ editor: "w-[min(13rem,calc(100vw-1rem))] min-w-44 max-w-52",
4
+ searchHeader: "p-1",
5
+ scrollArea: "p-1",
6
+ option: "gap-1.5 px-1.5 py-1 text-xs",
7
+ optionIcon: "size-3.5",
8
+ optionLabel: "text-xs",
9
+ footer: "p-1",
10
+ empty: "px-2 py-4 text-xs"
11
+ },
12
+ sm: {
13
+ editor: "w-[min(15rem,calc(100vw-1rem))] min-w-48 max-w-60",
14
+ searchHeader: "p-1.5",
15
+ scrollArea: "p-1",
16
+ option: "gap-2 px-2 py-1.5 text-xs",
17
+ optionIcon: "size-3.5",
18
+ optionLabel: "text-xs",
19
+ footer: "p-1.5",
20
+ empty: "px-2.5 py-5 text-xs"
21
+ },
22
+ md: {
23
+ editor: "w-[min(17rem,calc(100vw-1rem))] min-w-52 max-w-68",
24
+ searchHeader: "p-2",
25
+ scrollArea: "p-2",
26
+ option: "gap-3 px-3 py-2 text-sm",
27
+ optionIcon: "size-4",
28
+ optionLabel: "text-sm",
29
+ footer: "p-2",
30
+ empty: "px-3 py-8 text-sm"
31
+ },
32
+ lg: {
33
+ editor: "w-[min(19rem,calc(100vw-1rem))] min-w-56 max-w-76",
34
+ searchHeader: "p-2.5",
35
+ scrollArea: "p-2.5",
36
+ option: "gap-3 px-3.5 py-2.5 text-sm",
37
+ optionIcon: "size-4.5",
38
+ optionLabel: "text-sm",
39
+ footer: "p-2.5",
40
+ empty: "px-3.5 py-9 text-sm"
41
+ }
42
+ };
43
+ export function resolveFilterEditorSizeClasses(size) {
44
+ return filterEditorSizeClasses[size ?? "md"];
45
+ }
@@ -1,6 +1,6 @@
1
1
  export * from './common.js';
2
2
  export * from './date.js';
3
- export * from './operators.js';
3
+ export * from './editor-size.js';
4
4
  export * from './options.js';
5
5
  export * from './presentation.js';
6
6
  export * from './preview.js';
@@ -1,6 +1,6 @@
1
1
  export * from "./common.js";
2
2
  export * from "./date.js";
3
- export * from "./operators.js";
3
+ export * from "./editor-size.js";
4
4
  export * from "./options.js";
5
5
  export * from "./presentation.js";
6
6
  export * from "./preview/index.js";
@@ -1,5 +1,5 @@
1
1
  import type { QueryCodec } from '#ui-tools/query-state';
2
- import type { TableFilterOperator, TableLayout, TableUiFilterDefinition, TableQueryStateFilterDefinition, TableQueryStateFilterValue, TableSchemaView, TableSortingDirection, TablePaginationState, TablePaginationSchema } from '../types/index.js';
2
+ import type { TableFilterOperator, TableLayout, TableQueryStateFilterRule, TableUiFilterDefinition, TableQueryStateFilterDefinition, TableQueryStateFilterValue, TableSchemaView, TableSortingDirection, TablePaginationState, TablePaginationSchema } from '../types/index.js';
3
3
  export declare function getPaginationMode(schema: {
4
4
  pagination?: TablePaginationSchema;
5
5
  }): TablePaginationState['mode'];
@@ -27,3 +27,20 @@ export declare function createTableFilterValueCodec(definition: TableQueryStateF
27
27
  export declare function resolveFilterDefaultOperator(definition: TableQueryStateFilterDefinition): TableFilterOperator;
28
28
  export declare function resolveFilterSupportedOperators(definition: TableQueryStateFilterDefinition): TableFilterOperator[];
29
29
  export declare function normalizeFilterDefinition(definition: TableQueryStateFilterDefinition | TableUiFilterDefinition): TableQueryStateFilterDefinition;
30
+ export declare function resolveTableFilterDefaultRules(definitions: TableUiFilterDefinition[]): TableQueryStateFilterRule[];
31
+ export declare function mergeTableFilterDefaultRules(options: {
32
+ rules: TableQueryStateFilterRule[];
33
+ definitions: TableUiFilterDefinition[];
34
+ }): TableQueryStateFilterRule[];
35
+ export declare function isTableFilterRuleDefault(options: {
36
+ rule: TableQueryStateFilterRule;
37
+ definition: TableUiFilterDefinition;
38
+ }): boolean;
39
+ export declare function parseTableFilterQueryState(options: {
40
+ entries: ReadonlyMap<string, unknown>;
41
+ definitions: TableUiFilterDefinition[];
42
+ }): TableQueryStateFilterRule[];
43
+ export declare function serializeTableFilterQueryState(options: {
44
+ rules: TableQueryStateFilterRule[];
45
+ definitions: TableUiFilterDefinition[];
46
+ }): Map<string, unknown>;
@@ -160,12 +160,121 @@ export function normalizeFilterDefinition(definition) {
160
160
  defaultValue
161
161
  };
162
162
  }
163
+ export function resolveTableFilterDefaultRules(definitions) {
164
+ return definitions.flatMap((definition) => {
165
+ const normalizedDefinition = normalizeFilterDefinition(definition);
166
+ const value = normalizedDefinition.defaultValue;
167
+ if (value === void 0 || !hasFilterValue(value)) {
168
+ return [];
169
+ }
170
+ return [
171
+ {
172
+ key: normalizedDefinition.key,
173
+ operator: resolveFilterDefaultOperator(normalizedDefinition),
174
+ value
175
+ }
176
+ ];
177
+ });
178
+ }
179
+ export function mergeTableFilterDefaultRules(options) {
180
+ const defaults = new Map(
181
+ resolveTableFilterDefaultRules(options.definitions).map((rule) => [rule.key, rule])
182
+ );
183
+ const definitionKeys = new Set(options.definitions.map((definition) => definition.key));
184
+ const merged = options.definitions.flatMap((definition) => {
185
+ const rule = options.rules.find((candidate) => candidate.key === definition.key);
186
+ const defaultRule = defaults.get(definition.key);
187
+ return rule ? [rule] : defaultRule ? [defaultRule] : [];
188
+ });
189
+ return [...merged, ...options.rules.filter((rule) => !definitionKeys.has(rule.key))];
190
+ }
191
+ export function isTableFilterRuleDefault(options) {
192
+ const normalizedDefinition = normalizeFilterDefinition(options.definition);
193
+ const defaultValue = normalizedDefinition.defaultValue;
194
+ return defaultValue !== void 0 && (options.rule.operator ?? resolveFilterDefaultOperator(normalizedDefinition)) === resolveFilterDefaultOperator(normalizedDefinition) && areFilterValuesEqual(options.rule.value, defaultValue);
195
+ }
196
+ export function parseTableFilterQueryState(options) {
197
+ const rules = [];
198
+ for (const filter of options.definitions) {
199
+ const definition = normalizeFilterDefinition(filter);
200
+ const operators = resolveFilterSupportedOperators(definition);
201
+ const defaultOperator = resolveFilterDefaultOperator(definition);
202
+ for (const operator of operators) {
203
+ const urlKey = operator === defaultOperator ? definition.key : `${definition.key}~${operator}`;
204
+ const value = options.entries.get(urlKey);
205
+ if (isTableFilterValue(value)) {
206
+ rules.push({ key: definition.key, operator, value });
207
+ break;
208
+ }
209
+ }
210
+ }
211
+ return mergeTableFilterDefaultRules({ rules, definitions: options.definitions });
212
+ }
213
+ export function serializeTableFilterQueryState(options) {
214
+ const result = /* @__PURE__ */ new Map();
215
+ for (const rule of options.rules) {
216
+ const filter = options.definitions.find((definition2) => definition2.key === rule.key);
217
+ if (!filter || isTableFilterRuleDefault({ rule, definition: filter })) continue;
218
+ const definition = normalizeFilterDefinition(filter);
219
+ const operator = rule.operator ?? resolveFilterDefaultOperator(definition);
220
+ const defaultOperator = resolveFilterDefaultOperator(definition);
221
+ const urlKey = operator === defaultOperator ? definition.key : `${definition.key}~${operator}`;
222
+ result.set(urlKey, rule.value);
223
+ }
224
+ return result;
225
+ }
163
226
  function isRange(value) {
164
227
  if (!value || typeof value !== "object") {
165
228
  return false;
166
229
  }
167
230
  return "from" in value || "to" in value;
168
231
  }
232
+ function hasFilterValue(value) {
233
+ if (Array.isArray(value)) return value.length > 0;
234
+ if (typeof value === "string") return value.length > 0;
235
+ if (isRange(value)) return value.from != null || value.to != null;
236
+ return true;
237
+ }
238
+ function isTableFilterValue(value) {
239
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean" || value instanceof Date) {
240
+ return true;
241
+ }
242
+ if (Array.isArray(value)) {
243
+ return value.every(
244
+ (item) => typeof item === "string" || typeof item === "number" || typeof item === "boolean"
245
+ );
246
+ }
247
+ if (!isRange(value)) return false;
248
+ return [value.from, value.to].every(
249
+ (item) => item == null || typeof item === "number" || item instanceof Date
250
+ );
251
+ }
252
+ function areFilterValuesEqual(left, right) {
253
+ if (Array.isArray(left) || Array.isArray(right)) {
254
+ if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) return false;
255
+ const unmatched = [...right];
256
+ for (const value of left) {
257
+ const index = unmatched.findIndex((candidate) => Object.is(candidate, value));
258
+ if (index === -1) return false;
259
+ unmatched.splice(index, 1);
260
+ }
261
+ return true;
262
+ }
263
+ if (left instanceof Date || right instanceof Date) {
264
+ return left instanceof Date && right instanceof Date && left.getTime() === right.getTime();
265
+ }
266
+ if (isRange(left) || isRange(right)) {
267
+ if (!isRange(left) || !isRange(right)) return false;
268
+ return areOptionalFilterValuesEqual(left.from, right.from) && areOptionalFilterValuesEqual(left.to, right.to);
269
+ }
270
+ return Object.is(left, right);
271
+ }
272
+ function areOptionalFilterValuesEqual(left, right) {
273
+ if (left instanceof Date || right instanceof Date) {
274
+ return left instanceof Date && right instanceof Date && left.getTime() === right.getTime();
275
+ }
276
+ return Object.is(left, right);
277
+ }
169
278
  function isMinMaxNumberRange(value) {
170
279
  if (!value || typeof value !== "object" || Array.isArray(value)) {
171
280
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuxt-ui-tools",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Nuxt module and runtime toolkit for UI-heavy Nuxt applications",
5
5
  "homepage": "https://github.com/ChronicStone/nuxt-ui-tools#readme",
6
6
  "bugs": "https://github.com/ChronicStone/nuxt-ui-tools/issues",
@@ -130,10 +130,10 @@
130
130
  "dependencies": {
131
131
  "@internationalized/date": "^3.12.0",
132
132
  "@nuxt/kit": "^4.4.2",
133
- "@nuxt/ui": "^4.5.1",
134
133
  "@tanstack/pacer": "0.19.0",
135
134
  "@tanstack/vue-virtual": "3.13.23",
136
135
  "@vueuse/core": "14.2.1",
136
+ "cookiejs": "2.1.3",
137
137
  "libphonenumber-js": "1.13.1",
138
138
  "motion-v": "2.0.1",
139
139
  "nuxt-viewport": "2.4.0",
@@ -142,6 +142,7 @@
142
142
  "devDependencies": {
143
143
  "@nuxt/module-builder": "^1.0.2",
144
144
  "@nuxt/schema": "^4.4.2",
145
+ "@nuxt/ui": "^4.5.1",
145
146
  "@types/node": "25.4.0",
146
147
  "changelogen": "^0.6.2",
147
148
  "nuxt": "^4.4.2",
@@ -153,6 +154,7 @@
153
154
  "xlsx": "0.18.5"
154
155
  },
155
156
  "peerDependencies": {
157
+ "@nuxt/ui": ">=4.5.1",
156
158
  "@tanstack/vue-query": ">=5.0.0",
157
159
  "nuxt": ">=4.4.0",
158
160
  "tailwindcss": ">=4.0.0",
@@ -1,4 +0,0 @@
1
- import type { TableFilterOperator } from '../../types/index.js';
2
- export declare function getFilterOperatorLabel(options: {
3
- operator?: TableFilterOperator;
4
- }): string;
@@ -1,6 +0,0 @@
1
- import { useUiToolsLocale } from "#ui-tools/i18n";
2
- export function getFilterOperatorLabel(options) {
3
- const { t } = useUiToolsLocale();
4
- const operator = options.operator ?? "is";
5
- return t(`table.filters.operators.${operator}`);
6
- }