tera-system-ui 0.1.41 → 0.1.61

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 (171) hide show
  1. package/dist/components/accordion/Accordion.d.ts +15 -13
  2. package/dist/components/accordion/index.d.ts +1 -0
  3. package/dist/components/avatar/Avatar.d.ts +5 -3
  4. package/dist/components/avatar/index.d.ts +1 -0
  5. package/dist/components/brand-logo/BrandLogo.d.ts +5 -2
  6. package/dist/components/brand-logo/index.d.ts +1 -0
  7. package/dist/components/button/Button.d.ts +58 -14
  8. package/dist/components/button/Button.js +90 -27
  9. package/dist/components/button/Button.svelte +35 -30
  10. package/dist/components/button/Button.svelte.d.ts +1 -4
  11. package/dist/components/button/index.d.ts +1 -0
  12. package/dist/components/checkbox/Checkbox.d.ts +5 -2
  13. package/dist/components/checkbox/Checkbox.svelte +15 -8
  14. package/dist/components/checkbox/index.d.ts +1 -0
  15. package/dist/components/combobox/Combobox.d.ts +5 -2
  16. package/dist/components/combobox/index.d.ts +1 -0
  17. package/dist/components/dialog/Dialog.d.ts +8 -6
  18. package/dist/components/dialog/index.d.ts +1 -0
  19. package/dist/components/dropdown-menu/DropdownMenu.d.ts +26 -8
  20. package/dist/components/dropdown-menu/index.d.ts +1 -0
  21. package/dist/components/header/Header.d.ts +6 -3
  22. package/dist/components/header/Header.svelte.d.ts +1 -1
  23. package/dist/components/header/index.d.ts +1 -0
  24. package/dist/components/input/Input.d.ts +22 -6
  25. package/dist/components/input/Input.js +19 -10
  26. package/dist/components/input/Input.svelte +42 -9
  27. package/dist/components/input/index.d.ts +1 -0
  28. package/dist/components/label/Label.d.ts +33 -3
  29. package/dist/components/label/Label.js +14 -3
  30. package/dist/components/label/Label.svelte +7 -7
  31. package/dist/components/label/Label.svelte.d.ts +2 -2
  32. package/dist/components/label/index.d.ts +1 -0
  33. package/dist/components/language-picker-button/LanguagePickerButton.d.ts +5 -2
  34. package/dist/components/language-picker-button/index.d.ts +1 -0
  35. package/dist/components/light-dark-toggle/LightDarkToggle.d.ts +5 -2
  36. package/dist/components/light-dark-toggle/index.d.ts +1 -0
  37. package/dist/components/popover/Popover.d.ts +6 -3
  38. package/dist/components/popover/Popover.js +0 -1
  39. package/dist/components/popover/index.d.ts +1 -0
  40. package/dist/components/popover-responsive/PopoverResponsive.d.ts +5 -2
  41. package/dist/components/popover-responsive/index.d.ts +1 -0
  42. package/dist/components/select/Select.d.ts +19 -5
  43. package/dist/components/select/Select.js +18 -9
  44. package/dist/components/select/Select.svelte +17 -4
  45. package/dist/components/select/Select.svelte.d.ts +1 -1
  46. package/dist/components/select/index.d.ts +1 -0
  47. package/dist/components/side-navigation/SideNavigation.d.ts +6 -3
  48. package/dist/components/side-navigation/index.d.ts +1 -1
  49. package/dist/components/slider/Slider.d.ts +7 -4
  50. package/dist/components/slider/Slider.svelte +26 -51
  51. package/dist/components/slider/index.d.ts +1 -0
  52. package/dist/components/star-rating/StarRating.d.ts +5 -2
  53. package/dist/components/star-rating/StarRating.svelte +5 -5
  54. package/dist/components/star-rating/index.d.ts +1 -0
  55. package/dist/components/switch/Switch.d.ts +6 -2
  56. package/dist/components/switch/Switch.svelte +13 -7
  57. package/dist/components/switch/index.d.ts +1 -0
  58. package/dist/components/tabs/Tabs.svelte.d.ts +23 -3
  59. package/dist/components/tabs/index.d.ts +1 -0
  60. package/dist/components/tera-ui-context/TeraUiContext.d.ts +4 -6
  61. package/dist/components/tera-ui-context/index.d.ts +1 -0
  62. package/dist/components/text-area/TextArea.d.ts +22 -8
  63. package/dist/components/text-area/TextArea.js +19 -10
  64. package/dist/components/text-area/TextArea.svelte +36 -30
  65. package/dist/components/text-area/index.d.ts +1 -0
  66. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.d.ts +5 -2
  67. package/dist/components/user-avatar-with-menu/index.d.ts +1 -0
  68. package/dist/index.d.ts +24 -0
  69. package/dist/paraglide/README.md +93 -0
  70. package/dist/paraglide/messages/_index.d.ts +8 -7
  71. package/dist/paraglide/messages/_index.js +361 -360
  72. package/dist/paraglide/messages/ar.d.ts +9 -7
  73. package/dist/paraglide/messages/ar.js +16 -15
  74. package/dist/paraglide/messages/bg.d.ts +9 -7
  75. package/dist/paraglide/messages/bg.js +16 -15
  76. package/dist/paraglide/messages/bn.d.ts +9 -7
  77. package/dist/paraglide/messages/bn.js +16 -15
  78. package/dist/paraglide/messages/ca.d.ts +9 -7
  79. package/dist/paraglide/messages/ca.js +16 -15
  80. package/dist/paraglide/messages/cs.d.ts +9 -7
  81. package/dist/paraglide/messages/cs.js +16 -15
  82. package/dist/paraglide/messages/da.d.ts +9 -7
  83. package/dist/paraglide/messages/da.js +16 -15
  84. package/dist/paraglide/messages/de.d.ts +9 -7
  85. package/dist/paraglide/messages/de.js +16 -15
  86. package/dist/paraglide/messages/el.d.ts +9 -7
  87. package/dist/paraglide/messages/el.js +16 -15
  88. package/dist/paraglide/messages/en.d.ts +9 -7
  89. package/dist/paraglide/messages/en.js +16 -15
  90. package/dist/paraglide/messages/es.d.ts +9 -7
  91. package/dist/paraglide/messages/es.js +16 -15
  92. package/dist/paraglide/messages/fi.d.ts +9 -7
  93. package/dist/paraglide/messages/fi.js +16 -15
  94. package/dist/paraglide/messages/fr.d.ts +9 -7
  95. package/dist/paraglide/messages/fr.js +16 -15
  96. package/dist/paraglide/messages/he.d.ts +9 -7
  97. package/dist/paraglide/messages/he.js +16 -15
  98. package/dist/paraglide/messages/hi.d.ts +9 -7
  99. package/dist/paraglide/messages/hi.js +16 -15
  100. package/dist/paraglide/messages/hu.d.ts +9 -7
  101. package/dist/paraglide/messages/hu.js +16 -15
  102. package/dist/paraglide/messages/id.d.ts +9 -7
  103. package/dist/paraglide/messages/id.js +16 -15
  104. package/dist/paraglide/messages/it.d.ts +9 -7
  105. package/dist/paraglide/messages/it.js +16 -15
  106. package/dist/paraglide/messages/ja.d.ts +9 -7
  107. package/dist/paraglide/messages/ja.js +16 -15
  108. package/dist/paraglide/messages/ko.d.ts +9 -7
  109. package/dist/paraglide/messages/ko.js +16 -15
  110. package/dist/paraglide/messages/lt.d.ts +9 -7
  111. package/dist/paraglide/messages/lt.js +16 -15
  112. package/dist/paraglide/messages/lv.d.ts +9 -7
  113. package/dist/paraglide/messages/lv.js +16 -15
  114. package/dist/paraglide/messages/ms.d.ts +9 -7
  115. package/dist/paraglide/messages/ms.js +16 -15
  116. package/dist/paraglide/messages/nl.d.ts +9 -7
  117. package/dist/paraglide/messages/nl.js +16 -15
  118. package/dist/paraglide/messages/no.d.ts +9 -7
  119. package/dist/paraglide/messages/no.js +16 -15
  120. package/dist/paraglide/messages/pl.d.ts +9 -7
  121. package/dist/paraglide/messages/pl.js +16 -15
  122. package/dist/paraglide/messages/pt.d.ts +9 -7
  123. package/dist/paraglide/messages/pt.js +16 -15
  124. package/dist/paraglide/messages/ro.d.ts +9 -7
  125. package/dist/paraglide/messages/ro.js +16 -15
  126. package/dist/paraglide/messages/ru.d.ts +9 -7
  127. package/dist/paraglide/messages/ru.js +16 -15
  128. package/dist/paraglide/messages/sk.d.ts +9 -7
  129. package/dist/paraglide/messages/sk.js +16 -15
  130. package/dist/paraglide/messages/sl.d.ts +9 -7
  131. package/dist/paraglide/messages/sl.js +16 -15
  132. package/dist/paraglide/messages/sq.d.ts +9 -7
  133. package/dist/paraglide/messages/sq.js +16 -15
  134. package/dist/paraglide/messages/sr.d.ts +9 -7
  135. package/dist/paraglide/messages/sr.js +16 -15
  136. package/dist/paraglide/messages/sv.d.ts +9 -7
  137. package/dist/paraglide/messages/sv.js +16 -15
  138. package/dist/paraglide/messages/sw.d.ts +9 -7
  139. package/dist/paraglide/messages/sw.js +16 -15
  140. package/dist/paraglide/messages/ta.d.ts +9 -7
  141. package/dist/paraglide/messages/ta.js +16 -15
  142. package/dist/paraglide/messages/te.d.ts +9 -7
  143. package/dist/paraglide/messages/te.js +16 -15
  144. package/dist/paraglide/messages/th.d.ts +9 -7
  145. package/dist/paraglide/messages/th.js +16 -15
  146. package/dist/paraglide/messages/tl.d.ts +9 -7
  147. package/dist/paraglide/messages/tl.js +16 -15
  148. package/dist/paraglide/messages/tr.d.ts +9 -7
  149. package/dist/paraglide/messages/tr.js +16 -15
  150. package/dist/paraglide/messages/uk.d.ts +9 -7
  151. package/dist/paraglide/messages/uk.js +16 -15
  152. package/dist/paraglide/messages/vi.d.ts +9 -7
  153. package/dist/paraglide/messages/vi.js +16 -15
  154. package/dist/paraglide/messages/zh-CN.d.ts +9 -7
  155. package/dist/paraglide/messages/zh-CN.js +16 -15
  156. package/dist/paraglide/messages/zh-TW.d.ts +9 -7
  157. package/dist/paraglide/messages/zh-TW.js +16 -15
  158. package/dist/paraglide/messages.js +1 -1
  159. package/dist/paraglide/registry.js +1 -1
  160. package/dist/paraglide/runtime.d.ts +221 -45
  161. package/dist/paraglide/runtime.js +378 -65
  162. package/dist/paraglide/server.d.ts +40 -4
  163. package/dist/paraglide/server.js +83 -46
  164. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +3 -0
  165. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +103 -0
  166. package/dist/themes/tera-ui-base.css +70 -7
  167. package/dist/types/index.d.ts +25 -0
  168. package/dist/types/index.js +3 -0
  169. package/package.json +150 -36
  170. package/scripts/add-component-template.js +1 -1
  171. package/scripts/generate-ts-index.js +38 -12
