windmill-components 1.504.6 → 1.511.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 (233) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +184 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +115 -88
  10. package/package/components/Editor.svelte.d.ts +30 -55
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  13. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  14. package/package/components/FlowBuilder.svelte +11 -2
  15. package/package/components/FlowJobResult.svelte +12 -17
  16. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  17. package/package/components/FlowPreviewContent.svelte +13 -10
  18. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  19. package/package/components/FlowPreviewResult.svelte +14 -6
  20. package/package/components/FlowStatusViewer.svelte +11 -24
  21. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  22. package/package/components/FlowStatusViewerInner.svelte +110 -131
  23. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  24. package/package/components/GitDiffPreview.svelte +55 -0
  25. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  26. package/package/components/HistoricInputs.svelte +2 -2
  27. package/package/components/HttpAgentWorkerDrawer.svelte +1 -1
  28. package/package/components/InitGitRepoPopover.svelte +410 -0
  29. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  30. package/package/components/InstanceSetting.svelte +21 -9
  31. package/package/components/InstanceSettings.svelte +16 -3
  32. package/package/components/JobLoader.svelte +567 -0
  33. package/package/components/JobLoader.svelte.d.ts +53 -0
  34. package/package/components/JobLogs.svelte +6 -4
  35. package/package/components/JobLogs.svelte.d.ts +5 -18
  36. package/package/components/JsonEditor.svelte +11 -11
  37. package/package/components/JsonEditor.svelte.d.ts +14 -56
  38. package/package/components/Label.svelte +6 -11
  39. package/package/components/Label.svelte.d.ts +14 -39
  40. package/package/components/LightweightResourcePicker.svelte +18 -39
  41. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  42. package/package/components/LogViewer.svelte +35 -41
  43. package/package/components/LogViewer.svelte.d.ts +6 -20
  44. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  45. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  46. package/package/components/ModuleTest.svelte +16 -11
  47. package/package/components/NumberTypeNarrowing.svelte +13 -16
  48. package/package/components/NumberTypeNarrowing.svelte.d.ts +4 -18
  49. package/package/components/PullGitRepoPopover.svelte +355 -0
  50. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  51. package/package/components/ResourceTypePicker.svelte +20 -17
  52. package/package/components/ResourceTypePicker.svelte.d.ts +7 -6
  53. package/package/components/S3FilePicker.svelte +5 -3
  54. package/package/components/SavedInputs.svelte +2 -2
  55. package/package/components/ScriptBuilder.svelte +4 -3
  56. package/package/components/ScriptEditor.svelte +34 -31
  57. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  58. package/package/components/Section.svelte +7 -20
  59. package/package/components/Section.svelte.d.ts +20 -47
  60. package/package/components/ServiceLogsInner.svelte +2 -1
  61. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  62. package/package/components/SimpleEditor.svelte +4 -4
  63. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  64. package/package/components/SqlRepl.svelte +0 -1
  65. package/package/components/Subsection.svelte +10 -12
  66. package/package/components/Subsection.svelte.d.ts +15 -39
  67. package/package/components/UserSettings.svelte +1 -1
  68. package/package/components/WorkerGroup.svelte +260 -165
  69. package/package/components/WorkerGroup.svelte.d.ts +2 -0
  70. package/package/components/WorkerTagPicker.svelte +3 -3
  71. package/package/components/WorkerTagSelect.svelte +33 -4
  72. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  73. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  74. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  75. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  76. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  77. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  78. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  79. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  80. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  81. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  82. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  83. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  84. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  85. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  86. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  87. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  88. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  89. package/package/components/apps/editor/component/components.d.ts +12 -0
  90. package/package/components/apps/editor/component/components.js +19 -7
  91. package/package/components/assets/AssetButtons.svelte +38 -0
  92. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  93. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  94. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  95. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  96. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  97. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  98. package/package/components/assets/README_DEV.md +0 -0
  99. package/package/components/assets/lib.d.ts +9 -1
  100. package/package/components/assets/lib.js +48 -7
  101. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  102. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  103. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  104. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  105. package/package/components/common/table/ScriptRow.svelte +3 -1
  106. package/package/components/copilot/AIFormSettings.svelte +3 -4
  107. package/package/components/copilot/AIFormSettings.svelte.d.ts +5 -19
  108. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  109. package/package/components/copilot/autocomplete/Autocompletor.js +269 -35
  110. package/package/components/copilot/autocomplete/request.d.ts +3 -0
  111. package/package/components/copilot/autocomplete/request.js +15 -7
  112. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  113. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  114. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  115. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  116. package/package/components/copilot/chat/flow/core.js +2 -38
  117. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  118. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  119. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  120. package/package/components/copilot/chat/navigator/core.js +2 -1
  121. package/package/components/copilot/chat/script/core.d.ts +11 -2
  122. package/package/components/copilot/chat/script/core.js +165 -23
  123. package/package/components/copilot/chat/shared.d.ts +10 -0
  124. package/package/components/copilot/chat/shared.js +56 -0
  125. package/package/components/copilot/lib.d.ts +1 -0
  126. package/package/components/copilot/lib.js +30 -9
  127. package/package/components/custom_ui.d.ts +1 -0
  128. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  129. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  130. package/package/components/flows/content/FlowModuleCache.svelte +4 -4
  131. package/package/components/flows/content/FlowModuleCache.svelte.d.ts +4 -18
  132. package/package/components/flows/content/FlowModuleComponent.svelte +16 -19
  133. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +3 -4
  134. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte.d.ts +4 -18
  135. package/package/components/flows/content/FlowModuleSleep.svelte +6 -7
  136. package/package/components/flows/content/FlowModuleSleep.svelte.d.ts +4 -18
  137. package/package/components/flows/content/FlowModuleSuspend.svelte +19 -17
  138. package/package/components/flows/content/FlowModuleSuspend.svelte.d.ts +4 -18
  139. package/package/components/flows/content/FlowModuleTimeout.svelte +4 -4
  140. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +4 -18
  141. package/package/components/flows/flowStore.d.ts +1 -1
  142. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  143. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  144. package/package/components/flows/scheduleUtils.js +1 -1
  145. package/package/components/flows/types.d.ts +2 -1
  146. package/package/components/graph/FlowGraphV2.svelte +8 -104
  147. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  148. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  149. package/package/components/graph/graphBuilder.svelte.js +35 -9
  150. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  151. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  152. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  153. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  154. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  155. package/package/components/graph/util.js +1 -1
  156. package/package/components/home/ItemsList.svelte +2 -0
  157. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  158. package/package/components/jobs/JobPreview.svelte +10 -6
  159. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  160. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  161. package/package/components/runs/JobPreview.svelte +26 -16
  162. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  163. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  164. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  165. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  166. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  167. package/package/components/script_builder.d.ts +2 -2
  168. package/package/components/settings/CreateToken.svelte +76 -41
  169. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  170. package/package/components/settings/ScopeSelector.svelte +613 -0
  171. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  172. package/package/components/settings/TokenDisplay.svelte +103 -0
  173. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  174. package/package/components/settings/TokensTable.svelte +70 -349
  175. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  176. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  177. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  178. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  179. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  180. package/package/components/triggers/TriggersEditor.svelte +45 -3
  181. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  182. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +47 -6
  183. package/package/components/triggers/gcp/utils.js +9 -1
  184. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +3 -2
  185. package/package/components/triggers/http/RouteEditorConfigSection.svelte +26 -23
  186. package/package/components/triggers/http/RouteEditorConfigSection.svelte.d.ts +5 -19
  187. package/package/components/triggers/http/RouteEditorInner.svelte +219 -175
  188. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  189. package/package/components/triggers/http/utils.js +9 -3
  190. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +47 -6
  191. package/package/components/triggers/kafka/utils.js +9 -1
  192. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  193. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  194. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +182 -13
  195. package/package/components/triggers/mqtt/utils.js +9 -1
  196. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +47 -6
  197. package/package/components/triggers/nats/utils.js +9 -1
  198. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  199. package/package/components/triggers/postgres/utils.js +9 -1
  200. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +38 -92
  201. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +47 -6
  202. package/package/components/triggers/sqs/utils.js +9 -1
  203. package/package/components/triggers/utils.js +12 -0
  204. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +47 -6
  205. package/package/components/triggers/websocket/utils.js +11 -1
  206. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  207. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  208. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  209. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  211. package/package/gen/core/OpenAPI.js +1 -1
  212. package/package/gen/schemas.gen.d.ts +305 -23
  213. package/package/gen/schemas.gen.js +305 -23
  214. package/package/gen/services.gen.d.ts +33 -1
  215. package/package/gen/services.gen.js +66 -2
  216. package/package/gen/types.gen.d.ts +216 -11
  217. package/package/history.svelte.js +0 -2
  218. package/package/hub.d.ts +1 -0
  219. package/package/hubPaths.json +5 -2
  220. package/package/infer.js +16 -10
  221. package/package/svelte5Utils.svelte.d.ts +1 -0
  222. package/package/svelte5Utils.svelte.js +25 -18
  223. package/package/toast.js +10 -0
  224. package/package/utils.d.ts +3 -2
  225. package/package/utils.js +20 -5
  226. package/package.json +11 -11
  227. package/package/components/ResultJobLoader.svelte +0 -219
  228. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  229. package/package/components/TestJobLoader.svelte +0 -274
  230. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  231. package/package/components/icons/AssetVarIcon.svelte +0 -31
  232. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  233. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -17,7 +17,10 @@ import WebsocketEditorConfigSection from './WebsocketEditorConfigSection.svelte'
