@xleddyl/443-components-vue 0.0.0 → 0.2.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 (214) hide show
  1. package/README.md +81 -20
  2. package/dist/chart/BarChart.vue.d.ts +6 -6
  3. package/dist/chart/ChartLegend.vue.d.ts +16 -16
  4. package/dist/chart/ChartPanel.vue +10 -6
  5. package/dist/chart/ChartPanel.vue.d.ts +6 -8
  6. package/dist/chart/ChartSummary.vue.d.ts +6 -6
  7. package/dist/chart/DoughnutChart.vue.d.ts +6 -6
  8. package/dist/chart/LineChart.vue.d.ts +6 -6
  9. package/dist/components/core/Button.vue +3 -1
  10. package/dist/components/core/Button.vue.d.ts +6 -6
  11. package/dist/components/core/FormField.vue.d.ts +6 -6
  12. package/dist/components/core/Icon.vue +9 -1
  13. package/dist/components/core/Icon.vue.d.ts +4 -4
  14. package/dist/components/core/Input.vue +6 -3
  15. package/dist/components/core/Input.vue.d.ts +18 -19
  16. package/dist/components/core/Kbd.vue.d.ts +6 -6
  17. package/dist/components/core/Root.vue.d.ts +10 -10
  18. package/dist/components/core/Spinner.vue +7 -3
  19. package/dist/components/core/Spinner.vue.d.ts +6 -7
  20. package/dist/components/core/Textarea.vue +36 -23
  21. package/dist/components/core/Textarea.vue.d.ts +31 -21
  22. package/dist/components/core/VisuallyHidden.vue.d.ts +10 -10
  23. package/dist/components/data/Avatar.vue +4 -2
  24. package/dist/components/data/Avatar.vue.d.ts +6 -6
  25. package/dist/components/data/AvatarGroup.vue +5 -2
  26. package/dist/components/data/AvatarGroup.vue.d.ts +7 -8
  27. package/dist/components/data/Badge.vue.d.ts +6 -6
  28. package/dist/components/data/DescriptionList.vue +7 -3
  29. package/dist/components/data/DescriptionList.vue.d.ts +7 -8
  30. package/dist/components/data/FilterPills.vue +13 -4
  31. package/dist/components/data/FilterPills.vue.d.ts +16 -18
  32. package/dist/components/data/Pagination.vue +23 -14
  33. package/dist/components/data/Pagination.vue.d.ts +16 -23
  34. package/dist/components/data/Stat.vue +9 -6
  35. package/dist/components/data/Stat.vue.d.ts +10 -13
  36. package/dist/components/data/Table.vue +12 -7
  37. package/dist/components/data/Tag.vue +7 -4
  38. package/dist/components/data/Tag.vue.d.ts +16 -17
  39. package/dist/components/data/Timeline.vue.d.ts +6 -6
  40. package/dist/components/data/Tree.vue +5 -2
  41. package/dist/components/data/Tree.vue.d.ts +16 -17
  42. package/dist/components/feedback/Alert.vue +5 -2
  43. package/dist/components/feedback/Alert.vue.d.ts +14 -15
  44. package/dist/components/feedback/EmptyState.vue.d.ts +7 -7
  45. package/dist/components/feedback/LoadingOverlay.vue +8 -4
  46. package/dist/components/feedback/LoadingOverlay.vue.d.ts +6 -7
  47. package/dist/components/feedback/Meter.vue.d.ts +6 -6
  48. package/dist/components/feedback/Progress.vue +6 -3
  49. package/dist/components/feedback/Progress.vue.d.ts +6 -7
  50. package/dist/components/feedback/ProgressRing.vue +5 -2
  51. package/dist/components/feedback/ProgressRing.vue.d.ts +6 -7
  52. package/dist/components/feedback/Skeleton.vue.d.ts +6 -6
  53. package/dist/components/forms/Calendar.vue +16 -11
  54. package/dist/components/forms/Calendar.vue.d.ts +17 -21
  55. package/dist/components/forms/ColorInput.vue +8 -4
  56. package/dist/components/forms/ColorInput.vue.d.ts +18 -20
  57. package/dist/components/forms/Combobox.vue +31 -19
  58. package/dist/components/forms/Combobox.vue.d.ts +2 -2
  59. package/dist/components/forms/DateInput.vue.d.ts +16 -16
  60. package/dist/components/forms/DatePicker.vue +17 -11
  61. package/dist/components/forms/DatePicker.vue.d.ts +14 -18
  62. package/dist/components/forms/FileInput.vue +23 -13
  63. package/dist/components/forms/FileInput.vue.d.ts +17 -23
  64. package/dist/components/forms/InputAddon.vue.d.ts +6 -6
  65. package/dist/components/forms/InputGroup.vue.d.ts +6 -6
  66. package/dist/components/forms/NumberInput.vue +15 -10
  67. package/dist/components/forms/NumberInput.vue.d.ts +16 -19
  68. package/dist/components/forms/PasswordInput.vue +21 -13
  69. package/dist/components/forms/PasswordInput.vue.d.ts +14 -20
  70. package/dist/components/forms/PinInput.vue +7 -2
  71. package/dist/components/forms/PinInput.vue.d.ts +18 -16
  72. package/dist/components/forms/Radio.vue.d.ts +6 -6
  73. package/dist/components/forms/Slider.vue.d.ts +18 -18
  74. package/dist/components/forms/Switch.vue.d.ts +16 -16
  75. package/dist/components/forms/TimeInput.vue.d.ts +16 -16
  76. package/dist/components/layout/Accordion.vue.d.ts +16 -16
  77. package/dist/components/layout/AppShell.vue +11 -6
  78. package/dist/components/layout/AppShell.vue.d.ts +16 -19
  79. package/dist/components/layout/Breadcrumbs.vue +5 -2
  80. package/dist/components/layout/Breadcrumbs.vue.d.ts +6 -7
  81. package/dist/components/layout/Card.vue.d.ts +8 -8
  82. package/dist/components/layout/CopyButton.vue +11 -6
  83. package/dist/components/layout/CopyButton.vue.d.ts +16 -18
  84. package/dist/components/layout/Grid.vue.d.ts +7 -7
  85. package/dist/components/layout/NavLink.vue.d.ts +10 -10
  86. package/dist/components/layout/PageHeader.vue.d.ts +6 -6
  87. package/dist/components/layout/Separator.vue.d.ts +6 -6
  88. package/dist/components/layout/Sidebar.vue +10 -5
  89. package/dist/components/layout/Sidebar.vue.d.ts +7 -11
  90. package/dist/components/layout/SidebarSection.vue.d.ts +6 -6
  91. package/dist/components/layout/Stack.vue.d.ts +10 -10
  92. package/dist/components/layout/Tabs.vue.d.ts +16 -16
  93. package/dist/components/layout/ThemeSwitch.vue +12 -6
  94. package/dist/components/layout/ThemeSwitch.vue.d.ts +6 -7
  95. package/dist/components/layout/Toolbar.vue.d.ts +6 -6
  96. package/dist/components/overlays/CommandPalette.vue +38 -24
  97. package/dist/components/overlays/CommandPalette.vue.d.ts +18 -30
  98. package/dist/components/overlays/ConfirmDialog.vue +14 -9
  99. package/dist/components/overlays/ConfirmDialog.vue.d.ts +12 -15
  100. package/dist/components/overlays/ConfirmHost.vue +6 -3
  101. package/dist/components/overlays/ConfirmHost.vue.d.ts +16 -16
  102. package/dist/components/overlays/ContextMenu.vue +6 -3
  103. package/dist/components/overlays/ContextMenu.vue.d.ts +11 -13
  104. package/dist/components/overlays/Drawer.vue +1 -1
  105. package/dist/components/overlays/Drawer.vue.d.ts +10 -11
  106. package/dist/components/overlays/DropdownMenu.vue.d.ts +10 -10
  107. package/dist/components/overlays/HoverCard.vue.d.ts +16 -16
  108. package/dist/components/overlays/Modal.vue +1 -1
  109. package/dist/components/overlays/Modal.vue.d.ts +10 -11
  110. package/dist/components/overlays/OverlayHost.vue.d.ts +1 -1
  111. package/dist/components/overlays/Popover.vue.d.ts +16 -16
  112. package/dist/components/overlays/Toaster.vue +8 -4
  113. package/dist/components/overlays/Toaster.vue.d.ts +8 -10
  114. package/dist/components/overlays/Tooltip.vue.d.ts +6 -6
  115. package/dist/components/templates/AccountMenu.vue +5 -2
  116. package/dist/components/templates/AccountMenu.vue.d.ts +18 -19
  117. package/dist/components/templates/AppearanceSettings.vue +26 -12
  118. package/dist/components/templates/AppearanceSettings.vue.d.ts +7 -11
  119. package/dist/components/templates/AuthLayout.vue +11 -7
  120. package/dist/components/templates/AuthLayout.vue.d.ts +6 -9
  121. package/dist/components/templates/Brand.vue.d.ts +10 -10
  122. package/dist/components/templates/DashboardLayout.vue +25 -16
  123. package/dist/components/templates/DashboardLayout.vue.d.ts +12 -24
  124. package/dist/components/templates/DashboardPage.vue +7 -3
  125. package/dist/components/templates/DashboardPage.vue.d.ts +6 -7
  126. package/dist/components/templates/DetailPage.vue +14 -8
  127. package/dist/components/templates/DetailPage.vue.d.ts +14 -18
  128. package/dist/components/templates/EmptyPage.vue +15 -8
  129. package/dist/components/templates/EmptyPage.vue.d.ts +7 -11
  130. package/dist/components/templates/ErrorPage.vue +32 -25
  131. package/dist/components/templates/ErrorPage.vue.d.ts +6 -6
  132. package/dist/components/templates/FormPage.vue +19 -11
  133. package/dist/components/templates/FormPage.vue.d.ts +3 -3
  134. package/dist/components/templates/ListPage.vue +39 -23
  135. package/dist/components/templates/ListPage.vue.d.ts +2 -2
  136. package/dist/components/templates/NotFoundPage.vue +4 -4
  137. package/dist/components/templates/NotFoundPage.vue.d.ts +1 -1
  138. package/dist/components/templates/SaveBar.vue +20 -11
  139. package/dist/components/templates/SaveBar.vue.d.ts +16 -19
  140. package/dist/components/templates/SettingsGroup.vue.d.ts +7 -7
  141. package/dist/components/templates/SettingsModal.vue +29 -21
  142. package/dist/components/templates/SettingsModal.vue.d.ts +15 -25
  143. package/dist/components/templates/SettingsPage.vue +8 -5
  144. package/dist/components/templates/SettingsPage.vue.d.ts +18 -21
  145. package/dist/components/templates/SettingsSection.vue +7 -3
  146. package/dist/components/templates/SettingsSection.vue.d.ts +8 -9
  147. package/dist/composables/core.d.ts +1 -0
  148. package/dist/composables/core.mjs +1 -0
  149. package/dist/composables/useAlert.mjs +3 -1
  150. package/dist/composables/useConfirm.mjs +5 -3
  151. package/dist/composables/useDirtyGuard.mjs +7 -5
  152. package/dist/composables/useForm.d.ts +4 -1
  153. package/dist/composables/useForm.mjs +33 -16
  154. package/dist/composables/useIcons.d.ts +4 -0
  155. package/dist/composables/useIcons.mjs +10 -0
  156. package/dist/composables/useLocale.d.ts +11 -0
  157. package/dist/composables/useLocale.mjs +26 -0
  158. package/dist/composables/usePasswordStrength.mjs +11 -7
  159. package/dist/composables/usePrompt.mjs +3 -1
  160. package/dist/editor/RichTextEditor.vue +20 -14
  161. package/dist/editor/RichTextEditor.vue.d.ts +22 -15
  162. package/dist/editor/index.d.ts +0 -1
  163. package/dist/editor/index.mjs +0 -1
  164. package/dist/editor/types.d.ts +3 -18
  165. package/dist/grid/DataGrid.vue +11 -2
  166. package/dist/grid/GridToolbar.vue +6 -2
  167. package/dist/grid/GridToolbar.vue.d.ts +21 -20
  168. package/dist/grid/cells/BadgeCell.vue.d.ts +6 -6
  169. package/dist/grid/cells/BooleanCell.vue +5 -2
  170. package/dist/grid/cells/BooleanCell.vue.d.ts +6 -6
  171. package/dist/grid/cells/DateCell.vue +4 -1
  172. package/dist/grid/cells/DateCell.vue.d.ts +6 -6
  173. package/dist/grid/cells/ImageCell.vue.d.ts +6 -6
  174. package/dist/grid/cells/LinkCell.vue.d.ts +6 -6
  175. package/dist/grid/index.d.ts +0 -1
  176. package/dist/grid/index.mjs +0 -1
  177. package/dist/grid/types.d.ts +5 -17
  178. package/dist/icons/collections.d.ts +39 -0
  179. package/dist/icons/collections.mjs +67 -0
  180. package/dist/index.d.ts +4 -1
  181. package/dist/index.mjs +11 -1
  182. package/dist/internal/feedback/LoadingHost.vue +6 -3
  183. package/dist/internal/feedback/LoadingHost.vue.d.ts +0 -1
  184. package/dist/internal/forms/files.mjs +1 -1
  185. package/dist/internal/forms/standard-schema.d.ts +26 -0
  186. package/dist/internal/forms/standard-schema.mjs +21 -0
  187. package/dist/internal/keys.d.ts +4 -1
  188. package/dist/internal/keys.mjs +2 -0
  189. package/dist/internal/overlays/DialogFrame.vue +5 -2
  190. package/dist/internal/overlays/DialogFrame.vue.d.ts +14 -14
  191. package/dist/internal/overlays/MenuList.vue.d.ts +16 -16
  192. package/dist/internal/overlays/OverlayView.vue.d.ts +16 -16
  193. package/dist/internal/overlays/confirm.d.ts +3 -0
  194. package/dist/locale/en.d.ts +2 -0
  195. package/dist/locale/en.mjs +284 -0
  196. package/dist/locale/index.d.ts +16 -0
  197. package/dist/locale/index.mjs +50 -0
  198. package/dist/locale/it.d.ts +2 -0
  199. package/dist/locale/it.mjs +284 -0
  200. package/dist/locale/types.d.ts +292 -0
  201. package/dist/locale/types.mjs +0 -0
  202. package/dist/nuxt/module.d.ts +14 -0
  203. package/dist/nuxt/module.mjs +136 -8
  204. package/dist/nuxt/runtime/layouts/auth.vue.d.ts +16 -16
  205. package/dist/nuxt/runtime/layouts/dashboard.vue.d.ts +16 -16
  206. package/dist/nuxt/runtime/locale.d.ts +2 -0
  207. package/dist/nuxt/runtime/locale.mjs +20 -0
  208. package/dist/styles/core/icon.css +4 -0
  209. package/dist/styles/core/textarea.css +21 -0
  210. package/package.json +1 -1
  211. package/dist/editor/messages.d.ts +0 -2
  212. package/dist/editor/messages.mjs +0 -18
  213. package/dist/grid/messages.d.ts +0 -3
  214. package/dist/grid/messages.mjs +0 -21
