@xleddyl/443-components-vue 0.8.2 → 0.8.4

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 (67) hide show
  1. package/README.md +41 -22
  2. package/dist/components/core/FormField.vue +5 -0
  3. package/dist/components/core/FormField.vue.d.ts +4 -0
  4. package/dist/components/core/Input.vue +59 -5
  5. package/dist/components/core/Input.vue.d.ts +8 -4
  6. package/dist/components/core/Textarea.vue +28 -3
  7. package/dist/components/core/Textarea.vue.d.ts +6 -4
  8. package/dist/components/data/DescriptionList.vue.d.ts +1 -1
  9. package/dist/components/data/Pagination.vue +8 -2
  10. package/dist/components/data/Pagination.vue.d.ts +2 -0
  11. package/dist/components/forms/CheckboxGroup.vue +7 -1
  12. package/dist/components/forms/CheckboxGroup.vue.d.ts +1 -0
  13. package/dist/components/forms/ColorInput.vue.d.ts +4 -4
  14. package/dist/components/forms/Combobox.vue +4 -3
  15. package/dist/components/forms/Combobox.vue.d.ts +1 -0
  16. package/dist/components/forms/DateInput.vue.d.ts +8 -4
  17. package/dist/components/forms/NumberInput.vue.d.ts +4 -4
  18. package/dist/components/forms/PasswordInput.vue.d.ts +8 -4
  19. package/dist/components/forms/PinInput.vue.d.ts +4 -4
  20. package/dist/components/forms/Select.vue +21 -2
  21. package/dist/components/forms/Select.vue.d.ts +3 -3
  22. package/dist/components/forms/Slider.vue.d.ts +4 -4
  23. package/dist/components/forms/TimeInput.vue.d.ts +8 -4
  24. package/dist/components/layout/Card.vue.d.ts +1 -1
  25. package/dist/components/layout/Separator.vue +22 -7
  26. package/dist/components/layout/Separator.vue.d.ts +14 -4
  27. package/dist/components/layout/types.d.ts +1 -0
  28. package/dist/components/overlays/ConfirmDialog.vue.d.ts +4 -4
  29. package/dist/components/overlays/ConfirmHost.vue.d.ts +4 -4
  30. package/dist/components/overlays/ContextMenu.vue.d.ts +2 -2
  31. package/dist/components/overlays/DropdownMenu.vue.d.ts +2 -2
  32. package/dist/components/overlays/types.d.ts +2 -2
  33. package/dist/components/templates/SettingsModal.vue.d.ts +4 -4
  34. package/dist/composables/useForm.d.ts +9 -2
  35. package/dist/composables/useForm.mjs +75 -13
  36. package/dist/composables/useOverlay.d.ts +1 -1
  37. package/dist/editor/RichTextEditor.vue +95 -9
  38. package/dist/editor/RichTextEditor.vue.d.ts +4 -1
  39. package/dist/editor/rich-text-editor.css +21 -0
  40. package/dist/editor/types.d.ts +1 -0
  41. package/dist/grid/DataGrid.vue +48 -18
  42. package/dist/grid/DataGrid.vue.d.ts +6 -1
  43. package/dist/grid/cells/DateCell.vue +7 -2
  44. package/dist/grid/cells/ImageCell.vue +6 -1
  45. package/dist/grid/data-grid.css +16 -2
  46. package/dist/grid/index.d.ts +2 -1
  47. package/dist/grid/index.mjs +6 -1
  48. package/dist/grid/modules.d.ts +1 -0
  49. package/dist/grid/modules.mjs +23 -0
  50. package/dist/grid/theme.mjs +1 -1
  51. package/dist/grid/types.d.ts +4 -0
  52. package/dist/internal/forms/counter.d.ts +18 -0
  53. package/dist/internal/forms/counter.mjs +31 -0
  54. package/dist/internal/overlays/OverlayView.vue.d.ts +4 -4
  55. package/dist/locale/de.mjs +11 -1
  56. package/dist/locale/en.mjs +11 -1
  57. package/dist/locale/it.mjs +11 -1
  58. package/dist/locale/types.d.ts +10 -0
  59. package/dist/styles/core/button.css +12 -6
  60. package/dist/styles/core/form-field.css +6 -0
  61. package/dist/styles/core/input.css +29 -0
  62. package/dist/styles/core/textarea.css +10 -0
  63. package/dist/styles/forms/calendar.css +8 -8
  64. package/dist/styles/forms/choice.css +6 -0
  65. package/dist/styles/layout/separator.css +49 -0
  66. package/dist/styles/shared.css +2 -1
  67. package/package.json +1 -1
