@xleddyl/443-components-vue 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/CATALOG.md +155 -153
  2. package/README.md +79 -2
  3. package/dist/chart/BarChart.vue.d.ts +2 -2
  4. package/dist/chart/ChartLegend.vue.d.ts +4 -4
  5. package/dist/chart/ChartPanel.vue.d.ts +2 -2
  6. package/dist/chart/ChartSummary.vue.d.ts +2 -2
  7. package/dist/chart/DoughnutChart.vue.d.ts +2 -2
  8. package/dist/chart/LineChart.vue.d.ts +2 -2
  9. package/dist/components/core/Button.vue.d.ts +2 -2
  10. package/dist/components/core/FieldMessage.vue.d.ts +2 -2
  11. package/dist/components/core/FormAlerts.vue.d.ts +2 -2
  12. package/dist/components/core/FormField.vue.d.ts +2 -2
  13. package/dist/components/core/Input.vue.d.ts +4 -4
  14. package/dist/components/core/Kbd.vue.d.ts +2 -2
  15. package/dist/components/core/Root.vue.d.ts +4 -4
  16. package/dist/components/core/Spinner.vue.d.ts +2 -2
  17. package/dist/components/core/Textarea.vue.d.ts +4 -4
  18. package/dist/components/core/VisuallyHidden.vue.d.ts +4 -4
  19. package/dist/components/data/Avatar.vue.d.ts +2 -2
  20. package/dist/components/data/AvatarGroup.vue.d.ts +2 -2
  21. package/dist/components/data/Badge.vue.d.ts +2 -2
  22. package/dist/components/data/DescriptionList.vue.d.ts +2 -2
  23. package/dist/components/data/FilterPill.vue.d.ts +2 -2
  24. package/dist/components/data/Pagination.vue +14 -8
  25. package/dist/components/data/Pagination.vue.d.ts +13 -10
  26. package/dist/components/data/SelectionBar.vue.d.ts +2 -2
  27. package/dist/components/data/Stat.vue.d.ts +4 -4
  28. package/dist/components/data/Tag.vue.d.ts +4 -4
  29. package/dist/components/data/Timeline.vue.d.ts +2 -2
  30. package/dist/components/data/Tree.vue.d.ts +4 -4
  31. package/dist/components/data/types.d.ts +1 -0
  32. package/dist/components/feedback/Alert.vue.d.ts +4 -4
  33. package/dist/components/feedback/EmptyState.vue.d.ts +2 -2
  34. package/dist/components/feedback/LoadingOverlay.vue.d.ts +2 -2
  35. package/dist/components/feedback/Meter.vue.d.ts +2 -2
  36. package/dist/components/feedback/Progress.vue.d.ts +2 -2
  37. package/dist/components/feedback/ProgressRing.vue.d.ts +2 -2
  38. package/dist/components/feedback/Skeleton.vue.d.ts +2 -2
  39. package/dist/components/forms/Calendar.vue.d.ts +4 -4
  40. package/dist/components/forms/ColorInput.vue.d.ts +4 -4
  41. package/dist/components/forms/DateInput.vue.d.ts +4 -4
  42. package/dist/components/forms/DatePicker.vue.d.ts +4 -4
  43. package/dist/components/forms/FileInput.vue.d.ts +4 -4
  44. package/dist/components/forms/InputAddon.vue.d.ts +2 -2
  45. package/dist/components/forms/InputGroup.vue.d.ts +2 -2
  46. package/dist/components/forms/NumberInput.vue.d.ts +4 -4
  47. package/dist/components/forms/PasswordInput.vue.d.ts +4 -4
  48. package/dist/components/forms/PinInput.vue.d.ts +4 -4
  49. package/dist/components/forms/Radio.vue.d.ts +2 -2
  50. package/dist/components/forms/Slider.vue.d.ts +4 -4
  51. package/dist/components/forms/Switch.vue.d.ts +4 -4
  52. package/dist/components/forms/TimeInput.vue.d.ts +4 -4
  53. package/dist/components/layout/Accordion.vue.d.ts +4 -4
  54. package/dist/components/layout/AppShell.vue.d.ts +4 -4
  55. package/dist/components/layout/Breadcrumbs.vue.d.ts +2 -2
  56. package/dist/components/layout/Card.vue.d.ts +4 -4
  57. package/dist/components/layout/CopyButton.vue.d.ts +4 -4
  58. package/dist/components/layout/Grid.vue.d.ts +2 -2
  59. package/dist/components/layout/NavLink.vue.d.ts +4 -4
  60. package/dist/components/layout/PageHeader.vue.d.ts +2 -2
  61. package/dist/components/layout/Separator.vue.d.ts +2 -2
  62. package/dist/components/layout/Sidebar.vue.d.ts +2 -2
  63. package/dist/components/layout/SidebarSection.vue.d.ts +2 -2
  64. package/dist/components/layout/Stack.vue.d.ts +4 -4
  65. package/dist/components/layout/Stepper.vue.d.ts +4 -4
  66. package/dist/components/layout/Tabs.vue.d.ts +4 -4
  67. package/dist/components/layout/ThemeSwitch.vue.d.ts +2 -2
  68. package/dist/components/layout/Toolbar.vue.d.ts +2 -2
  69. package/dist/components/overlays/CommandPalette.vue.d.ts +2 -2
  70. package/dist/components/overlays/ConfirmDialog.vue.d.ts +4 -4
  71. package/dist/components/overlays/ConfirmHost.vue.d.ts +4 -4
  72. package/dist/components/overlays/ContextMenu.vue.d.ts +4 -4
  73. package/dist/components/overlays/Drawer.vue.d.ts +4 -4
  74. package/dist/components/overlays/DropdownMenu.vue.d.ts +4 -4
  75. package/dist/components/overlays/HoverCard.vue.d.ts +4 -4
  76. package/dist/components/overlays/Modal.vue.d.ts +4 -4
  77. package/dist/components/overlays/Popover.vue.d.ts +4 -4
  78. package/dist/components/overlays/Toaster.vue.d.ts +2 -2
  79. package/dist/components/overlays/Tooltip.vue.d.ts +2 -2
  80. package/dist/components/templates/AccountMenu.vue.d.ts +4 -4
  81. package/dist/components/templates/AppearanceSettings.vue.d.ts +2 -2
  82. package/dist/components/templates/AuthLayout.vue.d.ts +2 -2
  83. package/dist/components/templates/Brand.vue.d.ts +4 -4
  84. package/dist/components/templates/DashboardLayout.vue +2 -0
  85. package/dist/components/templates/DashboardLayout.vue.d.ts +3 -2
  86. package/dist/components/templates/DashboardPage.vue.d.ts +2 -2
  87. package/dist/components/templates/DetailPage.vue.d.ts +4 -4
  88. package/dist/components/templates/EmptyPage.vue.d.ts +2 -2
  89. package/dist/components/templates/ErrorPage.vue.d.ts +2 -2
  90. package/dist/components/templates/ListPage.vue +7 -3
  91. package/dist/components/templates/ListPage.vue.d.ts +5 -5
  92. package/dist/components/templates/SaveBar.vue.d.ts +4 -4
  93. package/dist/components/templates/SettingsGroup.vue.d.ts +2 -2
  94. package/dist/components/templates/SettingsModal.vue.d.ts +4 -4
  95. package/dist/components/templates/SettingsPage.vue.d.ts +4 -4
  96. package/dist/components/templates/SettingsSection.vue.d.ts +4 -4
  97. package/dist/composables/core.d.ts +1 -0
  98. package/dist/composables/core.mjs +1 -0
  99. package/dist/composables/usePreferences.d.ts +17 -0
  100. package/dist/composables/usePreferences.mjs +50 -0
  101. package/dist/editor/RichTextEditor.vue.d.ts +4 -4
  102. package/dist/grid/DataGrid.vue +57 -13
  103. package/dist/grid/DataGrid.vue.d.ts +5 -4
  104. package/dist/grid/GridToolbar.vue.d.ts +4 -4
  105. package/dist/grid/cells/BadgeCell.vue.d.ts +2 -2
  106. package/dist/grid/cells/BooleanCell.vue.d.ts +2 -2
  107. package/dist/grid/cells/ButtonCell.vue.d.ts +2 -2
  108. package/dist/grid/cells/DateCell.vue.d.ts +2 -2
  109. package/dist/grid/cells/EmptyCell.vue.d.ts +2 -2
  110. package/dist/grid/cells/ImageCell.vue.d.ts +2 -2
  111. package/dist/grid/types.d.ts +5 -1
  112. package/dist/internal/core/LiveRegion.vue.d.ts +2 -2
  113. package/dist/internal/core/preferences.d.ts +34 -0
  114. package/dist/internal/core/preferences.mjs +184 -0
  115. package/dist/internal/core/preset.mjs +4 -1
  116. package/dist/internal/core/theme.mjs +4 -1
  117. package/dist/internal/layout/NavGroup.vue.d.ts +4 -4
  118. package/dist/internal/layout/persist.mjs +44 -9
  119. package/dist/internal/overlays/DialogFrame.vue.d.ts +4 -4
  120. package/dist/internal/overlays/MenuList.vue.d.ts +4 -4
  121. package/dist/internal/overlays/OverlayView.vue.d.ts +4 -4
  122. package/dist/locale/de.mjs +2 -1
  123. package/dist/locale/en.mjs +2 -1
  124. package/dist/locale/it.mjs +2 -1
  125. package/dist/locale/types.d.ts +1 -0
  126. package/dist/nuxt/runtime/layouts/auth.vue.d.ts +4 -4
  127. package/dist/nuxt/runtime/layouts/dashboard.vue.d.ts +4 -4
  128. package/dist/styles/forms/select.css +16 -2
  129. package/dist/styles/templates/settings-modal.css +9 -4
  130. package/package.json +1 -1
