UNPKG

scrawl-canvas

Version:
712 lines (559 loc) 71.9 kB
<!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 &hellip;</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">&#x00a7;</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">&#x00a7;</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>) =&gt; { <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> =&gt;</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>) =&gt; <span class="hljs-title function_">getElementHelper</span>(<span class="hljs-string">&#x27;div&#x27;</span>, <span class="hljs-string">&#x27;container&#x27;</span>, contents); <span class="hljs-keyword">const</span> <span class="hljs-title function_">getForm</span> = (<span class="hljs-params">contents = []</span>) =&gt; <span class="hljs-title function_">getElementHelper</span>(<span class="hljs-string">&#x27;form&#x27;</span>, <span class="hljs-string">&#x27;form&#x27;</span>, contents); <span class="hljs-keyword">const</span> <span class="hljs-title function_">addTitle</span> = (<span class="hljs-params">title</span>) =&gt; { <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">&#x27;h3&#x27;</span>); el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-title&#x27;</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>) =&gt; { <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">&#x27;div&#x27;</span>); el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-container&#x27;</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">&#x27;input&#x27;</span>); field.<span class="hljs-property">id</span> = key; field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">&#x27;type&#x27;</span>, fieldData.<span class="hljs-property">inputType</span>); <span class="hljs-keyword">if</span> (<span class="hljs-string">&#x27;Group&#x27;</span> !== entity.<span class="hljs-property">type</span>) field.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">&#x27;value&#x27;</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">&#x27;sc-dee-field-controller&#x27;</span>); field.<span class="hljs-property">style</span>.<span class="hljs-property">fontSize</span> = <span class="hljs-string">&#x27;inherit&#x27;</span>; field.<span class="hljs-property">style</span>.<span class="hljs-property">fontFamily</span> = <span class="hljs-string">&#x27;inherit&#x27;</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">&#x27;min&#x27;</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">&#x27;max&#x27;</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">&#x27;step&#x27;</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">&#x27;00 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-0&#x27;</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">&#x27;01 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-1&#x27;</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">&#x27;02 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-2&#x27;</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">&#x27;03 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-3&#x27;</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">&#x27;04 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-4&#x27;</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">&#x27;label&#x27;</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">&#x27;for&#x27;</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>) =&gt; { <span class="hljs-keyword">const</span> isBoolean = (<span class="hljs-string">&#x27;boolean&#x27;</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">&#x27;div&#x27;</span>); el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-container&#x27;</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">&#x27;select&#x27;</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">&#x27;option&#x27;</span>); opt.<span class="hljs-title function_">setAttribute</span>(<span class="hljs-string">&#x27;value&#x27;</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">&#x27;sc-dee-field-controller&#x27;</span>); field.<span class="hljs-property">style</span>.<span class="hljs-property">fontSize</span> = <span class="hljs-string">&#x27;inherit&#x27;</span>; field.<span class="hljs-property">style</span>.<span class="hljs-property">fontFamily</span> = <span class="hljs-string">&#x27;inherit&#x27;</span>; <span class="hljs-keyword">if</span> (<span class="hljs-string">&#x27;Group&#x27;</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">&#x27;00 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-0&#x27;</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">&#x27;01 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-1&#x27;</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">&#x27;02 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-2&#x27;</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">&#x27;03 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-3&#x27;</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">&#x27;04 &#x27;</span>)) el.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;sc-dee-field-color-4&#x27;</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">&#x27;label&#x27;</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">&#x27;for&#x27;</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>) =&gt; { <span class="hljs-keyword">let</span> fieldData; <span class="hljs-keyword">if</span> (<span class="hljs-string">&#x27;Group&#x27;</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>) =&gt;</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> &lt; 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> &lt; 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> =&gt;</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">&#x00a7;</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">&#x27;02 display&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Stamp Method&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-string">&#x27;draw&#x27;</span>: <span class="hljs-string">&#x27;draw&#x27;</span>, <span class="hljs-string">&#x27;fill&#x27;</span>: <span class="hljs-string">&#x27;fill&#x27;</span>, <span class="hljs-string">&#x27;drawAndFill&#x27;</span>: <span class="hljs-string">&#x27;drawAndFill&#x27;</span>, <span class="hljs-string">&#x27;fillAndDraw&#x27;</span>: <span class="hljs-string">&#x27;fillAndDraw&#x27;</span>, <span class="hljs-string">&#x27;drawThenFill&#x27;</span>: <span class="hljs-string">&#x27;drawThenFill&#x27;</span>, <span class="hljs-string">&#x27;fillThenDraw&#x27;</span>: <span class="hljs-string">&#x27;fillThenDraw&#x27;</span>, <span class="hljs-string">&#x27;clear&#x27;</span>: <span class="hljs-string">&#x27;clear&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;method&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</span>], }, <span class="hljs-attr">flipUpend</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position flip&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Flip Upend&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">false</span>: <span class="hljs-string">&#x27;0&#x27;</span>, <span class="hljs-attr">true</span>: <span class="hljs-string">&#x27;1&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;flipUpend&#x27;</span>, <span class="hljs-string">&#x27;boolean&#x27;</span>], }, <span class="hljs-attr">flipReverse</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position flip&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Flip Reverse&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">false</span>: <span class="hljs-string">&#x27;0&#x27;</span>, <span class="hljs-attr">true</span>: <span class="hljs-string">&#x27;1&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;flipReverse&#x27;</span>, <span class="hljs-string">&#x27;boolean&#x27;</span>], }, <span class="hljs-attr">fillStyle</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;02 display style&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Fill&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;color&#x27;</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;fillStyle&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</span>], }, <span class="hljs-attr">strokeStyle</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;02 display style&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Stroke&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;color&#x27;</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;strokeStyle&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</span>], }, <span class="hljs-attr">lineWidth</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;03 display line&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Line Width&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;lineWidth&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">lineCap</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;03 display line&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Line Cap&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">butt</span>: <span class="hljs-string">&#x27;butt&#x27;</span>, <span class="hljs-attr">round</span>: <span class="hljs-string">&#x27;round&#x27;</span>, <span class="hljs-attr">square</span>: <span class="hljs-string">&#x27;square&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;lineCap&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</span>], }, <span class="hljs-attr">lineJoin</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;03 display line&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Line Join&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">miter</span>: <span class="hljs-string">&#x27;miter&#x27;</span>, <span class="hljs-attr">round</span>: <span class="hljs-string">&#x27;round&#x27;</span>, <span class="hljs-attr">join</span>: <span class="hljs-string">&#x27;bevel&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;lineJoin&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</span>], }, <span class="hljs-attr">scaleOutline</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;03 display line&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Scale Outline&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">false</span>: <span class="hljs-string">&#x27;0&#x27;</span>, <span class="hljs-attr">true</span>: <span class="hljs-string">&#x27;1&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;scaleOutline&#x27;</span>, <span class="hljs-string">&#x27;boolean&#x27;</span>], }, <span class="hljs-attr">shadowOffsetX</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;04 display shadow&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Shadow Offset X (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.5</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;shadowOffsetX&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">shadowOffsetY</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;04 display shadow&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Shadow Offset Y (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">0.5</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;shadowOffsetY&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">shadowBlur</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;04 display shadow&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Shadow Blur&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;shadowBlur&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">shadowColor</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;04 display shadow&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Shadow Color&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;color&#x27;</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;shadowColor&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</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">&#x27;01 position handle&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Handle X (%)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;handleX&#x27;</span>, <span class="hljs-string">&#x27;%&#x27;</span>], }, <span class="hljs-attr">handleY</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position handle&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Handle Y (%)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;handleY&#x27;</span>, <span class="hljs-string">&#x27;%&#x27;</span>], }, <span class="hljs-attr">startX</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position start&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Start X (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;startX&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">startY</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position start&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Start Y (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;startY&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">offsetX</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position offset&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Offset X (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;offsetX&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">offsetY</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 position offset&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Offset Y (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-attr">controlStep</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;offsetY&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">roll</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 shape roll&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Roll (deg)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;roll&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">scale</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;01 shape scale&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Scale&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;scale&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</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">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Width (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;width&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">height</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Height (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;height&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, }, <span class="hljs-title class_">Wheel</span>: { <span class="hljs-attr">radius</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Radius (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;radius&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">startAngle</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Start Angle (deg)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;startAngle&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">endAngle</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;End Angle (deg)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;endAngle&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">includeCenter</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Include Center&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">false</span>: <span class="hljs-string">&#x27;0&#x27;</span>, <span class="hljs-attr">true</span>: <span class="hljs-string">&#x27;1&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;includeCenter&#x27;</span>, <span class="hljs-string">&#x27;boolean&#x27;</span>], }, <span class="hljs-attr">closed</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Closed&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">false</span>: <span class="hljs-string">&#x27;0&#x27;</span>, <span class="hljs-attr">true</span>: <span class="hljs-string">&#x27;1&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;closed&#x27;</span>, <span class="hljs-string">&#x27;boolean&#x27;</span>], }, }, <span class="hljs-title class_">Phrase</span>: { <span class="hljs-attr">width</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Width (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;width&#x27;</span>, <span class="hljs-string">&#x27;round&#x27;</span>], }, <span class="hljs-attr">text</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 content&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Text&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;text&#x27;</span>, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;text&#x27;</span>, <span class="hljs-string">&#x27;raw&#x27;</span>], }, <span class="hljs-attr">lineHeight</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Line height&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;lineHeight&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">letterSpacing</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Letter spacing (px)&#x27;</span>, <span class="hljs-attr">inputType</span>: <span class="hljs-string">&#x27;number&#x27;</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">&#x27;letterSpacing&#x27;</span>, <span class="hljs-string">&#x27;float&#x27;</span>], }, <span class="hljs-attr">justify</span>: { <span class="hljs-attr">order</span>: <span class="hljs-string">&#x27;00 shape&#x27;</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;Justify text&#x27;</span>, <span class="hljs-attr">selectOptions</span>: { <span class="hljs-attr">left</span>: <span class="hljs-string">&#x27;left&#x27;</span>, <span class="hljs-attr">center</span>: <span class="hljs-string">&#x27;center&#x27;</span>, <span class="hljs-attr">right</span>: <span class="hljs-string">&#x27;right&#x27;</span>, <span class="hljs-attr">full</span>: <span class="hljs-string">&#x27;full&#x27;</span>, }, <span class="hljs-attr">glue</span>: [<span class="hljs-string">&#x27;justify&#