@@ -17,7 +17,7 @@
17
17
  <EmptyState
18
18
  variant="plain"
19
19
  icon="exclamation-triangle"
20
- :title="errorTitle"
20
+ :title="errorText"
21
21
  :description="typeof error === 'string' ? error : void 0"
22
22
  :level="2"
23
23
  >
@@ -28,7 +28,7 @@
28
28
  size="sm"
29
29
  icon="arrow-path"
30
30
  @click="emit('retry')"
31
- >{{ retryLabel }}</Button
31
+ >{{ retryText }}</Button
32
32
  >
33
33
  </template>
34
34
  </EmptyState>
@@ -39,7 +39,7 @@
39
39
  <EmptyState
40
40
  class="k-list-empty"
41
41
  :icon="emptyIcon"
42
- :title="emptyTitle"
42
+ :title="emptyTitleText"
43
43
  :description="emptyDescription"
44
44
  :level="2"
45
45
  >
@@ -50,7 +50,7 @@
50
50
  </slot>
51
51
 
52
52
  <Card v-else class="k-list-card" padding="none">
53
- <div v-if="hasToolbar" class="k-list-toolbar" role="search" :aria-label="toolbarLabel">
53
+ <div v-if="hasToolbar" class="k-list-toolbar" role="search" :aria-label="toolbarText">
54
54
  <div class="k-list-toolbar-start">
