@timeax/form-palette 0.0.27 → 0.0.29

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/dist/index.d.mts CHANGED
@@ -3357,6 +3357,289 @@ interface ShadcnEditorVariantProps extends Pick<VariantBaseProps<string | undefi
3357
3357
  className?: string;
3358
3358
  }
3359
3359
 
3360
+ type JsonPrimitive = string | number | boolean | null;
3361
+ type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
3362
+ type JsonObject = Record<string, JsonValue>;
3363
+ type JsonPath = string;
3364
+ type JsonWildcard = string;
3365
+
3366
+ /**
3367
+ * A "variant spec" can be:
3368
+ * - a plain VariantKey ("text", "number", "toggle", ...)
3369
+ * - a variant key + props to pass into that variant
3370
+ */
3371
+ type JsonEditorVariantSpec = VariantKey | {
3372
+ variant: VariantKey;
3373
+ props?: VariantPropsFor<any>;
3374
+ };
3375
+ /**
3376
+ * Map a key-path (or wildcard) to a variant spec.
3377
+ *
3378
+ * Keys are matched against:
3379
+ * - full path: "config.apiEndpoint"
3380
+ * - leaf key: "apiEndpoint"
3381
+ *
3382
+ * Wild examples:
3383
+ * - "*api*" (segment contains "api")
3384
+ * - "config.*" (direct children)
3385
+ * - "config.**" (subtree)
3386
+ * - "**.*token*" (any route/leaf)
3387
+ */
3388
+ type JsonEditorFieldMap = Record<JsonWildcard, JsonEditorVariantSpec>;
3389
+ /**
3390
+ * Layout is scoped to a "page" (object route path).
3391
+ *
3392
+ * Each entry is a "row":
3393
+ * - string: render a single field row
3394
+ * - string[]: render these fields side-by-side (grid row)
3395
+ *
3396
+ * Example:
3397
+ * layout: {
3398
+ * "": [["projectName","version"], "description"],
3399
+ * "config": [["maxEntries","apiEndpoint"], "retry"]
3400
+ * }
3401
+ */
3402
+ type JsonEditorLayoutRow = string | string[];
3403
+ type JsonEditorLayoutMap = Record<JsonWildcard, JsonEditorLayoutRow[]>;
3404
+ interface JsonEditorFilters {
3405
+ /** Hide entire object routes/pages (navigation + rendering) */
3406
+ excludeRoutes?: JsonWildcard[];
3407
+ includeRoutes?: JsonWildcard[];
3408
+ /** Hide specific fields (by full path or leaf/wild patterns) */
3409
+ excludeFields?: JsonWildcard[];
3410
+ includeFields?: JsonWildcard[];
3411
+ /**
3412
+ * If true, excluding "config" also excludes "config.**".
3413
+ * Default: true
3414
+ */
3415
+ excludeRouteSubtree?: boolean;
3416
+ }
3417
+ /**
3418
+ * Default value for a newly created key (or a new array item).
3419
+ * Can be a constant JsonValue, or a function.
3420
+ */
3421
+ type JsonEditorDefaultValueSpec = JsonValue | ((ctx: {
3422
+ parentPath: JsonPath;
3423
+ key: string;
3424
+ current: JsonValue | undefined;
3425
+ }) => JsonValue);
3426
+ interface JsonEditorDefaults {
3427
+ /**
3428
+ * When adding a new array item, you can pick from allowed variants.
3429
+ * You can pass VariantKey or a {variant, props} spec.
3430
+ */
3431
+ array?: JsonEditorVariantSpec[];
3432
+ /**
3433
+ * Optional default values for new keys.
3434
+ * Keyed by wildcard path (full path / leaf / patterns).
3435
+ */
3436
+ values?: Record<JsonWildcard, JsonEditorDefaultValueSpec>;
3437
+ }
3438
+ type JsonEditorNavMode = "sidebar" | "tabs" | "drawer";
3439
+ interface JsonEditorNavOptions {
3440
+ mode?: JsonEditorNavMode;
3441
+ /** Show root "" as a page in navigation. Default: true */
3442
+ showRoot?: boolean;
3443
+ /** Initial active route/page. Default: "" */
3444
+ defaultRoute?: JsonPath;
3445
+ /** Optional label overrides for route nodes */
3446
+ routeLabels?: Record<JsonWildcard, React.ReactNode>;
3447
+ /** Max object nesting to generate routes for. Optional safety */
3448
+ maxDepth?: number;
3449
+ /**
3450
+ * Whether arrays containing objects can contribute routes.
3451
+ * - "none": arrays never create routes (default)
3452
+ * - "objects": array items that are objects become routes like "config.items.0"
3453
+ */
3454
+ arrayRoutes?: "none" | "objects";
3455
+ }
3456
+ interface JsonRouteNode {
3457
+ path: JsonPath;
3458
+ key: string;
3459
+ label: React.ReactNode;
3460
+ children: JsonRouteNode[];
3461
+ }
3462
+ type JsonEditorViewMode = "split" | "visual" | "raw";
3463
+ interface JsonEditorPermissions {
3464
+ canAdd?: boolean;
3465
+ canDelete?: boolean;
3466
+ canViewRaw?: boolean;
3467
+ canEditRaw?: boolean;
3468
+ /**
3469
+ * Keys/paths in this shape cannot be deleted even if canDelete is true.
3470
+ * (treated as "locked")
3471
+ */
3472
+ defaultShape?: JsonObject;
3473
+ /**
3474
+ * Optional finer-grain locks by wildcard.
3475
+ * If true, this key/path cannot be added/deleted/edited.
3476
+ */
3477
+ lockPaths?: JsonWildcard[];
3478
+ }
3479
+ type JsonEditorEditAction = "add" | "delete" | "edit" | "edit-raw";
3480
+ interface JsonEditorEditMeta {
3481
+ action: JsonEditorEditAction;
3482
+ /** the page (object route) currently being edited */
3483
+ route: JsonPath;
3484
+ /** the exact key path being changed (field path) */
3485
+ path: JsonPath;
3486
+ /** parent object path of the key */
3487
+ parent: JsonPath;
3488
+ /** leaf key (segment) */
3489
+ key: string;
3490
+ }
3491
+ interface JsonEditorCallbacks {
3492
+ onAdd?: (nextRoot: JsonObject, meta: JsonEditorEditMeta) => void;
3493
+ onDelete?: (nextRoot: JsonObject, meta: JsonEditorEditMeta) => void;
3494
+ onEdit?: (nextRoot: JsonObject, meta: JsonEditorEditMeta) => void;
3495
+ }
3496
+ interface JsonEditorResolvedField {
3497
+ path: JsonPath;
3498
+ key: string;
3499
+ value: JsonValue;
3500
+ valueType: "string" | "number" | "boolean" | "null" | "object" | "array";
3501
+ variant?: JsonEditorVariantSpec;
3502
+ hidden?: boolean;
3503
+ }
3504
+ /**
3505
+ * This is the "shared" props contract for the JSON editor variant UI.
3506
+ *
3507
+ * NOTE:
3508
+ * - `title` is purely UI (header text)
3509
+ * - `schema` is NOT a title — it’s a schema id/key for validation (later use)
3510
+ */
3511
+ interface ShadcnJsonEditorVariantProps extends Pick<VariantBaseProps<JsonObject | undefined>, "value" | "onValue" | "error" | "disabled" | "readOnly"> {
3512
+ /** Header title (UI only) */
3513
+ title?: React.ReactNode;
3514
+ /** Optional schema id/key or raw JSON Schema object for validation */
3515
+ schema?: string | JsonObject;
3516
+ /** Primary config */
3517
+ fieldMap?: JsonEditorFieldMap;
3518
+ layout?: JsonEditorLayoutMap;
3519
+ defaults?: JsonEditorDefaults;
3520
+ /** Navigation derived from JSON structure */
3521
+ nav?: JsonEditorNavOptions;
3522
+ /** include/exclude for routes + fields */
3523
+ filters?: JsonEditorFilters;
3524
+ /** permissions + locks */
3525
+ permissions?: JsonEditorPermissions;
3526
+ /** callbacks */
3527
+ callbacks?: JsonEditorCallbacks;
3528
+ /**
3529
+ * Page rendering mode:
3530
+ * - "accordion": page sections expand/collapse in main panel
3531
+ * - "popover": nested objects open as overlays (optional UX)
3532
+ */
3533
+ mode?: "accordion" | "popover";
3534
+ /**
3535
+ * Routing:
3536
+ * - route: controlled current page
3537
+ * - defaultRoute: uncontrolled initial page (overrides nav.defaultRoute)
3538
+ * - onRouteChange: called whenever the editor navigates
3539
+ */
3540
+ route?: JsonPath;
3541
+ defaultRoute?: JsonPath;
3542
+ onRouteChange?: (route: JsonPath) => void;
3543
+ /**
3544
+ * View mode (top toggle):
3545
+ * - "split": raw sidebar + visual editor (default)
3546
+ * - "visual": visual editor only
3547
+ * - "raw": raw editor only
3548
+ *
3549
+ * If viewMode is provided, it is controlled.
3550
+ * Otherwise, the defaultViewMode seeds the internal state.
3551
+ */
3552
+ viewMode?: JsonEditorViewMode;
3553
+ defaultViewMode?: JsonEditorViewMode;
3554
+ onViewModeChange?: (mode: JsonEditorViewMode) => void;
3555
+ /** Close button intent (optional). Actual close UI is controlled by the wrapper (index.tsx). */
3556
+ onClose?: () => void;
3557
+ /** Visual (editor-level styling) */
3558
+ className?: string;
3559
+ contentClassName?: string;
3560
+ navClassName?: string;
3561
+ /**
3562
+ * Optional hooks to customize nav + page rendering.
3563
+ */
3564
+ renderRouteLabel?: (ctx: {
3565
+ node: JsonRouteNode;
3566
+ active: boolean;
3567
+ }) => React.ReactNode;
3568
+ renderField?: (ctx: {
3569
+ field: JsonEditorResolvedField;
3570
+ route: JsonPath;
3571
+ }) => React.ReactNode;
3572
+ }
3573
+ /**
3574
+ * Wrapper mode:
3575
+ * - "popover": show trigger + popover
3576
+ * - "accordion": inline panel that can expand/collapse
3577
+ */
3578
+ type JsonEditorMode = "popover" | "accordion";
3579
+ /**
3580
+ * Typed to match your shadcn button variants/sizes.
3581
+ * If your project differs, change these unions here once.
3582
+ */
3583
+ type JsonEditorTriggerVariant = "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
3584
+ type JsonEditorTriggerSize = "default" | "sm" | "lg" | "icon";
3585
+ /**
3586
+ * Standalone wiring:
3587
+ * - caller provides root/onRoot directly
3588
+ */
3589
+ type JsonEditorStandaloneWiring = {
3590
+ root: JsonObject;
3591
+ onRoot: (nextRoot: JsonObject, detail?: any) => void;
3592
+ value?: never;
3593
+ onValue?: never;
3594
+ };
3595
+ /**
3596
+ * Variant wiring:
3597
+ * - InputField variant uses value/onValue
3598
+ */
3599
+ type JsonEditorVariantWiring = Pick<VariantBaseProps<JsonObject | undefined>, "value" | "onValue" | "disabled" | "readOnly" | "error" | "size" | "density"> & {
3600
+ root?: never;
3601
+ onRoot?: never;
3602
+ };
3603
+ /**
3604
+ * Props for the exported component (index.tsx):
3605
+ * - accepts standalone OR variant wiring
3606
+ * - wrapper owns mode/open/trigger UI
3607
+ * - editor-specific props are passed through, without redefining a second type list
3608
+ *
3609
+ * IMPORTANT:
3610
+ * - wrapper uses `wrapperClassName` (outer container)
3611
+ * - editor uses `className` (inner editor surface)
3612
+ */
3613
+ interface JsonEditorWrapperProps {
3614
+ /** Wrapper mode (popover vs accordion). */
3615
+ mode?: JsonEditorMode;
3616
+ /** Trigger UI (popover mode) */
3617
+ triggerLabel?: React.ReactNode;
3618
+ triggerVariant?: JsonEditorTriggerVariant;
3619
+ triggerSize?: JsonEditorTriggerSize;
3620
+ /** Popover sizing/skin */
3621
+ popoverClassName?: string;
3622
+ /** Inline/accordion container class */
3623
+ panelClassName?: string;
3624
+ /** Outer wrapper class */
3625
+ wrapperClassName?: string;
3626
+ /** Optional: controlled popover open state */
3627
+ open?: boolean;
3628
+ onOpenChange?: (open: boolean) => void;
3629
+ /** Accessibility (useful when rendered as an InputField variant) */
3630
+ id?: string;
3631
+ describedBy?: string;
3632
+ /** Called when the wrapper closes (popover close / accordion hide). */
3633
+ onClose?: () => void;
3634
+ }
3635
+ /**
3636
+ * Single source of truth for what index.tsx accepts:
3637
+ * - (standalone OR variant wiring)
3638
+ * - wrapper props
3639
+ * - editor props (minus a few keys owned by wrapper)
3640
+ */
3641
+ type ShadcnJsonEditorProps = (JsonEditorStandaloneWiring | JsonEditorVariantWiring) & JsonEditorWrapperProps & Omit<ShadcnJsonEditorVariantProps, "onValue" | "value" | "disabled" | "readOnly" | "error" | "size" | "density" | "onClose">;
3642
+
3360
3643
  /**
3361
3644
  * Helper type for a single variant registry entry.
3362
3645
  *
@@ -3412,6 +3695,7 @@ interface Variants<H = unknown> {
3412
3695
  treeselect: VariantEntry<string | number | undefined, ShadcnTreeSelectVariantProps>;
3413
3696
  file: VariantEntry<FileLike, ShadcnFileVariantProps>;
3414
3697
  editor: VariantEntry<string | undefined, ShadcnEditorVariantProps>;
3698
+ 'json-editor': VariantEntry<JsonObject | undefined, ShadcnJsonEditorProps>;
3415
3699
  }
3416
3700
  /**
3417
3701
  * Union of all variant keys.
package/dist/index.d.ts CHANGED
@@ -3357,6 +3357,289 @@ interface ShadcnEditorVariantProps extends Pick<VariantBaseProps<string | undefi
3357
3357
  className?: string;
3358
3358
  }
3359
3359
 
3360
+ type JsonPrimitive = string | number | boolean | null;
3361
+ type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
3362
+ type JsonObject = Record<string, JsonValue>;
3363
+ type JsonPath = string;
3364
+ type JsonWildcard = string;
3365
+
3366
+ /**
3367
+ * A "variant spec" can be:
3368
+ * - a plain VariantKey ("text", "number", "toggle", ...)
3369
+ * - a variant key + props to pass into that variant
3370
+ */
3371
+ type JsonEditorVariantSpec = VariantKey | {
3372
+ variant: VariantKey;
3373
+ props?: VariantPropsFor<any>;
3374
+ };
3375
+ /**
3376
+ * Map a key-path (or wildcard) to a variant spec.
3377
+ *
3378
+ * Keys are matched against:
3379
+ * - full path: "config.apiEndpoint"
3380
+ * - leaf key: "apiEndpoint"
3381
+ *
3382
+ * Wild examples:
3383
+ * - "*api*" (segment contains "api")
3384
+ * - "config.*" (direct children)
3385
+ * - "config.**" (subtree)
3386
+ * - "**.*token*" (any route/leaf)
3387
+ */
3388
+ type JsonEditorFieldMap = Record<JsonWildcard, JsonEditorVariantSpec>;
3389
+ /**
3390
+ * Layout is scoped to a "page" (object route path).
3391
+ *
3392
+ * Each entry is a "row":
3393
+ * - string: render a single field row
3394
+ * - string[]: render these fields side-by-side (grid row)
3395
+ *
3396
+ * Example:
3397
+ * layout: {
3398
+ * "": [["projectName","version"], "description"],
3399
+ * "config": [["maxEntries","apiEndpoint"], "retry"]
3400
+ * }
3401
+ */
3402
+ type JsonEditorLayoutRow = string | string[];
3403
+ type JsonEditorLayoutMap = Record<JsonWildcard, JsonEditorLayoutRow[]>;
3404
+ interface JsonEditorFilters {
3405
+ /** Hide entire object routes/pages (navigation + rendering) */
3406
+ excludeRoutes?: JsonWildcard[];
3407
+ includeRoutes?: JsonWildcard[];
3408
+ /** Hide specific fields (by full path or leaf/wild patterns) */
3409
+ excludeFields?: JsonWildcard[];
3410
+ includeFields?: JsonWildcard[];
3411
+ /**
3412
+ * If true, excluding "config" also excludes "config.**".
3413
+ * Default: true
3414
+ */
3415
+ excludeRouteSubtree?: boolean;
3416
+ }
3417
+ /**
3418
+ * Default value for a newly created key (or a new array item).
3419
+ * Can be a constant JsonValue, or a function.
3420
+ */
3421
+ type JsonEditorDefaultValueSpec = JsonValue | ((ctx: {
3422
+ parentPath: JsonPath;
3423
+ key: string;
3424
+ current: JsonValue | undefined;
3425
+ }) => JsonValue);
3426
+ interface JsonEditorDefaults {
3427
+ /**
3428
+ * When adding a new array item, you can pick from allowed variants.
3429
+ * You can pass VariantKey or a {variant, props} spec.
3430
+ */
3431
+ array?: JsonEditorVariantSpec[];
3432
+ /**
3433
+ * Optional default values for new keys.
3434
+ * Keyed by wildcard path (full path / leaf / patterns).
3435
+ */
3436
+ values?: Record<JsonWildcard, JsonEditorDefaultValueSpec>;
3437
+ }
3438
+ type JsonEditorNavMode = "sidebar" | "tabs" | "drawer";
3439
+ interface JsonEditorNavOptions {
3440
+ mode?: JsonEditorNavMode;
3441
+ /** Show root "" as a page in navigation. Default: true */
3442
+ showRoot?: boolean;
3443
+ /** Initial active route/page. Default: "" */
3444
+ defaultRoute?: JsonPath;
3445
+ /** Optional label overrides for route nodes */
3446
+ routeLabels?: Record<JsonWildcard, React.ReactNode>;
3447
+ /** Max object nesting to generate routes for. Optional safety */
3448
+ maxDepth?: number;
3449
+ /**
3450
+ * Whether arrays containing objects can contribute routes.
3451
+ * - "none": arrays never create routes (default)
3452
+ * - "objects": array items that are objects become routes like "config.items.0"
3453
+ */
3454
+ arrayRoutes?: "none" | "objects";
3455
+ }
3456
+ interface JsonRouteNode {
3457
+ path: JsonPath;
3458
+ key: string;
3459
+ label: React.ReactNode;
3460
+ children: JsonRouteNode[];
3461
+ }
3462
+ type JsonEditorViewMode = "split" | "visual" | "raw";
3463
+ interface JsonEditorPermissions {
3464
+ canAdd?: boolean;
3465
+ canDelete?: boolean;
3466
+ canViewRaw?: boolean;
3467
+ canEditRaw?: boolean;
3468
+ /**
3469
+ * Keys/paths in this shape cannot be deleted even if canDelete is true.
3470
+ * (treated as "locked")
3471
+ */
3472
+ defaultShape?: JsonObject;
3473
+ /**
3474
+ * Optional finer-grain locks by wildcard.
3475
+ * If true, this key/path cannot be added/deleted/edited.
3476
+ */
3477
+ lockPaths?: JsonWildcard[];
3478
+ }
3479
+ type JsonEditorEditAction = "add" | "delete" | "edit" | "edit-raw";
3480
+ interface JsonEditorEditMeta {
3481
+ action: JsonEditorEditAction;
3482
+ /** the page (object route) currently being edited */
3483
+ route: JsonPath;
3484
+ /** the exact key path being changed (field path) */
3485
+ path: JsonPath;
3486
+ /** parent object path of the key */
3487
+ parent: JsonPath;
3488
+ /** leaf key (segment) */
3489
+ key: string;
3490
+ }
3491
+ interface JsonEditorCallbacks {
3492
+ onAdd?: (nextRoot: JsonObject, meta: JsonEditorEditMeta) => void;
3493
+ onDelete?: (nextRoot: JsonObject, meta: JsonEditorEditMeta) => void;
3494
+ onEdit?: (nextRoot: JsonObject, meta: JsonEditorEditMeta) => void;
3495
+ }
3496
+ interface JsonEditorResolvedField {
3497
+ path: JsonPath;
3498
+ key: string;
3499
+ value: JsonValue;
3500
+ valueType: "string" | "number" | "boolean" | "null" | "object" | "array";
3501
+ variant?: JsonEditorVariantSpec;
3502
+ hidden?: boolean;
3503
+ }
3504
+ /**
3505
+ * This is the "shared" props contract for the JSON editor variant UI.
3506
+ *
3507
+ * NOTE:
3508
+ * - `title` is purely UI (header text)
3509
+ * - `schema` is NOT a title — it’s a schema id/key for validation (later use)
3510
+ */
3511
+ interface ShadcnJsonEditorVariantProps extends Pick<VariantBaseProps<JsonObject | undefined>, "value" | "onValue" | "error" | "disabled" | "readOnly"> {
3512
+ /** Header title (UI only) */
3513
+ title?: React.ReactNode;
3514
+ /** Optional schema id/key or raw JSON Schema object for validation */
3515
+ schema?: string | JsonObject;
3516
+ /** Primary config */
3517
+ fieldMap?: JsonEditorFieldMap;
3518
+ layout?: JsonEditorLayoutMap;
3519
+ defaults?: JsonEditorDefaults;
3520
+ /** Navigation derived from JSON structure */
3521
+ nav?: JsonEditorNavOptions;
3522
+ /** include/exclude for routes + fields */
3523
+ filters?: JsonEditorFilters;
3524
+ /** permissions + locks */
3525
+ permissions?: JsonEditorPermissions;
3526
+ /** callbacks */
3527
+ callbacks?: JsonEditorCallbacks;
3528
+ /**
3529
+ * Page rendering mode:
3530
+ * - "accordion": page sections expand/collapse in main panel
3531
+ * - "popover": nested objects open as overlays (optional UX)
3532
+ */
3533
+ mode?: "accordion" | "popover";
3534
+ /**
3535
+ * Routing:
3536
+ * - route: controlled current page
3537
+ * - defaultRoute: uncontrolled initial page (overrides nav.defaultRoute)
3538
+ * - onRouteChange: called whenever the editor navigates
3539
+ */
3540
+ route?: JsonPath;
3541
+ defaultRoute?: JsonPath;
3542
+ onRouteChange?: (route: JsonPath) => void;
3543
+ /**
3544
+ * View mode (top toggle):
3545
+ * - "split": raw sidebar + visual editor (default)
3546
+ * - "visual": visual editor only
3547
+ * - "raw": raw editor only
3548
+ *
3549
+ * If viewMode is provided, it is controlled.
3550
+ * Otherwise, the defaultViewMode seeds the internal state.
3551
+ */
3552
+ viewMode?: JsonEditorViewMode;
3553
+ defaultViewMode?: JsonEditorViewMode;
3554
+ onViewModeChange?: (mode: JsonEditorViewMode) => void;
3555
+ /** Close button intent (optional). Actual close UI is controlled by the wrapper (index.tsx). */
3556
+ onClose?: () => void;
3557
+ /** Visual (editor-level styling) */
3558
+ className?: string;
3559
+ contentClassName?: string;
3560
+ navClassName?: string;
3561
+ /**
3562
+ * Optional hooks to customize nav + page rendering.
3563
+ */
3564
+ renderRouteLabel?: (ctx: {
3565
+ node: JsonRouteNode;
3566
+ active: boolean;
3567
+ }) => React.ReactNode;
3568
+ renderField?: (ctx: {
3569
+ field: JsonEditorResolvedField;
3570
+ route: JsonPath;
3571
+ }) => React.ReactNode;
3572
+ }
3573
+ /**
3574
+ * Wrapper mode:
3575
+ * - "popover": show trigger + popover
3576
+ * - "accordion": inline panel that can expand/collapse
3577
+ */
3578
+ type JsonEditorMode = "popover" | "accordion";
3579
+ /**
3580
+ * Typed to match your shadcn button variants/sizes.
3581
+ * If your project differs, change these unions here once.
3582
+ */
3583
+ type JsonEditorTriggerVariant = "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
3584
+ type JsonEditorTriggerSize = "default" | "sm" | "lg" | "icon";
3585
+ /**
3586
+ * Standalone wiring:
3587
+ * - caller provides root/onRoot directly
3588
+ */
3589
+ type JsonEditorStandaloneWiring = {
3590
+ root: JsonObject;
3591
+ onRoot: (nextRoot: JsonObject, detail?: any) => void;
3592
+ value?: never;
3593
+ onValue?: never;
3594
+ };
3595
+ /**
3596
+ * Variant wiring:
3597
+ * - InputField variant uses value/onValue
3598
+ */
3599
+ type JsonEditorVariantWiring = Pick<VariantBaseProps<JsonObject | undefined>, "value" | "onValue" | "disabled" | "readOnly" | "error" | "size" | "density"> & {
3600
+ root?: never;
3601
+ onRoot?: never;
3602
+ };
3603
+ /**
3604
+ * Props for the exported component (index.tsx):
3605
+ * - accepts standalone OR variant wiring
3606
+ * - wrapper owns mode/open/trigger UI
3607
+ * - editor-specific props are passed through, without redefining a second type list
3608
+ *
3609
+ * IMPORTANT:
3610
+ * - wrapper uses `wrapperClassName` (outer container)
3611
+ * - editor uses `className` (inner editor surface)
3612
+ */
3613
+ interface JsonEditorWrapperProps {
3614
+ /** Wrapper mode (popover vs accordion). */
3615
+ mode?: JsonEditorMode;
3616
+ /** Trigger UI (popover mode) */
3617
+ triggerLabel?: React.ReactNode;
3618
+ triggerVariant?: JsonEditorTriggerVariant;
3619
+ triggerSize?: JsonEditorTriggerSize;
3620
+ /** Popover sizing/skin */
3621
+ popoverClassName?: string;
3622
+ /** Inline/accordion container class */
3623
+ panelClassName?: string;
3624
+ /** Outer wrapper class */
3625
+ wrapperClassName?: string;
3626
+ /** Optional: controlled popover open state */
3627
+ open?: boolean;
3628
+ onOpenChange?: (open: boolean) => void;
3629
+ /** Accessibility (useful when rendered as an InputField variant) */
3630
+ id?: string;
3631
+ describedBy?: string;
3632
+ /** Called when the wrapper closes (popover close / accordion hide). */
3633
+ onClose?: () => void;
3634
+ }
3635
+ /**
3636
+ * Single source of truth for what index.tsx accepts:
3637
+ * - (standalone OR variant wiring)
3638
+ * - wrapper props
3639
+ * - editor props (minus a few keys owned by wrapper)
3640
+ */
3641
+ type ShadcnJsonEditorProps = (JsonEditorStandaloneWiring | JsonEditorVariantWiring) & JsonEditorWrapperProps & Omit<ShadcnJsonEditorVariantProps, "onValue" | "value" | "disabled" | "readOnly" | "error" | "size" | "density" | "onClose">;
3642
+
3360
3643
  /**
3361
3644
  * Helper type for a single variant registry entry.
3362
3645
  *
@@ -3412,6 +3695,7 @@ interface Variants<H = unknown> {
3412
3695
  treeselect: VariantEntry<string | number | undefined, ShadcnTreeSelectVariantProps>;
3413
3696
  file: VariantEntry<FileLike, ShadcnFileVariantProps>;
3414
3697
  editor: VariantEntry<string | undefined, ShadcnEditorVariantProps>;
3698
+ 'json-editor': VariantEntry<JsonObject | undefined, ShadcnJsonEditorProps>;
3415
3699
  }
3416
3700
  /**
3417
3701
  * Union of all variant keys.