@cosmicdrift/kumiko-renderer 0.193.0 → 0.194.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/__tests__/error-i18n-defaults.test.ts +9 -0
- package/src/app/__tests__/content-editors.test.tsx +8 -3
- package/src/app/__tests__/content-preview.test.tsx +23 -1
- package/src/app/__tests__/form-schema.test.ts +8 -12
- package/src/app/content-editors.tsx +1 -1
- package/src/app/extension-sections.tsx +5 -2
- package/src/app/form-schema.ts +13 -3
- package/src/app/kumiko-screen.tsx +2 -1
- package/src/components/__tests__/embedded-list-field.test.tsx +68 -1
- package/src/components/__tests__/render-field-money-embedded-list-consistency.test.tsx +212 -0
- package/src/components/__tests__/render-field-money-roundtrip.test.tsx +14 -0
- package/src/components/__tests__/render-field-unsupported-types.test.tsx +22 -1
- package/src/components/embedded-list-field.tsx +59 -7
- package/src/components/render-edit-logic.ts +3 -8
- package/src/components/render-edit.tsx +127 -65
- package/src/components/render-field.tsx +15 -3
- package/src/i18n-defaults.ts +23 -5
- package/src/index.ts +1 -0
- package/src/primitives.tsx +28 -7
package/src/i18n-defaults.ts
CHANGED
|
@@ -30,9 +30,6 @@ export const kumikoDefaultTranslations: TranslationsByLocale = {
|
|
|
30
30
|
"kumiko.wizard.step": "Schritt {current} von {total}",
|
|
31
31
|
"kumiko.wizard.step-with-title": "Schritt {current} von {total} · {title}",
|
|
32
32
|
|
|
33
|
-
// StepBar widget (renderer-web) — screen-reader text for completed steps whose number is visually replaced by a checkmark.
|
|
34
|
-
"kumiko.widget.stepBar.done": "Erledigt",
|
|
35
|
-
|
|
36
33
|
// Version — Update-Awareness-Banner (UpdateChecker).
|
|
37
34
|
"kumiko.version.update-available": "Eine neue Version ist verfügbar.",
|
|
38
35
|
|
|
@@ -57,6 +54,10 @@ export const kumikoDefaultTranslations: TranslationsByLocale = {
|
|
|
57
54
|
"kumiko.field.embedded-list.move-down": "Nach unten verschieben",
|
|
58
55
|
"kumiko.field.embedded-list.empty": "Noch keine Zeilen.",
|
|
59
56
|
"kumiko.field.embedded-list.empty-cta": "Erste Zeile hinzufügen",
|
|
57
|
+
"kumiko.field.embedded-list.paste-rows-truncated":
|
|
58
|
+
"{count} eingefügte Zeile(n) wurden verworfen (maximale Zeilenzahl erreicht).",
|
|
59
|
+
"kumiko.field.embedded-list.paste-cells-unmatched":
|
|
60
|
+
"{count} Zelle(n) hatten keine passende Option und wurden nicht geändert.",
|
|
60
61
|
|
|
61
62
|
// List — DataTable Toolbar, Empty-State, Search.
|
|
62
63
|
"kumiko.list.search-placeholder": "Suchen…",
|
|
@@ -83,12 +84,20 @@ export const kumikoDefaultTranslations: TranslationsByLocale = {
|
|
|
83
84
|
"kumiko.widget.upload.uploading": "Wird hochgeladen…",
|
|
84
85
|
"kumiko.widget.upload.done": "Hochgeladen",
|
|
85
86
|
"kumiko.widget.upload.error": "Fehlgeschlagen",
|
|
87
|
+
"kumiko.widget.upload.rejected-type": "Dateityp nicht erlaubt",
|
|
88
|
+
|
|
89
|
+
// Widgets — StepBar screen-reader text for completed steps whose number is visually replaced by a checkmark.
|
|
90
|
+
"kumiko.widget.step-bar.done": "Erledigt",
|
|
86
91
|
|
|
87
92
|
// Nav — Sidebar Tree (Toggle-aria-Labels).
|
|
88
93
|
"kumiko.nav.expand": "Aufklappen",
|
|
89
94
|
"kumiko.nav.collapse": "Zuklappen",
|
|
90
95
|
"kumiko.nav.search": "Navigation durchsuchen…",
|
|
91
96
|
|
|
97
|
+
// Workspace — Switcher-Trigger aria-Label (renderer-web).
|
|
98
|
+
"kumiko.workspace.switch": "Workspace wechseln",
|
|
99
|
+
"kumiko.workspace.select": "Workspace wählen",
|
|
100
|
+
|
|
92
101
|
// Dialog — Confirm-Buttons + Close-aria-Label.
|
|
93
102
|
"kumiko.dialog.confirm": "Bestätigen",
|
|
94
103
|
"kumiko.dialog.cancel": "Abbrechen",
|
|
@@ -211,8 +220,6 @@ export const kumikoDefaultTranslations: TranslationsByLocale = {
|
|
|
211
220
|
"kumiko.wizard.step": "Step {current} of {total}",
|
|
212
221
|
"kumiko.wizard.step-with-title": "Step {current} of {total} · {title}",
|
|
213
222
|
|
|
214
|
-
"kumiko.widget.stepBar.done": "Done",
|
|
215
|
-
|
|
216
223
|
"kumiko.version.update-available": "A new version is available.",
|
|
217
224
|
|
|
218
225
|
"kumiko.toast.learn-more": "Learn more",
|
|
@@ -234,6 +241,10 @@ export const kumikoDefaultTranslations: TranslationsByLocale = {
|
|
|
234
241
|
"kumiko.field.embedded-list.move-down": "Move down",
|
|
235
242
|
"kumiko.field.embedded-list.empty": "No rows yet.",
|
|
236
243
|
"kumiko.field.embedded-list.empty-cta": "Add first row",
|
|
244
|
+
"kumiko.field.embedded-list.paste-rows-truncated":
|
|
245
|
+
"{count} pasted row(s) were dropped (max row count reached).",
|
|
246
|
+
"kumiko.field.embedded-list.paste-cells-unmatched":
|
|
247
|
+
"{count} cell(s) had no matching option and were left unchanged.",
|
|
237
248
|
|
|
238
249
|
"kumiko.list.search-placeholder": "Search…",
|
|
239
250
|
"kumiko.list.empty.title": "No entries yet.",
|
|
@@ -254,11 +265,18 @@ export const kumikoDefaultTranslations: TranslationsByLocale = {
|
|
|
254
265
|
"kumiko.widget.upload.uploading": "Uploading…",
|
|
255
266
|
"kumiko.widget.upload.done": "Uploaded",
|
|
256
267
|
"kumiko.widget.upload.error": "Failed",
|
|
268
|
+
"kumiko.widget.upload.rejected-type": "File type not allowed",
|
|
269
|
+
|
|
270
|
+
"kumiko.widget.step-bar.done": "Done",
|
|
257
271
|
|
|
258
272
|
"kumiko.nav.expand": "Expand",
|
|
259
273
|
"kumiko.nav.collapse": "Collapse",
|
|
260
274
|
"kumiko.nav.search": "Search navigation…",
|
|
261
275
|
|
|
276
|
+
"kumiko.workspace.switch": "Switch workspace",
|
|
277
|
+
// Workspace-Switcher fallback label when activeId points at no visible workspace.
|
|
278
|
+
"kumiko.workspace.select": "Select workspace",
|
|
279
|
+
|
|
262
280
|
"kumiko.dialog.confirm": "Confirm",
|
|
263
281
|
"kumiko.dialog.cancel": "Cancel",
|
|
264
282
|
"kumiko.dialog.close": "Close",
|
package/src/index.ts
CHANGED
package/src/primitives.tsx
CHANGED
|
@@ -127,8 +127,11 @@ export type BannerProps = {
|
|
|
127
127
|
readonly padded?: boolean;
|
|
128
128
|
readonly testId?: string;
|
|
129
129
|
/** Set when a `<Field>` wraps this Banner as its control (no actual
|
|
130
|
-
* input exists
|
|
131
|
-
*
|
|
130
|
+
* input exists for the label to target — see render-field.tsx's
|
|
131
|
+
* unsupported-field-type fallback, #1834). The web implementation uses
|
|
132
|
+
* it to derive `role="group"` + `aria-labelledby`, not `htmlFor`: a
|
|
133
|
+
* `<label for>` on a non-labelable element like a `<div>` is inert for
|
|
134
|
+
* screen readers. */
|
|
132
135
|
readonly id?: string;
|
|
133
136
|
};
|
|
134
137
|
|
|
@@ -270,6 +273,9 @@ export type InputProps =
|
|
|
270
273
|
/** Only for kind:"image" — variant name for the preview
|
|
271
274
|
* (`/api/files/:id/variant/:name`). Absent → the original. */
|
|
272
275
|
readonly imageVariant?: string;
|
|
276
|
+
/** Only for kind:"image" — forwarded to the file input's `capture`
|
|
277
|
+
* attribute so a phone opens the camera instead of the file picker. */
|
|
278
|
+
readonly capture?: "environment" | "user";
|
|
273
279
|
}
|
|
274
280
|
| {
|
|
275
281
|
readonly kind: "date";
|
|
@@ -437,6 +443,9 @@ export type InputProps =
|
|
|
437
443
|
readonly disabled?: boolean;
|
|
438
444
|
readonly required?: boolean;
|
|
439
445
|
readonly hasError?: boolean;
|
|
446
|
+
/** Read-only Textarea. Nicht `disabled` — bleibt fokussier-/
|
|
447
|
+
* kopierbar (analog zu kind:"text"). */
|
|
448
|
+
readonly readOnly?: boolean;
|
|
440
449
|
};
|
|
441
450
|
|
|
442
451
|
// Sort-Wire-Format. `null`-State unterscheidet "User hat noch nichts
|
|
@@ -723,11 +732,6 @@ export type SectionProps = {
|
|
|
723
732
|
* Default "default" (normal card border). */
|
|
724
733
|
readonly variant?: "default" | "destructive";
|
|
725
734
|
readonly testId?: string;
|
|
726
|
-
/** Keeps the section mounted while visually hiding it (native `hidden`
|
|
727
|
-
* attribute where supported) — used by wizard mode to keep off-screen
|
|
728
|
-
* steps mounted so their state (e.g. an extension section's submit
|
|
729
|
-
* registration) survives step navigation instead of unmounting. */
|
|
730
|
-
readonly hidden?: boolean;
|
|
731
735
|
};
|
|
732
736
|
|
|
733
737
|
/** Columns-basiertes Layout. Web: CSS grid, Native: Flex-Wrap mit
|
|
@@ -909,6 +913,19 @@ export type StepBarProps = {
|
|
|
909
913
|
readonly compactTestId?: string;
|
|
910
914
|
};
|
|
911
915
|
|
|
916
|
+
/** Wraps a single wizard step so it stays mounted but inert while off-
|
|
917
|
+
* screen — `hidden` visually hides it, and implementations that have a
|
|
918
|
+
* native constraint-validation concept (web: `<fieldset disabled>`, spec-
|
|
919
|
+
* guaranteed to also bar descendants from participating) must bar it too,
|
|
920
|
+
* or a `type="submit"` step-advance button triggers the browser's
|
|
921
|
+
* full-form check against fields on unvisited, unfocusable steps
|
|
922
|
+
* (kumiko-framework#1976). Implementations without that concept can gate
|
|
923
|
+
* on `hidden` alone. */
|
|
924
|
+
export type WizardStepGroupProps = {
|
|
925
|
+
readonly hidden: boolean;
|
|
926
|
+
readonly children: ReactNode;
|
|
927
|
+
};
|
|
928
|
+
|
|
912
929
|
// ---- Core-Registry (Kumiko-eigene Primitives) ----
|
|
913
930
|
|
|
914
931
|
export type CorePrimitives = {
|
|
@@ -942,6 +959,10 @@ export type CorePrimitives = {
|
|
|
942
959
|
* CorePrimitives mocks in tests keep compiling — additive rollout of
|
|
943
960
|
* a new primitive shouldn't force every test double to grow a stub. */
|
|
944
961
|
readonly StepBar?: ComponentType<StepBarProps>;
|
|
962
|
+
/** Optional (unlike the other Core-Primitives) so existing partial
|
|
963
|
+
* CorePrimitives mocks in tests keep compiling — additive rollout of
|
|
964
|
+
* a new primitive shouldn't force every test double to grow a stub. */
|
|
965
|
+
readonly WizardStepGroup?: ComponentType<WizardStepGroupProps>;
|
|
945
966
|
};
|
|
946
967
|
|
|
947
968
|
/** Offene Extension-Zone für App-eigene Primitives. Devs erweitern
|