@xleddyl/443-components-vue 0.8.1 → 0.8.3

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 (164) hide show
  1. package/README.md +52 -4
  2. package/dist/chart/BarChart.vue +33 -22
  3. package/dist/chart/BarChart.vue.d.ts +4 -0
  4. package/dist/chart/chart.css +2 -2
  5. package/dist/chart/useChartColors.mjs +8 -8
  6. package/dist/components/core/Button.vue.d.ts +1 -1
  7. package/dist/components/core/FormField.vue +5 -0
  8. package/dist/components/core/FormField.vue.d.ts +4 -0
  9. package/dist/components/core/Input.vue +59 -5
  10. package/dist/components/core/Input.vue.d.ts +9 -5
  11. package/dist/components/core/Textarea.vue +28 -3
  12. package/dist/components/core/Textarea.vue.d.ts +7 -5
  13. package/dist/components/core/types.d.ts +1 -1
  14. package/dist/components/data/Badge.vue.d.ts +1 -1
  15. package/dist/components/data/DescriptionList.vue.d.ts +1 -1
  16. package/dist/components/data/FilterPills.vue +43 -4
  17. package/dist/components/data/FilterPills.vue.d.ts +4 -1
  18. package/dist/components/data/Pagination.vue +63 -2
  19. package/dist/components/data/Pagination.vue.d.ts +12 -0
  20. package/dist/components/data/Tag.vue.d.ts +1 -1
  21. package/dist/components/data/Tree.vue.d.ts +1 -1
  22. package/dist/components/data/types.d.ts +1 -0
  23. package/dist/components/feedback/Meter.vue.d.ts +1 -1
  24. package/dist/components/feedback/Progress.vue.d.ts +1 -1
  25. package/dist/components/feedback/ProgressRing.vue.d.ts +1 -1
  26. package/dist/components/forms/Calendar.vue +31 -7
  27. package/dist/components/forms/Calendar.vue.d.ts +13 -2
  28. package/dist/components/forms/CheckboxGroup.vue +7 -1
  29. package/dist/components/forms/CheckboxGroup.vue.d.ts +1 -0
  30. package/dist/components/forms/ColorInput.vue.d.ts +5 -5
  31. package/dist/components/forms/Combobox.vue +4 -3
  32. package/dist/components/forms/Combobox.vue.d.ts +1 -0
  33. package/dist/components/forms/DateInput.vue.d.ts +10 -6
  34. package/dist/components/forms/DatePicker.vue.d.ts +1 -1
  35. package/dist/components/forms/FileInput.vue.d.ts +1 -1
  36. package/dist/components/forms/NumberInput.vue.d.ts +5 -5
  37. package/dist/components/forms/PasswordInput.vue.d.ts +9 -5
  38. package/dist/components/forms/PinInput.vue.d.ts +5 -5
  39. package/dist/components/forms/Select.vue +21 -2
  40. package/dist/components/forms/Select.vue.d.ts +4 -4
  41. package/dist/components/forms/Slider.vue.d.ts +5 -5
  42. package/dist/components/forms/Switch.vue.d.ts +1 -1
  43. package/dist/components/forms/TimeInput.vue.d.ts +9 -5
  44. package/dist/components/layout/AppShell.vue +4 -2
  45. package/dist/components/layout/AppShell.vue.d.ts +2 -0
  46. package/dist/components/layout/Card.vue.d.ts +1 -1
  47. package/dist/components/layout/CopyButton.vue.d.ts +1 -1
  48. package/dist/components/layout/PageHeader.vue +15 -3
  49. package/dist/components/layout/PageHeader.vue.d.ts +5 -0
  50. package/dist/components/layout/Separator.vue +17 -4
  51. package/dist/components/layout/Separator.vue.d.ts +7 -1
  52. package/dist/components/layout/Tabs.vue +10 -0
  53. package/dist/components/layout/types.d.ts +3 -0
  54. package/dist/components/overlays/ConfirmDialog.vue.d.ts +8 -4
  55. package/dist/components/overlays/ConfirmHost.vue.d.ts +8 -4
  56. package/dist/components/overlays/ContextMenu.vue.d.ts +4 -2
  57. package/dist/components/overlays/DropdownMenu.vue +5 -1
  58. package/dist/components/overlays/DropdownMenu.vue.d.ts +8 -2
  59. package/dist/components/overlays/Modal.vue +9 -2
  60. package/dist/components/overlays/Modal.vue.d.ts +4 -0
  61. package/dist/components/overlays/types.d.ts +2 -2
  62. package/dist/components/templates/DashboardLayout.vue +2 -0
  63. package/dist/components/templates/DashboardLayout.vue.d.ts +2 -0
  64. package/dist/components/templates/SettingsModal.vue.d.ts +8 -4
  65. package/dist/components/templates/types.d.ts +1 -0
  66. package/dist/composables/useForm.d.ts +24 -2
  67. package/dist/composables/useForm.mjs +51 -8
  68. package/dist/composables/useOverlay.d.ts +1 -1
  69. package/dist/editor/RichTextEditor.vue +108 -10
  70. package/dist/editor/RichTextEditor.vue.d.ts +5 -2
  71. package/dist/editor/rich-text-editor.css +31 -4
  72. package/dist/editor/types.d.ts +2 -1
  73. package/dist/grid/DataGrid.vue +106 -24
  74. package/dist/grid/DataGrid.vue.d.ts +14 -2
  75. package/dist/grid/cells/DateCell.vue +18 -3
  76. package/dist/grid/cells/ImageCell.vue +6 -1
  77. package/dist/grid/data-grid.css +17 -3
  78. package/dist/grid/index.d.ts +2 -1
  79. package/dist/grid/index.mjs +6 -1
  80. package/dist/grid/modules.d.ts +2 -0
  81. package/dist/grid/modules.mjs +32 -0
  82. package/dist/grid/theme.mjs +5 -5
  83. package/dist/grid/types.d.ts +4 -0
  84. package/dist/icons/builtin.d.ts +3 -0
  85. package/dist/icons/builtin.mjs +3 -0
  86. package/dist/index.d.ts +1 -1
  87. package/dist/index.mjs +1 -0
  88. package/dist/internal/core/intl.d.ts +2 -0
  89. package/dist/internal/core/intl.mjs +17 -0
  90. package/dist/internal/forms/counter.d.ts +18 -0
  91. package/dist/internal/forms/counter.mjs +31 -0
  92. package/dist/internal/keys.d.ts +2 -1
  93. package/dist/internal/keys.mjs +1 -0
  94. package/dist/internal/overlays/MenuList.vue +4 -2
  95. package/dist/internal/overlays/MenuList.vue.d.ts +2 -0
  96. package/dist/internal/overlays/OverlayView.vue.d.ts +8 -4
  97. package/dist/locale/de.mjs +21 -3
  98. package/dist/locale/en.mjs +21 -3
  99. package/dist/locale/it.mjs +21 -3
  100. package/dist/locale/types.d.ts +18 -0
  101. package/dist/nuxt/runtime/layouts/dashboard.vue +1 -0
  102. package/dist/styles/base.css +2 -1
  103. package/dist/styles/core/button.css +42 -16
  104. package/dist/styles/core/form-field.css +7 -1
  105. package/dist/styles/core/input.css +31 -2
  106. package/dist/styles/core/kbd.css +1 -1
  107. package/dist/styles/core/textarea.css +10 -0
  108. package/dist/styles/data/avatar.css +1 -1
  109. package/dist/styles/data/badge.css +39 -23
  110. package/dist/styles/data/description-list.css +2 -2
  111. package/dist/styles/data/filter-pills.css +24 -3
  112. package/dist/styles/data/pagination.css +26 -3
  113. package/dist/styles/data/selection-bar.css +1 -1
  114. package/dist/styles/data/stat.css +4 -4
  115. package/dist/styles/data/table.css +4 -4
  116. package/dist/styles/data/tag.css +1 -1
  117. package/dist/styles/data/timeline.css +1 -1
  118. package/dist/styles/data/tree.css +2 -2
  119. package/dist/styles/feedback/empty-state.css +1 -1
  120. package/dist/styles/feedback/loading-host.css +1 -1
  121. package/dist/styles/feedback/loading-overlay.css +1 -1
  122. package/dist/styles/feedback/meter.css +1 -1
  123. package/dist/styles/feedback/progress.css +2 -2
  124. package/dist/styles/forced-colors.css +6 -1
  125. package/dist/styles/forms/calendar.css +30 -3
  126. package/dist/styles/forms/checkbox.css +1 -1
  127. package/dist/styles/forms/choice.css +7 -1
  128. package/dist/styles/forms/combobox.css +2 -2
  129. package/dist/styles/forms/file-input.css +1 -1
  130. package/dist/styles/forms/password-input.css +1 -1
  131. package/dist/styles/forms/pin-input.css +1 -1
  132. package/dist/styles/forms/radio.css +1 -1
  133. package/dist/styles/forms/segmented.css +2 -2
  134. package/dist/styles/forms/select.css +2 -2
  135. package/dist/styles/forms/slider.css +1 -1
  136. package/dist/styles/forms/switch.css +4 -4
  137. package/dist/styles/layout/accordion.css +2 -2
  138. package/dist/styles/layout/app-shell.css +18 -6
  139. package/dist/styles/layout/breadcrumbs.css +3 -3
  140. package/dist/styles/layout/card.css +1 -1
  141. package/dist/styles/layout/nav-link.css +1 -1
  142. package/dist/styles/layout/page-header.css +21 -1
  143. package/dist/styles/layout/separator.css +21 -1
  144. package/dist/styles/layout/sidebar.css +1 -1
  145. package/dist/styles/layout/tabs.css +30 -1
  146. package/dist/styles/layout/theme-switch.css +1 -1
  147. package/dist/styles/overlays/command.css +3 -3
  148. package/dist/styles/overlays/drawer.css +4 -3
  149. package/dist/styles/overlays/floating.css +2 -2
  150. package/dist/styles/overlays/menu.css +5 -1
  151. package/dist/styles/overlays/modal.css +12 -9
  152. package/dist/styles/overlays/toast.css +3 -3
  153. package/dist/styles/overlays/tooltip.css +26 -8
  154. package/dist/styles/shared.css +2 -2
  155. package/dist/styles/templates/account-menu.css +1 -1
  156. package/dist/styles/templates/auth-layout.css +4 -4
  157. package/dist/styles/templates/brand.css +2 -2
  158. package/dist/styles/templates/dashboard-page.css +1 -1
  159. package/dist/styles/templates/empty-page.css +3 -3
  160. package/dist/styles/templates/error-page.css +1 -1
  161. package/dist/styles/templates/save-bar.css +1 -1
  162. package/dist/styles/templates/settings-modal.css +6 -6
  163. package/dist/styles/utilities.css +3 -3
  164. package/package.json +1 -1
