@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.
@@ -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
@@ -180,6 +180,7 @@ export type {
180
180
  SectionProps,
181
181
  StepBarProps,
182
182
  TextProps,
183
+ WizardStepGroupProps,
183
184
  } from "./primitives";
184
185
  export { PrimitivesProvider, usePrimitives } from "./primitives";
185
186
  export { sortByAccessor } from "./sort-by-accessor";
@@ -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 to receive the label's `htmlFor` otherwise — see
131
- * render-field.tsx's unsupported-field-type fallback, #1834). */
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