@@ -3,7 +3,7 @@
3
3
  v-if="formatted"
4
4
  class="k-data-grid-date k-tabular"
5
5
  :datetime="iso"
6
- :title="params.relative ? absolute : void 0"
6
+ :title="isRelative ? absolute : void 0"
7
7
  >{{ formatted }}</time
8
8
  >
9
9
  <EmptyCell v-else :context="cellContext" />
@@ -30,9 +30,14 @@ const absolute = computed(
30
30
  date.value
31
31
  ) : ""
32
32
  );
33
+ const isRelative = computed(() => {
34
+ if (!date.value || !props.params.relative) return false;
35
+ const within = props.params.relativeWithin;
36
+ return within === void 0 || Math.abs(Date.now() - date.value.getTime()) <= within;
37
+ });
33
38
  const formatted = computed(() => {
34
39
  const relative = props.params.relative;
35
- if (!date.value || !relative) return absolute.value;
40
+ if (!date.value || !relative || !isRelative.value) return absolute.value;
36
41
  return formatRelativeTime(
37
42
  date.value,
38
43
  locale.value,
@@ -2,7 +2,8 @@
2
2
  <img
3
3
  v-if="src"
4
4
  class="k-data-grid-image"
5
- :class="{ 'is-rounded': params.rounded }"
5
+ :class="{ 'is-rounded': params.rounded, 'is-contain': params.fit === 'contain' }"
6
+ :style="sizeStyle"
6
7
  :src="src"
7
8
  :alt="alt"
8
9
  loading="lazy"
@@ -12,6 +13,7 @@
12
13
  v-else
13
14
  class="k-data-grid-image is-empty"
14
15
  :class="{ 'is-rounded': params.rounded }"
16
+ :style="sizeStyle"
15
17
  aria-hidden="true"
16
18
  >
17
19
  <Icon name="photo" />
@@ -28,5 +30,8 @@ const src = computed(() => {
28
30
  const raw = props.params.value;
29
31
  return typeof raw === "string" && raw ? raw : "";
30
32
  });
33
+ const sizeStyle = computed(
34
+ () => props.params.size ? { "--k-grid-image-size": props.params.size } : void 0
35
+ );
31
36
  const alt = computed(() => props.params.alt?.(props.params.data) ?? "");
32
37
  </script>
@@ -33,6 +33,16 @@
33
33
  min-height: 8rem;
34
34
  }
35
35
 
36
+ .k-data-grid.is-fill {
37
+ flex: 1 1 0%;
38
+ height: 100%;
39
+ min-height: 0;
40
+ }
41
+
42
+ .k-data-grid.is-fill > .k-data-grid-body {
43
+ flex: 1 1 0%;
44
+ }
45
+
36
46
  .k-data-grid-ag {
37
47
  height: 100%;
38
48
  }
@@ -174,8 +184,8 @@
174
184
 
175
185
  .k-data-grid-image {
176
186
  display: block;
177
- width: 1.75rem;
178
- height: 1.75rem;
187
+ width: var(--k-grid-image-size, 1.75rem);
188
+ height: var(--k-grid-image-size, 1.75rem);
179
189
  object-fit: cover;
180
190
  background: var(--k-fill);
181
191
  border-radius: var(--k-radius-sm);
@@ -188,6 +198,10 @@
188
198
  --k-icon-size: 1rem;
189
199
  }
190
200
 
201
+ .k-data-grid-image.is-contain {
202
+ object-fit: contain;
203
+ }
204
+
191
205
  .k-data-grid-image.is-rounded {
192
206
  border-radius: var(--k-radius-full);
193
207
  }
@@ -2,9 +2,10 @@ export { default as DataGrid } from './DataGrid.vue';
2
2
  export { default as GridToolbar } from './GridToolbar.vue';
3
3
  export { default as BooleanCell } from './cells/BooleanCell.vue';
4
4
  export { default as DateCell } from './cells/DateCell.vue';
5
+ export { default as EmptyCell } from './cells/EmptyCell.vue';
5
6
  export { default as BadgeCell } from './cells/BadgeCell.vue';
6
7
  export { default as ImageCell } from './cells/ImageCell.vue';
7
8
  export { default as LinkCell } from './cells/LinkCell.vue';
8
- export { registerGridFilterModules, registerGridModules } from './modules';
9
+ export { registerGridEditorModules, registerGridFilterModules, registerGridModules, } from './modules';
9
10
  export { createGridTheme } from './theme';
10
11
  export type * from './types';
@@ -2,8 +2,13 @@ export { default as DataGrid } from "./DataGrid.vue";
2
2
  export { default as GridToolbar } from "./GridToolbar.vue";
3
3
  export { default as BooleanCell } from "./cells/BooleanCell.vue";
4
4
  export { default as DateCell } from "./cells/DateCell.vue";
5
+ export { default as EmptyCell } from "./cells/EmptyCell.vue";
5
6
  export { default as BadgeCell } from "./cells/BadgeCell.vue";
6
7
  export { default as ImageCell } from "./cells/ImageCell.vue";
7
8
  export { default as LinkCell } from "./cells/LinkCell.vue";
8
- export { registerGridFilterModules, registerGridModules } from "./modules.mjs";
9
+ export {
10
+ registerGridEditorModules,
11
+ registerGridFilterModules,
12
+ registerGridModules
13
+ } from "./modules.mjs";
9
14
  export { createGridTheme } from "./theme.mjs";
@@ -1,2 +1,3 @@
1
1
  export declare function registerGridModules(): void;
2
2
  export declare function registerGridFilterModules(): void;
3
+ export declare function registerGridEditorModules(): void;
@@ -1,5 +1,13 @@
1
1
  import {
2
2
  CellApiModule,
3
+ CheckboxEditorModule,
4
+ CustomEditorModule,
5
+ DateEditorModule,
6
+ LargeTextEditorModule,
7
+ NumberEditorModule,
8
+ SelectEditorModule,
9
+ TextEditorModule,
10
+ UndoRedoEditModule,
3
11
  CellStyleModule,
4
12
  ClientSideRowModelApiModule,
5
13
  ClientSideRowModelModule,
@@ -51,3 +59,18 @@ export function registerGridFilterModules() {
51
59
  filtersRegistered = true;
52
60
  ModuleRegistry.registerModules([TextFilterModule, NumberFilterModule, DateFilterModule]);
53
61
  }
62
+ let editorsRegistered = false;
63
+ export function registerGridEditorModules() {
64
+ if (editorsRegistered) return;
65
+ editorsRegistered = true;
66
+ ModuleRegistry.registerModules([
67
+ TextEditorModule,
68
+ LargeTextEditorModule,
69
+ NumberEditorModule,
70
+ DateEditorModule,
71
+ CheckboxEditorModule,
72
+ SelectEditorModule,
73
+ CustomEditorModule,
74
+ UndoRedoEditModule
75
+ ]);
76
+ }
@@ -17,7 +17,7 @@ export function createGridTheme(density) {
17
17
  headerBackgroundColor: "var(--k-grid-header-background, var(--k-subtle))",
18
18
  headerTextColor: "var(--k-grid-header-text, var(--k-text-muted))",
19
19
  headerFontFamily: "var(--k-grid-header-font, var(--k-font-sans))",
20
- headerFontSize: 12,
20
+ headerFontSize: "var(--k-grid-header-font-size, 12px)",
21
21
  headerFontWeight: "var(--k-grid-header-font-weight, var(--k-font-weight-medium, 500))",
22
22
  headerRowBorder: { color: "var(--k-line)" },
23
23
  headerColumnBorder: false,
@@ -39,15 +39,19 @@ export interface DateCellParams {
39
39
  locale?: string;
40
40
  options?: Intl.DateTimeFormatOptions;
41
41
  relative?: boolean | Intl.RelativeTimeFormatOptions;
42
+ relativeWithin?: number;
42
43
  }
43
44
  export interface BadgeCellParams {
44
45
  tones?: Record<string, Tone>;
45
46
  labels?: Record<string, string>;
46
47
  defaultTone?: Tone;
47
48
  }
49
+ export type ImageCellFit = 'cover' | 'contain';
48
50
  export interface ImageCellParams<T = unknown> {
49
51
  alt?: (data: T | undefined) => string;
50
52
  rounded?: boolean;
53
+ fit?: ImageCellFit;
54
+ size?: string;
51
55
  }
52
56
  export interface LinkCellParams<T = unknown> {
53
57
  href?: (value: unknown, data: T | undefined) => string;
@@ -0,0 +1,18 @@
1
+ interface CharacterCounterOptions {
2
+ enabled: () => boolean | undefined;
3
+ value: () => unknown;
4
+ attrs: Record<string, unknown>;
5
+ }
6
+ export interface CharacterCounterState {
7
+ id: string;
8
+ visible: boolean;
9
+ length: number;
10
+ max: number;
11
+ atLimit: boolean;
12
+ text: string;
13
+ label: string;
14
+ limitMessage: string;
15
+ width: number;
16
+ }
17
+ export declare function useCharacterCounter(options: CharacterCounterOptions): () => CharacterCounterState;
18
+ export {};
@@ -0,0 +1,31 @@
1
+ import { useId } from "vue";
2
+ import { useLocale } from "../../composables/useLocale.mjs";
3
+ function readLimit(attrs) {
4
+ const raw = attrs.maxlength ?? attrs.maxLength;
5
+ if (raw === void 0 || raw === null || raw === "" || raw === false) return void 0;
6
+ const limit = Number(raw);
7
+ return Number.isFinite(limit) && limit >= 0 ? Math.trunc(limit) : void 0;
8
+ }
9
+ export function useCharacterCounter(options) {
10
+ const { t } = useLocale();
11
+ const id = useId();
12
+ return () => {
13
+ const max = readLimit(options.attrs);
14
+ const visible = Boolean(options.enabled()) && max !== void 0;
15
+ const value = options.value();
16
+ const length = value === null || value === void 0 ? 0 : String(value).length;
17
+ const limit = max ?? 0;
18
+ const atLimit = visible && length >= limit;
19
+ return {
20
+ id,
21
+ visible,
22
+ length,
23
+ max: limit,
24
+ atLimit,
25
+ text: `${length} / ${limit}`,
26
+ label: visible ? t("form.characterCount", { count: length, max: limit }) : "",
27
+ limitMessage: atLimit ? t("form.characterLimitReached") : "",
28
+ width: String(limit).length * 2 + 3
29
+ };
30
+ };
31
+ }
@@ -11,6 +11,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
11
11
  results?: (string | number) | undefined;
12
12
  placeholder?: string | undefined;
13
13
  description?: string;
14
+ flush?: boolean;
14
15
  dir?: string | undefined;
15
16
  class?: import("vue").ClassValue;
16
17
  role?: string | undefined;
@@ -207,10 +208,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
207
208
  onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
208
209
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
209
210
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
210
- flush?: boolean;
211
+ sheet?: boolean;
211
212
  onCancel?: ((payload: Event) => void) | undefined;
212
213
  side?: import("../../index.ts").DrawerSide;
213
- sheet?: boolean;
214
214
  onOpen?: ((() => any) & (() => any)) | undefined;
215
215
  closeLabel?: string;
216
216
  rootClass?: unknown;
@@ -234,6 +234,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
234
234
  results?: (string | number) | undefined;
235
235
  placeholder?: string | undefined;
236
236
  description?: string;
237
+ flush?: boolean;
237
238
  dir?: string | undefined;
238
239
  class?: import("vue").ClassValue;
239
240
  role?: string | undefined;
@@ -430,10 +431,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
430
431
  onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
431
432
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
432
433
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
433
- flush?: boolean;
434
+ sheet?: boolean;
434
435
  onCancel?: ((payload: Event) => void) | undefined;
435
436
  side?: import("../../index.ts").DrawerSide;
436
- sheet?: boolean;
437
437
  onOpen?: ((() => any) & (() => any)) | undefined;
438
438
  closeLabel?: string;
439
439
  rootClass?: unknown;
@@ -40,7 +40,10 @@ export const de = {
40
40
  maxItems: "W\xE4hle h\xF6chstens {count} Eintrag | W\xE4hle h\xF6chstens {count} Eintr\xE4ge",
41
41
  pattern: "Ung\xFCltiges Format",
42
42
  invalid: "Ung\xFCltiger Wert",
43
- requiredHint: "(erforderlich)"
43
+ requiredHint: "(erforderlich)",
44
+ optional: "Optional",
45
+ characterCount: "{count} von {max} Zeichen",
46
+ characterLimitReached: "Zeichenlimit erreicht"
44
47
  },
45
48
  editor: {
46
49
  bold: "Fett",
@@ -59,6 +62,13 @@ export const de = {
59
62
  linkUrl: "Link-URL",
60
63
  applyLink: "\xDCbernehmen",
61
64
  removeLink: "Link entfernen",
65
+ linkType: "Linktyp",
66
+ linkTypeUrl: "Webadresse",
67
+ linkTypeEmail: "E-Mail",
68
+ linkTypePhone: "Telefon",
69
+ linkEmail: "E-Mail-Adresse",
70
+ linkPhone: "Telefonnummer",
71
+ linkText: "Linktext",
62
72
  characters: "{count} Zeichen | {count} Zeichen",
63
73
  limit: "{count} von {max} Zeichen",
64
74
  limitReached: "Zeichenlimit erreicht"
@@ -40,7 +40,10 @@ export const en = {
40
40
  maxItems: "Select at most {count} item | Select at most {count} items",
41
41
  pattern: "Invalid format",
42
42
  invalid: "Invalid value",
43
- requiredHint: "(required)"
43
+ requiredHint: "(required)",
44
+ optional: "Optional",
45
+ characterCount: "{count} of {max} characters",
46
+ characterLimitReached: "Character limit reached"
44
47
  },
45
48
  editor: {
46
49
  bold: "Bold",
@@ -59,6 +62,13 @@ export const en = {
59
62
  linkUrl: "Link URL",
60
63
  applyLink: "Apply",
61
64
  removeLink: "Remove link",
65
+ linkType: "Link type",
66
+ linkTypeUrl: "Web address",
67
+ linkTypeEmail: "Email",
68
+ linkTypePhone: "Phone",
69
+ linkEmail: "Email address",
70
+ linkPhone: "Phone number",
71
+ linkText: "Link text",
62
72
  characters: "{count} character | {count} characters",
63
73
  limit: "{count} of {max} characters",
64
74
  limitReached: "Character limit reached"
@@ -40,7 +40,10 @@ export const it = {
40
40
  maxItems: "Seleziona al massimo {count} elemento | Seleziona al massimo {count} elementi",
41
41
  pattern: "Formato non valido",
42
42
  invalid: "Valore non valido",
43
- requiredHint: "(obbligatorio)"
43
+ requiredHint: "(obbligatorio)",
44
+ optional: "Facoltativo",
45
+ characterCount: "{count} di {max} caratteri",
46
+ characterLimitReached: "Limite di caratteri raggiunto"
44
47
  },
45
48
  editor: {
46
49
  bold: "Grassetto",
@@ -59,6 +62,13 @@ export const it = {
59
62
  linkUrl: "URL del link",
60
63
  applyLink: "Applica",
61
64
  removeLink: "Rimuovi link",
65
+ linkType: "Tipo di link",
66
+ linkTypeUrl: "Indirizzo web",
67
+ linkTypeEmail: "Email",
68
+ linkTypePhone: "Telefono",
69
+ linkEmail: "Indirizzo email",
70
+ linkPhone: "Numero di telefono",
71
+ linkText: "Testo del link",
62
72
  characters: "{count} carattere | {count} caratteri",
63
73
  limit: "{count} di {max} caratteri",
64
74
  limitReached: "Limite di caratteri raggiunto"
@@ -39,6 +39,9 @@ export interface KMessages {
39
39
  pattern: string;
40
40
  invalid: string;
41
41
  requiredHint: string;
42
+ optional: string;
43
+ characterCount: string;
44
+ characterLimitReached: string;
42
45
  };
43
46
  editor: {
44
47
  bold: string;
@@ -57,6 +60,13 @@ export interface KMessages {
57
60
  linkUrl: string;
58
61
  applyLink: string;
59
62
  removeLink: string;
63
+ linkType: string;
64
+ linkTypeUrl: string;
65
+ linkTypeEmail: string;
66
+ linkTypePhone: string;
67
+ linkEmail: string;
68
+ linkPhone: string;
69
+ linkText: string;
60
70
  characters: string;
61
71
  limit: string;
62
72
  limitReached: string;
@@ -141,22 +141,22 @@
141
141
  }
142
142
 
143
143
  .k-btn-solid:hover:not(:disabled, [aria-disabled='true']) {
144
- background: color-mix(in oklab, var(--k-btn-tone) 90%, black);
144
+ background: var(--k-btn-hover-background, color-mix(in oklab, var(--k-btn-tone) 90%, black));
145
145
  box-shadow:
146
146
  inset 0 1px 0 var(--k-btn-highlight, rgb(255 255 255 / 0.22)),
147
147
  var(--k-btn-shadow, 0 2px 8px -2px color-mix(in oklab, var(--k-btn-tone) 60%, transparent));
148
148
  }
149
149
 
150
150
  .k-btn-solid:active:not(:disabled, [aria-disabled='true']) {
151
- background: color-mix(in oklab, var(--k-btn-tone) 82%, black);
151
+ background: var(--k-btn-active-background, color-mix(in oklab, var(--k-btn-tone) 82%, black));
152
152
  }
153
153
 
154
154
  .k-btn-accent.k-btn-solid:hover:not(:disabled, [aria-disabled='true']) {
155
- background: var(--k-accent-hover);
155
+ background: var(--k-btn-hover-background, var(--k-accent-hover));
156
156
  }
157
157
 
158
158
  .k-btn-accent.k-btn-solid:active:not(:disabled, [aria-disabled='true']) {
159
- background: var(--k-accent-press);
159
+ background: var(--k-btn-active-background, var(--k-accent-press));
160
160
  }
161
161
 
162
162
  .k-btn-neutral.k-btn-solid {
@@ -167,12 +167,18 @@
167
167
  }
168
168
 
169
169
  .k-btn-neutral.k-btn-solid:hover:not(:disabled, [aria-disabled='true']) {
170
- background: color-mix(in oklab, var(--k-text) 86%, var(--k-surface));
170
+ background: var(
171
+ --k-btn-hover-background,
172
+ color-mix(in oklab, var(--k-text) 86%, var(--k-surface))
173
+ );
171
174
  box-shadow: inset 0 1px 0 var(--k-btn-highlight, rgb(255 255 255 / 0.14));
172
175
  }
173
176
 
174
177
  .k-btn-neutral.k-btn-solid:active:not(:disabled, [aria-disabled='true']) {
175
- background: color-mix(in oklab, var(--k-text) 80%, var(--k-surface));
178
+ background: var(
179
+ --k-btn-active-background,
180
+ color-mix(in oklab, var(--k-text) 80%, var(--k-surface))
181
+ );
176
182
  }
177
183
 
178
184
  .k-btn-soft {
@@ -37,6 +37,12 @@
37
37
  color: var(--k-danger-text);
38
38
  }
39
39
 
40
+ .k-form-field-optional {
41
+ font-size: 0.75rem;
42
+ font-weight: var(--k-font-weight, 400);
43
+ color: var(--k-text-muted);
44
+ }
45
+
40
46
  .k-form-field-hint {
41
47
  margin-left: auto;
42
48
  font-size: 0.75rem;
@@ -134,3 +134,32 @@
134
134
  .k-input.has-trail .k-field {
135
135
  padding-right: 2.125rem;
136
136
  }
137
+
138
+ .k-field-counter {
139
+ font-size: 0.75rem;
140
+ line-height: 1;
141
+ color: var(--k-text-muted);
142
+ white-space: nowrap;
143
+ pointer-events: none;
144
+ }
145
+
146
+ .k-field-counter.is-over {
147
+ color: var(--k-danger-text);
148
+ }
149
+
150
+ .k-input > .k-field-counter {
151
+ position: absolute;
152
+ right: 0.6875rem;
153
+ }
154
+
155
+ .k-input.has-trail > .k-field-counter {
156
+ right: 2.125rem;
157
+ }
158
+
159
+ .k-input.has-counter .k-field {
160
+ padding-right: calc(var(--k-input-counter-chars) * 0.5rem + 1rem);
161
+ }
162
+
163
+ .k-input.has-counter.has-trail .k-field {
164
+ padding-right: calc(var(--k-input-counter-chars) * 0.5rem + 2.5rem);
165
+ }
@@ -37,3 +37,13 @@
37
37
  .k-textarea-box.has-trail .k-textarea {
38
38
  padding-right: 2.125rem;
39
39
  }
40
+
41
+ .k-textarea-box > .k-field-counter {
42
+ position: absolute;
43
+ right: 1.25rem;
44
+ bottom: 0.5rem;
45
+ }
46
+
47
+ .k-textarea-box.has-counter .k-textarea {
48
+ padding-bottom: 1.5rem;
49
+ }
@@ -61,7 +61,7 @@
61
61
  place-items: center;
62
62
  width: 100%;
63
63
  height: 100%;
64
- border-radius: var(--k-radius-md);
64
+ border-radius: var(--k-calendar-day-radius, var(--k-radius-md));
65
65
  color: var(--k-text-toned);
66
66
  font-variant-numeric: tabular-nums;
67
67
  transition:
@@ -134,14 +134,14 @@
134
134
 
135
135
  .k-calendar-day.is-in-range:first-child::before,
136
136
  .k-calendar-day.is-in-preview:first-child::before {
137
- border-top-left-radius: var(--k-radius-md);
138
- border-bottom-left-radius: var(--k-radius-md);
137
+ border-top-left-radius: var(--k-calendar-day-radius, var(--k-radius-md));
138
+ border-bottom-left-radius: var(--k-calendar-day-radius, var(--k-radius-md));
139
139
  }
140
140
 
141
141
  .k-calendar-day.is-in-range:last-child::before,
142
142
  .k-calendar-day.is-in-preview:last-child::before {
143
- border-top-right-radius: var(--k-radius-md);
144
- border-bottom-right-radius: var(--k-radius-md);
143
+ border-top-right-radius: var(--k-calendar-day-radius, var(--k-radius-md));
144
+ border-bottom-right-radius: var(--k-calendar-day-radius, var(--k-radius-md));
145
145
  }
146
146
 
147
147
  .k-calendar-day.is-selected .k-calendar-day-number,
@@ -169,9 +169,9 @@
169
169
  .k-calendar-day.is-unavailable .k-calendar-day-number,
170
170
  .k-calendar-day.is-unavailable:hover .k-calendar-day-number {
171
171
  background: transparent;
172
- color: var(--k-text-dimmed);
173
- text-decoration: line-through;
174
- opacity: 0.6;
172
+ color: var(--k-calendar-unavailable-color, var(--k-text-dimmed));
173
+ text-decoration: var(--k-calendar-unavailable-decoration, line-through);
174
+ opacity: var(--k-calendar-unavailable-opacity, 0.6);
175
175
  }
176
176
 
177
177
  .k-calendar.is-disabled {
@@ -25,6 +25,12 @@
25
25
  gap: 0.5rem 1.25rem;
26
26
  }
27
27
 
28
+ .k-choice-group.has-columns > .k-choice-group-items {
29
+ display: grid;
30
+ grid-template-columns: repeat(var(--k-choice-columns), minmax(0, 1fr));
31
+ gap: 0.625rem 1.25rem;
32
+ }
33
+
28
34
  .k-radio-group-card > .k-choice-group-items {
29
35
  gap: 0.5rem;
30
36
  }
@@ -56,3 +56,52 @@
56
56
  font-size: 0.75rem;
57
57
  color: var(--k-text-muted);
58
58
  }
59
+
60
+ .k-separator.no-lines {
61
+ background: none;
62
+ }
63
+
64
+ .k-separator.has-label.no-lines {
65
+ justify-content: center;
66
+ }
67
+
68
+ .k-separator.has-label.no-lines::before,
69
+ .k-separator.has-label.no-lines::after,
70
+ .k-separator-heading.has-label::before,
71
+ .k-separator-heading.has-label::after {
72
+ display: none;
73
+ }
74
+
75
+ .k-separator-heading.has-label {
76
+ justify-content: flex-start;
77
+ padding-top: 0.75rem;
78
+ border-top: 1px solid var(--k-line);
79
+ }
80
+
81
+ .k-separator-heading.has-label.no-lines {
82
+ padding-top: 0;
83
+ border-top: 0;
84
+ }
85
+
86
+ .k-separator-heading .k-separator-text {
87
+ display: flex;
88
+ flex: 1;
89
+ align-items: flex-start;
90
+ gap: 0.25rem;
91
+ text-align: start;
92
+ }
93
+
94
+ .k-separator-heading .k-separator-label {
95
+ margin: 0;
96
+ font-size: var(--k-separator-heading-font-size, 0.9375rem);
97
+ font-weight: var(--k-font-weight-strong, 600);
98
+ line-height: 1.3;
99
+ color: var(--k-text);
100
+ white-space: normal;
101
+ }
102
+
103
+ .k-separator-heading .k-separator-description {
104
+ margin: 0;
105
+ font-size: 0.8125rem;
106
+ line-height: 1.4;
107
+ }
@@ -126,7 +126,8 @@
126
126
  .k-error-code,
127
127
  .k-error-title,
128
128
  .k-stat-value,
129
- .k-settings-modal-title
129
+ .k-settings-modal-title,
130
+ .k-separator-heading .k-separator-label
130
131
  ) {
131
132
  font-family: var(--k-font-display, var(--k-font-sans));
132
133
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xleddyl/443-components-vue",
3
- "version": "0.8.2",
3
+ "version": "0.8.4",
4
4
  "description": "Compact, scoped dashboard components for Vue and Nuxt",
5
5
  "license": "MIT",
6
6
  "author": "Edoardo Alberti (https://github.com/xleddyl)",