@cosmicdrift/kumiko-renderer 0.368.0 → 0.370.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.
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from "react";
2
- import type { FeatureSchema } from "./feature-schema.js";
2
+ import type { FeatureSchema } from "./feature-schema.ts";
3
3
  export type AppFeaturesProviderProps = {
4
4
  readonly features: readonly FeatureSchema[];
5
5
  readonly children: ReactNode;
@@ -1,5 +1,5 @@
1
1
  import type { EditFieldSpec } from "@cosmicdrift/kumiko-framework/ui-types";
2
- import type { CurrentUser } from "../current-user.js";
2
+ import type { CurrentUser } from "../current-user.tsx";
3
3
  type NormalizedEditField = Exclude<EditFieldSpec, string>;
4
4
  /** Calendar date (`YYYY-MM-DD`) of `now` in the given IANA zone. The en-CA
5
5
  * locale is used only because it formats dates as year-month-day. */
@@ -1,4 +1,4 @@
1
- import type { RenderEditAction } from "../components/render-edit-types.js";
1
+ import type { RenderEditAction } from "../components/render-edit-types.ts";
2
2
  export declare function primaryHeaderAction(actions: readonly RenderEditAction[], preferredId?: string): RenderEditAction | undefined;
3
3
  export type CompactHeaderPrimary = {
4
4
  readonly action: RenderEditAction;
@@ -1,10 +1,10 @@
1
1
  import type { ScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
2
  import type { FormValues, ListRowViewModel, Translate } from "@cosmicdrift/kumiko-headless";
3
3
  import { type ReactNode } from "react";
4
- import { type ListSort } from "../hooks/use-list-url-state.js";
5
- import type { FeatureSchema } from "./feature-schema.js";
6
- import { qualifyScreenId } from "./qualify-screen-id.js";
7
- import { screenAccessAllows } from "./screen-access.js";
4
+ import { type ListSort } from "../hooks/use-list-url-state.ts";
5
+ import type { FeatureSchema } from "./feature-schema.ts";
6
+ import { qualifyScreenId } from "./qualify-screen-id.ts";
7
+ import { screenAccessAllows } from "./screen-access.ts";
8
8
  export type KumikoScreenProps = {
9
9
  readonly schema: FeatureSchema;
10
10
  readonly qn: string;
@@ -2655,6 +2655,13 @@ function buildConfigEditDefaults(fields) {
2655
2655
  }
2656
2656
  return defaults;
2657
2657
  }
2658
+ // A field hidden by its `visible` condition (a provider's settings while another
2659
+ // provider is picked) is not saved: the form saves what it shows.
2660
+ function hiddenLayoutFieldNames(screen, values) {
2661
+ return new Set(layoutEditFields(screen)
2662
+ .filter((spec) => spec.visible !== undefined && !evalFieldCondition(spec.visible, values))
2663
+ .map((spec) => spec.field));
2664
+ }
2658
2665
  function isEmptyNumericFormValue(value) {
2659
2666
  if (value === undefined || value === null || value === "")
2660
2667
  return true;
@@ -2670,6 +2677,8 @@ function ConfigEditBody({ schema, screen, translate, }) {
2670
2677
  // unsere Form-Field-Werte.
2671
2678
  const valuesQuery = useQuery("config:query:values", {});
2672
2679
  const cascadeQuery = useQuery("config:query:cascade", {});
2680
+ const secretKeys = screen.secretKeys;
2681
+ const secretsQuery = useQuery("secrets:query:list", {}, { enabled: secretKeys !== undefined });
2673
2682
  const synthEntity = useMemo(() => synthesizeConfigEditEntity(screen.fields), [screen.fields]);
2674
2683
  const synthScreen = useMemo(() => synthesizeConfigEditScreen(screen), [screen]);
2675
2684
  const boundsSchema = useMemo(() => buildConfigEditSchema(screen.fields), [screen.fields]);
@@ -2681,9 +2690,17 @@ function ConfigEditBody({ schema, screen, translate, }) {
2681
2690
  const initial = useMemo(() => {
2682
2691
  if (valuesQuery.data === null)
2683
2692
  return null;
2693
+ if (secretKeys !== undefined && secretsQuery.data === null)
2694
+ return null;
2695
+ const storedSecretKeys = new Set((secretsQuery.data ?? []).map((row) => row.key));
2684
2696
  const out = {};
2685
2697
  const defaults = buildConfigEditDefaults(screen.fields);
2686
2698
  for (const [shortName, fieldDef] of Object.entries(screen.fields)) {
2699
+ const secretKey = secretKeys?.[shortName];
2700
+ if (secretKey !== undefined) {
2701
+ out[shortName] = storedSecretKeys.has(secretKey) ? true : null;
2702
+ continue;
2703
+ }
2687
2704
  const qualified = screen.configKeys[shortName];
2688
2705
  if (qualified === undefined) {
2689
2706
  // Author hat ein Field deklariert ohne Mapping — nimm Default.
@@ -2719,7 +2736,14 @@ function ConfigEditBody({ schema, screen, translate, }) {
2719
2736
  }
2720
2737
  }
2721
2738
  return out;
2722
- }, [valuesQuery.data, screen.fields, screen.configKeys, screen.scope]);
2739
+ }, [
2740
+ valuesQuery.data,
2741
+ secretsQuery.data,
2742
+ secretKeys,
2743
+ screen.fields,
2744
+ screen.configKeys,
2745
+ screen.scope,
2746
+ ]);
2723
2747
  // Cascade-Lookup: qualifiedKey → ConfigCascade für die
2724
2748
  // Cascade-Anzeige unter jedem Feld. Defensive `levels`-Shape-Check
2725
2749
  // damit fremde Query-Mocks (z.B. configEdit-Unit-Tests die nur
@@ -2749,7 +2773,23 @@ function ConfigEditBody({ schema, screen, translate, }) {
2749
2773
  const customSubmit = useCallback(async (snapshot) => {
2750
2774
  const commands = [];
2751
2775
  const commandFieldNames = [];
2776
+ const hiddenFieldNames = hiddenLayoutFieldNames(synthScreen, snapshot.values);
2752
2777
  for (const [shortName, value] of Object.entries(snapshot.changes)) {
2778
+ if (hiddenFieldNames.has(shortName))
2779
+ continue;
2780
+ const secretKey = secretKeys?.[shortName];
2781
+ if (secretKey !== undefined) {
2782
+ // Same wire shape as a writeOnly config field: null removes, a string replaces.
2783
+ if (value === null) {
2784
+ commandFieldNames.push(shortName);
2785
+ commands.push({ type: "secrets:write:delete", payload: { key: secretKey } });
2786
+ }
2787
+ else if (typeof value === "string" && value.trim() !== "") {
2788
+ commandFieldNames.push(shortName);
2789
+ commands.push({ type: "secrets:write:set", payload: { key: secretKey, value } });
2790
+ }
2791
+ continue;
2792
+ }
2753
2793
  const qualified = screen.configKeys[shortName];
2754
2794
  if (qualified === undefined)
2755
2795
  continue;
@@ -2821,20 +2861,28 @@ function ConfigEditBody({ schema, screen, translate, }) {
2821
2861
  // bleibt die Anzeige stale bis Reload — gleiche refetch-Calls wie onReset.
2822
2862
  // allSettled: der Write ist schon committed, ein gescheitertes Refetch
2823
2863
  // (stale Anzeige) darf das Erfolgsergebnis nicht in einen Fehler kippen.
2824
- await Promise.allSettled([valuesQuery.refetch?.(), cascadeQuery.refetch?.()]);
2864
+ await Promise.allSettled([
2865
+ valuesQuery.refetch?.(),
2866
+ cascadeQuery.refetch?.(),
2867
+ ...(secretKeys !== undefined ? [secretsQuery.refetch?.()] : []),
2868
+ ]);
2825
2869
  return { validationBlocked: false, isSuccess: true, data: undefined };
2826
2870
  }, [
2827
2871
  dispatcher,
2872
+ synthScreen,
2873
+ secretKeys,
2828
2874
  screen.configKeys,
2829
2875
  screen.fields,
2830
2876
  screen.scope,
2831
2877
  valuesQuery.refetch,
2832
2878
  cascadeQuery.refetch,
2879
+ secretsQuery.refetch,
2833
2880
  ]);
2834
2881
  if (valuesQuery.loading && valuesQuery.data === null)
2835
2882
  return _jsx(QueryLoadingBanner, {});
2836
- if (valuesQuery.error) {
2837
- return (_jsx(QueryErrorBanner, { error: valuesQuery.error, translate: effectiveTranslate, onRetry: valuesQuery.refetch }));
2883
+ const failedQuery = valuesQuery.error ? valuesQuery : secretsQuery.error ? secretsQuery : null;
2884
+ if (failedQuery?.error) {
2885
+ return (_jsx(QueryErrorBanner, { error: failedQuery.error, translate: effectiveTranslate, onRetry: failedQuery.refetch }));
2838
2886
  }
2839
2887
  if (initial === null)
2840
2888
  return _jsx(QueryLoadingBanner, {});
@@ -1,7 +1,7 @@
1
1
  import type { ListEmptyStateSpec } from "@cosmicdrift/kumiko-framework/ui-types";
2
2
  import type { Translate } from "@cosmicdrift/kumiko-headless";
3
- import type { ListEmptyStateContent } from "../components/list-empty-state.js";
4
- import { buildRecordActions } from "./row-actions.js";
3
+ import type { ListEmptyStateContent } from "../components/list-empty-state.tsx";
4
+ import { buildRecordActions } from "./row-actions.ts";
5
5
  type ActionBindings = Pick<Parameters<typeof buildRecordActions>[0], "nav" | "host" | "dispatcher" | "openDrawer" | "onWriteSuccess">;
6
6
  export declare function useListEmptyContent(spec: ListEmptyStateSpec | undefined, translate: Translate, bindings: ActionBindings): ListEmptyStateContent | undefined;
7
7
  export declare function isListNarrowed(search: string, filters: Readonly<Record<string, readonly string[]>>, defaultFilters?: Readonly<Record<string, readonly string[]>>): boolean;
@@ -1,6 +1,6 @@
1
1
  import type { EntityListFacetConfig, ListFacetSpec } from "@cosmicdrift/kumiko-framework/ui-types";
2
2
  import type { Translate } from "@cosmicdrift/kumiko-headless";
3
- import type { DataTableFacet, DataTableFacetChip } from "../primitives.js";
3
+ import type { DataTableFacet, DataTableFacetChip } from "../primitives.tsx";
4
4
  export type ResolvedFacetSpec = {
5
5
  readonly field: string;
6
6
  readonly type: "select" | "boolean" | "reference";
package/dist/app/nav.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from "react";
2
- import type { FeatureSchema } from "./feature-schema.js";
2
+ import type { FeatureSchema } from "./feature-schema.ts";
3
3
  export type NavRoute = {
4
4
  readonly workspaceId?: string;
5
5
  readonly screenId: string;
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from "react";
2
- import type { ResolvedFacetSpec } from "./list-facets.js";
2
+ import type { ResolvedFacetSpec } from "./list-facets.ts";
3
3
  export type ReferenceFacetOption = {
4
4
  readonly value: string;
5
5
  readonly label: string;
@@ -1,6 +1,6 @@
1
1
  import { type ReactNode } from "react";
2
- import type { FeatureSchema } from "./feature-schema.js";
3
- import { type NavApi, type NavTarget, type ScreenTarget } from "./nav.js";
2
+ import type { FeatureSchema } from "./feature-schema.ts";
3
+ import { type NavApi, type NavTarget, type ScreenTarget } from "./nav.tsx";
4
4
  export declare const RETURN_TO_PARAM = "returnTo";
5
5
  export type ReturnHost = {
6
6
  readonly screenId: string;
@@ -1,10 +1,10 @@
1
1
  import type { EntityEditScreenDefinition, RelatedListToolbarAction, RowAction, RowActionDrawer, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ToolbarAction } from "@cosmicdrift/kumiko-framework/ui-types";
2
2
  import type { Dispatcher, ListRowViewModel, Translate } from "@cosmicdrift/kumiko-headless";
3
- import type { RenderEditAction } from "../components/render-edit-types.js";
4
- import type { ToolbarActionButton } from "../components/render-list.js";
5
- import type { DataTableRowAction } from "../primitives.js";
6
- import type { NavApi } from "./nav.js";
7
- import { type ReturnHost } from "./return-to.js";
3
+ import type { RenderEditAction } from "../components/render-edit-types.ts";
4
+ import type { ToolbarActionButton } from "../components/render-list.tsx";
5
+ import type { DataTableRowAction } from "../primitives.tsx";
6
+ import type { NavApi } from "./nav.tsx";
7
+ import { type ReturnHost } from "./return-to.tsx";
8
8
  export declare function buildDefaultEditRowAction(editScreen: EntityEditScreenDefinition | undefined, idColumn?: string): RowActionNavigate | undefined;
9
9
  export declare function evalRowExtractor(extractor: RowFieldExtractor, row: Record<string, unknown>): Record<string, unknown>;
10
10
  export declare function isWriteHandlerRowAction(action: RowAction): action is RowActionWriteHandler;
@@ -1,7 +1,7 @@
1
1
  import type { SecretMintScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
2
  import type { Translate } from "@cosmicdrift/kumiko-headless";
3
3
  import { type ReactNode } from "react";
4
- import type { FeatureSchema } from "./feature-schema.js";
4
+ import type { FeatureSchema } from "./feature-schema.ts";
5
5
  export type SecretMintBodyProps = {
6
6
  readonly schema: FeatureSchema;
7
7
  readonly screen: SecretMintScreenDefinition;
@@ -1,4 +1,4 @@
1
- import type { FeatureSchema } from "./feature-schema.js";
1
+ import type { FeatureSchema } from "./feature-schema.ts";
2
2
  export type EmbeddedScreenTarget = {
3
3
  readonly schema: FeatureSchema;
4
4
  readonly qn: string;
@@ -3,5 +3,7 @@ export type VariableChipsProps = {
3
3
  readonly variables: readonly string[];
4
4
  readonly onInsert: (name: string) => void;
5
5
  readonly disabled?: boolean;
6
+ /** Display text per variable name; a named chip keeps the raw name as tooltip. */
7
+ readonly labels?: Readonly<Record<string, string>>;
6
8
  };
7
- export declare function VariableChips({ variables, onInsert, disabled }: VariableChipsProps): ReactNode;
9
+ export declare function VariableChips({ variables, onInsert, disabled, labels, }: VariableChipsProps): ReactNode;
@@ -9,8 +9,11 @@ import { usePrimitives } from "../primitives.js";
9
9
  // No wrapping element: @cosmicdrift/kumiko-renderer is DOM-free (native impls
10
10
  // have no <div>), and layout is a platform concern anyway — the caller
11
11
  // (PlainContentEditor et al.) places these buttons in its own container.
12
- export function VariableChips({ variables, onInsert, disabled }) {
12
+ export function VariableChips({ variables, onInsert, disabled, labels, }) {
13
13
  const { Button } = usePrimitives();
14
14
  const t = useTranslation();
15
- return (_jsx(Fragment, { children: variables.map((name) => (_jsx(Button, { type: "button", variant: "secondary", size: "sm", disabled: disabled, onClick: () => onInsert(name), ariaLabel: t("kumiko.contentEditor.insertVariable", { name }), children: `{{${name}}}` }, name))) }));
15
+ return (_jsx(Fragment, { children: variables.map((name) => {
16
+ const label = labels !== undefined && Object.hasOwn(labels, name) ? labels[name] : undefined;
17
+ return (_jsx(Button, { type: "button", variant: "secondary", size: "sm", disabled: disabled, onClick: () => onInsert(name), ariaLabel: t("kumiko.contentEditor.insertVariable", { name: label ?? name }), ...(label !== undefined && { title: name }), children: label ?? `{{${name}}}` }, name));
18
+ }) }));
16
19
  }
@@ -1,5 +1,5 @@
1
1
  import type { DashboardPanelVisibility } from "@cosmicdrift/kumiko-framework/ui-types";
2
- import type { UseQueryResult } from "../hooks/use-query.js";
2
+ import type { UseQueryResult } from "../hooks/use-query.ts";
3
3
  export type VisibleWhenVerdict = "loading" | "visible" | "hidden" | "error";
4
4
  export declare function evalVisibleWhen(visibleWhen: DashboardPanelVisibility, result: UseQueryResult<Readonly<Record<string, unknown>>> | undefined): VisibleWhenVerdict;
5
5
  export declare function evalVisibleWhenAfterShown(visibleWhen: DashboardPanelVisibility, result: UseQueryResult<Readonly<Record<string, unknown>>> | undefined, wasShown: boolean): VisibleWhenVerdict;
@@ -1,6 +1,6 @@
1
1
  import type { EditFieldViewModel, FieldIssue } from "@cosmicdrift/kumiko-headless";
2
2
  import type { ReactNode } from "react";
3
- import type { FieldCellWidth, FieldProps, usePrimitives } from "../primitives.js";
3
+ import type { FieldCellWidth, FieldProps, usePrimitives } from "../primitives.tsx";
4
4
  export type GridCellForFieldProps = {
5
5
  readonly field: EditFieldViewModel;
6
6
  readonly columns: number;
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from "react";
2
- import type { RenderEditAction } from "./render-edit-types.js";
2
+ import type { RenderEditAction } from "./render-edit-types.ts";
3
3
  export type ListEmptyStateContent = {
4
4
  readonly title: string;
5
5
  readonly description?: string;
@@ -4,7 +4,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { useAppFeatures } from "../app/app-features-context.js";
5
5
  import { buildFilterFacets, buildFilterPayload, mergeReferenceFacetOptions, resolveProjectionFacetSpecs, } from "../app/list-facets.js";
6
6
  import { useNav } from "../app/nav.js";
7
- import { ReferenceFacetBridges } from "../app/reference-facet-bridge.js";
7
+ import { ReferenceFacetBridges, } from "../app/reference-facet-bridge.js";
8
8
  import { navigateWithReturnTo, useReturnHost } from "../app/return-to.js";
9
9
  import { buildDefaultEditRowAction, buildProjectionRowActions, buildProjectionToolbarActions, buildRecordActions, runProjectionRowNavigate, } from "../app/row-actions.js";
10
10
  import { findEditScreenFor } from "../app/screen-access.js";
@@ -1,6 +1,6 @@
1
1
  import type { ReactNode } from "react";
2
- import type { usePrimitives } from "../primitives.js";
3
- import type { RenderEditAction } from "./render-edit-types.js";
2
+ import type { usePrimitives } from "../primitives.tsx";
3
+ import type { RenderEditAction } from "./render-edit-types.ts";
4
4
  export declare function needsActionConfirm(action: Pick<RenderEditAction, "confirm" | "confirmRequired" | "style">): boolean;
5
5
  export declare function RenderEditActionConfirmDialog({ action, open, onOpenChange, onConfirm, Dialog, }: {
6
6
  readonly action: RenderEditAction;
@@ -1,6 +1,6 @@
1
1
  import type { FormValues } from "@cosmicdrift/kumiko-headless";
2
- import type { RenderEditProps } from "./render-edit-types.js";
3
- export type { RenderEditAction, RenderEditChangeState, RenderEditControls, RenderEditProps, } from "./render-edit-types.js";
2
+ import type { RenderEditProps } from "./render-edit-types.ts";
3
+ export type { RenderEditAction, RenderEditChangeState, RenderEditControls, RenderEditProps, } from "./render-edit-types.ts";
4
4
  import { type ReactNode } from "react";
5
5
  export declare const PATCH_DRAFT_SAVE_DEBOUNCE_MS = 500;
6
6
  /** A record title is a non-blank string; anything else leaves the screen title alone. */
@@ -1,6 +1,6 @@
1
1
  import { type EditFieldViewModel, type FieldIssue } from "@cosmicdrift/kumiko-headless";
2
2
  import { type ReactNode } from "react";
3
- import { type FieldProps } from "../primitives.js";
3
+ import { type FieldProps } from "../primitives.tsx";
4
4
  export type RenderFieldProps = {
5
5
  readonly field: EditFieldViewModel;
6
6
  readonly issues?: readonly FieldIssue[];
@@ -1,9 +1,9 @@
1
1
  import type { EntityDefinition, EntityListScreenDefinition, IconKey } from "@cosmicdrift/kumiko-framework/ui-types";
2
2
  import type { ListRowViewModel, Translate } from "@cosmicdrift/kumiko-headless";
3
3
  import { type ReactNode } from "react";
4
- import type { ListSort } from "../hooks/use-list-url-state.js";
5
- import { type DataTableDateRangeFacet, type DataTableFacet, type DataTableProps, type DataTableRowAction, type DataTableRowActionMode, type DataTableRowGrouping } from "../primitives.js";
6
- import { type ListEmptyStateContent } from "./list-empty-state.js";
4
+ import type { ListSort } from "../hooks/use-list-url-state.ts";
5
+ import { type DataTableDateRangeFacet, type DataTableFacet, type DataTableProps, type DataTableRowAction, type DataTableRowActionMode, type DataTableRowGrouping } from "../primitives.tsx";
6
+ import { type ListEmptyStateContent } from "./list-empty-state.tsx";
7
7
  export type RenderListProps = {
8
8
  readonly screen: EntityListScreenDefinition;
9
9
  readonly entity: EntityDefinition;
@@ -1,6 +1,6 @@
1
1
  import { type ReactNode } from "react";
2
- import type { ActionMenuItemSpec, usePrimitives } from "../primitives.js";
3
- import type { RenderEditAction } from "./render-edit-types.js";
2
+ import type { ActionMenuItemSpec, usePrimitives } from "../primitives.tsx";
3
+ import type { RenderEditAction } from "./render-edit-types.ts";
4
4
  export declare function useActionMenuItems({ Dialog, onError, }: {
5
5
  readonly Dialog: ReturnType<typeof usePrimitives>["Dialog"];
6
6
  readonly onError: (text: string | null) => void;
@@ -1,6 +1,6 @@
1
1
  import type { Dispatcher, DispatcherStatus } from "@cosmicdrift/kumiko-headless";
2
2
  import { type ReactNode } from "react";
3
- import { type QueryPools } from "./query-pool.js";
3
+ import { type QueryPools } from "./query-pool.ts";
4
4
  export type DispatcherProviderProps = {
5
5
  readonly dispatcher: Dispatcher;
6
6
  readonly children: ReactNode;
@@ -1,4 +1,4 @@
1
- import type { DataTableSort, DataTableSortDir } from "../primitives.js";
1
+ import type { DataTableSort, DataTableSortDir } from "../primitives.tsx";
2
2
  export declare const NO_FILTER_URL_VALUE = "~";
3
3
  export type ListSortDir = DataTableSortDir;
4
4
  export type ListSort = DataTableSort;
@@ -1,2 +1,2 @@
1
- import type { ExtensionSectionProps } from "../app/extension-sections.js";
1
+ import type { ExtensionSectionProps } from "../app/extension-sections.tsx";
2
2
  export declare function useReportStepComplete(reportStepComplete: ExtensionSectionProps["reportStepComplete"], complete: boolean | null): void;
@@ -1,2 +1,2 @@
1
- import type { TranslationsByLocale } from "./i18n.js";
1
+ import type { TranslationsByLocale } from "./i18n.tsx";
2
2
  export declare const kumikoDefaultTranslations: TranslationsByLocale;
package/dist/index.d.ts CHANGED
@@ -1,87 +1,87 @@
1
1
  export { type Formality, formalLocaleTag } from "@cosmicdrift/kumiko-framework/ui-types";
2
- export { synthesizeActionFormEntity, synthesizeActionFormScreen } from "./app/action-form-shim.js";
3
- export type { AppFeaturesProviderProps } from "./app/app-features-context.js";
4
- export { AppFeaturesProvider, useAppFeatures } from "./app/app-features-context.js";
5
- export type { ColumnRendererComponent, ColumnRendererProps, ColumnRenderersMap, ColumnRenderersProviderProps, } from "./app/column-renderers.js";
6
- export { ColumnRenderersProvider, useColumnRenderer } from "./app/column-renderers.js";
7
- export type { ContentEditorComponent, ContentEditorProps, ContentEditorsMap, ContentEditorsProviderProps, } from "./app/content-editors.js";
8
- export { CONTENT_EDITOR_ELEMENT_ID, ContentEditorsProvider, TextareaContentEditor, useContentEditor, } from "./app/content-editors.js";
9
- export type { ContentPreviewProps } from "./app/content-preview.js";
10
- export { ContentPreview, substituteVariables } from "./app/content-preview.js";
11
- export type { CustomScreensMap, CustomScreensProviderProps } from "./app/custom-screens.js";
12
- export { CustomScreensProvider, useCustomScreenComponent } from "./app/custom-screens.js";
13
- export type { DashboardBodyProps, DashboardBodyProviderProps } from "./app/dashboard-body.js";
14
- export { DashboardBodyProvider, useDashboardBody } from "./app/dashboard-body.js";
15
- export type { ExtensionFormRegistry, ExtensionFormSubmitHandler, ExtensionSubmitContext, ExtensionSubmitResult, } from "./app/extension-form-submit.js";
16
- export { ExtensionFormRegistryProvider, useExtensionFormSubmit, } from "./app/extension-form-submit.js";
17
- export type { ExtensionSectionComponent, ExtensionSectionProps, ExtensionSectionsMap, ExtensionSectionsProviderProps, } from "./app/extension-sections.js";
18
- export { ExtensionSectionsProvider, extensionSectionName, useExtensionSectionComponent, } from "./app/extension-sections.js";
19
- export type { AppSchema, FeatureSchema, QualifiedContentCollection, WorkspaceSchema, } from "./app/feature-schema.js";
20
- export { isAppSchema, toAppSchema } from "./app/feature-schema.js";
21
- export type { KumikoScreenProps } from "./app/kumiko-screen.js";
22
- export { KumikoScreen, qualifyNavId, qualifyScreenId, ScreenMissingState, } from "./app/kumiko-screen.js";
23
- export type { DateRangeBound, DateRangeValue, ResolvedDateRangeFacet } from "./app/list-facets.js";
24
- export { buildDateRangePayload, clampDateRange, readDateRange, resolveDateRangeFacets, } from "./app/list-facets.js";
25
- export type { NavApi, NavigateOptions, NavProviderProps, NavRoute, NavTarget, ObjectTarget, ScreenTarget, } from "./app/nav.js";
26
- export { formatPath, hasDetailScreen, NavProvider, parsePath, resolveTarget, useNav, useNavigateWithInitialValues, } from "./app/nav.js";
27
- export { lastSegment } from "./app/qn.js";
28
- export type { ReturnHost, ReturnTo } from "./app/return-to.js";
29
- export { navigateToReturn, navigateToReturnOr, navigateWithReturnTo, RETURN_TO_PARAM, ReturnHostProvider, resolveReturnTarget, splitReturnTo, useReturnHost, useReturnTarget, } from "./app/return-to.js";
30
- export type { EmbeddedScreenTarget } from "./app/use-embedded-screen.js";
31
- export { useEmbeddedScreen } from "./app/use-embedded-screen.js";
32
- export type { VariableChipsProps } from "./app/variable-chips.js";
33
- export { VariableChips } from "./app/variable-chips.js";
34
- export { evalVisibleWhen, type VisibleWhenVerdict } from "./app/visible-when.js";
35
- export { dispatcherErrorText, WriteFailedError } from "./app/write-failed-error.js";
36
- export type { ErrorBoundaryFallbackProps, ErrorBoundaryProps, } from "./components/error-boundary.js";
37
- export { ErrorBoundary } from "./components/error-boundary.js";
38
- export { RelatedListSection } from "./components/related-list-section.js";
39
- export type { RenderEditAction, RenderEditChangeState, RenderEditControls, RenderEditProps, } from "./components/render-edit.js";
40
- export { RenderEdit } from "./components/render-edit.js";
41
- export { needsActionConfirm } from "./components/render-edit-action-button.js";
42
- export type { RenderFieldProps } from "./components/render-field.js";
43
- export { RenderField } from "./components/render-field.js";
44
- export type { RenderListProps } from "./components/render-list.js";
45
- export { RenderList } from "./components/render-list.js";
46
- export type { DispatcherProviderProps } from "./context/dispatcher-context.js";
47
- export { DispatcherProvider, useDispatcher, useDispatcherStatus, useOptionalDispatcher, } from "./context/dispatcher-context.js";
48
- export type { DraftStorage, DraftStorageProviderProps } from "./context/draft-storage-context.js";
49
- export { DraftStorageProvider, useDraftStorage } from "./context/draft-storage-context.js";
50
- export { EmbeddedScreenProvider, useIsEmbeddedScreen } from "./context/embedded-screen-context.js";
51
- export type { UserRolesProviderProps } from "./context/user-roles-context.js";
52
- export { UserRolesProvider, useUserRoles } from "./context/user-roles-context.js";
53
- export type { CurrentUser } from "./current-user.js";
54
- export { CurrentUserProvider, useOptionalCurrentUser } from "./current-user.js";
55
- export { formatWhen } from "./format-when.js";
56
- export { REFERENCE_COMBOBOX_LIMIT, REFERENCE_LIST_LOOKUP_LIMIT, REFERENCE_SEARCH_DEBOUNCE_MS, } from "./hooks/reference-limits.js";
57
- export type { AiTextActionState, AiTextMode, AiTextRewriteStyle, AiTextRunPayload, AiTextRunResult, AiTextUsage, UseAiTextActionResult, UseCompletionResult, } from "./hooks/use-ai-text.js";
58
- export { AI_TEXT_RUN_QN, useAiTextAction, useCompletion } from "./hooks/use-ai-text.js";
59
- export type { UseDisclosureResult } from "./hooks/use-disclosure.js";
60
- export { useDisclosure } from "./hooks/use-disclosure.js";
61
- export type { UseFormOptions, UseFormResult } from "./hooks/use-form.js";
62
- export { useForm } from "./hooks/use-form.js";
63
- export type { ListSort, ListSortDir, ListUrlState, ListUrlStateApi, } from "./hooks/use-list-url-state.js";
64
- export { listFilterUrlKey, useListUrlState } from "./hooks/use-list-url-state.js";
65
- export type { UseMutationResult } from "./hooks/use-mutation.js";
66
- export { useMutation } from "./hooks/use-mutation.js";
67
- export type { UseQueryOptions, UseQueryResult } from "./hooks/use-query.js";
68
- export { entityFromQueryType, useQuery } from "./hooks/use-query.js";
69
- export { useReportStepComplete } from "./hooks/use-report-step-complete.js";
70
- export { useStore, useStoreSelector } from "./hooks/use-store.js";
71
- export type { StreamStatus, UseStreamHandlerOptions, UseStreamHandlerResult, } from "./hooks/use-stream-handler.js";
72
- export { useStreamHandler } from "./hooks/use-stream-handler.js";
73
- export type { LocaleProviderProps, TranslationBundle, TranslationsByKey, TranslationsByLocale, } from "./i18n.js";
74
- export { createStaticLocaleResolver, FormalityProvider, LocaleProvider, mergeTranslations, translationsByKeyFromLocales, translationsByLocaleFromKeys, useFormality, useLocale, useOptionalLocale, useOptionalTranslation, useTranslation, } from "./i18n.js";
75
- export { kumikoDefaultTranslations } from "./i18n-defaults.js";
76
- export { InsideDrawerProvider, useInsideDrawer } from "./inside-drawer.js";
77
- export { PageHeaderCompactProvider, PageHeaderSlotAvailableProvider, usePageHeaderCompact, usePageHeaderSlotAvailable, } from "./page-header-slot.js";
78
- export type { ActionMenuItemSpec, ActionOverflowMenuProps, AppPrimitives, BannerProps, ButtonProps, CardOptions, CardProps, CardSlots, CopyButtonProps, CorePrimitives, DataTableDateRangeFacet, DataTableFacet, DataTableFacetChip, DataTableProps, DataTableRowAction, DataTableRowActionMode, DataTableRowGrouping, DataTableSort, DataTableSortDir, DialogProps, DrawerProps, EmbeddedListCellType, EmbeddedListColumn, EmbeddedListInputProps, EmbeddedListTotal, FieldCellWidth, FieldProps, FillContainerProps, FooterActionMarker, FooterActionRole, FormProps, FormSectionNavItem, FormWidth, GridCellProps, GridProps, HeadingProps, InputProps, JsonViewProps, LightboxImage, LightboxProps, LinkProps, MetricBandProps, MetricProps, ModalProps, PageHeaderProps, PickedFile, PrimitivesProviderProps, PrimitivesRegistry, ProgressProps, ProgressTone, PromoPanelAction, PromoPanelProps, RuntimeRenderer, SecretRevealProps, SecretRevealValue, SectionProps, ShareButtonProps, StatusBadgeProps, StatusTone, StepBarProps, StickyActionBarProps, StickyPrimaryActionMarker, TabsProps, TextProps, TrailingInputAction, WizardStepGroupProps, } from "./primitives.js";
79
- export { FOOTER_ACTION_ROLE_PROP, NARROW_LABEL_PROP, PrimitivesProvider, STICKY_PRIMARY_ACTION_PROP, shouldRenderActionsIconOnly, statusToneForOptionTone, statusToneForValue, useOptionalPrimitives, usePrimitives, } from "./primitives.js";
80
- export type { SessionEndedSignal, SessionEndedSignalProviderProps, } from "./session/session-ended.js";
81
- export { createSessionEndedSignal, isSessionEndedError, SESSION_ENDED_ERROR_CODES, SessionEndedSignalProvider, useSessionEndedSignal, withSessionEndedDetection, } from "./session/session-ended.js";
82
- export { buildWhatsAppShareUrl } from "./share-links.js";
83
- export { sortByAccessor } from "./sort-by-accessor.js";
84
- export type { LiveEvent, LiveEventSubscriber, LiveEventsProviderProps } from "./sse/live-events.js";
85
- export { LiveEventsProvider, useLiveEvents } from "./sse/live-events.js";
86
- export type { AppTokens, ColorTokens, CoreTokens, FontTokens, RadiusTokens, ShadowTokens, SpacingTokens, ThemeMode, ThemePreference, Tokens, TokensApi, TokensProviderProps, } from "./tokens.js";
87
- export { cssVarTokens, TokensProvider, useTokenController, useTokens } from "./tokens.js";
2
+ export { synthesizeActionFormEntity, synthesizeActionFormScreen } from "./app/action-form-shim.ts";
3
+ export type { AppFeaturesProviderProps } from "./app/app-features-context.tsx";
4
+ export { AppFeaturesProvider, useAppFeatures } from "./app/app-features-context.tsx";
5
+ export type { ColumnRendererComponent, ColumnRendererProps, ColumnRenderersMap, ColumnRenderersProviderProps, } from "./app/column-renderers.tsx";
6
+ export { ColumnRenderersProvider, useColumnRenderer } from "./app/column-renderers.tsx";
7
+ export type { ContentEditorComponent, ContentEditorProps, ContentEditorsMap, ContentEditorsProviderProps, } from "./app/content-editors.tsx";
8
+ export { CONTENT_EDITOR_ELEMENT_ID, ContentEditorsProvider, TextareaContentEditor, useContentEditor, } from "./app/content-editors.tsx";
9
+ export type { ContentPreviewProps } from "./app/content-preview.tsx";
10
+ export { ContentPreview, substituteVariables } from "./app/content-preview.tsx";
11
+ export type { CustomScreensMap, CustomScreensProviderProps } from "./app/custom-screens.tsx";
12
+ export { CustomScreensProvider, useCustomScreenComponent } from "./app/custom-screens.tsx";
13
+ export type { DashboardBodyProps, DashboardBodyProviderProps } from "./app/dashboard-body.tsx";
14
+ export { DashboardBodyProvider, useDashboardBody } from "./app/dashboard-body.tsx";
15
+ export type { ExtensionFormRegistry, ExtensionFormSubmitHandler, ExtensionSubmitContext, ExtensionSubmitResult, } from "./app/extension-form-submit.tsx";
16
+ export { ExtensionFormRegistryProvider, useExtensionFormSubmit, } from "./app/extension-form-submit.tsx";
17
+ export type { ExtensionSectionComponent, ExtensionSectionProps, ExtensionSectionsMap, ExtensionSectionsProviderProps, } from "./app/extension-sections.tsx";
18
+ export { ExtensionSectionsProvider, extensionSectionName, useExtensionSectionComponent, } from "./app/extension-sections.tsx";
19
+ export type { AppSchema, FeatureSchema, QualifiedContentCollection, WorkspaceSchema, } from "./app/feature-schema.ts";
20
+ export { isAppSchema, toAppSchema } from "./app/feature-schema.ts";
21
+ export type { KumikoScreenProps } from "./app/kumiko-screen.tsx";
22
+ export { KumikoScreen, qualifyNavId, qualifyScreenId, ScreenMissingState, } from "./app/kumiko-screen.tsx";
23
+ export type { DateRangeBound, DateRangeValue, ResolvedDateRangeFacet } from "./app/list-facets.ts";
24
+ export { buildDateRangePayload, clampDateRange, readDateRange, resolveDateRangeFacets, } from "./app/list-facets.ts";
25
+ export type { NavApi, NavigateOptions, NavProviderProps, NavRoute, NavTarget, ObjectTarget, ScreenTarget, } from "./app/nav.tsx";
26
+ export { formatPath, hasDetailScreen, NavProvider, parsePath, resolveTarget, useNav, useNavigateWithInitialValues, } from "./app/nav.tsx";
27
+ export { lastSegment } from "./app/qn.ts";
28
+ export type { ReturnHost, ReturnTo } from "./app/return-to.tsx";
29
+ export { navigateToReturn, navigateToReturnOr, navigateWithReturnTo, RETURN_TO_PARAM, ReturnHostProvider, resolveReturnTarget, splitReturnTo, useReturnHost, useReturnTarget, } from "./app/return-to.tsx";
30
+ export type { EmbeddedScreenTarget } from "./app/use-embedded-screen.ts";
31
+ export { useEmbeddedScreen } from "./app/use-embedded-screen.ts";
32
+ export type { VariableChipsProps } from "./app/variable-chips.tsx";
33
+ export { VariableChips } from "./app/variable-chips.tsx";
34
+ export { evalVisibleWhen, type VisibleWhenVerdict } from "./app/visible-when.ts";
35
+ export { dispatcherErrorText, WriteFailedError } from "./app/write-failed-error.ts";
36
+ export type { ErrorBoundaryFallbackProps, ErrorBoundaryProps, } from "./components/error-boundary.tsx";
37
+ export { ErrorBoundary } from "./components/error-boundary.tsx";
38
+ export { RelatedListSection } from "./components/related-list-section.tsx";
39
+ export type { RenderEditAction, RenderEditChangeState, RenderEditControls, RenderEditProps, } from "./components/render-edit.tsx";
40
+ export { RenderEdit } from "./components/render-edit.tsx";
41
+ export { needsActionConfirm } from "./components/render-edit-action-button.tsx";
42
+ export type { RenderFieldProps } from "./components/render-field.tsx";
43
+ export { RenderField } from "./components/render-field.tsx";
44
+ export type { RenderListProps } from "./components/render-list.tsx";
45
+ export { RenderList } from "./components/render-list.tsx";
46
+ export type { DispatcherProviderProps } from "./context/dispatcher-context.tsx";
47
+ export { DispatcherProvider, useDispatcher, useDispatcherStatus, useOptionalDispatcher, } from "./context/dispatcher-context.tsx";
48
+ export type { DraftStorage, DraftStorageProviderProps } from "./context/draft-storage-context.tsx";
49
+ export { DraftStorageProvider, useDraftStorage } from "./context/draft-storage-context.tsx";
50
+ export { EmbeddedScreenProvider, useIsEmbeddedScreen } from "./context/embedded-screen-context.tsx";
51
+ export type { UserRolesProviderProps } from "./context/user-roles-context.tsx";
52
+ export { UserRolesProvider, useUserRoles } from "./context/user-roles-context.tsx";
53
+ export type { CurrentUser } from "./current-user.tsx";
54
+ export { CurrentUserProvider, useOptionalCurrentUser } from "./current-user.tsx";
55
+ export { formatWhen } from "./format-when.ts";
56
+ export { REFERENCE_COMBOBOX_LIMIT, REFERENCE_LIST_LOOKUP_LIMIT, REFERENCE_SEARCH_DEBOUNCE_MS, } from "./hooks/reference-limits.ts";
57
+ export type { AiTextActionState, AiTextMode, AiTextRewriteStyle, AiTextRunPayload, AiTextRunResult, AiTextUsage, UseAiTextActionResult, UseCompletionResult, } from "./hooks/use-ai-text.ts";
58
+ export { AI_TEXT_RUN_QN, useAiTextAction, useCompletion } from "./hooks/use-ai-text.ts";
59
+ export type { UseDisclosureResult } from "./hooks/use-disclosure.ts";
60
+ export { useDisclosure } from "./hooks/use-disclosure.ts";
61
+ export type { UseFormOptions, UseFormResult } from "./hooks/use-form.ts";
62
+ export { useForm } from "./hooks/use-form.ts";
63
+ export type { ListSort, ListSortDir, ListUrlState, ListUrlStateApi, } from "./hooks/use-list-url-state.ts";
64
+ export { listFilterUrlKey, useListUrlState } from "./hooks/use-list-url-state.ts";
65
+ export type { UseMutationResult } from "./hooks/use-mutation.ts";
66
+ export { useMutation } from "./hooks/use-mutation.ts";
67
+ export type { UseQueryOptions, UseQueryResult } from "./hooks/use-query.ts";
68
+ export { entityFromQueryType, useQuery } from "./hooks/use-query.ts";
69
+ export { useReportStepComplete } from "./hooks/use-report-step-complete.ts";
70
+ export { useStore, useStoreSelector } from "./hooks/use-store.ts";
71
+ export type { StreamStatus, UseStreamHandlerOptions, UseStreamHandlerResult, } from "./hooks/use-stream-handler.ts";
72
+ export { useStreamHandler } from "./hooks/use-stream-handler.ts";
73
+ export type { LocaleProviderProps, TranslationBundle, TranslationsByKey, TranslationsByLocale, } from "./i18n.tsx";
74
+ export { createStaticLocaleResolver, FormalityProvider, LocaleProvider, mergeTranslations, translationsByKeyFromLocales, translationsByLocaleFromKeys, useFormality, useLocale, useOptionalLocale, useOptionalTranslation, useTranslation, } from "./i18n.tsx";
75
+ export { kumikoDefaultTranslations } from "./i18n-defaults.ts";
76
+ export { InsideDrawerProvider, useInsideDrawer } from "./inside-drawer.ts";
77
+ export { PageHeaderCompactProvider, PageHeaderSlotAvailableProvider, usePageHeaderCompact, usePageHeaderSlotAvailable, } from "./page-header-slot.ts";
78
+ export type { ActionMenuItemSpec, ActionOverflowMenuProps, AppPrimitives, BannerProps, ButtonProps, CardOptions, CardProps, CardSlots, CopyButtonProps, CorePrimitives, DataTableDateRangeFacet, DataTableFacet, DataTableFacetChip, DataTableProps, DataTableRowAction, DataTableRowActionMode, DataTableRowGrouping, DataTableSort, DataTableSortDir, DialogProps, DrawerProps, EmbeddedListCellType, EmbeddedListColumn, EmbeddedListInputProps, EmbeddedListTotal, FieldCellWidth, FieldProps, FillContainerProps, FooterActionMarker, FooterActionRole, FormProps, FormSectionNavItem, FormWidth, GridCellProps, GridProps, HeadingProps, InputProps, JsonViewProps, LightboxImage, LightboxProps, LinkProps, MetricBandProps, MetricProps, ModalProps, PageHeaderProps, PickedFile, PrimitivesProviderProps, PrimitivesRegistry, ProgressProps, ProgressTone, PromoPanelAction, PromoPanelProps, RuntimeRenderer, SecretRevealProps, SecretRevealValue, SectionProps, ShareButtonProps, StatusBadgeProps, StatusTone, StepBarProps, StickyActionBarProps, StickyPrimaryActionMarker, TabsProps, TextProps, TrailingInputAction, WizardStepGroupProps, } from "./primitives.tsx";
79
+ export { FOOTER_ACTION_ROLE_PROP, NARROW_LABEL_PROP, PrimitivesProvider, STICKY_PRIMARY_ACTION_PROP, shouldRenderActionsIconOnly, statusToneForOptionTone, statusToneForValue, useOptionalPrimitives, usePrimitives, } from "./primitives.tsx";
80
+ export type { SessionEndedSignal, SessionEndedSignalProviderProps, } from "./session/session-ended.tsx";
81
+ export { createSessionEndedSignal, isSessionEndedError, SESSION_ENDED_ERROR_CODES, SessionEndedSignalProvider, useSessionEndedSignal, withSessionEndedDetection, } from "./session/session-ended.tsx";
82
+ export { buildWhatsAppShareUrl } from "./share-links.ts";
83
+ export { sortByAccessor } from "./sort-by-accessor.ts";
84
+ export type { LiveEvent, LiveEventSubscriber, LiveEventsProviderProps, } from "./sse/live-events.tsx";
85
+ export { LiveEventsProvider, useLiveEvents } from "./sse/live-events.tsx";
86
+ export type { AppTokens, ColorTokens, CoreTokens, FontTokens, RadiusTokens, ShadowTokens, SpacingTokens, ThemeMode, ThemePreference, Tokens, TokensApi, TokensProviderProps, } from "./tokens.tsx";
87
+ export { cssVarTokens, TokensProvider, useTokenController, useTokens } from "./tokens.tsx";
@@ -1,4 +1,4 @@
1
- import type { DataTableSort } from "./primitives.js";
1
+ import type { DataTableSort } from "./primitives.tsx";
2
2
  type SortValue = string | number | null;
3
3
  /** Sorts `rows` by a `DataTableSort` against a field->accessor map. Unknown
4
4
  * field or `sort === null` returns `rows` unchanged (no-op, not an error —
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-renderer",
3
- "version": "0.368.0",
3
+ "version": "0.370.0",
4
4
  "description": "Platform-agnostic React renderer for Kumiko screens. Contains the shared logic — primitives-contract, hooks, KumikoScreen, navigation & SSE abstractions — that any platform-specific renderer (web, native) composes. No DOM, no EventSource, no react-dom.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -15,9 +15,9 @@
15
15
  }
16
16
  },
17
17
  "dependencies": {
18
- "@cosmicdrift/kumiko-framework": "0.368.0",
19
- "@cosmicdrift/kumiko-headless": "0.368.0",
20
- "@cosmicdrift/kumiko-types": "0.368.0",
18
+ "@cosmicdrift/kumiko-framework": "0.370.0",
19
+ "@cosmicdrift/kumiko-headless": "0.370.0",
20
+ "@cosmicdrift/kumiko-types": "0.370.0",
21
21
  "react": "^19.2.6",
22
22
  "temporal-polyfill": "^0.3.2",
23
23
  "zod": "^4.4.3"
@@ -28,7 +28,7 @@
28
28
  "@types/react-dom": "^19.2.3",
29
29
  "jsdom": "^29.1.1",
30
30
  "react-dom": "^19.2.6",
31
- "@cosmicdrift/kumiko-locale-de": "0.368.0"
31
+ "@cosmicdrift/kumiko-locale-de": "0.370.0"
32
32
  },
33
33
  "repository": {
34
34
  "type": "git",