windmill-components 1.84.6 → 1.86.0

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 (271) hide show
  1. package/components/AppConnect.svelte +2 -2
  2. package/components/ArgInfo.svelte +4 -6
  3. package/components/ArgInput.svelte +12 -12
  4. package/components/ArgInput.svelte.d.ts +1 -2
  5. package/components/CenteredModal.svelte +9 -7
  6. package/components/CronInput.svelte +301 -64
  7. package/components/CronInput.svelte.d.ts +3 -3
  8. package/components/DisplayResult.svelte +5 -7
  9. package/components/Dropdown.svelte +5 -4
  10. package/components/Editor.svelte +138 -83
  11. package/components/Editor.svelte.d.ts +10 -4
  12. package/components/EditorBar.svelte +72 -36
  13. package/components/EditorBar.svelte.d.ts +1 -1
  14. package/components/FlowBuilder.svelte +136 -110
  15. package/components/FlowGraphViewer.svelte +5 -8
  16. package/components/FlowGraphViewer.svelte.d.ts +1 -0
  17. package/components/FlowPreviewContent.svelte +14 -11
  18. package/components/FlowStatusViewer.svelte +54 -44
  19. package/components/FlowViewer.svelte +1 -1
  20. package/components/FolderEditor.svelte +2 -10
  21. package/components/FolderUsageInfo.svelte +1 -1
  22. package/components/GroupEditor.svelte +6 -15
  23. package/components/HighlightCode.svelte +1 -1
  24. package/components/InlineCodeCopy.svelte +2 -1
  25. package/components/InputTransformForm.svelte +75 -73
  26. package/components/InputTransformSchemaForm.svelte +1 -1
  27. package/components/InputTransformsViewer.svelte +1 -1
  28. package/components/LightweightArgInput.svelte +12 -0
  29. package/components/LightweightArgInput.svelte.d.ts +1 -0
  30. package/components/LightweightSchemaForm.svelte +2 -1
  31. package/components/LightweightSchemaForm.svelte.d.ts +2 -0
  32. package/components/Modal.svelte +2 -2
  33. package/components/ModulePreview.svelte +11 -11
  34. package/components/ModuleStatus.svelte +0 -1
  35. package/components/Multiselect.svelte +1 -0
  36. package/components/ObjectResourceInput.svelte +1 -23
  37. package/components/Path.svelte +56 -94
  38. package/components/Popover.svelte +7 -19
  39. package/components/Range.svelte +1 -4
  40. package/components/ResourceEditor.svelte +6 -6
  41. package/components/ResourcePicker.svelte +2 -2
  42. package/components/RunForm.svelte +5 -6
  43. package/components/ScheduleEditor.svelte +23 -13
  44. package/components/SchemaModal.svelte +1 -0
  45. package/components/SchemaModal.svelte.d.ts +1 -1
  46. package/components/ScriptBuilder.svelte +201 -206
  47. package/components/ScriptBuilder.svelte.d.ts +2 -0
  48. package/components/ScriptEditor.svelte +38 -38
  49. package/components/ScriptEditor.svelte.d.ts +5 -1
  50. package/components/ScriptSchema.svelte +1 -20
  51. package/components/ScriptSchema.svelte.d.ts +0 -1
  52. package/components/SearchItems.svelte +1 -1
  53. package/components/SharedBadge.svelte +0 -1
  54. package/components/SimpleEditor.svelte +17 -37
  55. package/components/SimpleEditor.svelte.d.ts +6 -0
  56. package/components/Star.svelte +2 -1
  57. package/components/TemplateEditor.svelte +21 -29
  58. package/components/TemplateEditor.svelte.d.ts +3 -0
  59. package/components/Toast.svelte +50 -0
  60. package/components/Toast.svelte.d.ts +18 -0
  61. package/components/apps/components/buttons/AppButton.svelte +2 -1
  62. package/components/apps/components/display/AppBarChart.svelte +5 -5
  63. package/components/apps/components/display/AppHtml.svelte +9 -6
  64. package/components/apps/components/display/AppIcon.svelte +3 -0
  65. package/components/apps/components/display/AppImage.svelte +4 -1
  66. package/components/apps/components/display/AppMap.svelte +3 -0
  67. package/components/apps/components/display/AppPdf.svelte +14 -11
  68. package/components/apps/components/display/AppText.svelte +152 -60
  69. package/components/apps/components/display/AppText.svelte.d.ts +4 -0
  70. package/components/apps/components/display/table/AppAggridTable.svelte +25 -12
  71. package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -1
  72. package/components/apps/components/display/table/AppTable.svelte +1 -2
  73. package/components/apps/components/display/table/AppTableFooter.svelte +0 -1
  74. package/components/apps/components/helpers/AlignWrapper.svelte +1 -20
  75. package/components/apps/components/helpers/HiddenComponent.svelte +12 -6
  76. package/components/apps/components/helpers/HiddenComponent.svelte.d.ts +2 -1
  77. package/components/apps/components/helpers/InitializeComponent.svelte +12 -0
  78. package/components/apps/components/helpers/InitializeComponent.svelte.d.ts +16 -0
  79. package/components/apps/components/helpers/InputValue.svelte +6 -0
  80. package/components/apps/components/helpers/NonRunnableComponent.svelte +4 -3
  81. package/components/apps/components/helpers/RunnableComponent.svelte +24 -6
  82. package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  83. package/components/apps/components/helpers/RunnableWrapper.svelte +8 -2
  84. package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  85. package/components/apps/components/helpers/eval.d.ts +4 -0
  86. package/components/apps/components/helpers/eval.js +3 -1
  87. package/components/apps/components/inputs/AppCheckbox.svelte +3 -0
  88. package/components/apps/components/inputs/AppDateInput.svelte +3 -0
  89. package/components/apps/components/inputs/AppFileInput.svelte +4 -0
  90. package/components/apps/components/inputs/AppMultiSelect.svelte +5 -2
  91. package/components/apps/components/inputs/AppNumberInput.svelte +3 -0
  92. package/components/apps/components/inputs/AppRangeInput.svelte +8 -5
  93. package/components/apps/components/inputs/AppSelect.svelte +3 -9
  94. package/components/apps/components/inputs/AppSliderInputs.svelte +2 -0
  95. package/components/apps/components/inputs/AppTextInput.svelte +12 -5
  96. package/components/apps/components/inputs/currency/AppCurrencyInput.svelte +3 -0
  97. package/components/apps/components/layout/AppContainer.svelte +3 -0
  98. package/components/apps/components/layout/AppDivider.svelte +3 -0
  99. package/components/apps/components/layout/AppDrawer.svelte +3 -0
  100. package/components/apps/components/layout/AppSplitpanes.svelte +3 -0
  101. package/components/apps/components/layout/AppTabs.svelte +4 -1
  102. package/components/apps/editor/AppEditor.svelte +42 -35
  103. package/components/apps/editor/AppEditorHeader.svelte +23 -15
  104. package/components/apps/editor/AppPreview.svelte +5 -3
  105. package/components/apps/editor/ComponentHeader.svelte +20 -1
  106. package/components/apps/editor/ComponentHeader.svelte.d.ts +3 -0
  107. package/components/apps/editor/GridEditor.svelte +2 -2
  108. package/components/apps/editor/RecomputeAllComponents.svelte +7 -4
  109. package/components/apps/editor/SettingsPanel.svelte +1 -0
  110. package/components/apps/editor/SubGridEditor.svelte +5 -5
  111. package/components/apps/editor/appUtils.js +13 -3
  112. package/components/apps/editor/component/Component.svelte +24 -2
  113. package/components/apps/editor/component/ComponentWrapper.svelte +5 -0
  114. package/components/apps/editor/component/components.d.ts +39 -39
  115. package/components/apps/editor/componentsPanel/ComponentList.svelte +12 -26
  116. package/components/apps/editor/componentsPanel/CssSettings.svelte +1 -3
  117. package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  118. package/components/apps/editor/componentsPanel/QuickStyleMenu.svelte +2 -2
  119. package/components/apps/editor/contextPanel/ContextPanel.svelte +1 -2
  120. package/components/apps/editor/contextPanel/components/IdEditor.svelte +90 -0
  121. package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +18 -0
  122. package/components/apps/editor/contextPanel/components/OutputHeader.svelte +92 -21
  123. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +4 -3
  124. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +3 -3
  125. package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +50 -37
  126. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +3 -3
  127. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte +14 -6
  128. package/components/apps/editor/settingsPanel/TableActions.svelte +1 -1
  129. package/components/apps/editor/settingsPanel/inputEditor/ConnectedInputEditor.svelte +2 -2
  130. package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +8 -3
  131. package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte.d.ts +0 -2
  132. package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +2 -2
  133. package/components/apps/editor/settingsPanel/mainInput/WorkspaceFlowList.svelte +2 -5
  134. package/components/apps/editor/settingsPanel/mainInput/WorkspaceScriptList.svelte +2 -5
  135. package/components/apps/editor/settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte +15 -7
  136. package/components/apps/editor/settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte.d.ts +2 -1
  137. package/components/apps/editor/settingsPanel/triggerLists/ComponentTriggerList.svelte +2 -2
  138. package/components/apps/editor/settingsPanel/triggerLists/ComponentTriggerList.svelte.d.ts +1 -1
  139. package/components/apps/editor/settingsPanel/triggerLists/TriggerBadgesList.svelte +6 -5
  140. package/components/apps/editor/settingsPanel/triggerLists/TriggerBadgesList.svelte.d.ts +1 -1
  141. package/components/apps/inputType.d.ts +1 -0
  142. package/components/apps/rx.d.ts +0 -2
  143. package/components/apps/rx.js +1 -3
  144. package/components/apps/svelte-grid/utils/helper.js +1 -1
  145. package/components/apps/types.d.ts +12 -0
  146. package/components/apps/utils.d.ts +3 -1
  147. package/components/apps/utils.js +26 -2
  148. package/components/build_workers.d.ts +14 -0
  149. package/components/build_workers.js +45 -0
  150. package/components/common/badge/Badge.svelte +0 -1
  151. package/components/common/button/Button.svelte +46 -24
  152. package/components/common/button/Button.svelte.d.ts +7 -1
  153. package/components/common/button/ButtonDropdown.svelte +25 -0
  154. package/components/common/button/ButtonDropdown.svelte.d.ts +27 -0
  155. package/components/common/button/model.d.ts +2 -3
  156. package/components/common/button/model.js +7 -3
  157. package/components/common/drawer/Drawer.svelte +2 -3
  158. package/components/common/drawer/DrawerContent.svelte +2 -6
  159. package/components/common/fileInput/FileInput.svelte +5 -1
  160. package/components/common/fileInput/FileInput.svelte.d.ts +1 -0
  161. package/components/common/index.d.ts +0 -2
  162. package/components/common/index.js +0 -2
  163. package/components/common/menu/Menu.svelte.d.ts +1 -1
  164. package/components/common/popup/Popup.svelte +16 -8
  165. package/components/common/popup/Popup.svelte.d.ts +6 -0
  166. package/components/common/table/AppRow.svelte +0 -1
  167. package/components/common/table/FlowRow.svelte +0 -1
  168. package/components/common/table/ScriptRow.svelte +2 -3
  169. package/components/common/tabs/Tab.svelte +10 -5
  170. package/components/common/tabs/Tabs.svelte +20 -1
  171. package/components/common/tabs/Tabs.svelte.d.ts +3 -0
  172. package/components/flows/CreateActionsApp.svelte +14 -9
  173. package/components/flows/CreateActionsFlow.svelte +11 -10
  174. package/components/flows/FlowEditor.svelte +2 -2
  175. package/components/flows/content/CapturePayload.svelte +2 -4
  176. package/components/flows/content/DynamicInputHelpBox.svelte +1 -0
  177. package/components/flows/content/FlowBranchesAllWrapper.svelte +2 -2
  178. package/components/flows/content/FlowBranchesOneWrapper.svelte +2 -2
  179. package/components/flows/content/FlowInputsFlow.svelte +1 -1
  180. package/components/flows/content/FlowInputsFlow.svelte.d.ts +1 -3
  181. package/components/flows/content/FlowModuleComponent.svelte +27 -28
  182. package/components/flows/content/FlowModuleWrapper.svelte +0 -1
  183. package/components/flows/content/FlowRetries.svelte +1 -2
  184. package/components/flows/content/FlowSchedules.svelte +3 -1
  185. package/components/flows/content/ScriptEditorDrawer.svelte +1 -1
  186. package/components/flows/flowStateUtils.d.ts +0 -3
  187. package/components/flows/flowStateUtils.js +3 -23
  188. package/components/flows/header/FlowImportExportMenu.svelte +10 -12
  189. package/components/flows/header/FlowPreviewButtons.svelte +21 -24
  190. package/components/flows/idUtils.d.ts +4 -0
  191. package/components/flows/idUtils.js +47 -0
  192. package/components/flows/map/FlowModuleSchemaItem.svelte +6 -6
  193. package/components/flows/map/MapItem.svelte +9 -9
  194. package/components/flows/map/MapItem.svelte.d.ts +0 -1
  195. package/components/flows/scheduleUtils.d.ts +1 -0
  196. package/components/flows/scheduleUtils.js +2 -1
  197. package/components/flows/utils.d.ts +0 -2
  198. package/components/flows/utils.js +3 -35
  199. package/components/graph/FlowGraph.svelte +22 -8
  200. package/components/graph/FlowGraph.svelte.d.ts +2 -0
  201. package/components/graph/svelvet/collapsible/controllers/util.js +3 -14
  202. package/components/graph/svelvet/container/views/GraphView.svelte +25 -42
  203. package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +2 -0
  204. package/components/graph/svelvet/container/views/Svelvet.svelte +5 -3
  205. package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +3 -0
  206. package/components/graph/svelvet/edges/controllers/anchorCbDev.js +5 -5
  207. package/components/graph/svelvet/edges/controllers/util.js +1 -1
  208. package/components/graph/svelvet/edges/models/Edge.js +2 -2
  209. package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +1 -1
  210. package/components/graph/svelvet/nodes/models/Node.js +0 -1
  211. package/components/graph/svelvet/nodes/views/Node.svelte +0 -1
  212. package/components/graph/svelvet/nodes/views/Node.svelte.d.ts +0 -1
  213. package/components/graph/svelvet/store/controllers/util.d.ts +1 -1
  214. package/components/graph/svelvet/store/controllers/util.js +3 -3
  215. package/components/home/ItemsList.svelte +11 -11
  216. package/components/icons/WindmillIcon.svelte +4 -0
  217. package/components/icons/WindmillIcon.svelte.d.ts +1 -0
  218. package/components/propertyPicker/ObjectViewer.svelte +0 -5
  219. package/components/propertyPicker/ObjectViewer.svelte.d.ts +0 -1
  220. package/components/propertyPicker/PropPicker.svelte +2 -2
  221. package/components/scripts/CreateActionsScript.svelte +4 -22
  222. package/components/sidebar/WorkspaceMenu.svelte +8 -4
  223. package/editorUtils.d.ts +3 -0
  224. package/editorUtils.js +7 -2
  225. package/gen/core/OpenAPI.js +1 -1
  226. package/gen/index.d.ts +7 -1
  227. package/gen/index.js +3 -0
  228. package/gen/models/CreateInput.d.ts +5 -0
  229. package/gen/models/CreateInput.js +4 -0
  230. package/gen/models/EditSchedule.d.ts +1 -0
  231. package/gen/models/Input.d.ts +6 -0
  232. package/gen/models/Input.js +4 -0
  233. package/gen/models/MainArgSignature.d.ts +8 -0
  234. package/gen/models/MainArgSignature.js +8 -1
  235. package/gen/models/NewSchedule.d.ts +1 -1
  236. package/gen/models/NewTokenImpersonate.d.ts +5 -0
  237. package/gen/models/NewTokenImpersonate.js +4 -0
  238. package/gen/models/RunnableType.d.ts +5 -0
  239. package/gen/models/RunnableType.js +9 -0
  240. package/gen/models/Schedule.d.ts +1 -1
  241. package/gen/models/UpdateInput.d.ts +4 -0
  242. package/gen/models/UpdateInput.js +4 -0
  243. package/gen/services/FlowService.d.ts +18 -0
  244. package/gen/services/FlowService.js +19 -0
  245. package/gen/services/InputService.d.ts +78 -0
  246. package/gen/services/InputService.js +95 -0
  247. package/gen/services/JobService.d.ts +35 -15
  248. package/gen/services/JobService.js +25 -7
  249. package/gen/services/ScheduleService.d.ts +2 -2
  250. package/gen/services/ScheduleService.js +1 -1
  251. package/gen/services/ScriptService.d.ts +10 -0
  252. package/gen/services/ScriptService.js +16 -0
  253. package/gen/services/UserService.d.ts +12 -0
  254. package/gen/services/UserService.js +13 -0
  255. package/infer.js +3 -0
  256. package/init_scripts/python_init_code.d.ts +1 -1
  257. package/init_scripts/python_init_code.js +2 -2
  258. package/package.json +684 -673
  259. package/script_helpers.d.ts +1 -1
  260. package/script_helpers.js +7 -5
  261. package/stores.js +14 -1
  262. package/user.d.ts +1 -1
  263. package/user.js +6 -6
  264. package/utils.d.ts +2 -2
  265. package/utils.js +21 -11
  266. package/components/common/button/ButtonPopup.svelte +0 -75
  267. package/components/common/button/ButtonPopup.svelte.d.ts +0 -39
  268. package/components/common/button/ButtonPopupItem.svelte +0 -48
  269. package/components/common/button/ButtonPopupItem.svelte.d.ts +0 -28
  270. package/components/graph/svelvet/editEdges/views/EditEdge.svelte +0 -151
  271. package/components/graph/svelvet/editEdges/views/EditEdge.svelte.d.ts +0 -20
