@genesislcap/foundation-ui 14.406.0-workspaces.5 → 14.406.0-workspaces.7

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 (50) hide show
  1. package/dist/custom-elements.json +304 -2152
  2. package/dist/dts/index.d.ts +0 -2
  3. package/dist/dts/index.d.ts.map +1 -1
  4. package/dist/esm/index.js +0 -2
  5. package/package.json +19 -19
  6. package/dist/dts/components/grid-register/grid-register.d.ts +0 -19
  7. package/dist/dts/components/grid-register/grid-register.d.ts.map +0 -1
  8. package/dist/dts/components/grid-register/grid-register.template.d.ts +0 -4
  9. package/dist/dts/components/grid-register/grid-register.template.d.ts.map +0 -1
  10. package/dist/dts/components/layout-wrapper/layout-wrapper.d.ts +0 -10
  11. package/dist/dts/components/layout-wrapper/layout-wrapper.d.ts.map +0 -1
  12. package/dist/dts/components/layout-wrapper/layout-wrapper.template.d.ts +0 -4
  13. package/dist/dts/components/layout-wrapper/layout-wrapper.template.d.ts.map +0 -1
  14. package/dist/dts/workspace/filter-registry.d.ts +0 -34
  15. package/dist/dts/workspace/filter-registry.d.ts.map +0 -1
  16. package/dist/dts/workspace/grid-registry.d.ts +0 -47
  17. package/dist/dts/workspace/grid-registry.d.ts.map +0 -1
  18. package/dist/dts/workspace/index.d.ts +0 -7
  19. package/dist/dts/workspace/index.d.ts.map +0 -1
  20. package/dist/dts/workspace/layout-registry.d.ts +0 -27
  21. package/dist/dts/workspace/layout-registry.d.ts.map +0 -1
  22. package/dist/dts/workspace/workspace-state.d.ts +0 -45
  23. package/dist/dts/workspace/workspace-state.d.ts.map +0 -1
  24. package/dist/dts/workspace/workspace-state.types.d.ts +0 -26
  25. package/dist/dts/workspace/workspace-state.types.d.ts.map +0 -1
  26. package/dist/dts/workspace/workspace.types.d.ts +0 -25
  27. package/dist/dts/workspace/workspace.types.d.ts.map +0 -1
  28. package/dist/dts/workspace-manager/index.d.ts +0 -2
  29. package/dist/dts/workspace-manager/index.d.ts.map +0 -1
  30. package/dist/dts/workspace-manager/workspace-manager.d.ts +0 -62
  31. package/dist/dts/workspace-manager/workspace-manager.d.ts.map +0 -1
  32. package/dist/dts/workspace-manager/workspace-manager.styles.d.ts +0 -2
  33. package/dist/dts/workspace-manager/workspace-manager.styles.d.ts.map +0 -1
  34. package/dist/dts/workspace-manager/workspace-manager.template.d.ts +0 -4
  35. package/dist/dts/workspace-manager/workspace-manager.template.d.ts.map +0 -1
  36. package/dist/esm/components/grid-register/grid-register.js +0 -137
  37. package/dist/esm/components/grid-register/grid-register.template.js +0 -4
  38. package/dist/esm/components/layout-wrapper/layout-wrapper.js +0 -62
  39. package/dist/esm/components/layout-wrapper/layout-wrapper.template.js +0 -4
  40. package/dist/esm/workspace/filter-registry.js +0 -47
  41. package/dist/esm/workspace/grid-registry.js +0 -113
  42. package/dist/esm/workspace/index.js +0 -6
  43. package/dist/esm/workspace/layout-registry.js +0 -46
  44. package/dist/esm/workspace/workspace-state.js +0 -193
  45. package/dist/esm/workspace/workspace-state.types.js +0 -1
  46. package/dist/esm/workspace/workspace.types.js +0 -1
  47. package/dist/esm/workspace-manager/index.js +0 -1
  48. package/dist/esm/workspace-manager/workspace-manager.js +0 -432
  49. package/dist/esm/workspace-manager/workspace-manager.styles.js +0 -138
  50. package/dist/esm/workspace-manager/workspace-manager.template.js +0 -259
