@astryxdesign/core 0.5.1 → 0.5.2-canary.11abdc7

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 (74) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/Toast/useToastGesture.d.ts.map +1 -1
  3. package/dist/Toast/useToastGesture.js +46 -9
  4. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  5. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  6. package/dist/i18n/InternationalizationContext.js +3 -1
  7. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  8. package/dist/i18n/InternationalizationProvider.js +3 -1
  9. package/dist/i18n/resolve.d.ts +1 -1
  10. package/dist/i18n/resolve.d.ts.map +1 -1
  11. package/dist/i18n/resolve.js +37 -38
  12. package/dist/i18n/useTranslator.d.ts.map +1 -1
  13. package/dist/i18n/useTranslator.js +2 -3
  14. package/locales/af-ZA.json +0 -4
  15. package/locales/ar-SA.json +0 -4
  16. package/locales/ca-ES.json +0 -4
  17. package/locales/cs-CZ.json +0 -4
  18. package/locales/da-DK.json +0 -4
  19. package/locales/de-DE.json +0 -4
  20. package/locales/el-GR.json +0 -4
  21. package/locales/es-ES.json +0 -4
  22. package/locales/fi-FI.json +0 -4
  23. package/locales/fr-FR.json +0 -4
  24. package/locales/he-IL.json +0 -4
  25. package/locales/hu-HU.json +0 -4
  26. package/locales/it-IT.json +0 -4
  27. package/locales/ja-JP.json +0 -4
  28. package/locales/ko-KR.json +0 -4
  29. package/locales/nl-NL.json +0 -4
  30. package/locales/no-NO.json +0 -4
  31. package/locales/pl-PL.json +0 -4
  32. package/locales/pt-BR.json +0 -4
  33. package/locales/pt-PT.json +0 -4
  34. package/locales/ro-RO.json +0 -4
  35. package/locales/ru-RU.json +0 -4
  36. package/locales/sr-SP.json +0 -4
  37. package/locales/sv-SE.json +0 -4
  38. package/locales/tr-TR.json +0 -4
  39. package/locales/uk-UA.json +0 -4
  40. package/locales/vi-VN.json +0 -4
  41. package/locales/zh-CN.json +0 -4
  42. package/locales/zh-TW.json +0 -4
  43. package/package.json +3 -3
  44. package/src/Calendar/Calendar.doc.mjs +1 -1
  45. package/src/CheckboxInput/CheckboxInput.doc.mjs +1 -1
  46. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  47. package/src/ComplexSelector/ComplexSelector.doc.mjs +2 -2
  48. package/src/DateInput/DateInput.doc.mjs +1 -1
  49. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  50. package/src/DateTimeInput/DateTimeInput.doc.mjs +1 -1
  51. package/src/Field/Field.doc.mjs +1 -1
  52. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  53. package/src/FileInput/FileInput.doc.mjs +1 -1
  54. package/src/Indicator/Indicator.doc.mjs +1 -1
  55. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  56. package/src/MultiSelector/MultiSelector.doc.mjs +1 -1
  57. package/src/NumberInput/NumberInput.doc.mjs +1 -1
  58. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  59. package/src/RadioList/RadioList.doc.mjs +1 -1
  60. package/src/Selector/Selector.doc.mjs +1 -1
  61. package/src/Slider/Slider.doc.mjs +2 -2
  62. package/src/Switch/Switch.doc.mjs +1 -1
  63. package/src/TextArea/TextArea.doc.mjs +1 -1
  64. package/src/TextInput/TextInput.doc.mjs +1 -1
  65. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  66. package/src/Toast/ToastViewport.test.tsx +118 -4
  67. package/src/Toast/useToastGesture.ts +61 -8
  68. package/src/Tokenizer/Tokenizer.doc.mjs +1 -1
  69. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  70. package/src/i18n/InternationalizationContext.ts +3 -0
  71. package/src/i18n/InternationalizationProvider.tsx +8 -1
  72. package/src/i18n/__tests__/resolve.test.ts +23 -1
  73. package/src/i18n/resolve.ts +46 -49
  74. package/src/i18n/useTranslator.ts +2 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @xds/core