@@ -406,8 +406,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
406
406
  ref_for?: boolean | undefined | undefined;
407
407
  ref_key?: string | undefined | undefined;
408
408
  }> & Readonly<{}>, {
409
- tone: Tone;
410
409
  size: BadgeSize;
410
+ tone: Tone;
411
411
  variant: BadgeVariant;
412
412
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
413
413
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -410,8 +410,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
410
410
  ref_key?: string | undefined | undefined;
411
411
  }> & Readonly<{}>, {
412
412
  columns: number;
413
- items: DescriptionItem[];
414
413
  layout: DescriptionLayout;
414
+ items: DescriptionItem[];
415
415
  divided: boolean;
416
416
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
417
417
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -34,6 +34,7 @@
34
34
  <script setup>
35
35
  import { computed, h, nextTick, ref, useTemplateRef, watch } from "vue";
36
36
  import { useLocale } from "../../composables/useLocale";
37
+ import { translateOr } from "../../locale";
37
38
  import { hasFocusWithin } from "../../internal/core/focus";
38
39
  import Button from "../core/Button.vue";
39
40
  import DropdownMenu from "../overlays/DropdownMenu.vue";
@@ -46,10 +47,12 @@ const props = defineProps({
46
47
  size: { type: String, required: false, default: "md" },
47
48
  clearable: { type: Boolean, required: false },
48
49
  clearLabel: { type: String, required: false },
50
+ removeLabel: { type: String, required: false },
49
51
  disabled: { type: Boolean, required: false },
50
52
  required: { type: null, required: false }
51
53
  });
52
- const { t } = useLocale();
54
+ const emit = defineEmits(["select", "remove"]);
55
+ const { t, locale } = useLocale();
53
56
  const groupLabel = computed(() => props.label ?? t("filterPills.label"));
54
57
  const clearText = computed(() => props.clearLabel ?? t("common.clear"));
55
58
  const slots = defineSlots();
@@ -82,10 +85,10 @@ function toggle(value) {
82
85
  setModel(active ? null : value);
83
86
  }
84
87
  const root = useTemplateRef("root");
85
- async function clear() {
88
+ async function keepFocus(change) {
86
89
  const group = root.value;
87
90
  const hadFocus = hasFocusWithin(group);
88
- setModel(props.multiple ? [] : null);
91
+ change();
89
92
  if (!hadFocus || !group) return;
90
93
  await nextTick();
91
94
  if (hasFocusWithin(group)) return;
@@ -98,6 +101,35 @@ async function clear() {
98
101
  group.focus({ preventScroll: true });
99
102
  }
100
103
  }
104
+ function clear() {
105
+ return keepFocus(() => setModel(props.multiple ? [] : null));
106
+ }
107
+ function remove(value) {
108
+ return keepFocus(() => {
109
+ const rest = activeValues.value.filter((item) => item !== value);
110
+ if (isActive(value) && !(props.required && rest.length === 0))
111
+ setModel(props.multiple ? rest : null);
112
+ emit("remove", value);
113
+ });
114
+ }
115
+ function removable(pill, option, disabled) {
116
+ return h("span", { class: "k-filter-pill-group" }, [
117
+ pill,
118
+ h(Button, {
119
+ class: "k-filter-pill-remove",
120
+ variant: "ghost",
121
+ tone: "neutral",
122
+ size: "xs",
123
+ icon: "x-mark",
124
+ square: true,
125
+ disabled,
126
+ "aria-label": translateOr(locale.value, props.removeLabel, "filterPills.remove", {
127
+ label: option.valueLabel ? `${option.label} ${option.valueLabel}` : option.label
128
+ }),
129
+ onClick: () => remove(option.value)
130
+ })
131
+ ]);
132
+ }
101
133
  function setPanel(value, open) {
102
134
  if (open) openPanel.value = value;
103
135
  else if (openPanel.value === value) openPanel.value = null;
@@ -113,7 +145,12 @@ function renderPill(value) {
113
145
  size: props.size,
114
146
  disabled: Boolean(props.disabled || option.disabled)
115
147
  };
116
- const active = option.active ?? isActive(value);
148
+ const active = option.active ?? (option.removable ? true : isActive(value));
149
+ const pill = renderTrigger(option, base, active);
150
+ return option.removable ? removable(pill, option, base.disabled) : pill;
151
+ }
152
+ function renderTrigger(option, base, active) {
153
+ const value = option.value;
117
154
  if (option.menu)
118
155
  return h(
119
156
  DropdownMenu,
@@ -140,6 +177,8 @@ function renderPill(value) {
140
177
  }
141
178
  );
142
179
  }
180
+ if (option.removable)
181
+ return h(FilterPill, { ...base, active, onClick: () => emit("select", value) });
143
182
  return h(FilterPill, { ...base, pressed: isActive(value), onClick: () => toggle(value) });
144
183
  }
145
184
  const defaultPills = /* @__PURE__ */ new Map();
@@ -8,11 +8,14 @@ declare const __VLS_export: <T extends FilterPillValue, M extends boolean = fals
8
8
  size?: "sm" | "md";
9
9
  clearable?: boolean;
10
10
  clearLabel?: string;
11
+ removeLabel?: string;
11
12
  disabled?: boolean;
12
13
  required?: R;
13
14
  } & {
14
15
  modelValue?: M extends true ? T[] : R extends true ? T : T | null;
15
16
  }) & {
17
+ onRemove?: ((value: T) => any) | undefined;
18
+ onSelect?: ((value: T) => any) | undefined;
16
19
  "onUpdate:modelValue"?: ((value: M extends true ? T[] : R extends true ? T : T | null) => any) | undefined;
17
20
  } & Partial<import("vue").HTMLAttributes & import("vue").ReservedProps>> & (typeof globalThis extends {
18
21
  __VLS_PROPS_FALLBACK: infer P;
@@ -36,7 +39,7 @@ declare const __VLS_export: <T extends FilterPillValue, M extends boolean = fals
36
39
  close: () => void;
37
40
  }) => unknown) | undefined;