55
55
  <Input
56
56
  v-if="searchable"
@@ -60,8 +60,8 @@
60
60
  size="sm"
61
61
  icon="magnifying-glass"
62
62
  clearable
63
- :placeholder="searchPlaceholder"
64
- :aria-label="searchLabel"
63
+ :placeholder="searchPlaceholderText"
64
+ :aria-label="searchLabelText"
65
65
  @update:model-value="(value) => search = String(value ?? '')"
66
66
  />
67
67
  <FilterPills
@@ -81,7 +81,7 @@
81
81
  >
82
82
  <template v-if="selectable && selected.length">
83
83
  <span class="k-list-selection" aria-live="polite">{{
84
- selectedText(selected.length)
84
+ selectedLabel(selected.length)
85
85
  }}</span>
86
86
  <slot name="bulk" :selected="selected" :clear="() => selected = []" />
87
87
  </template>
@@ -119,13 +119,13 @@
119
119
  variant="plain"
120
120
  size="sm"
121
121
  icon="magnifying-glass"
122
- :title="noResultsTitle"
123
- :description="isFiltered ? noResultsDescription : void 0"
122
+ :title="noResultsTitleText"
123
+ :description="isFiltered ? noResultsDescriptionText : void 0"
124
124
  :level="2"
125
125
  >
