@knime/hub-features 1.28.0 → 1.29.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @knime/hub-features
2
2
 
3
+ ## 1.29.1
4
+
5
+ ### Patch Changes
6
+
7
+ - c9fed1d: adjust analytics events payload for cloudhome ad-hoc execution
8
+
9
+ ## 1.29.0
10
+
11
+ ### Minor Changes
12
+
13
+ - da43d97: Migrate from versions:
14
+
15
+ - `ManageVersions` component -> KDS `VersionHistory` component
16
+ - `CreateVersionForm` component -> KDS `CreateVersionForm` component
17
+ - `useVersionsApi` composable -> knime-ui `useVersionsApi` composable
18
+
19
+ Add new export to `hub-features` - `httpClient` - moved from `hub-features/common`.
20
+
21
+ ### Patch Changes
22
+
23
+ - ee02850: Minor changes to analytics event:
24
+
25
+ - rename from "my" secrets to "personal" secrets in cloud home events
26
+ - made the location value `noderepository` into `node_repository` in editor events to be more consistent with others
27
+ - deambiguate events for annotation created and annotation explain via kai
28
+
3
29
  ## 1.28.0
4
30
 
5
31
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knime/hub-features",
3
- "version": "1.28.0",
3
+ "version": "1.29.1",
4
4
  "description": "Vue components & composables for shared hub features",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,11 +24,11 @@
24
24
  ".": {
25
25
  "import": "./src/index.ts"
26
26
  },
27
- "./versions": {
28
- "import": "./src/components/versions/index.ts"
29
- },
30
27
  "./analytics": {
31
28
  "import": "./src/analytics/index.ts"
29
+ },
30
+ "./http-client": {
31
+ "import": "./src/httpClient/index.ts"
32
32
  }
33
33
  },
34
34
  "dependencies": {
@@ -39,8 +39,8 @@
39
39
  "lodash-es": "4.18.1",
40
40
  "ofetch": "^1.4.1",
41
41
  "typescript": "^5.9.3",
42
- "@knime/styles": "1.15.1",
43
42
  "@knime/components": "1.46.6",
43
+ "@knime/styles": "1.15.1",
44
44
  "@knime/utils": "1.11.0"
45
45
  },
46
46
  "peerDependencies": {
@@ -52,7 +52,7 @@
52
52
  "@vue/test-utils": "2.4.6",
53
53
  "consola": "3.4.2",
54
54
  "json-schema-to-typescript": "^15.0.4",
55
- "vite": "^7.3.1",
55
+ "vite": "^7.3.5",
56
56
  "vite-svg-loader": "5.1.0",
57
57
  "vue-tsc": "3.0.4"
58
58
  },
@@ -1,6 +1,4 @@
1
-
2
- /* eslint-disable camelcase */
3
- /* eslint-disable @typescript-eslint/no-explicit-any */
1
+ /* eslint-disable */
4
2
  // AUTO-GENERATED FILE. DO NOT EDIT.
5
3
  import type { AnalyticsEvent, DefaultContext, EventFunctionArgs, GeneratedStaticFields, SchemaStaticFields } from "../types";
6
4
  import { toSnakeCaseDeep } from "../utils/toSnakeCaseDeep";