@@ -1,432 +0,0 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { Auth, Connect } from '@genesislcap/foundation-comms';
3
- import { showNotificationDialog, showNotificationToast, } from '@genesislcap/foundation-notifications';
4
- import { customElement, observable } from '@microsoft/fast-element';
5
- import { FoundationElement } from '@microsoft/fast-foundation';
6
- import { LayoutRegistry, GridRegistry, FilterRegistry, WorkspaceState, } from '../workspace';
7
- import { WorkspaceManagerStyles as styles } from './workspace-manager.styles';
8
- import { WORKSPACE_DESCRIPTION_MAX, WorkspaceManagerTemplate as template, } from './workspace-manager.template';
9
- let WorkspaceManager = class WorkspaceManager extends FoundationElement {
10
- constructor() {
11
- super(...arguments);
12
- this.workspaceName = '';
13
- this.workspaceDescription = '';
14
- this.savedWorkspaces = [];
15
- this.sharedWorkspaces = [];
16
- this.isLoading = false;
17
- this.applyingWorkspace = false;
18
- this.loadMode = 'MY';
19
- this.saveMode = 'create';
20
- this.selectedWorkspaceToOverwrite = '';
21
- this.workspaceToShare = '';
22
- }
23
- sanitizeDescription(input) {
24
- const cleaned = (input !== null && input !== void 0 ? input : '')
25
- // allow only letters, numbers and whitespace
26
- .replace(/[^a-zA-Z0-9\s]/g, '')
27
- // normalise whitespace
28
- .replace(/\s+/g, ' ')
29
- .trim();
30
- return cleaned.slice(0, WORKSPACE_DESCRIPTION_MAX);
31
- }
32
- updateWorkspaceDescription(raw) {
33
- this.workspaceDescription = this.sanitizeDescription(raw);
34
- }
35
- setDescriptionFromSelectedWorkspace() {
36
- var _a, _b;
37
- const name = (_a = this.selectedWorkspaceToOverwrite) === null || _a === void 0 ? void 0 : _a.trim();
38
- if (!name) {
39
- this.workspaceDescription = '';
40
- return;
41
- }
42
- const existing = this.savedWorkspaces.find((w) => w.name === name);
43
- this.workspaceDescription = this.sanitizeDescription((_b = existing === null || existing === void 0 ? void 0 : existing.description) !== null && _b !== void 0 ? _b : '');
44
- }
45
- connectedCallback() {
46
- const _super = Object.create(null, {
47
- connectedCallback: { get: () => super.connectedCallback }
48
- });
49
- return __awaiter(this, void 0, void 0, function* () {
50
- _super.connectedCallback.call(this);
51
- yield this.refreshSavedWorkspaces();
52
- yield this.refreshSharedWorkspaces();
53
- this.canShareWorkspace = this.auth.currentUser.hasPermission('SHARE_WORKSPACE');
54
- });
55
- }
56
- refreshSavedWorkspaces() {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- this.isLoading = true;
59
- try {
60
- this.savedWorkspaces = yield this.workspaceState.getSavedWorkspaces();
61
- }
62
- catch (error) {
63
- console.error('Failed to load saved workspaces', error);
64
- this.savedWorkspaces = [];
65
- }
66
- finally {
67
- this.isLoading = false;
68
- }
69
- });
70
- }
71
- refreshSharedWorkspaces() {
72
- return __awaiter(this, void 0, void 0, function* () {
73
- try {
74
- const response = yield this.connect.request('REQ_SHARED_WORKSPACES');
75
- const rows = (response === null || response === void 0 ? void 0 : response.REPLY) || [];
76
- this.sharedWorkspaces = rows.map((row) => {
77
- var _a;
78
- return ({
79
- id: row.SHARED_WORKSPACE_ID,
80
- name: row.WORKSPACE_NAME,
81
- userName: row.USER_NAME,
82
- description: (_a = row.DESCRIPTION) !== null && _a !== void 0 ? _a : undefined,
83
- createdOn: row.CREATED_ON,
84
- modifiedOn: row.MODIFIED_ON,
85
- data: row.WORKSPACE_DATA,
86
- });
87
- });
88
- }
89
- catch (error) {
90
- this.notifyError(`REQ_SHARED_WORKSPACES ${JSON.stringify(error)}`);
91
- console.error('Failed to load shared workspaces', error);
92
- this.sharedWorkspaces = [];
93
- }
94
- });
95
- }
96
- notifyError(body = 'Error') {
97
- showNotificationToast({ title: 'Error', body, iconName: 'bell', toast: { type: 'error', autoClose: false } }, 'rapid');
98
- }
99
- saveWorkspace() {
100
- return __awaiter(this, void 0, void 0, function* () {
101
- const workspaceName = this.saveMode === 'overwrite'
102
- ? this.selectedWorkspaceToOverwrite.trim()
103
- : this.workspaceName.trim();
104
- if (!workspaceName) {
105
- console.error('workspace-manager: workspace name is required');
106
- return;
107
- }
108
- try {
109
- const layoutConfigs = this.layoutRegistry.getLayoutsConfigs();
110
- const gridSettings = this.gridRegistry.getAllGridsSettings();
111
- const filterValues = this.filterRegistry.getAllFiltersValues();
112
- yield this.workspaceState.saveWorkspace(workspaceName, layoutConfigs, gridSettings, filterValues, this.workspaceDescription.trim() || undefined);
113
- this.workspaceName = '';
114
- this.workspaceDescription = '';
115
- this.closeSaveDialog();
116
- yield this.refreshSavedWorkspaces();
117
- console.log('Workspace saved successfully');
118
- }
119
- catch (error) {
120
- console.error('Failed to save workspace', error);
121
- }
122
- });
123
- }
124
- applyWorkspace(workspace) {
125
- return __awaiter(this, void 0, void 0, function* () {
126
- if (workspace.filters && workspace.filters.length > 0) {
127
- this.filterRegistry.applyFiltersValues(workspace.filters);
128
- }
129
- if (workspace.layouts && workspace.layouts.length > 0) {
130
- yield this.layoutRegistry.applySavedLayouts(workspace.layouts);
131
- }
132
- if (workspace.grids && workspace.grids.length > 0) {
133
- yield this.gridRegistry.applyAllGridsSettings(workspace.grids);
134
- }
135
- });
136
- }
137
- loadWorkspace(workspaceName) {
138
- return __awaiter(this, void 0, void 0, function* () {
139
- try {
140
- this.applyingWorkspace = true;
141
- const workspace = yield this.workspaceState.loadWorkspace(workspaceName);
142
- if (workspace) {
143
- yield this.applyWorkspace(workspace);
144
- this.closeLoadDialog();
145
- console.log('Workspace loaded successfully');
146
- }
147
- else {
148
- console.warn('Workspace not found:', workspaceName);
149
- }
150
- }
151
- catch (error) {
152
- this.applyingWorkspace = false;
153
- console.error('Failed to load workspace', error);
154
- }
155
- this.applyingWorkspace = false;
156
- });
157
- }
158
- requestSharedWorkspace(SHARED_WORKSPACE_ID) {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- try {
161
- const response = yield this.connect.request('REQ_LOAD_SHARED_WORKSPACE', {
162
- REQUEST: { SHARED_WORKSPACE_ID },
163
- });
164
- return response.REPLY || [];
165
- }
166
- catch (e) {
167
- console.error(e);
168
- }
169
- });
170
- }
171
- loadSharedWorkspace(shared) {
172
- return __awaiter(this, void 0, void 0, function* () {
173
- try {
174
- this.applyingWorkspace = true;
175
- const sharedData = yield this.requestSharedWorkspace(shared.id);
176
- if (!(sharedData === null || sharedData === void 0 ? void 0 : sharedData.length)) {
177
- console.warn('workspace has no data');
178
- return;
179
- }
180
- const dataJoined = sharedData.map((d) => d.WORKSPACE_DATA).join('');
181
- const workspace = JSON.parse(dataJoined);
182
- yield this.applyWorkspace(workspace);
183
- this.closeLoadDialog();
184
- console.log('Shared workspace loaded successfully');
185
- }
186
- catch (error) {
187
- console.error('Failed to load shared workspace', error);
188
- }
189
- this.applyingWorkspace = false;
190
- });
191
- }
192
- deleteWorkspace(workspaceName) {
193
- return __awaiter(this, void 0, void 0, function* () {
194
- try {
195
- yield this.workspaceState.deleteWorkspace(workspaceName);
196
- yield this.refreshSavedWorkspaces();
197
- console.log('Workspace deleted successfully');
198
- }
199
- catch (error) {
200
- console.error('Failed to delete workspace', error);
201
- }
202
- });
203
- }
204
- showDeleteConfirmation(title, body, actionFunction, dialogBoundary) {
205
- showNotificationDialog({
206
- title,
207
- body,
208
- dialog: {
209
- confirmingActions: [{ label: 'Delete', action: actionFunction }],
210
- dismissingAction: { label: 'Cancel' },
211
- },
212
- }, 'rapid', dialogBoundary);
213
- }
214
- confirmDeleteWorkspace(workspaceName) {
215
- const trimmedName = workspaceName === null || workspaceName === void 0 ? void 0 : workspaceName.trim();
216
- if (!trimmedName)
217
- return;
218
- this.showDeleteConfirmation('Delete workspace', `Are you sure you want to delete the workspace "${trimmedName}"? This action cannot be undone.`, () => this.deleteWorkspace(trimmedName), this.dialogBoundary);
219
- }
220
- modifySharedWorkspace(sharedWorkspace) {
221
- return __awaiter(this, void 0, void 0, function* () {
222
- var _a, _b;
223
- try {
224
- const layouts = this.layoutRegistry.getLayoutsConfigs();
225
- const grids = this.gridRegistry.getAllGridsSettings();
226
- const filters = this.filterRegistry.getAllFiltersValues();
227
- const baseWorkspace = yield this.workspaceState.loadWorkspace(sharedWorkspace.name);
228
- const description = this.sanitizeDescription((_b = (_a = baseWorkspace === null || baseWorkspace === void 0 ? void 0 : baseWorkspace.description) !== null && _a !== void 0 ? _a : sharedWorkspace.description) !== null && _b !== void 0 ? _b : '') ||
229
- undefined;
230
- const workspace = {
231
- name: sharedWorkspace.name,
232
- username: sharedWorkspace.userName,
233
- description,
234
- layouts,
235
- grids,
236
- filters,
237
- savedAt: new Date().toISOString(),
238
- };
239
- const response = yield this.connect.commitEvent('EVENT_SHARED_WORKSPACE_MODIFY', {
240
- VALIDATE: false,
241
- DETAILS: {
242
- WORKSPACE_NAME: sharedWorkspace.name,
243
- WORKSPACE_DATA: JSON.stringify(workspace),
244
- WORKSPACE_DESCRIPTION: description !== null && description !== void 0 ? description : null,
245
- },
246
- });
247
- if (response.MESSAGE_TYPE == 'EVENT_ACK') {
248
- this.closeSaveDialog();
249
- }
250
- }
251
- catch (e) {
252
- this.notifyError(`EVENT_SHARED_WORKSPACE_MODIFY ${JSON.stringify(e)}`);
253
- console.error(e);
254
- }
255
- });
256
- }
257
- deleteSharedWorkspace(sharedWorkspace) {
258
- return __awaiter(this, void 0, void 0, function* () {
259
- try {
260
- const response = yield this.connect.commitEvent('EVENT_SHARED_WORKSPACE_DELETE', {
261
- VALIDATE: false,
262
- DETAILS: { WORKSPACE_NAME: sharedWorkspace.name },
263
- });
264
- if (response.MESSAGE_TYPE == 'EVENT_ACK') {
265
- this.closeSaveDialog();
266
- yield this.refreshSharedWorkspaces();
267
- }
268
- }
269
- catch (e) {
270
- this.notifyError(`EVENT_SHARED_WORKSPACE_DELETE ${JSON.stringify(e)}`);
271
- console.error(e);
272
- }
273
- });
274
- }
275
- confirmDeleteSharedWorkspace(sharedWorkspace) {
276
- if (!(sharedWorkspace === null || sharedWorkspace === void 0 ? void 0 : sharedWorkspace.name))
277
- return;
278
- this.showDeleteConfirmation('Delete shared workspace', `Are you sure you want to delete the shared workspace "${sharedWorkspace.name}"? This action cannot be undone.`, () => this.deleteSharedWorkspace(sharedWorkspace), this.sharedWorkspaceDialogBoundary);
279
- }
280
- shareExistingWorkspace(workspaceName) {
281
- return __awaiter(this, void 0, void 0, function* () {
282
- var _a;
283
- const name = workspaceName === null || workspaceName === void 0 ? void 0 : workspaceName.trim();
284
- if (!name)
285
- return;
286
- try {
287
- const workspace = yield this.workspaceState.loadWorkspace(name);
288
- if (!workspace) {
289
- console.warn('Workspace not found for sharing:', name);
290
- return;
291
- }
292
- const response = yield this.connect.commitEvent('EVENT_SHARED_WORKSPACE_INSERT', {
293
- VALIDATE: false,
294
- DETAILS: {
295
- WORKSPACE_NAME: workspace.name,
296
- WORKSPACE_DATA: JSON.stringify(workspace),
297
- WORKSPACE_DESCRIPTION: (_a = workspace.description) !== null && _a !== void 0 ? _a : null,
298
- },
299
- });
300
- if (response.MESSAGE_TYPE == 'EVENT_ACK') {
301
- console.log('Workspace shared successfully');
302
- this.closeSaveDialog();
303
- yield this.refreshSharedWorkspaces();
304
- }
305
- else if (response.MESSAGE_TYPE == 'EVENT_NACK') {
306
- console.warn('Failed to share workspace', response);
307
- this.closeSaveDialog();
308
- }
309
- }
310
- catch (error) {
311
- console.error('Failed to share workspace', error);
312
- }
313
- });
314
- }
315
- openSaveDialog() {
316
- return __awaiter(this, void 0, void 0, function* () {
317
- yield this.refreshSavedWorkspaces();
318
- this.saveModal.show();
319
- this.workspaceName = '';
320
- this.workspaceDescription = '';
321
- this.saveMode = 'create';
322
- this.selectedWorkspaceToOverwrite = '';
323
- this.workspaceToShare = '';
324
- });
325
- }
326
- isWorkspaceExisting(workspaceName) {
327
- return this.savedWorkspaces.some((p) => p.name.toLowerCase() === workspaceName.toLowerCase());
328
- }
329
- saveModeChanged(oldValue, newValue) {
330
- if (newValue === 'create') {
331
- this.selectedWorkspaceToOverwrite = '';
332
- this.workspaceDescription = '';
333
- }
334
- else if (newValue === 'overwrite') {
335
- this.workspaceName = '';
336
- this.setDescriptionFromSelectedWorkspace();
337
- }
338
- else if (newValue === 'shared') {
339
- this.workspaceName = '';
340
- this.selectedWorkspaceToOverwrite = '';
341
- this.workspaceDescription = '';
342
- }
343
- }
344
- selectedWorkspaceToOverwriteChanged(oldValue, newValue) {
345
- if (this.saveMode === 'overwrite') {
346
- this.setDescriptionFromSelectedWorkspace();
347
- }
348
- }
349
- openLoadDialog() {
350
- this.refreshSharedWorkspaces();
351
- this.loadModal.show();
352
- }
353
- closeSaveDialog() {
354
- this.saveModal.close();
355
- this.workspaceName = '';
356
- this.workspaceDescription = '';
357
- }
358
- closeLoadDialog() {
359
- this.loadModal.close();
360
- }
361
- };
362
- __decorate([
363
- observable
364
- ], WorkspaceManager.prototype, "workspaceName", void 0);
365
- __decorate([
366
- observable
367
- ], WorkspaceManager.prototype, "workspaceDescription", void 0);
368
- __decorate([
369
- observable
370
- ], WorkspaceManager.prototype, "savedWorkspaces", void 0);
371
- __decorate([
372
- observable
373
- ], WorkspaceManager.prototype, "sharedWorkspaces", void 0);
374
- __decorate([
375
- observable
376
- ], WorkspaceManager.prototype, "isLoading", void 0);
377
- __decorate([
378
- observable
379
- ], WorkspaceManager.prototype, "applyingWorkspace", void 0);
380
- __decorate([
381
- observable
382
- ], WorkspaceManager.prototype, "loadMode", void 0);
383
- __decorate([
384
- observable
385
- ], WorkspaceManager.prototype, "saveModal", void 0);
386
- __decorate([
387
- observable
388
- ], WorkspaceManager.prototype, "loadModal", void 0);
389
- __decorate([
390
- observable
391
- ], WorkspaceManager.prototype, "saveMode", void 0);
392
- __decorate([
393
- observable
394
- ], WorkspaceManager.prototype, "selectedWorkspaceToOverwrite", void 0);
395
- __decorate([
396
- observable
397
- ], WorkspaceManager.prototype, "workspaceToShare", void 0);
398
- __decorate([
399
- observable
400
- ], WorkspaceManager.prototype, "dialogBoundary", void 0);
401
- __decorate([
402
- observable
403
- ], WorkspaceManager.prototype, "sharedWorkspaceDialogBoundary", void 0);
404
- __decorate([
405
- LayoutRegistry
406
- ], WorkspaceManager.prototype, "layoutRegistry", void 0);
407
- __decorate([
408
- GridRegistry
409
- ], WorkspaceManager.prototype, "gridRegistry", void 0);
410
- __decorate([
411
- FilterRegistry
412
- ], WorkspaceManager.prototype, "filterRegistry", void 0);
413
- __decorate([
414
- WorkspaceState
415
- ], WorkspaceManager.prototype, "workspaceState", void 0);
416
- __decorate([
417
- Connect
418
- ], WorkspaceManager.prototype, "connect", void 0);
419
- __decorate([
420
- Auth
421
- ], WorkspaceManager.prototype, "auth", void 0);
422
- __decorate([
423
- observable
424
- ], WorkspaceManager.prototype, "canShareWorkspace", void 0);
425
- WorkspaceManager = __decorate([
426
- customElement({
427
- name: 'workspace-manager',
428
- template,
429
- styles,
430
- })
431
- ], WorkspaceManager);
432
- export { WorkspaceManager };
@@ -1,138 +0,0 @@
1
- import { css } from '@microsoft/fast-element';
2
- export const WorkspaceManagerStyles = css `
3
- .workspace-manager {
4
- display: flex;
5
- gap: 10px;
6
- align-items: center;
7
- }
8
-
9
- .dialog-content {
10
- padding: 16px;
11
- min-width: 400px;
12
- max-width: 400px;
13
- display: flex;
14
- flex-direction: column;
15
- max-height: 90vh;
16
- overflow: hidden;
17
- }
18
-
19
- .button-group {
20
- display: flex;
21
- gap: 8px;
22
- justify-content: flex-end;
23
- }
24
-
25
- .workspace-list {
26
- display: flex;
27
- flex-direction: column;
28
- gap: 12px;
29
- max-height: 400px;
30
- overflow-y: auto;
31
- margin: 10px 0;
32
- align-items: unset;
33
- }
34
-
35
- rapid-label {
36
- margin-bottom: 10px;
37
- display: block;
38
- }
39
-
40
- .empty-state {
41
- padding: 24px;
42
- text-align: center;
43
- color: var(--neutral-foreground-hint);
44
- }
45
-
46
- .save-mode-selector {
47
- margin-bottom: 16px;
48
- }
49
-
50
- .warning-message {
51
- margin: 12px 0;
52
- padding: 12px;
53
- border: 1px solid var(--warning-color);
54
- border-radius: 4px;
55
- font-size: 14px;
56
- }
57
-
58
- .workspace-item {
59
- padding: 12px;
60
- border: 1px solid var(--neutral-stroke-rest);
61
- border-radius: 4px;
62
- background: var(--neutral-fill-rest);
63
- cursor: pointer;
64
- display: flex;
65
- align-items: center;
66
- }
67
-
68
- .workspace-item:hover {
69
- background: var(--neutral-fill-hover);
70
- }
71
-
72
- .workspace-item::part(control) {
73
- margin-top: 2px;
74
- }
75
-
76
- .workspace-info {
77
- flex: 1;
78
- margin-left: 8px;
79
- }
80
-
81
- .workspace-name {
82
- font-weight: 600;
83
- margin-bottom: 4px;
84
- display: flex;
85
- align-items: center;
86
- gap: 8px;
87
- }
88
-
89
- .workspace-date {
90
- font-size: 12px;
91
- color: var(--neutral-foreground-hint);
92
- }
93
-
94
- .workspace-description {
95
- font-size: 12px;
96
- color: var(--neutral-foreground-hint);
97
- margin-top: 4px;
98
- white-space: pre-wrap;
99
- word-break: break-word;
100
- line-height: 1.4;
101
- }
102
-
103
- .workspace-description-input {
104
- width: 100%;
105
- min-height: 60px;
106
- padding: 8px 12px;
107
- margin-bottom: 16px;
108
- font-family: inherit;
109
- font-size: 14px;
110
- border: 1px solid var(--neutral-stroke-rest);
111
- border-radius: 4px;
112
- background: var(--neutral-fill-rest);
113
- color: var(--neutral-foreground-rest);
114
- resize: vertical;
115
- box-sizing: border-box;
116
- }
117
-
118
- .workspace-description-input::placeholder {
119
- color: var(--neutral-foreground-hint);
120
- }
121
-
122
- .workspace-description-input:focus {
123
- outline: none;
124
- border-color: var(--accent-fill-rest);
125
- }
126
-
127
- .loading-container {
128
- display: flex;
129
- flex-direction: column;
130
- align-items: center;
131
- justify-content: center;
132
- padding: 24px;
133
- }
134
-
135
- .save-field {
136
- margin-bottom: 20px;
137
- }
138
- `;