Events and state binding

This commit is contained in:
Michael Shanks 2019-09-20 08:01:35 +01:00
parent e49fd04cdb
commit be2fe07395
23 changed files with 3449 additions and 1377 deletions

View File

@ -2,4 +2,5 @@ Contributors
=== ===
* Michael Shanks - [@mjashanks](https://github.com/mjashanks) * Michael Shanks - [@mjashanks](https://github.com/mjashanks)
* Daniel Loudon - [@danbudi](https://github.com/danbudi) * Dan - [@danbudi](https://github.com/danbudi)
* Joe - [@joebudi](https://github.com/joebudi)

View File

@ -33,7 +33,7 @@ const production = !process.env.ROLLUP_WATCH;
const lodash_fp_exports = ["union", "reduce", "isUndefined", "cloneDeep", "split", "some", "map", "filter", "isEmpty", "countBy", "includes", "last", "find", "constant", const lodash_fp_exports = ["union", "reduce", "isUndefined", "cloneDeep", "split", "some", "map", "filter", "isEmpty", "countBy", "includes", "last", "find", "constant",
"take", "first", "intersection", "mapValues", "isNull", "has", "isNumber", "isString", "isBoolean", "isDate", "isArray", "isObject", "clone", "values", "keyBy", "take", "first", "intersection", "mapValues", "isNull", "has", "isNumber", "isString", "isBoolean", "isDate", "isArray", "isObject", "clone", "values", "keyBy",
"keys", "orderBy", "concat", "reverse", "difference", "merge", "flatten", "each", "pull", "join", "defaultCase", "uniqBy", "every", "uniqWith", "isFunction", "groupBy", "keys", "orderBy", "concat", "reverse", "difference", "merge", "flatten", "each", "pull", "join", "defaultCase", "uniqBy", "every", "uniqWith", "isFunction", "groupBy",
"differenceBy", "intersectionBy", "isEqual", "max", "sortBy", "assign", "uniq", "trimChars", "trimCharsStart", "isObjectLike", "flattenDeep", "indexOf"]; "differenceBy", "intersectionBy", "isEqual", "max", "sortBy", "assign", "uniq", "trimChars", "trimCharsStart", "isObjectLike", "flattenDeep", "indexOf", "isPlainObject"];
const lodash_exports = ["toNumber", "flow", "isArray", "join", "replace", "trim", "dropRight", "takeRight", "head", "isUndefined", "isNull", "isNaN", "reduce", "isEmpty", const lodash_exports = ["toNumber", "flow", "isArray", "join", "replace", "trim", "dropRight", "takeRight", "head", "isUndefined", "isNull", "isNaN", "reduce", "isEmpty",
"constant", "tail", "includes", "startsWith", "findIndex", "isInteger", "isDate", "isString", "split", "clone", "keys", "isFunction", "merge", "has", "isBoolean", "isNumber", "constant", "tail", "includes", "startsWith", "findIndex", "isInteger", "isDate", "isString", "split", "clone", "keys", "isFunction", "merge", "has", "isBoolean", "isNumber",

View File

@ -0,0 +1,25 @@
import {
isString
} from "lodash/fp";
export const BB_STATE_BINDINGPATH = "##bbstate";
export const BB_STATE_FALLBACK = "##bbstatefallback";
export const isBinding = value =>
!isString(value)
&& value
&& isString(value[BB_STATE_BINDINGPATH])
&& value[BB_STATE_BINDINGPATH].length > 0;
export const setBinding = ({path, fallback}, binding={} ) => {
if(isNonEmptyString(path)) binding[BB_STATE_BINDINGPATH] = path;
if(isNonEmptyString(fallback)) binding[BB_STATE_FALLBACK] = fallback;
return binding
}
export const getBinding = binding => ({
path: binding[BB_STATE_BINDINGPATH] || "",
fallback: binding[BB_STATE_FALLBACK] || ""
});
const isNonEmptyString = s => isString(s) && s.length > 0;

View File

@ -18,7 +18,6 @@ export let props = emptyProps();
export let onValueChanged = () => {}; export let onValueChanged = () => {};
export let onComponentChosen = () => {}; export let onComponentChosen = () => {};
export let onEdit = () => {}; export let onEdit = () => {};
export let label = "";
export let disabled = false; export let disabled = false;
const CHOOSE_COMPONENT = "choose_component"; const CHOOSE_COMPONENT = "choose_component";
@ -70,7 +69,6 @@ const confirmClearComponent = () => {
</script> </script>
<label class="uk-form-label">{label}</label>
<div class="root uk-form-controls"> <div class="root uk-form-controls">
<div class:selectedname={componentSelected}> <div class:selectedname={componentSelected}>
{componentSelected ? shortName : "(none)"} {componentSelected ? shortName : "(none)"}

View File

@ -0,0 +1,96 @@
<script>
import IconButton from "../common/IconButton.svelte";
import EventSelector from "./EventSelector.svelte";
import {
filter
} from "lodash/fp";
export let parentProps;
export let propDef;
export let onValueChanged;
export let onValidate = () => {};
let events = [];
let elementErrors = {};
$: {
events = parentProps[propDef.____name];
}
const addHandler = () => {
const newHandler = {handlerType:"", parameters:{}};
events = [...events, newHandler];
onValueChanged(events);
}
const onEventHandlerChanged = (oldEvent) => (newEvent) => {
const indexOfOldEvent = events.indexOf(oldEvent);
const newEvents = [...events];
newEvents.splice(
events.indexOf(oldEvent),
1,
newEvent);
events = newEvents;
onValueChanged(events);
}
const removeHandler = (index) => () => {
events = filter(e => e !== events[index])(events);
onValueChanged(events);
}
</script>
<div class="root">
<div class="control-container">
{#each events as ev, index}
<div class="handler-container">
<EventSelector onChanged={onEventHandlerChanged(ev)}
onRemoved={removeHandler(index)}
event={ev} />
</div>
<div class="separator"></div>
{/each}
<div class="addelement-container"
on:click={addHandler}>
<IconButton icon="plus"
size="12"/>
</div>
</div>
</div>
<style>
.addelement-container {
cursor: pointer;
padding: 3px 0px;
text-align: center;
}
.addelement-container:hover {
background-color: var(--primary25);
margin-top: 5px;
}
.control-container {
padding-left: 3px;
background: var(--secondary10);
}
.separator {
width: 60%;
margin: 10px auto;
border-style:solid;
border-width: 1px 0 0 0;
border-color: var(--primary25);
}
</style>

View File

@ -0,0 +1,102 @@
<script>
import IconButton from "../common/IconButton.svelte";
import StateBindingControl from "./StateBindingControl.svelte";
import {
find, map, keys, reduce
} from "lodash/fp";
import { pipe } from "../common/core";
export let event;
export let onChanged;
export let onRemoved;
const events = [
{name:"", parameters: []},
{name:"Set State", parameters: ["path", "value"]},
{name:"Load Record", parameters: ["recordKey", "statePath"]},
];
let eventType;
let parameters = [];
$: {
if(event) {
eventType = event.handlerType;
parameters = pipe(event.parameters, [
keys,
map(k => ({name:k, value:event.parameters[k]}))
]);
} else {
eventType = "";
parameters = [];
}
}
const eventChanged = (type, parameters) => {
const paramsAsObject = reduce(
(obj, p) => {
obj[p.name] = p.value;
return obj;
}
, {}
)(parameters)
onChanged({
handlerType:type,
parameters: paramsAsObject
});
}
const eventTypeChanged = (ev) => {
const eType = find(e => e.name === ev.target.value)(events);
const emptyParameters = map(p => ({name:p, value:""}))(eType.parameters);
eventChanged(eType.name, emptyParameters);
}
const onParameterChanged = index => ev => {
const newparameters = [...parameters];
newparameters[index].value = ev.target.value;
eventChanged(eventType, newparameters);
}
</script>
<div class="type-selector-container">
<select class="type-selector uk-select uk-form-small " value={eventType} on:change={eventTypeChanged}>
{#each events as ev}
<option value={ev.name}>{ev.name}</option>
{/each}
</select>
<IconButton icon="trash"
size="12"
on:click={onRemoved}/>
</div>
{#if parameters}
{#each parameters as p, index}
<div>
{p.name}
</div>
<StateBindingControl onChanged={onParameterChanged(index)}
value={p.value} />
{/each}
{/if}
<style>
.type-selector-container {
display: flex;
}
.type-selector {
border-color: var(--primary50);
border-radius: 2px;
width: 50px;
flex: 1 0 auto;
}
</style>

View File

@ -18,7 +18,6 @@ export let onEditComponentProp = () => {};
let value = []; let value = [];
let elementDefinitionArray; let elementDefinitionArray;
let label = "";
let elementErrors = {}; let elementErrors = {};
$: { $: {
@ -31,7 +30,6 @@ $: {
}); });
} }
elementDefinitionArray = elArray; elementDefinitionArray = elArray;
label = propDef.____name;
value = parentProps[propDef.____name]; value = parentProps[propDef.____name];
} }
@ -73,9 +71,7 @@ const onEditComponent = (index, propName) => () => {
</script> </script>
<div class="root"> <div class="root">
<div>
{label}
</div>
<div class="item-container"> <div class="item-container">
{#each value as item, index} {#each value as item, index}

View File

@ -5,6 +5,8 @@ import Textbox from "../common/Textbox.svelte";
import Dropdown from "../common/Dropdown.svelte"; import Dropdown from "../common/Dropdown.svelte";
import ComponentPropSelector from "./ComponentPropSelector.svelte"; import ComponentPropSelector from "./ComponentPropSelector.svelte";
import PropArraySelector from "./PropArraySelector.svelte"; import PropArraySelector from "./PropArraySelector.svelte";
import EventListSelector from "./EventListSelector.svelte";
import StateBindingControl from "./StateBindingControl.svelte";
export let errors = []; export let errors = [];
export let setProp = () => {}; export let setProp = () => {};
@ -26,37 +28,39 @@ const setComponentProp = (props) => {
<div class="root" > <div class="root" >
{#if propDef.type === "component"}
{#if propDef.type === "bool"} <div class="prop-label">{propDef.____name}</div>
<Checkbox label={propDef.____name}
checked={props[propDef.____name]}
on:change={ev => setProp(propDef.____name, ev.target.checked)}
hasError={fieldHasError(propDef.____name)} />
{:else if propDef.type === "options"}
<Dropdown label={propDef.____name}
selected={props[propDef.____name]}
options={propDef.options}
on:change={ev => setProp(propDef.____name, ev.target.value)}
hasError={fieldHasError(propDef.____name)}/>
{:else if propDef.type === "component"}
<ComponentPropSelector label={propDef.____name} <ComponentPropSelector label={propDef.____name}
props={props[propDef.____name]} props={props[propDef.____name]}
{disabled} {disabled}
onEdit={onEditComponent} onEdit={onEditComponent}
onComponentChosen={onEditComponent} onComponentChosen={onEditComponent}
onValueChanged={setComponentProp}/> onValueChanged={setComponentProp}/>
{:else if propDef.type === "array"} {:else if propDef.type === "array"}
<div class="prop-label">{propDef.____name}</div>
<PropArraySelector parentProps={props} <PropArraySelector parentProps={props}
{propDef} {propDef}
onValueChanged={setComponentProp} onValueChanged={setComponentProp}
onEditComponentProp={onEditComponent} /> onEditComponentProp={onEditComponent} />
{:else if propDef.type === "event"}
<div class="prop-label">{propDef.____name}</div>
<EventListSelector parentProps={props}
{propDef}
onValueChanged={setComponentProp} />
{:else} {:else}
<Textbox label={propDef.____name}
text={props[propDef.____name]} <div class="prop-label">{propDef.____name}</div>
on:change={ev => setProp(propDef.____name, ev.target.value)} <StateBindingControl value={props[propDef.____name]}
margin={false} type={propDef.type}
hasError={fieldHasError(propDef.____name)} options={propDef.options}
{disabled}/> onChanged={v => setProp(propDef.____name, v)}/>
{/if} {/if}
</div> </div>
@ -70,4 +74,10 @@ const setComponentProp = (props) => {
border-color: var(--primary25); border-color: var(--primary25);
} }
.prop-label {
font-size: 0.9em;
color: var(--primary100);
font-weight: bold;
}
</style> </style>

View File

@ -0,0 +1,155 @@
<script>
import {
isString
} from "lodash/fp";
import IconButton from "../common/IconButton.svelte";
import {
isBinding, getBinding, setBinding
} from "../common/binding";
export let value="";
export let onChanged= () => {};
export let type="";
export let options=[];
let isBound=false;
let bindingPath="";
let bindingFallbackValue="";
let isExpanded = false;
let forceIsBound = false;
$: {
isBound= forceIsBound || isBinding(value);
if(isBound) {
const binding = getBinding(value);
bindingPath= binding.path;
bindingFallbackValue= binding.fallback;
} else {
bindingPath="";
bindingFallbackValue="";
}
}
const clearBinding = () => {
forceIsBound = false;
onChanged("");
}
const bind = (path, fallback) => {
if(!path) {
clearBinding("");
return;
}
const binding = setBinding({path, fallback});
onChanged(binding);
}
const setBindingPath = ev => {
forceIsBound = false;
bind(ev.target.value, bindingFallbackValue)
}
const setBindingFallback = ev => {
bind(bindingPath, ev.target.value);
}
const makeBinding = () => {
forceIsBound=true;
isExpanded=true;
}
</script>
{#if isBound}
<div>
<div class="bound-header">
<div>{isExpanded ? "" : bindingPath}</div>
<IconButton icon={isExpanded ? "chevron-up" : "chevron-down"}
size="12"
on:click={() => isExpanded=!isExpanded}/>
<IconButton icon="trash"
size="12"
on:click={clearBinding}/>
</div>
{#if isExpanded}
<div>
<div class="binding-prop-label">Binding Path</div>
<input class="uk-input uk-form-small"
value={bindingPath}
on:change={setBindingPath} >
<div class="binding-prop-label">Fallback Value</div>
<input class="uk-input uk-form-small"
value={bindingFallbackValue}
on:change={setBindingFallback} >
</div>
{/if}
</div>
{:else}
<div class="unbound-container">
{#if type === "bool"}
<div>
<IconButton icon={value == true ? "check-square" : "square"}
size="19"
on:click={() => value = !value}/>
</div>
{:else if type === "options"}
<select class="uk-select uk-form-small"
value={value}
on:change={ev => onChanged(ev.target.checked)}>
{#each options as option}
<option value={option}>{option}</option>
{/each}
</select>
{:else}
<input class="uk-input uk-form-small"
on:change={ev => onChanged(ev.target.value)}
bind:value={value}
style="flex: 1 0 auto;" >
{/if}
<IconButton icon="link"
size="12"
on:click={makeBinding} />
</div>
{/if}
<style>
.unbound-container {
display:flex;
}
.unbound-container > *:nth-child(1) {
width:auto;
flex: 1 0 auto;
}
.bound-header {
display: flex;
}
.bound-header > div:nth-child(1) {
flex: 1 0 auto;
width: 30px;
color: var(--darkslate);
padding-left: 5px;
font-style: italic;
}
.binding-prop-label {
color: var(--darkslate);
}
</style>

View File

@ -4,7 +4,8 @@ import {
isNumber, isNumber,
isArray, isArray,
isObjectLike, isObjectLike,
some isPlainObject,
every
} from "lodash/fp"; } from "lodash/fp";
const defaultDef = typeName => () => ({ const defaultDef = typeName => () => ({
@ -49,12 +50,12 @@ export const expandPropsDefinition = propsDefinition => {
const isComponent = isObjectLike; const isComponent = isObjectLike;
const isEvent = e => const isEvent = e =>
isObjectLike(e) isPlainObject(e)
&& e.handlerType && isString(e.handlerType) && isString(e.handlerType)
&& e.parameters && isArray(e.parameters); && isPlainObject(e.parameters);
const isEventList = e => const isEventList = e =>
isArray(e) && !some(ev => !isEvent(ev)); isArray(e) && every(isEvent)(e);
export const types = { export const types = {

View File

@ -1,21 +1,17 @@
import { types } from "./types"; import { types } from "./types";
import { import {
createProps, createProps, arrayElementComponentName
arrayElementComponentName
} from "./createProps"; } from "./createProps";
import { isString } from "util"; import { isString } from "util";
import { import {
includes, includes, filter, map, keys,
filter, flatten, flattenDeep, each,
map, indexOf, isUndefined
keys,
flatten,
flattenDeep,
each,
indexOf,
isUndefined
} from "lodash/fp"; } from "lodash/fp";
import { common } from "../../../../core/src"; import { common } from "../../../../core/src";
import {
isBinding
} from "../../common/binding";
const pipe = common.$; const pipe = common.$;
@ -133,7 +129,15 @@ export const validateProps = (propsDefinition, props, stack=[], isFinal=true) =>
continue; continue;
} }
if(!type.isOfType(propValue)) { if(isBinding(propValue)) {
if(propDef.type === "array"
|| propDef.type === "component"
|| propDef.type === "event") {
error(`Cannot apply binding to type ${propDef.type}`);
continue;
}
}
else if(!type.isOfType(propValue)) {
error(`Property ${propDefName} is not of type ${propDef.type}. Actual value ${propValue}`) error(`Property ${propDefName} is not of type ${propDef.type}. Actual value ${propValue}`)
continue; continue;
} }
@ -157,6 +161,7 @@ export const validateProps = (propsDefinition, props, stack=[], isFinal=true) =>
if(propDef.type === "options" if(propDef.type === "options"
&& propValue && propValue
&& !isBinding(propValue)
&& !includes(propValue)(propDef.options)) { && !includes(propValue)(propDef.options)) {
error(`Property ${propDefName} is not one of allowed options. Acutal value is ${propValue}`); error(`Property ${propDefName} is not one of allowed options. Acutal value is ${propValue}`);
} }

View File

@ -4,6 +4,9 @@ import {
recursivelyValidate recursivelyValidate
} from "../src/userInterface/pagesParsing/validateProps"; } from "../src/userInterface/pagesParsing/validateProps";
import { createProps } from "../src/userInterface/pagesParsing/createProps"; import { createProps } from "../src/userInterface/pagesParsing/createProps";
import {
setBinding
} from "../src/common/binding";
// not that allot of this functionality is covered // not that allot of this functionality is covered
// in createDefaultProps - as validate props uses that. // in createDefaultProps - as validate props uses that.
@ -151,6 +154,14 @@ describe("validateProps", () => {
expect(errors[0].propName).toBe("width"); expect(errors[0].propName).toBe("width");
}); });
it("should not return error when has binding", () => {
const props = validProps();
props.columns[0].width = setBinding({path:"some_path"});
props.size = setBinding({path:"other path", fallback:"small"});
const errors = validateProps(validPropDef, props, [], true);
expect(errors.length).toEqual(0);
});
}); });
describe("recursivelyValidateProps", () => { describe("recursivelyValidateProps", () => {

View File

@ -1,5 +1,5 @@
export const BB_STATE_INDICATOR = "##bbstate"; export const BB_STATE_BINDINGPATH = "##bbstate";
export const BB_STATE_FALLBACK = "##bbstatefallback"; export const BB_STATE_FALLBACK = "##bbstatefallback";
export const bindComponent = (store, component) => { export const bindComponent = (store, component) => {
@ -49,8 +49,8 @@ export const bindComponent = (store, component) => {
} }
const isState = (prop) => prop[BB_STATE_INDICATOR] !== undefined; const isState = (prop) => prop[BB_STATE_BINDINGPATH] !== undefined;
const stateBinding = (prop) => prop[BB_STATE_INDICATOR]; const stateBinding = (prop) => prop[BB_STATE_BINDINGPATH];
const stateFallback = (prop) => prop[BB_STATE_FALLBACK]; const stateFallback = (prop) => prop[BB_STATE_FALLBACK];
const boundValueFromStore = (s, binding, fallback) => { const boundValueFromStore = (s, binding, fallback) => {
const value = s[binding]; const value = s[binding];

View File

@ -0,0 +1,37 @@
{
"name": "Button in the middle",
"description": "",
"inherits": "Centered Panel",
"props": {
"children": [
{
"_component": "undefined:children",
"control": {
"_component": "@budibase/standard-components/button",
"contentText": "Button",
"contentComponent": {
"_component": ""
},
"className": "default",
"disabled": false,
"onClick": []
},
"gridColumn": "center",
"gridRow": "middle",
"gridColumnStart": "",
"gridColumnEnd": "",
"gridRowStart": "",
"gridRowEnd": ""
}
],
"height": "200px",
"width": "200px"
},
"tags": [
"div",
"container",
"layout",
"panel",
"grid"
]
}

View File

@ -0,0 +1,16 @@
{
"name": "Centered Panel",
"description": "",
"inherits": "@budibase/standard-components/grid",
"props": {
"gridTemplateColumns": "[left] 30px [center] 1fr [right] 30px",
"gridTemplateRows": "[top] 30px [middle] 1fr [bottom] 30px"
},
"tags": [
"div",
"container",
"layout",
"panel",
"grid"
]
}

View File

@ -0,0 +1,29 @@
{
"name": "Primary Button",
"description": "",
"inherits": "@budibase/standard-components/button",
"props": {
"onClick": [
{
"handlerType": "Load Record",
"parameters": {
"recordKey": "waa",
"statePath": "yea"
}
},
{
"handlerType": "Load Record",
"parameters": {
"recordKey": "ttt",
"statePath": "eee"
}
}
],
"contentText": {
"##bbstate": "yea"
}
},
"tags": [
"button"
]
}

View File

@ -1,43 +1,47 @@
main.svelte-kajqu6{height:100%;width:100%;font-family:"Roboto", Helvetica, Arial, sans-serif} main.svelte-1ui0j3s{height:100%;width:100%;font-family:"Roboto", Helvetica, Arial, sans-serif}
.root.svelte-h9y88z{height:100%;width:100%;display:flex;flex-direction:column}.top-nav.svelte-h9y88z{flex:0 0 auto;height:25px;background:white;border-style:solid;border-width:0px 0px 1px 0px;border-color:var(--lightslate);padding:5px;width:100%}.content.svelte-h9y88z{flex:1 1 auto;width:100%;height:100px}.content.svelte-h9y88z>div.svelte-h9y88z{height:100%;width:100%}.topnavitem.svelte-h9y88z{cursor:pointer;color:var(--slate);padding:0px 15px}.topnavitem.svelte-h9y88z:hover{color:var(--secondary75)}.active.svelte-h9y88z{color:var(--secondary100)} .root.svelte-fkeby9{height:100%;width:100%;display:flex;flex-direction:column}.top-nav.svelte-fkeby9{flex:0 0 auto;height:25px;background:white;border-style:solid;border-width:0px 0px 1px 0px;border-color:var(--lightslate);padding:5px;width:100%}.content.svelte-fkeby9{flex:1 1 auto;width:100%;height:100px}.content.svelte-fkeby9>div.svelte-fkeby9{height:100%;width:100%}.topnavitem.svelte-fkeby9{cursor:pointer;color:var(--slate);padding:0px 15px}.topnavitem.svelte-fkeby9:hover{color:var(--secondary75)}.active.svelte-fkeby9{color:var(--secondary100)}
.root.svelte-jymnqv{position:fixed;margin:0 auto;text-align:center;top:20%;width:100%}.inner.svelte-jymnqv{display:inline-block;margin:auto}.logo.svelte-jymnqv{width:300px;margin-bottom:40px}.root.svelte-jymnqv .option{width:250px}.app-link.svelte-jymnqv{margin-top:10px;display:block} .root.svelte-e4n7zy{position:fixed;margin:0 auto;text-align:center;top:20%;width:100%}.inner.svelte-e4n7zy{display:inline-block;margin:auto}.logo.svelte-e4n7zy{width:300px;margin-bottom:40px}.root.svelte-e4n7zy .option{width:250px}.app-link.svelte-e4n7zy{margin-top:10px;display:block}
.root.svelte-tavaga{height:100%;display:flex}.content.svelte-tavaga{flex:1 1 auto;height:100%;background-color:var(--white);margin:0}.nav.svelte-tavaga{flex:0 1 auto;width:300px;height:100%} .root.svelte-q8uz1n{height:100%;display:flex}.content.svelte-q8uz1n{flex:1 1 auto;height:100%;background-color:var(--white);margin:0}.nav.svelte-q8uz1n{flex:0 1 auto;width:300px;height:100%}
.root.svelte-1rbfs7z{display:grid;grid-template-columns:[uiNav] 250px [preview] auto [properties] 300px;height:100%;width:100%}.ui-nav.svelte-1rbfs7z{grid-column-start:uiNav;background-color:var(--primary10);height:100%}.properties-pane.svelte-1rbfs7z{grid-column-start:properties;background-color:var(--primary10);height:100%}.pages-list-container.svelte-1rbfs7z{padding-top:20px}.nav-group-header.svelte-1rbfs7z{font-size:10pt;padding-left:10px}.nav-items-container.svelte-1rbfs7z{padding-top:10px}.nav-group-header.svelte-1rbfs7z{display:grid;grid-template-columns:[icon] auto [title] 1fr [button] auto;padding:10px 2px 0px 7px}.nav-group-header.svelte-1rbfs7z>div.svelte-1rbfs7z:nth-child(1){padding:0px 7px 0px 0px;vertical-align:bottom;grid-column-start:icon;margin-right:5px}.nav-group-header.svelte-1rbfs7z>span.svelte-1rbfs7z:nth-child(2){margin-left:5px;vertical-align:bottom;grid-column-start:title;margin-top:auto}.nav-group-header.svelte-1rbfs7z>div.svelte-1rbfs7z:nth-child(3){vertical-align:bottom;grid-column-start:button;cursor:pointer;color:var(--slate)}.nav-group-header.svelte-1rbfs7z>div.svelte-1rbfs7z:nth-child(3):hover{color:var(--primary75)} button.svelte-bxuckr{border-style:none;background-color:rgba(0,0,0,0);cursor:pointer;outline:none}button.svelte-bxuckr:hover{color:var(--hovercolor)}button.svelte-bxuckr:active{outline:none}
.border-normal.svelte-p1bw3l{border-radius:var(--borderradiusall)}.border-left.svelte-p1bw3l{border-radius:var(--borderradius) 0 0 var(--borderradius)}.border-right.svelte-p1bw3l{border-radius:0 var(--borderradius) var(--borderradius) 0}.border-middle.svelte-p1bw3l{border-radius:0}button.svelte-p1bw3l{border-style:solid;padding:7.5px 15px;cursor:pointer;margin:5px;border-radius:5px}.primary.svelte-p1bw3l{background-color:var(--primary100);border-color:var(--primary100);color:var(--white)}.primary.svelte-p1bw3l:hover{background-color:var(--primary75);border-color:var(--primary75)}.primary.svelte-p1bw3l:active{background-color:var(--primarydark);border-color:var(--primarydark)}.primary-outline.svelte-p1bw3l{background-color:var(--white);border-color:var(--primary100);color:var(--primary100)}.primary-outline.svelte-p1bw3l:hover{background-color:var(--primary10)}.primary-outline.svelte-p1bw3l:pressed{background-color:var(--primary25)}.secondary.svelte-p1bw3l{background-color:var(--secondary100);border-color:var(--secondary100);color:var(--white)}.secondary.svelte-p1bw3l:hover{background-color:var(--secondary75);border-color:var(--secondary75)}.secondary.svelte-p1bw3l:pressed{background-color:var(--secondarydark);border-color:var(--secondarydark)}.secondary-outline.svelte-p1bw3l{background-color:var(--white);border-color:var(--secondary100);color:var(--secondary100)}.secondary-outline.svelte-p1bw3l:hover{background-color:var(--secondary10)}.secondary-outline.svelte-p1bw3l:pressed{background-color:var(--secondary25)}.success.svelte-p1bw3l{background-color:var(--success100);border-color:var(--success100);color:var(--white)}.success.svelte-p1bw3l:hover{background-color:var(--success75);border-color:var(--success75)}.success.svelte-p1bw3l:pressed{background-color:var(--successdark);border-color:var(--successdark)}.success-outline.svelte-p1bw3l{background-color:var(--white);border-color:var(--success100);color:var(--success100)}.success-outline.svelte-p1bw3l:hover{background-color:var(--success10)}.success-outline.svelte-p1bw3l:pressed{background-color:var(--success25)}.deletion.svelte-p1bw3l{background-color:var(--deletion100);border-color:var(--deletion100);color:var(--white)}.deletion.svelte-p1bw3l:hover{background-color:var(--deletion75);border-color:var(--deletion75)}.deletion.svelte-p1bw3l:pressed{background-color:var(--deletiondark);border-color:var(--deletiondark)}.deletion-outline.svelte-p1bw3l{background-color:var(--white);border-color:var(--deletion100);color:var(--deletion100)}.deletion-outline.svelte-p1bw3l:hover{background-color:var(--deletion10)}.deletion-outline.svelte-p1bw3l:pressed{background-color:var(--deletion25)} .root.svelte-1dih19s{display:grid;grid-template-columns:[uiNav] 250px [preview] auto [properties] 300px;height:100%;width:100%}.ui-nav.svelte-1dih19s{grid-column-start:uiNav;background-color:var(--primary10);height:100%}.properties-pane.svelte-1dih19s{grid-column-start:properties;background-color:var(--primary10);height:100%}.pages-list-container.svelte-1dih19s{padding-top:20px}.nav-group-header.svelte-1dih19s{font-size:10pt;padding-left:10px}.nav-items-container.svelte-1dih19s{padding-top:10px}.nav-group-header.svelte-1dih19s{display:grid;grid-template-columns:[icon] auto [title] 1fr [button] auto;padding:10px 2px 0px 7px}.nav-group-header.svelte-1dih19s>div.svelte-1dih19s:nth-child(1){padding:0px 7px 0px 0px;vertical-align:bottom;grid-column-start:icon;margin-right:5px}.nav-group-header.svelte-1dih19s>span.svelte-1dih19s:nth-child(2){margin-left:5px;vertical-align:bottom;grid-column-start:title;margin-top:auto}.nav-group-header.svelte-1dih19s>div.svelte-1dih19s:nth-child(3){vertical-align:bottom;grid-column-start:button;cursor:pointer;color:var(--slate)}.nav-group-header.svelte-1dih19s>div.svelte-1dih19s:nth-child(3):hover{color:var(--primary75)}
button.svelte-4po3k2{border-style:none;background-color:rgba(0,0,0,0);cursor:pointer;outline:none}button.svelte-4po3k2:hover{color:var(--hovercolor)}button.svelte-4po3k2:active{outline:none} .border-normal.svelte-vnon4v{border-radius:var(--borderradiusall)}.border-left.svelte-vnon4v{border-radius:var(--borderradius) 0 0 var(--borderradius)}.border-right.svelte-vnon4v{border-radius:0 var(--borderradius) var(--borderradius) 0}.border-middle.svelte-vnon4v{border-radius:0}button.svelte-vnon4v{border-style:solid;padding:7.5px 15px;cursor:pointer;margin:5px;border-radius:5px}.primary.svelte-vnon4v{background-color:var(--primary100);border-color:var(--primary100);color:var(--white)}.primary.svelte-vnon4v:hover{background-color:var(--primary75);border-color:var(--primary75)}.primary.svelte-vnon4v:active{background-color:var(--primarydark);border-color:var(--primarydark)}.primary-outline.svelte-vnon4v{background-color:var(--white);border-color:var(--primary100);color:var(--primary100)}.primary-outline.svelte-vnon4v:hover{background-color:var(--primary10)}.primary-outline.svelte-vnon4v:pressed{background-color:var(--primary25)}.secondary.svelte-vnon4v{background-color:var(--secondary100);border-color:var(--secondary100);color:var(--white)}.secondary.svelte-vnon4v:hover{background-color:var(--secondary75);border-color:var(--secondary75)}.secondary.svelte-vnon4v:pressed{background-color:var(--secondarydark);border-color:var(--secondarydark)}.secondary-outline.svelte-vnon4v{background-color:var(--white);border-color:var(--secondary100);color:var(--secondary100)}.secondary-outline.svelte-vnon4v:hover{background-color:var(--secondary10)}.secondary-outline.svelte-vnon4v:pressed{background-color:var(--secondary25)}.success.svelte-vnon4v{background-color:var(--success100);border-color:var(--success100);color:var(--white)}.success.svelte-vnon4v:hover{background-color:var(--success75);border-color:var(--success75)}.success.svelte-vnon4v:pressed{background-color:var(--successdark);border-color:var(--successdark)}.success-outline.svelte-vnon4v{background-color:var(--white);border-color:var(--success100);color:var(--success100)}.success-outline.svelte-vnon4v:hover{background-color:var(--success10)}.success-outline.svelte-vnon4v:pressed{background-color:var(--success25)}.deletion.svelte-vnon4v{background-color:var(--deletion100);border-color:var(--deletion100);color:var(--white)}.deletion.svelte-vnon4v:hover{background-color:var(--deletion75);border-color:var(--deletion75)}.deletion.svelte-vnon4v:pressed{background-color:var(--deletiondark);border-color:var(--deletiondark)}.deletion-outline.svelte-vnon4v{background-color:var(--white);border-color:var(--deletion100);color:var(--deletion100)}.deletion-outline.svelte-vnon4v:hover{background-color:var(--deletion10)}.deletion-outline.svelte-vnon4v:pressed{background-color:var(--deletion25)}
h4.svelte-o0id5a{margin-top:20px} h4.svelte-sqtlby{margin-top:20px}
.root.svelte-85bkcq{height:100%;position:relative}.actions-header.svelte-85bkcq{flex:0 1 auto}.node-view.svelte-85bkcq{overflow-y:auto;flex:1 1 auto} .root.svelte-apja7r{height:100%;position:relative}.actions-header.svelte-apja7r{flex:0 1 auto}.node-view.svelte-apja7r{overflow-y:auto;flex:1 1 auto}
.root.svelte-pdeftd{height:100%;background-color:var(--secondary5)}.items-root.svelte-pdeftd{display:flex;flex-direction:column;max-height:100%;height:10px}.hierarchy.svelte-pdeftd{flex:1 1 auto}.hierarchy-title-row.svelte-pdeftd{padding:2rem 1rem 0rem 1rem;font-size:10pt;display:flex;font-weight:bold}.hierarchy-title.svelte-pdeftd{flex:auto 1 1}.space-filler.svelte-pdeftd{flex:1 1 auto} .root.svelte-1ywqvdl{height:100%;background-color:var(--secondary5)}.items-root.svelte-1ywqvdl{display:flex;flex-direction:column;max-height:100%;height:10px}.hierarchy.svelte-1ywqvdl{flex:1 1 auto}.hierarchy-title-row.svelte-1ywqvdl{padding:2rem 1rem 0rem 1rem;font-size:10pt;display:flex;font-weight:bold}.hierarchy-title.svelte-1ywqvdl{flex:auto 1 1}.space-filler.svelte-1ywqvdl{flex:1 1 auto}
.root.svelte-1y6dy5x{padding:10px} .root.svelte-zzs4qg{padding:10px}
.root.svelte-1iwq1b2{padding-bottom:10px;padding-left:10px;font-size:16px;color:var(--secondary50)}.hierarchy-item.svelte-1iwq1b2{cursor:pointer;padding:5px 0px}.hierarchy-item.svelte-1iwq1b2:hover{color:var(--secondary75)}.component.svelte-1iwq1b2{margin-left:5px}.selected.svelte-1iwq1b2{color:var(--primary100)}.title.svelte-1iwq1b2{margin-left:10px} .root.svelte-1qmjs65{padding:10px}.edit-button.svelte-1qmjs65{cursor:pointer;color:var(--white)}tr.svelte-1qmjs65:hover .edit-button.svelte-1qmjs65{color:var(--secondary75)}
.root.svelte-1be865r{padding:10px}.edit-button.svelte-1be865r{cursor:pointer;color:var(--white)}tr.svelte-1be865r:hover .edit-button.svelte-1be865r{color:var(--secondary75)} .root.svelte-1cnqtw{color:var(--secondary50)}.hierarchy-item.svelte-1cnqtw{cursor:pointer;padding:5px 0px}.hierarchy-item.svelte-1cnqtw:hover{color:var(--secondary75)}.component.svelte-1cnqtw{margin-left:5px}.currentfolder.svelte-1cnqtw{color:var(--secondary100)}.selected.svelte-1cnqtw{color:var(--primary100)}.title.svelte-1cnqtw{margin-left:10px}
.root.svelte-1ba51k0{color:var(--secondary50)}.hierarchy-item.svelte-1ba51k0{cursor:pointer;padding:5px 0px}.hierarchy-item.svelte-1ba51k0:hover{color:var(--secondary75)}.component.svelte-1ba51k0{margin-left:5px}.currentfolder.svelte-1ba51k0{color:var(--secondary100)}.selected.svelte-1ba51k0{color:var(--primary100)}.title.svelte-1ba51k0{margin-left:10px} .root.svelte-183dehm{height:100%;border-style:solid;border-color:var(--lightslate);border-width:0px 0px 0px 1px}.padding.svelte-183dehm{padding:0px 5px 0px 10px}.title.svelte-183dehm{background-color:white;padding:3px;display:grid;grid-template-columns:[name] 1fr [actions] auto}.title.svelte-183dehm>div.svelte-183dehm:nth-child(1){grid-column-start:name;color:var(--secondary100)}.title.svelte-183dehm>div.svelte-183dehm:nth-child(2){grid-column-start:actions}.section-header.svelte-183dehm{font-style:italic;color:var(--slate);border-style:solid;border-color:var(--lightslate);border-width:0px 0px 1px 0px}.section-header.svelte-183dehm{vertical-align:middle;margin-top:20px}
.root.svelte-xai2hc{height:100%;border-style:solid;border-color:var(--lightslate);border-width:0px 0px 0px 1px}.padding.svelte-xai2hc{padding:0px 5px 0px 10px}.title.svelte-xai2hc{background-color:white;padding:3px;display:grid;grid-template-columns:[name] 1fr [actions] auto}.title.svelte-xai2hc>div.svelte-xai2hc:nth-child(1){grid-column-start:name;color:var(--secondary100)}.title.svelte-xai2hc>div.svelte-xai2hc:nth-child(2){grid-column-start:actions}.section-header.svelte-xai2hc{font-style:italic;color:var(--slate);border-style:solid;border-color:var(--lightslate);border-width:0px 0px 1px 0px}.section-header.svelte-xai2hc{vertical-align:middle;margin-top:20px} .root.svelte-ffb307{padding-bottom:10px;padding-left:10px;font-size:16px;color:var(--secondary50)}.hierarchy-item.svelte-ffb307{cursor:pointer;padding:5px 0px}.hierarchy-item.svelte-ffb307:hover{color:var(--secondary75)}.component.svelte-ffb307{margin-left:5px}.selected.svelte-ffb307{color:var(--primary100)}.title.svelte-ffb307{margin-left:10px}
h1.svelte-2ukyrk{font-size:1.2em} h1.svelte-16jkjx9{font-size:1.2em}
.section-container.svelte-1t0x31f{padding:15px;border-style:dotted;border-width:1px;border-color:var(--lightslate);border-radius:2px}.section-container.svelte-1t0x31f:nth-child(1){margin-bottom:15px}.row-text.svelte-1t0x31f{margin-right:15px;color:var(--primary100)}input.svelte-1t0x31f{margin-right:15px}p.svelte-1t0x31f>span.svelte-1t0x31f{margin-left:30px}.header.svelte-1t0x31f{display:grid;grid-template-columns:[title] 1fr [icon] auto}.header.svelte-1t0x31f>div.svelte-1t0x31f:nth-child(1){grid-column-start:title}.header.svelte-1t0x31f>div.svelte-1t0x31f:nth-child(2){grid-column-start:icon} .component-preview.svelte-1jir83x{display:grid;grid-template-rows:[top] 1fr [middle] auto [bottom] 1fr;grid-template-columns:[left] 1fr [middle] auto [right] 1fr;grid-column-start:preview;height:100%}.component-container.svelte-1jir83x{grid-row-start:middle;grid-column-start:middle}
.root.svelte-is81a4{padding:15px}.help-text.svelte-is81a4{color:var(--slate);font-size:10pt} .root.svelte-1ersoxu{padding:15px}.help-text.svelte-1ersoxu{color:var(--slate);font-size:10pt}
.component-preview.svelte-1rf8xuh{display:grid;grid-template-rows:[top] 1fr [middle] auto [bottom] 1fr;grid-template-columns:[left] 1fr [middle] auto [right] 1fr;grid-column-start:preview;height:100%}.component-container.svelte-1rf8xuh{grid-row-start:middle;grid-column-start:middle} .section-container.svelte-yk1mmr{padding:15px;border-style:dotted;border-width:1px;border-color:var(--lightslate);border-radius:2px}.section-container.svelte-yk1mmr:nth-child(1){margin-bottom:15px}.row-text.svelte-yk1mmr{margin-right:15px;color:var(--primary100)}input.svelte-yk1mmr{margin-right:15px}p.svelte-yk1mmr>span.svelte-yk1mmr{margin-left:30px}.header.svelte-yk1mmr{display:grid;grid-template-columns:[title] 1fr [icon] auto}.header.svelte-yk1mmr>div.svelte-yk1mmr:nth-child(1){grid-column-start:title}.header.svelte-yk1mmr>div.svelte-yk1mmr:nth-child(2){grid-column-start:icon}
.dropdown-background.svelte-rq5j5s{position:fixed;top:0;left:0;width:100vw;height:100vh}.root.svelte-rq5j5s{cursor:pointer;z-index:1}.dropdown-content.svelte-rq5j5s{position:absolute;background-color:var(--white);min-width:160px;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);z-index:1;font-weight:normal;border-style:solid;border-width:1px;border-color:var(--secondary10)}.dropdown-content.svelte-rq5j5s:not(:focus){display:none}.action-row.svelte-rq5j5s{padding:7px 10px;cursor:pointer}.action-row.svelte-rq5j5s:hover{background-color:var(--primary100);color:var(--white)} .root.svelte-16m6n12{height:100%;padding:2rem}.settings-title.svelte-16m6n12{font-weight:600}.title.svelte-16m6n12{margin:3rem 0rem 0rem 0rem;font-weight:600}.recordkey.svelte-16m6n12{font-size:14px;font-weight:600;color:var(--primary100)}.fields-table.svelte-16m6n12{margin:1rem 1rem 0rem 0rem;border-collapse:collapse}.add-field-button.svelte-16m6n12{cursor:pointer}.edit-button.svelte-16m6n12{cursor:pointer;color:var(--white)}.edit-button.svelte-16m6n12:hover{color:var(--secondary75)}th.svelte-16m6n12{text-align:left}td.svelte-16m6n12{padding:1rem 5rem 1rem 0rem;margin:0}thead.svelte-16m6n12>tr.svelte-16m6n12{border-width:0px 0px 1px 0px;border-style:solid;border-color:var(--secondary75);margin-bottom:20px}tbody.svelte-16m6n12>tr.svelte-16m6n12{border-width:0px 0px 1px 0px;border-style:solid;border-color:var(--primary10)}tbody.svelte-16m6n12>tr.svelte-16m6n12:hover{background-color:var(--primary10)}tbody.svelte-16m6n12>tr:hover .edit-button.svelte-16m6n12{color:var(--secondary75)}.index-container.svelte-16m6n12{border-style:solid;border-width:0 0 1px 0;border-color:var(--secondary25);padding:10px;margin-bottom:5px}.index-label.svelte-16m6n12{color:var(--slate)}.index-name.svelte-16m6n12{font-weight:bold;color:var(--primary100)}.index-container.svelte-16m6n12 code.svelte-16m6n12{margin:0;display:inline;background-color:var(--primary10);color:var(--secondary100);padding:3px}.index-field-row.svelte-16m6n12{margin:1rem 0rem 0rem 0rem}.no-indexes.svelte-16m6n12{margin:1rem 0rem 0rem 0rem;font-family:var(--fontnormal);font-size:14px}
.root.svelte-17w6x7f{height:100%;padding:2rem}.settings-title.svelte-17w6x7f{font-weight:600}.title.svelte-17w6x7f{margin:3rem 0rem 0rem 0rem;font-weight:600}.recordkey.svelte-17w6x7f{font-size:14px;font-weight:600;color:var(--primary100)}.fields-table.svelte-17w6x7f{margin:1rem 1rem 0rem 0rem;border-collapse:collapse}.add-field-button.svelte-17w6x7f{cursor:pointer}.edit-button.svelte-17w6x7f{cursor:pointer;color:var(--white)}.edit-button.svelte-17w6x7f:hover{color:var(--secondary75)}th.svelte-17w6x7f{text-align:left}td.svelte-17w6x7f{padding:1rem 5rem 1rem 0rem;margin:0}thead.svelte-17w6x7f>tr.svelte-17w6x7f{border-width:0px 0px 1px 0px;border-style:solid;border-color:var(--secondary75);margin-bottom:20px}tbody.svelte-17w6x7f>tr.svelte-17w6x7f{border-width:0px 0px 1px 0px;border-style:solid;border-color:var(--primary10)}tbody.svelte-17w6x7f>tr.svelte-17w6x7f:hover{background-color:var(--primary10)}tbody.svelte-17w6x7f>tr:hover .edit-button.svelte-17w6x7f{color:var(--secondary75)}.index-container.svelte-17w6x7f{border-style:solid;border-width:0 0 1px 0;border-color:var(--secondary25);padding:10px;margin-bottom:5px}.index-label.svelte-17w6x7f{color:var(--slate)}.index-name.svelte-17w6x7f{font-weight:bold;color:var(--primary100)}.index-container.svelte-17w6x7f code.svelte-17w6x7f{margin:0;display:inline;background-color:var(--primary10);color:var(--secondary100);padding:3px}.index-field-row.svelte-17w6x7f{margin:1rem 0rem 0rem 0rem}.no-indexes.svelte-17w6x7f{margin:1rem 0rem 0rem 0rem;font-family:var(--fontnormal);font-size:14px} .root.svelte-b3063u{display:block;font-size:1rem;width:100%;cursor:pointer}.title.svelte-b3063u{font:var(--fontblack);padding-top:10px;padding-right:5px;padding-bottom:10px;color:var(--secondary100)}.title.svelte-b3063u:hover{background-color:var(--secondary10)}
.root.svelte-1fkfoam{height:100%;padding:15px}.allowed-records.svelte-1fkfoam{margin:20px 0px}.allowed-records.svelte-1fkfoam>span.svelte-1fkfoam{margin-right:30px} .root.svelte-wgyofl{padding:1.5rem;width:100%;align-items:right}
.root.svelte-1xd1rdl{display:block;font-size:1rem;width:100%;cursor:pointer}.title.svelte-1xd1rdl{font:var(--fontblack);padding-top:10px;padding-right:5px;padding-bottom:10px;color:var(--secondary100)}.title.svelte-1xd1rdl:hover{background-color:var(--secondary10)} .root.svelte-pq2tmv{height:100%;padding:15px}.allowed-records.svelte-pq2tmv{margin:20px 0px}.allowed-records.svelte-pq2tmv>span.svelte-pq2tmv{margin-right:30px}
.root.svelte-1k0qm{display:block;font-size:10pt;width:100%;cursor:pointer}.title.svelte-1k0qm{padding-top:.5rem;padding-right:.5rem;color:var(--secondary100)}.title.svelte-1k0qm:hover{background-color:var(--secondary10)}.active.svelte-1k0qm{background-color:var(--primary10)} .dropdown-background.svelte-11ifkop{position:fixed;top:0;left:0;width:100vw;height:100vh}.root.svelte-11ifkop{cursor:pointer;z-index:1}.dropdown-content.svelte-11ifkop{position:absolute;background-color:var(--white);min-width:160px;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);z-index:1;font-weight:normal;border-style:solid;border-width:1px;border-color:var(--secondary10)}.dropdown-content.svelte-11ifkop:not(:focus){display:none}.action-row.svelte-11ifkop{padding:7px 10px;cursor:pointer}.action-row.svelte-11ifkop:hover{background-color:var(--primary100);color:var(--white)}
.root.svelte-1qdntd{padding:1.5rem;width:100%;align-items:right} .root.svelte-3fdbwl{display:block;font-size:10pt;width:100%;cursor:pointer}.title.svelte-3fdbwl{padding-top:.5rem;padding-right:.5rem;color:var(--secondary100)}.title.svelte-3fdbwl:hover{background-color:var(--secondary10)}.active.svelte-3fdbwl{background-color:var(--primary10)}
.nav-item.svelte-ys4cw{padding:1rem 1rem 0rem 1rem;font-size:10pt;font-weight:bold;cursor:pointer;flex:0 0 auto}.nav-item.svelte-ys4cw:hover{background-color:var(--primary10)}.active.svelte-ys4cw{background-color:var(--primary10)} .nav-item.svelte-1ld5h6g{padding:1rem 1rem 0rem 1rem;font-size:10pt;font-weight:bold;cursor:pointer;flex:0 0 auto}.nav-item.svelte-1ld5h6g:hover{background-color:var(--primary10)}.active.svelte-1ld5h6g{background-color:var(--primary10)}
.root.svelte-d6wwkb{display:flex}.root.svelte-d6wwkb:last-child{border-radius:0 var(--borderradius) var(--borderradius) 0}.root.svelte-d6wwkb:first-child{border-radius:var(--borderradius) 0 0 var(--borderradius)}.root.svelte-d6wwkb:not(:first-child):not(:last-child){border-radius:0} .root.svelte-x3bf9z{display:flex}.root.svelte-x3bf9z:last-child{border-radius:0 var(--borderradius) var(--borderradius) 0}.root.svelte-x3bf9z:first-child{border-radius:var(--borderradius) 0 0 var(--borderradius)}.root.svelte-x3bf9z:not(:first-child):not(:last-child){border-radius:0}
.edit-button.svelte-1le5bpl{cursor:pointer;color:var(--white)}tr.svelte-1le5bpl:hover .edit-button.svelte-1le5bpl{color:var(--secondary75)} .edit-button.svelte-9z4fqi{cursor:pointer;color:var(--white)}tr.svelte-9z4fqi:hover .edit-button.svelte-9z4fqi{color:var(--secondary75)}
.edit-button.svelte-12jzg4k{cursor:pointer;color:var(--white)}tr.svelte-12jzg4k:hover .edit-button.svelte-12jzg4k{color:var(--secondary75)} .edit-button.svelte-neetem{cursor:pointer;color:var(--white)}tr.svelte-neetem:hover .edit-button.svelte-neetem{color:var(--secondary75)}
.root.svelte-beukw7{font-size:10pt}.padding.svelte-beukw7{padding:0 10px}.inherited-title.svelte-beukw7{margin-top:40px;display:grid;grid-template-columns:[name] 1fr [actions] auto;border-style:solid;border-width:0px 0px 1px 0px;border-color:var(--lightslate);font-style:italic}.inherited-title.svelte-beukw7>div.svelte-beukw7:nth-child(1){grid-column-start:name;color:var(--slate)}.inherited-title.svelte-beukw7>div.svelte-beukw7:nth-child(2){grid-column-start:actions;color:var(--secondary100)} .root.svelte-1sxai5n{font-size:10pt}.padding.svelte-1sxai5n{padding:0 10px}.inherited-title.svelte-1sxai5n{margin-top:40px;display:grid;grid-template-columns:[name] 1fr [actions] auto;border-style:solid;border-width:0px 0px 1px 0px;border-color:var(--lightslate);font-style:italic}.inherited-title.svelte-1sxai5n>div.svelte-1sxai5n:nth-child(1){grid-column-start:name;color:var(--slate)}.inherited-title.svelte-1sxai5n>div.svelte-1sxai5n:nth-child(2){grid-column-start:actions;color:var(--secondary100)}
.info-text.svelte-um9cf7{font-size:0.8em;color:var(--slate)} .info-text.svelte-y0b7l0{font-size:0.8em;color:var(--slate)}
.title.svelte-1pp53c5{padding:3px;background-color:white;color:var(--secondary100);border-style:solid;border-width:1px 0 0 0;border-color:var(--lightslate)}.title.svelte-1pp53c5>span.svelte-1pp53c5{margin-left:10px} .title.svelte-dhe1ge{padding:3px;background-color:white;color:var(--secondary100);border-style:solid;border-width:1px 0 0 0;border-color:var(--lightslate)}.title.svelte-dhe1ge>span.svelte-dhe1ge{margin-left:10px}
.component.svelte-13tuzj8{padding:5px;border-style:solid;border-width:0 0 1px 0;border-color:var(--lightslate);cursor:pointer}.component.svelte-13tuzj8:hover{background-color:var(--primary10)}.component.svelte-13tuzj8>.title.svelte-13tuzj8{font-size:13pt;color:var(--secondary100)}.component.svelte-13tuzj8>.description.svelte-13tuzj8{font-size:10pt;color:var(--primary75);font-style:italic} .component.svelte-qxar5p{padding:5px;border-style:solid;border-width:0 0 1px 0;border-color:var(--lightslate);cursor:pointer}.component.svelte-qxar5p:hover{background-color:var(--primary10)}.component.svelte-qxar5p>.title.svelte-qxar5p{font-size:13pt;color:var(--secondary100)}.component.svelte-qxar5p>.description.svelte-qxar5p{font-size:10pt;color:var(--primary75);font-style:italic}
textarea.svelte-1iox4u1{padding:3px;margin-top:5px;margin-bottom:10px;background:var(--lightslate);color:var(--white);font-family:'Courier New', Courier, monospace;width:95%;height:100px;border-radius:5px} .error-container.svelte-ole1mk{padding:10px;border-style:solid;border-color:var(--deletion100);border-radius:var(--borderradiusall);background:var(--deletion75)}.error-row.svelte-ole1mk{padding:5px 0px}
.error-container.svelte-jwy920{padding:10px;border-style:solid;border-color:var(--deletion100);border-radius:var(--borderradiusall);background:var(--deletion75)}.error-row.svelte-jwy920{padding:5px 0px} textarea.svelte-di7k4b{padding:3px;margin-top:5px;margin-bottom:10px;background:var(--lightslate);color:var(--white);font-family:'Courier New', Courier, monospace;width:95%;height:100px;border-radius:5px}
.root.svelte-emcy8y{padding:10px}.option-container.svelte-emcy8y{border-style:dotted;border-width:1px;border-color:var(--primary75);padding:3px;margin-right:5px} .root.svelte-bv289q{padding:10px}.option-container.svelte-bv289q{border-style:dotted;border-width:1px;border-color:var(--primary75);padding:3px;margin-right:5px}
.root.svelte-woqcuf{display:grid;grid-template-columns:[name] 1fr [actions] auto}.root.svelte-woqcuf>div.svelte-woqcuf:nth-child(1){grid-column-start:name;color:var(--secondary50)}.root.svelte-woqcuf>div.svelte-woqcuf:nth-child(2){grid-column-start:actions}.selectedname.svelte-woqcuf{font-weight:bold;color:var(--secondary)} input.svelte-9fre0g{margin-right:7px}
input.svelte-66516k{margin-right:7px} .root.svelte-1el8vet{padding:3px 5px 7px 10px;border-style:dotted;border-width:0 0 1px 0;border-color:var(--primary25)}.prop-label.svelte-1el8vet{font-size:0.9em;color:var(--primary100);font-weight:bold}
.root.svelte-w5on8s{padding:3px 5px 7px 10px;border-style:dotted;border-width:0 0 1px 0;border-color:var(--primary25)} .root.svelte-ogh8o0{display:grid;grid-template-columns:[name] 1fr [actions] auto}.root.svelte-ogh8o0>div.svelte-ogh8o0:nth-child(1){grid-column-start:name;color:var(--secondary50)}.root.svelte-ogh8o0>div.svelte-ogh8o0:nth-child(2){grid-column-start:actions}.selectedname.svelte-ogh8o0{font-weight:bold;color:var(--secondary)}
textarea.svelte-1wfv4cc{width:300px;height:200px} textarea.svelte-1kv2xk7{width:300px;height:200px}
.addelement-container.svelte-jliz3p{cursor:pointer;padding:3px 0px;text-align:center}.addelement-container.svelte-jliz3p:hover{background-color:var(--primary25)}.item-container.svelte-jliz3p{padding-left:3px;background:var(--secondary10)} .addelement-container.svelte-199q8jr{cursor:pointer;padding:3px 0px;text-align:center}.addelement-container.svelte-199q8jr:hover{background-color:var(--primary25)}.item-container.svelte-199q8jr{padding-left:3px;background:var(--secondary10)}
.addelement-container.svelte-r1ft9p{cursor:pointer;padding:3px 0px;text-align:center}.addelement-container.svelte-r1ft9p:hover{background-color:var(--primary25);margin-top:5px}.control-container.svelte-r1ft9p{padding-left:3px;background:var(--secondary10)}.separator.svelte-r1ft9p{width:60%;margin:10px auto;border-style:solid;border-width:1px 0 0 0;border-color:var(--primary25)}
.type-selector-container.svelte-1b6pj9u{display:flex}.type-selector.svelte-1b6pj9u{border-color:var(--primary50);border-radius:2px;width:50px;flex:1 0 auto}
.unbound-container.svelte-1fe5d1g{display:flex}.unbound-container.svelte-1fe5d1g>input.svelte-1fe5d1g{width:auto}.bound-header.svelte-1fe5d1g{display:flex}.bound-header.svelte-1fe5d1g>div.svelte-1fe5d1g:nth-child(1){flex:1 0 auto;width:30px;color:var(--darkslate);padding-left:5px}.binding-prop-label.svelte-1fe5d1g{color:var(--darkslate)}
.unbound-container.svelte-18ig4tf{display:flex}.unbound-container.svelte-18ig4tf>.svelte-18ig4tf:nth-child(1){width:auto;flex:1 0 auto}.bound-header.svelte-18ig4tf{display:flex}.bound-header.svelte-18ig4tf>div.svelte-18ig4tf:nth-child(1){flex:1 0 auto;width:30px;color:var(--darkslate);padding-left:5px;font-style:italic}.binding-prop-label.svelte-18ig4tf{color:var(--darkslate)}
/*# sourceMappingURL=bundle.css.map */ /*# sourceMappingURL=bundle.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,8 @@
"contentText": { "type": "string", "default": "Button" }, "contentText": { "type": "string", "default": "Button" },
"contentComponent": "component", "contentComponent": "component",
"className": {"type": "string", "default": "default"}, "className": {"type": "string", "default": "default"},
"disabled": "bool" "disabled": "bool",
"onClick": "event"
}, },
"tags": ["button"] "tags": ["button"]
}, },

View File

@ -16,7 +16,7 @@ $:{
</script> </script>
<button class={className} {disabled} on:click> <button class={className} {disabled} on:click={onClick}>
{#if contentComponent && contentComponent._component} {#if contentComponent && contentComponent._component}
<div bind:this={contentComponentContainer}> <div bind:this={contentComponentContainer}>
</div> </div>

View File

@ -1,6 +1,6 @@
export {default as button} from "./Button.svelte"; export {default as button} from "./Button.svelte";
export {default as login} from "./Login.svelte"; export {default as login} from "./Login.svelte";
export {default as form} from "./Form.svelte"; export {default as form} from "./Form.svelte";
export {default as formControl} from "./FormControl.svelte"; export {default as grid} from "./Grid.svelte";
export {default as textbox} from "./Textbox.svelte"; export {default as textbox} from "./Textbox.svelte";
export {default as stackpanel} from "./StackPanel.svelte"; export {default as stackpanel} from "./StackPanel.svelte";