38
41
  };
39
- emit: (event: "update:modelValue", value: M extends true ? T[] : R extends true ? T : T | null) => void;
42
+ emit: (((evt: "remove", value: T) => void) & ((evt: "select", value: T) => void)) & ((event: "update:modelValue", value: M extends true ? T[] : R extends true ? T : T | null) => void);
40
43
  }>) => import("vue").VNode & {
41
44
  __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
42
45
  };
@@ -1,5 +1,9 @@
1
1
  <template>
2
- <div class="k-pagination" :class="`k-pagination-${size}`">
2
+ <div
3
+ class="k-pagination"
4
+ :class="[`k-pagination-${size}`, { 'is-loading': loading }]"
5
+ :aria-busy="loading ? 'true' : void 0"
6
+ >
3
7
  <p v-if="showSummary" class="k-pagination-summary" aria-live="polite">
4
8
  <slot name="summary" :start="range.start" :end="range.end" :total="total">
5
9
  <template v-if="total > 0">
@@ -28,6 +32,18 @@
28
32
  </span>
29
33
  </div>
30
34
  <nav class="k-pagination-nav" :aria-label="navLabel">
35
+ <button
36
+ v-if="showEdges"
37
+ type="button"
38
+ class="k-btn k-btn-neutral k-btn-ghost is-icon"
39
+ :class="`k-btn-${buttonSize}`"
40
+ :disabled="disabled"
41
+ :aria-disabled="!disabled && page <= 1 ? 'true' : void 0"
42
+ :aria-label="firstText"
43
+ @click="go(1)"
44
+ >
45
+ <Icon name="chevron-double-left" />
46
+ </button>
31
47
  <button