@@ -11,7 +11,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
11
11
  draggable?: (boolean | "true" | "false") | undefined;
12
12
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
13
13
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
14
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
14
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
15
15
  id?: string | undefined | undefined;
16
16
  inert?: (boolean | "true" | "false") | undefined;
17
17
  lang?: string | undefined | undefined;
@@ -206,7 +206,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
206
206
  draggable?: (boolean | "true" | "false") | undefined;
207
207
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
208
208
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
209
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
209
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
210
210
  id?: string | undefined | undefined;
211
211
  inert?: (boolean | "true" | "false") | undefined;
212
212
  lang?: string | undefined | undefined;
@@ -0,0 +1,34 @@
1
+ import type { App, InjectionKey, Ref } from 'vue';
2
+ export type PreferenceListener = (key: string, value: unknown) => void;
3
+ export interface PreferenceStore {
4
+ get(key: string): unknown;
5
+ set(key: string, value: unknown): void;
6
+ subscribe?(listener: PreferenceListener): () => void;
7
+ clientOnly?: boolean;
8
+ }
9
+ export interface Preferences {
10
+ readonly store: PreferenceStore;
11
+ readonly clientOnly: boolean;
12
+ get(key: string): unknown;
13
+ set(key: string, value: unknown): void;
14
+ remove(key: string): void;
15
+ install(app: App): void;
16
+ }
17
+ export declare const PREFERENCES_KEY: InjectionKey<Preferences>;
18
+ export declare const LOCAL_PREFERENCE_PREFIX = "k-pref:";
19
+ export declare function createLocalPreferenceStore(prefix?: string): PreferenceStore;
20
+ export interface RemotePreferenceStoreOptions {
21
+ initial?: Record<string, unknown> | null;
22
+ save: (patch: Record<string, unknown>) => unknown;
23
+ debounce?: number;
24
+ }
25
+ export interface RemotePreferenceStore extends PreferenceStore {
26
+ snapshot(): Record<string, unknown>;
27
+ replace(snapshot: Record<string, unknown> | null | undefined): void;
28
+ flush(): Promise<void>;
29
+ }
30
+ export declare function createRemotePreferenceStore(options: RemotePreferenceStoreOptions): RemotePreferenceStore;
31
+ export declare function createPreferences(store?: PreferenceStore): Preferences;
32
+ export declare function resolvePreferences(): Preferences;
33
+ export declare function whenPreferencesReady(preferences: Preferences, callback: () => void): void;
34
+ export declare function bindPreference<T>(preferences: Preferences, key: string, target: Ref<T>, isValid: (value: unknown) => value is T, fallback: T): void;
@@ -0,0 +1,184 @@
1
+ import { effectScope, getCurrentInstance, inject, onMounted, shallowReactive, watch } from "vue";
2
+ import { isClient } from "./env.mjs";
3
+ import { readStorage, removeStorage, writeStorage } from "./storage.mjs";
4
+ export const PREFERENCES_KEY = Symbol("k-preferences");
5
+ export const LOCAL_PREFERENCE_PREFIX = "k-pref:";
6
+ export function createLocalPreferenceStore(prefix = LOCAL_PREFERENCE_PREFIX) {
7
+ const cache = /* @__PURE__ */ new Map();
8
+ function parse(raw) {
9
+ if (raw === null) return void 0;
10
+ try {
11
+ return JSON.parse(raw);
12
+ } catch {
13
+ return void 0;
14
+ }
15
+ }
16
+ return {
17
+ clientOnly: true,
18
+ get(key) {
19
+ if (!isClient()) return void 0;
20
+ if (!cache.has(key)) cache.set(key, parse(readStorage(prefix + key)));
21
+ return cache.get(key);
22
+ },
23
+ set(key, value) {
24
+ if (!isClient()) return;
25
+ cache.set(key, value);
26
+ if (value === void 0) removeStorage(prefix + key);
27
+ else writeStorage(prefix + key, JSON.stringify(value));
28
+ },
29
+ subscribe(listener) {
30
+ if (!isClient()) return () => {
31
+ };
32
+ const onStorage = (event) => {
33
+ if (event.storageArea !== localStorage) return;
34
+ if (event.key === null) {
35
+ for (const key2 of [...cache.keys()]) {
36
+ cache.delete(key2);
37
+ listener(key2, void 0);
38
+ }
39
+ return;
40
+ }
41
+ if (!event.key.startsWith(prefix)) return;
42
+ const key = event.key.slice(prefix.length);
43
+ const value = parse(event.newValue);
44
+ cache.set(key, value);
45
+ listener(key, value);
46
+ };
47
+ window.addEventListener("storage", onStorage);
48
+ return () => window.removeEventListener("storage", onStorage);
49
+ }
50
+ };
51
+ }
52
+ export function createRemotePreferenceStore(options) {
53
+ let values = { ...options.initial };
54
+ let pending = {};
55
+ let timer;
56
+ const listeners = /* @__PURE__ */ new Set();
57
+ const delay = options.debounce ?? 0;
58
+ async function flush() {
59
+ clearTimeout(timer);
60
+ timer = void 0;
61
+ if (!Object.keys(pending).length) return;
62
+ const patch = pending;
63
+ pending = {};
64
+ try {
65
+ await options.save(patch);
66
+ } catch {
67
+ pending = { ...patch, ...pending };
68
+ }
69
+ }
70
+ if (isClient()) {
71
+ const flushHidden = () => {
72
+ if (document.visibilityState === "hidden") void flush();
73
+ };
74
+ document.addEventListener("visibilitychange", flushHidden);
75
+ window.addEventListener("pagehide", () => void flush());
76
+ }
77
+ return {
78
+ clientOnly: false,
79
+ get: (key) => values[key],
80
+ set(key, value) {
81
+ const next = { ...values };
82
+ if (value === void 0) delete next[key];
83
+ else next[key] = value;
84
+ values = next;
85
+ pending[key] = value === void 0 ? null : value;
86
+ if (!isClient()) return;
87
+ clearTimeout(timer);
88
+ timer = setTimeout(() => void flush(), delay);
89
+ },
90
+ subscribe(listener) {
91
+ listeners.add(listener);
92
+ return () => listeners.delete(listener);
93
+ },
94
+ snapshot: () => ({ ...values }),
95
+ replace(snapshot) {
96
+ const previous = values;
97
+ values = { ...snapshot };
98
+ pending = {};
99
+ clearTimeout(timer);
100
+ for (const key of /* @__PURE__ */ new Set([...Object.keys(previous), ...Object.keys(values)]))
101
+ if (previous[key] !== values[key])
102
+ for (const listener of listeners) listener(key, values[key]);
103
+ },
104
+ flush
105
+ };
106
+ }
107
+ export function createPreferences(store = createLocalPreferenceStore()) {
108
+ const versions = shallowReactive({});
109
+ const bump = (key) => {
110
+ versions[key] = (versions[key] ?? 0) + 1;
111
+ };
112
+ store.subscribe?.((key) => bump(key));
113
+ const preferences = {
114
+ store,
115
+ clientOnly: Boolean(store.clientOnly),
116
+ get(key) {
117
+ void versions[key];
118
+ return store.get(key);
119
+ },
120
+ set(key, value) {
121
+ if (store.get(key) === value) return;
122
+ store.set(key, value);
123
+ bump(key);
124
+ },
125
+ remove(key) {
126
+ preferences.set(key, void 0);
127
+ },
128
+ install(app) {
129
+ app.provide(PREFERENCES_KEY, preferences);
130
+ }
131
+ };
132
+ return preferences;
133
+ }
134
+ let localPreferences;
135
+ export function resolvePreferences() {
136
+ const injected = getCurrentInstance() ? inject(PREFERENCES_KEY, null) : null;
137
+ return injected ?? (localPreferences ??= createPreferences());
138
+ }
139
+ let hydrated = false;
140
+ export function whenPreferencesReady(preferences, callback) {
141
+ if (!preferences.clientOnly || hydrated) {
142
+ if (!preferences.clientOnly || isClient()) callback();
143
+ return;
144
+ }
145
+ if (getCurrentInstance())
146
+ onMounted(() => {
147
+ hydrated = true;
148
+ callback();
149
+ });
150
+ else if (isClient()) callback();
151
+ }
152
+ const bound = /* @__PURE__ */ new WeakMap();
153
+ export function bindPreference(preferences, key, target, isValid, fallback) {
154
+ const seen = bound.get(target) ?? /* @__PURE__ */ new WeakSet();
155
+ if (seen.has(preferences)) return;
156
+ seen.add(preferences);
157
+ bound.set(target, seen);
158
+ function apply() {
159
+ const stored = preferences.get(key);
160
+ if (isValid(stored)) {
161
+ if (stored !== target.value) target.value = stored;
162
+ } else if (stored === void 0 && isClient() && target.value !== fallback)
163
+ preferences.set(key, target.value);
164
+ }
165
+ if (!preferences.clientOnly) {
166
+ const stored = preferences.get(key);
167
+ if (isValid(stored) && stored !== target.value) target.value = stored;
168
+ }
169
+ whenPreferencesReady(preferences, () => {
170
+ apply();
171
+ if (!isClient()) return;
172
+ effectScope(true).run(() => {
173
+ watch(target, (value) => {
174
+ if (preferences.get(key) !== value) preferences.set(key, value);
175
+ });
176
+ watch(
177
+ () => preferences.get(key),
178
+ (value) => {
179
+ if (isValid(value) && value !== target.value) target.value = value;
180
+ }
181
+ );
182
+ });
183
+ });
184
+ }
@@ -1,9 +1,12 @@
1
1
  import { getCurrentInstance, inject } from "vue";