17
17
  import { untrack } from 'svelte';
18
18
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
19
19
  import { saveWebsocketTriggerFromCfg } from './utils';
20
- import { handleConfigChange } from '../utils';
20
+ import { getHandlerType, handleConfigChange } from '../utils';
21
+ import Tabs from '../../common/tabs/Tabs.svelte';
22
+ import Tab from '../../common/tabs/Tab.svelte';
23
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
21
24
  let { useDrawer = true, description = undefined, hideTarget = false, hideTooltips = false, isEditor = false, allowDraft = false, trigger = undefined, isDeployed = false, customLabel = undefined, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined, cloudDisabled = false } = $props();
22
25
  let drawer = $state();
23
26
  let is_flow = $state(false);
@@ -43,6 +46,11 @@ let showLoading = $state(false);
43
46
  let initialConfig = undefined;
44
47
  let deploymentLoading = $state(false);
45
48
  let isValid = $state(false);
49
+ let optionTabSelected = $state('error_handler');
50
+ let errorHandlerSelected = $state('slack');
51
+ let error_handler_path = $state();
52
+ let error_handler_args = $state({});
53
+ let retry = $state();
46
54
  const websocketCfg = $derived.by(getSaveCfg);
47
55
  const captureConfig = $derived.by(isEditor ? getCaptureConfig : () => ({}));