126
126
  <template v-if="isFiltered" #actions>
127
127
  <Button size="sm" variant="soft" tone="neutral" @click="clearFilters">{{
128
- clearLabel
128
+ clearText
129
129
  }}</Button>
130
130
  </template>
131
131
  </EmptyState>
@@ -157,6 +157,7 @@
157
157
 
158
158
  <script setup>
159
159
  import { computed, useSlots, watch } from "vue";
160
+ import { useLocale } from "../../composables/useLocale";
160
161
  import Button from "../core/Button.vue";
161
162
  import { createCollator, readCell, sortRows } from "../../internal/data/rows";
162
163
  import { normalizeSearch } from "../../internal/core/text";
@@ -189,23 +190,38 @@ const props = defineProps({
189
190
  pageSizes: { type: Array, required: false, default: () => [10, 20, 50] },
190
191
  searchable: { type: Boolean, required: false },
191
192
  searchKeys: { type: Array, required: false },
192
- searchPlaceholder: { type: String, required: false, default: "Search" },
193
- searchLabel: { type: String, required: false, default: "Search" },
193
+ searchPlaceholder: { type: String, required: false },
194
+ searchLabel: { type: String, required: false },
194
195
  filters: { type: Array, required: false },
195
196
  filterKey: { type: String, required: false },
196
197
  filterMultiple: { type: Boolean, required: false, default: true },
197
- filterLabel: { type: String, required: false, default: "Filters" },
198
- toolbarLabel: { type: String, required: false, default: "Filter results" },
199
- emptyTitle: { type: String, required: false, default: "Nothing here yet" },
198
+ filterLabel: { type: String, required: false },
199
+ toolbarLabel: { type: String, required: false },
200
+ emptyTitle: { type: String, required: false },
200
201
  emptyDescription: { type: String, required: false },
201
202
  emptyIcon: { type: null, required: false, default: "inbox" },
202
- noResultsTitle: { type: String, required: false, default: "No results" },
203
- noResultsDescription: { type: String, required: false, default: "Try a different search or clear the filters." },
204
- clearLabel: { type: String, required: false, default: "Clear filters" },
205
- errorTitle: { type: String, required: false, default: "Something went wrong" },
206
- retryLabel: { type: String, required: false, default: "Try again" },
207
- selectedText: { type: Function, required: false, default: (count) => `${count} selected` }
203
+ noResultsTitle: { type: String, required: false },
204
+ noResultsDescription: { type: String, required: false },
205
+ clearLabel: { type: String, required: false },
206
+ errorTitle: { type: String, required: false },
207
+ retryLabel: { type: String, required: false },
208
+ selectedText: { type: Function, required: false }
208
209
  });
210
+ const { locale, t } = useLocale();
211
+ const searchPlaceholderText = computed(() => props.searchPlaceholder ?? t("common.search"));
212
+ const searchLabelText = computed(() => props.searchLabel ?? t("common.search"));
213
+ const toolbarText = computed(() => props.toolbarLabel ?? t("listPage.toolbar"));
214
+ const emptyTitleText = computed(() => props.emptyTitle ?? t("listPage.emptyTitle"));
215
+ const noResultsTitleText = computed(() => props.noResultsTitle ?? t("common.noResults"));
216
+ const noResultsDescriptionText = computed(
217
+ () => props.noResultsDescription ?? t("listPage.noResultsDescription")
218
+ );
219
+ const clearText = computed(() => props.clearLabel ?? t("listPage.clearFilters"));
220
+ const errorText = computed(() => props.errorTitle ?? t("common.somethingWentWrong"));
221
+ const retryText = computed(() => props.retryLabel ?? t("common.retry"));
222
+ function selectedLabel(count) {
223
+ return props.selectedText ? props.selectedText(count) : t("common.selected", { count });
224
+ }
209
225
  const emit = defineEmits(["retry", "clear", "rowClick"]);
210
226
  defineSlots();
211
227
  const page = defineModel("page", { type: Number, ...{ default: 1 } });
@@ -254,9 +270,9 @@ const filtered = computed(() => {
254
270
  );
255
271
  });
256
272
  });
257
- const collator = createCollator();
273
+ const collator = computed(() => createCollator(locale.value.code));
258
274
  const sorted = computed(
259
- () => serverMode.value ? filtered.value : sortRows(filtered.value, sort.value, props.columns, collator)
275
+ () => serverMode.value ? filtered.value : sortRows(filtered.value, sort.value, props.columns, collator.value)
260
276
  );
261
277
  const resultTotal = computed(() => serverMode.value ? props.total ?? 0 : sorted.value.length);