@@ -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 serverMiddleware(event.request, ({ request, locale }) => {
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 serverMiddleware(req, ({ request, locale }) => {
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 serverMiddleware(
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;
@@ -1,4 +1,4 @@
1
- // eslint-disable
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 serverMiddleware(event.request, ({ request, locale }) => {
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 serverMiddleware(req, ({ request, locale }) => {
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 serverMiddleware(
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
- const { AsyncLocalStorage } = await import("async_hooks");
69
- runtime.overwriteServerAsyncLocalStorage(new AsyncLocalStorage());
104
+ const { AsyncLocalStorage } = await import("async_hooks");
105
+ runtime.overwriteServerAsyncLocalStorage(new AsyncLocalStorage());
106
+ } else if (!runtime.serverAsyncLocalStorage) {
107
+ runtime.overwriteServerAsyncLocalStorage(createMockAsyncLocalStorage());
70
108
  }
71
- else if (!runtime.serverAsyncLocalStorage) {
72
- runtime.overwriteServerAsyncLocalStorage(createMockAsyncLocalStorage());
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
- runtime.strategy.includes("url")) {
80
- const localizedUrl = runtime.localizeUrl(request.url, { locale });
81
- if (normalizeURL(localizedUrl.href) !== normalizeURL(request.url)) {
82
- // Create headers object with Vary header if preferredLanguage strategy is used
83
- /** @type {Record<string, string>} */
84
- const headers = {};
85
- if (runtime.strategy.includes("preferredLanguage")) {
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
- const newRequest = runtime.strategy.includes("url")
106
- ? new Request(runtime.deLocalizeUrl(request.url), request)
107
- : // need to create a new request object because some metaframeworks (nextjs!) throw otherwise
108
- // https://github.com/opral/inlang-paraglide-js/issues/411
109
- new Request(request);
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,3 @@
1
+ {
2
+ "highestSdkVersion": "2.6.2"
3
+ }
@@ -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
- .ripple {
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
- border-radius: 50%;
20
- transform: scale(0);
21
- animation: ripple-animation 1s ease-out;
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
- @keyframes ripple-animation {
26
- to {
27
- transform: scale(4);
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';
@@ -0,0 +1,3 @@
1
+ // Component Props Types - Centralized exports for consumers
2
+ // Usage: import type { ButtonProps, InputProps } from 'tera-system-ui/types'
3
+ export {};