windmill-components 1.82.1 → 1.82.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/components/Multiselect.svelte.d.ts +2 -2
  2. package/components/apps/components/buttons/AppButton.svelte +16 -2
  3. package/components/apps/components/buttons/AppForm.svelte +9 -2
  4. package/components/apps/components/buttons/AppFormButton.svelte +82 -59
  5. package/components/apps/components/display/PlotlyHtml.svelte +1 -1
  6. package/components/apps/components/display/table/AppTable.svelte +8 -15
  7. package/components/apps/components/helpers/RunnableComponent.svelte +6 -9
  8. package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +0 -1
  9. package/components/apps/components/helpers/RunnableWrapper.svelte +0 -2
  10. package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +0 -1
  11. package/components/apps/editor/AppEditor.svelte +12 -14
  12. package/components/apps/editor/AppPreview.svelte +2 -1
  13. package/components/apps/editor/component/Component.svelte +1 -1
  14. package/components/apps/editor/component/README.md +0 -4
  15. package/components/apps/editor/componentsPanel/CssProperty.svelte +47 -87
  16. package/components/apps/editor/componentsPanel/CssProperty.svelte.d.ts +2 -5
  17. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +14 -24
  18. package/components/apps/editor/settingsPanel/inputEditor/ColorInput.svelte +12 -12
  19. package/components/apps/editor/settingsPanel/inputEditor/ColorInput.svelte.d.ts +2 -3
  20. package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +1 -1
  21. package/components/apps/types.d.ts +1 -2
  22. package/components/common/button/ButtonPopup.svelte +2 -5
  23. package/components/common/button/ButtonPopup.svelte.d.ts +1 -5
  24. package/components/common/button/ButtonPopupItem.svelte +1 -2
  25. package/components/common/button/ButtonPopupItem.svelte.d.ts +0 -1
  26. package/components/common/index.d.ts +0 -1
  27. package/components/common/index.js +0 -1
  28. package/components/common/kbd/Kbd.svelte +1 -4
  29. package/components/common/kbd/Kbd.svelte.d.ts +14 -6
  30. package/components/common/menu/Menu.svelte +2 -8
  31. package/components/common/menu/Menu.svelte.d.ts +1 -4
  32. package/package.json +1 -11
  33. package/utils.d.ts +0 -1
  34. package/utils.js +0 -3
  35. package/components/apps/editor/componentsPanel/QuickStyleMenu.svelte +0 -167
  36. package/components/apps/editor/componentsPanel/QuickStyleMenu.svelte.d.ts +0 -18
  37. package/components/apps/editor/componentsPanel/QuickStyleProperty.svelte +0 -130
  38. package/components/apps/editor/componentsPanel/QuickStyleProperty.svelte.d.ts +0 -21
  39. package/components/apps/editor/componentsPanel/quickStyleProperties.d.ts +0 -535
  40. package/components/apps/editor/componentsPanel/quickStyleProperties.js +0 -595
  41. package/components/apps/editor/settingsPanel/StylePanel.svelte +0 -23
  42. package/components/apps/editor/settingsPanel/StylePanel.svelte.d.ts +0 -17
  43. package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +0 -47
  44. package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte.d.ts +0 -14
  45. package/components/apps/editor/settingsPanel/secondaryMenu/index.d.ts +0 -2
  46. package/components/apps/editor/settingsPanel/secondaryMenu/index.js +0 -2
  47. package/components/apps/editor/settingsPanel/secondaryMenu/menuStore.d.ts +0 -12
  48. package/components/apps/editor/settingsPanel/secondaryMenu/menuStore.js +0 -10
  49. package/components/common/clearableInput/ClearableInput.svelte +0 -56
  50. package/components/common/clearableInput/ClearableInput.svelte.d.ts +0 -28
  51. package/components/common/modal/AlwaysMountedModal.svelte +0 -109
  52. package/components/common/modal/AlwaysMountedModal.svelte.d.ts +0 -22