262
278
  const visibleRows = computed(() => {
@@ -50,12 +50,12 @@ declare const __VLS_export: <T extends object>(__VLS_props: NonNullable<Awaited<
50
50
  selected?: RowKey[];
51
51
  }) & {
52
52
  onClear?: (() => any) | undefined;
53
+ onRetry?: (() => any) | undefined;
53
54
  "onUpdate:page"?: ((value: number) => any) | undefined;
54
55
  "onUpdate:pageSize"?: ((value: number) => any) | undefined;
55
56
  onRowClick?: ((row: T, index: number, event: MouseEvent) => any) | undefined;
56
57
  "onUpdate:sort"?: ((value: TableSort | null) => any) | undefined;
57
58
  "onUpdate:selected"?: ((value: RowKey[]) => any) | undefined;
58
- onRetry?: (() => any) | undefined;
59
59
  "onUpdate:search"?: ((value: string) => any) | undefined;
60
60
  "onUpdate:filter"?: ((value: string | number | (string | number)[] | null) => any) | undefined;
61
61
  } & Partial<import("vue").HTMLAttributes & import("vue").ReservedProps>> & (typeof globalThis extends {
@@ -100,7 +100,7 @@ declare const __VLS_export: <T extends object>(__VLS_props: NonNullable<Awaited<
100
100
  retry: () => void;
101
101
  }) => unknown;
102
102
  };
103
- emit: (((evt: "clear") => void) & ((evt: "rowClick", row: T, index: number, event: MouseEvent) => void) & ((evt: "retry") => void)) & (((event: "update:page", value: number) => void) & ((event: "update:pageSize", value: number) => void) & ((event: "update:sort", value: TableSort | null) => void) & ((event: "update:selected", value: RowKey[]) => void) & ((event: "update:search", value: string) => void) & ((event: "update:filter", value: string | number | (string | number)[] | null) => void));
103
+ emit: (((evt: "clear") => void) & ((evt: "retry") => void) & ((evt: "rowClick", row: T, index: number, event: MouseEvent) => void)) & (((event: "update:page", value: number) => void) & ((event: "update:pageSize", value: number) => void) & ((event: "update:sort", value: TableSort | null) => void) & ((event: "update:selected", value: RowKey[]) => void) & ((event: "update:search", value: string) => void) & ((event: "update:filter", value: string | number | (string | number)[] | null) => void));
104
104
  }>) => import("vue").VNode & {
105
105
  __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
106
106
  };
@@ -22,11 +22,11 @@
22
22
  <script setup>
23
23
  import ErrorPage from "./ErrorPage.vue";
