From 2a70b197e9c0cd0a432be5fe0e54382f4b24ca97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Vila=C3=A7a=20de=20Jesus?= Date: Sat, 17 Oct 2026 11:58:24 -0300 Subject: [PATCH 1/3] chore: start #325 From deebb4da5e2cc1d7e9a49e437dbd7f52d3c81d70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Vila=C3=A7a=20de=20Jesus?= Date: Sat, 17 Oct 2026 12:07:51 -0300 Subject: [PATCH 2/3] feat(i18n): split the message catalog per group (#325) --- .changeset/i18n-per-group-catalog.md | 5 + AGENTS.md | 5 +- packages/ui/scripts/size-lib.ts | 71 ++++ packages/ui/scripts/size-limit.ts | 69 +--- packages/ui/size-limit.json | 4 +- .../ui/src/lib/charts/HeatmapChart.svelte | 5 +- .../ui/src/lib/components/Alert/Alert.svelte | 5 +- .../components/AlertDialog/AlertDialog.svelte | 5 +- .../src/lib/components/AppForm/AppForm.svelte | 5 +- .../src/lib/components/AppList/AppList.svelte | 5 +- .../components/AppSettings/AppSettings.svelte | 5 +- .../lib/components/AppShell/BottomNav.svelte | 5 +- .../src/lib/components/AppShell/Panel.svelte | 5 +- .../components/AppShell/PanelNavItem.svelte | 5 +- .../AppShell/PanelResizeHandle.svelte | 5 +- .../src/lib/components/AppShell/Rail.svelte | 5 +- .../components/AudioPlayer/AudioPlayer.svelte | 5 +- .../src/lib/components/Avatar/Avatar.svelte | 5 +- .../ui/src/lib/components/Badge/Badge.svelte | 5 +- .../components/Breadcrumb/Breadcrumb.svelte | 5 +- .../src/lib/components/Button/Button.svelte | 5 +- .../lib/components/Button/IconButton.svelte | 5 +- .../ui/src/lib/components/Chip/Chip.svelte | 5 +- .../components/CodeSnippet/CodeSnippet.svelte | 5 +- .../lib/components/Combobox/Combobox.svelte | 6 +- .../CommandPalette/CommandPalette.svelte | 5 +- .../ConversationItem/ConversationItem.svelte | 5 +- .../components/CopyButton/CopyButton.svelte | 5 +- .../lib/components/DataTable/DataTable.svelte | 5 +- .../DataTable/DataTableColumnToggle.svelte | 5 +- .../DataTable/DataTableFacetedFilter.svelte | 5 +- .../DataTable/DataTablePagination.svelte | 5 +- .../DataTable/DataTableToolbar.svelte | 5 +- .../src/lib/components/Date/Calendar.svelte | 5 +- .../lib/components/Date/CalendarBody.svelte | 5 +- .../src/lib/components/Date/DatePicker.svelte | 5 +- .../components/Date/DateRangePicker.svelte | 5 +- .../lib/components/Date/RangeCalendar.svelte | 5 +- .../src/lib/components/Dialog/Dialog.svelte | 5 +- .../ui/src/lib/components/Docs/Callout.svelte | 5 +- .../src/lib/components/Docs/CodeTabs.svelte | 5 +- .../ui/src/lib/components/Docs/DocsNav.svelte | 5 +- .../src/lib/components/Docs/DocsSearch.svelte | 5 +- .../src/lib/components/Docs/DocsShell.svelte | 5 +- .../components/Docs/TableOfContents.svelte | 5 +- .../src/lib/components/Drawer/Drawer.svelte | 5 +- .../lib/components/ErrorPage/ErrorPage.svelte | 5 +- .../components/ExportMenu/ExportMenu.svelte | 5 +- .../ExternalLink/ExternalLink.svelte | 5 +- .../components/FileUpload/FileUpload.svelte | 5 +- .../InstallPrompt/InstallPrompt.svelte | 5 +- .../src/lib/components/KpiCard/KpiCard.svelte | 5 +- .../lib/components/Lightbox/Lightbox.svelte | 5 +- .../lib/components/LiveList/LiveList.svelte | 5 +- .../LoadingBoundary/LoadingBoundary.svelte | 5 +- .../lib/components/MediaGrid/MediaGrid.svelte | 5 +- .../MessageBubble/MessageBubble.svelte | 5 +- .../components/MobilePane/MobilePane.svelte | 5 +- .../components/MotionStage/MotionStage.svelte | 5 +- .../NotificationBell/NotificationBell.svelte | 5 +- .../components/NumberField/NumberField.svelte | 5 +- .../components/Pagination/Pagination.svelte | 5 +- .../src/lib/components/Select/Select.svelte | 5 +- .../ui/src/lib/components/Sheet/Sheet.svelte | 5 +- .../components/SiteHeader/SiteHeader.svelte | 6 +- .../lib/components/SkipLink/SkipLink.svelte | 5 +- .../src/lib/components/Slider/Slider.svelte | 5 +- .../src/lib/components/Spinner/Spinner.svelte | 5 +- .../src/lib/components/Stepper/Stepper.svelte | 5 +- .../ui/src/lib/components/Table/Table.svelte | 5 +- .../components/ThemeToggle/ThemeToggle.svelte | 5 +- .../src/lib/components/Toast/ToastItem.svelte | 5 +- .../src/lib/components/Toast/Toaster.svelte | 5 +- .../components/VirtualList/VirtualList.svelte | 5 +- packages/ui/src/lib/forms/CepField.svelte | 5 +- packages/ui/src/lib/forms/PhoneField.svelte | 5 +- packages/ui/src/lib/i18n/all.ts | 120 +++++++ packages/ui/src/lib/i18n/catalog.ts | 114 ++++-- packages/ui/src/lib/i18n/en.ts | 337 ------------------ packages/ui/src/lib/i18n/groups/alert.ts | 10 + .../ui/src/lib/i18n/groups/alertDialog.ts | 12 + packages/ui/src/lib/i18n/groups/appForm.ts | 12 + packages/ui/src/lib/i18n/groups/appList.ts | 18 + .../ui/src/lib/i18n/groups/appSettings.ts | 12 + packages/ui/src/lib/i18n/groups/appShell.ts | 28 ++ .../ui/src/lib/i18n/groups/audioPlayer.ts | 24 ++ packages/ui/src/lib/i18n/groups/avatar.ts | 10 + packages/ui/src/lib/i18n/groups/badge.ts | 12 + packages/ui/src/lib/i18n/groups/breadcrumb.ts | 12 + packages/ui/src/lib/i18n/groups/button.ts | 12 + packages/ui/src/lib/i18n/groups/calendar.ts | 18 + packages/ui/src/lib/i18n/groups/charts.ts | 12 + packages/ui/src/lib/i18n/groups/chat.ts | 40 +++ packages/ui/src/lib/i18n/groups/chip.ts | 10 + .../ui/src/lib/i18n/groups/codeSnippet.ts | 14 + packages/ui/src/lib/i18n/groups/combobox.ts | 20 ++ .../ui/src/lib/i18n/groups/commandPalette.ts | 22 ++ packages/ui/src/lib/i18n/groups/common.ts | 30 ++ packages/ui/src/lib/i18n/groups/copyButton.ts | 14 + packages/ui/src/lib/i18n/groups/dataTable.ts | 34 ++ packages/ui/src/lib/i18n/groups/dialog.ts | 10 + packages/ui/src/lib/i18n/groups/docs.ts | 72 ++++ packages/ui/src/lib/i18n/groups/drawer.ts | 10 + packages/ui/src/lib/i18n/groups/errorPage.ts | 42 +++ packages/ui/src/lib/i18n/groups/exportMenu.ts | 18 + .../ui/src/lib/i18n/groups/externalLink.ts | 11 + packages/ui/src/lib/i18n/groups/fileUpload.ts | 14 + packages/ui/src/lib/i18n/groups/forms.ts | 14 + .../ui/src/lib/i18n/groups/installPrompt.ts | 20 ++ packages/ui/src/lib/i18n/groups/kit.ts | 10 + packages/ui/src/lib/i18n/groups/kpiCard.ts | 10 + packages/ui/src/lib/i18n/groups/lightbox.ts | 18 + packages/ui/src/lib/i18n/groups/liveList.ts | 24 ++ packages/ui/src/lib/i18n/groups/mediaGrid.ts | 22 ++ packages/ui/src/lib/i18n/groups/mobilePane.ts | 10 + .../ui/src/lib/i18n/groups/motionStage.ts | 12 + .../src/lib/i18n/groups/notificationBell.ts | 18 + .../ui/src/lib/i18n/groups/numberField.ts | 12 + packages/ui/src/lib/i18n/groups/pagination.ts | 12 + packages/ui/src/lib/i18n/groups/select.ts | 12 + packages/ui/src/lib/i18n/groups/sheet.ts | 12 + packages/ui/src/lib/i18n/groups/skipLink.ts | 10 + packages/ui/src/lib/i18n/groups/slider.ts | 10 + packages/ui/src/lib/i18n/groups/spinner.ts | 10 + packages/ui/src/lib/i18n/groups/stepper.ts | 13 + packages/ui/src/lib/i18n/groups/table.ts | 11 + .../ui/src/lib/i18n/groups/themeToggle.ts | 10 + packages/ui/src/lib/i18n/groups/toast.ts | 12 + .../ui/src/lib/i18n/groups/virtualList.ts | 18 + packages/ui/src/lib/i18n/index.ts | 12 +- packages/ui/src/lib/i18n/pt-BR.ts | 328 ----------------- packages/ui/src/lib/i18n/state.svelte.ts | 50 ++- packages/ui/src/lib/i18n/use-t.svelte.ts | 11 + .../ui/src/lib/kit/create-error-handler.ts | 5 +- packages/ui/src/lib/kit/error-html.ts | 5 +- .../ui/src/lib/kit/navigation-progress.svelte | 5 +- .../ui/src/lib/kit/use-breadcrumbs.svelte.ts | 5 +- .../ui/src/lib/utils/use-list-state.svelte.ts | 5 +- packages/ui/tests/i18n-register.test.ts | 3 +- packages/ui/tests/i18n-split.test.ts | 59 +++ packages/ui/tests/i18n.test.ts | 20 +- .../src/content/docs/getting-started/i18n.mdx | 2 +- 142 files changed, 1502 insertions(+), 943 deletions(-) create mode 100644 .changeset/i18n-per-group-catalog.md create mode 100644 packages/ui/scripts/size-lib.ts create mode 100644 packages/ui/src/lib/i18n/all.ts delete mode 100644 packages/ui/src/lib/i18n/en.ts create mode 100644 packages/ui/src/lib/i18n/groups/alert.ts create mode 100644 packages/ui/src/lib/i18n/groups/alertDialog.ts create mode 100644 packages/ui/src/lib/i18n/groups/appForm.ts create mode 100644 packages/ui/src/lib/i18n/groups/appList.ts create mode 100644 packages/ui/src/lib/i18n/groups/appSettings.ts create mode 100644 packages/ui/src/lib/i18n/groups/appShell.ts create mode 100644 packages/ui/src/lib/i18n/groups/audioPlayer.ts create mode 100644 packages/ui/src/lib/i18n/groups/avatar.ts create mode 100644 packages/ui/src/lib/i18n/groups/badge.ts create mode 100644 packages/ui/src/lib/i18n/groups/breadcrumb.ts create mode 100644 packages/ui/src/lib/i18n/groups/button.ts create mode 100644 packages/ui/src/lib/i18n/groups/calendar.ts create mode 100644 packages/ui/src/lib/i18n/groups/charts.ts create mode 100644 packages/ui/src/lib/i18n/groups/chat.ts create mode 100644 packages/ui/src/lib/i18n/groups/chip.ts create mode 100644 packages/ui/src/lib/i18n/groups/codeSnippet.ts create mode 100644 packages/ui/src/lib/i18n/groups/combobox.ts create mode 100644 packages/ui/src/lib/i18n/groups/commandPalette.ts create mode 100644 packages/ui/src/lib/i18n/groups/common.ts create mode 100644 packages/ui/src/lib/i18n/groups/copyButton.ts create mode 100644 packages/ui/src/lib/i18n/groups/dataTable.ts create mode 100644 packages/ui/src/lib/i18n/groups/dialog.ts create mode 100644 packages/ui/src/lib/i18n/groups/docs.ts create mode 100644 packages/ui/src/lib/i18n/groups/drawer.ts create mode 100644 packages/ui/src/lib/i18n/groups/errorPage.ts create mode 100644 packages/ui/src/lib/i18n/groups/exportMenu.ts create mode 100644 packages/ui/src/lib/i18n/groups/externalLink.ts create mode 100644 packages/ui/src/lib/i18n/groups/fileUpload.ts create mode 100644 packages/ui/src/lib/i18n/groups/forms.ts create mode 100644 packages/ui/src/lib/i18n/groups/installPrompt.ts create mode 100644 packages/ui/src/lib/i18n/groups/kit.ts create mode 100644 packages/ui/src/lib/i18n/groups/kpiCard.ts create mode 100644 packages/ui/src/lib/i18n/groups/lightbox.ts create mode 100644 packages/ui/src/lib/i18n/groups/liveList.ts create mode 100644 packages/ui/src/lib/i18n/groups/mediaGrid.ts create mode 100644 packages/ui/src/lib/i18n/groups/mobilePane.ts create mode 100644 packages/ui/src/lib/i18n/groups/motionStage.ts create mode 100644 packages/ui/src/lib/i18n/groups/notificationBell.ts create mode 100644 packages/ui/src/lib/i18n/groups/numberField.ts create mode 100644 packages/ui/src/lib/i18n/groups/pagination.ts create mode 100644 packages/ui/src/lib/i18n/groups/select.ts create mode 100644 packages/ui/src/lib/i18n/groups/sheet.ts create mode 100644 packages/ui/src/lib/i18n/groups/skipLink.ts create mode 100644 packages/ui/src/lib/i18n/groups/slider.ts create mode 100644 packages/ui/src/lib/i18n/groups/spinner.ts create mode 100644 packages/ui/src/lib/i18n/groups/stepper.ts create mode 100644 packages/ui/src/lib/i18n/groups/table.ts create mode 100644 packages/ui/src/lib/i18n/groups/themeToggle.ts create mode 100644 packages/ui/src/lib/i18n/groups/toast.ts create mode 100644 packages/ui/src/lib/i18n/groups/virtualList.ts delete mode 100644 packages/ui/src/lib/i18n/pt-BR.ts create mode 100644 packages/ui/src/lib/i18n/use-t.svelte.ts create mode 100644 packages/ui/tests/i18n-split.test.ts diff --git a/.changeset/i18n-per-group-catalog.md b/.changeset/i18n-per-group-catalog.md new file mode 100644 index 00000000..b6ada24d --- /dev/null +++ b/.changeset/i18n-per-group-catalog.md @@ -0,0 +1,5 @@ +--- +"@codeatlasdev/ui": minor +--- + +i18n: the message catalog is split per group and each component bundles only its own strings. `root: Button only` drops from 27.89 to 23.91 kB gzip and `AppShellLayout` from 39.88 to 36.07 kB. `Messages`, `getMessages`, `useT`, `I18nProvider`, `setLocale` and `registerLocale` behave as before; `useT()` and `getMessages()` still return the full catalog, which is bundled only when you import them. diff --git a/AGENTS.md b/AGENTS.md index e69cd10f..494d4326 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -728,8 +728,9 @@ setLocale("es"); - The client `$state` behind `setLocale` is module-level: all islands on the same page share the language and re-render on change. `locale.value` reads it; inside a provider use `useLocale()`. - **An explicit prop always wins** over the catalog: ``. Text props (`label`, `placeholder`, `confirmLabel`, `emptyText`, `ofLabel`…) no longer have a default; without the prop, the component uses the catalog. - **Override phrases** without creating a locale: `` or `setLocale("pt-BR", { … })`. Deep-merged over the catalog; a new `setLocale` call replaces the previous overrides. -- Catalog: `packages/ui/src/lib/i18n/en.ts` (source of truth, grouped by component, e.g. `docs.search.placeholder`) and `pt-BR.ts` (typed as `Messages`: a missing key is a type error). Strings with a value are functions: `notificationBell.label(unread)`. Registry and `getMessages(locale, override?)` live in the rune-free `catalog.ts`. -- New text in a component: add the key to `en.ts` **and** `pt-BR.ts`, call `const t = useT();` at the top level of `
diff --git a/packages/ui/src/lib/components/VirtualList/VirtualList.svelte b/packages/ui/src/lib/components/VirtualList/VirtualList.svelte index 3dffe888..37e8fb11 100644 --- a/packages/ui/src/lib/components/VirtualList/VirtualList.svelte +++ b/packages/ui/src/lib/components/VirtualList/VirtualList.svelte @@ -1,9 +1,10 @@