2
2
  import { PRESET_KEY } from "../keys.mjs";
3
3
  import { isThemePreset, PRESET_STORAGE_KEY } from "./preset-data.mjs";
4
+ import { bindPreference, resolvePreferences } from "./preferences.mjs";
4
5
  import { createStoredRef } from "./storage.mjs";
5
6
  let localStore;
6
7
  export function resolvePresetStore() {
7
8
  const injected = getCurrentInstance() ? inject(PRESET_KEY, null) : null;
8
- return injected ?? (localStore ??= createStoredRef(PRESET_STORAGE_KEY, isThemePreset, "default"));
9
+ const store = injected ?? (localStore ??= createStoredRef(PRESET_STORAGE_KEY, isThemePreset, "default"));
10
+ bindPreference(resolvePreferences(), "preset", store, isThemePreset, "default");
11
+ return store;
9
12
  }
@@ -1,6 +1,7 @@
1
1
  import { getCurrentInstance, inject, shallowRef } from "vue";
2
2
  import { THEME_KEY } from "../keys.mjs";
3
3
  import { DARK_SCHEME_QUERY, isClient } from "./env.mjs";
4
+ import { bindPreference, resolvePreferences } from "./preferences.mjs";
4
5
  import { createStoredRef } from "./storage.mjs";