32
48
  type="button"
33
49
  class="k-btn k-btn-neutral k-btn-ghost is-icon"
@@ -73,7 +89,35 @@
73
89
  >
74
90
  <Icon name="chevron-right" />
75
91
  </button>
92
+ <button
93
+ v-if="showEdges"
94
+ type="button"
95
+ class="k-btn k-btn-neutral k-btn-ghost is-icon"
96
+ :class="`k-btn-${buttonSize}`"
97
+ :disabled="disabled"
98
+ :aria-disabled="!disabled && page >= pageCount ? 'true' : void 0"
99
+ :aria-label="lastText"
100
+ @click="go(pageCount)"
101
+ >
102
+ <Icon name="chevron-double-right" />
103
+ </button>
76
104
  </nav>
105
+ <div v-if="showJump" class="k-pagination-jump">
106
+ <label :for="jumpId" class="k-pagination-size-label">{{ jumpText }}</label>
107
+ <input
108
+ :id="jumpId"
109
+ class="k-field k-field-sm k-pagination-jump-input"
110
+ type="number"
111
+ inputmode="numeric"
112
+ min="1"
113
+ :max="pageCount"
114
+ :value="page"
115
+ :disabled="disabled"
116
+ @change="onJump"
117
+ @keydown.enter.prevent="onJump"
118
+ />
119
+ <span class="k-pagination-jump-total" aria-hidden="true">/ {{ pageCount }}</span>
120
+ </div>
77
121
  </div>
78
122
  </template>
79
123
 