24
24
  defineProps({
25
- title: { type: String, required: false, default: "Page not found" },
26
- message: { type: String, required: false, default: "The page you are looking for does not exist or has been moved." },
25
+ title: { type: String, required: false, default: void 0 },
26
+ message: { type: String, required: false, default: void 0 },
27
27
  homeTo: { type: [String, Object], required: false, default: "/" },
28
- homeLabel: { type: [String, Boolean], required: false, default: "Back to home" },
29
- backLabel: { type: [String, Boolean], required: false, default: "Go back" },
28
+ homeLabel: { type: [String, Boolean], required: false, default: void 0 },
29
+ backLabel: { type: [String, Boolean], required: false, default: void 0 },
30
30
  brandName: { type: String, required: false },
31
31
  brandIcon: { type: null, required: false },
32
32
  brandLogo: { type: String, required: false },
@@ -434,8 +434,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
434
434
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
435
435
  }> & Readonly<{}>, {
436
436
  fill: boolean;
437
- message: string;
438
437
  title: string;
438
+ message: string;
439
439
  backLabel: string | false;
440
440
  homeTo: LinkTarget;
441
441
  homeLabel: string | false;
@@ -1,27 +1,27 @@
1
1
  <template>
2
2
  <div class="k-savebar-slot" :class="{ 'is-visible': visible }">
3
- <p class="k-visually-hidden" role="status">{{ visible ? message : "" }}</p>
3
+ <p class="k-visually-hidden" role="status">{{ visible ? messageText : "" }}</p>
4
4
  <div
5
5
  v-if="visible"
6
6
  class="k-savebar"
7
7
  role="region"
8
- :aria-label="label"
8
+ :aria-label="labelText"
9
9
  :aria-busy="saving ? 'true' : void 0"
10
10
  >
11
11
  <span class="k-savebar-dot" aria-hidden="true" />
12
12
  <p class="k-savebar-message">
13
- <slot>{{ message }}</slot>
13
+ <slot>{{ messageText }}</slot>
14
14
  </p>
15
15
  <div class="k-savebar-actions">
16
16
  <slot name="actions">
17
17
  <Button
18
- v-if="discardLabel"
18
+ v-if="discardText"
19
19
  variant="ghost"
20
20
  tone="neutral"
21
21
  size="sm"
22
22
  :disabled="saving"
23
23
  @click="emit('discard')"
24
- >{{ discardLabel }}</Button
24
+ >{{ discardText }}</Button
25
25
  >
26
26
  <Button
27
27
  :type="form ? 'submit' : 'button'"
@@ -29,7 +29,7 @@
29
29
  size="sm"
30
30
  :loading="saving"
31
31
  @click="form ? void 0 : emit('save')"
32
- >{{ saveLabel }}</Button
32
+ >{{ saveText }}</Button
33
33
  >
34
34
  </slot>
35
35
  </div>
@@ -38,15 +38,24 @@
38
38
  </template>
39
39
 
40
40
  <script setup>
41
+ import { computed } from "vue";
42
+ import { useLocale } from "../../composables/useLocale";
41
43
  import Button from "../core/Button.vue";
42
- defineProps({
44
+ const props = defineProps({
43
45
  visible: { type: Boolean, required: false, default: true },
44
46
  saving: { type: Boolean, required: false },
45
- message: { type: String, required: false, default: "You have unsaved changes" },
46
- saveLabel: { type: String, required: false, default: "Save changes" },
47
- discardLabel: { type: [String, Boolean], required: false, default: "Discard" },
48
- label: { type: String, required: false, default: "Unsaved changes" },
47
+ message: { type: String, required: false },
48
+ saveLabel: { type: String, required: false },
49
+ discardLabel: { type: [String, Boolean], required: false, default: void 0 },
50
+ label: { type: String, required: false },
49
51
  form: { type: String, required: false }
50
52
  });
53
+ const { t } = useLocale();
54
+ const messageText = computed(() => props.message ?? t("saveBar.message"));
55
+ const saveText = computed(() => props.saveLabel ?? t("common.saveChanges"));
56
+ const labelText = computed(() => props.label ?? t("common.unsavedChanges"));
57
+ const discardText = computed(
58
+ () => props.discardLabel === void 0 ? t("common.discard") : props.discardLabel
59
+ );
51
60
  const emit = defineEmits(["save", "discard"]);
52
61
  </script>
@@ -13,14 +13,16 @@ declare const __VLS_base: import("vue").DefineComponent<{
13
13
  label?: string;
14
14
  form?: string;
15
15
  key?: PropertyKey | undefined;
16
- ref?: import("vue").VNodeRef | undefined;
16
+ prefix?: string | undefined | undefined;
17
+ title?: string | undefined | undefined;
18
+ style?: import("vue").StyleValue;
19
+ results?: (string | number) | undefined;
17
20
  placeholder?: string | undefined | undefined;
21
+ ref?: import("vue").VNodeRef | undefined;
18
22
  class?: import("vue").ClassValue;
19
23
  role?: string | undefined | undefined;
20
24
  'aria-label'?: string | undefined | undefined;
21
25
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
22
- style?: import("vue").StyleValue;
23
- title?: string | undefined | undefined;
24
26
  onCopy?: ((payload: ClipboardEvent) => void) | undefined;
25
27
  onCut?: ((payload: ClipboardEvent) => void) | undefined;
26
28
  onPaste?: ((payload: ClipboardEvent) => void) | undefined;
@@ -129,7 +131,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
129
131
  'aria-colindex'?: (string | number) | undefined;
130
132
  'aria-colspan'?: (string | number) | undefined;
131
133
  'aria-controls'?: string | undefined | undefined;
132
- 'aria-current'?: "location" | "time" | (boolean | "true" | "false") | "page" | "step" | "date" | undefined;
134
+ 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
133
135
  'aria-describedby'?: string | undefined | undefined;
134
136
  'aria-details'?: string | undefined | undefined;
135
137
  'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -138,7 +140,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
138
140
  'aria-expanded'?: (boolean | "true" | "false") | undefined;
139
141
  'aria-flowto'?: string | undefined | undefined;
140
142
  'aria-grabbed'?: (boolean | "true" | "false") | undefined;
141
- 'aria-haspopup'?: "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | "tree" | "grid" | undefined;
143
+ 'aria-haspopup'?: "grid" | "tree" | "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | undefined;
142
144
  'aria-invalid'?: (boolean | "true" | "false") | "grammar" | "spelling" | undefined;
143
145
  'aria-keyshortcuts'?: string | undefined | undefined;
144
146
  'aria-labelledby'?: string | undefined | undefined;
@@ -174,7 +176,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
174
176
  dir?: string | undefined | undefined;
175
177
  draggable?: (boolean | "true" | "false") | undefined;
176
178
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
177
- enterKeyHint?: "search" | "done" | "enter" | "go" | "next" | "previous" | "send" | undefined;
179
+ enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
178
180
  hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
179
181
  inert?: (boolean | "true" | "false") | undefined;
180
182
  spellcheck?: (boolean | "true" | "false") | undefined;
@@ -183,7 +185,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
183
185
  about?: string | undefined | undefined;
184
186
  datatype?: string | undefined | undefined;
185
187
  inlist?: any;
186
- prefix?: string | undefined | undefined;
187
188
  property?: string | undefined | undefined;
188
189
  resource?: string | undefined | undefined;
189
190
  typeof?: string | undefined | undefined;
@@ -196,7 +197,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
196
197
  itemtype?: string | undefined | undefined;
197
198
  itemid?: string | undefined | undefined;
198
199
  itemref?: string | undefined | undefined;
199
- results?: (string | number) | undefined;
200
200
  security?: string | undefined | undefined;
201
201
  unselectable?: "on" | "off" | undefined | undefined;
202
202
  inputmode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
@@ -216,14 +216,16 @@ declare const __VLS_base: import("vue").DefineComponent<{
216
216
  label?: string;
217
217
  form?: string;
218
218
  key?: PropertyKey | undefined;
219
- ref?: import("vue").VNodeRef | undefined;
219
+ prefix?: string | undefined | undefined;
220
+ title?: string | undefined | undefined;
221
+ style?: import("vue").StyleValue;
222
+ results?: (string | number) | undefined;
220
223
  placeholder?: string | undefined | undefined;
224
+ ref?: import("vue").VNodeRef | undefined;
221
225
  class?: import("vue").ClassValue;
222
226
  role?: string | undefined | undefined;
223
227
  'aria-label'?: string | undefined | undefined;
224
228
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
225
- style?: import("vue").StyleValue;
226
- title?: string | undefined | undefined;
227
229
  onCopy?: ((payload: ClipboardEvent) => void) | undefined;
228
230
  onCut?: ((payload: ClipboardEvent) => void) | undefined;
229
231
  onPaste?: ((payload: ClipboardEvent) => void) | undefined;
@@ -332,7 +334,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
332
334
  'aria-colindex'?: (string | number) | undefined;
333
335
  'aria-colspan'?: (string | number) | undefined;
334
336
  'aria-controls'?: string | undefined | undefined;
335
- 'aria-current'?: "location" | "time" | (boolean | "true" | "false") | "page" | "step" | "date" | undefined;
337
+ 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
336
338
  'aria-describedby'?: string | undefined | undefined;
337
339
  'aria-details'?: string | undefined | undefined;
338
340
  'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -341,7 +343,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
341
343
  'aria-expanded'?: (boolean | "true" | "false") | undefined;
342
344
  'aria-flowto'?: string | undefined | undefined;
343
345
  'aria-grabbed'?: (boolean | "true" | "false") | undefined;
344
- 'aria-haspopup'?: "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | "tree" | "grid" | undefined;
346
+ 'aria-haspopup'?: "grid" | "tree" | "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | undefined;
345
347
  'aria-invalid'?: (boolean | "true" | "false") | "grammar" | "spelling" | undefined;
346
348
  'aria-keyshortcuts'?: string | undefined | undefined;
347
349
  'aria-labelledby'?: string | undefined | undefined;
@@ -377,7 +379,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
377
379
  dir?: string | undefined | undefined;
378
380
  draggable?: (boolean | "true" | "false") | undefined;
379
381
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
380
- enterKeyHint?: "search" | "done" | "enter" | "go" | "next" | "previous" | "send" | undefined;
382
+ enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
381
383
  hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
382
384
  inert?: (boolean | "true" | "false") | undefined;
383
385
  spellcheck?: (boolean | "true" | "false") | undefined;
@@ -386,7 +388,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
386
388
  about?: string | undefined | undefined;
387
389
  datatype?: string | undefined | undefined;
388
390
  inlist?: any;
389
- prefix?: string | undefined | undefined;
390
391
  property?: string | undefined | undefined;
391
392
  resource?: string | undefined | undefined;
392
393
  typeof?: string | undefined | undefined;
@@ -399,7 +400,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
399
400
  itemtype?: string | undefined | undefined;
400
401
  itemid?: string | undefined | undefined;
401
402
  itemref?: string | undefined | undefined;
402
- results?: (string | number) | undefined;
403
403
  security?: string | undefined | undefined;
404
404
  unselectable?: "on" | "off" | undefined | undefined;
405
405
  inputmode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
@@ -411,10 +411,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
411
411
  onSave?: (() => any) | undefined;
412
412
  onDiscard?: (() => any) | undefined;
413
413
  }>, {
414
- message: string;
415
- label: string;
416
414
  visible: boolean;
417
- saveLabel: string;
418
415
  discardLabel: string | false;
419
416
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
420
417
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -22,7 +22,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
22
22
  dir?: string | undefined | undefined;
23
23
  draggable?: (boolean | "true" | "false") | undefined;
24
24
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
25
- enterKeyHint?: "search" | "done" | "enter" | "go" | "next" | "previous" | "send" | undefined;
25
+ enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
26
26
  hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
27
27
  id?: string | undefined | undefined;
28
28
  inert?: (boolean | "true" | "false") | undefined;
@@ -68,7 +68,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
68
68
  'aria-colindex'?: (string | number) | undefined;
69
69
  'aria-colspan'?: (string | number) | undefined;
70
70
  'aria-controls'?: string | undefined | undefined;
71
- 'aria-current'?: "location" | "time" | (boolean | "true" | "false") | "page" | "step" | "date" | undefined;
71
+ 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
72
72
  'aria-describedby'?: string | undefined | undefined;
73
73
  'aria-details'?: string | undefined | undefined;
74
74
  'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -77,7 +77,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
77
77
  'aria-expanded'?: (boolean | "true" | "false") | undefined;
78
78
  'aria-flowto'?: string | undefined | undefined;
79
79
  'aria-grabbed'?: (boolean | "true" | "false") | undefined;
80
- 'aria-haspopup'?: "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | "tree" | "grid" | undefined;
80
+ 'aria-haspopup'?: "grid" | "tree" | "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | undefined;
81
81
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
82
82
  'aria-invalid'?: (boolean | "true" | "false") | "grammar" | "spelling" | undefined;
83
83
  'aria-keyshortcuts'?: string | undefined | undefined;
@@ -219,7 +219,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
219
219
  dir?: string | undefined | undefined;
220
220
  draggable?: (boolean | "true" | "false") | undefined;
221
221
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
222
- enterKeyHint?: "search" | "done" | "enter" | "go" | "next" | "previous" | "send" | undefined;
222
+ enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
223
223
  hidden?: "" | (boolean | "true" | "false") | "hidden" | "until-found" | undefined;
224
224
  id?: string | undefined | undefined;
225
225
  inert?: (boolean | "true" | "false") | undefined;
@@ -265,7 +265,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
265
265
  'aria-colindex'?: (string | number) | undefined;
266
266
  'aria-colspan'?: (string | number) | undefined;
267
267
  'aria-controls'?: string | undefined | undefined;
268
- 'aria-current'?: "location" | "time" | (boolean | "true" | "false") | "page" | "step" | "date" | undefined;
268
+ 'aria-current'?: "page" | "location" | "time" | (boolean | "true" | "false") | "step" | "date" | undefined;
269
269
  'aria-describedby'?: string | undefined | undefined;
270
270
  'aria-details'?: string | undefined | undefined;
271
271
  'aria-disabled'?: (boolean | "true" | "false") | undefined;
@@ -274,7 +274,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
274
274
  'aria-expanded'?: (boolean | "true" | "false") | undefined;
275
275
  'aria-flowto'?: string | undefined | undefined;
276
276
  'aria-grabbed'?: (boolean | "true" | "false") | undefined;
277
- 'aria-haspopup'?: "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | "tree" | "grid" | undefined;
277
+ 'aria-haspopup'?: "grid" | "tree" | "dialog" | "menu" | (boolean | "true" | "false") | "listbox" | undefined;
278
278
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
279
279
  'aria-invalid'?: (boolean | "true" | "false") | "grammar" | "spelling" | undefined;
280
280
  'aria-keyshortcuts'?: string | undefined | undefined;
@@ -403,7 +403,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
403
403
  ref_for?: boolean | undefined | undefined;
404
404
  ref_key?: string | undefined | undefined;
405
405
  }> & Readonly<{}>, {
406
- level: 2 | 3 | 4;
406
+ level: 2 | 4 | 3;
407
407
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
408
408
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
409
409
  declare const _default: typeof __VLS_export;
@@ -6,21 +6,21 @@
6
6
  flush
7
7
  hide-close
8
8
  :sheet="false"
9
- :aria-label="title"
9
+ :aria-label="titleText"
10
10
  @open="emit('open')"
11
11
  @close="emit('close')"
12
12
  @after-leave="emit('afterLeave')"
13
13
  >
14
14
  <template #default="{ close }">
15
15
  <div class="k-settings-modal-frame">
16
- <nav class="k-settings-modal-nav" :aria-label="navLabel">
16
+ <nav class="k-settings-modal-nav" :aria-label="navText">
17
17
  <Button
18
18
  class="k-settings-modal-close"
19
19
  icon="x-mark"
20
20
  variant="ghost"
21
21
  tone="neutral"
22
22
  size="sm"
23
- :aria-label="closeLabel"
23
+ :aria-label="closeText"
24
24
  @click="close"
25
25
  />
26
26
  <div class="k-settings-modal-nav-list">
@@ -75,7 +75,7 @@
75
75
  <hr class="k-settings-modal-divider" />
76
76
  <button type="button" class="k-settings-modal-tab is-danger" @click="signOut">
77
77
  <Icon name="arrow-left-start-on-rectangle" />
78
- <span class="k-settings-modal-tab-label">{{ signOutLabel }}</span>
78
+ <span class="k-settings-modal-tab-label">{{ signOutText }}</span>
79
79
  </button>
80
80
  </template>
81
81
  </nav>
@@ -115,8 +115,8 @@
115
115
  <slot name="account-fields" :account="account" :close="close" />
116
116
  <SettingsGroup
117
117
  v-if="onSignOut"
118
- :label="sessionLabel"
119
- :description="sessionText"
118
+ :label="sessionLabelText"
119
+ :description="sessionDescriptionText"
120
120
  row
121
121
  >
122
122
  <template #actions>
@@ -127,7 +127,7 @@
127
127
  icon="arrow-left-start-on-rectangle"
128
128
  @click="signOut"
129
129
  >
130
- {{ signOutLabel }}
130
+ {{ signOutText }}
131
131
  </Button>
132
132
  </template>
133
133
  </SettingsGroup>
@@ -150,6 +150,7 @@
150
150
  <script setup>
151
151
  import { computed, useId } from "vue";
152
152
  import { THEME_PRESETS } from "../../composables/usePreset";
153
+ import { useLocale } from "../../composables/useLocale";
153
154
  import { useLinkResolver } from "../../internal/core/link";
154
155
  import Button from "../core/Button.vue";
155
156
  import Icon from "../core/Icon.vue";
@@ -162,16 +163,16 @@ const props = defineProps({
162
163
  sections: { type: Array, required: false, default: void 0 },
163
164
  account: { type: Object, required: false },
164
165
  presets: { type: [Array, Boolean], required: false, default: () => THEME_PRESETS },
165
- title: { type: String, required: false, default: "Settings" },
166
- closeLabel: { type: String, required: false, default: "Close settings" },
167
- navLabel: { type: String, required: false, default: "Settings sections" },
168
- signOutLabel: { type: String, required: false, default: "Sign out" },
169
- sessionLabel: { type: String, required: false, default: "Session" },
170
- sessionText: { type: String, required: false, default: "Sign out of this device." },
171
- accountLabel: { type: String, required: false, default: "Account" },
172
- accountText: { type: String, required: false, default: "Your profile and session." },
173
- appearanceLabel: { type: String, required: false, default: "Appearance" },
174
- appearanceText: { type: String, required: false, default: "Theme and style of the interface." },
166
+ title: { type: String, required: false },
167
+ closeLabel: { type: String, required: false },
168
+ navLabel: { type: String, required: false },
169
+ signOutLabel: { type: String, required: false },
170
+ sessionLabel: { type: String, required: false },
171
+ sessionText: { type: String, required: false },
172
+ accountLabel: { type: String, required: false },
173
+ accountText: { type: String, required: false },
174
+ appearanceLabel: { type: String, required: false },
175
+ appearanceText: { type: String, required: false },
175
176
  themeLabel: { type: String, required: false, default: void 0 },
176
177
  themeText: { type: String, required: false, default: void 0 },
177
178
  presetLabel: { type: String, required: false, default: void 0 },
@@ -182,6 +183,13 @@ defineSlots();
182
183
  const emit = defineEmits(["open", "close", "afterLeave"]);
183
184
  const open = defineModel("open", { type: Boolean, ...{ default: false } });
184
185
  const section = defineModel("section", { type: String });
186
+ const { t } = useLocale();
187
+ const titleText = computed(() => props.title ?? t("settings.title"));
188
+ const closeText = computed(() => props.closeLabel ?? t("settings.close"));
189
+ const navText = computed(() => props.navLabel ?? t("settings.sections"));
190
+ const signOutText = computed(() => props.signOutLabel ?? t("settings.signOut"));
191
+ const sessionLabelText = computed(() => props.sessionLabel ?? t("settings.session"));
192
+ const sessionDescriptionText = computed(() => props.sessionText ?? t("settings.sessionDescription"));
185
193
  const baseId = useId();
186
194
  const panelId = `${baseId}-panel`;
187
195
  const { resolveLink } = useLinkResolver();
@@ -191,15 +199,15 @@ const sectionList = computed(() => {
191
199
  if (props.account)
192
200
  list.push({
193
201
  id: "account",
194
- label: props.accountLabel,
202
+ label: props.accountLabel ?? t("account.label"),
195
203
  icon: "user-circle",
196
- description: props.accountText
204
+ description: props.accountText ?? t("settings.accountDescription")
197
205
  });
198
206
  list.push({
199
207
  id: "appearance",
200
- label: props.appearanceLabel,
208
+ label: props.appearanceLabel ?? t("settings.appearance"),
201
209
  icon: "sun",
202
- description: props.appearanceText
210
+ description: props.appearanceText ?? t("settings.appearanceDescription")
203
211
  });
204
212
  return list;
205
213
  });