tera-system-ui 0.1.50 → 0.1.63
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.
- package/dist/components/accordion/Accordion.d.ts +15 -13
- package/dist/components/accordion/index.d.ts +1 -0
- package/dist/components/avatar/Avatar.d.ts +5 -3
- package/dist/components/avatar/index.d.ts +1 -0
- package/dist/components/brand-logo/BrandLogo.d.ts +7 -4
- package/dist/components/brand-logo/BrandLogo.js +1 -1
- package/dist/components/brand-logo/index.d.ts +1 -0
- package/dist/components/button/Button.d.ts +58 -14
- package/dist/components/button/Button.js +90 -27
- package/dist/components/button/Button.svelte +35 -30
- package/dist/components/button/Button.svelte.d.ts +1 -4
- package/dist/components/button/index.d.ts +1 -0
- package/dist/components/checkbox/Checkbox.d.ts +5 -2
- package/dist/components/checkbox/Checkbox.svelte +15 -8
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/components/combobox/Combobox.d.ts +5 -2
- package/dist/components/combobox/index.d.ts +1 -0
- package/dist/components/dialog/Dialog.d.ts +8 -6
- package/dist/components/dialog/Dialog.svelte +1 -1
- package/dist/components/dialog/index.d.ts +1 -0
- package/dist/components/dropdown-menu/DropdownMenu.d.ts +26 -8
- package/dist/components/dropdown-menu/index.d.ts +1 -0
- package/dist/components/header/Header.d.ts +6 -3
- package/dist/components/header/Header.svelte.d.ts +1 -1
- package/dist/components/header/index.d.ts +1 -0
- package/dist/components/input/Input.d.ts +22 -6
- package/dist/components/input/Input.js +19 -10
- package/dist/components/input/Input.svelte +42 -9
- package/dist/components/input/index.d.ts +1 -0
- package/dist/components/label/Label.d.ts +33 -3
- package/dist/components/label/Label.js +14 -3
- package/dist/components/label/Label.svelte +7 -7
- package/dist/components/label/Label.svelte.d.ts +2 -2
- package/dist/components/label/index.d.ts +1 -0
- package/dist/components/language-picker-button/LanguagePickerButton.d.ts +5 -2
- package/dist/components/language-picker-button/index.d.ts +1 -0
- package/dist/components/light-dark-toggle/LightDarkToggle.d.ts +5 -2
- package/dist/components/light-dark-toggle/index.d.ts +1 -0
- package/dist/components/popover/Popover.d.ts +6 -3
- package/dist/components/popover/Popover.js +0 -1
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover-responsive/PopoverResponsive.d.ts +5 -2
- package/dist/components/popover-responsive/index.d.ts +1 -0
- package/dist/components/select/Select.d.ts +19 -5
- package/dist/components/select/Select.js +18 -9
- package/dist/components/select/Select.svelte +17 -4
- package/dist/components/select/Select.svelte.d.ts +1 -1
- package/dist/components/select/index.d.ts +1 -0
- package/dist/components/side-navigation/SideNavigation.d.ts +6 -3
- package/dist/components/side-navigation/index.d.ts +1 -1
- package/dist/components/slider/Slider.d.ts +7 -4
- package/dist/components/slider/Slider.svelte +27 -52
- package/dist/components/slider/index.d.ts +1 -0
- package/dist/components/star-rating/StarRating.d.ts +5 -2
- package/dist/components/star-rating/StarRating.svelte +5 -5
- package/dist/components/star-rating/index.d.ts +1 -0
- package/dist/components/switch/Switch.d.ts +6 -2
- package/dist/components/switch/Switch.svelte +13 -7
- package/dist/components/switch/index.d.ts +1 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +23 -3
- package/dist/components/tabs/index.d.ts +1 -0
- package/dist/components/tera-ui-context/TeraUiContext.d.ts +4 -6
- package/dist/components/tera-ui-context/TeraUiContext.svelte +0 -2
- package/dist/components/tera-ui-context/index.d.ts +1 -0
- package/dist/components/text-area/TextArea.d.ts +22 -8
- package/dist/components/text-area/TextArea.js +19 -10
- package/dist/components/text-area/TextArea.svelte +35 -29
- package/dist/components/text-area/index.d.ts +1 -0
- package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.d.ts +5 -2
- package/dist/components/user-avatar-with-menu/index.d.ts +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/paraglide/README.md +93 -0
- package/dist/paraglide/messages/_index.d.ts +22 -7
- package/dist/paraglide/messages/_index.js +487 -8
- package/dist/paraglide/messages/ar.d.ts +9 -0
- package/dist/paraglide/messages/ar.js +31 -0
- package/dist/paraglide/messages/bg.d.ts +9 -0
- package/dist/paraglide/messages/bg.js +31 -0
- package/dist/paraglide/messages/bn.d.ts +9 -0
- package/dist/paraglide/messages/bn.js +31 -0
- package/dist/paraglide/messages/ca.d.ts +9 -0
- package/dist/paraglide/messages/ca.js +31 -0
- package/dist/paraglide/messages/cs.d.ts +9 -0
- package/dist/paraglide/messages/cs.js +31 -0
- package/dist/paraglide/messages/da.d.ts +9 -0
- package/dist/paraglide/messages/da.js +31 -0
- package/dist/paraglide/messages/de.d.ts +9 -0
- package/dist/paraglide/messages/de.js +31 -0
- package/dist/paraglide/messages/el.d.ts +9 -0
- package/dist/paraglide/messages/el.js +31 -0
- package/dist/paraglide/messages/en.d.ts +9 -0
- package/dist/paraglide/messages/en.js +31 -0
- package/dist/paraglide/messages/es.d.ts +9 -0
- package/dist/paraglide/messages/es.js +31 -0
- package/dist/paraglide/messages/fi.d.ts +9 -0
- package/dist/paraglide/messages/fi.js +31 -0
- package/dist/paraglide/messages/fr.d.ts +9 -0
- package/dist/paraglide/messages/fr.js +31 -0
- package/dist/paraglide/messages/he.d.ts +9 -0
- package/dist/paraglide/messages/he.js +31 -0
- package/dist/paraglide/messages/hi.d.ts +9 -0
- package/dist/paraglide/messages/hi.js +31 -0
- package/dist/paraglide/messages/hu.d.ts +9 -0
- package/dist/paraglide/messages/hu.js +31 -0
- package/dist/paraglide/messages/id.d.ts +9 -0
- package/dist/paraglide/messages/id.js +31 -0
- package/dist/paraglide/messages/it.d.ts +9 -0
- package/dist/paraglide/messages/it.js +31 -0
- package/dist/paraglide/messages/ja.d.ts +9 -0
- package/dist/paraglide/messages/ja.js +31 -0
- package/dist/paraglide/messages/ko.d.ts +9 -0
- package/dist/paraglide/messages/ko.js +31 -0
- package/dist/paraglide/messages/lt.d.ts +9 -0
- package/dist/paraglide/messages/lt.js +31 -0
- package/dist/paraglide/messages/lv.d.ts +9 -0
- package/dist/paraglide/messages/lv.js +31 -0
- package/dist/paraglide/messages/ms.d.ts +9 -0
- package/dist/paraglide/messages/ms.js +31 -0
- package/dist/paraglide/messages/nl.d.ts +9 -0
- package/dist/paraglide/messages/nl.js +31 -0
- package/dist/paraglide/messages/no.d.ts +9 -0
- package/dist/paraglide/messages/no.js +31 -0
- package/dist/paraglide/messages/pl.d.ts +9 -0
- package/dist/paraglide/messages/pl.js +31 -0
- package/dist/paraglide/messages/pt.d.ts +9 -0
- package/dist/paraglide/messages/pt.js +31 -0
- package/dist/paraglide/messages/ro.d.ts +9 -0
- package/dist/paraglide/messages/ro.js +31 -0
- package/dist/paraglide/messages/ru.d.ts +9 -0
- package/dist/paraglide/messages/ru.js +31 -0
- package/dist/paraglide/messages/sk.d.ts +9 -0
- package/dist/paraglide/messages/sk.js +31 -0
- package/dist/paraglide/messages/sl.d.ts +9 -0
- package/dist/paraglide/messages/sl.js +31 -0
- package/dist/paraglide/messages/sq.d.ts +9 -0
- package/dist/paraglide/messages/sq.js +31 -0
- package/dist/paraglide/messages/sr.d.ts +9 -0
- package/dist/paraglide/messages/sr.js +31 -0
- package/dist/paraglide/messages/sv.d.ts +9 -0
- package/dist/paraglide/messages/sv.js +31 -0
- package/dist/paraglide/messages/sw.d.ts +9 -0
- package/dist/paraglide/messages/sw.js +31 -0
- package/dist/paraglide/messages/ta.d.ts +9 -0
- package/dist/paraglide/messages/ta.js +31 -0
- package/dist/paraglide/messages/te.d.ts +9 -0
- package/dist/paraglide/messages/te.js +31 -0
- package/dist/paraglide/messages/th.d.ts +9 -0
- package/dist/paraglide/messages/th.js +31 -0
- package/dist/paraglide/messages/tl.d.ts +9 -0
- package/dist/paraglide/messages/tl.js +31 -0
- package/dist/paraglide/messages/tr.d.ts +9 -0
- package/dist/paraglide/messages/tr.js +31 -0
- package/dist/paraglide/messages/uk.d.ts +9 -0
- package/dist/paraglide/messages/uk.js +31 -0
- package/dist/paraglide/messages/vi.d.ts +9 -0
- package/dist/paraglide/messages/vi.js +31 -0
- package/dist/paraglide/messages/zh-CN.d.ts +9 -0
- package/dist/paraglide/messages/zh-CN.js +31 -0
- package/dist/paraglide/messages/zh-TW.d.ts +9 -0
- package/dist/paraglide/messages/zh-TW.js +31 -0
- package/dist/paraglide/messages.js +1 -1
- package/dist/paraglide/registry.js +1 -1
- package/dist/paraglide/runtime.d.ts +221 -45
- package/dist/paraglide/runtime.js +378 -65
- package/dist/paraglide/server.d.ts +40 -4
- package/dist/paraglide/server.js +83 -46
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +3 -0
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +103 -0
- package/dist/themes/tera-ui-base.css +70 -7
- package/dist/types/index.d.ts +25 -0
- package/dist/types/index.js +3 -0
- package/package.json +150 -36
- package/scripts/add-component-template.js +1 -1
- package/scripts/generate-ts-index.js +38 -12
- package/dist/paraglide/messages/text_account_settings.d.ts +0 -3
- package/dist/paraglide/messages/text_account_settings.js +0 -238
- package/dist/paraglide/messages/text_calces_documentation.d.ts +0 -3
- package/dist/paraglide/messages/text_calces_documentation.js +0 -238
- package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +0 -3
- package/dist/paraglide/messages/text_calces_scientific_calculator.js +0 -238
- package/dist/paraglide/messages/text_currency_converter.d.ts +0 -3
- package/dist/paraglide/messages/text_currency_converter.js +0 -238
- package/dist/paraglide/messages/text_logout.d.ts +0 -3
- package/dist/paraglide/messages/text_logout.js +0 -238
- package/dist/paraglide/messages/text_select_language.d.ts +0 -3
- package/dist/paraglide/messages/text_select_language.js +0 -238
- package/dist/paraglide/messages/text_unit_converter.d.ts +0 -3
- package/dist/paraglide/messages/text_unit_converter.js +0 -238
|
@@ -13,10 +13,16 @@
|
|
|
13
13
|
* - If URL doesn't match the determined locale, redirects to localized URL (only for document requests)
|
|
14
14
|
* - De-localizes URLs before passing to server (e.g., `/fr/about` → `/about`)
|
|
15
15
|
*
|
|
16
|
+
* @see https://inlang.com/m/gerre34r/library-inlang-paraglideJs/middleware
|
|
17
|
+
*
|
|
16
18
|
* @template T - The return type of the resolve function
|
|
17
19
|
*
|
|
18
20
|
* @param {Request} request - The incoming request object
|
|
19
|
-
* @param {(args: { request: Request, locale: import("./runtime.js").Locale }) => T | Promise<T>} resolve - Function to handle the request
|
|
21
|
+
* @param {(args: { request: Request, locale: import("./runtime.js").Locale }) => T | Promise<T>} resolve - Function to handle the request. The callback receives:
|
|
22
|
+
* - `request`: A modified request with a delocalized URL when the URL strategy is used (e.g., `/fr/about` → `/about`).
|
|
23
|
+
* If your framework handles URL localization itself (e.g., TanStack Router's `rewrite` option), use the original
|
|
24
|
+
* request instead to avoid redirect loops.
|
|
25
|
+
* - `locale`: The determined locale for this request.
|
|
20
26
|
* @param {{ onRedirect:(response: Response) => void }} [callbacks] - Callbacks to handle events from middleware
|
|
21
27
|
* @returns {Promise<Response>}
|
|
22
28
|
*
|
|
@@ -24,7 +30,7 @@
|
|
|
24
30
|
* ```typescript
|
|
25
31
|
* // Basic usage in metaframeworks like NextJS, SvelteKit, Astro, Nuxt, etc.
|
|
26
32
|
* export const handle = async ({ event, resolve }) => {
|
|
27
|
-
* return
|
|
33
|
+
* return paraglideMiddleware(event.request, ({ request, locale }) => {
|
|
28
34
|
* // let the framework further resolve the request
|
|
29
35
|
* return resolve(request);
|
|
30
36
|
* });
|
|
@@ -35,7 +41,7 @@
|
|
|
35
41
|
* ```typescript
|
|
36
42
|
* // Usage in a framework like Express JS or Hono
|
|
37
43
|
* app.use(async (req, res, next) => {
|
|
38
|
-
* const result = await
|
|
44
|
+
* const result = await paraglideMiddleware(req, ({ request, locale }) => {
|
|
39
45
|
* // If a redirect happens this won't be called
|
|
40
46
|
* return next(request);
|
|
41
47
|
* });
|
|
@@ -50,7 +56,7 @@
|
|
|
50
56
|
* // one request could leak into another concurrent request.
|
|
51
57
|
* export default {
|
|
52
58
|
* fetch: async (request) => {
|
|
53
|
-
* return
|
|
59
|
+
* return paraglideMiddleware(
|
|
54
60
|
* request,
|
|
55
61
|
* ({ request, locale }) => handleRequest(request, locale),
|
|
56
62
|
* { disableAsyncLocalStorage: true }
|
|
@@ -58,6 +64,36 @@
|
|
|
58
64
|
* }
|
|
59
65
|
* };
|
|
60
66
|
* ```
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* // Usage with frameworks that handle URL localization/delocalization themselves
|
|
71
|
+
* //
|
|
72
|
+
* // Some frameworks like TanStack Router handle URL localization and delocalization
|
|
73
|
+
* // themselves via their own rewrite APIs (e.g., `rewrite.input`/`rewrite.output`).
|
|
74
|
+
* //
|
|
75
|
+
* // When the framework handles this, the middleware's URL delocalization is not needed.
|
|
76
|
+
* // Using the modified `request` from the callback would cause a redirect loop because
|
|
77
|
+
* // both the middleware and the framework would attempt to delocalize the URL.
|
|
78
|
+
* //
|
|
79
|
+
* // Solution: Pass the original request to the handler instead of the modified one.
|
|
80
|
+
* // The middleware still handles locale detection, cookies, and AsyncLocalStorage context.
|
|
81
|
+
* //
|
|
82
|
+
* // ❌ WRONG - causes redirect loop when framework handles URL rewriting:
|
|
83
|
+
* // paraglideMiddleware(req, ({ request }) => handler.fetch(request))
|
|
84
|
+
* //
|
|
85
|
+
* // ✅ CORRECT - use original request when framework handles URL localization:
|
|
86
|
+
* // paraglideMiddleware(req, () => handler.fetch(req))
|
|
87
|
+
*
|
|
88
|
+
* * *
|
|
89
|
+
* export default {
|
|
90
|
+
* fetch(req: Request): Promise<Response> {
|
|
91
|
+
* // TanStack Router handles URL rewriting via deLocalizeUrl/localizeUrl
|
|
92
|
+
* // so we pass the original `req` instead of the modified `request`
|
|
93
|
+
* return paraglideMiddleware(req, () => handler.fetch(req))
|
|
94
|
+
* },
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
61
97
|
*/
|
|
62
98
|
export function paraglideMiddleware<T>(request: Request, resolve: (args: {
|
|
63
99
|
request: Request;
|
package/dist/paraglide/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable */
|
|
2
2
|
|
|
3
3
|
import * as runtime from "./runtime.js";
|
|
4
4
|
|
|
@@ -17,10 +17,16 @@ import * as runtime from "./runtime.js";
|
|
|
17
17
|
* - If URL doesn't match the determined locale, redirects to localized URL (only for document requests)
|
|
18
18
|
* - De-localizes URLs before passing to server (e.g., `/fr/about` → `/about`)
|
|
19
19
|
*
|
|
20
|
+
* @see https://inlang.com/m/gerre34r/library-inlang-paraglideJs/middleware
|
|
21
|
+
*
|
|
20
22
|
* @template T - The return type of the resolve function
|
|
21
23
|
*
|
|
22
24
|
* @param {Request} request - The incoming request object
|
|
23
|
-
* @param {(args: { request: Request, locale: import("./runtime.js").Locale }) => T | Promise<T>} resolve - Function to handle the request
|
|
25
|
+
* @param {(args: { request: Request, locale: import("./runtime.js").Locale }) => T | Promise<T>} resolve - Function to handle the request. The callback receives:
|
|
26
|
+
* - `request`: A modified request with a delocalized URL when the URL strategy is used (e.g., `/fr/about` → `/about`).
|
|
27
|
+
* If your framework handles URL localization itself (e.g., TanStack Router's `rewrite` option), use the original
|
|
28
|
+
* request instead to avoid redirect loops.
|
|
29
|
+
* - `locale`: The determined locale for this request.
|
|
24
30
|
* @param {{ onRedirect:(response: Response) => void }} [callbacks] - Callbacks to handle events from middleware
|
|
25
31
|
* @returns {Promise<Response>}
|
|
26
32
|
*
|
|
@@ -28,7 +34,7 @@ import * as runtime from "./runtime.js";
|
|
|
28
34
|
* ```typescript
|
|
29
35
|
* // Basic usage in metaframeworks like NextJS, SvelteKit, Astro, Nuxt, etc.
|
|
30
36
|
* export const handle = async ({ event, resolve }) => {
|
|
31
|
-
* return
|
|
37
|
+
* return paraglideMiddleware(event.request, ({ request, locale }) => {
|
|
32
38
|
* // let the framework further resolve the request
|
|
33
39
|
* return resolve(request);
|
|
34
40
|
* });
|
|
@@ -39,7 +45,7 @@ import * as runtime from "./runtime.js";
|
|
|
39
45
|
* ```typescript
|
|
40
46
|
* // Usage in a framework like Express JS or Hono
|
|
41
47
|
* app.use(async (req, res, next) => {
|
|
42
|
-
* const result = await
|
|
48
|
+
* const result = await paraglideMiddleware(req, ({ request, locale }) => {
|
|
43
49
|
* // If a redirect happens this won't be called
|
|
44
50
|
* return next(request);
|
|
45
51
|
* });
|
|
@@ -54,7 +60,7 @@ import * as runtime from "./runtime.js";
|
|
|
54
60
|
* // one request could leak into another concurrent request.
|
|
55
61
|
* export default {
|
|
56
62
|
* fetch: async (request) => {
|
|
57
|
-
* return
|
|
63
|
+
* return paraglideMiddleware(
|
|
58
64
|
* request,
|
|
59
65
|
* ({ request, locale }) => handleRequest(request, locale),
|
|
60
66
|
* { disableAsyncLocalStorage: true }
|
|
@@ -62,39 +68,67 @@ import * as runtime from "./runtime.js";
|
|
|
62
68
|
* }
|
|
63
69
|
* };
|
|
64
70
|
* ```
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* // Usage with frameworks that handle URL localization/delocalization themselves
|
|
75
|
+
* //
|
|
76
|
+
* // Some frameworks like TanStack Router handle URL localization and delocalization
|
|
77
|
+
* // themselves via their own rewrite APIs (e.g., `rewrite.input`/`rewrite.output`).
|
|
78
|
+
* //
|
|
79
|
+
* // When the framework handles this, the middleware's URL delocalization is not needed.
|
|
80
|
+
* // Using the modified `request` from the callback would cause a redirect loop because
|
|
81
|
+
* // both the middleware and the framework would attempt to delocalize the URL.
|
|
82
|
+
* //
|
|
83
|
+
* // Solution: Pass the original request to the handler instead of the modified one.
|
|
84
|
+
* // The middleware still handles locale detection, cookies, and AsyncLocalStorage context.
|
|
85
|
+
* //
|
|
86
|
+
* // ❌ WRONG - causes redirect loop when framework handles URL rewriting:
|
|
87
|
+
* // paraglideMiddleware(req, ({ request }) => handler.fetch(request))
|
|
88
|
+
* //
|
|
89
|
+
* // ✅ CORRECT - use original request when framework handles URL localization:
|
|
90
|
+
* // paraglideMiddleware(req, () => handler.fetch(req))
|
|
91
|
+
*
|
|
92
|
+
* * *
|
|
93
|
+
* export default {
|
|
94
|
+
* fetch(req: Request): Promise<Response> {
|
|
95
|
+
* // TanStack Router handles URL rewriting via deLocalizeUrl/localizeUrl
|
|
96
|
+
* // so we pass the original `req` instead of the modified `request`
|
|
97
|
+
* return paraglideMiddleware(req, () => handler.fetch(req))
|
|
98
|
+
* },
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
65
101
|
*/
|
|
66
102
|
export async function paraglideMiddleware(request, resolve, callbacks) {
|
|
67
103
|
if (!runtime.disableAsyncLocalStorage && !runtime.serverAsyncLocalStorage) {
|
|
68
|
-
|
|
69
|
-
|
|
104
|
+
const { AsyncLocalStorage } = await import("async_hooks");
|
|
105
|
+
runtime.overwriteServerAsyncLocalStorage(new AsyncLocalStorage());
|
|
106
|
+
} else if (!runtime.serverAsyncLocalStorage) {
|
|
107
|
+
runtime.overwriteServerAsyncLocalStorage(createMockAsyncLocalStorage());
|
|
70
108
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
const locale = runtime.extractLocaleFromRequest(request);
|
|
109
|
+
const decision = await runtime.shouldRedirect({ request });
|
|
110
|
+
const locale = decision.locale;
|
|
75
111
|
const origin = new URL(request.url).origin;
|
|
76
112
|
// if the client makes a request to a URL that doesn't match
|
|
77
113
|
// the localizedUrl, redirect the client to the localized URL
|
|
78
114
|
if (request.headers.get("Sec-Fetch-Dest") === "document" &&
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
headers["Vary"] = "Accept-Language";
|
|
87
|
-
}
|
|
88
|
-
const response = new Response(null, {
|
|
89
|
-
status: 307,
|
|
90
|
-
headers: {
|
|
91
|
-
Location: localizedUrl.href,
|
|
92
|
-
...headers,
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
callbacks?.onRedirect(response);
|
|
96
|
-
return response;
|
|
115
|
+
decision.shouldRedirect &&
|
|
116
|
+
decision.redirectUrl) {
|
|
117
|
+
// Create headers object with Vary header if preferredLanguage strategy is used
|
|
118
|
+
/** @type {Record<string, string>} */
|
|
119
|
+
const headers = {};
|
|
120
|
+
if (runtime.strategy.includes("preferredLanguage")) {
|
|
121
|
+
headers["Vary"] = "Accept-Language";
|
|
97
122
|
}
|
|
123
|
+
const response = new Response(null, {
|
|
124
|
+
status: 307,
|
|
125
|
+
headers: {
|
|
126
|
+
Location: decision.redirectUrl.href,
|
|
127
|
+
...headers,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
callbacks?.onRedirect(response);
|
|
131
|
+
return response;
|
|
98
132
|
}
|
|
99
133
|
// If the strategy includes "url", we need to de-localize the URL
|
|
100
134
|
// before passing it to the server middleware.
|
|
@@ -102,11 +136,24 @@ export async function paraglideMiddleware(request, resolve, callbacks) {
|
|
|
102
136
|
// The middleware is responsible for mapping a localized URL to the
|
|
103
137
|
// de-localized URL e.g. `/en/about` to `/about`. Otherwise,
|
|
104
138
|
// the server can't render the correct page.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
139
|
+
let newRequest;
|
|
140
|
+
if (runtime.strategy.includes("url")) {
|
|
141
|
+
newRequest = new Request(runtime.deLocalizeUrl(request.url), request);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Some metaframeworks (NextJS) require a new Request object
|
|
145
|
+
// https://github.com/opral/inlang-paraglide-js/issues/411
|
|
146
|
+
// However, some frameworks (TanStack Start 1.143+) use custom Request
|
|
147
|
+
// implementations that cannot be cloned with `new Request(request)`
|
|
148
|
+
// https://github.com/opral/paraglide-js/issues/573
|
|
149
|
+
// Try to clone the request, but fall back to the original if cloning fails
|
|
150
|
+
try {
|
|
151
|
+
newRequest = new Request(request);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
newRequest = request;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
110
157
|
// the message functions that have been called in this request
|
|
111
158
|
/** @type {Set<string>} */
|
|
112
159
|
const messageCalls = new Set();
|
|
@@ -138,18 +185,6 @@ export async function paraglideMiddleware(request, resolve, callbacks) {
|
|
|
138
185
|
}
|
|
139
186
|
return response;
|
|
140
187
|
}
|
|
141
|
-
/**
|
|
142
|
-
* Normalize url for comparison.
|
|
143
|
-
* Strips trailing slash
|
|
144
|
-
* @param {string} url
|
|
145
|
-
* @returns {string} normalized url string
|
|
146
|
-
*/
|
|
147
|
-
function normalizeURL(url) {
|
|
148
|
-
const urlObj = new URL(url);
|
|
149
|
-
// // strip trailing slash from pathname
|
|
150
|
-
urlObj.pathname = urlObj.pathname.replace(/\/$/, "");
|
|
151
|
-
return urlObj.href;
|
|
152
|
-
}
|
|
153
188
|
/**
|
|
154
189
|
* Creates a mock AsyncLocalStorage implementation for environments where
|
|
155
190
|
* native AsyncLocalStorage is not available or disabled.
|
|
@@ -178,6 +213,8 @@ function createMockAsyncLocalStorage() {
|
|
|
178
213
|
},
|
|
179
214
|
};
|
|
180
215
|
}
|
|
216
|
+
// Used in generated server.js when async local storage is disabled.
|
|
217
|
+
void createMockAsyncLocalStorage;
|
|
181
218
|
/**
|
|
182
219
|
* The compiled messages for the server middleware.
|
|
183
220
|
*
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
|
|
2
|
+
## What is this folder?
|
|
3
|
+
|
|
4
|
+
This is an [unpacked (git-friendly)](https://inlang.com/docs/unpacked-project) inlang project.
|
|
5
|
+
|
|
6
|
+
## At a glance
|
|
7
|
+
|
|
8
|
+
Purpose:
|
|
9
|
+
- This folder stores inlang project configuration and plugin cache data.
|
|
10
|
+
- Translation files live outside this folder and are referenced from `settings.json`.
|
|
11
|
+
|
|
12
|
+
Safe to edit:
|
|
13
|
+
- `settings.json`
|
|
14
|
+
|
|
15
|
+
Do not edit:
|
|
16
|
+
- `cache/`
|
|
17
|
+
- `.gitignore`
|
|
18
|
+
|
|
19
|
+
Key files:
|
|
20
|
+
- `settings.json` — locales, plugins, file patterns (source of truth)
|
|
21
|
+
- `cache/` — plugin caches (safe to delete)
|
|
22
|
+
- `.gitignore` — generated
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
*.inlang/
|
|
26
|
+
├── settings.json # Locales, plugins, and file patterns (source of truth)
|
|
27
|
+
├── cache/ # Plugin caches (gitignored)
|
|
28
|
+
└── .gitignore # Ignores everything except settings.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Translation files (like `messages/en.json`) live **outside** this folder and are referenced via plugins in `settings.json`.
|
|
32
|
+
|
|
33
|
+
## What is inlang?
|
|
34
|
+
|
|
35
|
+
[Inlang](https://inlang.com) is an open file format for building custom localization (i18n) tooling. It provides:
|
|
36
|
+
|
|
37
|
+
- **CRUD API** — Read and write translations programmatically via SQL
|
|
38
|
+
- **Plugin system** — Import/export any format (JSON, XLIFF, etc.)
|
|
39
|
+
- **Version control** — Built-in version control via [lix](https://lix.dev)
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
┌──────────┐ ┌───────────┐ ┌────────────┐
|
|
43
|
+
│ i18n lib │ │Translation│ │ CI/CD │
|
|
44
|
+
│ │ │ Tool │ │ Automation │
|
|
45
|
+
└────┬─────┘ └─────┬─────┘ └─────┬──────┘
|
|
46
|
+
│ │ │
|
|
47
|
+
└─────────┐ │ ┌──────────┘
|
|
48
|
+
▼ ▼ ▼
|
|
49
|
+
┌──────────────────────────────────┐
|
|
50
|
+
│ *.inlang file │
|
|
51
|
+
└──────────────────────────────────┘
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Quick start
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install @inlang/sdk
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { loadProjectFromDirectory, saveProjectToDirectory } from "@inlang/sdk";
|
|
62
|
+
|
|
63
|
+
const project = await loadProjectFromDirectory({ path: "./project.inlang" });
|
|
64
|
+
// Query messages with SQLite + [Kysely](https://kysely.dev/) under the hood.
|
|
65
|
+
const messages = await project.db.selectFrom("message").selectAll().execute();
|
|
66
|
+
|
|
67
|
+
// Use project.db to update messages.
|
|
68
|
+
await saveProjectToDirectory({ path: "./project.inlang", project });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Ideas for custom tooling
|
|
72
|
+
|
|
73
|
+
- Translation health dashboard (missing/empty/stale messages)
|
|
74
|
+
- Locale coverage report in CI
|
|
75
|
+
- Auto-PR for new keys with placeholders
|
|
76
|
+
- Migration tool between file formats via plugins
|
|
77
|
+
- Glossary/term consistency checker
|
|
78
|
+
|
|
79
|
+
## Data model ([docs](https://inlang.com/docs/data-model))
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
bundle (a concept, e.g., "welcome_header")
|
|
83
|
+
└── message (per locale, e.g., "en", "de")
|
|
84
|
+
└── variant (plural forms, gender, etc.)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- **bundle**: Groups messages by ID (e.g., `welcome_header`)
|
|
88
|
+
- **message**: A translation for a specific locale
|
|
89
|
+
- **variant**: Handles pluralization/selectors (most messages have one variant)
|
|
90
|
+
|
|
91
|
+
## Common tasks
|
|
92
|
+
|
|
93
|
+
- List bundles: `project.db.selectFrom("bundle").selectAll().execute()`
|
|
94
|
+
- List messages for locale: `project.db.selectFrom("message").where("locale", "=", "en").selectAll().execute()`
|
|
95
|
+
- Find missing translations: compare message counts across locales
|
|
96
|
+
- Update a message: `project.db.updateTable("message").set({ ... }).where("id", "=", "...").execute()`
|
|
97
|
+
|
|
98
|
+
## Links
|
|
99
|
+
|
|
100
|
+
- [SDK documentation](https://inlang.com/docs)
|
|
101
|
+
- [inlang.com](https://inlang.com)
|
|
102
|
+
- [List of plugins](https://inlang.com/c/plugins)
|
|
103
|
+
- [List of tools](https://inlang.com/c/tools)
|
|
@@ -14,17 +14,52 @@ body:has(dialog[open]) {
|
|
|
14
14
|
overflow: hidden
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
/* AntD-style Wave Animation for Buttons */
|
|
18
|
+
.btn-wave {
|
|
19
|
+
position: relative;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.btn-wave::after {
|
|
23
|
+
content: '';
|
|
18
24
|
position: absolute;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
inset: 0;
|
|
26
|
+
border-radius: inherit;
|
|
27
|
+
opacity: 0;
|
|
22
28
|
pointer-events: none;
|
|
29
|
+
box-shadow: 0 0 0 0 var(--wave-color, var(--color-primary-600));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.btn-wave.wave-active::after {
|
|
33
|
+
animation: ant-wave 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Wave color based on button variant */
|
|
37
|
+
.btn-wave[data-variant="primary"]::after {
|
|
38
|
+
--wave-color: var(--color-primary-600);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.btn-wave[data-variant="default"]::after,
|
|
42
|
+
.btn-wave[data-variant="dashed"]::after {
|
|
43
|
+
--wave-color: var(--color-primary-600);
|
|
23
44
|
}
|
|
24
45
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
46
|
+
.btn-wave[data-variant="text"]::after,
|
|
47
|
+
.btn-wave[data-variant="link"]::after {
|
|
48
|
+
--wave-color: transparent;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* Danger wave color */
|
|
52
|
+
.btn-wave[data-danger="true"]::after {
|
|
53
|
+
--wave-color: var(--color-error-500);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@keyframes ant-wave {
|
|
57
|
+
0% {
|
|
58
|
+
box-shadow: 0 0 0 0 var(--wave-color);
|
|
59
|
+
opacity: 0.4;
|
|
60
|
+
}
|
|
61
|
+
100% {
|
|
62
|
+
box-shadow: 0 0 0 6px var(--wave-color);
|
|
28
63
|
opacity: 0;
|
|
29
64
|
}
|
|
30
65
|
}
|
|
@@ -263,6 +298,34 @@ html.dark, .dark * {
|
|
|
263
298
|
--color-primary-token-10: rgb(235, 243, 254);
|
|
264
299
|
}
|
|
265
300
|
|
|
301
|
+
/* ============================================= */
|
|
302
|
+
/* === TeraUI Design System - Ant Design === */
|
|
303
|
+
/* ============================================= */
|
|
304
|
+
/* Consistent design tokens for all components */
|
|
305
|
+
:root {
|
|
306
|
+
/* TeraUI Border Radius - Ant Design uses 6px as base */
|
|
307
|
+
--tera-radius-sm: 2px;
|
|
308
|
+
--tera-radius-base: 6px;
|
|
309
|
+
--tera-radius-lg: 8px;
|
|
310
|
+
|
|
311
|
+
/* TeraUI Control Heights - matches component sizes */
|
|
312
|
+
--tera-control-height-xs: 20px;
|
|
313
|
+
--tera-control-height-sm: 24px;
|
|
314
|
+
--tera-control-height-base: 32px;
|
|
315
|
+
--tera-control-height-lg: 40px;
|
|
316
|
+
|
|
317
|
+
/* TeraUI Transitions - Ant Design easing */
|
|
318
|
+
--tera-transition-fast: 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);
|
|
319
|
+
--tera-transition-base: 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
|
|
320
|
+
--tera-transition-slow: 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
|
|
321
|
+
|
|
322
|
+
/* TeraUI Focus Shadows - subtle glow like Ant Design */
|
|
323
|
+
--tera-focus-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);
|
|
324
|
+
--tera-focus-shadow-error: 0 0 0 2px rgba(239, 68, 68, 0.1);
|
|
325
|
+
--tera-focus-shadow-warning: 0 0 0 2px rgba(249, 115, 22, 0.1);
|
|
326
|
+
--tera-focus-shadow-success: 0 0 0 2px rgba(34, 197, 94, 0.1);
|
|
327
|
+
}
|
|
328
|
+
|
|
266
329
|
|
|
267
330
|
|
|
268
331
|
/* Base responsive variable */
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type { AccordionProps, AccordionItemProps, AccordionContentProps, AccordionTriggerProps } from '../components/accordion/Accordion.js';
|
|
2
|
+
export type { AvatarProps } from '../components/avatar/Avatar.js';
|
|
3
|
+
export type { BrandLogoProps } from '../components/brand-logo/BrandLogo.js';
|
|
4
|
+
export type { ButtonProps } from '../components/button/Button.js';
|
|
5
|
+
export type { CheckboxProps } from '../components/checkbox/Checkbox.js';
|
|
6
|
+
export type { ComboboxProps } from '../components/combobox/Combobox.js';
|
|
7
|
+
export type { DialogProps, DialogPropsAstro } from '../components/dialog/Dialog.js';
|
|
8
|
+
export type { DropdownMenuProps, DropdownMenuItemProps, DropdownMenuGroupProps, DropdownMenuHeaderProps, DropdownMenuSeparatorProps } from '../components/dropdown-menu/DropdownMenu.js';
|
|
9
|
+
export type { HeaderProps } from '../components/header/Header.js';
|
|
10
|
+
export type { InputProps } from '../components/input/Input.js';
|
|
11
|
+
export type { LabelProps } from '../components/label/Label.js';
|
|
12
|
+
export type { LanguagePickerButtonProps } from '../components/language-picker-button/LanguagePickerButton.js';
|
|
13
|
+
export type { LightDarkToggleProps } from '../components/light-dark-toggle/LightDarkToggle.js';
|
|
14
|
+
export type { PopoverProps } from '../components/popover/Popover.js';
|
|
15
|
+
export type { PopoverResponsiveProps } from '../components/popover-responsive/PopoverResponsive.js';
|
|
16
|
+
export type { SelectProps } from '../components/select/Select.js';
|
|
17
|
+
export type { SideNavigationProps, SideNavigationItem } from '../components/side-navigation/SideNavigation.js';
|
|
18
|
+
export type { SliderProps } from '../components/slider/Slider.js';
|
|
19
|
+
export type { StarRatingProps } from '../components/star-rating/StarRating.js';
|
|
20
|
+
export type { SwitchProps } from '../components/switch/Switch.js';
|
|
21
|
+
export type { TabsProps, TabsListProps, TabsItemProps, TabsContentProps } from '../components/tabs/Tabs.svelte.js';
|
|
22
|
+
export type { TeraUiContextProps, TeraUiContext } from '../components/tera-ui-context/TeraUiContext.js';
|
|
23
|
+
export type { TextAreaProps, AutoSizeConfig } from '../components/text-area/TextArea.js';
|
|
24
|
+
export type { UserAvatarWithMenuProps } from '../components/user-avatar-with-menu/UserAvatarWithMenu.js';
|
|
25
|
+
export type { UserData, JwtToken } from './user-data.js';
|