@@ -1,12 +1,22 @@
1
1
  <script>import Toggle from '../../../../Toggle.svelte';
2
- import Tooltip from '../../../../Tooltip.svelte';
3
2
  import TriggerBadgesList from './TriggerBadgesList.svelte';
4
3
  import { getDependencies } from './triggerListUtils';
5
4
  export let fields;
6
5
  export let autoRefresh = false;
7
6
  export let id;
8
7
  export let inlineScript;
9
- export let doNotRecomputeOnInputChanged = false;
8
+ export let recomputeOnInputChanged = true;
9
+ export let doNotRecomputeOnInputChanged = undefined;
10
+ //TODO: remove after migration is done
11
+ $: {
12
+ if (doNotRecomputeOnInputChanged != undefined) {
13
+ recomputeOnInputChanged = !doNotRecomputeOnInputChanged;
14
+ doNotRecomputeOnInputChanged = undefined;
15
+ }
16
+ if (recomputeOnInputChanged == undefined) {
17
+ recomputeOnInputChanged = true;
18
+ }
19
+ }
10
20
  $: dependencies = getDependencies(fields);
11
21
  </script>
12
22
 
@@ -14,11 +24,9 @@ $: dependencies = getDependencies(fields);
14
24
  <div class="flex items-center px-1">