@@ -90,11 +134,17 @@ const props = defineProps({
90
134
  size: { type: String, required: false, default: "md" },
91
135
  compact: { type: Boolean, required: false },
92
136
  disabled: { type: Boolean, required: false },
137
+ loading: { type: Boolean, required: false },
93
138
  showSummary: { type: Boolean, required: false, default: true },
139
+ showEdges: { type: Boolean, required: false },
140
+ showJump: { type: Boolean, required: false },
94
141
  label: { type: String, required: false },
95
142
  pageLabel: { type: String, required: false },
96
143
  previousLabel: { type: String, required: false },
97
144
  nextLabel: { type: String, required: false },
145
+ firstLabel: { type: String, required: false },
146
+ lastLabel: { type: String, required: false },
147
+ jumpLabel: { type: String, required: false },
98
148
  pageSizeLabel: { type: String, required: false },
99
149
  ofText: { type: String, required: false },
100
150
  emptyText: { type: String, required: false }
@@ -106,12 +156,16 @@ function pageText(value) {
106
156
  }
107
157
  const previousText = computed(() => props.previousLabel ?? t("pagination.previous"));
108
158
  const nextText = computed(() => props.nextLabel ?? t("pagination.next"));
159
+ const firstText = computed(() => props.firstLabel ?? t("pagination.first"));
160
+ const lastText = computed(() => props.lastLabel ?? t("pagination.last"));
161
+ const jumpText = computed(() => props.jumpLabel ?? t("pagination.jump"));
109
162
  const pageSizeText = computed(() => props.pageSizeLabel ?? t("pagination.pageSize"));
110
163
  const ofLabel = computed(() => props.ofText ?? t("pagination.of"));
111
164
  const emptyLabel = computed(() => props.emptyText ?? t("common.noResults"));
112
165
  const page = defineModel("page", { type: Number, ...{ default: 1 } });
113
166
  const pageSize = defineModel("pageSize", { type: Number, ...{ default: 20 } });
114
167
  const sizeId = useId();
168
+ const jumpId = useId();
115
169
  const buttonSize = computed(() => props.size === "sm" ? "xs" : "sm");
116
170
  const pageCount = computed(() => Math.max(1, Math.ceil(props.total / pageSize.value)));
117
171
  const items = computed(() => paginationItems(page.value, pageCount.value, props.siblings));
@@ -119,13 +173,20 @@ const range = computed(() => ({
119
173
  start: props.total === 0 ? 0 : (page.value - 1) * pageSize.value + 1,
120
174
  end: Math.min(page.value * pageSize.value, props.total)
121
175
  }));
122
- watch(pageCount, (count) => {
176
+ watch([pageCount, () => props.total, () => props.loading], ([count, total, loading]) => {
177
+ if (loading || total <= 0) return;
123
178
  if (page.value > count) page.value = count;
124
179
  });
125
180
  function go(target) {
126
181
  const next = Math.min(Math.max(target, 1), pageCount.value);
127
182
  if (next !== page.value) page.value = next;
128
183
  }
184
+ function onJump(event) {
185
+ const input = event.target;
186
+ const target = Math.trunc(Number(input.value));
187
+ if (Number.isFinite(target) && input.value !== "") go(target);
188
+ input.value = String(page.value);
189
+ }
129
190
  function onSizeChange(event) {
130
191
  const firstItem = (page.value - 1) * pageSize.value;
131
192
  pageSize.value = Number(event.target.value);
@@ -13,11 +13,17 @@ declare const __VLS_base: import("vue").DefineComponent<{
13
13
  size?: "sm" | "md";
14
14
  compact?: boolean;
15
15
  disabled?: boolean;
16
+ loading?: boolean;
16
17
  showSummary?: boolean;
18
+ showEdges?: boolean;
19
+ showJump?: boolean;
17
20
  label?: string;
18
21
  pageLabel?: string;
19
22
  previousLabel?: string;
20
23
  nextLabel?: string;
24
+ firstLabel?: string;
25
+ lastLabel?: string;
26
+ jumpLabel?: string;
21
27
  pageSizeLabel?: string;
22
28
  ofText?: string;
23
29
  emptyText?: string;
@@ -225,11 +231,17 @@ declare const __VLS_base: import("vue").DefineComponent<{
225
231
  size?: "sm" | "md";
226
232
  compact?: boolean;
227
233
  disabled?: boolean;
234
+ loading?: boolean;
228
235
  showSummary?: boolean;
236
+ showEdges?: boolean;
237
+ showJump?: boolean;
229
238
  label?: string;
230
239
  pageLabel?: string;
231
240
  previousLabel?: string;
232
241
  nextLabel?: string;
242
+ firstLabel?: string;
243
+ lastLabel?: string;
244
+ jumpLabel?: string;
233
245
  pageSizeLabel?: string;
234
246
  ofText?: string;
235
247
  emptyText?: string;
@@ -410,8 +410,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
410
410
  }> & Readonly<{
411
411
  onRemove?: (() => any) | undefined;
412
412
  }>, {
413
- tone: Tone;
414
413
  size: BadgeSize;
414
+ tone: Tone;
415
415
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
416
416
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
417
417
  declare const _default: typeof __VLS_export;
@@ -441,8 +441,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
441
441
  "onUpdate:selected"?: ((value: TreeNodeId | null) => any) | undefined;
442
442
  "onUpdate:expanded"?: ((value: TreeNodeId[]) => any) | undefined;
443
443
  }>, {
444
- invalid: boolean;
445
444
  size: TreeSize;
445
+ invalid: boolean;
446
446
  selectable: boolean;
447
447
  bordered: boolean;
448
448
  descriptionVariant: TreeDescriptionVariant;
@@ -91,5 +91,6 @@ export interface FilterPillOption<T extends FilterPillValue = FilterPillValue> {
91
91
  panel?: boolean;
92
92
  panelLabel?: string;
93
93
  active?: boolean;
94
+ removable?: boolean;
94
95
  }
95
96
  export type SelectionBarPlacement = 'inline' | 'sticky' | 'floating';
@@ -407,9 +407,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
407
407
  ref_for?: boolean | undefined | undefined;
408
408
  ref_key?: string | undefined | undefined;
409
409
  }> & Readonly<{}>, {
410
+ size: "sm" | "md";
410
411
  min: number;
411
412
  max: number;
412
- size: "sm" | "md";
413
413
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
414
414
  declare const _default: typeof __VLS_export;
415
415
  export default _default;
@@ -408,9 +408,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
408
408
  ref_key?: string | undefined | undefined;
409
409
  }> & Readonly<{}>, {
410
410
  value: number | null;
411
+ size: ProgressSize;
411
412
  tone: Tone;
412
413
  max: number;
413
- size: ProgressSize;
414
414
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
415
415
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
416
416
  declare const _default: typeof __VLS_export;
@@ -410,9 +410,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
410
410
  ref_key?: string | undefined | undefined;
411
411
  }> & Readonly<{}>, {
412
412
  value: number | null;
413
+ size: number | "sm" | "md" | "lg";
413
414
  tone: Tone;
414
415
  max: number;
415
- size: number | "sm" | "md" | "lg";
416
416
  thickness: number;
417
417
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
418
418
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,7 +1,12 @@
1
1
  <template>
2
2
  <div
3
3
  class="k-calendar"
4
- :class="{ 'is-range': range, 'is-disabled': disabled, 'is-readonly': readonly }"
4
+ :class="{
5
+ 'is-range': range,
6
+ 'is-disabled': disabled,
7
+ 'is-readonly': readonly,
8
+ 'has-day-text': Boolean(dayText || $slots.day)
9
+ }"
5
10
  >
6
11
  <div class="k-calendar-header">
7
12
  <button
@@ -77,7 +82,22 @@
77
82
  @mouseenter="hoverDate = day.iso"
78
83
  @focus="focusedDate = day.iso"
79
84
  >
80
- <span class="k-calendar-day-number">{{ day.number }}</span>
85
+ <span class="k-calendar-day-number">
86
+ <slot
87
+ name="day"
88
+ :date="day.iso"
89
+ :number="day.number"
90
+ :text="day.text"
91
+ :selected="day.selected"
92
+ :unavailable="day.unavailable"
93
+ :in-month="day.inMonth"
94
+ >
95
+ {{ day.number }}
96
+ <span v-if="day.text" class="k-calendar-day-text" aria-hidden="true">{{
97
+ day.text
98
+ }}</span>
99
+ </slot>
100
+ </span>
81
101
  </td>
82
102
  </tr>
83
103
  </tbody>
@@ -118,7 +138,8 @@ const props = defineProps({
118
138
  nextLabel: { type: String, required: false },
119
139
  disabled: { type: Boolean, required: false },
120
140
  readonly: { type: Boolean, required: false },
121
- level: { type: Number, required: false, default: 2 }
141
+ level: { type: Number, required: false, default: 2 },
142
+ dayText: { type: Function, required: false }
122
143
  });
123
144
  const { locale: appLocale, t } = useLocale();
124
145
  const resolvedLocale = computed(() => props.locale ?? appLocale.value.code);
@@ -176,10 +197,12 @@ function dayLabel(iso, start, end) {
176
197
  month: "long",
177
198
  day: "numeric"
178
199
  });
179
- if (!props.range || !start) return label;
180
- if (iso === start) return `${label}, ${t("calendar.rangeStart")}`;
181
- if (iso === end) return `${label}, ${t("calendar.rangeEnd")}`;
182
- return label;
200
+ const extra = props.dayText?.(iso);
201
+ const described = extra ? `${label}, ${extra}` : label;
202
+ if (!props.range || !start) return described;
203
+ if (iso === start) return `${described}, ${t("calendar.rangeStart")}`;
204
+ if (iso === end) return `${described}, ${t("calendar.rangeEnd")}`;
205
+ return described;
183
206
  }
184
207
  const weeks = computed(() => {
185
208
  const currentMonth = monthKey(focusedDate.value);
@@ -195,6 +218,7 @@ const weeks = computed(() => {
195
218
  iso,
196
219
  inMonth,
197
220
  number: Number(iso.slice(8)),
221
+ text: props.dayText?.(iso),
198
222
  label: dayLabel(iso, start, end),
199
223
  unavailable: isUnavailable(iso),
200
224
  selected: selected || Boolean(props.range && start && end && iso > start && iso < end),
@@ -1,7 +1,16 @@
1
1
  import type { CalendarDateDisabled, CalendarRange } from './types';
2
- declare var __VLS_25: {};
2
+ declare var __VLS_25: {
3
+ date: string;
4
+ number: number;
5
+ text: string | undefined;
6
+ selected: boolean;
7
+ unavailable: boolean;
8
+ inMonth: boolean;
9
+ }, __VLS_27: {};
3
10
  type __VLS_Slots = {} & {
4
- footer?: (props: typeof __VLS_25) => any;
11
+ day?: (props: typeof __VLS_25) => any;
12
+ } & {
13
+ footer?: (props: typeof __VLS_27) => any;
5
14
  };
6
15
  declare const __VLS_base: import("vue").DefineComponent<{
7
16
  range?: boolean;
@@ -15,6 +24,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
15
24
  disabled?: boolean;
16
25
  readonly?: boolean;
17
26
  level?: 1 | 2 | 3 | 4 | 5 | 6;
27
+ dayText?: (iso: string) => string | undefined;
18
28
  modelValue?: string | CalendarRange | null | undefined;
19
29
  month?: string | undefined;
20
30
  key?: PropertyKey | undefined;
@@ -227,6 +237,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
227
237
  disabled?: boolean;
228
238
  readonly?: boolean;
229
239
  level?: 1 | 2 | 3 | 4 | 5 | 6;
240
+ dayText?: (iso: string) => string | undefined;
230
241
  modelValue?: string | CalendarRange | null | undefined;
231
242
  month?: string | undefined;
232
243
  key?: PropertyKey | undefined;
@@ -9,8 +9,13 @@
9
9
  class="k-choice-group k-checkbox-group"
10
10
  :class="[
11
11
  `k-choice-group-${orientation}`,
12
- { 'is-invalid': control.invalid.value, 'is-disabled': control.disabled.value }
12
+ {
13
+ 'is-invalid': control.invalid.value,
14
+ 'is-disabled': control.disabled.value,
15
+ 'has-columns': Boolean(columns)
16
+ }
13
17
  ]"
18
+ :style="columns ? { '--k-choice-columns': String(columns) } : void 0"
14
19
  >
15
20
  <legend v-if="hasLegend" class="k-choice-group-legend">
16
21
  <slot name="legend">{{ legendText }}</slot>
@@ -43,6 +48,7 @@ const props = defineProps({
43
48
  label: { type: String, required: false },
44
49
  legend: { type: String, required: false },
45
50
  orientation: { type: String, required: false, default: "vertical" },
51
+ columns: { type: Number, required: false },
46
52
  size: { type: String, required: false, default: "md" },
47
53
  name: { type: String, required: false },
48
54
  invalid: { type: Boolean, required: false, default: void 0 },
@@ -6,6 +6,7 @@ declare const __VLS_export: <T extends ChoiceValue>(__VLS_props: NonNullable<Awa
6
6
  label?: string;
7
7
  legend?: string;
8
8
  orientation?: ChoiceOrientation;
9
+ columns?: number;
9
10
  size?: FieldSize;
10
11
  name?: string;
11
12
  invalid?: boolean;
@@ -225,13 +225,13 @@ declare const __VLS_export: import("vue").DefineComponent<{
225
225
  popovertarget?: string | undefined;
226
226
  popovertargetaction?: import("../../index.ts").PopoverTargetAction | undefined;
227
227
  autocomplete?: import("vue").InputAutoCompleteAttribute | undefined;
228
+ maxlength?: (string | number) | undefined;
229
+ multiple?: (boolean | "true" | "false") | undefined;
228
230
  accept?: string | undefined | undefined;
229
231
  alt?: string | undefined | undefined;
230
232
  capture?: boolean | "user" | "environment" | undefined | undefined;
231
233
  crossorigin?: string | undefined | undefined;
232
- maxlength?: (string | number) | undefined;
233
234
  minlength?: (string | number) | undefined;
234
- multiple?: (boolean | "true" | "false") | undefined;
235
235
  src?: string | undefined | undefined;
236
236
  onCancel?: ((payload: Event) => void) | undefined;
237
237
  }, {
@@ -464,22 +464,22 @@ declare const __VLS_export: import("vue").DefineComponent<{
464
464
  popovertarget?: string | undefined;
465
465
  popovertargetaction?: import("../../index.ts").PopoverTargetAction | undefined;
466
466
  autocomplete?: import("vue").InputAutoCompleteAttribute | undefined;
467
+ maxlength?: (string | number) | undefined;
468
+ multiple?: (boolean | "true" | "false") | undefined;
467
469
  accept?: string | undefined | undefined;
468
470
  alt?: string | undefined | undefined;
469
471
  capture?: boolean | "user" | "environment" | undefined | undefined;
470
472
  crossorigin?: string | undefined | undefined;
471
- maxlength?: (string | number) | undefined;
472
473
  minlength?: (string | number) | undefined;
473
- multiple?: (boolean | "true" | "false") | undefined;
474
474
  src?: string | undefined | undefined;
475
475
  onCancel?: ((payload: Event) => void) | undefined;
476
476
  }> & Readonly<{
477
477
  "onUpdate:modelValue"?: ((value: string | null | undefined) => any) | undefined;
478
478
  }>, {
479
+ size: FieldSize;
479
480
  invalid: boolean;
480
481
  swatches: ColorSwatch[];
481
482
  placeholder: string;
482
- size: FieldSize;
483
483
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
484
484
  declare const _default: typeof __VLS_export;
485
485
  export default _default;
@@ -28,7 +28,7 @@
28
28
  @mousedown="onControlMousedown"
29
29
  >
30
30
  <span v-if="icon" class="k-combobox-lead" aria-hidden="true"><Icon :name="icon" /></span>
31
- <template v-if="multiple">
31
+ <template v-if="multiple && !hideTags">
32
32
  <span v-for="value in selectedValues" :key="keyOf(value)" class="k-combobox-tag">
33
33
  <span class="k-combobox-tag-label">{{ labelFor(value) }}</span>
34
34
  <button
@@ -211,6 +211,7 @@ const props = defineProps({
211
211
  search: { type: Function, required: false },
212
212
  filter: { type: Function, required: false },
213
213
  multiple: { type: Boolean, required: false },
214
+ hideTags: { type: Boolean, required: false },
214
215
  creatable: { type: [Boolean, Function], required: false },
215
216
  debounce: { type: Number, required: false, default: 250 },
216
217
  minQueryLength: { type: Number, required: false, default: 0 },
@@ -316,7 +317,7 @@ const inputValue = computed(() => {
316
317
  return selectedLabel.value;
317
318
  });
318
319
  const inputPlaceholder = computed(
319
- () => props.multiple && selectedValues.value.length ? void 0 : props.placeholder
320
+ () => props.multiple && !props.hideTags && selectedValues.value.length ? void 0 : props.placeholder
320
321
  );
321
322
  const showClear = computed(
322
323
  () => props.clearable && interactive.value && selectedValues.value.length > 0
@@ -517,7 +518,7 @@ function onKeydown(event) {
517
518
  }
518
519
  break;
519
520
  case "Backspace":
520
- if (props.multiple && !query.value && selectedValues.value.length) {
521
+ if (props.multiple && !props.hideTags && !query.value && selectedValues.value.length) {
521
522
  event.preventDefault();
522
523
  remove(selectedValues.value[selectedValues.value.length - 1]);
523
524
  }
@@ -8,6 +8,7 @@ declare const __VLS_export: <T extends string | number, M extends T | T[] | null
8
8
  search?: ComboboxSearch<T>;
9
9
  filter?: (option: ComboboxOption<T>, query: string) => boolean;
10
10
  multiple?: boolean;
11
+ hideTags?: boolean;
11
12
  creatable?: boolean | ComboboxCreate<T>;
12
13
  debounce?: number;
13
14
  minQueryLength?: number;
@@ -131,6 +131,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
131
131
  lang?: string | undefined;
132
132
  width?: (string | number) | undefined;
133
133
  tabindex?: (string | number) | undefined;
134
+ transform?: (value: string) => string;
134
135
  'aria-activedescendant'?: string | undefined;
135
136
  'aria-atomic'?: (boolean | "true" | "false") | undefined;
136
137
  'aria-autocomplete'?: "none" | "inline" | "list" | "both" | undefined;
@@ -229,16 +230,17 @@ declare const __VLS_export: import("vue").DefineComponent<{
229
230
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
230
231
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
231
232
  autocomplete?: import("vue").InputAutoCompleteAttribute | undefined;
233
+ maxlength?: (string | number) | undefined;
232
234
  clearLabel?: string;
233
235
  noAutofill?: boolean;
236
+ counter?: boolean;
234
237
  onClear?: (() => any) | undefined;
238
+ multiple?: (boolean | "true" | "false") | undefined;
235
239
  accept?: string | undefined;
236
240
  alt?: string | undefined;
237
241
  capture?: boolean | "user" | "environment" | undefined;
238
242
  crossorigin?: string | undefined;
239
- maxlength?: (string | number) | undefined;
240
243
  minlength?: (string | number) | undefined;
241
- multiple?: (boolean | "true" | "false") | undefined;
242
244
  src?: string | undefined;
243
245
  onCancel?: ((payload: Event) => void) | undefined;
244
246
  modelModifiers?: Partial<Record<"number" | "trim", true>>;
@@ -376,6 +378,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
376
378
  lang?: string | undefined;
377
379
  width?: (string | number) | undefined;
378
380
  tabindex?: (string | number) | undefined;
381
+ transform?: (value: string) => string;
379
382
  'aria-activedescendant'?: string | undefined;
380
383
  'aria-atomic'?: (boolean | "true" | "false") | undefined;
381
384
  'aria-autocomplete'?: "none" | "inline" | "list" | "both" | undefined;
@@ -474,25 +477,26 @@ declare const __VLS_export: import("vue").DefineComponent<{
474
477
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
475
478
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
476
479
  autocomplete?: import("vue").InputAutoCompleteAttribute | undefined;
480
+ maxlength?: (string | number) | undefined;
477
481
  clearLabel?: string;
478
482
  noAutofill?: boolean;
483
+ counter?: boolean;
479
484
  onClear?: (() => any) | undefined;
485
+ multiple?: (boolean | "true" | "false") | undefined;
480
486
  accept?: string | undefined;
481
487
  alt?: string | undefined;
482
488
  capture?: boolean | "user" | "environment" | undefined;
483
489
  crossorigin?: string | undefined;
484
- maxlength?: (string | number) | undefined;
485
490
  minlength?: (string | number) | undefined;
486
- multiple?: (boolean | "true" | "false") | undefined;
487
491
  src?: string | undefined;
488
492
  onCancel?: ((payload: Event) => void) | undefined;
489
493
  modelModifiers?: Partial<Record<"number" | "trim", true>>;
490
494
  }> & Readonly<{
491
495
  "onUpdate:modelValue"?: ((value: string | null | undefined) => any) | undefined;
492
496
  }>, {
493
- invalid: boolean;
494
497
  size: FieldSize;
495
- type: "date" | "datetime-local" | "month" | "week";
498
+ invalid: boolean;
499
+ type: "month" | "week" | "date" | "datetime-local";
496
500
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
497
501
  declare const _default: typeof __VLS_export;
498
502
  export default _default;