scrawl-canvas
Version:
Version 8.9.4 - 19 Nov 2022
712 lines (559 loc) • 71.9 kB
HTML
<!DOCTYPE html>
<html>
<head>
<title>Demo Modules 005</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="../../docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To …</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page_wrapper">
<div id="jump_page">
<a class="source" href="canvas-minimap.html">
./demo/modules/canvas-minimap.js
</a>
<a class="source" href="canvas-scene-editor.html">
./demo/modules/canvas-scene-editor.js
</a>
<a class="source" href="dom-entity-editor.html">
./demo/modules/dom-entity-editor.js
</a>
<a class="source" href="entity-copy-paste.html">
./demo/modules/entity-copy-paste.js
</a>
<a class="source" href="entity-manipulation-gui.html">
./demo/modules/entity-manipulation-gui.js
</a>
<a class="source" href="entity-navigation.html">
./demo/modules/entity-navigation.js
</a>
<a class="source" href="entity-ring-builder.html">
./demo/modules/entity-ring-builder.js
</a>
<a class="source" href="london-crime-graphic.html">
./demo/modules/london-crime-graphic.js
</a>
<a class="source" href="london-crime-lines.html">
./demo/modules/london-crime-lines.js
</a>
<a class="source" href="london-crime-stacked-bars.html">
./demo/modules/london-crime-stacked-bars.js
</a>
<a class="source" href="lottie-loader.html">
./demo/modules/lottie-loader.js
</a>
<a class="source" href="simple-chart-frame-tests.html">
./demo/modules/simple-chart-frame-tests.js
</a>
<a class="source" href="simple-chart-frame.html">
./demo/modules/simple-chart-frame.js
</a>
<a class="source" href="simple-graph-lines.html">
./demo/modules/simple-graph-lines.js
</a>
<a class="source" href="simple-graph-stacked-bars.html">
./demo/modules/simple-graph-stacked-bars.js
</a>
<a class="source" href="wikipedia-views-spiral-chart.html">
./demo/modules/wikipedia-views-spiral-chart.js
</a>
<a class="source" href="../snippets/animated-highlight-gradient-text-snippet.html">
./demo/snippets/animated-highlight-gradient-text-snippet.js
</a>
<a class="source" href="../snippets/animated-hover-gradient-snippet.html">
./demo/snippets/animated-hover-gradient-snippet.js
</a>
<a class="source" href="../snippets/animated-word-gradient-snippet.html">
./demo/snippets/animated-word-gradient-snippet.js
</a>
<a class="source" href="../snippets/before-after-slider-infographic.html">
./demo/snippets/before-after-slider-infographic.js
</a>
<a class="source" href="../snippets/bubbles-text-snippet.html">
./demo/snippets/bubbles-text-snippet.js
</a>
<a class="source" href="../snippets/green-box-snippet.html">
./demo/snippets/green-box-snippet.js
</a>
<a class="source" href="../snippets/jazzy-button-snippet.html">
./demo/snippets/jazzy-button-snippet.js
</a>
<a class="source" href="../snippets/page-performance-snippet-test.html">
./demo/snippets/page-performance-snippet-test.js
</a>
<a class="source" href="../snippets/page-performance-snippet.html">
./demo/snippets/page-performance-snippet.js
</a>
<a class="source" href="../snippets/pan-image-snippet.html">
./demo/snippets/pan-image-snippet.js
</a>
<a class="source" href="../snippets/placeholder-effect-snippet.html">
./demo/snippets/placeholder-effect-snippet.js
</a>
<a class="source" href="../snippets/ripple-effect-snippet.html">
./demo/snippets/ripple-effect-snippet.js
</a>
<a class="source" href="../snippets/risograph-text-gradient-snippet.html">
./demo/snippets/risograph-text-gradient-snippet.js
</a>
<a class="source" href="../snippets/spotlight-text-snippet-test.html">
./demo/snippets/spotlight-text-snippet-test.js
</a>
<a class="source" href="../snippets/spotlight-text-snippet.html">
./demo/snippets/spotlight-text-snippet.js
</a>
<a class="source" href="../snippets/swirling-stripes-text-snippet.html">
./demo/snippets/swirling-stripes-text-snippet.js
</a>
<a class="source" href="../snippets/text-snippet-helper.html">
./demo/snippets/text-snippet-helper.js
</a>
<a class="source" href="../snippets/word-highlighter-snippet.html">
./demo/snippets/word-highlighter-snippet.js
</a>
<a class="source" href="../snippets/worley-text-gradient-snippet.html">
./demo/snippets/worley-text-gradient-snippet.js
</a>
</div>
</div>
</li>
</ul>
<ul class="sections">
<li id="section-1">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-1">§</a>
</div>
<h1 id="demo-modules-005">Demo Modules 005</h1>
<p>Accessible GUI-based simple canvas editor</p>
<p>Related files:</p>
<ul>
<li><a href="../modules-005.html">Accessible GUI-based simple canvas editor - main demo</a></li>
</ul>
<h4 id="usage">Usage</h4>
<p>This sub-module creates accessible forms which can be used to update attributes to a selected entity, or group of entitys. The forms update in real-time as the user selects entitys for editing. The sub-module’s output is required by the entity-navigation sub-module, to help build a fully accessible editing environment.</p>
<p><strong>Inputs to the <code>initializeDomEntityEditor</code> function</strong></p>
<ul>
<li><code>queryString</code> - CSS query string to locate the DOM element where the entity editor form will appear (required)</li>
</ul>
<p><strong>Output from the <code>initializeDomEntityEditor</code> function</strong> - is an object containing the following attributes:</p>
<ul>
<li><code>dashboard</code> - an object containing functions - <code>refresh, update, queue</code> - which will be consumed by other sub-modules</li>
<li><code>killDomEntityEditor</code> - kill function, to remove everything associated with the DOM entity editor from the SC library</li>
</ul>
</div>
</li>
<li id="section-2">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-2">§</a>
</div>
<h3 id="template-functions">Template functions</h3>
<p>This sort of functionality could also be managed by React/Vue/Svelte/etc components if the code is going to run in those environments</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">const</span> <span class="hljs-title function_">getElementHelper</span> = (<span class="hljs-params">tag, classSuffix, contents</span>) => {
<span class="hljs-keyword">const</span> el = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(tag);
el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">`sc-dee-<span class="hljs-subst">${classSuffix}</span>`</span>);
<span class="hljs-keyword">if</span> (contents != <span class="hljs-literal">null</span>) {
<span class="hljs-keyword">if</span> (<span class="hljs-title class_">Array</span>.<span class="hljs-title function_">isArray</span>(contents)) contents.<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">c</span> =></span> el.<span class="hljs-title function_">appendChild</span>(c));
<span class="hljs-keyword">else</span> el.<span class="hljs-title function_">appendChild</span>(contents);
}
<span class="hljs-keyword">return</span> el;
};
<span class="hljs-keyword">const</span> <span class="hljs-title function_">getContainer</span> = (<span class="hljs-params">contents</span>) => <span class="hljs-title function_">getElementHelper</span>(<span class="hljs-string">'div'</span>, <span class="hljs-string">'container'</span>, contents);
<span class="hljs-keyword">const</span> <span class="hljs-title function_">getForm</span> = (<span class="hljs-params">contents = []</span>) => <span class="hljs-title function_">getElementHelper</span>(<span class="hljs-string">'form'</span>, <span class="hljs-string">'form'</span>, contents);
<span class="hljs-keyword">const</span> <span class="hljs-title function_">addTitle</span> = (<span class="hljs-params">title</span>) => {
<span class="hljs-keyword">const</span> el = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'h3'</span>);
el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-title'</span>);
<span class="hljs-keyword">if</span> (title != <span class="hljs-literal">null</span>) el.<span class="hljs-property">textContent</span> = title;
<span class="hljs-keyword">return</span> el;
};
<span class="hljs-keyword">const</span> fieldHandles = {};
<span class="hljs-keyword">const</span> <span class="hljs-title function_">getInputField</span> = (<span class="hljs-params">entity, key, fieldData</span>) => {
<span class="hljs-keyword">const</span> el = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'div'</span>);
el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-container'</span>);
<span class="hljs-keyword">const</span> field = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'input'</span>);
field.<span class="hljs-property">id</span> = key;
field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'type'</span>, fieldData.<span class="hljs-property">inputType</span>);
<span class="hljs-keyword">if</span> (<span class="hljs-string">'Group'</span> !== entity.<span class="hljs-property">type</span>) field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'value'</span>, entity.<span class="hljs-title function_">get</span>(key));
field.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-controller'</span>);
field.<span class="hljs-property">style</span>.<span class="hljs-property">fontSize</span> = <span class="hljs-string">'inherit'</span>;
field.<span class="hljs-property">style</span>.<span class="hljs-property">fontFamily</span> = <span class="hljs-string">'inherit'</span>;
<span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">controlMin</span> != <span class="hljs-literal">null</span>) field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'min'</span>, fieldData.<span class="hljs-property">controlMin</span>);
<span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">controlMax</span> != <span class="hljs-literal">null</span>) field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'max'</span>, fieldData.<span class="hljs-property">controlMax</span>);
<span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">controlStep</span> != <span class="hljs-literal">null</span>) field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'step'</span>, fieldData.<span class="hljs-property">controlStep</span>);
<span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'00 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-0'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'01 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-1'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'02 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-2'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'03 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-3'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'04 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-4'</span>);
<span class="hljs-keyword">const</span> label = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'label'</span>);
label.<span class="hljs-property">textContent</span> = fieldData.<span class="hljs-property">label</span>;
label.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'for'</span>, key);
el.<span class="hljs-title function_">appendChild</span>(label);
el.<span class="hljs-title function_">appendChild</span>(field);
fieldHandles[key] = field;
<span class="hljs-keyword">return</span> el;
};
<span class="hljs-keyword">const</span> <span class="hljs-title function_">getSelectField</span> = (<span class="hljs-params">entity, key, fieldData</span>) => {
<span class="hljs-keyword">const</span> isBoolean = (<span class="hljs-string">'boolean'</span> === fieldData.<span class="hljs-property">glue</span>[<span class="hljs-number">1</span>]);
<span class="hljs-keyword">const</span> optionsList = [];
<span class="hljs-keyword">const</span> el = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'div'</span>);
el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-container'</span>);
<span class="hljs-keyword">const</span> field = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'select'</span>);
field.<span class="hljs-property">id</span> = key;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">const</span> [k, v] <span class="hljs-keyword">of</span> <span class="hljs-title class_">Object</span>.<span class="hljs-title function_">entries</span>(fieldData.<span class="hljs-property">selectOptions</span>)) {
optionsList.<span class="hljs-title function_">push</span>(v);
<span class="hljs-keyword">const</span> opt = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'option'</span>);
opt.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'value'</span>, v);
opt.<span class="hljs-property">textContent</span> = k;
field.<span class="hljs-title function_">appendChild</span>(opt);
}
field.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-controller'</span>);
field.<span class="hljs-property">style</span>.<span class="hljs-property">fontSize</span> = <span class="hljs-string">'inherit'</span>;
field.<span class="hljs-property">style</span>.<span class="hljs-property">fontFamily</span> = <span class="hljs-string">'inherit'</span>;
<span class="hljs-keyword">if</span> (<span class="hljs-string">'Group'</span> !== entity.<span class="hljs-property">type</span>) {
<span class="hljs-keyword">const</span> entityVal = entity.<span class="hljs-title function_">get</span>(key);
<span class="hljs-keyword">if</span> (isBoolean) {
field.<span class="hljs-property">options</span>.<span class="hljs-property">selectedIndex</span> = entityVal ? <span class="hljs-number">1</span> : <span class="hljs-number">0</span>;
}
<span class="hljs-keyword">else</span> field.<span class="hljs-property">options</span>.<span class="hljs-property">selectedIndex</span> = optionsList.<span class="hljs-title function_">indexOf</span>(entityVal);
}
<span class="hljs-keyword">else</span> field.<span class="hljs-property">options</span>.<span class="hljs-property">selectedIndex</span> = <span class="hljs-number">0</span>;
<span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'00 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-0'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'01 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-1'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'02 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-2'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'03 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-3'</span>);
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (fieldData.<span class="hljs-property">order</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'04 '</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">'sc-dee-field-color-4'</span>);
<span class="hljs-keyword">const</span> label = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'label'</span>);
label.<span class="hljs-property">textContent</span> = fieldData.<span class="hljs-property">label</span>;
label.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">'for'</span>, key);
el.<span class="hljs-title function_">appendChild</span>(label);
el.<span class="hljs-title function_">appendChild</span>(field);
fieldHandles[key] = field;
<span class="hljs-keyword">return</span> el;
};
<span class="hljs-keyword">const</span> <span class="hljs-title function_">addFields</span> = (<span class="hljs-params">entity</span>) => {
<span class="hljs-keyword">let</span> fieldData;
<span class="hljs-keyword">if</span> (<span class="hljs-string">'Group'</span> !== entity.<span class="hljs-property">type</span>) {
fieldData = {
...commonRequirements,
...entityRequirements[entity.<span class="hljs-property">type</span>],
};
}
<span class="hljs-keyword">else</span> {
fieldData = {
...groupRequirements,
};
}
<span class="hljs-keyword">let</span> fieldKeys = <span class="hljs-title class_">Object</span>.<span class="hljs-title function_">keys</span>(fieldData);
fieldKeys = fieldKeys.<span class="hljs-title function_">sort</span>(<span class="hljs-function">(<span class="hljs-params">a, b</span>) =></span> {
<span class="hljs-keyword">const</span> A = fieldData[a],
B = fieldData[b];
<span class="hljs-keyword">if</span> (A.<span class="hljs-property">order</span> === B.<span class="hljs-property">order</span>) {
<span class="hljs-keyword">return</span> (A.<span class="hljs-property">label</span> < B.<span class="hljs-property">label</span>) ? -<span class="hljs-number">1</span> : <span class="hljs-number">1</span>;
}
<span class="hljs-keyword">return</span> (A.<span class="hljs-property">order</span> < B.<span class="hljs-property">order</span>) ? -<span class="hljs-number">1</span> : <span class="hljs-number">1</span>;
});
<span class="hljs-keyword">const</span> elements = [];
fieldKeys.<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">key</span> =></span> {
<span class="hljs-keyword">const</span> data = fieldData[key];
<span class="hljs-keyword">if</span> (data.<span class="hljs-property">selectOptions</span> != <span class="hljs-literal">null</span>) elements.<span class="hljs-title function_">push</span>(<span class="hljs-title function_">getSelectField</span>(entity, key, data));
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (data.<span class="hljs-property">inputType</span> != <span class="hljs-literal">null</span>) elements.<span class="hljs-title function_">push</span>(<span class="hljs-title function_">getInputField</span>(entity, key, data));
});
<span class="hljs-keyword">return</span> elements;
};</pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-3">§</a>
</div>
<p>Definition objects - define the form inputs based on the entity type, or the inputs for group selections</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">const</span> groupRequirements = {
<span class="hljs-attr">method</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'02 display'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Stamp Method'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-string">'draw'</span>: <span class="hljs-string">'draw'</span>,
<span class="hljs-string">'fill'</span>: <span class="hljs-string">'fill'</span>,
<span class="hljs-string">'drawAndFill'</span>: <span class="hljs-string">'drawAndFill'</span>,
<span class="hljs-string">'fillAndDraw'</span>: <span class="hljs-string">'fillAndDraw'</span>,
<span class="hljs-string">'drawThenFill'</span>: <span class="hljs-string">'drawThenFill'</span>,
<span class="hljs-string">'fillThenDraw'</span>: <span class="hljs-string">'fillThenDraw'</span>,
<span class="hljs-string">'clear'</span>: <span class="hljs-string">'clear'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'method'</span>, <span class="hljs-string">'raw'</span>],
},
<span class="hljs-attr">flipUpend</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position flip'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Flip Upend'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">false</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">true</span>: <span class="hljs-string">'1'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'flipUpend'</span>, <span class="hljs-string">'boolean'</span>],
},
<span class="hljs-attr">flipReverse</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position flip'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Flip Reverse'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">false</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">true</span>: <span class="hljs-string">'1'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'flipReverse'</span>, <span class="hljs-string">'boolean'</span>],
},
<span class="hljs-attr">fillStyle</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'02 display style'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Fill'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'color'</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'fillStyle'</span>, <span class="hljs-string">'raw'</span>],
},
<span class="hljs-attr">strokeStyle</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'02 display style'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Stroke'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'color'</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'strokeStyle'</span>, <span class="hljs-string">'raw'</span>],
},
<span class="hljs-attr">lineWidth</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'03 display line'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Line Width'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.5</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'lineWidth'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">lineCap</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'03 display line'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Line Cap'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">butt</span>: <span class="hljs-string">'butt'</span>,
<span class="hljs-attr">round</span>: <span class="hljs-string">'round'</span>,
<span class="hljs-attr">square</span>: <span class="hljs-string">'square'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'lineCap'</span>, <span class="hljs-string">'raw'</span>],
},
<span class="hljs-attr">lineJoin</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'03 display line'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Line Join'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">miter</span>: <span class="hljs-string">'miter'</span>,
<span class="hljs-attr">round</span>: <span class="hljs-string">'round'</span>,
<span class="hljs-attr">join</span>: <span class="hljs-string">'bevel'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'lineJoin'</span>, <span class="hljs-string">'raw'</span>],
},
<span class="hljs-attr">scaleOutline</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'03 display line'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Scale Outline'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">false</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">true</span>: <span class="hljs-string">'1'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'scaleOutline'</span>, <span class="hljs-string">'boolean'</span>],
},
<span class="hljs-attr">shadowOffsetX</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'04 display shadow'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Shadow Offset X (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.5</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'shadowOffsetX'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">shadowOffsetY</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'04 display shadow'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Shadow Offset Y (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.5</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'shadowOffsetY'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">shadowBlur</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'04 display shadow'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Shadow Blur'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.5</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'shadowBlur'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">shadowColor</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'04 display shadow'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Shadow Color'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'color'</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'shadowColor'</span>, <span class="hljs-string">'raw'</span>],
},
};
<span class="hljs-keyword">const</span> commonRequirements = {
...groupRequirements,
<span class="hljs-attr">handleX</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position handle'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Handle X (%)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'handleX'</span>, <span class="hljs-string">'%'</span>],
},
<span class="hljs-attr">handleY</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position handle'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Handle Y (%)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'handleY'</span>, <span class="hljs-string">'%'</span>],
},
<span class="hljs-attr">startX</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position start'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Start X (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'startX'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">startY</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position start'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Start Y (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'startY'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">offsetX</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position offset'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Offset X (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'offsetX'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">offsetY</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 position offset'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Offset Y (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'offsetY'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">roll</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 shape roll'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Roll (deg)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: -<span class="hljs-number">360</span>,
<span class="hljs-attr">controlMax</span>: <span class="hljs-number">360</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.2</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'roll'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">scale</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'01 shape scale'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Scale'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.005</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'scale'</span>, <span class="hljs-string">'float'</span>],
},
};
<span class="hljs-keyword">const</span> entityRequirements = {
<span class="hljs-title class_">Block</span>: {
<span class="hljs-attr">width</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Width (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'width'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">height</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Height (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'height'</span>, <span class="hljs-string">'round'</span>],
},
},
<span class="hljs-title class_">Wheel</span>: {
<span class="hljs-attr">radius</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Radius (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'radius'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">startAngle</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Start Angle (deg)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: -<span class="hljs-number">360</span>,
<span class="hljs-attr">controlMax</span>: <span class="hljs-number">360</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.2</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'startAngle'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">endAngle</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'End Angle (deg)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: -<span class="hljs-number">360</span>,
<span class="hljs-attr">controlMax</span>: <span class="hljs-number">360</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.2</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'endAngle'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">includeCenter</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Include Center'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">false</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">true</span>: <span class="hljs-string">'1'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'includeCenter'</span>, <span class="hljs-string">'boolean'</span>],
},
<span class="hljs-attr">closed</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Closed'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">false</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">true</span>: <span class="hljs-string">'1'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'closed'</span>, <span class="hljs-string">'boolean'</span>],
},
},
<span class="hljs-title class_">Phrase</span>: {
<span class="hljs-attr">width</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Width (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'width'</span>, <span class="hljs-string">'round'</span>],
},
<span class="hljs-attr">text</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 content'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Text'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'text'</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'text'</span>, <span class="hljs-string">'raw'</span>],
},
<span class="hljs-attr">lineHeight</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Line height'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.1</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'lineHeight'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">letterSpacing</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Letter spacing (px)'</span>,
<span class="hljs-attr">inputType</span>: <span class="hljs-string">'number'</span>,
<span class="hljs-attr">controlMin</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.2</span>,
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'letterSpacing'</span>, <span class="hljs-string">'float'</span>],
},
<span class="hljs-attr">justify</span>: {
<span class="hljs-attr">order</span>: <span class="hljs-string">'00 shape'</span>,
<span class="hljs-attr">label</span>: <span class="hljs-string">'Justify text'</span>,
<span class="hljs-attr">selectOptions</span>: {
<span class="hljs-attr">left</span>: <span class="hljs-string">'left'</span>,
<span class="hljs-attr">center</span>: <span class="hljs-string">'center'</span>,
<span class="hljs-attr">right</span>: <span class="hljs-string">'right'</span>,
<span class="hljs-attr">full</span>: <span class="hljs-string">'full'</span>,
},
<span class="hljs-attr">glue</span>: [<span class="hljs-string">'justify&#