2
2
 
3
+ # 0.5.2
4
+
5
+ #### Fixes
6
+
7
+ - Rename the Data Input component category to Form Controls (#5686)
8
+
9
+ #### Performance
10
+
11
+ - Improve frequent translation lookups by pre-building locale maps (#4696)
12
+
13
+ #### Contributors
14
+
15
+ Thanks to everyone who contributed to this release:
16
+
17
+ - @ngolin
18
+ - @rubyycheung
19
+
20
+ ---
21
+
3
22
  # 0.5.1
4
23
 
5
24
  #### New Features
@@ -1 +1 @@
1
- {"version":3,"file":"useToastGesture.d.ts","sourceRoot":"","sources":["../../src/Toast/useToastGesture.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAC,YAAY,IAAI,iBAAiB,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAWxE,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAoB3C,UAAU,sBAAsB;IAC9B,SAAS,EAAE,qBAAqB,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,CAClB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,IAAI,EAAE,WAAW,KACd,OAAO,CAAC;CACd;AAED,UAAU,oBAAoB;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClE,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAChE,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACpE,oBAAoB,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC1C,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAcD,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,kBAAkB,GACnB,EAAE,sBAAsB,GAAG,qBAAqB,CA4QhD"}
1
+ {"version":3,"file":"useToastGesture.d.ts","sourceRoot":"","sources":["../../src/Toast/useToastGesture.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAC,YAAY,IAAI,iBAAiB,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAWxE,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAsB3C,UAAU,sBAAsB;IAC9B,SAAS,EAAE,qBAAqB,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,CAClB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,IAAI,EAAE,WAAW,KACd,OAAO,CAAC;CACd;AAED,UAAU,oBAAoB;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClE,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAChE,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACpE,oBAAoB,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC1C,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAcD,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,kBAAkB,GACnB,EAAE,sBAAsB,GAAG,qBAAqB,CA+ThD"}
@@ -62,6 +62,7 @@ export function useToastGesture({
62
62
  }
63
63
  const surfaceSize = Math.max(root.getBoundingClientRect().height, 1);
64
64
  gestureRef.current = {
65
+ source: point.source,
65
66
  pointerId: point.pointerId,
66
67
  startX: point.clientX,
67
68
  startY: point.clientY,
@@ -77,7 +78,7 @@ export function useToastGesture({
77
78
  const moveGesture = useCallback((point, preventDefault, releaseCapture) => {
78
79
  const state = gestureRef.current;
79
80
  const root = rootRef.current;
80
- if (!state || !root || point.pointerId !== state.pointerId) {
81
+ if (!state || !root || point.source !== state.source || point.pointerId !== state.pointerId) {
81
82
  return;
82
83
  }
83
84
  const deltaX = point.clientX - state.startX;
@@ -111,7 +112,7 @@ export function useToastGesture({
111
112
  const endGesture = useCallback(point => {
112
113
  const state = gestureRef.current;
113
114
  const root = rootRef.current;
114
- if (!state || !root || point.pointerId !== state.pointerId) {
115
+ if (!state || !root || point.source !== state.source || point.pointerId !== state.pointerId) {
115
116
  return;
116
117
  }
117
118
  const travel = Math.max(0, (point.clientY - state.startY) * state.direction);
@@ -120,6 +121,10 @@ export function useToastGesture({
120
121
  gestureRef.current = null;
121
122
  root.style.removeProperty('transition-duration');
122
123
  if (isDismissed) {
124
+ // The exit animation owns the final translation. Clear the live-drag
125
+ // transform/fade/scale first so a standalone Toast does not remain
126
+ // partially translated or faded after its dismiss callback fires.
127
+ clearTransientStyles(root);
123
128
  root.style.setProperty('--_toast-swipe-exit-y', state.direction === 1 ? SWIPE_EXIT_DISTANCE : `calc(-1 * ${SWIPE_EXIT_DISTANCE})`);
124
129
  dismiss();
125
130
  return;
@@ -130,7 +135,12 @@ export function useToastGesture({
130
135
  }
131
136
  }, [dismiss, resumeTimer]);
132
137
  const handlePointerDown = useCallback(event => {
133
- if (event.pointerType === 'pen' && (event.button == null || event.button === 0) && beginGesture(event, event.target)) {
138
+ if (event.pointerType === 'pen' && (event.button == null || event.button === 0) && beginGesture({
139
+ source: 'pen',
140
+ pointerId: event.pointerId,
141
+ clientX: event.clientX,
142
+ clientY: event.clientY
143
+ }, event.target)) {
134
144
  rootRef.current?.setPointerCapture?.(event.pointerId);
135
145
  }
136
146
  }, [beginGesture]);
@@ -138,17 +148,27 @@ export function useToastGesture({
138
148
  if (event.pointerType !== 'pen') {
139
149
  return;
140
150
  }
141
- moveGesture(event, () => event.preventDefault(), () => rootRef.current?.releasePointerCapture?.(event.pointerId));
151
+ moveGesture({
152
+ source: 'pen',
153
+ pointerId: event.pointerId,
154
+ clientX: event.clientX,
155
+ clientY: event.clientY
156
+ }, () => event.preventDefault(), () => rootRef.current?.releasePointerCapture?.(event.pointerId));
142
157
  }, [moveGesture]);
143
158
  const handlePointerUp = useCallback(event => {
144
159
  if (event.pointerType !== 'pen') {
145
160
  return;
146
161
  }
147
162
  rootRef.current?.releasePointerCapture?.(event.pointerId);
148
- endGesture(event);
163
+ endGesture({
164
+ source: 'pen',
165
+ pointerId: event.pointerId,
166
+ clientX: event.clientX,
167
+ clientY: event.clientY
168
+ });
149
169
  }, [endGesture]);
150
170
  const handlePointerCancel = useCallback(event => {
151
- if (event.pointerType === 'pen' && gestureRef.current?.pointerId === event.pointerId) {
171
+ if (event.pointerType === 'pen' && gestureRef.current?.source === 'pen' && gestureRef.current?.pointerId === event.pointerId) {
152
172
  resetGesture(true);
153
173
  }
154
174
  }, [resetGesture]);
@@ -158,21 +178,34 @@ export function useToastGesture({
158
178
  return;
159
179
  }
160
180
  const point = touch => ({
181
+ source: 'touch',
161
182
  pointerId: touch.identifier,
162
183
  clientX: touch.clientX,
163
184
  clientY: touch.clientY
164
185
  });
165
186
  const changedTouch = event => {
166
- const pointerId = gestureRef.current?.pointerId;
187
+ const state = gestureRef.current;
188
+ const pointerId = state?.source === 'touch' ? state.pointerId : null;
167
189
  return pointerId == null ? undefined : [...event.changedTouches].find(touch => touch.identifier === pointerId);
168
190
  };
169
191
  const handleTouchStart = event => {
170
- const touch = event.touches.length === 1 ? event.changedTouches[0] : null;
171
- if (touch) {
192
+ if (event.touches?.length !== 1) {
193
+ // A second contact means the browser may be handling pinch zoom or
194
+ // two-finger scrolling. Abandon any accepted one-finger swipe before
195
+ // touchmove can suppress that native gesture.
196
+ resetGesture(true);
197
+ return;
198
+ }
199
+ const touch = event.changedTouches[0];
200
+ if (touch != null) {
172
201
  beginGesture(point(touch), event.target);
173
202
  }
174
203
  };
175
204
  const handleTouchMove = event => {
205
+ if (event.touches?.length !== 1) {
206
+ resetGesture(true);
207
+ return;
208
+ }
176
209
  const touch = changedTouch(event);
177
210
  if (touch) {
178
211
  moveGesture(point(touch), () => {
@@ -183,6 +216,10 @@ export function useToastGesture({
183
216
  }
184
217
  };
185
218
  const handleTouchEnd = event => {
219
+ if (event.touches.length > 0) {
220
+ resetGesture(true);
221
+ return;
222
+ }
186
223
  const touch = changedTouch(event);
187
224
  if (touch) {
188
225
  endGesture(point(touch));
@@ -1,9 +1,11 @@
1
+ import { getResolve } from './resolve';
1
2
  import type { Locale, MessagesByLocale, Overrides } from './types';
2
3
  export interface InternationalizationContextValue {
3
4
  locale: Locale;
4
5
  direction: 'ltr' | 'rtl';
5
6
  messages: MessagesByLocale;
6
7
  overrides?: Overrides;
8
+ translate: ReturnType<typeof getResolve>;
7
9
  }
8
10
  /**
9
11
  * Default value falls through to the shipped en catalog in resolve().
@@ -1 +1 @@
1
- {"version":3,"file":"InternationalizationContext.d.ts","sourceRoot":"","sources":["../../src/i18n/InternationalizationContext.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAEjE,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,2DAKpC,CAAC"}
1
+ {"version":3,"file":"InternationalizationContext.d.ts","sourceRoot":"","sources":["../../src/i18n/InternationalizationContext.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAEjE,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,2DAMpC,CAAC"}
@@ -22,6 +22,7 @@
22
22
  * - /packages/core/src/i18n/index.ts
23
23
  */
24
24
  import { createContext } from 'react';
25
+ import { getResolve } from "./resolve.js";
25
26
  /**
26
27
  * Default value falls through to the shipped en catalog in resolve().
27
28
  * A consumer that doesn't render a provider still gets English defaults.
@@ -29,6 +30,7 @@ import { createContext } from 'react';
29
30
  export const InternationalizationContext = /*#__PURE__*/createContext({
30
31
  locale: 'en',
31
32
  direction: 'ltr',
32
- messages: {}
33
+ messages: {},
34
+ translate: getResolve('en', {})
33
35
  });
34
36
  InternationalizationContext.displayName = 'InternationalizationContext';
@@ -1 +1 @@
1
- {"version":3,"file":"InternationalizationProvider.d.ts","sourceRoot":"","sources":["../../src/i18n/InternationalizationProvider.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAU,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAEjE,MAAM,WAAW,iCAAiC;IAChD;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,MAAM,EACN,QAAQ,EACR,SAAS,EACT,GAAG,EACH,QAAQ,GACT,EAAE,iCAAiC,+BAWnC;yBAjBe,4BAA4B"}
1
+ {"version":3,"file":"InternationalizationProvider.d.ts","sourceRoot":"","sources":["../../src/i18n/InternationalizationProvider.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAU,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAGjE,MAAM,WAAW,iCAAiC;IAChD;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,MAAM,EACN,QAAQ,EACR,SAAS,EACT,GAAG,EACH,QAAQ,GACT,EAAE,iCAAiC,+BAiBnC;yBAvBe,4BAA4B"}
@@ -21,6 +21,7 @@
21
21
  import { useMemo } from 'react';
22
22
  import { InternationalizationContext } from "./InternationalizationContext.js";
23
23
  import { getLocaleDirection } from "./getLocaleDirection.js";
24
+ import { getResolve } from "./resolve.js";
24
25
  import { jsx as _jsx } from "react/jsx-runtime";
25
26
  /**
26
27
  * Provides locale + additional messages + overrides to all astryx
@@ -38,7 +39,8 @@ export function InternationalizationProvider({
38
39
  locale,
39
40
  direction,
40
41
  messages: messages ?? {},
41
- overrides
42
+ overrides,
43
+ translate: getResolve(locale, messages ?? {}, overrides)
42
44
  }), [locale, direction, messages, overrides]);
43
45
  return /*#__PURE__*/_jsx(InternationalizationContext, {
44
46
  value: value,
@@ -13,7 +13,7 @@ import type { Locale, MessagesByLocale, Overrides } from './types';
13
13
  * shipped en catalog separately as the final source-of-truth.
14
14
  */
15
15
  export declare function resolveLocaleChain(locale: Locale): Locale[];
16
- export declare function resolve(key: string, values: Record<string, unknown> | undefined, locale: Locale, messages: MessagesByLocale, overrides: Overrides | undefined): string;
16
+ export declare function getResolve(locale: Locale, messages: MessagesByLocale, overrides?: Overrides): (key: string, values: Record<string, unknown> | undefined) => string;
17
17
  /**
18
18
  * Reset internal caches. Test-only.
19
19
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/i18n/resolve.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAU,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAwB1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAc3D;AAsCD,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,MAAM,CA0BR;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/i18n/resolve.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAU,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAwB1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAc3D;AAkCD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,CAAC,EAAE,SAAS,IAIb,KAAK,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,YA0BjE;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
@@ -69,55 +69,54 @@ export function resolveLocaleChain(locale) {
69
69
  }
70
70
  return chain;
71
71
  }
72
- function lookup(key, locale, messages, overrides) {
72
+ function getLookup(locale, messages, overrides) {
73
+ const lookup = {};
73
74
  const chain = resolveLocaleChain(locale);
74
-
75
75
  // 1 + 2. Overrides (most specific to least specific in the chain)
76
76
  if (overrides !== undefined) {
77
77
  for (const tag of chain) {
78
- const value = overrides[tag]?.[key];
79
- if (value !== undefined) {
80
- return value;
78
+ if (overrides[tag]) {
79
+ for (const [key, value] of Object.entries(overrides[tag])) {
80
+ if (lookup[key] === undefined && value !== null) {
81
+ lookup[key] = value;
82
+ }
83
+ }
81
84
  }
82
85
  }
83
86
  }
84
-
85
- // 3 + 4. Shipped catalogs (most specific to least specific)
86
87
  for (const tag of chain) {
87
- const entry = messages[tag]?.[key];
88
- if (entry !== undefined) {
89
- return entry.defaultMessage;
88
+ if (messages[tag]) {
89
+ for (const [key, value] of Object.entries(messages[tag])) {
90
+ if (lookup[key] === undefined && value?.defaultMessage !== null) {
91
+ lookup[key] = value?.defaultMessage;
92
+ }
93
+ }
90
94
  }
91
95
  }
92
-
93
- // 5. Shipped en catalog — always present
94
- const enEntry = EN_CATALOG[key];
95
- if (enEntry !== undefined) {
96
- return enEntry.defaultMessage;
97
- }
98
-
99
- // 6. Nothing found
100
- return null;
96
+ return lookup;
101
97
  }
102
- export function resolve(key, values, locale, messages, overrides) {
103
- const result = lookup(key, locale, messages, overrides);
104
- if (result === null) {
105
- // Fires ONLY when a key is missing from every source including the
106
- // shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
107
- // Fallback to `en` from a non-en locale is expected and stays silent,
108
- // matching the FormatJS / i18next default.
109
- warnOnce(`astryx-i18n:${locale}::${key}`, 'astryx-i18n', `missing key: ${key} (locale: ${locale})`);
110
- return key;
111
- }
112
- if (values === undefined) {
113
- // Static string — skip the parser entirely for the common case
114
- return result;
115
- }
116
- const formatted = getFormatter(result, locale).format(values);
117
- // IntlMessageFormat.format returns string | (string | React elements) — we
118
- // only ever pass string values so it will be a string; assert for the type
119
- // system.
120
- return formatted;
98
+ export function getResolve(locale, messages, overrides) {
99
+ const lookup = getLookup(locale, messages, overrides);
100
+ return (key, values) => {
101
+ const result = lookup[key] ?? EN_CATALOG[key]?.defaultMessage;
102
+ if (result === undefined) {
103
+ // Fires ONLY when a key is missing from every source including the
104
+ // shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
105
+ // Fallback to `en` from a non-en locale is expected and stays silent,
106
+ // matching the FormatJS / i18next default.
107
+ warnOnce(`astryx-i18n:${locale}::${key}`, 'astryx-i18n', `missing key: ${key} (locale: ${locale})`);
108
+ return key;
109
+ }
110
+ if (values === undefined) {
111
+ // Static string — skip the parser entirely for the common case
112
+ return result;
113
+ }
114
+ const formatted = getFormatter(result, locale).format(values);
115
+ // IntlMessageFormat.format returns string | (string | React elements) — we
116
+ // only ever pass string values so it will be a string; assert for the type
117
+ // system.
118
+ return formatted;
119
+ };
121
120
  }
122
121
 
123
122
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useTranslator.d.ts","sourceRoot":"","sources":["../../src/i18n/useTranslator.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,MAAM,CAAC;AAEZ;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,YAAY,CAO5C"}
1
+ {"version":3,"file":"useTranslator.d.ts","sourceRoot":"","sources":["../../src/i18n/useTranslator.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,MAAM,CAAC;AAEZ;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,YAAY,CAG5C"}
@@ -18,9 +18,8 @@
18
18
  * - /packages/core/src/i18n/index.ts
19
19
  * - /packages/core/src/i18n/t.client.ts
20
20
  */
21
- import { use, useCallback } from 'react';
21
+ import { use } from 'react';
22
22
  import { InternationalizationContext } from "./InternationalizationContext.js";
23
- import { resolve } from "./resolve.js";
24
23
  /**
25
24
  * Returns a translator function bound to the current provider's locale.
26
25
  * Safe to call from event handlers and effects.
@@ -35,5 +34,5 @@ import { resolve } from "./resolve.js";
35
34
  */
36
35
  export function useTranslator() {
37
36
  const ctx = use(InternationalizationContext);
38
- return useCallback((key, values) => resolve(key, values, ctx.locale, ctx.messages, ctx.overrides), [ctx.locale, ctx.messages, ctx.overrides]);
37
+ return ctx.translate;
39
38
  }
@@ -623,10 +623,6 @@
623
623
  "defaultMessage": "Kies 'n datum",
624
624
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
625
625
  },
626
- "@astryx.dateTimeInput.dialogLabel": {
627
- "defaultMessage": "Kies datum",
628
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
629
- },
630
626
  "@astryx.link.newTab": {
631
627
  "defaultMessage": "(maak in nuwe oortjie oop)",
632
628
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -651,10 +651,6 @@
651
651
  "defaultMessage": "حدّد تاريخًا",
652
652
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
653
653
  },
654
- "@astryx.dateTimeInput.dialogLabel": {
655
- "defaultMessage": "اختر التاريخ",
656
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
657
- },
658
654
  "@astryx.link.newTab": {
659
655
  "defaultMessage": "(يُفتح في علامة تبويب جديدة)",
660
656
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -643,10 +643,6 @@
643
643
  "defaultMessage": "Selecciona una data",
644
644
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
645
645
  },
646
- "@astryx.dateTimeInput.dialogLabel": {
647
- "defaultMessage": "Tria una data",
648
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
649
- },
650
646
  "@astryx.link.newTab": {
651
647
  "defaultMessage": "(s’obre en una pestanya nova)",
652
648
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "Vyberte datum",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "Zvolit datum",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(otevře se na nové kartě)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -639,10 +639,6 @@
639
639
  "defaultMessage": "Vælg en dato",
640
640
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
641
641
  },
642
- "@astryx.dateTimeInput.dialogLabel": {
643
- "defaultMessage": "Vælg dato",
644
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
645
- },
646
642
  "@astryx.link.newTab": {
647
643
  "defaultMessage": "(åbner i ny fane)",
648
644
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -639,10 +639,6 @@
639
639
  "defaultMessage": "Datum auswählen",
640
640
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
641
641
  },
642
- "@astryx.dateTimeInput.dialogLabel": {
643
- "defaultMessage": "Datum auswählen",
644
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
645
- },
646
642
  "@astryx.link.newTab": {
647
643
  "defaultMessage": "(wird in neuem Tab geöffnet)",
648
644
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "Επιλέξτε ημερομηνία",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "Επιλογή ημερομηνίας",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(ανοίγει σε νέα καρτέλα)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "Selecciona una fecha",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "Elige una fecha",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(se abre en una pestaña nueva)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "Valitse päivämäärä",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "Valitse päivämäärä",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(avautuu uuteen välilehteen)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -615,10 +615,6 @@
615
615
  "defaultMessage": "Sélectionner une date",
616
616
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
617
617
  },
618
- "@astryx.dateTimeInput.dialogLabel": {
619
- "defaultMessage": "Choisir une date",
620
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
621
- },
622
618
  "@astryx.link.newTab": {
623
619
  "defaultMessage": "(ouvre un nouvel onglet)",
624
620
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "בחירת תאריך",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "בחירת תאריך",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(נפתח בכרטיסייה חדשה)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "Válasszon dátumot",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "Dátum kiválasztása",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(új lapon nyílik meg)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -639,10 +639,6 @@
639
639
  "defaultMessage": "Seleziona una data",
640
640
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
641
641
  },
642
- "@astryx.dateTimeInput.dialogLabel": {
643
- "defaultMessage": "Scegli una data",
644
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
645
- },
646
642
  "@astryx.link.newTab": {
647
643
  "defaultMessage": "(si apre in una nuova scheda)",
648
644
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -651,10 +651,6 @@
651
651
  "defaultMessage": "日付を選択",
652
652
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
653
653
  },
654
- "@astryx.dateTimeInput.dialogLabel": {
655
- "defaultMessage": "日付を選択",
656
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
657
- },
658
654
  "@astryx.link.newTab": {
659
655
  "defaultMessage": "(新しいタブで開く)",
660
656
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -647,10 +647,6 @@
647
647
  "defaultMessage": "날짜 선택",
648
648
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
649
649
  },
650
- "@astryx.dateTimeInput.dialogLabel": {
651
- "defaultMessage": "날짜 선택",
652
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
653
- },
654
650
  "@astryx.link.newTab": {
655
651
  "defaultMessage": "(새 탭에서 열림)",
656
652
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -615,10 +615,6 @@
615
615
  "defaultMessage": "Selecteer een datum",
616
616
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
617
617
  },
618
- "@astryx.dateTimeInput.dialogLabel": {
619
- "defaultMessage": "Datum kiezen",
620
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
621
- },
622
618
  "@astryx.link.newTab": {
623
619
  "defaultMessage": "(opent in nieuw tabblad)",
624
620
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -643,10 +643,6 @@
643
643
  "defaultMessage": "Velg en dato",
644
644
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
645
645
  },
646
- "@astryx.dateTimeInput.dialogLabel": {
647
- "defaultMessage": "Velg dato",
648
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
649
- },
650
646
  "@astryx.link.newTab": {
651
647
  "defaultMessage": "(åpnes i ny fane)",
652
648
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -639,10 +639,6 @@
639
639
  "defaultMessage": "Wybierz datę",
640
640
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
641
641
  },
642
- "@astryx.dateTimeInput.dialogLabel": {
643
- "defaultMessage": "Wybierz datę",
644
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
645
- },
646
642
  "@astryx.link.newTab": {
647
643
  "defaultMessage": "(otwiera się w nowej karcie)",
648
644
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -643,10 +643,6 @@
643
643
  "defaultMessage": "Selecione uma data",
644
644
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
645
645
  },
646
- "@astryx.dateTimeInput.dialogLabel": {
647
- "defaultMessage": "Escolha uma data",
648
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
649
- },
650
646
  "@astryx.link.newTab": {
651
647
  "defaultMessage": "(abre em uma nova guia)",
652
648
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -643,10 +643,6 @@
643
643
  "defaultMessage": "Selecione uma data",
644
644
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
645
645
  },
646
- "@astryx.dateTimeInput.dialogLabel": {
647
- "defaultMessage": "Escolha uma data",
648
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
649
- },
650
646
  "@astryx.link.newTab": {
651
647
  "defaultMessage": "(abre num novo separador)",
652
648
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
@@ -643,10 +643,6 @@
643
643
  "defaultMessage": "Selectează o dată",
644
644
  "description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
645
645
  },
646
- "@astryx.dateTimeInput.dialogLabel": {
647
- "defaultMessage": "Alege data",
648
- "description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
649
- },
650
646
  "@astryx.link.newTab": {
651
647
  "defaultMessage": "(se deschide într-o filă nouă)",
652
648
  "description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."