48
56
  const saveDisabled = $derived.by(() => {
@@ -110,6 +118,10 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
110
118
  url_runnable_args = defaultValues?.url_runnable_args ?? {};
111
119
  dirtyPath = false;
112
120
  can_return_message = false;
121
+ error_handler_path = defaultValues?.error_handler_path ?? undefined;
122
+ error_handler_args = defaultValues?.error_handler_args ?? {};
123
+ retry = defaultValues?.retry ?? undefined;
124
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
113
125
  }
114
126
  finally {
115
127
  clearTimeout(loadingTimeout);
@@ -129,6 +141,10 @@ function loadTriggerConfig(cfg) {
129
141
  url_runnable_args = cfg?.url_runnable_args;
130
142
  can_return_message = cfg?.can_return_message;
131
143
  can_write = canWrite(path, cfg?.extra_perms, $userStore);
144
+ error_handler_path = cfg?.error_handler_path;
145
+ error_handler_args = cfg?.error_handler_args ?? {};
146
+ retry = cfg?.retry;
147
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
132
148
  }
133
149
  function getSaveCfg() {
134
150
  return {
@@ -141,7 +157,10 @@ function getSaveCfg() {
141
157
  initial_messages,
142
158
  url_runnable_args,
143
159
  can_return_message,
144
- enabled
160
+ enabled,
161
+ error_handler_path,
162
+ error_handler_args,
163
+ retry
145
164
  };
146
165
  }
147
166
  async function loadTrigger(defaultConfig) {
@@ -243,14 +262,14 @@ $effect(() => {
243
262
  </Drawer>
244
263
  {:else}
245
264
  <Section label={!customLabel ? 'WebSocket trigger' : ''} headerClass="grow min-w-0 h-[30px]">
246
- <svelte:fragment slot="header">
265
+ {#snippet header()}
247
266
  {#if customLabel}
248
267
  {@render customLabel()}
249
268
  {/if}
250
- </svelte:fragment>
251
- <svelte:fragment slot="action">
269
+ {/snippet}
270
+ {#snippet action()}
252
271
  {@render actionsButtons()}
253
- </svelte:fragment>
272
+ {/snippet}
254
273
  {@render config()}
255
274
  </Section>
256
275
  {/if}
@@ -593,6 +612,28 @@ $effect(() => {
593
612
  </div>
594
613
  </div>
595
614
  </Section>
615
+
616
+ <Section label="Advanced" collapsable>
617
+ <div class="flex flex-col gap-4">
618
+ <div class="min-h-96">
619
+ <Tabs bind:selected={optionTabSelected}>
620
+ <Tab value="error_handler">Error Handler</Tab>
621
+ <Tab value="retries">Retries</Tab>
622
+ </Tabs>
623
+ <div class="mt-4">
624
+ <TriggerRetriesAndErrorHandler
625
+ {optionTabSelected}
626
+ {itemKind}
627
+ {can_write}
628
+ bind:errorHandlerSelected
629
+ bind:error_handler_path
630
+ bind:error_handler_args
631
+ bind:retry
632
+ />
633
+ </div>
634
+ </div>
635
+ </div>
636
+ </Section>
596
637
  </div>
597
638
  {/if}
598
639
  {/snippet}
@@ -2,6 +2,15 @@ import { WebsocketTriggerService } from '../../../gen';
2
2
  import { sendUserToast } from '../../../toast';
3
3
  import { get } from 'svelte/store';
4
4
  export async function saveWebsocketTriggerFromCfg(initialPath, triggerCfg, edit, workspace, usedTriggerKinds) {
5
+ const errorHandlerAndRetries = !triggerCfg.is_flow
6
+ ? {
7
+ error_handler_path: triggerCfg.error_handler_path,
8
+ error_handler_args: triggerCfg.error_handler_path
9
+ ? triggerCfg.error_handler_args
10
+ : undefined,
11
+ retry: triggerCfg.retry
12
+ }
13
+ : {};
5
14
  const requestBody = {
6
15
  path: triggerCfg.path,
7
16
  script_path: triggerCfg.script_path,
@@ -10,7 +19,8 @@ export async function saveWebsocketTriggerFromCfg(initialPath, triggerCfg, edit,
10
19
  filters: triggerCfg.filters,
11
20
  initial_messages: triggerCfg.initial_messages,
12
21
  url_runnable_args: triggerCfg.url_runnable_args,
13
- can_return_message: triggerCfg.can_return_message
22
+ can_return_message: triggerCfg.can_return_message,
23
+ ...errorHandlerAndRetries
14
24
  };
15
25
  try {
16
26
  if (edit) {
@@ -160,8 +160,6 @@ async function onAiProviderChange(provider) {
160
160
  {#if aiProviders[provider]}
161
161
  <div class="mb-4 flex flex-col gap-2">
162
162
  <div class="flex flex-row gap-1">
163
- <!-- this can be removed once the parent component moves to runes -->
164
- <!-- svelte-ignore binding_property_non_reactive -->
165
163
  <ResourcePicker
166
164
  selectFirst
167
165
  resourceType={provider === 'openai' && usingOpenaiClientCredentialsOauth
@@ -0,0 +1,56 @@
1
+ <script lang="ts">import { Plus, X } from 'lucide-svelte';
2
+ let { title = '', tooltip = undefined, items = $bindable([]), placeholder = 'Add filter (e.g. f/**)' } = $props();
3
+ let newItem = $state('');
4
+ let inputRef = $state(null);
5
+ function addItem() {
6
+ const value = newItem.trim();
7
+ if (value && !items.includes(value)) {
8
+ items = [...items, value];
9
+ newItem = '';
10
+ inputRef?.focus();
11
+ }
12
+ }
13
+ function removeItem(idx) {
14
+ items = items.filter((_, i) => i !== idx);
15
+ }
16
+ </script>
17
+
18
+ <div class="flex flex-col gap-1">
19
+ <div class="flex items-center gap-2 mb-1">
20
+ <h4 class="font-semibold text-sm">{title}</h4>
21
+ {#if tooltip}
22
+ {@render tooltip?.()}
23
+ {/if}
24
+ </div>
25
+
26
+ <div class="flex flex-wrap gap-2 items-center mb-1">
27
+ {#each items as item, idx (item)}
28
+ <span class="flex items-center bg-gray-100 rounded-full px-3 py-1 text-xs text-gray-700">
29
+ {item}
30
+ <button
31
+ class="ml-2 text-gray-400 hover:text-red-500 focus:outline-none"
32
+ onclick={() => removeItem(idx)}
33
+ aria-label="Remove filter"
34
+ >
35
+ <X size={14} />
36
+ </button>
37
+ </span>
38
+ {/each}
39
+
40
+ <input
41
+ bind:this={inputRef}
42
+ class="border border-gray-300 rounded-full px-3 py-1 text-xs focus:outline-none focus:ring-2 focus:ring-primary"
43
+ {placeholder}
44
+ value={newItem}
45
+ oninput={(e) => (newItem = e.currentTarget.value)}
46
+ onkeydown={(e) => e.key === 'Enter' && (addItem(), e.preventDefault())}
47
+ />
48
+ <button
49
+ class="ml-1 text-primary hover:bg-primary/10 rounded-full p-1"
50
+ onclick={addItem}
51
+ aria-label="Add filter"
52
+ >
53
+ <Plus size={14} />
54
+ </button>
55
+ </div>
56
+ </div>
@@ -0,0 +1,8 @@
1
+ declare const FilterList: import("svelte").Component<{
2
+ title?: string;
3
+ tooltip?: any;
4
+ items?: string[];
5
+ placeholder?: string;
6
+ }, {}, "items">;
7
+ type FilterList = ReturnType<typeof FilterList>;
8
+ export default FilterList;