@@ -4,8 +4,8 @@
4
4
  export default class Multiselect extends SvelteComponentTyped<{
5
5
  value?: any[] | undefined;
6
6
  id?: string | undefined;
7
- placeholder?: string | undefined;
8
7
  readonly?: boolean | undefined;
8
+ placeholder?: string | undefined;
9
9
  }, {
10
10
  [evt: string]: CustomEvent<any>;
11
11
  }, {
@@ -20,8 +20,8 @@ declare const __propDef: {
20
20
  props: {
21
21
  value?: any[] | undefined;
22
22
  id?: string | undefined;
23
- placeholder?: string | undefined;
24
23
  readonly?: boolean | undefined;
24
+ placeholder?: string | undefined;
25
25
  };
26
26
  events: {
27
27
  [evt: string]: CustomEvent<any>;
@@ -32,6 +32,8 @@ if (controls) {
32
32
  $componentControl[id] = controls;
33
33
  }
34
34
  let runnableComponent;
35
+ let isLoading = false;
36
+ let ownClick = false;
35
37
  let beforeIconComponent;
36
38
  let afterIconComponent;
37
39
  $: resolvedConfig.beforeIcon && handleBeforeIcon();
@@ -47,6 +49,19 @@ async function handleAfterIcon() {
47
49
  }
48
50
  }
49
51
  $: resolvedConfig?.triggerOnAppLoad && runnableComponent?.runComponent();
52
+ $: if (outputs?.loading != undefined) {
53
+ outputs.loading.set(false, true);
54
+ }
55
+ $: outputs?.loading.subscribe({
56
+ id: 'loading-' + id,
57
+ next: (value) => {
58
+ isLoading = value;
59
+ if (ownClick && !value) {
60
+ ownClick = false;
61
+ }
62
+ }
63
+ });
64
+ $: loading = isLoading && ownClick;
50
65
  let errors = {};
51
66
  $: errorsMessage = Object.values(errors)
52
67
  .filter((x) => x != '')
@@ -59,6 +74,7 @@ async function handleClick(event) {
59
74
  if (preclickAction) {
60
75
  await preclickAction();
61
76
  }
77
+ ownClick = true;
62
78
  if (!runnableComponent) {
63
79
  runnableWrapper.onSuccess();
64
80
  }
@@ -66,7 +82,6 @@ async function handleClick(event) {
66
82
  await runnableComponent?.runComponent();
67
83
  }
68
84
  }
69
- let loading = false;
70
85
  </script>
71
86
 
72
87
  {#each Object.keys(components['buttoncomponent'].initialData.configuration) as key (key)}
@@ -85,7 +100,6 @@ let loading = false;
85
100
  bind:this={runnableWrapper}
86
101
  {recomputeIds}
87
102
  bind:runnableComponent
88
- bind:loading
89
103
  {componentInput}
90
104
  doOnSuccess={resolvedConfig.onSuccess}
91
105
  {id}
@@ -28,8 +28,16 @@ let isLoading = false;
28
28
  $: noInputs =
29
29
  $stateId != undefined &&
30
30
  (componentInput?.type != 'runnable' || Object.keys(componentInput?.fields ?? {}).length == 0);
31
+ $: if (outputs?.loading != undefined) {
32
+ outputs.loading.set(false, true);
33
+ }
34
+ $: outputs?.loading.subscribe({
35
+ id: 'loading-' + id,
36
+ next: (value) => {
37
+ isLoading = value;
38
+ }
39
+ });
31
40
  $: css = concatCustomCss($app.css?.formcomponent, customCss);
32
- let loading = false;
33
41
  </script>
34
42
 
35
43
  {#each Object.keys(components['formcomponent'].initialData.configuration) as key (key)}
@@ -45,7 +53,6 @@ let loading = false;
45
53
  {recomputeIds}
46
54
  {render}
47
55
  bind:runnableComponent
48
- bind:loading
49
56
  {componentInput}
50
57
  {id}
51
58
  doOnSuccess={resolvedConfig.onSuccess}
@@ -3,12 +3,14 @@ import { faUser } from '@fortawesome/free-solid-svg-icons';
3
3
  import { getContext } from 'svelte';
4
4
  import { Icon } from 'svelte-awesome';
5
5
  import AlignWrapper from '../helpers/AlignWrapper.svelte';
6
+ import InputValue from '../helpers/InputValue.svelte';
6
7
  import RunnableWrapper from '../helpers/RunnableWrapper.svelte';
8
+ import Portal from 'svelte-portal';
9
+ import Modal from '../../../common/modal/Modal.svelte';
7
10
  import { concatCustomCss } from '../../utils';
8
11
  import { initConfig, initOutput } from '../../editor/appUtils';
9
12
  import { components } from '../../editor/component';
10
13
  import ResolveConfig from '../helpers/ResolveConfig.svelte';
11
- import AlwaysMountedModal, { getModal } from '../../../common/modal/AlwaysMountedModal.svelte';
12
14
  export let id;
13
15
  export let componentInput;
14
16
  export let configuration;
@@ -25,7 +27,10 @@ let outputs = initOutput($worldStore, id, {
25
27
  });
26
28
  let resolvedConfig = initConfig(components['formbuttoncomponent'].initialData.configuration, configuration);
27
29
  let runnableComponent;
30
+ let isLoading = false;
31
+ let ownClick = false;
28
32
  let errors = {};
33
+ let open = false;
29
34
  $: errorsMessage = Object.values(errors)
30
35
  .filter((x) => x != '')
31
36
  .join('\n');
@@ -34,9 +39,18 @@ $: noInputs =
34
39
  $: if (outputs?.loading != undefined) {
35
40
  outputs.loading.set(false, true);
36
41
  }
42
+ $: outputs?.loading.subscribe({
43
+ id: 'loading-' + id,
44
+ next: (value) => {
45
+ isLoading = value;
46
+ if (ownClick && !value) {
47
+ ownClick = false;
48
+ }
49
+ }
50
+ });
51
+ $: loading = isLoading && ownClick;
37
52
  $: css = concatCustomCss($app?.css?.formbuttoncomponent, customCss);
38
53
  let runnableWrapper;
39
- let loading = false;
40
54
  </script>
41
55
 
42
56
  {#each Object.keys(components['formbuttoncomponent'].initialData.configuration) as key (key)}
@@ -48,64 +62,73 @@ let loading = false;
48
62
  />
49
63
  {/each}
50
64
 
51
- <AlwaysMountedModal
52
- title={resolvedConfig.label ?? ''}
53
- class={css?.popup?.class}
54
- style={css?.popup?.style}
55
- >
56
- <RunnableWrapper
57
- bind:this={runnableWrapper}
58
- {recomputeIds}
59
- {render}
60
- bind:runnableComponent
61
- {componentInput}
62
- {id}
63
- {extraQueryParams}
64
- autoRefresh={false}
65
- forceSchemaDisplay={true}
66
- runnableClass="!block"
67
- {outputs}
68
- doOnSuccess={resolvedConfig.onSuccess}
65
+ <Portal>
66
+ <Modal
67
+ {open}
68
+ title={resolvedConfig.label ?? ''}
69
+ class={css?.popup?.class}
70
+ style={css?.popup?.style}
71
+ on:canceled={() => {
72
+ open = false
73
+ }}
74
+ on:confirmed={() => {
75
+ open = false
76
+ }}
69
77
  >
70
- <div class="flex flex-col gap-2 px-4 w-full">
71
- <div>
72
- {#if noInputs}
73
- <div class="text-gray-600 italic text-sm my-4">
74
- Run forms are associated with a runnable that has user inputs.
75
- <br />
76
- Once a script or flow is chosen, set some <strong>Runnable Inputs</strong> to
77
- <strong>
78
- User Input
79
- <Icon data={faUser} scale={1.3} class="rounded-sm bg-gray-200 p-1 ml-0.5" />
80
- </strong>
81
- </div>
82
- {/if}
83
- </div>
84
- <div class="flex justify-end">
85
- <Button
86
- {loading}
87
- btnClasses="my-1"
88
- on:pointerdown={(e) => {
89
- e?.stopPropagation()
90
- window.dispatchEvent(new Event('pointerup'))
91
- }}
92
- on:click={async () => {
93
- if (!runnableComponent) {
94
- runnableWrapper.onSuccess()
95
- } else {
96
- await runnableComponent?.runComponent()
97
- }
98
- getModal().close()
99
- }}
100
- size="xs"
101
- color="dark"
102
- >
103
- Submit
104
- </Button>
78
+ <RunnableWrapper
79
+ bind:this={runnableWrapper}
80
+ {recomputeIds}
81
+ {render}
82
+ bind:runnableComponent
83
+ {componentInput}
84
+ {id}
85
+ {extraQueryParams}
86
+ autoRefresh={false}
87
+ forceSchemaDisplay={true}
88
+ runnableClass="!block"
89
+ {outputs}
90
+ doOnSuccess={resolvedConfig.onSuccess}
91
+ >
92
+ <div class="flex flex-col gap-2 px-4 w-full">
93
+ <div>
94
+ {#if noInputs}
95
+ <div class="text-gray-600 italic text-sm my-4">
96
+ Run forms are associated with a runnable that has user inputs.
97
+ <br />
98
+ Once a script or flow is chosen, set some <strong>Runnable Inputs</strong> to
99
+ <strong>
100
+ User Input
101
+ <Icon data={faUser} scale={1.3} class="rounded-sm bg-gray-200 p-1 ml-0.5" />
102
+ </strong>
103
+ </div>
104
+ {/if}
105
+ </div>
106
+ <div class="flex justify-end">
107
+ <Button
108
+ {loading}
109
+ btnClasses="my-1"
110
+ on:pointerdown={(e) => {
111
+ e?.stopPropagation()
112
+ window.dispatchEvent(new Event('pointerup'))
113
+ }}
114
+ on:click={async () => {
115
+ if (!runnableComponent) {
116
+ runnableWrapper.onSuccess()
117
+ } else {
118
+ await runnableComponent?.runComponent()
119
+ }
120
+ open = false
121
+ }}
122
+ size="xs"
123
+ color="dark"
124
+ >
125
+ Submit
126
+ </Button>
127
+ </div>
105
128
  </div>
106
- </div>
107
- </RunnableWrapper>
108
- </AlwaysMountedModal>
129
+ </RunnableWrapper>
130
+ </Modal>
131
+ </Portal>
109
132
 
110
133
  <AlignWrapper {horizontalAlignment} {verticalAlignment}>
111
134
  {#if errorsMessage}
@@ -118,7 +141,7 @@ let loading = false;
118
141
  btnClasses={css?.button?.class ?? ''}
119
142
  style={css?.button?.style ?? ''}
120
143
  on:click={(e) => {
121
- getModal().open()
144
+ open = true
122
145
  }}
123
146
  >
124
147
  {resolvedConfig.label}
@@ -27,7 +27,7 @@ $: Plotly &&
27
27
  divEl &&
28
28
  h &&
29
29
  w &&
30
- Plotly.newPlot(divEl, Array.isArray(result) ? result : [result], { width: w, height: h, margin: { l: 50, r: 40, b: 40, t: 40, pad: 4 } }, { responsive: true, displayModeBar: false });
30
+ Plotly.newPlot(divEl, [result], { width: w, height: h, margin: { l: 50, r: 40, b: 40, t: 40, pad: 4 } }, { responsive: true, displayModeBar: false });
31
31
  </script>
32
32
 
33
33
  <div class="w-full h-full" bind:clientHeight={h} bind:clientWidth={w}>
@@ -221,8 +221,7 @@ $componentControl[id] = {
221
221
  on:click={() => toggleRow(row, rowIndex)}
222
222
  >
223
223
  <div class="center-center h-full w-full flex-wrap gap-1 ">
224
- {#each actionButtons as actionButton, actionIndex (actionButton?.id)}
225
- <!-- svelte-ignore a11y-mouse-events-have-key-events -->
224
+ {#each actionButtons as actionButton, actionIndex (actionIndex)}
226
225
  <div
227
226
  on:mouseover|stopPropagation={() => {
228
227
  if (actionButton.id !== $hoverStore) {
@@ -256,15 +255,12 @@ $componentControl[id] = {
256
255
  extraKey={'idx' + rowIndex}
257
256
  {render}
258
257
  noWFull
258
+ {...actionButton}
259
259
  preclickAction={async () => {
260
260
  toggleRow(row, rowIndex)
261
261
  }}
262
- id={actionButton.id}
263
- customCss={actionButton.customCss}
264
- configuration={actionButton.configuration}
265
- recomputeIds={actionButton.recomputeIds}
266
262
  extraQueryParams={{ row: row.original }}
267
- componentInput={actionButton.componentInput}
263
+ bind:componentInput={actionButton.componentInput}
268
264
  controls={{
269
265
  left: () => {
270
266
  if (actionIndex === 0) {
@@ -292,15 +288,12 @@ $componentControl[id] = {
292
288
  extraKey={'idx' + rowIndex}
293
289
  {render}
294
290
  noWFull
295
- id={actionButton.id}
296
- customCss={actionButton.customCss}
297
- configuration={actionButton.configuration}
298
- recomputeIds={actionButton.recomputeIds}
291
+ {...actionButton}
299
292
  preclickAction={async () => {
300
293
  toggleRow(row, rowIndex)
301
294
  }}
302
295
  extraQueryParams={{ row: row.original }}
303
- componentInput={actionButton.componentInput}
296
+ bind:componentInput={actionButton.componentInput}
304
297
  />
305
298
  {/if}
306
299
  </div>
@@ -326,9 +319,9 @@ $componentControl[id] = {
326
319
  <div class="flex flex-col h-full w-full overflow-auto">
327
320
  <Alert title="Parsing issues" type="error" size="xs" class="h-full w-full ">
328
321
  The result should be an array of objects. Received:
329
- <pre class="w-full bg-white p-2 rounded-md whitespace-pre-wrap"
330
- >{JSON.stringify(result, null, 4)}</pre
331
- >
322
+ <pre class="w-full bg-white p-2 rounded-md">
323
+ {JSON.stringify(result, null, 4)}
324
+ </pre>
332
325
  </Alert>
333
326
  </div>
334
327
  {/if}
@@ -27,7 +27,6 @@ export let recomputable = false;
27
27
  export let outputs;
28
28
  export let extraKey = '';
29
29
  export let doNotRecomputeOnInputChanged = false;
30
- export let loading = false;
31
30
  const { worldStore, runnableComponents, workspace, appPath, isEditor, jobs, noBackend, errorByComponent, mode, stateId, state, componentControl } = getContext('AppViewerContext');
32
31
  const dispatch = createEventDispatcher();
33
32
  if (recomputable || autoRefresh) {
@@ -40,7 +39,6 @@ let args = undefined;
40
39
  let testIsLoading = false;
41
40
  let runnableInputValues = {};
42
41
  let executeTimeout = undefined;
43
- $: outputs.loading?.set(loading);
44
42
  function setDebouncedExecute() {
45
43
  executeTimeout && clearTimeout(executeTimeout);
46
44
  executeTimeout = setTimeout(() => {
@@ -105,7 +103,7 @@ function stripSchema(inputs, s) {
105
103
  }
106
104
  async function executeComponent(noToast = false, inlineScriptOverride) {
107
105
  if (runnable?.type === 'runnableByName' && runnable.inlineScript?.language === 'frontend') {
108
- loading = true;
106
+ outputs.loading?.set(true);
109
107
  try {
110
108
  const r = await eval_like(runnable.inlineScript?.content, computeGlobalContext($worldStore, id, {}), false, $state, $mode == 'dnd', $componentControl, $worldStore);
111
109
  await setResult(r);
@@ -114,7 +112,7 @@ async function executeComponent(noToast = false, inlineScriptOverride) {
114
112
  catch (e) {
115
113
  sendUserToast('Error running frontend script: ' + e.message, true);
116
114
  }
117
- loading = false;
115
+ outputs.loading?.set(false);
118
116
  return;
119
117
  }
120
118
  if (noBackend) {
@@ -126,7 +124,7 @@ async function executeComponent(noToast = false, inlineScriptOverride) {
126
124
  if (runnable?.type === 'runnableByName' && !runnable.inlineScript) {
127
125
  return;
128
126
  }
129
- loading = true;
127
+ outputs.loading?.set(true);
130
128
  try {
131
129
  let njob = await testJobLoader?.abstractRun(() => {
132
130
  const nonStaticRunnableInputs = {};
@@ -174,8 +172,7 @@ async function executeComponent(noToast = false, inlineScriptOverride) {
174
172
  }
175
173
  }
176
174
  catch (e) {
177
- setResult({ error: e.body ?? e.message });
178
- loading = false;
175
+ outputs.loading?.set(false);
179
176
  }
180
177
  }
181
178
  export async function runComponent() {
@@ -183,7 +180,7 @@ export async function runComponent() {
183
180
  await executeComponent();
184
181
  }
185
182
  catch (e) {
186
- setResult({ error: e.body ?? e.message });
183
+ console.error(e);
187
184
  }
188
185
  }
189
186
  let lastStartedAt = Date.now();
@@ -259,7 +256,7 @@ async function setResult(res) {
259
256
  setResult(e.detail.result)
260
257
  }
261
258
  }
262
- loading = false
259
+ outputs.loading?.set(false)
263
260
  }}
264
261
  bind:isLoading={testIsLoading}
265
262
  bind:job={testJob}
@@ -25,7 +25,6 @@ declare const __propDef: {
25
25
  };
26
26
  extraKey?: string | undefined;
27
27
  doNotRecomputeOnInputChanged?: boolean | undefined;
28
- loading?: boolean | undefined;
29
28
  runComponent?: (() => Promise<void>) | undefined;
30
29
  };
31
30
  events: {
@@ -8,7 +8,6 @@ export let componentInput;
8
8
  export let id;
9
9
  export let result = undefined;
10
10
  export let initializing = true;
11
- export let loading = false;
12
11
  export let extraQueryParams = {};
13
12
  export let autoRefresh = true;
14
13
  export let runnableComponent = undefined;
@@ -74,7 +73,6 @@ export function onSuccess() {
74
73
  {:else if componentInput.type === 'runnable' && isRunnableDefined(componentInput)}
75
74
  <RunnableComponent
76
75
  {extraKey}
77
- bind:loading
78
76
  bind:this={runnableComponent}
79
77
  fields={componentInput.fields}
80
78
  bind:result
@@ -8,7 +8,6 @@ declare const __propDef: {
8
8
  id: string;
9
9
  result?: any;
10
10
  initializing?: boolean | undefined;
11
- loading?: boolean | undefined;
12
11
  extraQueryParams?: Record<string, any> | undefined;
13
12
  autoRefresh?: boolean | undefined;
14
13
  runnableComponent?: RunnableComponent | undefined;
@@ -10,7 +10,8 @@ import Tabs from '../../common/tabs/Tabs.svelte';
10
10
  import TabContent from '../../common/tabs/TabContent.svelte';
11
11
  import { Alert, Button, Tab } from '../../common';
12
12
  import ComponentList from './componentsPanel/ComponentList.svelte';
13
- import { faPlus } from '@fortawesome/free-solid-svg-icons';
13
+ import Icon from 'svelte-awesome';
14
+ import { faCode, faPlus, faSliders } from '@fortawesome/free-solid-svg-icons';
14
15
  import ContextPanel from './contextPanel/ContextPanel.svelte';
15
16
  import { classNames, encodeState } from '../../../utils';
16
17
  import AppPreview from './AppPreview.svelte';
@@ -25,8 +26,6 @@ import { initHistory } from '../../../history';
25
26
  import ComponentNavigation from './component/ComponentNavigation.svelte';
26
27
  import ItemPicker from '../../ItemPicker.svelte';
27
28
  import VariableEditor from '../../VariableEditor.svelte';
28
- import { SecondaryMenu } from './settingsPanel/secondaryMenu';
29
- import { Component, Paintbrush, Plus } from 'lucide-svelte';
30
29
  export let app;
31
30
  export let path;
32
31
  export let initialMode = 'dnd';
@@ -161,7 +160,7 @@ let variableEditor = undefined;
161
160
  <Pane size={15} minSize={5} maxSize={33}>
162
161
  <ContextPanel />
163
162
  </Pane>
164
- <Pane size={63}>
163
+ <Pane size={64}>
165
164
  <SplitPanesWrapper>
166
165
  <Splitpanes horizontal>
167
166
  <Pane size={70}>
@@ -202,32 +201,31 @@ let variableEditor = undefined;
202
201
  </Splitpanes>
203
202
  </SplitPanesWrapper>
204
203
  </Pane>
205
- <Pane size={22} minSize={5} maxSize={33}>
204
+ <Pane size={21} minSize={5} maxSize={33}>
206
205
  <div class="relative flex flex-col h-full">
207
206
  <Tabs bind:selected={selectedTab} wrapperClass="!h-[40px]" class="!h-full">
208
207
  <Tab value="insert" size="xs">
209
- <div class="m-1 center-center gap-1">
210
- <Plus size={18} />
208
+ <div class="m-1 center-center gap-2">
209
+ <Icon data={faPlus} />
211
210
  <span>Insert</span>
212
211
  </div>
213
212
  </Tab>
214
213
  <Tab value="settings" size="xs">
215
- <div class="m-1 center-center gap-1">
216
- <Component size={18} />
217
- <span>Component</span>
214
+ <div class="m-1 center-center gap-2">
215
+ <Icon data={faSliders} />
216
+ <span>Settings</span>
218
217
  </div>
219
218
  </Tab>
220
219
  <Tab value="css" size="xs">
221
- <div class="m-1 center-center gap-1">
222
- <Paintbrush size={18} />
223
- <span>Styling</span>
220
+ <div class="m-1 center-center gap-2">
221
+ <Icon data={faCode} />
222
+ <span>CSS</span>
224
223
  </div>
225
224
  </Tab>
226
225
  <div slot="content" class="h-full overflow-y-auto">
227
226
  <TabContent class="overflow-auto h-full" value="settings">
228
227
  {#if $selectedComponent !== undefined}
229
228
  <SettingsPanel />
230
- <SecondaryMenu />
231
229
  {:else}
232
230
  <div class="min-w-[150px] text-sm text-gray-500 text-center py-8 px-2">
233
231
  Select a component to see the settings&nbsp;for&nbsp;it
@@ -82,7 +82,8 @@ $: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-non
82
82
  )}
83
83
  >
84
84
  <div
85
- class="w-full sticky z-[1001] top-0 flex justify-between border-b bg-gray-50 px-4 py-1 items-center gap-4"
85
+ class="w-full sticky top-0 flex justify-between border-b bg-gray-50 px-4 py-1 items-center gap-4"
86
+ style="z-index: 1000;"
86
87
  >
87
88
  <h2 class="truncate">{summary}</h2>
88
89
  <RecomputeAllComponents />
@@ -143,7 +143,7 @@ $: hasError = componentWithErrors.includes(component.id);
143
143
  customCss={component.customCss}
144
144
  bind:initializing
145
145
  componentInput={component.componentInput}
146
- actionButtons={component.actionButtons}
146
+ bind:actionButtons={component.actionButtons}
147
147
  {render}
148
148
  />
149
149
  {:else if component.type === 'aggridcomponent'}
@@ -8,10 +8,6 @@
8
8
  1. Add the component to one of the component sets: `layout`, `buttons`,
9
9
  `inputs` or `display` _(this controls which group the component will be
10
10
  placed in in the **Insert** menu)_
11
- 1. [**`quickStyleProperties.ts`**](../componentsPanel/quickStyleProperties.ts):
12
- 1. Add the component to the `quickStyleProperties` record
13
- 1. _(optional)_ Add the CSS properties that could be applied to the component
14
- parts
15
11
  1. [**`Component.svelte`**](./Component.svelte):
16
12
  1. Add the new component in the Svelte `if` statement
17
13
  1. [**`default-codes.ts`**](./default-codes.ts):