{#each ALL_ATTRIBUTES as category(category.categoryName)}
{category.categoryName}
{#each category.specs as spec(spec.name)}
{#if spec.location === "widget" && target && spec.name in target.attrs}
{#if spec.type === "string"}
updateAttribute(spec, target, e.detail)}
on:input={(e) => updateAttribute(spec, target, e.detail)}
label={spec.name}
max_lines={1}
/>
{:else if spec.type === "boolean"}
updateAttribute(spec, target, e.detail)}
label={spec.name}
/>
{:else if spec.type === "number"}
updateAttribute(spec, target, e.detail)}
/>
{:else if spec.type === "enum"}
updateAttribute(spec, target, e.detail)}
/>
{/if}
{:else if node}
{#if spec.location === "nodeProps" && validNodeProperty(spec, node)}
{#if spec.type === "string"}
updateProperty(spec, e.detail)}
on:input={(e) => updateProperty(spec, e.detail)}
label={spec.name}
max_lines={1}
/>
{:else if spec.type === "boolean"}
updateProperty(spec, e.detail)}
/>
{:else if spec.type === "number"}
updateProperty(spec, e.detail)}
/>
{:else if spec.type === "enum"}
updateProperty(spec, e.detail)}
/>
{/if}
{:else if spec.location === "nodeVars" && spec.name in node}
{#if spec.type === "string"}
updateVar(spec, e.detail)}
on:input={(e) => updateVar(spec, e.detail)}
label={spec.name}
max_lines={1}
/>
{:else if spec.type === "boolean"}
updateVar(spec, e.detail)}
label={spec.name}
/>
{:else if spec.type === "number"}
updateVar(spec, e.detail)}
/>
{:else if spec.type === "enum"}
updateVar(spec, e.detail)}
/>
{/if}
{/if}
{:else if spec.location === "workflow" && spec.name in $layoutState.attrs}
{#if spec.type === "string"}
updateWorkflowAttribute(spec, e.detail)}
on:input={(e) => updateWorkflowAttribute(spec, e.detail)}
label={spec.name}
max_lines={1}
/>
{:else if spec.type === "boolean"}
updateWorkflowAttribute(spec, e.detail)}
label={spec.name}
/>
{:else if spec.type === "number"}
updateWorkflowAttribute(spec, e.detail)}
/>
{:else if spec.type === "enum"}
updateWorkflowAttribute(spec, e.detail)}
/>
{/if}
{/if}
{/each}
{/each}