@@ -17,7 +15,7 @@ export const adHocExecutionStartedDeploymentsPage = <T extends DefaultContext>(c
17
15
  event_source: "cloudhome",
18
16
  event_display_name: "Ad Hoc Execution Started",
19
17
  interaction: {
20
- location: "main_area",
18
+ location: "contextual_side_panel",
21
19
  page: "deployments",
22
20
  trigger: "user",
23
21
  type: "click",
@@ -90,7 +88,7 @@ export const secretCreatedTeamSecrets = <T extends DefaultContext>(ctx: T) => ()
90
88
  event_display_name: "Secret Created",
91
89
  interaction: {
92
90
  location: "contextual_side_panel",
93
- page: "secrets",
91
+ page: "team_secrets",
94
92
  trigger: "user",
95
93
  type: "click",
96
94
  },
@@ -104,7 +102,7 @@ export const secretCreatedTeamSecrets = <T extends DefaultContext>(ctx: T) => ()
104
102
  /**
105
103
  * Fired when the user creates a new secret by clicking Create in the side panel on the personal secrets page
106
104
  */
107
- export const secretCreatedMySecrets = <T extends DefaultContext>(ctx: T) => (): AnalyticsEvent => {
105
+ export const secretCreatedPersonalSecrets = <T extends DefaultContext>(ctx: T) => (): AnalyticsEvent => {
108
106
  const staticData = {
109
107
  ...toSnakeCaseDeep(ctx),
110
108
  unique_event_id: crypto.randomUUID(),
@@ -114,7 +112,7 @@ export const secretCreatedMySecrets = <T extends DefaultContext>(ctx: T) => ():
114
112
  event_display_name: "Secret Created",
115
113
  interaction: {
116
114
  location: "contextual_side_panel",
117
- page: "my_secrets",
115
+ page: "personal_secrets",
118
116
  trigger: "user",
119
117
  type: "click",
120
118
  },
@@ -185,7 +183,7 @@ export const deploymentSharedDeploymentsSharingPopup = <T extends DefaultContext
185
183
  event_source: "cloudhome",
186
184
  event_display_name: "Deployment Shared",
187
185
  interaction: {
188
- location: "module",
186
+ location: "popup",
189
187
  page: "deployments",
190
188
  trigger: "user",
191
189
  type: "click",
@@ -233,7 +231,7 @@ export const deploymentSharedWorkflowSharingPopup = <T extends DefaultContext>(c
233
231
  event_source: "cloudhome",
234
232
  event_display_name: "Deployment Shared",
235
233
  interaction: {
236
- location: "module",
234
+ location: "popup",
237
235
  page: "workflow_details",
238
236
  trigger: "user",
239
237
  type: "click",
@@ -22,9 +22,7 @@ const TYPE_HELPERS = {
22
22
  };
23
23
 
24
24
  const HEADER_LINES = [
25
- "/* eslint-disable max-lines */",
26
- "/* eslint-disable camelcase */",
27
- "/* eslint-disable @typescript-eslint/no-explicit-any */",
25
+ "/* eslint-disable */",
28
26
  "// AUTO-GENERATED FILE. DO NOT EDIT.",
29
27
  `import type { ${Object.values(TYPE_HELPERS).join(", ")} } from "../types";`,
30
28
  'import { toSnakeCaseDeep } from "../utils/toSnakeCaseDeep";',
@@ -1,6 +1,4 @@
1
- /* eslint-disable max-lines */
2
- /* eslint-disable camelcase */
3
- /* eslint-disable @typescript-eslint/no-explicit-any */
1
+ /* eslint-disable */
4
2
  // AUTO-GENERATED FILE. DO NOT EDIT.
5
3
  import type { AnalyticsEvent, DefaultContext, EventFunctionArgs, GeneratedStaticFields, SchemaStaticFields } from "../types";
6
4
  import { toSnakeCaseDeep } from "../utils/toSnakeCaseDeep";
@@ -177,7 +175,7 @@ export const annotationCreatedKaiExplain = <T extends DefaultContext>(ctx: T) =>
177
175
  ...toSnakeCaseDeep(ctx),
178
176
  unique_event_id: crypto.randomUUID(),
179
177
  timestamp: new Date().toISOString(),
180
- event_name: "annotation_created",
178
+ event_name: "annotation_created_kai_explain",
181
179
  event_source: "editor",
182
180
  event_display_name: "Annotation Created",
183
181
  interaction: {
@@ -303,7 +301,7 @@ export const nodeCreatedNodeRepoDragDrop = <T extends DefaultContext>(ctx: T) =>
303
301
  event_source: "editor",
304
302
  event_display_name: "Node Created",
305
303
  interaction: {
306
- location: "noderepository",
304
+ location: "node_repository",
307
305
  trigger: "user",
308
306
  type: "drag_drop",
309
307
  },
@@ -323,7 +321,7 @@ export const nodeCreatedNodeRepoDoubleClick = <T extends DefaultContext>(ctx: T)
323
321
  event_source: "editor",
324
322
  event_display_name: "Node Created",
325
323
  interaction: {
326
- location: "noderepository",
324
+ location: "node_repository",
327
325
  trigger: "user",
328
326
  type: "double_click",
329
327
  },
@@ -343,7 +341,7 @@ export const nodeCreatedNodeRepoKeyboard = <T extends DefaultContext>(ctx: T) =>
343
341
  event_source: "editor",
344
342
  event_display_name: "Node Created",
345
343
  interaction: {
346
- location: "noderepository",
344
+ location: "node_repository",
347
345
  trigger: "user",
348
346
  type: "key_press",
349
347
  },
@@ -544,7 +542,7 @@ export const nodeSearchedNodeRepo = <T extends DefaultContext>(ctx: T) => (event
544
542
  event_source: "editor",
545
543
  event_display_name: "Node Searched",
546
544
  interaction: {
547
- location: "noderepository",
545
+ location: "node_repository",
548
546
  trigger: "user",
549
547
  type: "key_press",
550
548
  },
@@ -604,7 +602,7 @@ export const nodeRepositoryOpened = <T extends DefaultContext>(ctx: T) => (): An
604
602
  event_source: "editor",
605
603
  event_display_name: "Node Repository Opened",
606
604
  interaction: {
607
- location: "noderepository",
605
+ location: "node_repository",
608
606
  trigger: "user",
609
607
  type: "click",
610
608
  },
@@ -111,7 +111,7 @@ export interface AnalyticsEventSchema {
111
111
  payload: EmptyPayload;
112
112
  };
113
113
  annotationCreatedKaiExplain: {
114
- event_name: "annotation_created";
114
+ event_name: "annotation_created_kai_explain";
115
115
  event_source: "editor";
116
116
  event_display_name: "Annotation Created";
117
117
  interaction: {
@@ -183,7 +183,7 @@ export interface AnalyticsEventSchema {
183
183
  event_source: "editor";
184
184
  event_display_name: "Node Created";
185
185
  interaction: {
186
- location: "noderepository";
186
+ location: "node_repository";
187
187
  trigger: InteractionTrigger & "user";
188
188
  type: InteractionType & "drag_drop";
189
189
  };
@@ -194,7 +194,7 @@ export interface AnalyticsEventSchema {
194
194
  event_source: "editor";
195
195
  event_display_name: "Node Created";
196
196
  interaction: {
197
- location: "noderepository";
197
+ location: "node_repository";
198
198
  trigger: InteractionTrigger & "user";
199
199
  type: InteractionType & "double_click";
200
200
  };
@@ -205,7 +205,7 @@ export interface AnalyticsEventSchema {
205
205
  event_source: "editor";
206
206
  event_display_name: "Node Created";
207
207
  interaction: {
208
- location: "noderepository";
208
+ location: "node_repository";
209
209
  trigger: InteractionTrigger & "user";
210
210
  type: InteractionType & "key_press";
211
211
  };
@@ -316,7 +316,7 @@ export interface AnalyticsEventSchema {
316
316
  event_source: "editor";
317
317
  event_display_name: "Node Searched";
318
318
  interaction: {
319
- location: "noderepository";
319
+ location: "node_repository";
320
320
  trigger: InteractionTrigger & "user";
321
321
  type: InteractionType & "key_press";
322
322
  };
@@ -349,7 +349,7 @@ export interface AnalyticsEventSchema {
349
349
  event_source: "editor";
350
350
  event_display_name: "Node Repository Opened";
351
351
  interaction: {
352
- location: "noderepository";
352
+ location: "node_repository";
353
353
  trigger: InteractionTrigger & "user";
354
354
  type: InteractionType & "click";
355
355
  };
@@ -427,7 +427,7 @@ export interface AnalyticsEventSchema {
427
427
  event_source: "cloudhome";
428
428
  event_display_name: "Ad Hoc Execution Started";
429
429
  interaction: {
430
- location: "main_area";
430
+ location: "contextual_side_panel";
431
431
  page: "deployments";
432
432
  trigger: InteractionTrigger & "user";
433
433
  type: InteractionType & "click";
@@ -497,19 +497,19 @@ export interface AnalyticsEventSchema {
497
497
  event_display_name: "Secret Created";
498
498
  interaction: {
499
499
  location: "contextual_side_panel";
500
- page: "secrets";
500
+ page: "team_secrets";
501
501
  trigger: InteractionTrigger & "user";
502
502
  type: InteractionType & "click";
503
503
  };
504
504
  payload: EmptyPayload;
505
505
  };
506
- secretCreatedMySecrets: {
506
+ secretCreatedPersonalSecrets: {
507
507
  event_name: "secret_created";
508
508
  event_source: "cloudhome";
509
509
  event_display_name: "Secret Created";
510
510
  interaction: {
511
511
  location: "contextual_side_panel";
512
- page: "my_secrets";
512
+ page: "personal_secrets";
513
513
  trigger: InteractionTrigger & "user";
514
514
  type: InteractionType & "click";
515
515
  };
@@ -701,7 +701,7 @@ export interface AnalyticsEventSchema {
701
701
  event_source: "cloudhome";
702
702
  event_display_name: "Deployment Shared";
703
703
  interaction: {
704
- location: "module";
704
+ location: "popup";
705
705
  page: "deployments";
706
706
  trigger: InteractionTrigger & "user";
707
707
  type: InteractionType & "click";
@@ -725,7 +725,7 @@ export interface AnalyticsEventSchema {
725
725
  event_source: "cloudhome";
726
726
  event_display_name: "Deployment Shared";
727
727
  interaction: {
728
- location: "module";
728
+ location: "popup";
729
729
  page: "workflow_details";
730
730
  trigger: InteractionTrigger & "user";
731
731
  type: InteractionType & "click";
@@ -57,7 +57,7 @@
57
57
  "actionRedoneToolbar",
58
58
  "actionRedoneKeyboard",
59
59
  "versionCreated",
60
- "secretCreatedMySecrets",
60
+ "secretCreatedPersonalSecrets",
61
61
  "secretCreatedTeamSecrets",
62
62
  "sessionEnded",
63
63
  "sessionInterrupted",
@@ -573,7 +573,7 @@
573
573
  "properties": {
574
574
  "event_name": {
575
575
  "type": "string",
576
- "const": "annotation_created"
576
+ "const": "annotation_created_kai_explain"
577
577
  },
578
578
  "event_source": {
579
579
  "type": "string",
@@ -952,7 +952,7 @@
952
952
  "properties": {
953
953
  "location": {
954
954
  "type": "string",
955
- "const": "noderepository"
955
+ "const": "node_repository"
956
956
  },
957
957
  "trigger": {
958
958
  "allOf": [
@@ -1011,7 +1011,7 @@
1011
1011
  "properties": {
1012
1012
  "location": {
1013
1013
  "type": "string",
1014
- "const": "noderepository"
1014
+ "const": "node_repository"
1015
1015
  },
1016
1016
  "trigger": {
1017
1017
  "allOf": [
@@ -1070,7 +1070,7 @@
1070
1070
  "properties": {
1071
1071
  "location": {
1072
1072
  "type": "string",
1073
- "const": "noderepository"
1073
+ "const": "node_repository"
1074
1074
  },
1075
1075
  "trigger": {
1076
1076
  "allOf": [
@@ -1664,7 +1664,7 @@
1664
1664
  "properties": {
1665
1665
  "location": {
1666
1666
  "type": "string",
1667
- "const": "noderepository"
1667
+ "const": "node_repository"
1668
1668
  },
1669
1669
  "trigger": {
1670
1670
  "allOf": [
@@ -1841,7 +1841,7 @@
1841
1841
  "properties": {
1842
1842
  "location": {
1843
1843
  "type": "string",
1844
- "const": "noderepository"
1844
+ "const": "node_repository"
1845
1845
  },
1846
1846
  "trigger": {
1847
1847
  "allOf": [
@@ -2259,7 +2259,7 @@
2259
2259
  "properties": {
2260
2260
  "location": {
2261
2261
  "type": "string",
2262
- "const": "main_area"
2262
+ "const": "contextual_side_panel"
2263
2263
  },
2264
2264
  "page": {
2265
2265
  "type": "string",
@@ -2632,7 +2632,7 @@
2632
2632
  },
2633
2633
  "page": {
2634
2634
  "type": "string",
2635
- "const": "secrets"
2635
+ "const": "team_secrets"
2636
2636
  },
2637
2637
  "trigger": {
2638
2638
  "allOf": [
@@ -2661,7 +2661,7 @@
2661
2661
  }
2662
2662
  }
2663
2663
  },
2664
- "secretCreatedMySecrets": {
2664
+ "secretCreatedPersonalSecrets": {
2665
2665
  "type": "object",
2666
2666
  "additionalProperties": false,
2667
2667
  "$comment": "Fired when the user creates a new secret by clicking Create in the side panel on the personal secrets page",
@@ -2696,7 +2696,7 @@
2696
2696
  },
2697
2697
  "page": {
2698
2698
  "type": "string",
2699
- "const": "my_secrets"
2699
+ "const": "personal_secrets"
2700
2700
  },
2701
2701
  "trigger": {
2702
2702
  "allOf": [
@@ -3722,7 +3722,7 @@
3722
3722
  "properties": {
3723
3723
  "location": {
3724
3724
  "type": "string",
3725
- "const": "module"
3725
+ "const": "popup"
3726
3726
  },
3727
3727
  "page": {
3728
3728
  "type": "string",
@@ -3850,7 +3850,7 @@
3850
3850
  "properties": {
3851
3851
  "location": {
3852
3852
  "type": "string",
3853
- "const": "module"
3853
+ "const": "popup"
3854
3854
  },
3855
3855
  "page": {
3856
3856
  "type": "string",
@@ -0,0 +1 @@
1
+ export const API_BASE_URL = "/_/api";
@@ -1,9 +1,9 @@
1
1
  import { merge } from "lodash-es"; // eslint-disable-line depend/ban-dependencies
2
2
  import { type FetchOptions, ofetch } from "ofetch";
3
3
 
4
- import { DEFAULT_API_BASE_URL } from "./constants";
4
+ import { API_BASE_URL } from "./constants";
5
5
 
6
- export const defaultConfig: FetchOptions = {
6
+ const defaultConfig: FetchOptions = {
7
7
  headers: {
8
8
  "Content-Type": "application/json",
9
9
 
@@ -12,11 +12,12 @@ export const defaultConfig: FetchOptions = {
12
12
  },
13
13
  } as const;
14
14
 
15
- export const getFetchClient = (customOptions?: FetchOptions) => {
16
- const { baseURL = DEFAULT_API_BASE_URL, ...otherCustomOptions } =
17
- customOptions ?? {};
15
+ const createHttpClient = (customOptions?: FetchOptions) => {
16
+ const { baseURL = API_BASE_URL, ...otherCustomOptions } = customOptions ?? {};
18
17
 
19
18
  return ofetch.create(
20
19
  merge({ baseURL, ...otherCustomOptions }, defaultConfig),
21
20
  );
22
21
  };
22
+
23
+ export { type FetchOptions, defaultConfig, createHttpClient };
@@ -0,0 +1,2 @@
1
+ export * from "./createHttpClient";
2
+ export * from "./constants";
package/src/index.ts CHANGED
@@ -4,3 +4,4 @@ export * from "./useDownloadArtifact";
4
4
  export * from "./components/avatars";
5
5
  export * from "./embeddingSDK";
6
6
  export * from "./authUtils";
7
+ export * from "./httpClient";
@@ -4,7 +4,7 @@ import { FetchError, type FetchOptions } from "ofetch";
4
4
  import type { DownloadItem as DownloadItemExternal } from "@knime/components";
5
5
  import { sleep } from "@knime/utils";
6
6
 
7
- import { getFetchClient } from "../common/ofetchClient";
7
+ import { createHttpClient } from "../httpClient/createHttpClient";
8
8
  import { rfcErrors } from "../rfcErrors";
9
9
 
10
10
  const DEFAULT_MAX_RETRIES = null;
@@ -91,7 +91,7 @@ const isAbortError = (error: unknown) =>
91
91
  export const useDownloadArtifact = (
92
92
  options: UseDownloadArtifactOptions = {},
93
93
  ) => {
94
- const $ofetch = getFetchClient(options.customFetchClientOptions);
94
+ const $ofetch = createHttpClient(options.customFetchClientOptions);
95
95
 
96
96
  const downloadItems = ref<Record<string, DownloadItem>>({});
97
97
  const abortControllers: Record<string, AbortController> = {};
@@ -9,7 +9,7 @@ import {
9
9
  promise,
10
10
  } from "@knime/utils";
11
11
 
12
- import { getFetchClient } from "../common/ofetchClient";
12
+ import { createHttpClient } from "../httpClient/createHttpClient";
13
13
  import { rfcErrors } from "../rfcErrors";
14
14
 
15
15
  const DEFAULT_MAX_UPLOAD_QUEUE_SIZE = 10;
@@ -120,7 +120,7 @@ type UseFileUploadOptions = {
120
120
  * ```
121
121
  */
122
122
  export const useFileUpload = (options: UseFileUploadOptions = {}) => {
123
- const $ofetch = getFetchClient(options.customFetchClientOptions);
123
+ const $ofetch = createHttpClient(options.customFetchClientOptions);
124
124
 
125
125
  const prepareUpload = (
126
126
  parentId: string,
@@ -1 +0,0 @@
1
- export const DEFAULT_API_BASE_URL = "/_/api";
@@ -1,155 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, nextTick, onMounted, ref } from "vue";
3
- import { useTextareaAutosize } from "@vueuse/core";
4
-
5
- import {
6
- InputField,
7
- Label,
8
- SideDrawerControls,
9
- SideDrawerHeader,
10
- TextArea,
11
- } from "@knime/components";
12
-
13
- type Props = {
14
- isCreationPending?: boolean;
15
- };
16
-
17
- withDefaults(defineProps<Props>(), { isCreationPending: false });
18
-
19
- const emit = defineEmits<{
20
- create: [{ name: string; description: string }];
21
- cancel: [hasUnsavedChanges: boolean];
22
- }>();
23
-
24
- const versionName = ref("");
25
- const versionDescription = ref("");
26
-
27
- const descriptionEditor = ref<InstanceType<typeof TextArea> | null>(null);
28
-
29
- onMounted(() => {
30
- useTextareaAutosize({
31
- element: descriptionEditor.value?.$el.getElementsByTagName("textarea")[0],
32
- input: versionDescription,
33
- });
34
- });
35
-
36
- const doValidate = ref(false);
37
-
38
- const isVersionNameInvalid = computed(() => {
39
- return doValidate.value && versionName.value.length <= 0;
40
- });
41
-
42
- const hasUnsavedChanges = computed(() => {
43
- return versionName.value !== "" || versionDescription.value !== "";
44
- });
45
-
46
- const onCreate = async () => {
47
- doValidate.value = true;
48
- await nextTick();
49
-
50
- if (!isVersionNameInvalid.value) {
51
- emit("create", {
52
- name: versionName.value,
53
- description: versionDescription.value,
54
- });
55
- }
56
- };
57
- </script>
58
-
59
- <template>
60
- <div class="create-version-form">
61
- <SideDrawerHeader
62
- title="Create Version"
63
- description="Give your version a name and description. Versions can be used to create a deployment.
64
- "
65
- :is-sub-drawer="true"
66
- @close="$emit('cancel', hasUnsavedChanges)"
67
- />
68
- <div class="form-content">
69
- <Label text="Version name">
70
- <InputField
71
- v-model="versionName"
72
- type="text"
73
- required
74
- :is-valid="!isVersionNameInvalid"
75
- />
76
- <div v-if="isVersionNameInvalid" class="error">
77
- Please enter at least 1 character.
78
- </div>
79
- </Label>
80
- <Label text="Description">
81
- <TextArea
82
- ref="descriptionEditor"
83
- v-model="versionDescription"
84
- class="description"
85
- />
86
- </Label>
87
- <div class="controls">
88
- <SideDrawerControls
89
- class="create-version-controls"
90
- :edit-enabled="true"
91
- :processing="isCreationPending"
92
- action-label="Create"
93
- :disabled="isVersionNameInvalid || isCreationPending"
94
- @save="onCreate"
95
- @cancel="$emit('cancel', hasUnsavedChanges)"
96
- />
97
- </div>
98
- </div>
99
- </div>
100
- </template>
101
-
102
- <style lang="postcss" scoped>
103
- .create-version-form {
104
- display: flex;
105
- flex-direction: column;
106
- width: 100%;
107
- height: 100%;
108
- max-height: 100%;
109
-
110
- & .form-content {
111
- z-index: 1;
112
- display: flex;
113
- flex-direction: column;
114
- gap: 30px;
115
- height: 100%;
116
- padding: 30px 30px 0;
117
- overflow: auto;
118
- overscroll-behavior: none;
119
- background-color: var(--knime-gray-ultra-light);
120
- isolation: isolate;
121
-
122
- & .description {
123
- display: flex;
124
- width: 100%;
125
- max-width: unset;
126
-
127
- & :deep(textarea) {
128
- box-sizing: content-box;
129
- width: 100%;
130
- max-height: 200px;
131
- resize: none;
132
- }
133
- }
134
-
135
- & .error {
136
- position: absolute;
137
- margin-top: 6px;
138
- font-size: 13px;
139
- font-weight: 300;
140
- line-height: 18px;
141
- color: var(--theme-color-error);
142
- word-break: keep-all;
143
- }
144
-
145
- & .controls {
146
- margin: 0 -30px;
147
- margin-top: auto;
148
- }
149
-
150
- .create-version-controls {
151
- margin: 0;
152
- }
153
- }
154
- }
155
- </style>