# PropUI JSON authoring guide Use this guide to create or edit PropUI setup files, entry presets and editor settings. It covers the JSON structure, supported fields and complete examples for Full, Free and Rigify. Start with an example for your edition, adjust its controls and source paths, then import it through PropUI's normal workflow. **Compatibility:** Full 1.3.0, Free 1.1.6 and Rigify 1.7.0; JSON `schema_version` **1**. All editions support Blender 5.0 or newer. Multiline strings and text links use native Blender 5.2 widgets, with ordinary string fields or URL buttons on earlier supported versions. ## Authoring workflow 1. Choose the edition: **FULL**, **FREE** or **RIGIFY**. Author for that edition's supported features to avoid losing settings during conversion. 2. Identify the storage Object for Full/Free managed values. Use Blender's **Copy Full Data Path** or an existing export for source properties. For Rigify storage and visibility, use the actual metarig or generated control names from your file. Referenced scene data must exist in the receiving file, and operator IDs must be available in Blender. 3. Create one complete JSON object with `kind`, integer `schema_version` and `payload`. Setup documents also include `source_edition`; preset/editor documents use the root fields in their envelopes below. Use JSON booleans and double quotes, without comments or trailing commas, and save the complete object as a `.json` file. 4. Use only the fields and enum identifiers documented here. UI labels are not enum identifiers: **Dropdown is `ENUM`**, Integer is `INT`, and Operator Button is `OPERATOR`. 5. Give entries and layout items unique, stable `uid` values. Every entry reference must point to an entry included in the setup. Keep parent graphs acyclic and list parents before their children. 6. Put every intended visible entry into `layout_items`. The Entry List and Generated Layout are different. Use explicit rows even though some workflows can infer a layout. 7. Keep entries concise: include identity, type, label and fields needed for the intended behavior. Omitted fields receive importer defaults. Leave out cached detection/error fields, obsolete widget selectors and raw icon IDs. 8. Set `izom_propui_replace_storage_on_generate` to **false** for Full/Free unless you intend to replace storage. Leave automatic old-target cleanup off in a portable new setup. Imported defaults can differ from your current editor settings. 9. Check IDs, links, rows/columns, enum choices, numeric limits, defaults and edition support before importing. All numeric values must be finite, and source names/paths must match your Blender file. 10. Prepare required objects, drivers, nodes and constraints in Blender, and enable any add-ons needed by operator buttons. Setup JSON describes the controls and layout; it does not create the rest of the scene. ### Plan a setup For example, a Full setup for an existing Object named **Cube** could contain an Enable checkbox, a Gain slider from 0 to 1, and an integer Steps control visible only while Enable is on. A Display Link can provide a second view of Gain in a compact popover with keyframe buttons. Define the entries, their relationships and their layout placements separately. Keep storage replacement off to preserve unrelated properties. The complete examples below show the required document structure. ## Import and use the file - **Full:** Editor Settings > JSON > full setup import. A setup import creates a **UI Variant**. Load that variant into the editor, check Property Storage, then **Generate UI**. Importing does not by itself run a generated panel. - **Free:** use setup JSON import or clipboard paste, review the conversion preview, confirm, check the Object, then **Generate UI**. - **Rigify:** first add/select a metarig bone whose Rigify Type is `izom.PropUI`. Import the full setup into that component, then generate through Rigify. The JSON does not create the component or choose an arbitrary metarig for you. - For a reusable **entry preset**, select a compatible entry and import with Entry Type scope. For **editor settings**, use Import Editor Settings JSON; that file also carries editor layout. The standalone `editor_layout` document is the saved-default format, not an ordinary setup/file import. To import an editor layout, place it under `payload.layout` in an `editor_settings` document and retain your existing settings. Choose the importer for the document's kind. - Full/Rigify **Validate Setup** checks current sources, groups and references. Regenerate after changing generated layout or appearance. Save the `.blend` to retain authored data and generated values. Each example is independent. Reusing the same `prop_id` on an owner with existing incompatible properties can produce Blender's normal conflict prompt. When extending a design, start from its current export, preserve existing identities and choose unused property IDs for new values. Review conflicts before importing; leave Replace Storage off when you want to preserve the owner's other properties. ## Document envelopes | Purpose | `kind` | Other root fields | Payload | | --- | --- | --- | --- | | Full/Free panel setup | `propui_project_setup` | `schema_version: 1`, `source_edition: FULL` or `FREE` | `project_settings`, `entries`, `layout_rows`, `layout_items`, `layout_subpanels`, `layout_box_ranges` | | Rigify component setup | `rigify_host_bone_setup` | `schema_version: 1`, `source_edition: RIGIFY` | `host_settings`, `visible_on_bones`, `entries`, layout arrays, optional `editor_state` and `saved_type_defaults` | | One entry preset, Full/Rigify | `entry_type_preset` | `schema_version: 1`, `prop_type` | Entry settings for that type; identity/parent/link-target are not preset fields. | | Editor preferences, Full/Rigify | `editor_settings` | `schema_version: 1` | `settings` and `layout` | | Saved editor-layout default, Full/Rigify | `editor_layout` | `schema_version: 1` | `layout`; for ordinary file import use `editor_settings` instead | The edition prefixes on settings are significant. Full settings use `izom_propui_`. Rigify host/editor settings use `izom_propui_rigify_`, except native passthrough keys listed later. **Free setup files canonically use the portable `izom_propui_` setting keys too**, with `source_edition: FREE`; do not mechanically add `_free` to every key. Entry fields themselves are not edition-prefixed. ## Entry types and meaningful uses | `prop_type` | Meaning | Important fields | | --- | --- | --- | | `FLOAT` | Managed floating-point value | `default_float`, `min_float`, `max_float`, soft limits, step, precision, subtype, slider | | `INT` | Managed integer value; native animation | `default_int`, `min_int`, `max_int`, soft limits, step; Free uses a plain field | | `BOOL` | Managed checkbox/toggle | `default_bool`, state labels; Full/Rigify also offer toggle style/icons | | `ARRAY` | Fixed float/int/bool components | `array_element_type`, `array_size` 1..32, matching default array, float subtype and component layout | | `TEXT` | Heading/label/divider/spacer | `text_role`, alignment, icons, alert; Full/Rigify offer Dynamic Text and HTTP/HTTPS links | | `STRING` | Managed string | `default_string`, optional multiline/visible-lines/placeholder | | `ENUM` | Managed dropdown stored as an integer | `enum_items_json`, `default_enum`, `enum_expanded` | | `DATA_BLOCK` | Typed Blender data-block reference | `datablock_id_type`, optional existing `default_datablock_path`/name | | `PYTHON` | Literal IDProperty content | `python_default_expression`, a Python-literal **string**, not executable code | | `CUSTOM` | Existing property/native widget or internal UI switch | `custom_source`, owner/property fields or `custom_internal_control` | | `DISPLAY_LINK` | A second view of an existing entry | `linked_entry_uid`, label/tooltip mode, display overrides and optional component subset | | `OPERATOR` | Existing Blender operator or built-in action button | `operator_id` plus property JSON, or `native_action` and its group/collection fields | **Free supports only FLOAT, INT, BOOL, ARRAY and TEXT.** It has one Object storage owner, a 3D Viewport sidebar panel, up to three columns per shared row, row height 1..2, fixed optional left indent, direct Dynamic Labels and child visibility. Sub-panels, Row Boxes, availability conditions, per-entry storage, popovers, foldouts, advanced text links, entry presets and saved defaults are outside Free's supported format. ### Dropdown choices and strings containing JSON `enum_items_json`, `operator_props_json`, `display_link_component_subset_json` and Full's visibility-target data are **strings containing JSON**, not nested JSON objects/arrays. Escape their quotes inside the outer file. For a dropdown, the inner array contains objects with `id`, `label`, integer `value`, optional `description`, and optional `retired`. Keep `id` and `value` unique and stable; use an ASCII identifier such as `DRAFT`. Choices number 1..256, with at least one active choice. Retire old choices instead of reusing numbers. `default_enum` is a choice's integer value, not its ID or label. Managed dropdown conditions compare the stored integer with `visibility_match_int`/`availability_match_int`. A native RNA enum exposed by Custom uses its native string identifier. A managed dropdown is a real custom property usable in conditions, labels, animation and Blender drivers. It does not automatically add a driver or connect itself to a scene setting. ### Existing Blender sources and native widgets CUSTOM uses **split fields**, not `custom_full_path` in setup JSON: | Original Blender path | `custom_owner_path` | `custom_prop_name` | Component settings | | --- | --- | --- | --- | | `bpy.data.scenes["Scene"].render.resolution_percentage` | `bpy.data.scenes["Scene"].render` | `resolution_percentage` | false / 1 | | `bpy.data.objects["Cube"]["strength"]` | `bpy.data.objects["Cube"]` | `["strength"]` including brackets/quotes | false / 1 | | `bpy.data.objects["Cube"].location[0]` | `bpy.data.objects["Cube"]` | `location` | `custom_use_component: true`, `custom_component_index: 1` | | `bpy.data.materials["Material"].node_tree.nodes["Color Ramp"].color_ramp` | path through `.nodes["Color Ramp"]` | `color_ramp` | false / 1 | | `bpy.data.materials["Material"].node_tree.nodes["RGB Curves"].mapping` | path through `.nodes["RGB Curves"]` | `mapping` | false / 1 | Data-path component indexes are **zero-based**; stored component slots are **one-based**. Never enable component indexing for a scalar Boolean/int/float. All paths start with `bpy.` and use attributes or literal string/integer subscripts. No function calls, operators, arithmetic or arbitrary expressions. Color Ramp/Curve Mapping widgets are detected from the existing source. Leave out `native_widget`; it cannot create or force a source type. The material/node must already exist. A fixed pointer does not necessarily prevent editing local ramp/curve contents; linked data follows Blender's restrictions. A collection or unsupported pointer can be a summary rather than an editable scalar. For `custom_source: INTERNAL`, use `custom_internal_control` = `GENERATED_UI_ENABLED`, `DISABLE_WHILE_TRANSFORMING` or `DISABLE_WHILE_PLAYBACK`; omit RNA paths. These affect generated output, not the authoring editor. ### Storage and Rigify Full's `izom_propui_default_target_owner_path` names the owner of managed properties, for example `bpy.data.objects["Cube"]` or `bpy.data.scenes["Scene"]`. `entry_target_owner_path` overrides it for one entry. Use the owner path, not an individual property's path. No storage is required for a setup containing only external Custom sources, Text and ordinary operators. Free requires an Object owner and has no entry override. Full can use other supported owners, subject to Blender editability. JSON does not create missing data. Leave Replace Storage off for linked/overridden owners and resolve incompatible storage before generating. Rigify normally stores managed values on the generated host. Set `izom_propui_rigify_use_one_prop_bone: true` and `izom_propui_rigify_one_prop_bone` to use shared bone storage. For an entry override, set **both** `entry_prop_bone_override_enabled: true` and `entry_prop_bone` to an actual supported bone name. A saved bone name with override false is dormant. `entry_target_owner_path` is not the Rigify bone-storage control. `visible_on_bones` is an array of bone-name **strings**. Exact generated controls and mapped metarig names are supported. Always Visible bypasses selection filtering. `KEEP_HOST` preserves the generated host; `METARIG_ONLY` omits it and requires external storage for managed values and external visibility targets unless Always Visible. Reparent metarig children before omitting a host. Use normal Rigify generation; this JSON does not replace `rig_ui.py` or create UI Variants. ### Layout, parenting and conditions - `entries` hold controls. `layout_items` place controls. `entry_uid` references an entry, while the layout item's own `uid` identifies that placement. - `row_index` and `column_index` are **one-based**. Use global row numbers across the whole setup, not a fresh row 1 per sub-panel. Put each row's columns consecutively from 1. Keep every shared row inside one container. - `layout_rows` hold row height/insets; `layout_items` hold the entry, row/column, container and optional width/alignment. Omitted row options use defaults. - `layout_subpanels` contain `uid`, `title`, `parent_uid`, `default_closed`, `ui_order`. Here `parent_uid` refers to another sub-panel; on an entry it refers to another entry. Empty subpanel UID means the main panel. - `layout_box_ranges` contain `uid`, inclusive `row_a`/`row_b`, and `subpanel_uid`. A box stays inside one container. Nested ranges are allowed; partial overlaps are invalid. - Full/Rigify row height is 0.25..15; inset amounts 0.1..10. Free row height is 1..2; its left indent uses 1.5 and it has no right inset. Single-item width/column weight uses `row_width_enabled` and `single_row_width` (0.05..10); omit for normal fill. `single_row_alignment` is LEFT/CENTER/RIGHT. - Entry parenting is functional. On the **child**, set `parent_uid` and its conditions. Keep each parent's descendants together in the Entry List; generated placement is controlled separately by `layout_items`. For Boolean parents use `bool_child_visibility`/availability WHEN_TRUE or WHEN_FALSE. For numeric parents use `number_child_visibility`/availability EQUAL, GREATER (inclusive at least), LESS (inclusive at most), or RANGE and the matching typed value/range fields. ALWAYS disables that condition. - String/native enum comparisons use `visibility_match_text`/`availability_match_text`; managed dropdowns use integer values. Whole arrays use the matching typed array. Component conditions enable `visibility_use_component`/availability and a one-based component index. Inheritance depth chooses the watched ancestor; 1 means the direct parent. - Availability keeps a control visible but disabled; visibility removes it. `shared_row_hidden_mode` FILL_ROW repacks siblings or RESERVE_SLOT leaves an empty slot. Hiding an entry **in the editor** does not hide its generated output. ### Labels, popovers and actions Scalar `value_label_layout` is INLINE, SPLIT_LABEL or LABEL_ABOVE. Array layouts have their own identifiers in the table below: array label-above is **INLINE_LABEL**, not LABEL_ABOVE. `multi_component_draw_mode` WIDGET gives a native whole-value control where supported; COMPONENTS draws separate fields. `compact_control` keeps the control/launcher at its natural width. `native_popover` moves the entry's control into a popup. Style DROPDOWN is Blender's attached dropdown; it needs a compact launcher to allow a compact popup. Style BUTTON permits a full-width launcher and compact popup independently. Choose `native_popover_compact`, icon, show-label and optional `native_popover_show_keyframes` to suit the control. The latter supplies native keyframe diamonds for animatable controls; whole ramps/curves are not one animatable property. `native_foldout` requires a full-width standalone row outside Row Boxes; Rigify also requires SEPARATE_PANEL output. Use sub-panels/boxes for larger sections. Dynamic Label rows are first-match-wins. Use `use_value_labels` and `value_labels` for the entry's own value; `match_mode` EQUAL/GREATER/LESS/RANGE, typed `value_*` and range fields select the match. A FALLBACK rule returns the normal label. Full/Rigify `other_value_labels` can use `source_entry_uid`, source component/state and target match fields; enable `use_other_entry_labels`, or `text_use_other_entry_labels` for Dynamic Text. Source Boolean state and target Boolean scope use WHEN_TRUE/WHEN_FALSE; ANY means no target Boolean restriction. See the field tables for rule shapes. For an ordinary OPERATOR use an existing `operator_id` such as `wm.url_open`, `operator_context`, and an object encoded in `operator_props_json`. Native actions instead use `native_action`: RESET_GROUP, KEY_GROUP, UNKEY_GROUP, SAVE_VALUES, APPLY_VALUES, SELECT_COLLECTION, DESELECT_COLLECTION. For group actions give member entries and the action entry the same `control_group`. Include managed members in Generated Layout. Key/Unkey use the current frame/Action slot and respect drivers, locked channels and editability. Strings support value presets but cannot be keyed. Save/Apply Values use `value_preset_name` and live values stored on the group's first owning data-block **inside the .blend**. They are not setup defaults or JSON-embedded value-preset libraries. Rebinding sources requires a new live-value preset. Bone Collection actions require `bone_collection_object_path` to an armature Object and `bone_collection_path` to an existing collection, for example `bpy.data.objects["Rig"].data.collections_all["Controls"]`. Select/Deselect require that armature active in Pose Mode. Visibility/solo are Custom entries whose property is `is_visible` or `is_solo` on that collection. Operator Emboss is normal button styling; Pressed Visual is appearance, not state. Translation options use Blender's available catalogues. Text Link URL must be valid HTTP/HTTPS. Multiline strings use 1..20 visible lines and fall back on older supported Blender versions. Full panel selection filtering uses `izom_propui_generated_visibility_mode: SELECTED_OBJECTS` plus `izom_propui_generated_visibility_targets_json`, an encoded array of `{"kind":"OBJECT","object_name":"Cube"}` or `{"kind":"POSE_BONE","object_name":"Rig","bone_name":"control"}`. Sidebar/Properties placement and subtype filters are explicit project settings in the reference below. Do not use Full placement/branding keys for Rigify. ## Complete minimal setup files The Full/Free examples assume an existing Object named **Cube**. Replace that storage path with the Object in your file. The Rigify example uses the selected `izom.PropUI` host without requiring an explicit storage bone. Each example is a complete importable document. ### Full minimal ```json { "kind": "propui_project_setup", "schema_version": 1, "source_edition": "FULL", "payload": { "entries": [ { "uid": "gain", "prop_id": "gain", "label": "Gain", "prop_type": "FLOAT", "default_float": 0.5, "min_float": 0.0, "max_float": 1.0, "ui_order": 1, "display_order": 1 } ], "layout_rows": [ { "row_index": 1 } ], "layout_items": [ { "uid": "layout_gain", "entry_uid": "gain", "row_index": 1, "column_index": 1 } ], "layout_subpanels": [], "layout_box_ranges": [], "project_settings": { "izom_propui_default_target_owner_path": "bpy.data.objects[\"Cube\"]", "izom_propui_generated_panel_title": "Example Controls", "izom_propui_generated_panel_tab": "PropUI", "izom_propui_replace_storage_on_generate": false, "izom_propui_clean_old_targets_on_generate": false } } } ``` ### Free minimal ```json { "kind": "propui_project_setup", "schema_version": 1, "source_edition": "FREE", "payload": { "entries": [ { "uid": "gain", "prop_id": "gain", "label": "Gain", "prop_type": "FLOAT", "default_float": 0.5, "min_float": 0.0, "max_float": 1.0, "ui_order": 1, "display_order": 1 } ], "layout_rows": [ { "row_index": 1 } ], "layout_items": [ { "uid": "layout_gain", "entry_uid": "gain", "row_index": 1, "column_index": 1 } ], "layout_subpanels": [], "layout_box_ranges": [], "project_settings": { "izom_propui_default_target_owner_path": "bpy.data.objects[\"Cube\"]", "izom_propui_generated_panel_title": "Example Controls", "izom_propui_generated_panel_tab": "PropUI", "izom_propui_replace_storage_on_generate": false, "izom_propui_clean_old_targets_on_generate": false } } } ``` ### Rigify minimal ```json { "kind": "rigify_host_bone_setup", "schema_version": 1, "source_edition": "RIGIFY", "payload": { "entries": [ { "uid": "gain", "prop_id": "gain", "label": "Gain", "prop_type": "FLOAT", "default_float": 0.5, "min_float": 0.0, "max_float": 1.0, "ui_order": 1, "display_order": 1 } ], "layout_rows": [ { "row_index": 1 } ], "layout_items": [ { "uid": "layout_gain", "entry_uid": "gain", "row_index": 1, "column_index": 1 } ], "layout_subpanels": [], "layout_box_ranges": [], "host_settings": { "izom_propui_rigify_host_output_mode": "KEEP_HOST", "izom_propui_rigify_use_one_prop_bone": false, "izom_propui_rigify_generated_ui_panel_location": "SEPARATE_PANEL", "izom_propui_rigify_generated_ui_panel_title": "Example Controls", "izom_propui_rigify_generated_ui_sidebar_tab": "PropUI", "izom_propui_rigify_generated_ui_always_visible": true }, "visible_on_bones": [], "editor_state": {}, "saved_type_defaults": {} } } ``` ## Complete worked control gallery The following Full file uses all 12 entry types, a parent visibility rule, stable dropdown choices, Dynamic Labels/Text, a sub-panel, Row Box, Control Group reset, styled label, multiline text and a popup Display Link with keyframe buttons. It assumes **Cube** storage and an existing Scene named **Scene**. No source data or drivers are created by importing it. ```json { "kind": "propui_project_setup", "schema_version": 1, "source_edition": "FULL", "payload": { "entries": [ { "uid": "heading", "prop_id": "heading", "label": "Main controls", "prop_type": "TEXT", "text_alignment": "CENTER", "text_icon": "PREFERENCES", "ui_order": 1, "display_order": 1 }, { "uid": "master", "prop_id": "master", "label": "Enable details", "prop_type": "BOOL", "default_bool": true, "use_bool_state_labels": true, "bool_label_true": "Enabled", "bool_label_false": "Disabled", "control_group": "Main", "ui_order": 2, "display_order": 2 }, { "uid": "gain", "prop_id": "gain", "label": "Gain", "prop_type": "FLOAT", "default_float": 0.5, "min_float": 0.0, "max_float": 1.0, "value_label_layout": "LABEL_ABOVE", "stacked_label_use_text_style": true, "control_group": "Main", "use_value_labels": true, "value_labels": [ { "uid": "gain_zero", "match_mode": "EQUAL", "value_float": 0.0, "label": "Muted" }, { "uid": "gain_high", "match_mode": "GREATER", "value_float": 0.8, "label": "High gain" } ], "ui_order": 3, "display_order": 3 }, { "uid": "steps", "prop_id": "steps", "label": "Steps", "prop_type": "INT", "parent_uid": "master", "bool_child_visibility": "WHEN_TRUE", "default_int": 3, "min_int": 1, "max_int": 12, "control_group": "Main", "ui_order": 4, "display_order": 4 }, { "uid": "quality", "prop_id": "quality", "label": "Quality", "prop_type": "ENUM", "enum_items_json": "[{\"id\": \"DRAFT\", \"label\": \"Draft\", \"value\": 0}, {\"id\": \"FINAL\", \"label\": \"Final\", \"value\": 7}]", "default_enum": 0, "enum_expanded": false, "control_group": "Main", "ui_order": 5, "display_order": 5 }, { "uid": "color", "prop_id": "color", "label": "Tint", "prop_type": "ARRAY", "array_element_type": "FLOAT", "array_size": 4, "float_array_subtype": "COLOR", "default_float_array": [ 0.2, 0.4, 0.8, 1.0 ], "min_float": 0.0, "max_float": 1.0, "control_group": "Main", "ui_order": 6, "display_order": 6 }, { "uid": "notes", "prop_id": "notes", "label": "Notes", "prop_type": "STRING", "default_string": "Write notes here", "string_multiline": true, "string_visible_lines": 4, "string_placeholder": "Notes", "ui_order": 7, "display_order": 7 }, { "uid": "material", "prop_id": "material", "label": "Material", "prop_type": "DATA_BLOCK", "datablock_id_type": "MATERIAL", "ui_order": 8, "display_order": 8 }, { "uid": "config", "prop_id": "config", "label": "Configuration", "prop_type": "PYTHON", "python_default_expression": "{'enabled': True, 'weights': [0.25, 0.75]}", "ui_order": 9, "display_order": 9 }, { "uid": "resolution", "prop_id": "resolution", "label": "Resolution %", "prop_type": "CUSTOM", "custom_source": "RNA_PATH", "custom_owner_path": "bpy.data.scenes[\"Scene\"].render", "custom_prop_name": "resolution_percentage", "ui_order": 10, "display_order": 10 }, { "uid": "gain_popup", "prop_id": "gain_popup", "label": "Gain popup", "prop_type": "DISPLAY_LINK", "linked_entry_uid": "gain", "display_link_label_mode": "CUSTOM", "native_popover": true, "native_popover_style": "BUTTON", "native_popover_compact": true, "native_popover_icon": "PREFERENCES", "native_popover_show_label": false, "native_popover_show_keyframes": true, "ui_order": 11, "display_order": 11 }, { "uid": "reset", "prop_id": "reset", "label": "Reset Main", "prop_type": "OPERATOR", "native_action": "RESET_GROUP", "control_group": "Main", "operator_icon": "LOOP_BACK", "compact_control": true, "ui_order": 12, "display_order": 12 }, { "uid": "status", "prop_id": "status", "label": "Ready", "prop_type": "TEXT", "text_use_other_entry_labels": true, "other_value_labels": [ { "uid": "status_off", "source_entry_uid": "master", "source_bool_state": "WHEN_FALSE", "label": "Details disabled" } ], "ui_order": 13, "display_order": 13 } ], "layout_rows": [ { "row_index": 1 }, { "row_index": 2 }, { "row_index": 3 }, { "row_index": 4 }, { "row_index": 5 }, { "row_index": 6 }, { "row_index": 7, "subpanel_uid": "details_panel" }, { "row_index": 8, "subpanel_uid": "details_panel" }, { "row_index": 9, "subpanel_uid": "details_panel" }, { "row_index": 10 }, { "row_index": 11 }, { "row_index": 12 }, { "row_index": 13, "subpanel_uid": "details_panel" } ], "layout_items": [ { "uid": "layout_heading", "entry_uid": "heading", "row_index": 1, "column_index": 1 }, { "uid": "layout_master", "entry_uid": "master", "row_index": 2, "column_index": 1 }, { "uid": "layout_gain", "entry_uid": "gain", "row_index": 3, "column_index": 1 }, { "uid": "layout_steps", "entry_uid": "steps", "row_index": 4, "column_index": 1 }, { "uid": "layout_quality", "entry_uid": "quality", "row_index": 5, "column_index": 1 }, { "uid": "layout_color", "entry_uid": "color", "row_index": 6, "column_index": 1 }, { "uid": "layout_notes", "entry_uid": "notes", "row_index": 7, "column_index": 1, "subpanel_uid": "details_panel" }, { "uid": "layout_material", "entry_uid": "material", "row_index": 8, "column_index": 1, "subpanel_uid": "details_panel" }, { "uid": "layout_config", "entry_uid": "config", "row_index": 9, "column_index": 1, "subpanel_uid": "details_panel" }, { "uid": "layout_resolution", "entry_uid": "resolution", "row_index": 10, "column_index": 1 }, { "uid": "layout_gain_popup", "entry_uid": "gain_popup", "row_index": 11, "column_index": 1 }, { "uid": "layout_reset", "entry_uid": "reset", "row_index": 12, "column_index": 1 }, { "uid": "layout_status", "entry_uid": "status", "row_index": 13, "column_index": 1, "subpanel_uid": "details_panel" } ], "layout_subpanels": [ { "uid": "details_panel", "title": "Details", "parent_uid": "", "ui_order": 1, "default_closed": false } ], "layout_box_ranges": [ { "uid": "main_box", "row_a": 2, "row_b": 6, "subpanel_uid": "" } ], "project_settings": { "izom_propui_default_target_owner_path": "bpy.data.objects[\"Cube\"]", "izom_propui_generated_panel_title": "Control Gallery", "izom_propui_generated_panel_tab": "PropUI", "izom_propui_replace_storage_on_generate": false, "izom_propui_clean_old_targets_on_generate": false } } } ``` The included `rigify-controls.json` uses the same entries/layout with the Rigify envelope and host settings. `free-controls.json` demonstrates every Free type without advanced fields. `full-native-widgets.json` requires a material named **PropUI Example Material** with nodes named **Color Ramp** and **RGB Curves**. Create those sources first or replace the example paths with matching sources in your file. ## Complete field reference Use the exact keys below. Defaults shown are the current importer baseline; sparse files should explicitly set important limits, storage replacement and appearance. Values written as `32 × value` describe an array default; that notation is not JSON. For 32-slot array buffers, a shorter array is normalized/padded; include at least the visible `array_size` components with the intended values. ### Shared entry fields All fields in this table are available to Full/Rigify unless marked otherwise in their meaning. The final column identifies Free support. Omit fields irrelevant to the chosen type. Labels/tooltips for Custom RNA sources follow Blender; a JSON description cannot replace Blender's native source tooltip. | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `uid` | string | `""` | Supply a unique stable non-empty identifier; the importer otherwise generates one. Free: Yes. | | `parent_uid` | string | `""` | Internal parent link for Entry List hierarchy Free: Yes. | | `prop_id` | string | `"prop_1"` | Custom-property key stored on the resolved target owner. Property IDs must be unique per target; duplicate names are auto-suffixed Free: Yes. | | `label` | string | `"Property 1"` | User-facing label shown in the generated UI. You can also edit it directly in the Entry List Free: Yes. | | `editor_label` | string | `""` | Optional editor-only name used in izom PropUI lists without changing generated labels or custom properties Free: Yes. | | `description` | string | `""` | Static tooltip shown for this property in the generated UI Free: Yes. | | `prop_type` | string | `"FLOAT"` | Allowed: `FLOAT`, `INT`, `BOOL`, `STRING`, `DATA_BLOCK`, `PYTHON`, `ARRAY`, `DISPLAY_LINK`, `CUSTOM`, `TEXT`, `OPERATOR`, `ENUM`. Entry type used by the generated UI and property builder Free: Yes. | | `linked_entry_uid` | string | `""` | Entry List item whose property this Display Link should draw Free: Full/Rigify. | | `display_link_label_mode` | string | `"SOURCE"` | Allowed: `SOURCE`, `CUSTOM`. Choose whether this Display Link uses the source entry label or its own custom label. Custom can be left blank to draw no label Free: Full/Rigify. | | `display_link_tooltip_mode` | string | `"SOURCE"` | Allowed: `SOURCE`, `CUSTOM`. Choose whether this Display Link uses the source entry tooltip or its own custom tooltip. Custom can be left blank to draw no tooltip Free: Full/Rigify. | | `display_link_use_component_subset` | boolean | `false` | Draw only selected source components through this Display Link Free: Full/Rigify. | | `display_link_component_subset_json` | string | `"[]"` | Internal serialized Display Link component subset Free: Full/Rigify. | | `text_alignment` | string | `"LEFT"` | Allowed: `LEFT`, `CENTER`, `RIGHT`. How this text block is aligned in the generated UI Free: Yes. | | `text_role` | string | `"TEXT"` | Allowed: `TEXT`, `DIVIDER`, `SPACER`. Choose whether this text entry draws text, a divider, or generated-row space Free: Yes. | | `text_alert` | boolean | `false` | Draw this text block with Blender's alert styling Free: Yes. | | `text_icon` | string | `"NONE"` | Optional Blender icon drawn before this text block Free: Yes. | | `text_icon_hug_text` | boolean | `true` | For centered text only, keep the before icon attached to the text instead of pinning it to the row edge; left and right aligned text always hugs icons Free: Yes. | | `text_icon_after` | string | `"NONE"` | Optional Blender icon drawn after this text block Free: Yes. | | `text_icon_after_hug_text` | boolean | `true` | For centered text only, keep the after icon attached to the text instead of pinning it to the row edge; left and right aligned text always hugs icons Free: Yes. | | `operator_id` | string | `""` | Paste an operator ID like object.delete or a full bpy.ops call; keyword arguments are moved to Operator Properties JSON Free: Full/Rigify. | | `operator_icon` | string | `"PLAY"` | Optional Blender icon drawn on this operator button Free: Full/Rigify. | | `operator_emboss` | boolean | `true` | Draw the standard Blender button body Free: Full/Rigify. | | `operator_depress` | boolean | `false` | Draw the button as pressed without storing a toggle state Free: Full/Rigify. | | `operator_enabled` | boolean | `true` | Allow this generated operator button to be clickable Free: Full/Rigify. | | `operator_active` | boolean | `true` | Draw this generated operator button as active Free: Full/Rigify. | | `operator_context` | string | `"INVOKE_DEFAULT"` | Allowed: `INVOKE_DEFAULT`, `EXEC_DEFAULT`, `INVOKE_REGION_WIN`, `EXEC_REGION_WIN`, `INVOKE_REGION_CHANNELS`, `EXEC_REGION_CHANNELS`, `INVOKE_REGION_PREVIEW`, `EXEC_REGION_PREVIEW`, `INVOKE_AREA`, `EXEC_AREA`, `INVOKE_SCREEN`, `EXEC_SCREEN`. Blender operator context used when this generated button runs Free: Full/Rigify. | | `operator_translate` | boolean | `true` | Allow Blender UI translation for this button text Free: Full/Rigify. | | `operator_text_context` | string | `""` | Optional Blender translation context for this button text Free: Full/Rigify. | | `operator_props_json` | string | `"{}"` | Optional JSON object of operator property values assigned when drawing the button Free: Full/Rigify. | | `operator_report_timing` | string | `"OFF"` | Allowed: `OFF`, `ALWAYS`, `SUCCESS`, `FAILURE`. Optional Blender report shown after this operator button is clicked Free: Full/Rigify. | | `operator_report_type` | string | `"INFO"` | Allowed: `INFO`, `WARNING`, `ERROR`. Native Blender report type used for this operator button notification Free: Full/Rigify. | | `operator_report_message` | string | `""` | Notification message shown after this operator button is clicked Free: Full/Rigify. | | `default_float` | number | `0.0` | Default float value for this generated custom property Free: Yes. | | `enum_items_json` | string | `"[{\"id\":\"FIRST\",\"label\":\"First\",\"value\":0},{\"id\":\"SECOND\",\"label\":\"Second\",\"value\":1}]"` | Dropdown Choices Free: Full/Rigify. | | `default_enum` | integer | `0` | Default Choice Value Free: Full/Rigify. | | `enum_expanded` | boolean | `false` | Use native enum buttons instead of a dropdown Free: Full/Rigify. | | `control_group` | string | `""` | Entries with the same name share Reset, Key/Unkey and Save/Apply Values actions. Add buttons through Entry Tools > Add Control Group Actions; naming a group does not change the layout Free: Full/Rigify. | | `native_action` | string | `"NONE"` | Allowed: `NONE`, `RESET_GROUP`, `KEY_GROUP`, `UNKEY_GROUP`, `SAVE_VALUES`, `APPLY_VALUES`, `SELECT_COLLECTION`, `DESELECT_COLLECTION`. Action Free: Full/Rigify. | | `value_preset_name` | string | `"Preset"` | Value Preset Free: Full/Rigify. | | `bone_collection_path` | string | `""` | Validated full RNA path to a Bone Collection Free: Full/Rigify. | | `bone_collection_object_path` | string | `""` | Collection Armature Path Free: Full/Rigify. | | `native_foldout` | boolean | `false` | Collapse this one control inside a native full-width foldout. Use Containers for sections of controls. Requires a single top-level row outside Row Boxes Free: Full/Rigify. | | `native_popover` | boolean | `false` | Offer this control in a native popover Free: Full/Rigify. | | `native_popover_compact` | boolean | `false` | Use a smaller popup. Dropdown also requires Compact Button: Blender keeps attached popovers at least as wide as their trigger. Button style allows independent popup width Free: Full/Rigify. | | `compact_control` | boolean | `false` | Use the control's natural width inside its layout cell instead of stretching it Free: Full/Rigify. | | `native_popover_style` | string | `"DROPDOWN"` | Allowed: `DROPDOWN`, `BUTTON`. Popover Button Style Free: Full/Rigify. | | `native_popover_icon` | string | `"NONE"` | Popover Icon Free: Full/Rigify. | | `native_popover_show_label` | boolean | `true` | Use the configured label layout inside the popup; disable to show only the control Free: Full/Rigify. | | `native_popover_show_keyframes` | boolean | `false` | Show Blender animation diamonds next to animatable values inside this popover Free: Full/Rigify. | | `default_int` | integer | `0` | Default integer value for this generated custom property Free: Yes. | | `default_bool` | boolean | `false` | Default boolean value for this generated custom property Free: Yes. | | `default_string` | string | `""` | Default string value for this generated custom property Free: Full/Rigify. | | `string_multiline` | boolean | `false` | Use a multiline text editor when available; use a regular string field on older Blender versions Free: Full/Rigify. | | `string_visible_lines` | integer | `4` | Initial height of the multiline text editor Range 1..20. Free: Full/Rigify. | | `string_placeholder` | string | `""` | Hint shown when the multiline string is empty Free: Full/Rigify. | | `text_link_url` | string | `""` | Optional HTTP or HTTPS link for this Text entry; leave empty for ordinary text Free: Full/Rigify. | | `datablock_id_type` | string | `"OBJECT"` | Allowed: `ACTION`, `ARMATURE`, `BRUSH`, `CACHEFILE`, `CAMERA`, `COLLECTION`, `CURVE`, `CURVES`, `FONT`, `GREASEPENCIL`, `GREASEPENCIL_V3`, `IMAGE`, `KEY`, `LATTICE`, `LIBRARY`, `LIGHT`, `LIGHT_PROBE`, `LINESTYLE`, `MASK`, `MATERIAL`, `MESH`, `META`, `MOVIECLIP`, `NODETREE`, `OBJECT`, `PAINTCURVE`, `PALETTE`, `PARTICLE`, `POINTCLOUD`, `SCENE`, `SCREEN`, `SOUND`, `SPEAKER`, `TEXT`, `TEXTURE`, `VOLUME`, `WINDOWMANAGER`, `WORKSPACE`, `WORLD`. Data-block type accepted by this generated custom property Free: Full/Rigify. | | `default_datablock_name` | string | `""` | Optional default data-block name for this generated custom property Free: Full/Rigify. | | `default_datablock_path` | string | `""` | Internal resolved data-block path for this entry's default value Free: Full/Rigify. | | `python_default_expression` | string | `"{}"` | Python literal expression assigned as this generated custom property's default value Free: Full/Rigify. | | `default_float_array` | array | `32 × 1.0` | Default float values for this generated array custom property Free: Yes. | | `default_int_array` | array | `32 × 0` | Default integer values for this generated array custom property Free: Yes. | | `default_bool_array` | array | `32 × false` | Default boolean values for this generated array custom property Free: Yes. | | `min_float` | number | `0.0` | Minimum float value for this generated custom property Free: Yes. | | `max_float` | number | `1.0` | Maximum float value for this generated custom property Free: Yes. | | `min_int` | integer | `0` | Minimum integer value for this generated custom property Free: Yes. | | `max_int` | integer | `5` | Maximum integer value for this generated custom property Free: Yes. | | `ui_order` | integer | `1` | Internal stored order used by the izom PropUI editor Free: Yes. | | `display_order` | integer | `1` | Internal generated row order used by the generated UI Free: Yes. | | `row_slot` | integer | `1` | 1-based left-to-right column inside a shared generated row Free: Yes. | | `slider` | boolean | `true` | Show numeric generated properties and custom IDProperty paths as sliders. Enabling this turns off Soft Limits. Hidden for native RNA paths whose widget style Blender controls internally Free: Yes. | | `alert_style` | boolean | `false` | Draw this generated property control with Blender's alert styling Free: Yes. | | `bool_ui_style` | string | `"CHECKBOX"` | Allowed: `CHECKBOX`, `TOGGLE_BUTTON`. How this boolean should look in the generated UI Free: Full/Rigify. | | `bool_icon_true` | string | `"NONE"` | Optional Blender icon to draw while this toggle-style boolean is enabled Free: Full/Rigify. | | `bool_icon_false` | string | `"NONE"` | Optional Blender icon to draw while this toggle-style boolean is disabled Free: Full/Rigify. | | `value_label_layout` | string | `"INLINE"` | Allowed: `INLINE`, `SPLIT_LABEL`, `LABEL_ABOVE`. How scalar labels should be placed in the generated UI Free: Yes. | | `multi_component_layout` | string | `"INLINE"` | Allowed: `INLINE`, `SPLIT_LABEL`, `INLINE_LABEL`, `STACKED`, `STACKED_SPLIT_LABEL`, `STACKED_COMPONENT_SPLIT_LABEL`. How vector-like values should be drawn: inline, with split labels, with label above, or on separate lines inside the same cell Free: Yes. | | `multi_component_draw_mode` | string | `"WIDGET"` | Allowed: `WIDGET`, `COMPONENTS`. For color and direction subtypes, choose Blender's native whole-value control or individual component fields Free: Yes. | | `stacked_label_use_text_style` | boolean | `false` | Render the label above the control as a text block so role, alignment, icons, and alert styling can be edited Free: Full/Rigify. | | `array_component_label_style` | string | `"AUTO"` | Allowed: `AUTO`, `NONE`, `NUMBERED`, `XYZ`, `ABC`, `GREEK`, `DEGREES`, `CUSTOM`. Label style used for array, vector, and color components in the generated UI Free: Full/Rigify. | | `array_component_label_custom_base` | string | `"AUTO"` | Allowed: `AUTO`, `NONE`, `NUMBERED`, `XYZ`, `ABC`, `GREEK`, `DEGREES`. Base component-label style used before applying custom component label overrides Free: Full/Rigify. | | `array_component_label_01` | string | `""` | Custom generated UI label for array component 1. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_02` | string | `""` | Custom generated UI label for array component 2. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_03` | string | `""` | Custom generated UI label for array component 3. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_04` | string | `""` | Custom generated UI label for array component 4. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_05` | string | `""` | Custom generated UI label for array component 5. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_06` | string | `""` | Custom generated UI label for array component 6. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_07` | string | `""` | Custom generated UI label for array component 7. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_08` | string | `""` | Custom generated UI label for array component 8. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_09` | string | `""` | Custom generated UI label for array component 9. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_10` | string | `""` | Custom generated UI label for array component 10. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_11` | string | `""` | Custom generated UI label for array component 11. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_12` | string | `""` | Custom generated UI label for array component 12. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_13` | string | `""` | Custom generated UI label for array component 13. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_14` | string | `""` | Custom generated UI label for array component 14. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_15` | string | `""` | Custom generated UI label for array component 15. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_16` | string | `""` | Custom generated UI label for array component 16. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_17` | string | `""` | Custom generated UI label for array component 17. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_18` | string | `""` | Custom generated UI label for array component 18. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_19` | string | `""` | Custom generated UI label for array component 19. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_20` | string | `""` | Custom generated UI label for array component 20. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_21` | string | `""` | Custom generated UI label for array component 21. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_22` | string | `""` | Custom generated UI label for array component 22. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_23` | string | `""` | Custom generated UI label for array component 23. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_24` | string | `""` | Custom generated UI label for array component 24. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_25` | string | `""` | Custom generated UI label for array component 25. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_26` | string | `""` | Custom generated UI label for array component 26. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_27` | string | `""` | Custom generated UI label for array component 27. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_28` | string | `""` | Custom generated UI label for array component 28. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_29` | string | `""` | Custom generated UI label for array component 29. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_30` | string | `""` | Custom generated UI label for array component 30. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_31` | string | `""` | Custom generated UI label for array component 31. Leave empty to use the selected base style Free: Full/Rigify. | | `array_component_label_32` | string | `""` | Custom generated UI label for array component 32. Leave empty to use the selected base style Free: Full/Rigify. | | `hidden_in_editor` | boolean | `false` | Hide this entry from the izom PropUI editor list until you unhide entries Free: Full/Rigify. | | `use_value_labels` | boolean | `false` | Change the visible label based on this entry's current value Free: Yes. | | `value_labels_use_component` | boolean | `false` | For vector, color, integer-array, or boolean-array values, evaluate Dynamic Labels from one chosen component or channel instead of matching the whole value Free: Yes. | | `value_labels_component_index` | integer | `1` | 1-based component or channel used by this entry's Dynamic Labels while Use One Component is enabled Range 1..32. Free: Yes. | | `use_bool_state_labels` | boolean | `false` | Change the visible label based on whether this boolean is on or off Free: Yes. | | `bool_label_true` | string | `""` | Label to show when this boolean is on Free: Yes. | | `bool_label_false` | string | `""` | Label to show when this boolean is off Free: Yes. | | `use_other_entry_labels` | boolean | `false` | Change this entry's visible label based on another entry's state or value Free: Full/Rigify. | | `text_use_other_entry_labels` | boolean | `false` | Change this text entry based on another entry's state or value Free: Full/Rigify. | | `use_soft_limits` | boolean | `false` | Use separate soft min/max limits in the UI. Enabling this turns off Use Slider Free: Yes. | | `soft_min_float` | number | `0.0` | Soft minimum float value used by the generated custom-property UI Free: Yes. | | `soft_max_float` | number | `1.0` | Soft maximum float value used by the generated custom-property UI Free: Yes. | | `soft_min_int` | integer | `0` | Soft minimum integer value used by the generated custom-property UI Free: Yes. | | `soft_max_int` | integer | `5` | Soft maximum integer value used by the generated custom-property UI Free: Yes. | | `step_float` | number | `0.1` | Native Blender float custom-property step metadata. This affects Blender's property metadata, not the generated row layout Range 0.009999999776482582..100.0. Free: Yes. | | `step_int` | integer | `1` | Native Blender integer custom-property step metadata. This affects Blender's property metadata, not the generated row layout Range 1..100. Free: Yes. | | `precision` | integer | `3` | Native Blender float custom-property precision metadata. This affects Blender's property metadata, not the generated row layout Range 0..6. Free: Yes. | | `array_element_type` | string | `"FLOAT"` | Allowed: `FLOAT`, `INT`, `BOOL`. Element type stored by this generated array property Free: Yes. | | `array_size` | integer | `4` | Number of visible elements in this array property Range 1..32. Free: Yes. | | `float_subtype` | string | `"NONE"` | Allowed: `NONE`, `PIXEL`, `UNSIGNED`, `PERCENTAGE`, `FACTOR`, `ANGLE`, `TIME`, `TIME_ABSOLUTE`, `DISTANCE`, `DISTANCE_CAMERA`, `POWER`, `TEMPERATURE`, `WAVELENGTH`, `COLOR_TEMPERATURE`, `FREQUENCY`. Native Blender float custom-property subtype Free: Yes. | | `float_array_subtype` | string | `"NONE"` | Allowed: `NONE`, `COLOR`, `COLOR_GAMMA`, `TRANSLATION`, `DIRECTION`, `VELOCITY`, `ACCELERATION`, `EULER`, `QUATERNION`, `AXISANGLE`, `XYZ`. Native Blender float array subtype applied to the generated custom property Free: Yes. | | `library_overridable` | boolean | `true` | Mark this generated custom property as library-overridable Free: Yes. | | `entry_target_owner_path` | string | `""` | Internal resolved storage owner path for this entry. Empty uses Output Setup Property Storage Free: Full/Rigify. | | `custom_source` | string | `"RNA_PATH"` | Allowed: `RNA_PATH`, `INTERNAL`. Where this custom entry gets its generated UI value from Free: Full/Rigify. | | `custom_internal_control` | string | `"GENERATED_UI_ENABLED"` | Allowed: `GENERATED_UI_ENABLED`, `DISABLE_WHILE_TRANSFORMING`, `DISABLE_WHILE_PLAYBACK`. Built-in generated UI control drawn by this custom entry Free: Full/Rigify. | | `custom_owner_path` | string | `""` | Stored owner path used by the custom entry runtime Free: Full/Rigify. | | `custom_prop_name` | string | `""` | Stored property name used by the custom entry runtime Free: Full/Rigify. | | `custom_use_component` | boolean | `false` | Editor-only stored component selection parsed from an indexed custom path Free: Full/Rigify. | | `custom_component_index` | integer | `1` | Editor-only stored 1-based component selected by an indexed custom path Range 1..32. Free: Full/Rigify. | | `bool_child_visibility` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `WHEN_TRUE`, `WHEN_FALSE`. When this child entry should be shown, based on its parent boolean value Free: Yes. | | `number_child_visibility` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `EQUAL`, `GREATER`, `LESS`, `RANGE`. When this child entry should be shown, based on its parent numeric value Free: Yes. | | `visibility_inheritance_depth` | integer | `1` | How many visibility rules this entry uses in the generated UI chain. 1 = parent only, 2 = parent + parent's rule, higher numbers add upstream rules. The editor shows the full parent chain; the generated UI can only use ancestors that are actually present there Range 1..12. Free: Yes. | | `visibility_use_component` | boolean | `false` | For vector, color, or integer-array parents, evaluate Child Visibility from one chosen component or channel instead of matching the whole parent value Free: Yes. | | `visibility_component_index` | integer | `1` | 1-based component or channel used by Child Visibility while Use One Component is enabled Range 1..32. Free: Yes. | | `shared_row_hidden_mode` | string | `"FILL_ROW"` | Allowed: `FILL_ROW`, `RESERVE_SLOT`. Choose whether this entry collapses out or keeps an empty slot when child visibility hides it in a shared generated row Free: Full/Rigify. | | `visibility_match_float` | number | `0.0` | Comparison value used against the parent float property Free: Yes. | | `visibility_match_int` | integer | `0` | Comparison value used against the parent integer property Free: Yes. | | `visibility_match_text` | string | `""` | Exact value used against a parent enum, string, or vector-style property Free: Full/Rigify. | | `visibility_match_float_array` | array | `32 × 1.0` | Exact float-array value used against a parent array property Free: Yes. | | `visibility_match_int_array` | array | `32 × 0` | Exact integer-array value used against a parent array property Free: Yes. | | `visibility_match_bool_array` | array | `32 × false` | Exact boolean-array value used against a parent array property Free: Yes. | | `visibility_range_max_float` | number | `1.0` | Upper bound of the visibility range for the parent float property Free: Yes. | | `visibility_range_max_int` | integer | `0` | Upper bound of the visibility range for the parent integer property Free: Yes. | | `bool_child_availability` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `WHEN_TRUE`, `WHEN_FALSE`. When this child entry should be enabled, based on its parent boolean value. Disabled entries are visible but grayed out Free: Full/Rigify. | | `number_child_availability` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `EQUAL`, `GREATER`, `LESS`, `RANGE`. When this child entry should be enabled, based on its parent numeric value. Disabled entries are visible but grayed out Free: Full/Rigify. | | `availability_inheritance_depth` | integer | `1` | How many availability rules this entry uses in the generated UI chain. 1 = parent only, 2 = parent + parent's rule, higher numbers add upstream rules. The editor shows the full parent chain; the generated UI can only use ancestors that are actually present there Range 1..12. Free: Full/Rigify. | | `availability_use_component` | boolean | `false` | For vector, color, or integer-array parents, evaluate Child Availability from one chosen component or channel instead of matching the whole parent value Free: Full/Rigify. | | `availability_component_index` | integer | `1` | 1-based component or channel used by Child Availability while Use One Component is enabled Range 1..32. Free: Full/Rigify. | | `availability_match_float` | number | `0.0` | Comparison value used against the parent float property for availability Free: Full/Rigify. | | `availability_match_int` | integer | `0` | Comparison value used against the parent integer property for availability Free: Full/Rigify. | | `availability_match_text` | string | `""` | Exact value used against a parent enum, string, or vector-style property for availability Free: Full/Rigify. | | `availability_match_float_array` | array | `32 × 1.0` | Exact float-array value used against a parent array property for availability Free: Full/Rigify. | | `availability_match_int_array` | array | `32 × 0` | Exact integer-array value used against a parent array property for availability Free: Full/Rigify. | | `availability_match_bool_array` | array | `32 × false` | Exact boolean-array value used against a parent array property for availability Free: Full/Rigify. | | `availability_range_max_float` | number | `1.0` | Upper bound of the availability range for the parent float property Free: Full/Rigify. | | `availability_range_max_int` | integer | `0` | Upper bound of the availability range for the parent integer property Free: Full/Rigify. | | `value_labels` | array | `[]` | value_labels Free: Yes. | | `other_value_labels` | array | `[]` | other_value_labels Free: Full/Rigify. | ### Free entry fields The following table gives the exact Free defaults and choices. Where a shared field has fewer choices or a narrower range in Free, this table takes precedence. | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `uid` | string | `""` | Supply a unique stable non-empty identifier; the importer otherwise generates one. | | `parent_uid` | string | `""` | Internal parent link for Entry List hierarchy | | `prop_id` | string | `"prop_1"` | Custom-property key stored on the resolved target owner. Property IDs must be unique per target; duplicate names are auto-suffixed | | `label` | string | `"Property 1"` | User-facing label shown in the generated UI. You can also edit it directly in the Entry List | | `editor_label` | string | `""` | Optional editor-only name used in izom PropUI lists without changing generated labels or custom properties | | `description` | string | `""` | Static tooltip shown for this property in the generated UI | | `prop_type` | string | `"FLOAT"` | Allowed: `FLOAT`, `INT`, `BOOL`, `ARRAY`, `TEXT`. Entry type used by the generated UI and property builder | | `text_alignment` | string | `"LEFT"` | Allowed: `LEFT`, `CENTER`, `RIGHT`. How this text block is aligned in the generated UI | | `text_role` | string | `"TEXT"` | Allowed: `TEXT`, `DIVIDER`, `SPACER`. Choose whether this text entry draws text, a divider, or generated-row space | | `text_alert` | boolean | `false` | Draw this text block with Blender's alert styling | | `text_icon` | string | `"NONE"` | Optional Blender icon drawn before this text block | | `text_icon_hug_text` | boolean | `true` | For centered text only, keep the before icon attached to the text instead of pinning it to the row edge; left and right aligned text always hugs icons | | `text_icon_after` | string | `"NONE"` | Optional Blender icon drawn after this text block | | `text_icon_after_hug_text` | boolean | `true` | For centered text only, keep the after icon attached to the text instead of pinning it to the row edge; left and right aligned text always hugs icons | | `default_float` | number | `0.0` | Default float value for this generated custom property | | `default_int` | integer | `0` | Default integer value for this generated custom property | | `default_bool` | boolean | `false` | Default boolean value for this generated custom property | | `default_float_array` | array | `32 × 1.0` | Default float values for this generated array custom property | | `default_int_array` | array | `32 × 0` | Default integer values for this generated array custom property | | `default_bool_array` | array | `32 × false` | Default boolean values for this generated array custom property | | `min_float` | number | `0.0` | Minimum float value for this generated custom property | | `max_float` | number | `1.0` | Maximum float value for this generated custom property | | `min_int` | integer | `0` | Minimum integer value for this generated custom property | | `max_int` | integer | `5` | Maximum integer value for this generated custom property | | `ui_order` | integer | `1` | Internal stored order used by the izom PropUI editor | | `display_order` | integer | `1` | Internal generated row order used by the generated UI | | `row_slot` | integer | `1` | 1-based left-to-right column inside a shared generated row | | `slider` | boolean | `true` | Show numeric generated properties and custom IDProperty paths as sliders. Enabling this turns off Soft Limits. Hidden for native RNA paths whose widget style Blender controls internally | | `alert_style` | boolean | `false` | Draw this generated property control with Blender's alert styling | | `value_label_layout` | string | `"INLINE"` | Allowed: `INLINE`, `SPLIT_LABEL`, `LABEL_ABOVE`. How scalar labels should be placed in the generated UI | | `multi_component_layout` | string | `"INLINE_LABEL"` | Allowed: `INLINE`, `SPLIT_LABEL`, `INLINE_LABEL`, `STACKED`, `STACKED_SPLIT_LABEL`, `STACKED_COMPONENT_SPLIT_LABEL`. How vector-like values should be drawn: inline, with split labels, with label above, or on separate lines inside the same cell | | `multi_component_draw_mode` | string | `"WIDGET"` | Allowed: `WIDGET`, `COMPONENTS`. For color and direction subtypes, choose Blender's native whole-value control or individual component fields | | `use_value_labels` | boolean | `false` | Change the visible label based on this entry's current value | | `value_labels_use_component` | boolean | `false` | For vector, color, integer-array, or boolean-array values, evaluate Dynamic Labels from one chosen component or channel instead of matching the whole value | | `value_labels_component_index` | integer | `1` | 1-based component or channel used by this entry's Dynamic Labels while Use One Component is enabled Range 1..32. | | `use_bool_state_labels` | boolean | `false` | Change the visible label based on whether this boolean is on or off | | `bool_label_true` | string | `""` | Label to show when this boolean is on | | `bool_label_false` | string | `""` | Label to show when this boolean is off | | `use_soft_limits` | boolean | `false` | Use separate soft min/max limits in the UI. Enabling this turns off Use Slider | | `soft_min_float` | number | `0.0` | Soft minimum float value used by the generated custom-property UI | | `soft_max_float` | number | `1.0` | Soft maximum float value used by the generated custom-property UI | | `soft_min_int` | integer | `0` | Soft minimum integer value used by the generated custom-property UI | | `soft_max_int` | integer | `5` | Soft maximum integer value used by the generated custom-property UI | | `step_float` | number | `0.1` | Native Blender float custom-property step metadata. This affects Blender's property metadata, not the generated row layout Range 0.009999999776482582..100.0. | | `step_int` | integer | `1` | Native Blender integer custom-property step metadata. This affects Blender's property metadata, not the generated row layout Range 1..100. | | `precision` | integer | `3` | Native Blender float custom-property precision metadata. This affects Blender's property metadata, not the generated row layout Range 0..6. | | `array_element_type` | string | `"FLOAT"` | Allowed: `FLOAT`, `INT`, `BOOL`. Element type stored by this generated array property | | `array_size` | integer | `4` | Number of visible elements in this array property Range 1..32. | | `float_subtype` | string | `"NONE"` | Allowed: `NONE`, `PIXEL`, `UNSIGNED`, `PERCENTAGE`, `FACTOR`, `ANGLE`, `TIME`, `TIME_ABSOLUTE`, `DISTANCE`, `DISTANCE_CAMERA`, `POWER`, `TEMPERATURE`, `WAVELENGTH`, `COLOR_TEMPERATURE`, `FREQUENCY`. Native Blender float custom-property subtype | | `float_array_subtype` | string | `"NONE"` | Allowed: `NONE`, `COLOR`, `COLOR_GAMMA`, `TRANSLATION`, `DIRECTION`, `VELOCITY`, `ACCELERATION`, `EULER`, `QUATERNION`, `AXISANGLE`, `XYZ`. Native Blender float array subtype applied to the generated custom property | | `library_overridable` | boolean | `true` | Mark this generated custom property as library-overridable | | `bool_child_visibility` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `WHEN_TRUE`, `WHEN_FALSE`. When this child entry should be shown, based on its parent boolean value | | `number_child_visibility` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `EQUAL`, `GREATER`, `LESS`, `RANGE`. When this child entry should be shown, based on its parent numeric value | | `visibility_inheritance_depth` | integer | `1` | How many visibility rules this entry uses in the generated UI chain. 1 = parent only, 2 = parent + parent's rule, higher numbers add upstream rules. The editor shows the full parent chain; the generated UI can only use ancestors that are actually present there Range 1..12. | | `visibility_use_component` | boolean | `false` | For vector, color, or integer-array parents, evaluate Child Visibility from one chosen component or channel instead of matching the whole parent value | | `visibility_component_index` | integer | `1` | 1-based component or channel used by Child Visibility while Use One Component is enabled Range 1..32. | | `visibility_match_float` | number | `0.0` | Comparison value used against the parent float property | | `visibility_match_int` | integer | `0` | Comparison value used against the parent integer property | | `visibility_match_float_array` | array | `32 × 1.0` | Exact float-array value used against a parent array property | | `visibility_match_int_array` | array | `32 × 0` | Exact integer-array value used against a parent array property | | `visibility_match_bool_array` | array | `32 × false` | Exact boolean-array value used against a parent array property | | `visibility_range_max_float` | number | `1.0` | Upper bound of the visibility range for the parent float property | | `visibility_range_max_int` | integer | `0` | Upper bound of the visibility range for the parent integer property | | `value_labels` | array | `[]` | value_labels | ### Rigify entry storage additions | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `entry_prop_bone_override_enabled` | boolean | `false` | Store this entry on its own selected bone instead of following the shared Host or One Prop Bone setting | | `entry_prop_bone` | string | `""` | Exact generated control or metarig bone used while Use Prop Bone Override is enabled | ### Dynamic Label rows `value_labels` and Full/Rigify `other_value_labels` are arrays of row objects. The fields below are the complete shared row vocabulary. For Dynamic Text/conditional rows, omit all `target_*` fields and `use_other_entry_labels`; those belong to the value-label row form. Free supports only its direct own-value label fields, not cross-entry sources or text styling. | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `uid` | string | `""` | Supply a unique stable non-empty identifier; the importer otherwise generates one. | | `rule_kind` | string | `"LABEL"` | Allowed: `LABEL`, `FALLBACK`. Choose whether this row applies a label override or resets to the current fallback label for this rule set | | `match_mode` | string | `"GREATER"` | Allowed: `EQUAL`, `GREATER`, `LESS`, `RANGE`. How this row compares numeric values. Dynamic Labels use the first matching row from top to bottom | | `label` | string | `""` | Override label to use when this row matches | | `text_override_style` | boolean | `false` | When enabled, this conditional rule can override role, alignment, icons, icon attachment, and alert styling instead of only changing the text | | `text_alignment` | string | `"LEFT"` | Allowed: `LEFT`, `CENTER`, `RIGHT`. How this text block is aligned in the generated UI | | `text_role` | string | `"TEXT"` | Allowed: `TEXT`, `DIVIDER`, `SPACER`. Choose whether this text rule draws text, a divider, or generated-row space | | `text_alert` | boolean | `false` | Draw this text block with Blender's alert styling | | `text_icon` | string | `"NONE"` | Optional Blender icon drawn before this text block | | `text_icon_hug_text` | boolean | `true` | For centered text only, keep the before icon attached to the text instead of pinning it to the row edge; left and right aligned text always hugs icons | | `text_icon_after` | string | `"NONE"` | Optional Blender icon drawn after this text block | | `text_icon_after_hug_text` | boolean | `true` | For centered text only, keep the after icon attached to the text instead of pinning it to the row edge; left and right aligned text always hugs icons | | `value_float` | number | `0.0` | Primary comparison value for the chosen other float entry | | `value_int` | integer | `0` | Primary comparison value for the chosen other integer entry | | `value_range_float` | number | `1.0` | Second range value for the chosen other float entry when Match is In Range | | `value_range_int` | integer | `0` | Second range value for the chosen other integer entry when Match is In Range | | `value_text` | string | `""` | Exact value to match when the chosen other entry is a string, enum, or vector-style custom entry | | `value_float_array` | array | `32 × 1.0` | Exact float array value to match when the chosen other entry resolves to a float array | | `value_int_array` | array | `32 × 0` | Exact integer-array value to match when the chosen other entry resolves to an integer array | | `value_bool_array` | array | `32 × false` | Exact boolean-array value to match when the chosen other entry resolves to a boolean array | | `target_value_float` | number | `0.0` | | | `target_value_int` | integer | `0` | | | `target_value_range_float` | number | `1.0` | | | `target_value_range_int` | integer | `0` | | | `target_value_text` | string | `""` | | | `target_value_float_array` | array | `32 × 1.0` | | | `target_value_int_array` | array | `32 × 0` | | | `target_value_bool_array` | array | `32 × false` | | | `use_other_entry_labels` | boolean | `false` | | | `source_entry_uid` | string | `""` | Internal source entry used by this conditional rule row | | `use_source_component` | boolean | `false` | For vector, color, integer-array, or boolean-array values, evaluate this rule from one chosen component or channel instead of matching the whole value | | `source_component_index` | integer | `1` | 1-based component or channel used by this rule while Use One Component is enabled Range 1..32. | | `source_bool_state` | string | `"WHEN_TRUE"` | Allowed: `WHEN_FALSE`, `WHEN_TRUE`. Boolean state to match when the selected Other Entry is a boolean | | `target_bool_scope` | string | `"ANY"` | | ### Free Dynamic Label rows | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `uid` | string | `""` | Supply a unique stable non-empty identifier; the importer otherwise generates one. | | `rule_kind` | string | `"LABEL"` | Allowed: `LABEL`, `FALLBACK`. Choose whether this row applies a label override or resets to the current fallback label for this rule set | | `match_mode` | string | `"GREATER"` | Allowed: `EQUAL`, `GREATER`, `LESS`, `RANGE`. How this row compares numeric values. Dynamic Labels use the first matching row from top to bottom | | `label` | string | `""` | Label to use when this row matches | | `value_float` | number | `0.0` | Primary comparison value for this row | | `value_int` | integer | `0` | Primary comparison value for this row | | `value_range_float` | number | `1.0` | Second range value when Match is In Range | | `value_range_int` | integer | `0` | Second range value when Match is In Range | | `value_float_array` | array | `32 × 1.0` | Exact float array value to match when this entry resolves to a float array | | `value_int_array` | array | `32 × 0` | Exact integer-array value to match when this entry resolves to an integer array | | `value_bool_array` | array | `32 × false` | Exact boolean-array value to match when this entry resolves to a boolean array | | `target_value_float` | number | `0.0` | Primary comparison value for this entry's own float value | | `target_value_int` | integer | `0` | Primary comparison value for this entry's own integer value | | `target_value_range_float` | number | `1.0` | Second range value for this entry's own float value when Match is In Range | | `target_value_range_int` | integer | `0` | Second range value for this entry's own integer value when Match is In Range | | `target_value_float_array` | array | `32 × 1.0` | Exact float array value this entry must have for the bucket to apply | | `target_value_int_array` | array | `32 × 0` | Exact integer-array value this entry must have for the bucket to apply | | `target_value_bool_array` | array | `32 × false` | Exact boolean-array value this entry must have for the bucket to apply | | `use_source_component` | boolean | `false` | For vector, color, integer-array, or boolean-array values, evaluate this rule from one chosen component or channel instead of matching the whole value | | `source_component_index` | integer | `1` | 1-based component or channel used by this rule while Use One Component is enabled Range 1..32. | | `source_bool_state` | string | `"WHEN_TRUE"` | Allowed: `WHEN_FALSE`, `WHEN_TRUE`. Boolean state to match when the selected component is a boolean | ### Full project settings | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `izom_propui_replace_storage_on_generate` | boolean | `true` | When enabled, Generate UI first removes every custom property from the Property Storage target, then recreates only the properties managed by the current PropUI setup. Disable this to keep other existing custom properties when generating | | `izom_propui_replace_storage_on_apply` | boolean | `false` | When enabled, Apply Properties > Apply All Managed first removes every custom property from the Property Storage target, then recreates only managed PropUI properties. Apply Selected never clears the full storage target | | `izom_propui_default_target_owner_path` | string | `""` | Blender data path to the owner where generated managed custom properties live | | `izom_propui_generated_panel_tab` | string | `"Controls"` | Sidebar tab/category used when this generated UI appears in editor sidebars | | `izom_propui_generated_panel_title` | string | `"Custom Controls"` | Title shown on the generated panel | | `izom_propui_generated_text_name` | string | `""` | Optional .py Text datablock name used when custom branding is enabled; the Text Datablock Prefix is prepended and duplicate generated UIs get a unique suffix | | `izom_propui_generated_branding_use_custom` | boolean | `false` | Use custom names and comments in generated UI scripts without changing PropUI's editor data | | `izom_propui_generated_branding_namespace_prefix` | string | `"izom_propui"` | Prefix used for generated registry keys, helper operators, and helper properties | | `izom_propui_generated_branding_panel_class_prefix` | string | `"IZOM_PROPUI_PT"` | Prefix used for generated Blender panel class names | | `izom_propui_generated_branding_text_datablock_prefix` | string | `"izom_propui_generated_ui"` | Prefix used for generated .py Text datablocks, including custom Text names | | `izom_propui_generated_branding_show_credit` | boolean | `true` | Include the generated-source credit comment | | `izom_propui_generated_branding_credit_comment` | string | `"Auto-generated by izom PropUI."` | Comment written near the top of generated .py output when credit comments are enabled | | `izom_propui_generated_panel_location` | string | `"SIDEBAR"` | Allowed: `SIDEBAR`, `PROPERTIES`, `BOTH`. Choose whether the generated panel lives in editor sidebars, in the Properties editor, or both | | `izom_propui_generated_mute_during_transform` | boolean | `false` | Skip drawing this generated UI while a Blender transform modal operator is running | | `izom_propui_generated_mute_during_playback` | boolean | `false` | Skip drawing this generated UI while animation playback is running | | `izom_propui_generated_ui_conflict_mode` | string | `"REPLACE_MATCHING"` | Allowed: `REPLACE_ALL`, `REPLACE_MATCHING`, `ADD`. Choose how Generate UI handles existing generated panels | | `izom_propui_generated_sidebar_mode` | string | `"SPECIFIC"` | Allowed: `SPECIFIC`, `ALL`. Choose which Blender editor sidebars receive the generated panel | | `izom_propui_generated_sidebar_view_3d` | boolean | `true` | 3D Viewport sidebar | | `izom_propui_generated_sidebar_graph_editor` | boolean | `false` | Graph Editor and Drivers sidebar | | `izom_propui_generated_sidebar_dopesheet_editor` | boolean | `false` | Dope Sheet sidebar | | `izom_propui_generated_sidebar_nla_editor` | boolean | `false` | NLA Editor sidebar | | `izom_propui_generated_sidebar_image_editor` | boolean | `false` | Image and UV Editor sidebar | | `izom_propui_generated_sidebar_node_editor` | boolean | `false` | Node Editor sidebar | | `izom_propui_generated_sidebar_sequence_editor` | boolean | `false` | Video Sequencer sidebar | | `izom_propui_generated_sidebar_clip_editor` | boolean | `false` | Movie Clip Editor sidebar | | `izom_propui_generated_sidebar_text_editor` | boolean | `false` | Text Editor sidebar | | `izom_propui_generated_sidebar_file_browser` | boolean | `false` | File Browser sidebar | | `izom_propui_generated_sidebar_spreadsheet` | boolean | `false` | Spreadsheet sidebar | | `izom_propui_generated_graph_editor_context_mode` | string | `"ALL"` | Allowed: `ALL`, `SPECIFIC`. Choose whether generated Graph Editor panels appear in Graph Editor and Drivers or only selected contexts | | `izom_propui_generated_graph_editor_graph` | boolean | `true` | Graph Editor F-Curves context | | `izom_propui_generated_graph_editor_drivers` | boolean | `true` | Drivers context | | `izom_propui_generated_image_editor_context_mode` | string | `"ALL"` | Allowed: `ALL`, `SPECIFIC`. Choose whether generated Image Editor panels appear in Image and UV contexts or only selected contexts | | `izom_propui_generated_image_editor_image` | boolean | `true` | Image editor, image paint, and mask contexts | | `izom_propui_generated_image_editor_uv` | boolean | `true` | UV editor context | | `izom_propui_generated_node_editor_context_mode` | string | `"ALL"` | Allowed: `ALL`, `SPECIFIC`. Choose whether generated Node Editor panels appear in every node editor context or only selected contexts | | `izom_propui_generated_node_editor_shader` | boolean | `true` | Shader node editor context | | `izom_propui_generated_node_editor_geometry` | boolean | `true` | Geometry Nodes editor context | | `izom_propui_generated_node_editor_compositor` | boolean | `true` | Compositor node editor context | | `izom_propui_generated_properties_mode` | string | `"SPECIFIC"` | Allowed: `SPECIFIC`, `ALL`. Choose which Properties editor tabs receive the generated panel | | `izom_propui_generated_properties_tool` | boolean | `false` | Active Tool and Workspace Settings tab | | `izom_propui_generated_properties_render` | boolean | `false` | Render Properties tab | | `izom_propui_generated_properties_output` | boolean | `false` | Output Properties tab | | `izom_propui_generated_properties_view_layer` | boolean | `false` | View Layer Properties tab | | `izom_propui_generated_properties_scene` | boolean | `false` | Scene Properties tab | | `izom_propui_generated_properties_world` | boolean | `false` | World Properties tab | | `izom_propui_generated_properties_collection` | boolean | `false` | Collection Properties tab | | `izom_propui_generated_properties_object` | boolean | `true` | Object Properties tab | | `izom_propui_generated_properties_constraint` | boolean | `false` | Object Constraint Properties tab | | `izom_propui_generated_properties_modifier` | boolean | `false` | Modifier Properties tab | | `izom_propui_generated_properties_data` | boolean | `false` | Object Data Properties tab | | `izom_propui_generated_properties_bone` | boolean | `false` | Bone Properties tab | | `izom_propui_generated_properties_bone_constraint` | boolean | `false` | Bone Constraint Properties tab | | `izom_propui_generated_properties_material` | boolean | `false` | Material Properties tab | | `izom_propui_generated_properties_texture` | boolean | `false` | Texture Properties tab | | `izom_propui_generated_properties_particle` | boolean | `false` | Particle Properties tab | | `izom_propui_generated_properties_physics` | boolean | `false` | Physics Properties tab | | `izom_propui_generated_visibility_mode` | string | `"ALWAYS"` | Allowed: `ALWAYS`, `SELECTED_OBJECTS`. Choose when the generated panel is visible | | `izom_propui_generated_visibility_targets_json` | string | `"[]"` | Internal selected 3D Viewport items used by generated panel visibility filtering | | `izom_propui_clean_old_targets_on_generate` | boolean | `true` | When enabled, Generate UI removes matching managed PropUI properties from old targets that no longer own those entries | | `izom_propui_clean_old_targets_on_apply` | boolean | `true` | When enabled, Apply Properties removes matching managed PropUI properties from old targets that no longer own those entries | ### Free portable project settings | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `izom_propui_generated_panel_tab` | string | `"Controls"` | Sidebar tab/category used when this generated UI appears in editor sidebars | | `izom_propui_generated_panel_title` | string | `"Custom Controls"` | Title shown on the generated panel | | `izom_propui_default_target_owner_path` | string | `""` | Blender data path to the owner where generated managed custom properties live | | `izom_propui_replace_storage_on_generate` | boolean | `false` | When enabled, Generate UI first removes every custom property from the Property Storage target, then recreates only the properties managed by the current PropUI setup. Disable this to keep other existing custom properties when generating | | `izom_propui_clean_old_targets_on_generate` | boolean | `true` | When enabled, Generate UI removes matching managed PropUI properties from old targets that no longer own those entries | ### Rigify host settings | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `izom_propui_rigify_host_output_mode` | string | `"KEEP_HOST"` | Allowed: `KEEP_HOST`, `METARIG_ONLY`. Choose whether the PropUI host remains as a generated control or exists only on the metarig | | `izom_propui_rigify_use_one_prop_bone` | boolean | `false` | Store generated custom properties on one chosen Rigify output bone instead of using the host control | | `izom_propui_rigify_one_prop_bone` | string | `""` | Exact generated control or metarig bone whose resolved control stores PropUI custom properties | | `izom_propui_rigify_generated_ui_position` | string | `"ABOVE_NATIVE"` | Allowed: `ABOVE_NATIVE`, `BELOW_NATIVE`. Place this generated PropUI above or below native Rigify UI for the selected visibility bones | | `izom_propui_rigify_generated_ui_panel_location` | string | `"RIG_MAIN"` | Allowed: `RIG_MAIN`, `SEPARATE_PANEL`. Choose whether this generated UI joins Rig Main Properties or receives its own panel | | `izom_propui_rigify_generated_ui_panel_title` | string | `""` | Title of the separate generated panel; leave empty to use PropUI followed by the host bone name | | `izom_propui_rigify_generated_ui_sidebar_tab` | string | `"Item"` | Sidebar tab containing the separate generated panel; leave empty to use Item | | `izom_propui_rigify_generated_ui_always_visible` | boolean | `false` | Show this generated UI for the active generated rig regardless of which control bones are selected | | `izom_propui_rigify_move_matching_managed_props` | boolean | `true` | When syncing, move matching managed custom properties between currently active host and prop storage bones | | `izom_propui_rigify_clean_target_scope` | string | `"ALL"` | Allowed: `HOST`, `PROP`, `ALL`. Choose which currently active metarig storage bones normal Clean Metarig Props can modify | | `izom_propui_rigify_overwrite_native_custom_properties` | boolean | `true` | Replace unmanaged native custom properties on generated output bones with this PropUI setup | | `izom_propui_rigify_transfer_unmanaged_native_to_prop_bone` | boolean | `true` | When using One Prop Bone, move unmanaged native custom properties there too | | `izom_propui_rigify_show_unmanaged_native_in_generated_ui` | boolean | `true` | Draw unmanaged native custom properties beside managed PropUI controls in the generated Rigify UI | | `izom_propui_rigify_native_section_position` | string | `"BELOW_MANAGED"` | Allowed: `BELOW_MANAGED`, `ABOVE_MANAGED`. Choose whether unmanaged native custom properties appear above or below managed PropUI controls | | `relink_constraints` | boolean | `false` | For constraints with names formed like 'base@bonename', use the part after '@' as the new subtarget after all bones are created. Use '@CTRL', '@DEF' or '@MCH' to simply replace the prefix | | `parent_bone` | string | `""` | Replace the parent with a different bone after all bones are created. Using simply CTRL, DEF or MCH will replace the prefix instead | | `optional_widget_type` | string | `""` | Choose the type of the widget to create | ### Generated Layout row fields For Full/Rigify, each `layout_rows` object uses these exact fields. Free uses `row_index`, `row_height_scale` (1..2) and `row_inset_left_enabled`; its left indent is fixed. Container assignment is on Full/Rigify placements and is normalized onto their rows. Set the same container on the matching row and item. | Field | Type | Default / meaning | | --- | --- | --- | | `row_index` | integer | Required global row number, starting at 1 | | `subpanel_uid` | string | `""` | | `row_height_scale` | number | `1.0` | | `row_inset_left_enabled` | boolean | `false` | | `row_inset_left_amount` | number | `1.0` | | `row_inset_right_enabled` | boolean | `false` | | `row_inset_right_amount` | number | `1.0` | ### Generated Layout item fields | Field | Type | Default / meaning | | --- | --- | --- | | `uid` | string | Required unique placement identity | | `entry_uid` | string | Required existing entry UID | | `row_index` | integer | Required global row number, starting at 1 | | `column_index` | integer | Required column number, starting at 1 | | `subpanel_uid` | string | Empty means main panel; Full/Rigify only | | `row_width_enabled` | boolean | false; Full/Rigify only | | `single_row_width` | number | 1.0, range 0.05..10; Full/Rigify only | | `single_row_alignment` | string | LEFT, CENTER or RIGHT; default LEFT; Full/Rigify only | ### Editor layout templates These are complete `payload.layout` defaults for the corresponding `editor_settings` document. Start from your current exported layout to preserve custom editor organization. These section names describe the authoring editor rather than generated sub-panels or Row Boxes. #### Full editor layout ```json { "expanded": { "izom_propui_editor_section_diagnostics_expanded": true, "izom_propui_editor_section_output_setup_expanded": true, "izom_propui_editor_section_entry_list_expanded": true, "izom_propui_editor_section_selected_entry_expanded": true, "izom_propui_editor_section_generated_layout_expanded": true, "izom_propui_editor_section_editor_settings_expanded": true, "izom_propui_editor_section_editor_layout_expanded": true, "izom_propui_entry_hierarchy_lens_expanded": true, "izom_propui_display_expanded": true, "izom_propui_custom_prop_expanded": true, "izom_propui_child_behavior_expanded": true, "izom_propui_type_defaults_expanded": true, "izom_propui_copy_settings_expanded": true, "izom_propui_import_export_expanded": true, "izom_propui_selected_row_expanded": true, "izom_propui_row_boxes_expanded": true, "izom_propui_output_setup_variants_expanded": true, "izom_propui_output_setup_branding_expanded": true, "izom_propui_output_setup_generated_uis_expanded": true, "izom_propui_output_setup_visibility_expanded": true, "izom_propui_output_setup_storage_expanded": true, "izom_propui_editor_settings_display_expanded": true, "izom_propui_editor_settings_entry_list_expanded": true, "izom_propui_editor_settings_confirmations_expanded": true, "izom_propui_editor_settings_json_expanded": true, "izom_propui_editor_settings_defaults_expanded": true, "izom_propui_editor_settings_reset_expanded": true }, "hidden": { "izom_propui_hide_diagnostics_section": false, "izom_propui_hide_output_setup_section": false, "izom_propui_hide_entry_list_section": false, "izom_propui_hide_selected_entry_section": false, "izom_propui_hide_generated_layout_section": false, "izom_propui_hide_editor_settings_section": false, "izom_propui_hide_output_generate_controls": false, "izom_propui_hide_output_variants_section": false, "izom_propui_hide_output_branding_section": false, "izom_propui_hide_output_generated_uis_section": false, "izom_propui_hide_output_visibility_section": false, "izom_propui_hide_output_storage_section": false, "izom_propui_hide_entry_hierarchy_lens": false, "izom_propui_hide_selected_basics_section": false, "izom_propui_hide_selected_value_section": false, "izom_propui_hide_selected_display_section": false, "izom_propui_hide_selected_dynamic_labels_section": false, "izom_propui_hide_selected_conditions_section": false, "izom_propui_hide_selected_storage_section": false, "izom_propui_hide_selected_tools_section": false, "izom_propui_hide_selected_tools_type_defaults_section": false, "izom_propui_hide_selected_tools_copy_settings_section": false, "izom_propui_hide_selected_tools_presets_section": false, "izom_propui_hide_generated_layout_selected_row_section": false, "izom_propui_hide_generated_layout_sync_options_section": false, "izom_propui_hide_generated_layout_row_boxes_section": false, "izom_propui_hide_editor_settings_display_section": false, "izom_propui_hide_editor_settings_entry_list_section": false, "izom_propui_hide_editor_settings_confirmations_section": false, "izom_propui_hide_editor_settings_json_section": false, "izom_propui_hide_editor_settings_defaults_section": false, "izom_propui_hide_editor_settings_reset_section": false }, "misc": { "izom_propui_editor_section_order_json": "[]", "izom_propui_editor_subsection_order_json": "{}" } } ``` #### Rigify editor layout ```json { "expanded": { "izom_propui_rigify_editor_section_diagnostics_expanded": true, "izom_propui_rigify_editor_section_output_setup_expanded": true, "izom_propui_rigify_editor_section_entry_list_expanded": true, "izom_propui_rigify_editor_section_selected_entry_expanded": true, "izom_propui_rigify_editor_section_generated_layout_expanded": true, "izom_propui_rigify_editor_section_editor_settings_expanded": true, "izom_propui_rigify_editor_section_editor_layout_expanded": true, "izom_propui_rigify_entry_hierarchy_lens_expanded": true, "izom_propui_rigify_display_expanded": true, "izom_propui_rigify_custom_prop_expanded": true, "izom_propui_rigify_child_behavior_expanded": true, "izom_propui_rigify_type_defaults_expanded": true, "izom_propui_rigify_copy_settings_expanded": true, "izom_propui_rigify_import_export_expanded": true, "izom_propui_rigify_selected_row_expanded": true, "izom_propui_rigify_row_boxes_expanded": true, "izom_propui_rigify_output_setup_visible_on_bones_expanded": true, "izom_propui_rigify_output_setup_storage_expanded": true, "izom_propui_rigify_output_setup_native_expanded": true, "izom_propui_rigify_output_setup_raw_copy_expanded": true, "izom_propui_rigify_editor_settings_display_expanded": true, "izom_propui_rigify_editor_settings_shortcuts_expanded": true, "izom_propui_rigify_editor_settings_entry_list_expanded": true, "izom_propui_rigify_editor_settings_confirmations_expanded": true, "izom_propui_rigify_editor_settings_json_expanded": true, "izom_propui_rigify_editor_settings_defaults_expanded": true, "izom_propui_rigify_editor_settings_reset_expanded": true }, "hidden": { "izom_propui_rigify_hide_diagnostics_section": false, "izom_propui_rigify_hide_output_setup_section": false, "izom_propui_rigify_hide_entry_list_section": false, "izom_propui_rigify_hide_selected_entry_section": false, "izom_propui_rigify_hide_generated_layout_section": false, "izom_propui_rigify_hide_editor_settings_section": false, "izom_propui_rigify_hide_output_generated_ui_display_section": false, "izom_propui_rigify_hide_output_storage_section": false, "izom_propui_rigify_hide_output_native_passthrough_section": false, "izom_propui_rigify_hide_basic_raw_copy_section": false, "izom_propui_rigify_hide_entry_hierarchy_lens": false, "izom_propui_rigify_hide_selected_basics_section": false, "izom_propui_rigify_hide_selected_value_section": false, "izom_propui_rigify_hide_selected_display_section": false, "izom_propui_rigify_hide_selected_dynamic_labels_section": false, "izom_propui_rigify_hide_selected_conditions_section": false, "izom_propui_rigify_hide_selected_storage_section": false, "izom_propui_rigify_hide_selected_tools_section": false, "izom_propui_rigify_hide_selected_tools_type_defaults_section": false, "izom_propui_rigify_hide_selected_tools_copy_settings_section": false, "izom_propui_rigify_hide_selected_tools_presets_section": false, "izom_propui_rigify_hide_generated_layout_selected_row_section": false, "izom_propui_rigify_hide_generated_layout_sync_options_section": false, "izom_propui_rigify_hide_generated_layout_row_boxes_section": false, "izom_propui_rigify_hide_editor_settings_display_section": false, "izom_propui_rigify_hide_editor_settings_shortcuts_section": false, "izom_propui_rigify_hide_editor_settings_entry_list_section": false, "izom_propui_rigify_hide_editor_settings_confirmations_section": false, "izom_propui_rigify_hide_editor_settings_json_section": false, "izom_propui_rigify_hide_editor_settings_defaults_section": false, "izom_propui_rigify_hide_editor_settings_reset_section": false }, "misc": { "izom_propui_rigify_editor_section_order_json": "[]", "izom_propui_rigify_editor_subsection_order_json": "{}" } } ``` ## Optional editor settings and layout documents These affect the authoring editor, not the generated controls. Do not mix their envelope with a panel setup. Full setup JSON excludes editor settings/layout; Rigify host setup can carry them under `editor_state.settings` and `editor_state.layout`. Free has no editor-settings/defaults import. For `editor_settings`, payload is `{"settings": {...}, "layout": {...}}`. For the saved-default `editor_layout` format, payload is `{"layout": {...}}`; there is no standalone file-import button for that kind. A layout object contains `expanded` (section boolean fields), `hidden` (section boolean fields), and `misc` (encoded order lists/maps). Use the complete edition-specific editor JSON examples as a starting point for section identifiers/order, and preserve unknown section IDs from your export. The JSON field reference includes the complete default layout and preset field allow-list. ### Full editor settings fields | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `izom_propui_editor_float_decimals` | integer | `3` | How many decimals editor float values show while editing in the izom PropUI editor Range 0..6. | | `izom_propui_entry_list_primary_column` | string | `"NAME"` | Allowed: `NAME`, `PROP_ID`. Choose whether the wide leading Entry List column shows the Name or the Property ID | | `izom_propui_generated_layout_primary_column` | string | `"NAME"` | Allowed: `NAME`, `PROP_ID`. Choose whether the wide leading Generated Layout column shows the Name or the Property ID | | `izom_propui_default_entry_type` | string | `"FLOAT"` | Allowed: `FLOAT`, `INT`, `BOOL`, `STRING`, `DATA_BLOCK`, `PYTHON`, `ARRAY`, `DISPLAY_LINK`, `CUSTOM`, `TEXT`, `OPERATOR`, `ENUM`. Entry type used when adding a new Entry List item | | `izom_propui_confirmation_clear_entry_list` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing every Entry List entry | | `izom_propui_confirmation_reset_current_setup` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when resetting the current setup back to blank | | `izom_propui_confirmation_reset_saved_defaults` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when deleting saved editor, editor layout, and full setup defaults | | `izom_propui_confirmation_full_factory_reset` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when wiping PropUI editor data from every scene and deleting saved defaults | | `izom_propui_confirmation_save_type_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when saving the selected entry's type settings as your personal default | | `izom_propui_confirmation_apply_type_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when applying your saved default for the selected entry type | | `izom_propui_confirmation_reset_type_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when removing your saved default for the selected entry type | | `izom_propui_confirmation_copy_same_type_settings` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when copying the selected entry's type settings to all other same-type entries | | `izom_propui_confirmation_clear_generated_layout` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing every Generated Layout entry | | `izom_propui_confirmation_clear_row_boxes` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing every Generated Layout row box | | `izom_propui_confirmation_clear_dynamic_labels` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing a Dynamic Labels list | | `izom_propui_confirmation_reset_editor_settings` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when resetting editor settings to factory defaults | | `izom_propui_confirmation_apply_editor_layout` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when applying the staged Editor Layout list state | | `izom_propui_confirmation_apply_editor_layout_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when applying the saved Editor Layout default | | `izom_propui_confirmation_factory_reset_editor_layout` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when resetting Editor Layout to built-in defaults | | `izom_propui_confirmation_clear_full_setup_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when deleting the saved full setup default | | `izom_propui_confirmation_remove_ui_variant` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when removing the selected UI Variant holder | | `izom_propui_confirmation_clear_ui_variants` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when removing every UI Variant holder | | `izom_propui_confirmation_generate_current_conflict` | string | `"ASK"` | Allowed: `ASK`, `OVERWRITE`, `ADD`. Default answer when Generate Current would replace an existing current generated UI | | `izom_propui_confirmation_generate_native_conflict` | string | `"ASK"` | Allowed: `ASK`, `OVERWRITE`, `SKIP`. Default answer when Generate preserves storage and managed Property IDs collide with existing native custom properties | | `izom_propui_confirmation_generate_empty_layout` | string | `"ASK"` | Allowed: `ASK`, `APPLY_PROPERTIES_ONLY`, `CANCEL`. Default answer when Generate runs but no entries are placed in the Generated Layout | | `izom_propui_confirmation_remove_generated_ui` | string | `"ASK"` | Allowed: `ASK`, `EDITOR_ONLY`, `STOP_KEEP_SCRIPT`, `FULL_REMOVE`. Default answer when removing a generated UI or clearing the Generated UIs list | | `izom_propui_confirmation_parent_delete` | string | `"ASK"` | Allowed: `ASK`, `DELETE`, `DELETE_HIERARCHY`. Default answer when deleting a parent entry that has children | | `izom_propui_confirmation_subpanel_delete` | string | `"ASK"` | Allowed: `ASK`, `DELETE`, `DELETE_HIERARCHY`. Default answer when deleting a Generated Layout sub-panel that has rows or nested sub-panels | | `izom_propui_confirmation_save_variant_conflict` | string | `"ASK"` | Allowed: `ASK`, `OVERWRITE`, `NEW`. Default answer when saving over a UI variant that already has saved state | | `izom_propui_confirmation_load_variant_unsaved` | string | `"ASK"` | Allowed: `ASK`, `SAVE_LAST_LOADED`, `SAVE_AS_NEW`, `DISCARD`. Default answer when loading a UI variant while the current editor has unsaved changes | | `izom_propui_confirmation_copy_conditions` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when copying Conditions settings to all siblings or all child entries | | `izom_propui_show_entry_tree_hints` | boolean | `true` | Show lightweight parent/child indentation and icons in the flat Entry List without using collapse or hidden-row filtering | | `izom_propui_show_all_confirmation_rules` | boolean | `false` | Show every confirmation rule instead of only customized confirmation overrides | | `izom_propui_gl_auto_sync_new_entries` | boolean | `false` | Automatically add new Entry List entries to Generated Layout when you create them | | `izom_propui_gl_add_into_active_row` | boolean | `false` | When enabled, new Generated Layout entries and imports join the selected row instead of creating a new row | | `izom_propui_gl_safe_import` | boolean | `true` | Prevent importing the same Entry List entry into Generated Layout more than once | ### Rigify editor settings fields | Field | JSON type | Default | Allowed values / meaning | | --- | --- | --- | --- | | `izom_propui_rigify_editor_float_decimals` | integer | `3` | How many decimals editor float values show while editing in the izom PropUI Rigify editor Range 0..6. | | `izom_propui_rigify_editor_location` | string | `"RIGIFY"` | Allowed: `RIGIFY`, `SIDEBAR`. Choose where the izom PropUI Rigify editor is displayed | | `izom_propui_rigify_entry_list_primary_column` | string | `"NAME"` | Allowed: `NAME`, `PROP_ID`. Choose whether the wide leading Entry List column shows the Name or the Property ID | | `izom_propui_rigify_generated_layout_primary_column` | string | `"NAME"` | Allowed: `NAME`, `PROP_ID`. Choose whether the wide leading Generated Layout column shows the Name or the Property ID | | `izom_propui_rigify_default_entry_type` | string | `"FLOAT"` | Allowed: `FLOAT`, `INT`, `BOOL`, `STRING`, `DATA_BLOCK`, `PYTHON`, `ARRAY`, `DISPLAY_LINK`, `CUSTOM`, `TEXT`, `OPERATOR`, `ENUM`. Entry type used when adding a new Entry List item | | `izom_propui_rigify_confirmation_clear_entry_list` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing every Entry List entry | | `izom_propui_rigify_confirmation_follow_shared_storage` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when disabling every per-entry Prop Bone Override | | `izom_propui_rigify_confirmation_clean_managed_metarig` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when removing matching managed Property IDs from every metarig pose bone | | `izom_propui_rigify_confirmation_clean_all_metarig` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when removing every custom property from every metarig pose bone | | `izom_propui_rigify_confirmation_reset_current_setup` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when resetting the current setup back to blank | | `izom_propui_rigify_confirmation_reset_saved_defaults` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when deleting saved editor, editor layout, and full setup defaults | | `izom_propui_rigify_confirmation_full_factory_reset` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when wiping PropUI editor data from every scene and deleting saved defaults | | `izom_propui_rigify_confirmation_save_type_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when saving the selected entry's type settings as your personal default | | `izom_propui_rigify_confirmation_apply_type_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when applying your saved default for the selected entry type | | `izom_propui_rigify_confirmation_reset_type_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when removing your saved default for the selected entry type | | `izom_propui_rigify_confirmation_copy_same_type_settings` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when copying the selected entry's type settings to all other same-type entries | | `izom_propui_rigify_confirmation_clear_generated_layout` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing every Generated Layout entry | | `izom_propui_rigify_confirmation_clear_row_boxes` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing every Generated Layout row box | | `izom_propui_rigify_confirmation_clear_dynamic_labels` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when clearing a Dynamic Labels list | | `izom_propui_rigify_confirmation_reset_editor_settings` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when resetting editor settings to factory defaults | | `izom_propui_rigify_confirmation_apply_editor_layout` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when applying the staged Editor Layout list state | | `izom_propui_rigify_confirmation_apply_editor_layout_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when applying the saved Editor Layout default | | `izom_propui_rigify_confirmation_factory_reset_editor_layout` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when resetting Editor Layout to built-in defaults | | `izom_propui_rigify_confirmation_clear_full_setup_default` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when deleting the saved full setup default | | `izom_propui_rigify_confirmation_parent_delete` | string | `"ASK"` | Allowed: `ASK`, `DELETE`, `DELETE_HIERARCHY`. Default answer when deleting a parent entry that has children | | `izom_propui_rigify_confirmation_subpanel_delete` | string | `"ASK"` | Allowed: `ASK`, `DELETE`, `DELETE_HIERARCHY`. Default answer when deleting a Generated Layout sub-panel that has rows or nested sub-panels | | `izom_propui_rigify_confirmation_copy_conditions` | string | `"ASK"` | Allowed: `ASK`, `CONFIRM`, `CANCEL`. Default answer when copying Conditions settings to all siblings or all child entries | | `izom_propui_rigify_disable_shortcuts` | boolean | `false` | Completely disable izom PropUI Rigify keyboard shortcuts and hide shortcut-target controls in the editor | | `izom_propui_rigify_show_entry_tree_hints` | boolean | `true` | Show lightweight parent/child indentation and icons in the flat Entry List without using collapse or hidden-row filtering | | `izom_propui_rigify_show_all_confirmation_rules` | boolean | `false` | Show every confirmation rule instead of only customized confirmation overrides | | `izom_propui_rigify_gl_auto_sync_new_entries` | boolean | `false` | Automatically add new Entry List entries to Generated Layout when you create them | | `izom_propui_rigify_gl_add_into_active_row` | boolean | `false` | When enabled, new Generated Layout entries and imports join the selected row instead of creating a new row | | `izom_propui_rigify_gl_safe_import` | boolean | `true` | Prevent importing the same Entry List entry into Generated Layout more than once | ## Entry preset field boundaries An `entry_type_preset` uses `prop_type` at the document root and a compatible entry must already be selected. Its payload accepts the entry fields above except the following. `value_labels` and `other_value_labels` are supported collections. Fields irrelevant to the entry type should be omitted. A preset is not a whole setup and does not create layout placements. - **Full:** omit `display_link_component_subset`, `display_order`, `entry_target_owner_path`, `hidden_in_editor`, `linked_entry_uid`, `parent_uid`, `prop_type`, `row_slot`, `ui_order`, `uid`. - **Rigify:** omit `display_link_component_subset`, `display_order`, `entry_prop_bone`, `entry_prop_bone_override_enabled`, `entry_target_owner_path`, `hidden_in_editor`, `linked_entry_uid`, `parent_uid`, `prop_type`, `row_slot`, `ui_order`, `uid`. ## Coverage and limits of this interface Setup JSON covers the Entry List, functional parenting, Generated Layout, supported display controls, conditions/labels, operator configuration, default values and edition-specific output/storage. Entry presets/type defaults reuse compatible entry settings; presets do not transfer identity or a Display Link's target. Setup/default/copy paths preserve the current popup and compact options. Selecting a destination component, right-click capture, source repair, validation, applying/generating properties, moving rows, saving defaults and running operator buttons happen in Blender. JSON describes the supported entry/layout state. Only documented fields have meaning; adding a key does not execute an authoring action. Full UI Variants and Generated UIs are management workflows. One setup JSON describes one design; importing it creates a variant. Generated Python export and bundle ZIPs are separate formats, not this panel JSON. The source runtime is generated by Blender after import. User add-on preferences, installed add-ons and system keymaps are not a panel setup. Native source ramps/curves and live-value presets stay in their actual owning data; they are not embedded assets in this JSON. Legacy/import-derived fields are intentionally excluded from authoring recommendations: `native_widget`, raw `operator_icon_value`/`operator_search_weight`, detected Custom metadata/read-only/error fields and the editor collection alias `display_link_component_subset`. Use automatic source detection, named icons and the serialized subset JSON instead. No Jump to Source field exists. ## Validate the file - Confirm the file parses as JSON and contains the complete envelope for schema version 1 and the intended document kind. - Check that every referenced UID exists, hierarchies have no cycles, rows/columns start at one, each row stays in one container, and Row Boxes do not partially overlap. - Respect the edition's limits. Keep Dropdown IDs/numbers unique with a valid default, and match array types/sizes, numeric bounds and source component indexes. - Check escaping in fields that contain JSON strings, and verify Object, bone, data-block and operator references against your Blender file. - Review storage replacement and cleanup settings before importing. Save the complete document, including its envelope and layout arrays; an entries list alone is not an importable setup. ## Companion files The [JSON field reference](https://propui.bigizom.com/assets/downloads/propui-api-reference.json) contains defaults, labels, descriptions, enum vocabularies, edition-specific fields, preset allow-lists and editor-layout templates in a machine-readable form. The [example files](https://propui.bigizom.com/assets/downloads/propui-json-examples.zip) include complete minimal setups, control galleries, native widgets, editor settings and entry presets. Use an export from your own scene when you need to preserve existing identities or source paths.