15
25
  <Toggle
16
26
  size="xs"
17
- color="red"
18
- bind:checked={doNotRecomputeOnInputChanged}
19
- options={{ right: 'do NOT recompute on input changes' }}
27
+ bind:checked={recomputeOnInputChanged}
28
+ options={{ right: 'recompute on any input changes' }}
20
29
  />
21
- <Tooltip>If not toggled, whenever an input is changed, the script will be re-run.</Tooltip>
22
30
  </div>
23
31
  {/if}
24
32
 
@@ -27,5 +35,5 @@ $: dependencies = getDependencies(fields);
27
35
  {id}
28
36
  inputDependencies={dependencies}
29
37
  onLoad={autoRefresh}
30
- {doNotRecomputeOnInputChanged}
38
+ {recomputeOnInputChanged}
31
39
  />
@@ -7,7 +7,8 @@ declare const __propDef: {
7
7
  autoRefresh?: boolean | undefined;
8
8
  id: string;
9
9
  inlineScript: InlineScript;
10
- doNotRecomputeOnInputChanged?: boolean | undefined;
10
+ recomputeOnInputChanged?: boolean | undefined;
11
+ doNotRecomputeOnInputChanged?: undefined | boolean;
11
12
  };
12
13
  events: {
13
14
  [evt: string]: CustomEvent<any>;
@@ -5,7 +5,7 @@ const { selectedComponent } = getContext('AppViewerContext');
5
5
  export let fields;
6
6
  export let appComponent;
7
7
  export let runnable;
8
- export let doNotRecomputeOnInputChanged = false;
8
+ export let recomputeOnInputChanged = false;
9
9
  const onClick = ['buttoncomponent', 'formbuttoncomponent', 'formcomponent'].includes(appComponent.type);
10
10
  $: onLoad =
11
11
  !onClick ||
@@ -18,7 +18,7 @@ $: onLoad =
18
18
  inputDependencies={onClick ? [] : getDependencies(fields)}
19
19
  bind:inlineScript={runnable.inlineScript}
20
20
  {onLoad}
21
- {doNotRecomputeOnInputChanged}
21
+ {recomputeOnInputChanged}
22
22
  id={$selectedComponent?.[0]}
23
23
  {onClick}
24
24
  />
@@ -6,7 +6,7 @@ declare const __propDef: {
6
6
  fields: Record<string, StaticAppInput | ConnectedAppInput | RowAppInput | UserAppInput>;
7
7
  appComponent: AppComponent;
8
8
  runnable: RunnableByName;
9
- doNotRecomputeOnInputChanged?: boolean | undefined;
9
+ recomputeOnInputChanged?: boolean | undefined;
10
10
  };
11
11
  events: {
12
12
  [evt: string]: CustomEvent<any>;
@@ -8,7 +8,7 @@ export let inlineScript;
8
8
  export let onClick = false;
9
9
  export let onLoad = false;
10
10
  export let id = undefined;
11
- export let doNotRecomputeOnInputChanged = false;
11
+ export let recomputeOnInputChanged = false;
12
12
  const colors = {
13
13
  red: 'text-red-800 border-red-600 bg-red-100',
14
14
  green: 'text-green-800 border-green-600 bg-green-100',
@@ -66,11 +66,11 @@ function deleteDep(index) {
66
66
 
67
67
  <div class="flex w-full flex-col items-start gap-2 mt-2 mb-1">
68
68
  {#if recomputedBadges.length === 0 && !onLoad && !onClick && inputDependencies?.length === 0 && !frontendDependencies}
69
- <p class="text-xs font-semibold text-slate-800 ">
69
+ <p class="text-xs font-semibold text-slate-800">
70
70
  This script has no triggers. It will never run.
71
71
  </p>
72
72
  {:else}
73
- <div class="text-sm font-semibold text-gray-800 ">Triggered by</div>
73
+ <div class="text-sm font-semibold text-gray-800">Triggered by</div>
74
74
 
75
75
  {#if onLoad || onClick}
76
76
  <div class="w-full">
@@ -86,7 +86,7 @@ function deleteDep(index) {
86
86
  </div>
87
87
  </div>
88
88
  {/if}
89
- {#if inputDependencies.length > 0 && !doNotRecomputeOnInputChanged}
89
+ {#if inputDependencies.length > 0 && (recomputeOnInputChanged ?? true)}
90
90
  <div class="w-full">
91
91
  <div class="flex justify-between items-center mb-1">
92
92
  <div class="text-xs font-semibold text-slate-800">Change on values</div>
@@ -112,7 +112,8 @@ function deleteDep(index) {
112
112
  </div>
113
113
  {/if}
114
114
  {/if}
115
- {#if frontendDependencies && !doNotRecomputeOnInputChanged}
115
+
116
+ {#if frontendDependencies && recomputeOnInputChanged}
116
117
  <div class="w-full">
117
118
  <div class="flex justify-between items-center">
118
119
  <div class="text-xs font-semibold text-slate-800 mb-1">Change on values</div>
@@ -7,7 +7,7 @@ declare const __propDef: {
7
7
  onClick?: boolean | undefined;
8
8
  onLoad?: boolean | undefined;
9
9
  id?: string | undefined;
10
- doNotRecomputeOnInputChanged?: boolean | undefined;
10
+ recomputeOnInputChanged?: boolean | undefined;
11
11
  };
12
12
  events: {
13
13
  [evt: string]: CustomEvent<any>;
@@ -54,6 +54,7 @@ export type ResultInput = {
54
54
  type: 'runnable';
55
55
  value?: any;
56
56
  doNotRecomputeOnInputChanged?: boolean;
57
+ recomputeOnInputChanged?: boolean;
57
58
  };
58
59
  type AppInputSpec<T extends InputType, U, V extends InputType = never> = (StaticInput<U> | ConnectedInput | UserInput<U> | RowInput | EvalInput | UploadInput | ResultInput | TemplateInput) & InputConfiguration<T, V>;
59
60
  type InputConfiguration<T extends InputType, V extends InputType> = {
@@ -19,8 +19,6 @@ export type World = {
19
19
  connect: <T>(inputSpec: AppInput, next: (x: T) => void, id?: string) => Input<T>;
20
20
  stateId: Writable<number>;
21
21
  newOutput: <T>(id: string, name: string, previousValue: T) => Output<T>;
22
- initializedOutputs: number;
23
- initialized: boolean;
24
22
  };
25
23
  export declare function buildWorld(context: Record<string, any>): Writable<World>;
26
24
  export declare function buildObservableWorld(): {
@@ -28,9 +28,7 @@ export function buildWorld(context) {
28
28
  outputsById,
29
29
  connect: newWorld.connect,
30
30
  stateId,
31
- newOutput,
32
- initializedOutputs: 0,
33
- initialized: false
31
+ newOutput
34
32
  });
35
33
  return writableWorld;
36
34
  }
@@ -1,5 +1,5 @@
1
+ import { adjust, findFreeSpaceForItem } from './item';
1
2
  import { makeMatrixFromItems } from './matrix';
2
- import { findFreeSpaceForItem, normalize, adjust } from './item';
3
3
  import { getRowsCount } from './other';
4
4
  function makeItem(item) {
5
5
  const { min = { w: 1, h: 1 }, max } = item;
@@ -78,6 +78,8 @@ export type App = {
78
78
  fields: Record<string, StaticAppInput | ConnectedAppInput | RowAppInput | UserAppInput>;
79
79
  autoRefresh?: boolean;
80
80
  doNotRecomputeOnInputChanged?: boolean;
81
+ recomputeOnInputChanged?: boolean;
82
+ noBackendValue?: any;
81
83
  }>;
82
84
  css?: Partial<Record<AppCssItemName, Record<string, ComponentCssProperty>>>;
83
85
  subgrids?: Record<string, GridItem[]>;
@@ -92,12 +94,17 @@ export type AppViewerContext = {
92
94
  worldStore: Writable<World>;
93
95
  app: Writable<App>;
94
96
  summary: Writable<string>;
97
+ initialized: Writable<{
98
+ initializedComponents: string[];
99
+ initialized: boolean;
100
+ }>;
95
101
  selectedComponent: Writable<string[] | undefined>;
96
102
  mode: Writable<EditorMode>;
97
103
  connectingInput: Writable<ConnectingInput>;
98
104
  breakpoint: Writable<EditorBreakpoint>;
99
105
  runnableComponents: Writable<Record<string, {
100
106
  autoRefresh: boolean;
107
+ refreshOnStart?: boolean;
101
108
  cb: (inlineScript?: InlineScript) => Promise<void>;
102
109
  }>>;
103
110
  staticExporter: Writable<Record<string, () => any>>;
@@ -125,6 +132,11 @@ export type AppViewerContext = {
125
132
  left?: () => boolean;
126
133
  right?: (skipTableActions?: boolean | undefined) => string | boolean;
127
134
  setTab?: (index: number) => void;
135
+ agGrid?: {
136
+ api: any;
137
+ columnApi: any;
138
+ };
139
+ setCode?: (value: string) => void;
128
140
  }>>;
129
141
  hoverStore: Writable<string | undefined>;
130
142
  allIdsInPath: Writable<string[]>;
@@ -1,7 +1,7 @@
1
1
  import type { Schema } from '../../common';
2
- import type { App, ComponentCssProperty, GridItem } from './types';
3
2
  import type { AppInput, InputType, ResultAppInput, StaticAppInput } from './inputType';
4
3
  import type { Output } from './rx';
4
+ import type { App, ComponentCssProperty, GridItem, HorizontalAlignment, VerticalAlignment } from './types';
5
5
  export declare function allItems(grid: GridItem[], subgrids: Record<string, GridItem[]> | undefined): GridItem[];
6
6
  export declare function loadSchema(workspace: string, path: string, runType: 'script' | 'flow' | 'hubscript'): Promise<Schema>;
7
7
  export declare function schemaToInputsSpec(schema: Schema, defaultUserInput: boolean): Record<string, StaticAppInput>;
@@ -19,3 +19,5 @@ export declare function getAllScriptNames(app: App): string[];
19
19
  export declare function toPascalCase(text: string): string;
20
20
  export declare function toKebabCase(text: string): string;
21
21
  export declare function concatCustomCss<T extends Record<string, ComponentCssProperty>>(appCss?: Record<string, ComponentCssProperty>, componentCss?: T): T | undefined;
22
+ export declare function tailwindHorizontalAlignment(alignment?: HorizontalAlignment): string;
23
+ export declare function tailwindVerticalAlignment(alignment?: VerticalAlignment): string;
@@ -1,6 +1,6 @@
1
1
  import { FlowService, ScriptService } from '../../gen';
2
2
  import { inferArgs } from '../../infer';
3
- import { emptySchema, sendUserToast } from '../../utils';
3
+ import { emptySchema } from '../../utils';
4
4
  import { twMerge } from 'tailwind-merge';
5
5
  export function allItems(grid, subgrids) {
6
6
  if (subgrids == undefined) {
@@ -116,12 +116,15 @@ export function clearResultAppInput(appInput) {
116
116
  }
117
117
  export function toStatic(app, staticExporter, summary) {
118
118
  const newApp = JSON.parse(JSON.stringify(app));
119
- newApp.grid.forEach((x) => {
119
+ allItems(newApp.grid, newApp.subgrids).forEach((x) => {
120
120
  let c = x.data;
121
121
  if (c.componentInput?.type == 'runnable') {
122
122
  c.componentInput.value = staticExporter[x.id]();
123
123
  }
124
124
  });
125
+ newApp.hiddenInlineScripts?.forEach((x, i) => {
126
+ x.noBackendValue = staticExporter[`bg_` + i]();
127
+ });
125
128
  return { app: newApp, summary };
126
129
  }
127
130
  export function buildExtraLib(components, idToExclude, hasRows, state, goto) {
@@ -137,6 +140,7 @@ ${goto
137
140
  ? `declare async function goto(path: string, newTab?: boolean): Promise<void>;
138
141
  declare function setTab(id: string, index: string): void;
139
142
  declare function recompute(id: string): void;
143
+ declare function getAgGrid(id: string): {api: any, columnApi: any} | undefined;
140
144
  `
141
145
  : ''}
142
146
  declare const state: ${JSON.stringify(state)};
@@ -192,3 +196,23 @@ export function concatCustomCss(appCss, componentCss) {
192
196
  ];
193
197
  }));
194
198
  }
199
+ export function tailwindHorizontalAlignment(alignment) {
200
+ if (!alignment)
201
+ return '';
202
+ const classes = {
203
+ left: 'justify-start',
204
+ center: 'justify-center',
205
+ right: 'justify-end'
206
+ };
207
+ return classes[alignment];
208
+ }
209
+ export function tailwindVerticalAlignment(alignment) {
210
+ if (!alignment)
211
+ return '';
212
+ const classes = {
213
+ top: 'items-start',
214
+ center: 'items-center',
215
+ bottom: 'items-end'
216
+ };
217
+ return classes[alignment];
218
+ }
@@ -0,0 +1,14 @@
1
+ export interface Environment {
2
+ globalAPI?: boolean;
3
+ baseUrl?: string;
4
+ getWorker?(workerId: string, label: string): Promise<Worker> | Worker;
5
+ getWorkerUrl?(workerId: string, label: string): string;
6
+ workerOverrideGlobals: WorkerOverrideGlobals;
7
+ }
8
+ type WorkerOverrideGlobals = {
9
+ basePath: string;
10
+ workerPath: string;
11
+ workerOptions: WorkerOptions;
12
+ };
13
+ export declare function buildWorkerDefinition(workerPath: string, basePath: string, useModuleWorker: boolean): void;
14
+ export {};
@@ -0,0 +1,45 @@
1
+ export function buildWorkerDefinition(workerPath, basePath, useModuleWorker) {
2
+ const monWin = self;
3
+ const workerOverrideGlobals = {
4
+ basePath: basePath,
5
+ workerPath: workerPath,
6
+ workerOptions: {
7
+ type: useModuleWorker ? 'module' : 'classic'
8
+ }
9
+ };
10
+ if (!monWin.MonacoEnvironment) {
11
+ monWin.MonacoEnvironment = {
12
+ workerOverrideGlobals: workerOverrideGlobals
13
+ };
14
+ }
15
+ const getWorker = (_, label) => {
16
+ console.log('getWorker: workerId: ' + _ + ' label: ' + label);
17
+ const buildWorker = (globals, label, workerName, editorType) => {
18
+ globals.workerOptions.name = label;
19
+ const workerFilename = globals.workerOptions.type === 'module' ? `${workerName}-es.js` : `${workerName}-iife.js`;
20
+ const workerPathLocal = `${globals.workerPath}/${workerFilename}`;
21
+ const workerUrl = new URL(workerPathLocal, globals.basePath);
22
+ console.log(`${editorType}: url: ${workerUrl.href} created from basePath: ${globals.basePath} and file: ${workerPathLocal}`);
23
+ return new Worker(workerUrl.href, globals.workerOptions);
24
+ };
25
+ switch (label) {
26
+ case 'template':
27
+ case 'typescript':
28
+ case 'javascript':
29
+ return buildWorker(workerOverrideGlobals, label, 'tsWorker', 'TS Worker');
30
+ case 'html':
31
+ case 'handlebars':
32
+ case 'razor':
33
+ return buildWorker(workerOverrideGlobals, label, 'htmlWorker', 'HTML Worker');
34
+ case 'css':
35
+ case 'scss':
36
+ case 'less':
37
+ return buildWorker(workerOverrideGlobals, label, 'cssWorker', 'CSS Worker');
38
+ case 'json':
39
+ return buildWorker(workerOverrideGlobals, label, 'jsonWorker', 'JSON Worker');
40
+ default:
41
+ return buildWorker(workerOverrideGlobals, label, 'editorWorker', 'Editor Worker');
42
+ }
43
+ };
44
+ monWin.MonacoEnvironment.getWorker = getWorker;
45
+ }
@@ -12,7 +12,6 @@ export let baseClass = 'text-center';
12
12
  export let capitalize = false;
13
13
  export let icon = undefined;
14
14
  let defaulIconProps = {
15
- data: undefined,
16
15
  position: 'left',
17
16
  scale: 0.7
18
17
  };
@@ -4,11 +4,14 @@ import { ButtonType } from './model';
4
4
  import { goto } from '$app/navigation';
5
5
  import { Loader2 } from 'lucide-svelte';
6
6
  import { twMerge } from 'tailwind-merge';
7
+ import ButtonDropdown from './ButtonDropdown.svelte';
8
+ import { MenuItem } from '@rgossiaux/svelte-headlessui';
7
9
  export let size = 'md';
8
10
  export let spacingSize = size;
9
11
  export let color = 'blue';
10
12
  export let variant = 'contained';
11
13
  export let btnClasses = '';
14
+ export let wrapperClasses = '';
12
15
  export let disabled = false;
13
16
  export let href = undefined;
14
17
  export let target = '_self';
@@ -22,6 +25,7 @@ export let buttonType = 'button';
22
25
  export let loading = false;
23
26
  export let title = undefined;
24
27
  export let style = '';
28
+ export let dropdownItems = undefined;
25
29
  const dispatch = createEventDispatcher();
26
30
  // Order of classes: border, border modifier, bg, bg modifier, text, text modifier, everything else
27
31
  const colorVariants = {
@@ -56,7 +60,7 @@ const colorVariants = {
56
60
  };
57
61
  $: buttonProps = {
58
62
  id,
59
- class: twMerge(colorVariants?.[color]?.[variant], variant === 'border' ? 'border' : '', ButtonType.FontSizeClasses[size], ButtonType.SpacingClasses[spacingSize][variant], 'focus:ring-2 font-semibold', 'rounded-md', 'justify-center items-center text-center whitespace-nowrap inline-flex', btnClasses, disabled ? '!bg-gray-300 !text-gray-600 !cursor-not-allowed' : ''),
63
+ class: twMerge(colorVariants?.[color]?.[variant], variant === 'border' ? 'border' : '', ButtonType.FontSizeClasses[size], ButtonType.SpacingClasses[spacingSize][variant], 'focus:ring-2 font-semibold', dropdownItems ? 'rounded-l-md h-full' : 'rounded-md', 'justify-center items-center text-center whitespace-nowrap inline-flex', btnClasses, disabled ? '!bg-gray-300 !text-gray-600 !cursor-not-allowed' : '', 'transition-all'),
60
64
  href,
61
65
  target,
62
66
  tabindex: disabled ? -1 : 0,
@@ -86,28 +90,46 @@ $: startIconClass = twMerge(iconOnly ? undefined : isSmall ? 'mr-1' : 'mr-2', st
86
90
  $: endIconClass = twMerge(iconOnly ? undefined : isSmall ? 'ml-1' : 'ml-2', endIcon?.classes);
87
91
  </script>
88
92
 
89
- <svelte:element
90
- this={href ? 'a' : 'button'}
91
- bind:this={element}
92
- on:pointerdown
93
- on:click={onClick}
94
- on:focus
95
- on:blur
96
- {...buttonProps}
97
- disabled={disabled || loading}
98
- type="submit"
99
- {style}
100
- >
101
- {#if loading}
102
- <Loader2 class="animate-spin mr-1" size={14} />
103
- {:else if startIcon}
104
- <Icon data={startIcon.icon} class={startIconClass} scale={ButtonType.IconScale[size]} />
105
- {/if}
93
+ <div class="{dropdownItems ? 'flex flex-row divide-x divide-frost-600' : ''} {wrapperClasses}">
94
+ <svelte:element
95
+ this={href ? 'a' : 'button'}
96
+ bind:this={element}
97
+ on:pointerdown
98
+ on:click={onClick}
99
+ on:focus
100
+ on:blur
101
+ {...buttonProps}
102
+ disabled={disabled || loading}
103
+ type="submit"
104
+ {style}
105
+ >
106
+ {#if loading}
107
+ <Loader2 class="animate-spin mr-1" size={14} />
108
+ {:else if startIcon}
109
+ <Icon data={startIcon.icon} class={startIconClass} scale={ButtonType.IconScale[size]} />
110
+ {/if}
106
111
 
107
- {#if !iconOnly}
108
- <slot />
109
- {/if}
110
- {#if endIcon}
111
- <Icon data={endIcon.icon} class={endIconClass} scale={ButtonType.IconScale[size]} />
112
+ {#if !iconOnly}
113
+ <slot />
114
+ {/if}
115
+ {#if endIcon}
116
+ <Icon data={endIcon.icon} class={endIconClass} scale={ButtonType.IconScale[size]} />
117
+ {/if}
118
+ </svelte:element>
119
+
120
+ {#if dropdownItems}
121
+ <div class={twMerge(buttonProps.class, 'rounded-r-md rounded-l-none m-0 p-0 h-auto')}>
122
+ <ButtonDropdown>
123
+ <svelte:fragment slot="items">
124
+ {#each dropdownItems as item}
125
+ <MenuItem on:click={item.onClick} href={item.href}>
126
+ <div class="!text-gray-700 px-4 py-2 my-1 cursor-pointer hover:bg-gray-100 !text-sm">
127
+ {item.label}
128
+ </div>
129
+ </MenuItem>
130
+ {/each}
131
+ </svelte:fragment>
132
+ </ButtonDropdown>
133
+ </div>
112
134
  {/if}
113
- </svelte:element>
135
+ </div>
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  color?: "none" | "blue" | "gray" | "red" | "green" | "dark" | "light" | undefined;
10
10
  variant?: ButtonType.Variant | undefined;
11
11
  btnClasses?: string | undefined;
12
+ wrapperClasses?: string | undefined;
12
13
  disabled?: boolean | undefined;
13
14
  href?: string | undefined;
14
15
  target?: ButtonType.Target | undefined;
@@ -18,10 +19,15 @@ declare const __propDef: {
18
19
  element?: ButtonType.Element | undefined;
19
20
  id?: string | undefined;
20
21
  nonCaptureEvent?: boolean | undefined;
21
- buttonType?: "reset" | "submit" | "button" | undefined;
22
+ buttonType?: "button" | "submit" | "reset" | undefined;
22
23
  loading?: boolean | undefined;
23
24
  title?: string | undefined;
24
25
  style?: string | undefined;
26
+ dropdownItems?: {
27
+ label: string;
28
+ onClick?: (() => void) | undefined;
29
+ href?: string | undefined;
30
+ }[] | undefined;
25
31
  };
26
32
  events: {
27
33
  pointerdown: PointerEvent;
@@ -0,0 +1,25 @@
1
+ <script>
2
+ import { Menu, Transition, MenuButton, MenuItems } from '@rgossiaux/svelte-headlessui'
3
+ import { ChevronDown } from 'lucide-svelte'
4
+ </script>
5
+
6
+ <Menu let:open as="div" class="relative z-50 flex w-full h-full">
7
+ <MenuButton class="h-full w-full px-2">
8
+ <ChevronDown class="w-5 h-5" />
9
+ </MenuButton>
10
+ <Transition
11
+ show={open}
12
+ enter="transition ease-out duration-25"
13
+ enterFrom="transform opacity-0 scale-95"
14
+ enterTo="transform opacity-100 scale-100"
15
+ leave="transition ease-in duration-25"
16
+ leaveFrom="transform opacity-100 scale-100"
17
+ leaveTo="transform opacity-0 scale-95"
18
+ >
19
+ <MenuItems
20
+ class="absolute right-0 z-50 mt-2 w-56 origin-top-right top-8 divide-y divide-gray-100 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"
21
+ >
22
+ <slot name="items" />
23
+ </MenuItems>
24
+ </Transition>
25
+ </Menu>
@@ -0,0 +1,27 @@
1
+ /** @typedef {typeof __propDef.props} ButtonDropdownProps */
2
+ /** @typedef {typeof __propDef.events} ButtonDropdownEvents */
3
+ /** @typedef {typeof __propDef.slots} ButtonDropdownSlots */
4
+ export default class ButtonDropdown extends SvelteComponentTyped<{
5
+ [x: string]: never;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {
9
+ items: {};
10
+ }> {
11
+ }
12
+ export type ButtonDropdownProps = typeof __propDef.props;
13
+ export type ButtonDropdownEvents = typeof __propDef.events;
14
+ export type ButtonDropdownSlots = typeof __propDef.slots;
15
+ import { SvelteComponentTyped } from "svelte";
16
+ declare const __propDef: {
17
+ props: {
18
+ [x: string]: never;
19
+ };
20
+ events: {
21
+ [evt: string]: CustomEvent<any>;
22
+ };
23
+ slots: {
24
+ items: {};
25
+ };
26
+ };
27
+ export {};
@@ -1,7 +1,7 @@
1
1
  export declare const BUTTON_COLORS: readonly ["blue", "red", "dark", "light", "green", "gray", "none"];
2
2
  export declare namespace ButtonType {
3
- type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
- type Color = typeof BUTTON_COLORS[number];
3
+ type Size = 'xs2' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
+ type Color = (typeof BUTTON_COLORS)[number];
5
5
  type Variant = 'contained' | 'border';
6
6
  type Target = '_self' | '_blank';
7
7
  type Element = HTMLButtonElement | HTMLAnchorElement;
@@ -12,7 +12,6 @@ export declare namespace ButtonType {
12
12
  const FontSizeClasses: Record<ButtonType.Size, string>;
13
13
  const SpacingClasses: Record<ButtonType.Size, Record<ButtonType.Variant, string>>;
14
14
  const IconScale: Record<ButtonType.Size, number>;
15
- const ItemContextKey: "popupItemProps";
16
15
  interface ItemProps {
17
16
  size: Size;
18
17
  color: Color;
@@ -2,6 +2,7 @@ export const BUTTON_COLORS = ['blue', 'red', 'dark', 'light', 'green', 'gray', '
2
2
  export var ButtonType;
3
3
  (function (ButtonType) {
4
4
  ButtonType.FontSizeClasses = {
5
+ xs2: 'text-xs',
5
6
  xs: 'text-xs',
6
7
  sm: 'text-sm',
7
8
  md: 'text-md',
@@ -9,6 +10,10 @@ export var ButtonType;
9
10
  xl: 'text-xl'
10
11
  };
11
12
  ButtonType.SpacingClasses = {
13
+ xs2: {
14
+ border: 'px-2 py-[4px]',
15
+ contained: 'px-2 py-[4px]'
16
+ },
12
17
  xs: {
13
18
  border: 'px-3 py-[6px]',
14
19
  contained: 'px-3 py-[7px]'
@@ -28,15 +33,14 @@ export var ButtonType;
28
33
  xl: {
29
34
  border: 'px-4 py-[8px]',
30
35
  contained: 'px-4 py-[9px]'
31
- },
36
+ }
32
37
  };
33
38
  ButtonType.IconScale = {
39
+ xs2: 0.6,
34
40
  xs: 0.7,
35
41
  sm: 0.8,
36
42
  md: 1,
37
43
  lg: 1.1,
38
44
  xl: 1.2
39
45
  };
40
- // ButtonPopup types
41
- ButtonType.ItemContextKey = 'popupItemProps';
42
46
  })(ButtonType || (ButtonType = {}));
@@ -55,20 +55,19 @@ let timeout = true;
55
55
  $: !open ? setTimeout(() => (timeout = true), durationMs) : (timeout = false);
56
56
  onMount(() => {
57
57
  mounted = true;
58
- scrollLock(open);
59
58
  });
60
59
  </script>
61
60
 
62
61
  <svelte:window on:keydown={onKeyDown} />
63
62
 
64
63
  <aside
65
- class="drawer {$$props.class} {$$props.positionClass}"
64
+ class="drawer {$$props.class ?? ''} {$$props.positionClass ?? ''}"
66
65
  class:open
67
66
  class:close={!open && timeout}
68
67
  {style}
69
68
  >
70
69
  <!-- svelte-ignore a11y-click-events-have-key-events -->
71
- <div class="overlay {$$props.positionClass}" on:click={handleClickAway} />
70
+ <div class="overlay {$$props.positionClass ?? ''}" on:click={handleClickAway} />
72
71
  <div class="panel {placement} {$$props.positionClass}" class:size>
73
72
  {#if open || !timeout || alwaysOpen}
74
73
  <slot {open} />
@@ -1,21 +1,17 @@
1
1
  <script>import { classNames } from '../../../utils';
2
- import { faClose } from '@fortawesome/free-solid-svg-icons';
3
- import { createEventDispatcher } from 'svelte';
4
- import { Icon } from 'svelte-awesome';
5
2
  import CloseButton from '../CloseButton.svelte';
6
3
  export let title = undefined;
7
4
  export let overflow_y = true;
8
5
  export let noPadding = false;
9
6
  export let forceOverflowVisible = false;
10
- const dispatch = createEventDispatcher();
11
7
  </script>
12
8
 
13
9
  <div class="flex flex-col divide-y h-screen max-h-screen">
14
- <div class="flex justify-between w-wull items-center px-2 py-2 ">
10
+ <div class="flex justify-between w-wull items-center px-2 py-2">
15
11
  <div class="flex items-center gap-2">
16
12
  <CloseButton on:close />
17
13
 
18
- <span class="font-semibold truncate text-gray-800">{title}</span>
14
+ <span class="font-semibold truncate text-gray-800">{title ?? ''}</span>
19
15
  </div>
20
16
  {#if $$slots.actions}
21
17
  <div class="flex gap-1 items-center justify-end">