5
6
  export const THEME_STORAGE_KEY = "k-theme";
6
7
  export const THEME_ORDER = ["system", "light", "dark"];
@@ -10,7 +11,9 @@ export function isThemePreference(value) {
10
11
  let localStore;
11
12
  export function resolveThemeStore() {
12
13
  const injected = getCurrentInstance() ? inject(THEME_KEY, null) : null;
13
- return injected ?? (localStore ??= createStoredRef(THEME_STORAGE_KEY, isThemePreference, "system"));
14
+ const store = injected ?? (localStore ??= createStoredRef(THEME_STORAGE_KEY, isThemePreference, "system"));
15
+ bindPreference(resolvePreferences(), "theme", store, isThemePreference, "system");
16
+ return store;
14
17
  }
15
18
  export const systemDark = shallowRef(false);
16
19
  let systemListening = false;
@@ -16,6 +16,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
16
16
  results?: (string | number) | undefined;
17
17
  placeholder?: string | undefined | undefined;
18
18
  dir?: string | undefined | undefined;
19
+ contextmenu?: string | undefined | undefined;
20
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
19
21
  class?: import("vue").ClassValue;
20
22
  role?: string | undefined | undefined;
21
23
  'aria-label'?: string | undefined | undefined;
@@ -169,11 +171,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
169
171
  ref_key?: string | undefined | undefined;
170
172
  accesskey?: string | undefined | undefined;
171
173
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
172
- contextmenu?: string | undefined | undefined;
173
174
  draggable?: (boolean | "true" | "false") | undefined;
174
175
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
175
176
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
176
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
177
177
  inert?: (boolean | "true" | "false") | undefined;
178
178
  spellcheck?: (boolean | "true" | "false") | undefined;
179
179
  translate?: "yes" | "no" | undefined | undefined;
@@ -215,6 +215,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
215
215
  results?: (string | number) | undefined;
216
216
  placeholder?: string | undefined | undefined;
217
217
  dir?: string | undefined | undefined;
218
+ contextmenu?: string | undefined | undefined;
219
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
218
220
  class?: import("vue").ClassValue;
219
221
  role?: string | undefined | undefined;
220
222
  'aria-label'?: string | undefined | undefined;
@@ -368,11 +370,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
368
370
  ref_key?: string | undefined | undefined;
369
371
  accesskey?: string | undefined | undefined;
370
372
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
371
- contextmenu?: string | undefined | undefined;
372
373
  draggable?: (boolean | "true" | "false") | undefined;
373
374
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
374
375
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
375
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
376
376
  inert?: (boolean | "true" | "false") | undefined;
377
377
  spellcheck?: (boolean | "true" | "false") | undefined;
378
378
  translate?: "yes" | "no" | undefined | undefined;
@@ -1,20 +1,55 @@
1
1
  import { inject, onMounted, ref, watch } from "vue";
2
- import { readStorage, writeStorage } from "../core/storage.mjs";
2
+ import { resolvePreferences } from "../core/preferences.mjs";
3
+ import { readStorage, removeStorage } from "../core/storage.mjs";
3
4
  export const STORAGE_KEY = Symbol("k-storage");
5
+ function isBoolean(value) {
6
+ return typeof value === "boolean";
7
+ }
8
+ function readLegacyBoolean(key) {
9
+ const stored = readStorage(key);
10
+ if (stored !== "true" && stored !== "false") return void 0;
11
+ removeStorage(key);
12
+ return stored === "true";
13
+ }
4
14
  export function usePersistedBoolean(initial, key) {
5
15
  const state = ref(initial);
6
16
  if (!key) return state;
17
+ const preferences = resolvePreferences();
18
+ const name = `shell:${key}`;
7
19
  const factory = inject(STORAGE_KEY, null);
8
- if (factory) {
9
- const stored = factory(key);
10
- if (typeof stored.value === "boolean") state.value = stored.value;
11
- watch(state, (value) => stored.value = value);
12
- return state;
20
+ const cookie = factory ? factory(key) : null;
21
+ function writeCookie(value) {
22
+ if (cookie && cookie.value !== value) cookie.value = value;
23
+ }
24
+ if (cookie && isBoolean(cookie.value)) state.value = cookie.value;
25
+ if (!preferences.clientOnly) {
26
+ const stored = preferences.get(name);
27
+ if (isBoolean(stored)) {
28
+ state.value = stored;
29
+ writeCookie(stored);
30
+ }
13
31
  }
14
32
  onMounted(() => {
15
- const stored = readStorage(key);
16
- if (stored === "true" || stored === "false") state.value = stored === "true";
17
- watch(state, (value) => writeStorage(key, String(value)));
33
+ const stored = preferences.get(name);
34
+ if (isBoolean(stored)) state.value = stored;
35
+ else {
36
+ const legacy = cookie ? isBoolean(cookie.value) ? cookie.value : void 0 : readLegacyBoolean(key);
37
+ if (legacy !== void 0) {
38
+ state.value = legacy;
39
+ preferences.set(name, legacy);
40
+ }
41
+ }
42
+ writeCookie(state.value);
43
+ watch(state, (value) => {
44
+ writeCookie(value);
45
+ if (preferences.get(name) !== value) preferences.set(name, value);
46
+ });
47
+ watch(
48
+ () => preferences.get(name),
49
+ (value) => {
50
+ if (isBoolean(value) && value !== state.value) state.value = value;
51
+ }
52
+ );
18
53
  });
19
54
  return state;
20
55
  }
@@ -40,6 +40,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
40
40
  results?: (string | number) | undefined;
41
41
  placeholder?: string | undefined | undefined;
42
42
  dir?: string | undefined | undefined;
43
+ contextmenu?: string | undefined | undefined;
44
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
43
45
  class?: import("vue").ClassValue;
44
46
  role?: string | undefined | undefined;
45
47
  'aria-label'?: string | undefined | undefined;
@@ -194,11 +196,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
194
196
  ref_key?: string | undefined | undefined;
195
197
  accesskey?: string | undefined | undefined;
196
198
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
197
- contextmenu?: string | undefined | undefined;
198
199
  draggable?: (boolean | "true" | "false") | undefined;
199
200
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
200
201
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
201
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
202
202
  inert?: (boolean | "true" | "false") | undefined;
203
203
  spellcheck?: (boolean | "true" | "false") | undefined;
204
204
  translate?: "yes" | "no" | undefined | undefined;
@@ -253,6 +253,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
253
253
  results?: (string | number) | undefined;
254
254
  placeholder?: string | undefined | undefined;
255
255
  dir?: string | undefined | undefined;
256
+ contextmenu?: string | undefined | undefined;
257
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
256
258
  class?: import("vue").ClassValue;
257
259
  role?: string | undefined | undefined;
258
260
  'aria-label'?: string | undefined | undefined;
@@ -407,11 +409,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
407
409
  ref_key?: string | undefined | undefined;
408
410
  accesskey?: string | undefined | undefined;
409
411
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
410
- contextmenu?: string | undefined | undefined;
411
412
  draggable?: (boolean | "true" | "false") | undefined;
412
413
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
413
414
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
414
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
415
415
  inert?: (boolean | "true" | "false") | undefined;
416
416
  spellcheck?: (boolean | "true" | "false") | undefined;
417
417
  translate?: "yes" | "no" | undefined | undefined;
@@ -21,6 +21,8 @@ declare const __VLS_export: import("vue").DefineComponent<{
21
21
  results?: (string | number) | undefined;
22
22
  placeholder?: string | undefined | undefined;
23
23
  dir?: string | undefined | undefined;
24
+ contextmenu?: string | undefined | undefined;
25
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
24
26
  class?: import("vue").ClassValue;
25
27
  role?: string | undefined | undefined;
26
28
  'aria-label'?: string | undefined | undefined;
@@ -173,11 +175,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
173
175
  ref_key?: string | undefined | undefined;
174
176
  accesskey?: string | undefined | undefined;
175
177
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
176
- contextmenu?: string | undefined | undefined;
177
178
  draggable?: (boolean | "true" | "false") | undefined;
178
179
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
179
180
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
180
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
181
181
  inert?: (boolean | "true" | "false") | undefined;
182
182
  spellcheck?: (boolean | "true" | "false") | undefined;
183
183
  translate?: "yes" | "no" | undefined | undefined;
@@ -233,6 +233,8 @@ declare const __VLS_export: import("vue").DefineComponent<{
233
233
  results?: (string | number) | undefined;
234
234
  placeholder?: string | undefined | undefined;
235
235
  dir?: string | undefined | undefined;
236
+ contextmenu?: string | undefined | undefined;
237
+ hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
236
238
  class?: import("vue").ClassValue;
237
239
  role?: string | undefined | undefined;
238
240
  'aria-label'?: string | undefined | undefined;
@@ -385,11 +387,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
385
387
  ref_key?: string | undefined | undefined;
386
388
  accesskey?: string | undefined | undefined;
387
389
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
388
- contextmenu?: string | undefined | undefined;
389
390
  draggable?: (boolean | "true" | "false") | undefined;
390
391
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
391
392
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
392
- hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
393
393
  inert?: (boolean | "true" | "false") | undefined;
394
394
  spellcheck?: (boolean | "true" | "false") | undefined;
395
395
  translate?: "yes" | "no" | undefined | undefined;
@@ -13,6 +13,8 @@ declare const __VLS_export: import("vue").DefineComponent<{
13
13
  description?: string;
14
14
  flush?: boolean;
15
15
  dir?: string | undefined;
16
+ contextmenu?: string | undefined;
17
+ hidden?: (boolean | "true" | "false") | "" | "hidden" | "until-found" | undefined;
16
18
  class?: import("vue").ClassValue;
17
19
  role?: string | undefined;
18
20
  'aria-label'?: string | undefined;
@@ -168,11 +170,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
168
170
  ref_key?: string | undefined | undefined;
169
171
  accesskey?: string | undefined;
170
172
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
171
- contextmenu?: string | undefined;
172
173
  draggable?: (boolean | "true" | "false") | undefined;
173
174
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
174
175
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
175
- hidden?: (boolean | "true" | "false") | "" | "hidden" | "until-found" | undefined;
176
176
  inert?: (boolean | "true" | "false") | undefined;
177
177
  spellcheck?: (boolean | "true" | "false") | undefined;
178
178
  translate?: "yes" | "no" | undefined;
@@ -236,6 +236,8 @@ declare const __VLS_export: import("vue").DefineComponent<{
236
236
  description?: string;
237
237
  flush?: boolean;
238
238
  dir?: string | undefined;
239
+ contextmenu?: string | undefined;
240
+ hidden?: (boolean | "true" | "false") | "" | "hidden" | "until-found" | undefined;
239
241
  class?: import("vue").ClassValue;
240
242
  role?: string | undefined;
241
243
  'aria-label'?: string | undefined;
@@ -391,11 +393,9 @@ declare const __VLS_export: import("vue").DefineComponent<{
391
393
  ref_key?: string | undefined | undefined;
392
394
  accesskey?: string | undefined;
393
395
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
394
- contextmenu?: string | undefined;
395
396
  draggable?: (boolean | "true" | "false") | undefined;
396
397
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
397
398
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
398
- hidden?: (boolean | "true" | "false") | "" | "hidden" | "until-found" | undefined;
399
399
  inert?: (boolean | "true" | "false") | undefined;
400
400
  spellcheck?: (boolean | "true" | "false") | undefined;
401
401
  translate?: "yes" | "no" | undefined;
@@ -292,7 +292,8 @@ export const de = {
292
292
  of: "von",
293
293
  first: "Erste Seite",
294
294
  last: "Letzte Seite",
295
- jump: "Gehe zu Seite"
295
+ jump: "Gehe zu Seite",
296
+ all: "Alle"
296
297
  },
297
298
  passwordInput: {
298
299
  show: "Passwort anzeigen",
@@ -292,7 +292,8 @@ export const en = {
292
292
  of: "of",
293
293
  first: "First page",
294
294
  last: "Last page",
295
- jump: "Go to page"
295
+ jump: "Go to page",
296
+ all: "All"
296
297
  },
297
298
  passwordInput: {
298
299
  show: "Show password",
@@ -292,7 +292,8 @@ export const it = {
292
292
  of: "di",
293
293
  first: "Prima pagina",
294
294
  last: "Ultima pagina",
295
- jump: "Vai alla pagina"
295
+ jump: "Vai alla pagina",
296
+ all: "Tutte"
296
297
  },
297
298
  passwordInput: {
298
299
  show: "Mostra password",
@@ -291,6 +291,7 @@ export interface KMessages {
291
291
  first: string;
292
292
  last: string;
293
293
  jump: string;
294
+ all: string;
294
295
  };
295
296
  passwordInput: {
296
297
  show: string;
@@ -22,6 +22,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
22
22
  readonly placeholder?: string | undefined | undefined;
23
23
  readonly bind?: Record<string, unknown> | undefined;
24
24
  readonly dir?: string | undefined | undefined;
25
+ readonly contextmenu?: string | undefined | undefined;
26
+ readonly hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
25
27
  readonly class?: import("vue").ClassValue;
26
28
  readonly role?: string | undefined | undefined;
27
29
  readonly 'aria-label'?: string | undefined | undefined;
@@ -180,11 +182,9 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
180
182
  readonly ref_key?: string | undefined;
181
183
  readonly accesskey?: string | undefined | undefined;
182
184
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
183
- readonly contextmenu?: string | undefined | undefined;
184
185
  readonly draggable?: (boolean | "true" | "false") | undefined;
185
186
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
186
187
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
187
- readonly hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
188
188
  readonly inert?: (boolean | "true" | "false") | undefined;
189
189
  readonly spellcheck?: (boolean | "true" | "false") | undefined;
190
190
  readonly translate?: "yes" | "no" | undefined | undefined;
@@ -240,6 +240,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
240
240
  readonly placeholder?: string | undefined | undefined;
241
241
  readonly bind?: Record<string, unknown> | undefined;
242
242
  readonly dir?: string | undefined | undefined;
243
+ readonly contextmenu?: string | undefined | undefined;
244
+ readonly hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
243
245
  readonly class?: import("vue").ClassValue;
244
246
  readonly role?: string | undefined | undefined;
245
247
  readonly 'aria-label'?: string | undefined | undefined;
@@ -398,11 +400,9 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
398
400
  readonly ref_key?: string | undefined;
399
401
  readonly accesskey?: string | undefined | undefined;
400
402
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
401
- readonly contextmenu?: string | undefined | undefined;
402
403
  readonly draggable?: (boolean | "true" | "false") | undefined;
403
404
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
404
405
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
405
- readonly hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
406
406
  readonly inert?: (boolean | "true" | "false") | undefined;
407
407
  readonly spellcheck?: (boolean | "true" | "false") | undefined;
408
408
  readonly translate?: "yes" | "no" | undefined | undefined;
@@ -22,6 +22,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
22
22
  readonly placeholder?: string | undefined | undefined;
23
23
  readonly bind?: Record<string, unknown> | undefined;
24
24
  readonly dir?: string | undefined | undefined;
25
+ readonly contextmenu?: string | undefined | undefined;
26
+ readonly hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
25
27
  readonly class?: import("vue").ClassValue;
26
28
  readonly role?: string | undefined | undefined;
27
29
  readonly 'aria-label'?: string | undefined | undefined;
@@ -180,11 +182,9 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
180
182
  readonly ref_key?: string | undefined;
181
183
  readonly accesskey?: string | undefined | undefined;
182
184
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
183
- readonly contextmenu?: string | undefined | undefined;
184
185
  readonly draggable?: (boolean | "true" | "false") | undefined;
185
186
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
186
187
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
187
- readonly hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
188
188
  readonly inert?: (boolean | "true" | "false") | undefined;
189
189
  readonly spellcheck?: (boolean | "true" | "false") | undefined;
190
190
  readonly translate?: "yes" | "no" | undefined | undefined;
@@ -240,6 +240,8 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
240
240
  readonly placeholder?: string | undefined | undefined;
241
241
  readonly bind?: Record<string, unknown> | undefined;
242
242
  readonly dir?: string | undefined | undefined;
243
+ readonly contextmenu?: string | undefined | undefined;
244
+ readonly hidden?: "" | "hidden" | (boolean | "true" | "false") | "until-found" | undefined;
243
245
  readonly class?: import("vue").ClassValue;
244
246
  readonly role?: string | undefined | undefined;
245
247
  readonly 'aria-label'?: string | undefined | undefined;
@@ -398,11 +400,9 @@ declare const __VLS_base: import("vue").DefineComponent<Partial<NonNullable<{
398
400
  readonly ref_key?: string | undefined;
399
401
  readonly accesskey?: string | undefined | undefined;
400
402
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
401
- readonly contextmenu?: string | undefined | undefined;
402
403
  readonly draggable?: (boolean | "true" | "false") | undefined;
403
404
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
404
405
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
405
- readonly hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
406
406
  readonly inert?: (boolean | "true" | "false") | undefined;
407
407
  readonly spellcheck?: (boolean | "true" | "false") | undefined;
408
408
  readonly translate?: "yes" | "no" | undefined | undefined;