@conduction/nextcloud-vue 0.1.0-beta.12 → 0.1.0-beta.13

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.
@@ -1,20 +1,1744 @@
1
1
  /* @conduction/nextcloud-vue — Main CSS entry point */
2
- @import './table.css';
3
- @import './card.css';
4
- @import './pagination.css';
5
- @import './detail.css';
6
- @import './badge.css';
7
- @import './layout.css';
8
- @import './utilities.css';
9
- @import './page-header.css';
10
- @import './actions-bar.css';
11
- @import './index-page.css';
12
- @import './index-sidebar.css';
13
- @import './dashboard.css';
14
- @import './detail-page.css';
15
- @import './CnSchemaFormDialog.css';
16
- @import './timeline-stages.css';
17
- @import './context-menu.css';
2
+ /* ========================================
3
+ @conduction/nextcloud-vue — Table Styles
4
+ ======================================== */
5
+ /* Table Container */
6
+ .cn-table-container {
7
+ background: var(--color-main-background);
8
+ border-radius: var(--border-radius);
9
+ overflow-x: auto;
10
+ box-shadow: 0 2px 4px var(--color-box-shadow);
11
+ border: 1px solid var(--color-border);
12
+ margin-bottom: calc(5 * var(--default-grid-baseline));
13
+ }
14
+ .cn-table-container.cn-table-container--scrollable {
15
+ max-height: 400px;
16
+ overflow-y: auto;
17
+ }
18
+ /* Base Table */
19
+ .cn-data-table {
20
+ width: 100%;
21
+ border-collapse: collapse;
22
+ background-color: var(--color-main-background);
23
+ }
24
+ .cn-data-table th,
25
+ .cn-data-table td {
26
+ padding: calc(3 * var(--default-grid-baseline));
27
+ text-align: left;
28
+ border-bottom: 1px solid var(--color-border);
29
+ vertical-align: middle;
30
+ }
31
+ .cn-data-table th {
32
+ background: var(--color-background-dark);
33
+ font-weight: 500;
34
+ color: var(--color-text-maxcontrast);
35
+ }
36
+ .cn-data-table th.cn-table-header--sortable {
37
+ cursor: pointer;
38
+ user-select: none;
39
+ transition: background-color var(--animation-quick) ease;
40
+ }
41
+ .cn-data-table th.cn-table-header--sortable:hover {
42
+ background-color: var(--color-background-hover);
43
+ }
44
+ .cn-table-sort-indicator {
45
+ margin-left: var(--default-grid-baseline);
46
+ opacity: 0.6;
47
+ }
48
+ /* Row States */
49
+ .cn-table-row {
50
+ border-bottom: 1px solid var(--color-border);
51
+ cursor: pointer;
52
+ transition: background-color var(--animation-quick) ease;
53
+ }
54
+ .cn-table-row:hover {
55
+ background: var(--color-background-hover);
56
+ }
57
+ .cn-table-row--selected {
58
+ background-color: var(--color-primary-light);
59
+ box-shadow: inset 3px 0 0 0 var(--color-primary);
60
+ }
61
+ .cn-table-row--selected:hover {
62
+ background-color: var(--color-primary-light);
63
+ }
64
+ /* Column Types */
65
+ .cn-table-col--checkbox {
66
+ width: 50px;
67
+ text-align: center;
68
+ }
69
+ .cn-table-col--actions {
70
+ width: 120px;
71
+ text-align: center;
72
+ min-width: 120px;
73
+ }
74
+ .cn-table-col--constrained {
75
+ width: 150px;
76
+ max-width: 150px;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ white-space: nowrap;
80
+ }
81
+ .cn-table-col--expanded {
82
+ width: auto;
83
+ min-width: 200px;
84
+ }
85
+ .cn-table-col--title {
86
+ min-width: 120px;
87
+ max-width: 200px;
88
+ word-wrap: break-word;
89
+ overflow: hidden;
90
+ }
91
+ /* Loading State */
92
+ .cn-table-loading {
93
+ text-align: center;
94
+ padding: calc(12 * var(--default-grid-baseline));
95
+ }
96
+ .cn-table-loading p {
97
+ margin-top: calc(5 * var(--default-grid-baseline));
98
+ color: var(--color-text-maxcontrast);
99
+ }
100
+ /* Empty State (inside table) */
101
+ .cn-table-empty td {
102
+ text-align: center;
103
+ padding: calc(12 * var(--default-grid-baseline)) calc(6 * var(--default-grid-baseline));
104
+ color: var(--color-text-maxcontrast);
105
+ }
106
+ /* ========================================
107
+ Backwards compatibility aliases
108
+ (legacy OpenRegister CSS class names)
109
+ ======================================== */
110
+ .viewTableContainer { background: var(--color-main-background); border-radius: var(--border-radius); overflow-x: hidden; overflow-y: visible; box-shadow: 0 2px 4px var(--color-box-shadow); border: 1px solid var(--color-border); margin-bottom: calc(5 * var(--default-grid-baseline)); }
111
+ .viewTableContainer.scrollable { max-height: 400px; overflow-y: auto; }
112
+ .viewTable { width: 100%; border-collapse: collapse; background-color: var(--color-main-background); }
113
+ .viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: left; border-bottom: 1px solid var(--color-border); vertical-align: middle; }
114
+ .viewTable th { background: var(--color-background-hover); font-weight: 500; color: var(--color-text-maxcontrast); background-color: var(--color-background-dark); }
115
+ .viewTableRow { border-bottom: 1px solid var(--color-border); cursor: pointer; transition: background-color var(--animation-quick) ease; }
116
+ .viewTableRow:hover { background: var(--color-background-hover); }
117
+ .viewTableRow.active, .viewTableRowSelected { background: var(--color-primary-light); }
118
+ .tableColumnCheckbox { width: 50px; text-align: center; }
119
+ .tableColumnActions { width: 120px; text-align: center; min-width: 120px; }
120
+ .tableColumnConstrained { width: 150px; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
121
+ .tableColumnExpanded { width: auto; min-width: 200px; }
122
+ .tableColumnTitle { min-width: 120px; max-width: 200px; word-wrap: break-word; overflow: hidden; }
123
+ /* ========================================
124
+ @conduction/nextcloud-vue — Card Styles
125
+ ======================================== */
126
+ /* Card Grid */
127
+ .cn-card-grid {
128
+ display: grid;
129
+ gap: calc(4 * var(--default-grid-baseline));
130
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
131
+ padding: 0.25rem;
132
+ }
133
+ /* Base Card */
134
+ .cn-card {
135
+ background: var(--color-main-background);
136
+ border-radius: var(--border-radius-large);
137
+ padding: calc(5 * var(--default-grid-baseline));
138
+ box-shadow: 0 2px 8px var(--color-box-shadow);
139
+ min-height: 200px;
140
+ transition: transform var(--animation-quick) ease-in-out;
141
+ border: 1px solid var(--color-border);
142
+ }
143
+ .cn-card:hover {
144
+ transform: scale(1.01);
145
+ box-shadow: 0 4px 12px var(--color-box-shadow);
146
+ }
147
+ /* Card Header */
148
+ .cn-card-header {
149
+ display: flex;
150
+ align-items: center;
151
+ justify-content: space-between;
152
+ gap: calc(2 * var(--default-grid-baseline));
153
+ margin-bottom: calc(3 * var(--default-grid-baseline));
154
+ padding-bottom: calc(2 * var(--default-grid-baseline));
155
+ border-bottom: 1px solid var(--color-border);
156
+ }
157
+ .cn-card-header h2,
158
+ .cn-card-header h3 {
159
+ display: flex;
160
+ align-items: center;
161
+ gap: calc(2 * var(--default-grid-baseline));
162
+ margin: 0;
163
+ color: var(--color-main-text);
164
+ }
165
+ .cn-card-header h2 { font-size: 1.2em; }
166
+ .cn-card-header h3 { font-size: 1.1em; }
167
+ /* Settings Card */
168
+ .cn-settings-card {
169
+ background: var(--color-background-hover);
170
+ border-radius: var(--border-radius-large);
171
+ padding: calc(5 * var(--default-grid-baseline));
172
+ margin-bottom: calc(5 * var(--default-grid-baseline));
173
+ }
174
+ .cn-settings-card h4 {
175
+ margin: 0 0 calc(4 * var(--default-grid-baseline)) 0;
176
+ color: var(--color-main-text);
177
+ font-size: 16px;
178
+ font-weight: 600;
179
+ display: flex;
180
+ align-items: center;
181
+ gap: calc(2 * var(--default-grid-baseline));
182
+ }
183
+ .cn-settings-card--collapsible h4 {
184
+ cursor: pointer;
185
+ user-select: none;
186
+ display: flex;
187
+ justify-content: space-between;
188
+ align-items: center;
189
+ transition: color var(--animation-quick) ease;
190
+ margin-bottom: 0;
191
+ }
192
+ .cn-settings-card--collapsible h4:hover {
193
+ color: var(--color-primary-element);
194
+ }
195
+ .cn-settings-card__chevron {
196
+ transition: transform var(--animation-slow) ease;
197
+ color: var(--color-text-maxcontrast);
198
+ }
199
+ .cn-settings-card--collapsible h4:hover .cn-settings-card__chevron {
200
+ color: var(--color-primary-element);
201
+ }
202
+ .cn-settings-card__content {
203
+ padding-top: calc(4 * var(--default-grid-baseline));
204
+ }
205
+ /* Stat Grid */
206
+ .cn-stat-grid {
207
+ display: grid;
208
+ grid-template-columns: repeat(2, 1fr);
209
+ gap: calc(3 * var(--default-grid-baseline));
210
+ margin-bottom: calc(4 * var(--default-grid-baseline));
211
+ }
212
+ .cn-stat-item {
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: var(--default-grid-baseline);
216
+ }
217
+ .cn-stat-label {
218
+ color: var(--color-text-maxcontrast);
219
+ font-size: 0.9em;
220
+ }
221
+ .cn-stat-value {
222
+ font-size: 1.1em;
223
+ font-weight: 600;
224
+ }
225
+ /* Backwards compatibility aliases */
226
+ .cardGrid { display: grid; gap: calc(4 * var(--default-grid-baseline)); grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
227
+ .card { background: var(--color-main-background); border-radius: var(--border-radius-large); padding: calc(5 * var(--default-grid-baseline)); box-shadow: 0 2px 8px var(--color-box-shadow); min-height: 200px; transition: transform var(--animation-quick) ease-in-out; border: 1px solid var(--color-border); }
228
+ .card:hover { transform: scale(1.01); box-shadow: 0 4px 12px var(--color-box-shadow); }
229
+ .cardHeader { display: flex; align-items: center; justify-content: space-between; gap: calc(2 * var(--default-grid-baseline)); margin-bottom: calc(3 * var(--default-grid-baseline)); padding-bottom: calc(2 * var(--default-grid-baseline)); border-bottom: 1px solid var(--color-border); }
230
+ .statGrid { display: grid; grid-template-columns: repeat(2, 1fr); gap: calc(3 * var(--default-grid-baseline)); margin-bottom: calc(4 * var(--default-grid-baseline)); }
231
+ .statItem { display: flex; flex-direction: column; gap: var(--default-grid-baseline); }
232
+ .statLabel { color: var(--color-text-maxcontrast); font-size: 0.9em; }
233
+ .statValue { font-size: 1.1em; font-weight: 600; }
234
+ /* ========================================
235
+ @conduction/nextcloud-vue — Pagination
236
+ ======================================== */
237
+ .cn-pagination {
238
+ display: flex;
239
+ justify-content: space-between;
240
+ align-items: center;
241
+ gap: calc(4 * var(--default-grid-baseline));
242
+ margin-top: calc(8 * var(--default-grid-baseline));
243
+ padding: calc(5 * var(--default-grid-baseline));
244
+ flex-wrap: nowrap;
245
+ }
246
+ .cn-pagination__info {
247
+ display: flex;
248
+ align-items: center;
249
+ flex-shrink: 0;
250
+ }
251
+ .cn-pagination__page-info {
252
+ color: var(--color-text-maxcontrast);
253
+ font-size: 0.9rem;
254
+ }
255
+ .cn-pagination__nav {
256
+ display: flex;
257
+ align-items: center;
258
+ gap: calc(2 * var(--default-grid-baseline));
259
+ flex-grow: 1;
260
+ justify-content: center;
261
+ }
262
+ .cn-pagination__numbers {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: var(--default-grid-baseline);
266
+ }
267
+ .cn-pagination__ellipsis {
268
+ padding: 0 var(--default-grid-baseline);
269
+ color: var(--color-text-maxcontrast);
270
+ font-size: 0.9rem;
271
+ }
272
+ .cn-pagination__page-size {
273
+ display: flex;
274
+ align-items: center;
275
+ gap: calc(2 * var(--default-grid-baseline));
276
+ flex-shrink: 0;
277
+ min-width: 0;
278
+ }
279
+ .cn-pagination__page-size label {
280
+ font-size: 0.9rem;
281
+ color: var(--color-text-maxcontrast);
282
+ white-space: nowrap;
283
+ }
284
+ .cn-pagination__page-size-select {
285
+ min-width: 100px !important;
286
+ max-width: 120px !important;
287
+ }
288
+ /* Backwards compatibility aliases */
289
+ .viewPagination { display: flex; justify-content: space-between; align-items: center; gap: calc(4 * var(--default-grid-baseline)); margin-top: calc(8 * var(--default-grid-baseline)); padding: calc(5 * var(--default-grid-baseline)); flex-wrap: nowrap; }
290
+ .viewPaginationInfo { display: flex; align-items: center; flex-shrink: 0; }
291
+ .viewPageInfo { color: var(--color-text-maxcontrast); font-size: 0.9rem; }
292
+ .viewPaginationNav { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); flex-grow: 1; justify-content: center; }
293
+ .viewPaginationNumbers { display: flex; align-items: center; gap: var(--default-grid-baseline); }
294
+ .viewPaginationEllipsis { padding: 0 var(--default-grid-baseline); color: var(--color-text-maxcontrast); font-size: 0.9rem; }
295
+ .viewPaginationPageSize { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); flex-shrink: 0; min-width: 0; }
296
+ /* ========================================
297
+ @conduction/nextcloud-vue — Detail Grid & Layout Utility Styles
298
+ ======================================== */
299
+ /* Detail Grid (metadata display) */
300
+ .cn-detail-grid {
301
+ display: grid;
302
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
303
+ gap: calc(4 * var(--default-grid-baseline));
304
+ margin-bottom: calc(5 * var(--default-grid-baseline));
305
+ }
306
+ .cn-detail-item {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: var(--default-grid-baseline);
310
+ padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
311
+ border-left: 3px solid var(--color-primary-element);
312
+ background: var(--color-background-hover);
313
+ border-radius: 0 var(--border-radius) var(--border-radius) 0;
314
+ }
315
+ .cn-detail-item__label {
316
+ font-size: 0.85em;
317
+ color: var(--color-text-maxcontrast);
318
+ font-weight: 500;
319
+ }
320
+ .cn-detail-item__value {
321
+ font-size: 1em;
322
+ color: var(--color-main-text);
323
+ word-break: break-word;
324
+ }
325
+ /* Detail Layout */
326
+ .cn-detail-layout {
327
+ max-width: 1000px;
328
+ padding: calc(5 * var(--default-grid-baseline));
329
+ }
330
+ .cn-detail-layout__header {
331
+ display: flex;
332
+ align-items: center;
333
+ gap: calc(3 * var(--default-grid-baseline));
334
+ margin-bottom: calc(6 * var(--default-grid-baseline));
335
+ }
336
+ .cn-detail-layout__title {
337
+ flex: 1;
338
+ margin: 0;
339
+ font-size: 1.5em;
340
+ color: var(--color-main-text);
341
+ }
342
+ .cn-detail-layout__actions {
343
+ display: flex;
344
+ gap: calc(2 * var(--default-grid-baseline));
345
+ flex-shrink: 0;
346
+ }
347
+ .cn-detail-layout__content {
348
+ margin-top: calc(4 * var(--default-grid-baseline));
349
+ }
350
+ /* Backwards compatibility aliases */
351
+ .detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: calc(4 * var(--default-grid-baseline)); margin-bottom: calc(5 * var(--default-grid-baseline)); }
352
+ .detail-item { display: flex; flex-direction: column; gap: var(--default-grid-baseline); padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline)); border-left: 3px solid var(--color-primary-element); background: var(--color-background-hover); border-radius: 0 var(--border-radius) var(--border-radius) 0; }
353
+ .detailContainer { margin-block-start: calc(5 * var(--default-grid-baseline)); margin-inline-start: calc(5 * var(--default-grid-baseline)); margin-inline-end: calc(5 * var(--default-grid-baseline)); }
354
+ /* ========================================
355
+ @conduction/nextcloud-vue — Status Badge
356
+ ======================================== */
357
+ .cn-status-badge {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ gap: calc(0.5 * var(--default-grid-baseline));
361
+ padding: calc(0.5 * var(--default-grid-baseline)) calc(2.5 * var(--default-grid-baseline));
362
+ border-radius: var(--border-radius-pill);
363
+ font-size: 0.85em;
364
+ font-weight: 500;
365
+ line-height: 1.4;
366
+ white-space: nowrap;
367
+ }
368
+ /* Size variants */
369
+ .cn-status-badge--small {
370
+ padding: calc(0.25 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
371
+ font-size: 0.75em;
372
+ }
373
+ /* Color variants */
374
+ .cn-status-badge--default {
375
+ background-color: var(--color-background-dark);
376
+ color: var(--color-main-text);
377
+ }
378
+ .cn-status-badge--primary {
379
+ background-color: var(--color-primary-element-light);
380
+ color: var(--color-primary-element);
381
+ }
382
+ .cn-status-badge--success {
383
+ background-color: var(--color-success-light, rgba(70, 186, 97, 0.15));
384
+ color: var(--color-success);
385
+ }
386
+ .cn-status-badge--warning {
387
+ background-color: var(--color-warning-light, rgba(232, 163, 39, 0.15));
388
+ color: var(--color-warning-text, var(--color-warning));
389
+ }
390
+ .cn-status-badge--error {
391
+ background-color: var(--color-error-light, rgba(224, 68, 68, 0.15));
392
+ color: var(--color-error);
393
+ }
394
+ .cn-status-badge--info {
395
+ background-color: var(--color-info-light, rgba(0, 130, 201, 0.15));
396
+ color: var(--color-info, #0082c9);
397
+ }
398
+ /* Solid variants — solid background with white text for use on colored backgrounds */
399
+ .cn-status-badge--solid.cn-status-badge--default {
400
+ background-color: var(--color-background-dark);
401
+ color: var(--color-main-text);
402
+ }
403
+ .cn-status-badge--solid.cn-status-badge--primary {
404
+ background-color: var(--color-primary-element);
405
+ color: white;
406
+ }
407
+ .cn-status-badge--solid.cn-status-badge--success {
408
+ background-color: var(--color-success);
409
+ color: white;
410
+ }
411
+ .cn-status-badge--solid.cn-status-badge--warning {
412
+ background-color: var(--color-warning);
413
+ color: var(--color-primary-text);
414
+ }
415
+ .cn-status-badge--solid.cn-status-badge--error {
416
+ background-color: var(--color-error);
417
+ color: white;
418
+ }
419
+ .cn-status-badge--solid.cn-status-badge--info {
420
+ background-color: var(--color-info, #0082c9);
421
+ color: white;
422
+ }
423
+ /* ========================================
424
+ @conduction/nextcloud-vue — Layout & Filter Utility Styles
425
+ ======================================== */
426
+ /* List View Layout */
427
+ .cn-list-layout {
428
+ padding: calc(5 * var(--default-grid-baseline));
429
+ }
430
+ .cn-list-layout__header {
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: space-between;
434
+ margin-bottom: calc(4 * var(--default-grid-baseline));
435
+ }
436
+ .cn-list-layout__title {
437
+ display: flex;
438
+ align-items: baseline;
439
+ gap: calc(2 * var(--default-grid-baseline));
440
+ }
441
+ .cn-list-layout__title h2 {
442
+ margin: 0;
443
+ font-size: 1.4em;
444
+ color: var(--color-main-text);
445
+ }
446
+ .cn-list-layout__title .cn-list-layout__count {
447
+ font-size: 0.85em;
448
+ color: var(--color-text-maxcontrast);
449
+ }
450
+ .cn-list-layout__actions {
451
+ display: flex;
452
+ gap: calc(2 * var(--default-grid-baseline));
453
+ }
454
+ /* Filter Bar */
455
+ .cn-filter-bar {
456
+ display: flex;
457
+ align-items: center;
458
+ gap: calc(3 * var(--default-grid-baseline));
459
+ margin-bottom: calc(4 * var(--default-grid-baseline));
460
+ flex-wrap: wrap;
461
+ }
462
+ .cn-filter-bar__search {
463
+ flex: 1;
464
+ min-width: 200px;
465
+ max-width: 400px;
466
+ }
467
+ .cn-filter-bar__filters {
468
+ display: flex;
469
+ align-items: center;
470
+ gap: calc(2 * var(--default-grid-baseline));
471
+ flex-wrap: wrap;
472
+ }
473
+ .cn-filter-bar__filter {
474
+ min-width: 150px;
475
+ max-width: 200px;
476
+ }
477
+ .cn-filter-bar__clear {
478
+ margin-left: auto;
479
+ }
480
+ /* Dashboard Content */
481
+ .cn-dashboard-content {
482
+ margin-inline: auto;
483
+ max-width: 1200px;
484
+ padding-block: calc(5 * var(--default-grid-baseline));
485
+ padding-inline: calc(5 * var(--default-grid-baseline));
486
+ }
487
+ /* Loading Container */
488
+ .cn-loading-container {
489
+ display: flex;
490
+ align-items: center;
491
+ gap: calc(2 * var(--default-grid-baseline));
492
+ color: var(--color-text-maxcontrast);
493
+ justify-content: center;
494
+ padding-block: calc(10 * var(--default-grid-baseline));
495
+ }
496
+ /* Backwards compatibility aliases */
497
+ .dashboardContent { margin-inline: auto; max-width: 1200px; padding-block: calc(5 * var(--default-grid-baseline)); padding-inline: calc(5 * var(--default-grid-baseline)); }
498
+ .loadingContainer { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); color: var(--color-text-maxcontrast); justify-content: center; padding-block: calc(10 * var(--default-grid-baseline)); }
499
+ /* ========================================
500
+ @conduction/nextcloud-vue — Utilities
501
+ ======================================== */
502
+ /* Text Utilities */
503
+ .cn-text-ellipsis {
504
+ overflow: hidden;
505
+ text-overflow: ellipsis;
506
+ white-space: nowrap;
507
+ }
508
+ .cn-text-description {
509
+ font-size: 0.9em;
510
+ color: var(--color-text-maxcontrast);
511
+ }
512
+ .cn-text-success { color: var(--color-success); }
513
+ .cn-text-error { color: var(--color-error); }
514
+ .cn-text-warning { color: var(--color-warning); }
515
+ .cn-text-muted { color: var(--color-text-maxcontrast); }
516
+ /* Vue Transition Animations */
517
+ .cn-slide-fade-enter-active {
518
+ transition: all var(--animation-slow) cubic-bezier(0.4, 0, 0.2, 1);
519
+ }
520
+ .cn-slide-fade-leave-active {
521
+ transition: all var(--animation-quick) cubic-bezier(0.4, 0, 1, 1);
522
+ }
523
+ .cn-slide-fade-enter,
524
+ .cn-slide-fade-enter-from {
525
+ transform: translateY(-10px);
526
+ opacity: 0;
527
+ }
528
+ .cn-slide-fade-leave-to {
529
+ transform: translateY(-5px);
530
+ opacity: 0;
531
+ }
532
+ /* Backwards compatibility aliases */
533
+ .textEllipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
534
+ .textDescription { font-size: 0.9em; color: var(--color-text-maxcontrast); }
535
+ .successMessage { color: var(--color-success); }
536
+ .errorMessage { color: var(--color-error); }
537
+ /* CnPageHeader — Reusable page header styles */
538
+ .cn-page-header {
539
+ display: flex;
540
+ align-items: flex-start;
541
+ gap: calc(3 * var(--default-grid-baseline));
542
+ margin-bottom: calc(4 * var(--default-grid-baseline));
543
+ /* Clear the Nextcloud navigation toggle button (44px wide, absolutely positioned) */
544
+ padding-left: 44px;
545
+ }
546
+ .cn-page-header__icon {
547
+ flex-shrink: 0;
548
+ display: flex;
549
+ align-items: center;
550
+ padding-top: var(--default-grid-baseline);
551
+ color: var(--color-primary);
552
+ }
553
+ .cn-page-header__text {
554
+ flex: 1;
555
+ min-width: 0;
556
+ }
557
+ .cn-page-header__title {
558
+ margin: 0 0 var(--default-grid-baseline) 0;
559
+ font-size: 2rem;
560
+ font-weight: 300;
561
+ }
562
+ .cn-page-header__description {
563
+ color: var(--color-text-maxcontrast);
564
+ margin: 0;
565
+ font-size: var(--default-font-size);
566
+ }
567
+ /* CnActionsBar — Reusable actions toolbar styles */
568
+ .cn-actions-bar {
569
+ display: flex;
570
+ justify-content: space-between;
571
+ align-items: center;
572
+ margin-bottom: calc(5 * var(--default-grid-baseline));
573
+ padding: calc(2 * var(--default-grid-baseline));
574
+ background: var(--color-background-hover);
575
+ border-radius: var(--border-radius);
576
+ }
577
+ .cn-actions-bar__info {
578
+ font-weight: 500;
579
+ font-size: var(--default-font-size);
580
+ }
581
+ .cn-actions-bar__count {
582
+ color: var(--color-text-maxcontrast);
583
+ }
584
+ .cn-actions-bar__actions {
585
+ display: flex;
586
+ align-items: center;
587
+ gap: calc(2 * var(--default-grid-baseline));
588
+ }
589
+ .cn-actions-bar__actions .button-vue {
590
+ /* fix issue when adding custom content, button gets squished when not needed */
591
+ /* this is a quick and dirty fix and its possible that this will caused issue of its own when there are too many buttons */
592
+ min-width: fit-content !important;
593
+ }
594
+ /* View mode toggle container */
595
+ .cn-actions-bar__view-toggle {
596
+ display: flex;
597
+ align-items: center;
598
+ }
599
+ .cn-actions-bar__view-toggle span {
600
+ max-height: 34px;
601
+ }
602
+ /* Override Nextcloud's pointer-events:none on disabled action items
603
+ so native title tooltip is visible on hover.
604
+ The button's disabled attribute still prevents click events. */
605
+ .action.action--disabled {
606
+ pointer-events: auto !important;
607
+ cursor: not-allowed;
608
+ }
609
+ .action.action--disabled button {
610
+ cursor: not-allowed;
611
+ }
612
+ /* CnIndexPage — Index page layout styles */
613
+ /* Header styles: see page-header.css (CnPageHeader) */
614
+ /* Actions bar styles: see actions-bar.css (CnActionsBar) */
615
+ .cn-index-page {
616
+ display: flex;
617
+ flex-direction: column;
618
+ height: 100%;
619
+ min-height: 0;
620
+ padding: calc(5 * var(--default-grid-baseline));
621
+ }
622
+ .cn-index-page__below-header {
623
+ margin-bottom: calc(4 * var(--default-grid-baseline));
624
+ }
625
+ /* Body layout */
626
+ .cn-index-page__body {
627
+ display: flex;
628
+ flex: 1;
629
+ min-height: 0;
630
+ }
631
+ .cn-index-page__main {
632
+ flex: 1;
633
+ min-width: 0;
634
+ min-height: 0;
635
+ overflow-y: auto;
636
+ }
637
+ .cn-index-page__loading {
638
+ display: flex;
639
+ justify-content: center;
640
+ padding: calc(15 * var(--default-grid-baseline));
641
+ }
642
+ .cn-index-page__empty {
643
+ padding: calc(10 * var(--default-grid-baseline)) calc(5 * var(--default-grid-baseline));
644
+ text-align: center;
645
+ }
646
+ .cn-index-page__pagination {
647
+ margin-top: calc(4 * var(--default-grid-baseline));
648
+ }
649
+ /* CnIndexSidebar — NcAppSidebar wrapper styles */
650
+ /* Tab content: limit height to container so overflow shows a scrollbar */
651
+ .cn-index-sidebar__tab-content {
652
+ max-height: 100%;
653
+ min-height: 0;
654
+ overflow-y: auto;
655
+ }
656
+ /* Sidebar header icon (compact mode figure area) */
657
+ .cn-index-sidebar__header-icon {
658
+ display: flex;
659
+ align-items: center;
660
+ justify-content: center;
661
+ width: 100%;
662
+ height: 100%;
663
+ color: var(--color-primary-element);
664
+ }
665
+ .cn-index-sidebar__header-emoji {
666
+ font-size: 28px;
667
+ line-height: 1;
668
+ }
669
+ /* Search tab sections */
670
+ .cn-index-sidebar__section {
671
+ padding: calc(4 * var(--default-grid-baseline));
672
+ }
673
+ .cn-index-sidebar__section h3 {
674
+ margin: 0 0 calc(3 * var(--default-grid-baseline)) 0;
675
+ font-size: 15px;
676
+ font-weight: 600;
677
+ }
678
+ .cn-index-sidebar__description {
679
+ color: var(--color-text-maxcontrast);
680
+ font-size: 13px;
681
+ margin: 0 0 calc(4 * var(--default-grid-baseline)) 0;
682
+ }
683
+ .cn-index-sidebar__filter-group {
684
+ margin-bottom: calc(3 * var(--default-grid-baseline));
685
+ }
686
+ .cn-index-sidebar__filter-header {
687
+ display: flex;
688
+ align-items: center;
689
+ gap: var(--default-grid-baseline);
690
+ margin-bottom: var(--default-grid-baseline);
691
+ }
692
+ .cn-index-sidebar__filter-label {
693
+ font-size: 13px;
694
+ font-weight: 500;
695
+ color: var(--color-main-text);
696
+ }
697
+ .cn-index-sidebar__info-btn {
698
+ min-width: var(--clickable-area-small, 24px) !important;
699
+ min-height: var(--clickable-area-small, 24px) !important;
700
+ width: var(--clickable-area-small, 24px) !important;
701
+ height: var(--clickable-area-small, 24px) !important;
702
+ padding: 0 !important;
703
+ color: var(--color-text-maxcontrast);
704
+ }
705
+ .cn-index-sidebar__info-btn:hover {
706
+ color: var(--color-primary);
707
+ }
708
+ .cn-index-sidebar__filter-description {
709
+ padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
710
+ max-width: 260px;
711
+ font-size: 13px;
712
+ color: var(--color-main-text);
713
+ margin: 0;
714
+ line-height: var(--default-line-height, 1.4);
715
+ }
716
+ .cn-index-sidebar__select {
717
+ width: 100%;
718
+ }
719
+ /* Visually hide NcSelect's rendered label — the filter heading already shows it.
720
+ Keep input-label prop for screen-reader accessibility. */
721
+ .cn-index-sidebar__select label {
722
+ position: absolute;
723
+ width: 1px;
724
+ height: 1px;
725
+ padding: 0;
726
+ margin: -1px;
727
+ overflow: hidden;
728
+ clip: rect(0, 0, 0, 0);
729
+ white-space: nowrap;
730
+ border: 0;
731
+ }
732
+ .cn-index-sidebar__empty {
733
+ color: var(--color-text-maxcontrast);
734
+ font-size: 13px;
735
+ font-style: italic;
736
+ }
737
+ /* ── Columns tab ── */
738
+ .cn-sidebar-columns {
739
+ padding: calc(4 * var(--default-grid-baseline));
740
+ }
741
+ .cn-sidebar-columns h3 {
742
+ margin-top: 0;
743
+ margin-bottom: calc(2 * var(--default-grid-baseline));
744
+ font-size: 18px;
745
+ font-weight: 600;
746
+ }
747
+ .cn-sidebar-columns__description {
748
+ color: var(--color-text-maxcontrast);
749
+ margin-bottom: calc(4 * var(--default-grid-baseline));
750
+ font-size: var(--default-font-size);
751
+ }
752
+ /* Collapsible column group card */
753
+ .cn-sidebar-columns__group {
754
+ margin-bottom: calc(6 * var(--default-grid-baseline));
755
+ }
756
+ .cn-sidebar-columns__group h4 {
757
+ margin-top: 0;
758
+ margin-bottom: calc(3 * var(--default-grid-baseline));
759
+ font-size: var(--default-font-size);
760
+ font-weight: 600;
761
+ color: var(--color-text-light);
762
+ border-bottom: 1px solid var(--color-border);
763
+ padding-bottom: calc(2 * var(--default-grid-baseline));
764
+ }
765
+ .cn-sidebar-columns__group .checkbox-radio-switch {
766
+ margin-bottom: calc(2 * var(--default-grid-baseline));
767
+ }
768
+ .cn-sidebar-columns__group .checkbox-radio-switch__content {
769
+ padding: var(--default-grid-baseline) 0;
770
+ }
771
+ .cn-sidebar-columns__group--collapsible {
772
+ border: 1px solid var(--color-border);
773
+ border-radius: var(--border-radius);
774
+ padding: 0;
775
+ margin-bottom: calc(3 * var(--default-grid-baseline));
776
+ }
777
+ .cn-sidebar-columns__group-header {
778
+ display: flex;
779
+ align-items: center;
780
+ gap: calc(2 * var(--default-grid-baseline));
781
+ padding: calc(3 * var(--default-grid-baseline));
782
+ cursor: pointer;
783
+ user-select: none;
784
+ transition: background-color var(--animation-quick) ease;
785
+ }
786
+ .cn-sidebar-columns__group-header:hover {
787
+ background-color: var(--color-background-hover);
788
+ }
789
+ .cn-sidebar-columns__group-header h4 {
790
+ margin: 0;
791
+ padding: 0;
792
+ border: none;
793
+ flex: 1;
794
+ color: var(--color-main-text);
795
+ }
796
+ .cn-sidebar-columns__select-all {
797
+ margin: 0 !important;
798
+ font-size: 12px;
799
+ }
800
+ .cn-sidebar-columns__group-content {
801
+ padding: calc(3 * var(--default-grid-baseline));
802
+ border-top: 1px solid var(--color-border);
803
+ display: flex;
804
+ flex-direction: column;
805
+ gap: calc(2 * var(--default-grid-baseline));
806
+ }
807
+ .cn-sidebar-columns__empty {
808
+ color: var(--color-text-maxcontrast);
809
+ font-size: 13px;
810
+ font-style: italic;
811
+ }
812
+ /* @conduction/nextcloud-vue — Dashboard component styles */
813
+ /* Dashboard page layout */
814
+ .cn-dashboard-page {
815
+ padding: 20px;
816
+ max-width: 1400px;
817
+ }
818
+ /* Widget grid item borders for non-tile widgets */
819
+ .cn-dashboard-grid :deep(.grid-stack-item-content:has(.cn-widget-wrapper)) {
820
+ border: 1px solid var(--color-border);
821
+ }
822
+ /* Dashboard widget content area */
823
+ .cn-dashboard-widget-content {
824
+ padding: 16px;
825
+ }
826
+ /* Dashboard KPI row inside grid */
827
+ .cn-dashboard-kpi-row {
828
+ display: flex;
829
+ align-items: center;
830
+ gap: 12px;
831
+ padding: 16px;
832
+ height: 100%;
833
+ }
834
+ /* Dashboard chart container */
835
+ .cn-dashboard-chart {
836
+ padding: 16px;
837
+ height: 100%;
838
+ display: flex;
839
+ flex-direction: column;
840
+ }
841
+ .cn-dashboard-chart__title {
842
+ margin: 0 0 12px;
843
+ font-size: 15px;
844
+ font-weight: 600;
845
+ }
846
+ .cn-dashboard-chart__content {
847
+ flex: 1;
848
+ min-height: 0;
849
+ overflow: auto;
850
+ }
851
+ /* Dashboard list widget */
852
+ .cn-dashboard-list {
853
+ padding: 0;
854
+ margin: 0;
855
+ list-style: none;
856
+ }
857
+ .cn-dashboard-list__item {
858
+ display: flex;
859
+ align-items: center;
860
+ gap: 8px;
861
+ padding: 8px 16px;
862
+ cursor: pointer;
863
+ border-bottom: 1px solid var(--color-border-dark);
864
+ }
865
+ .cn-dashboard-list__item:last-child {
866
+ border-bottom: none;
867
+ }
868
+ .cn-dashboard-list__item:hover {
869
+ background: var(--color-background-hover);
870
+ }
871
+ /* ========================================
872
+ @conduction/nextcloud-vue — CnDetailPage Styles
873
+ ======================================== */
874
+ .cn-detail-page {
875
+ margin-inline: auto;
876
+ padding: calc(5 * var(--default-grid-baseline));
877
+ position: relative;
878
+ }
879
+ /* Header */
880
+ .cn-detail-page__header {
881
+ display: flex;
882
+ justify-content: space-between;
883
+ align-items: center;
884
+ margin-bottom: calc(4 * var(--default-grid-baseline));
885
+ flex-wrap: wrap;
886
+ gap: calc(4 * var(--default-grid-baseline));
887
+ }
888
+ .cn-detail-page__header-left {
889
+ display: flex;
890
+ align-items: center;
891
+ gap: calc(3 * var(--default-grid-baseline));
892
+ min-width: 0;
893
+ }
894
+ .cn-detail-page__header-text {
895
+ min-width: 0;
896
+ }
897
+ .cn-detail-page__icon {
898
+ flex-shrink: 0;
899
+ }
900
+ .cn-detail-page__title-group {
901
+ display: flex;
902
+ align-items: baseline;
903
+ gap: calc(3 * var(--default-grid-baseline));
904
+ min-width: 0;
905
+ }
906
+ .cn-detail-page__title {
907
+ margin: 0;
908
+ font-size: 22px;
909
+ font-weight: 700;
910
+ line-height: 1.3;
911
+ color: var(--color-main-text);
912
+ white-space: nowrap;
913
+ overflow: hidden;
914
+ text-overflow: ellipsis;
915
+ }
916
+ .cn-detail-page__subtitle {
917
+ font-size: 14px;
918
+ color: var(--color-text-maxcontrast);
919
+ white-space: nowrap;
920
+ }
921
+ .cn-detail-page__description {
922
+ margin: 4px 0 0;
923
+ font-size: var(--default-font-size);
924
+ color: var(--color-text-maxcontrast);
925
+ }
926
+ .cn-detail-page__header-actions {
927
+ display: flex;
928
+ gap: calc(2 * var(--default-grid-baseline));
929
+ flex-wrap: wrap;
930
+ flex-shrink: 0;
931
+ }
932
+ /* Loading state */
933
+ .cn-detail-page__loading {
934
+ display: flex;
935
+ align-items: center;
936
+ gap: calc(2 * var(--default-grid-baseline));
937
+ color: var(--color-text-maxcontrast);
938
+ justify-content: center;
939
+ padding-block: calc(8 * var(--default-grid-baseline));
940
+ }
941
+ /* Error state */
942
+ .cn-detail-page__error {
943
+ padding: calc(8 * var(--default-grid-baseline)) calc(4 * var(--default-grid-baseline));
944
+ }
945
+ /* Empty state */
946
+ .cn-detail-page__empty {
947
+ padding: calc(8 * var(--default-grid-baseline)) calc(4 * var(--default-grid-baseline));
948
+ }
949
+ /* Statistics table */
950
+ .cn-detail-page__stats {
951
+ margin-bottom: calc(5 * var(--default-grid-baseline));
952
+ }
953
+ .cn-detail-page__section-title {
954
+ margin: 0 0 calc(2 * var(--default-grid-baseline));
955
+ font-size: 1.1em;
956
+ font-weight: 600;
957
+ color: var(--color-main-text);
958
+ }
959
+ .cn-detail-page__stats-table {
960
+ width: 100%;
961
+ border-collapse: collapse;
962
+ background: var(--color-main-background);
963
+ border-radius: var(--border-radius-large);
964
+ overflow: hidden;
965
+ border: 1px solid var(--color-border);
966
+ }
967
+ .cn-detail-page__stats-table thead th {
968
+ padding: calc(1.5 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
969
+ text-align: left;
970
+ font-weight: 600;
971
+ font-size: 0.9em;
972
+ color: var(--color-text-maxcontrast);
973
+ background: var(--color-background-hover);
974
+ border-bottom: 1px solid var(--color-border);
975
+ }
976
+ .cn-detail-page__stats-table tbody td {
977
+ padding: calc(1.5 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
978
+ border-bottom: 1px solid var(--color-border-dark);
979
+ color: var(--color-main-text);
980
+ font-size: 0.95em;
981
+ }
982
+ .cn-detail-page__stats-table tbody tr:last-child td {
983
+ border-bottom: none;
984
+ }
985
+ .cn-detail-page__stats-row--sub td {
986
+ color: var(--color-text-maxcontrast);
987
+ font-size: 0.9em;
988
+ }
989
+ .cn-detail-page__stats-cell--indented {
990
+ padding-left: calc(5 * var(--default-grid-baseline)) !important;
991
+ }
992
+ .cn-detail-page__stats-cell--center {
993
+ text-align: center;
994
+ }
995
+ .cn-detail-page__stats-cell--right {
996
+ text-align: right;
997
+ }
998
+ /* Body & content */
999
+ .cn-detail-page__body {
1000
+ display: flex;
1001
+ flex-direction: column;
1002
+ gap: calc(5 * var(--default-grid-baseline));
1003
+ }
1004
+ .cn-detail-page__content {
1005
+ flex: 1;
1006
+ min-width: 0;
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ gap: calc(4 * var(--default-grid-baseline));
1010
+ }
1011
+ /* Grid layout mode */
1012
+ .cn-detail-page__content--grid {
1013
+ display: grid;
1014
+ grid-template-columns: repeat(12, 1fr);
1015
+ gap: calc(4 * var(--default-grid-baseline));
1016
+ }
1017
+ .cn-detail-page__grid-item {
1018
+ min-width: 0;
1019
+ }
1020
+ .cn-detail-page__widget-title {
1021
+ margin: 0 0 calc(2 * var(--default-grid-baseline)) 0;
1022
+ font-size: 16px;
1023
+ font-weight: 600;
1024
+ line-height: 1.4;
1025
+ }
1026
+ .cn-detail-page__sections {
1027
+ margin-top: calc(4 * var(--default-grid-baseline));
1028
+ }
1029
+ /* Sidebar */
1030
+ .cn-detail-page__sidebar {
1031
+ width: 340px;
1032
+ flex-shrink: 0;
1033
+ position: sticky;
1034
+ top: calc(5 * var(--default-grid-baseline));
1035
+ }
1036
+ .cn-detail-page__sidebar-toggle {
1037
+ position: fixed;
1038
+ right: calc(5 * var(--default-grid-baseline));
1039
+ top: 80px;
1040
+ z-index: 10;
1041
+ }
1042
+ /* Footer */
1043
+ .cn-detail-page__footer {
1044
+ margin-top: calc(4 * var(--default-grid-baseline));
1045
+ padding-top: calc(3 * var(--default-grid-baseline));
1046
+ border-top: 1px solid var(--color-border);
1047
+ }
1048
+ /* Responsive */
1049
+ @media (max-width: 768px) {
1050
+ .cn-detail-page {
1051
+ padding: calc(3 * var(--default-grid-baseline));
1052
+ }
1053
+
1054
+ .cn-detail-page__header {
1055
+ flex-direction: column;
1056
+ }
1057
+
1058
+ .cn-detail-page__header-actions {
1059
+ width: 100%;
1060
+ }
1061
+ }
1062
+ @media (max-width: 600px) {
1063
+ .cn-detail-page__content--grid {
1064
+ grid-template-columns: 1fr;
1065
+ }
1066
+
1067
+ .cn-detail-page__content--grid .cn-detail-page__grid-item {
1068
+ grid-column: 1 / -1 !important;
1069
+ grid-row: auto !important;
1070
+ }
1071
+ }
1072
+ .cn-schema-form__detail-grid {
1073
+ display: grid;
1074
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1075
+ gap: 20px;
1076
+ margin-bottom: 20px;
1077
+ padding: 0 20px;
1078
+ width: 100%;
1079
+ box-sizing: border-box;
1080
+ }
1081
+ .cn-schema-form__detail-item {
1082
+ display: flex;
1083
+ flex-direction: column;
1084
+ padding: 15px;
1085
+ background-color: var(--color-background-hover);
1086
+ border-radius: var(--border-radius);
1087
+ border-left: 3px solid var(--color-primary);
1088
+ box-shadow: 0 1px 3px var(--color-box-shadow);
1089
+ transition: transform var(--animation-quick) ease,
1090
+ box-shadow var(--animation-quick) ease;
1091
+ }
1092
+ .cn-schema-form__detail-item:hover {
1093
+ transform: translateY(-1px);
1094
+ box-shadow: 0 2px 6px var(--color-box-shadow);
1095
+ }
1096
+ .cn-schema-form__detail-label {
1097
+ font-weight: bold;
1098
+ color: var(--color-text-maxcontrast);
1099
+ margin-bottom: 5px;
1100
+ font-size: 0.9em;
1101
+ }
1102
+ .cn-schema-form__detail-value {
1103
+ word-break: break-word;
1104
+ color: var(--color-main-text);
1105
+ line-height: 1.4;
1106
+ }
1107
+ .cn-schema-form__id-card {
1108
+ background-color: var(--color-background-hover);
1109
+ border-left-color: var(--color-primary-element);
1110
+ }
1111
+ .cn-schema-form__id-card-header {
1112
+ display: flex;
1113
+ justify-content: space-between;
1114
+ align-items: center;
1115
+ width: 100%;
1116
+ margin-bottom: 5px;
1117
+ }
1118
+ .cn-schema-form__id-card .cn-schema-form__detail-value {
1119
+ word-break: break-all;
1120
+ margin-top: 4px;
1121
+ font-family: monospace;
1122
+ font-size: 0.9em;
1123
+ background-color: var(--color-background-dark);
1124
+ padding: 4px 6px;
1125
+ border-radius: var(--border-radius-small);
1126
+ }
1127
+ .cn-schema-form__uuid-value {
1128
+ font-size: 0.9em;
1129
+ color: var(--color-text-maxcontrast);
1130
+ font-family: monospace;
1131
+ margin-top: 4px;
1132
+ display: block;
1133
+ background-color: var(--color-background-dark);
1134
+ padding: 4px 6px;
1135
+ border-radius: var(--border-radius-small);
1136
+ }
1137
+ .cn-schema-form__copy-button {
1138
+ height: 30px;
1139
+ flex-shrink: 0;
1140
+ margin-top: 5px;
1141
+ }
1142
+ /* Tab container */
1143
+ .cn-schema-form__tabContainer {
1144
+ margin-top: 20px;
1145
+ }
1146
+ .cn-schema-form__tabContainer > * ul > li {
1147
+ display: flex;
1148
+ flex: 1;
1149
+ }
1150
+ .cn-schema-form__tabContainer > * ul > li > a {
1151
+ flex: 1;
1152
+ text-align: center;
1153
+ }
1154
+ .cn-schema-form__tabContainer > * ul > li > .active {
1155
+ background: transparent !important;
1156
+ color: var(--color-main-text) !important;
1157
+ border-bottom: var(--default-grid-baseline) solid var(--color-primary-element) !important;
1158
+ }
1159
+ .cn-schema-form__tabContainer > * ul[role="tablist"] {
1160
+ display: flex;
1161
+ margin: 10px 8px 0 8px;
1162
+ justify-content: space-between;
1163
+ border-bottom: 1px solid var(--color-border);
1164
+ }
1165
+ .cn-schema-form__tabContainer > * ul[role="tablist"] > * a[role="tab"] {
1166
+ padding-inline-start: 10px;
1167
+ padding-inline-end: 10px;
1168
+ padding-block-start: 10px;
1169
+ padding-block-end: 10px;
1170
+ }
1171
+ .cn-schema-form__tabContainer > * div[role="tabpanel"] {
1172
+ margin-block-start: var(--OR-margin-10);
1173
+ }
1174
+ /* Table styles */
1175
+ .cn-schema-form__scrollable {
1176
+ max-height: 400px;
1177
+ overflow-y: auto;
1178
+ }
1179
+ .cn-schema-form__viewTable {
1180
+ width: 100%;
1181
+ border-collapse: collapse;
1182
+ background-color: var(--color-main-background);
1183
+ }
1184
+ .cn-schema-form__viewTable th,
1185
+ .cn-schema-form__viewTable td {
1186
+ padding: 12px;
1187
+ text-align: left;
1188
+ border-bottom: 1px solid var(--color-border);
1189
+ vertical-align: middle;
1190
+ }
1191
+ .cn-schema-form__viewTable th {
1192
+ background: var(--color-background-hover);
1193
+ font-weight: 500;
1194
+ color: var(--color-text-maxcontrast);
1195
+ background-color: var(--color-background-dark);
1196
+ }
1197
+ .cn-schema-form__viewTable tbody tr.cn-schema-form__selected-row {
1198
+ background-color: var(--color-primary-light);
1199
+ border-left: 3px solid var(--color-primary);
1200
+ }
1201
+ .cn-schema-form__viewTable tbody tr.cn-schema-form__selected-row:hover {
1202
+ background-color: var(--color-primary-light);
1203
+ }
1204
+ .cn-schema-form__viewTable tbody tr.cn-schema-form__modified-row {
1205
+ background-color: var(--color-warning);
1206
+ border-left: 3px solid var(--color-element-warning);
1207
+ }
1208
+ .cn-schema-form__viewTable tbody tr.cn-schema-form__modified-row:hover {
1209
+ background-color: var(--color-warning);
1210
+ }
1211
+ .cn-schema-form__viewTable tbody tr.cn-schema-form__modified-row.cn-schema-form__selected-row {
1212
+ background-color: var(--color-primary-light);
1213
+ border-left: 3px solid var(--color-primary);
1214
+ }
1215
+ /* Form editor */
1216
+ .cn-schema-form__form-editor {
1217
+ display: flex;
1218
+ flex-direction: column;
1219
+ gap: 16px;
1220
+ padding: 16px;
1221
+ }
1222
+ /* Property row inline editing */
1223
+ .cn-schema-form__name-input-container {
1224
+ display: flex;
1225
+ align-items: center;
1226
+ gap: 8px;
1227
+ }
1228
+ .cn-schema-form__warning-icon {
1229
+ color: var(--color-warning-text);
1230
+ flex-shrink: 0;
1231
+ }
1232
+ /* Table column widths */
1233
+ .cn-schema-form__tableColumnActions {
1234
+ width: 150px;
1235
+ text-align: right;
1236
+ }
1237
+ /* Table actions button */
1238
+ .cn-schema-form__table-actions {
1239
+ margin-bottom: 15px;
1240
+ display: flex;
1241
+ justify-content: flex-end;
1242
+ }
1243
+ /* Enum preview styling */
1244
+ .cn-schema-form__enum-preview {
1245
+ margin-top: 4px;
1246
+ display: flex;
1247
+ align-items: center;
1248
+ gap: 4px;
1249
+ flex-wrap: wrap;
1250
+ }
1251
+ .cn-schema-form__enum-label {
1252
+ color: var(--color-text-maxcontrast);
1253
+ font-size: 11px;
1254
+ font-weight: 500;
1255
+ margin-right: 4px;
1256
+ }
1257
+ .cn-schema-form__enum-value-chip {
1258
+ background: var(--color-primary-light);
1259
+ color: var(--color-primary-light-text);
1260
+ padding: 2px 6px;
1261
+ border-radius: var(--border-radius-container);
1262
+ font-size: 10px;
1263
+ font-weight: 500;
1264
+ border: 1px solid var(--color-primary-element-light);
1265
+ }
1266
+ .cn-schema-form__property-chip.cn-schema-form__chip-info {
1267
+ background: var(--color-info);
1268
+ color: var(--color-primary-text);
1269
+ }
1270
+ .cn-schema-form__property-chip.cn-schema-form__chip-table {
1271
+ background: var(--color-primary);
1272
+ color: var(--color-primary-text);
1273
+ }
1274
+ /* Enum chip styling for action menu using NcActionButton */
1275
+ .cn-schema-form__enum-action-chip {
1276
+ background: var(--color-primary-element-light) !important;
1277
+ border-radius: var(--border-radius-container-large) !important;
1278
+ margin: 2px 4px !important;
1279
+ padding: 4px 12px !important;
1280
+ }
1281
+ .cn-schema-form__enum-action-chip:hover {
1282
+ background: var(--color-primary-element) !important;
1283
+ }
1284
+ .cn-schema-form__enum-action-chip .action-button__text {
1285
+ color: var(--color-primary-text) !important;
1286
+ font-size: 12px !important;
1287
+ font-weight: 500 !important;
1288
+ }
1289
+ .cn-schema-form__enum-action-chip .action-button__icon {
1290
+ color: var(--color-primary-text) !important;
1291
+ }
1292
+ /* RBAC Security Tab Styling */
1293
+ .cn-schema-form__security-section {
1294
+ padding: 20px 0;
1295
+ }
1296
+ .cn-schema-form__loading-groups {
1297
+ display: flex;
1298
+ align-items: center;
1299
+ gap: 10px;
1300
+ padding: 20px;
1301
+ justify-content: center;
1302
+ }
1303
+ .cn-schema-form__rbac-table-container {
1304
+ margin-top: 20px;
1305
+ }
1306
+ .cn-schema-form__rbac-table-container h3 {
1307
+ margin-bottom: 15px;
1308
+ color: var(--color-main-text);
1309
+ font-size: 16px;
1310
+ font-weight: 600;
1311
+ }
1312
+ .cn-schema-form__rbac-table {
1313
+ width: 100%;
1314
+ border-collapse: collapse;
1315
+ border: 1px solid var(--color-border-dark);
1316
+ border-radius: var(--border-radius-element);
1317
+ overflow: hidden;
1318
+ box-shadow: 0 2px 8px rgba(var(--color-box-shadow-rgb), 0.1);
1319
+ }
1320
+ .cn-schema-form__rbac-table th {
1321
+ background: var(--color-background-dark);
1322
+ color: var(--color-main-text);
1323
+ font-weight: 600;
1324
+ padding: 12px 16px;
1325
+ text-align: left;
1326
+ border-bottom: 2px solid var(--color-border-dark);
1327
+ }
1328
+ .cn-schema-form__rbac-table th:first-child {
1329
+ width: 40%;
1330
+ }
1331
+ .cn-schema-form__rbac-table th:not(:first-child) {
1332
+ width: 15%;
1333
+ text-align: center;
1334
+ }
1335
+ .cn-schema-form__rbac-table td {
1336
+ padding: 12px 16px;
1337
+ border-bottom: 1px solid var(--color-border);
1338
+ vertical-align: middle;
1339
+ }
1340
+ .cn-schema-form__rbac-table td:not(.cn-schema-form__group-name) {
1341
+ text-align: center;
1342
+ }
1343
+ .cn-schema-form__rbac-table tr:hover {
1344
+ background: var(--color-background-hover);
1345
+ }
1346
+ .cn-schema-form__public-row {
1347
+ background: var(--color-primary-light) !important;
1348
+ }
1349
+ .cn-schema-form__user-row {
1350
+ background: var(--color-warning) !important;
1351
+ }
1352
+ .cn-schema-form__admin-row {
1353
+ background: var(--color-success) !important;
1354
+ }
1355
+ .cn-schema-form__admin-row:hover {
1356
+ background: var(--color-success) !important;
1357
+ }
1358
+ .cn-schema-form__group-name {
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ gap: 4px;
1362
+ }
1363
+ .cn-schema-form__group-badge {
1364
+ display: inline-block;
1365
+ padding: 4px 8px;
1366
+ border-radius: var(--border-radius-container);
1367
+ font-size: 12px;
1368
+ font-weight: 600;
1369
+ background: var(--color-primary-element-light);
1370
+ color: var(--color-primary-light-text);
1371
+ }
1372
+ .cn-schema-form__group-badge.cn-schema-form__public {
1373
+ background: var(--color-info);
1374
+ color: var(--color-primary-text);
1375
+ }
1376
+ .cn-schema-form__group-badge.cn-schema-form__user {
1377
+ background: var(--color-warning);
1378
+ color: var(--color-warning-text);
1379
+ }
1380
+ .cn-schema-form__group-badge.cn-schema-form__admin {
1381
+ background: var(--color-success);
1382
+ color: var(--color-success-text);
1383
+ }
1384
+ .cn-schema-form__group-name small {
1385
+ color: var(--color-text-maxcontrast);
1386
+ font-size: 11px;
1387
+ font-style: italic;
1388
+ }
1389
+ .cn-schema-form__rbac-summary {
1390
+ margin-top: 20px;
1391
+ }
1392
+ /* Property-level RBAC Styling - Action Menu Based */
1393
+ .cn-schema-form__property-permission-text {
1394
+ font-family: monospace;
1395
+ font-size: 12px;
1396
+ font-weight: 600;
1397
+ }
1398
+ .cn-schema-form__property-permission-remove-btn {
1399
+ font-size: 11px;
1400
+ color: var(--color-error);
1401
+ }
1402
+ /* Schema Extension Status Pill */
1403
+ .cn-schema-form__statusPill {
1404
+ display: inline-block;
1405
+ padding: 4px 12px;
1406
+ border-radius: var(--border-radius-container);
1407
+ font-size: 0.75em;
1408
+ font-weight: 600;
1409
+ text-transform: uppercase;
1410
+ margin-left: 8px;
1411
+ white-space: nowrap;
1412
+ vertical-align: middle;
1413
+ }
1414
+ .cn-schema-form__statusPill--alert {
1415
+ background-color: var(--color-warning);
1416
+ color: var(--color-warning-text);
1417
+ }
1418
+ /* Title with badge layout */
1419
+ .cn-schema-form__title-with-badge {
1420
+ display: flex;
1421
+ align-items: center;
1422
+ gap: 12px;
1423
+ flex-wrap: wrap;
1424
+ }
1425
+ .cn-schema-form__title-with-badge > :first-child {
1426
+ flex: 1;
1427
+ min-width: 0;
1428
+ }
1429
+ /* Parent schema link styling */
1430
+ .cn-schema-form__parent-schema-link {
1431
+ margin-top: 12px;
1432
+ padding: 8px 12px;
1433
+ background-color: var(--color-background-dark);
1434
+ border-radius: var(--border-radius);
1435
+ font-size: 0.9em;
1436
+ }
1437
+ .cn-schema-form__parent-schema-link strong {
1438
+ color: var(--color-main-text);
1439
+ }
1440
+ /* Extend info card styling */
1441
+ .cn-schema-form__extend-info {
1442
+ margin-top: 12px;
1443
+ margin-bottom: 12px;
1444
+ }
1445
+ .cn-schema-form__extend-info p {
1446
+ margin: 8px 0;
1447
+ }
1448
+ .cn-schema-form__extend-info p:first-of-type {
1449
+ margin-top: 0;
1450
+ }
1451
+ .cn-schema-form__extend-info p:last-of-type {
1452
+ margin-bottom: 0;
1453
+ }
1454
+ /* Property name with chips (moved from openregister/css/main.css) */
1455
+ .cn-schema-form__name-display-container {
1456
+ display: flex;
1457
+ align-items: center;
1458
+ gap: 8px;
1459
+ }
1460
+ .cn-schema-form__name-with-chips {
1461
+ display: flex;
1462
+ align-items: center;
1463
+ gap: 8px;
1464
+ flex-wrap: wrap;
1465
+ }
1466
+ .cn-schema-form__inline-chips {
1467
+ display: flex;
1468
+ flex-wrap: wrap;
1469
+ gap: 4px;
1470
+ align-items: center;
1471
+ }
1472
+ .cn-schema-form__property-chip {
1473
+ display: inline-block;
1474
+ padding: 2px 6px;
1475
+ border-radius: var(--border-radius-pill);
1476
+ font-size: 0.7em;
1477
+ font-weight: 500;
1478
+ line-height: 1.2;
1479
+ white-space: nowrap;
1480
+ }
1481
+ .cn-schema-form__chip-primary {
1482
+ background-color: var(--color-primary-element-light);
1483
+ color: var(--color-primary-element-text);
1484
+ }
1485
+ .cn-schema-form__chip-secondary {
1486
+ background-color: var(--color-background-dark);
1487
+ color: var(--color-text-maxcontrast);
1488
+ border: 1px solid var(--color-border);
1489
+ }
1490
+ .cn-schema-form__chip-warning {
1491
+ background-color: var(--color-warning);
1492
+ color: var(--color-warning-text);
1493
+ }
1494
+ .cn-schema-form__chip-success {
1495
+ background-color: var(--color-success);
1496
+ color: var(--color-success-text);
1497
+ }
1498
+ .cn-schema-form__properties-warning {
1499
+ margin-top: 15px;
1500
+ }
1501
+ /* Copied from openregister — also used in other files */
1502
+ .cn-schema-form__property-name {
1503
+ font-weight: 500;
1504
+ }
1505
+ .cn-schema-form__statusPill--success {
1506
+ background-color: var(--color-success);
1507
+ color: var(--color-success-text);
1508
+ }
1509
+ .cn-schema-form__statusPill--info {
1510
+ background-color: var(--color-info);
1511
+ color: var(--color-info-text);
1512
+ }
1513
+ /* Copied from openregister/SolrWarmupModal — also used in other files */
1514
+ .cn-schema-form__schema-option {
1515
+ display: flex;
1516
+ flex-direction: column;
1517
+ gap: 0.25rem;
1518
+ }
1519
+ .cn-schema-form__option-title {
1520
+ font-weight: 500;
1521
+ }
1522
+ .cn-schema-form__option-description {
1523
+ font-size: 0.875rem;
1524
+ color: var(--color-text-maxcontrast);
1525
+ max-width: 100%;
1526
+ white-space: normal;
1527
+ word-break: break-word;
1528
+ display: -webkit-box;
1529
+ -webkit-line-clamp: 2;
1530
+ -webkit-box-orient: vertical;
1531
+ overflow: hidden;
1532
+ }
1533
+ /* =============================================
1534
+ CnTimelineStages — Timeline / progress stages
1535
+ ============================================= */
1536
+ /* ---------- Root container ---------- */
1537
+ .cn-timeline-stages {
1538
+ display: flex;
1539
+ align-items: flex-start;
1540
+ gap: 0;
1541
+ width: 100%;
1542
+ }
1543
+ /* Horizontal: left-to-right, scrollable overflow */
1544
+ .cn-timeline-stages--horizontal {
1545
+ flex-direction: row;
1546
+ overflow-x: auto;
1547
+ padding-bottom: calc(var(--default-grid-baseline, 4px) * 1);
1548
+ }
1549
+ /* Vertical: top-to-bottom */
1550
+ .cn-timeline-stages--vertical {
1551
+ flex-direction: column;
1552
+ }
1553
+ /* ---------- Stage node ---------- */
1554
+ .cn-timeline-stages__stage {
1555
+ display: flex;
1556
+ flex-direction: column;
1557
+ align-items: center;
1558
+ position: relative;
1559
+ flex: 1 1 0;
1560
+ min-width: calc(var(--default-grid-baseline, 4px) * 20); /* 80px */
1561
+ text-align: center;
1562
+ padding: calc(var(--default-grid-baseline, 4px) * 1);
1563
+ border-radius: var(--border-radius-large, 10px);
1564
+ transition: background-color 0.15s ease;
1565
+ }
1566
+ /* Vertical stages: row layout */
1567
+ .cn-timeline-stages--vertical .cn-timeline-stages__stage {
1568
+ flex-direction: row;
1569
+ align-items: center;
1570
+ text-align: left;
1571
+ min-width: 0;
1572
+ gap: calc(var(--default-grid-baseline, 4px) * 3);
1573
+ }
1574
+ /* ---------- Track line (horizontal) ---------- */
1575
+ .cn-timeline-stages--horizontal .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
1576
+ content: '';
1577
+ position: absolute;
1578
+ top: 16px; /* half of 32px indicator */
1579
+ right: calc(50% + 16px + 4px);
1580
+ left: calc(-50% + 16px + 4px);
1581
+ height: 2px;
1582
+ background-color: var(--color-border, #ededed);
1583
+ z-index: 0;
1584
+ }
1585
+ /* Completed + current track segments: filled */
1586
+ .cn-timeline-stages--horizontal .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage::before,
1587
+ .cn-timeline-stages--horizontal .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage--current::before {
1588
+ background-color: var(--color-success-text, var(--color-success, #46ba61));
1589
+ }
1590
+ /* ---------- Track line (vertical) ---------- */
1591
+ .cn-timeline-stages--vertical .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
1592
+ content: '';
1593
+ position: absolute;
1594
+ left: 15px; /* center of 32px indicator */
1595
+ top: -6px;
1596
+ height: 6px;
1597
+ width: 2px;
1598
+ background-color: var(--color-border, #ededed);
1599
+ z-index: 0;
1600
+ }
1601
+ /* Completed + current track segments: filled (vertical) */
1602
+ .cn-timeline-stages--vertical .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage::before,
1603
+ .cn-timeline-stages--vertical .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage--current::before {
1604
+ background-color: var(--color-success-text, var(--color-success, #46ba61));
1605
+ }
1606
+ /* ---------- Indicator (circle) ---------- */
1607
+ .cn-timeline-stages__indicator {
1608
+ display: flex;
1609
+ align-items: center;
1610
+ justify-content: center;
1611
+ width: 32px;
1612
+ height: 32px;
1613
+ border-radius: 50%;
1614
+ flex-shrink: 0;
1615
+ position: relative;
1616
+ z-index: 1;
1617
+ border: 2px solid var(--color-border, #ededed);
1618
+ background-color: var(--color-main-background, #fff);
1619
+ transition: background-color 0.15s ease, border-color 0.15s ease;
1620
+ }
1621
+ /* Completed indicator: success green with white icon */
1622
+ .cn-timeline-stages__stage--completed .cn-timeline-stages__indicator {
1623
+ background-color: var(--color-success-text, var(--color-success, #46ba61));
1624
+ border-color: var(--color-success-text, var(--color-success, #46ba61));
1625
+ color: #fff;
1626
+ }
1627
+ /* Current indicator: primary blue */
1628
+ .cn-timeline-stages__stage--current .cn-timeline-stages__indicator {
1629
+ background-color: var(--color-primary-element, #0082c9);
1630
+ border-color: var(--color-primary-element, #0082c9);
1631
+ color: var(--color-primary-element-text, #fff);
1632
+ }
1633
+ /* ---------- Checkmark SVG ---------- */
1634
+ .cn-timeline-stages__checkmark {
1635
+ width: 16px;
1636
+ height: 16px;
1637
+ }
1638
+ /* ---------- Current dot ---------- */
1639
+ .cn-timeline-stages__dot {
1640
+ display: block;
1641
+ width: 10px;
1642
+ height: 10px;
1643
+ border-radius: 50%;
1644
+ background-color: currentColor;
1645
+ }
1646
+ /* ---------- Label ---------- */
1647
+ .cn-timeline-stages__label {
1648
+ display: block;
1649
+ margin-top: calc(var(--default-grid-baseline, 4px) * 1);
1650
+ font-size: 0.9em;
1651
+ line-height: 1.3;
1652
+ color: var(--color-text-maxcontrast, #767676);
1653
+ word-break: break-word;
1654
+ }
1655
+ /* Vertical: label aligns with indicator center */
1656
+ .cn-timeline-stages--vertical .cn-timeline-stages__label {
1657
+ margin-top: 0;
1658
+ }
1659
+ /* Completed stage label */
1660
+ .cn-timeline-stages__stage--completed .cn-timeline-stages__label {
1661
+ color: var(--color-main-text, #222);
1662
+ }
1663
+ /* Current stage label: bold and prominent */
1664
+ .cn-timeline-stages__stage--current .cn-timeline-stages__label {
1665
+ color: var(--color-main-text, #222);
1666
+ font-weight: bold;
1667
+ }
1668
+ /* ---------- Subtitle ---------- */
1669
+ .cn-timeline-stages__subtitle {
1670
+ display: block;
1671
+ font-size: 0.8em;
1672
+ line-height: 1.3;
1673
+ color: var(--color-text-maxcontrast, #767676);
1674
+ margin-top: 2px;
1675
+ }
1676
+ /* ---------- Small size variant ---------- */
1677
+ .cn-timeline-stages--small .cn-timeline-stages__indicator {
1678
+ width: 20px;
1679
+ height: 20px;
1680
+ }
1681
+ .cn-timeline-stages--small .cn-timeline-stages__checkmark {
1682
+ width: 12px;
1683
+ height: 12px;
1684
+ }
1685
+ .cn-timeline-stages--small .cn-timeline-stages__dot {
1686
+ width: 6px;
1687
+ height: 6px;
1688
+ }
1689
+ .cn-timeline-stages--small .cn-timeline-stages__label {
1690
+ font-size: 0.85em;
1691
+ }
1692
+ .cn-timeline-stages--small .cn-timeline-stages__stage {
1693
+ min-width: calc(var(--default-grid-baseline, 4px) * 14); /* 56px */
1694
+ }
1695
+ /* Small horizontal track line offset */
1696
+ .cn-timeline-stages--small.cn-timeline-stages--horizontal .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
1697
+ top: 10px; /* half of 20px */
1698
+ right: calc(50% + 10px + 4px);
1699
+ left: calc(-50% + 10px + 4px);
1700
+ }
1701
+ /* Small vertical track line offset */
1702
+ .cn-timeline-stages--small.cn-timeline-stages--vertical .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
1703
+ left: 9px; /* center of 20px indicator */
1704
+ top: -6px;
1705
+ height: 6px;
1706
+ }
1707
+ /* ---------- Clickable mode ---------- */
1708
+ .cn-timeline-stages--clickable .cn-timeline-stages__stage {
1709
+ cursor: pointer;
1710
+ }
1711
+ .cn-timeline-stages--clickable .cn-timeline-stages__stage:hover {
1712
+ background-color: var(--color-background-dark, #ededed);
1713
+ }
1714
+ /* Focus ring (keyboard only) */
1715
+ .cn-timeline-stages--clickable .cn-timeline-stages__stage:focus-visible {
1716
+ outline: 2px solid var(--color-primary-element, #0082c9);
1717
+ outline-offset: 2px;
1718
+ }
1719
+ /* Remove default outline for mouse clicks */
1720
+ .cn-timeline-stages--clickable .cn-timeline-stages__stage:focus:not(:focus-visible) {
1721
+ outline: none;
1722
+ }
1723
+ /* useContextMenu — Position the context menu popper at cursor coordinates.
1724
+ *
1725
+ * Works with any NcActions that uses useContextMenu().
1726
+ * The data attribute ensures transforms only apply when a context menu is active,
1727
+ * avoiding interference with regular NcActions poppers.
1728
+ */
1729
+ html[data-cn-ctx-menu] .v-popper__popper {
1730
+ transform: translate3d(var(--cn-ctx-menu-x), var(--cn-ctx-menu-y), 0px) !important;
1731
+ }
1732
+ html[data-cn-ctx-menu] .v-popper__popper[data-popper-placement="top"] {
1733
+ transform: translate3d(var(--cn-ctx-menu-x), calc(var(--cn-ctx-menu-y) - 50vh + 34px), 0px) !important;
1734
+ }
1735
+ html[data-cn-ctx-menu] .v-popper__popper .v-popper__arrow-container {
1736
+ display: none;
1737
+ }
1738
+ /* Destructive action styling (shared across all context menus) */
1739
+ html[data-cn-ctx-menu] .cn-row-action--destructive {
1740
+ color: var(--color-error) !important;
1741
+ }
18
1742
 
19
1743
 
20
1744
  .cn-cell-renderer--uuid[data-v-1351820e] {
@@ -152,8 +1876,7 @@
152
1876
  .cn-stats-block--clickable[data-v-8f21fbe2]:focus-visible {
153
1877
  outline: 2px solid var(--color-primary-element);
154
1878
  outline-offset: 2px;
155
- }
156
-
1879
+ }
157
1880
  /* Icon */
158
1881
  .cn-stats-block__icon[data-v-8f21fbe2] {
159
1882
  display: flex;
@@ -187,8 +1910,7 @@
187
1910
  .cn-stats-block__icon--error[data-v-8f21fbe2] {
188
1911
  background: rgba(224, 36, 36, 0.1);
189
1912
  color: var(--color-element-error, var(--color-error));
190
- }
191
-
1913
+ }
192
1914
  /* Content */
193
1915
  .cn-stats-block__content[data-v-8f21fbe2] {
194
1916
  flex: 1;
@@ -335,8 +2057,7 @@
335
2057
  font-weight: 600;
336
2058
  color: var(--color-main-text);
337
2059
  font-size: 14px;
338
- }
339
-
2060
+ }
340
2061
  /* Status classes for values */
341
2062
  .cn-version-info__status--ok[data-v-135fb480] {
342
2063
  color: var(--color-success);
@@ -450,12 +2171,17 @@
450
2171
  }
451
2172
 
452
2173
 
453
- .cn-card-grid__loading[data-v-c4e62862] {
2174
+ .cn-card-grid__grid[data-v-2dd064bc] {
2175
+ display: grid;
2176
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
2177
+ gap: 16px;
2178
+ }
2179
+ .cn-card-grid__loading[data-v-2dd064bc] {
454
2180
  display: flex;
455
2181
  justify-content: center;
456
2182
  padding: 40px;
457
2183
  }
458
- .cn-card-grid__empty[data-v-c4e62862] {
2184
+ .cn-card-grid__empty[data-v-2dd064bc] {
459
2185
  padding: 40px 20px;
460
2186
  text-align: center;
461
2187
  }
@@ -650,8 +2376,7 @@
650
2376
  display: flex;
651
2377
  flex-direction: column;
652
2378
  gap: 12px;
653
- }
654
-
2379
+ }
655
2380
  /* Summary table */
656
2381
  .cn-mass-import__results h3[data-v-a78a42ac] {
657
2382
  margin: 0 0 12px;
@@ -709,8 +2434,7 @@
709
2434
  }
710
2435
  .cn-mass-import__expand--open[data-v-a78a42ac] {
711
2436
  transform: rotate(180deg);
712
- }
713
-
2437
+ }
714
2438
  /* Error details */
715
2439
  .cn-mass-import__error-row td[data-v-a78a42ac] {
716
2440
  padding: 8px 12px;
@@ -776,26 +2500,86 @@
776
2500
  }
777
2501
 
778
2502
 
779
- .cn-form-dialog__form[data-v-3526144d] {
2503
+ .cn-json-viewer[data-v-e4d4a57e] {
2504
+ display: flex;
2505
+ flex-direction: column;
2506
+ gap: 8px;
2507
+ }
2508
+ .cn-json-viewer__codemirror[data-v-e4d4a57e] {
2509
+ position: relative;
2510
+ }
2511
+ .cn-json-viewer__codemirror[data-v-e4d4a57e] :deep(.cm-editor) {
2512
+ height: 100%;
2513
+ outline: none !important;
2514
+ }
2515
+ .cn-json-viewer__codemirror[data-v-e4d4a57e] :deep(.cm-scroller) {
2516
+ overflow: auto;
2517
+ }
2518
+ .cn-json-viewer__codemirror[data-v-e4d4a57e] :deep(.cm-content) {
2519
+ border-radius: 0 !important;
2520
+ border: none !important;
2521
+ }
2522
+ .cn-json-viewer__codemirror--light > .vue-codemirror[data-v-e4d4a57e] {
2523
+ border: 1px dotted silver;
2524
+ }
2525
+ .cn-json-viewer__codemirror--dark > .vue-codemirror[data-v-e4d4a57e] {
2526
+ border: 1px dotted grey;
2527
+ }
2528
+ /* Text cursor */
2529
+ .cn-json-viewer__codemirror :deep(.cm-content) *[data-v-e4d4a57e] {
2530
+ cursor: text !important;
2531
+ }
2532
+ /* PATCH SELECTION COLOR - default selection system does not work */
2533
+ /* Selection background — CodeMirror uses .cm-selectionBackground instead of ::selection */
2534
+ .cn-json-viewer__codemirror--light[data-v-e4d4a57e] :deep(.cm-selectionBackground) {
2535
+ background: #3390ff !important;
2536
+ }
2537
+ .cn-json-viewer__codemirror--light :deep(.cm-selectionBackground) + .cm-selectionBackground[data-v-e4d4a57e],
2538
+ .cn-json-viewer__codemirror--light[data-v-e4d4a57e] :deep(.cm-line ::selection) {
2539
+ color: white !important;
2540
+ }
2541
+ .cn-json-viewer__codemirror--dark[data-v-e4d4a57e] :deep(.cm-selectionBackground) {
2542
+ background: #3390ff !important;
2543
+ }
2544
+ /* Selected text color */
2545
+ .cn-json-viewer__codemirror--light[data-v-e4d4a57e] :deep(.cm-content ::selection) {
2546
+ background: #3390ff !important;
2547
+ color: white !important;
2548
+ }
2549
+ .cn-json-viewer__codemirror--dark[data-v-e4d4a57e] :deep(.cm-content ::selection) {
2550
+ background: #3390ff !important;
2551
+ color: white !important;
2552
+ }
2553
+ .cn-json-viewer__format-btn[data-v-e4d4a57e] {
2554
+ margin-top: 8px;
2555
+ }
2556
+ .cn-json-viewer__error[data-v-e4d4a57e] {
2557
+ color: var(--color-error);
2558
+ font-size: 14px;
2559
+ }
2560
+
2561
+
2562
+ .cn-form-dialog__form[data-v-0c487c8d] {
780
2563
  display: flex;
781
2564
  flex-direction: column;
782
2565
  gap: 4px;
783
2566
  }
784
- .cn-form-dialog__field[data-v-3526144d] {
2567
+ .cn-form-dialog__field[data-v-0c487c8d] {
785
2568
  margin-bottom: 8px;
786
2569
  }
787
- .cn-form-dialog__textarea-wrapper[data-v-3526144d],
788
- .cn-form-dialog__select-wrapper[data-v-3526144d] {
2570
+ .cn-form-dialog__textarea-wrapper[data-v-0c487c8d],
2571
+ .cn-form-dialog__select-wrapper[data-v-0c487c8d],
2572
+ .cn-form-dialog__json-wrapper[data-v-0c487c8d] {
789
2573
  display: flex;
790
2574
  flex-direction: column;
791
2575
  gap: 4px;
792
2576
  }
793
- .cn-form-dialog__label[data-v-3526144d] {
2577
+ .cn-form-dialog__label[data-v-0c487c8d] {
794
2578
  font-weight: 600;
795
2579
  font-size: 0.9em;
796
2580
  color: var(--color-main-text);
797
2581
  }
798
- .cn-form-dialog__textarea[data-v-3526144d] {
2582
+ .cn-form-dialog__textarea[data-v-0c487c8d] {
799
2583
  width: 100%;
800
2584
  min-height: 80px;
801
2585
  padding: 8px;
@@ -807,19 +2591,19 @@
807
2591
  font-size: inherit;
808
2592
  resize: vertical;
809
2593
  }
810
- .cn-form-dialog__textarea[data-v-3526144d]:focus {
2594
+ .cn-form-dialog__textarea[data-v-0c487c8d]:focus {
811
2595
  border-color: var(--color-primary-element);
812
2596
  outline: none;
813
2597
  }
814
- .cn-form-dialog__textarea[data-v-3526144d]:disabled {
2598
+ .cn-form-dialog__textarea[data-v-0c487c8d]:disabled {
815
2599
  opacity: 0.5;
816
2600
  cursor: not-allowed;
817
2601
  }
818
- .cn-form-dialog__helper[data-v-3526144d] {
2602
+ .cn-form-dialog__helper[data-v-0c487c8d] {
819
2603
  font-size: 0.85em;
820
2604
  color: var(--color-text-maxcontrast);
821
2605
  }
822
- .cn-form-dialog__helper--error[data-v-3526144d] {
2606
+ .cn-form-dialog__helper--error[data-v-0c487c8d] {
823
2607
  color: var(--color-error);
824
2608
  }
825
2609
 
@@ -832,8 +2616,7 @@
832
2616
  display: flex;
833
2617
  align-items: center;
834
2618
  gap: 6px;
835
- }
836
-
2619
+ }
837
2620
  /* patch extreme size in field */
838
2621
  .cn-advanced-form-dialog__boolean-input-row__input > span[data-v-e6f842ea] {
839
2622
  padding-left: 0;
@@ -892,8 +2675,7 @@
892
2675
  }
893
2676
  .cn-advanced-form-dialog__table-row[data-v-d25a1406]:hover {
894
2677
  background-color: var(--color-background-hover);
895
- }
896
-
2678
+ }
897
2679
  /* Active/selected row: light blue; ensure it wins over validation state classes */
898
2680
  .cn-advanced-form-dialog__table-row.cn-advanced-form-dialog__table-row--selected[data-v-d25a1406],
899
2681
  .cn-advanced-form-dialog__table-row--selected[data-v-d25a1406]:hover {
@@ -1040,46 +2822,40 @@
1040
2822
  }
1041
2823
  .cn-advanced-form-dialog__codemirror-container--dark > .vue-codemirror[data-v-1aeee536] {
1042
2824
  border: 1px dotted grey;
1043
- }
1044
-
1045
- /* value text color */
2825
+ }
2826
+ /* value text color */
1046
2827
  /* string */
1047
2828
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.ͼe) {
1048
2829
  color: #448c27;
1049
2830
  }
1050
2831
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.ͼe) {
1051
2832
  color: #88c379;
1052
- }
1053
-
2833
+ }
1054
2834
  /* boolean */
1055
2835
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.ͼc) {
1056
2836
  color: #221199;
1057
2837
  }
1058
2838
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.ͼc) {
1059
2839
  color: #8d64f7;
1060
- }
1061
-
2840
+ }
1062
2841
  /* null */
1063
2842
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.ͼb) {
1064
2843
  color: #770088;
1065
2844
  }
1066
2845
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.ͼb) {
1067
2846
  color: #be55cd;
1068
- }
1069
-
2847
+ }
1070
2848
  /* number */
1071
2849
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.ͼd) {
1072
2850
  color: #d19a66;
1073
2851
  }
1074
2852
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.ͼd) {
1075
2853
  color: #9d6c3a;
1076
- }
1077
-
2854
+ }
1078
2855
  /* text cursor */
1079
2856
  .cn-advanced-form-dialog__codemirror-container :deep(.cm-content) *[data-v-1aeee536] {
1080
2857
  cursor: text !important;
1081
- }
1082
-
2858
+ }
1083
2859
  /* selection color */
1084
2860
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.cm-line)::selection,
1085
2861
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.cm-line) ::selection {
@@ -1090,32 +2866,28 @@
1090
2866
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.cm-line) ::selection {
1091
2867
  background-color: #8fb3e6 !important;
1092
2868
  color: black;
1093
- }
1094
-
2869
+ }
1095
2870
  /* string selection */
1096
2871
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.cm-line .ͼe)::selection {
1097
2872
  color: #2d770f;
1098
2873
  }
1099
2874
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.cm-line .ͼe)::selection {
1100
2875
  color: #104e0c;
1101
- }
1102
-
2876
+ }
1103
2877
  /* boolean selection */
1104
2878
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.cm-line .ͼc)::selection {
1105
2879
  color: #221199;
1106
2880
  }
1107
2881
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.cm-line .ͼc)::selection {
1108
2882
  color: #4026af;
1109
- }
1110
-
2883
+ }
1111
2884
  /* null selection */
1112
2885
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.cm-line .ͼb)::selection {
1113
2886
  color: #770088;
1114
2887
  }
1115
2888
  .cn-advanced-form-dialog__codemirror-container--dark[data-v-1aeee536] :deep(.cm-line .ͼb)::selection {
1116
2889
  color: #770088;
1117
- }
1118
-
2890
+ }
1119
2891
  /* number selection */
1120
2892
  .cn-advanced-form-dialog__codemirror-container--light[data-v-1aeee536] :deep(.cm-line .ͼd)::selection {
1121
2893
  color: #8c5c2c;
@@ -1141,8 +2913,7 @@
1141
2913
  display: flex;
1142
2914
  flex-direction: column;
1143
2915
  gap: 12px;
1144
- }
1145
-
2916
+ }
1146
2917
  /* Bootstrap-Vue tab styling to match ViewObject */
1147
2918
  .tabContainer[data-v-56dc256b] {
1148
2919
  margin-top: 20px;
@@ -1222,8 +2993,7 @@
1222
2993
  }
1223
2994
  .cn-kpi-grid--cols-4[data-v-66291afe] {
1224
2995
  grid-template-columns: repeat(4, 1fr);
1225
- }
1226
-
2996
+ }
1227
2997
  /* Responsive breakpoints */
1228
2998
  @media (max-width: 1200px) {
1229
2999
  .cn-kpi-grid--cols-4[data-v-66291afe] {
@@ -1358,8 +3128,7 @@
1358
3128
  color: var(--color-text-maxcontrast);
1359
3129
  font-size: 13px;
1360
3130
  margin: 0 0 8px 0;
1361
- }
1362
-
3131
+ }
1363
3132
  /* Slide transition */
1364
3133
  .slide-enter-active[data-v-94fecc26],
1365
3134
  .slide-leave-active[data-v-94fecc26] {
@@ -1373,8 +3142,7 @@
1373
3142
  padding-top: 0;
1374
3143
  padding-bottom: 0;
1375
3144
  opacity: 0;
1376
- }
1377
-
3145
+ }
1378
3146
  /* Last row in list should not have bottom border */
1379
3147
  .cn-register-mapping__type-list[data-v-94fecc26] > :last-child {
1380
3148
  border-bottom: none;
@@ -2087,35 +3855,30 @@
2087
3855
  /* Result phase container */
2088
3856
  .cn-tabbed-form-dialog__result[data-v-04877599] {
2089
3857
  padding: 16px 0;
2090
- }
2091
-
3858
+ }
2092
3859
  /* Form phase container */
2093
3860
  .cn-tabbed-form-dialog__form[data-v-04877599] {
2094
3861
  display: flex;
2095
3862
  flex-direction: column;
2096
3863
  gap: 8px;
2097
- }
2098
-
3864
+ }
2099
3865
  /* Tabs wrapper */
2100
3866
  .cn-tabbed-form-dialog__tabs[data-v-04877599] {
2101
3867
  display: flex;
2102
3868
  flex-direction: column;
2103
3869
  gap: 12px;
2104
- }
2105
-
3870
+ }
2106
3871
  /* Tab content area — also uses .form-editor for compatibility */
2107
3872
  .cn-tabbed-form-dialog__tab-content[data-v-04877599] {
2108
3873
  display: flex;
2109
3874
  flex-direction: column;
2110
3875
  gap: 16px;
2111
3876
  padding: 16px 0;
2112
- }
2113
-
3877
+ }
2114
3878
  /* Create another checkbox — push to the left in actions area */
2115
3879
  .cn-tabbed-form-dialog__create-another[data-v-04877599] {
2116
3880
  margin-right: auto;
2117
- }
2118
-
3881
+ }
2119
3882
  /* Bootstrap-Vue tab container styling */
2120
3883
  .tabContainer > * ul > li[data-v-04877599] {
2121
3884
  display: flex;
@@ -2715,8 +4478,7 @@
2715
4478
  }
2716
4479
  .cn-progress-bar__fill--rounded[data-v-31e820d6] {
2717
4480
  border-radius: 4px;
2718
- }
2719
-
4481
+ }
2720
4482
  /* Variant colors */
2721
4483
  .cn-progress-bar__fill--default[data-v-31e820d6] {
2722
4484
  background: var(--color-main-text);
@@ -2784,70 +4546,6 @@
2784
4546
  }
2785
4547
 
2786
4548
 
2787
- .cn-json-viewer[data-v-699c5b96] {
2788
- display: flex;
2789
- flex-direction: column;
2790
- gap: 8px;
2791
- }
2792
- .cn-json-viewer__codemirror[data-v-699c5b96] {
2793
- border: 1px solid var(--color-border);
2794
- border-radius: var(--border-radius);
2795
- position: relative;
2796
- }
2797
- .cn-json-viewer__codemirror[data-v-699c5b96] :deep(.cm-editor) {
2798
- height: 100%;
2799
- outline: none !important;
2800
- }
2801
- .cn-json-viewer__codemirror[data-v-699c5b96] :deep(.cm-scroller) {
2802
- overflow: auto;
2803
- }
2804
- .cn-json-viewer__codemirror[data-v-699c5b96] :deep(.cm-content) {
2805
- border-radius: 0 !important;
2806
- border: none !important;
2807
- }
2808
- .cn-json-viewer__codemirror--light > .vue-codemirror[data-v-699c5b96] {
2809
- border: 1px dotted silver;
2810
- }
2811
- .cn-json-viewer__codemirror--dark > .vue-codemirror[data-v-699c5b96] {
2812
- border: 1px dotted grey;
2813
- }
2814
-
2815
- /* Text cursor */
2816
- .cn-json-viewer__codemirror :deep(.cm-content) *[data-v-699c5b96] {
2817
- cursor: text !important;
2818
- }
2819
-
2820
- /* PATCH SELECTION COLOR - default selection system does not work */
2821
- /* Selection background — CodeMirror uses .cm-selectionBackground instead of ::selection */
2822
- .cn-json-viewer__codemirror--light[data-v-699c5b96] :deep(.cm-selectionBackground) {
2823
- background: #3390ff !important;
2824
- }
2825
- .cn-json-viewer__codemirror--light :deep(.cm-selectionBackground) + .cm-selectionBackground[data-v-699c5b96],
2826
- .cn-json-viewer__codemirror--light[data-v-699c5b96] :deep(.cm-line ::selection) {
2827
- color: white !important;
2828
- }
2829
- .cn-json-viewer__codemirror--dark[data-v-699c5b96] :deep(.cm-selectionBackground) {
2830
- background: #3390ff !important;
2831
- }
2832
-
2833
- /* Selected text color */
2834
- .cn-json-viewer__codemirror--light[data-v-699c5b96] :deep(.cm-content ::selection) {
2835
- background: #3390ff !important;
2836
- color: white !important;
2837
- }
2838
- .cn-json-viewer__codemirror--dark[data-v-699c5b96] :deep(.cm-content ::selection) {
2839
- background: #3390ff !important;
2840
- color: white !important;
2841
- }
2842
- .cn-json-viewer__format-btn[data-v-699c5b96] {
2843
- margin-top: 8px;
2844
- }
2845
- .cn-json-viewer__error[data-v-699c5b96] {
2846
- color: var(--color-error);
2847
- font-size: 14px;
2848
- }
2849
-
2850
-
2851
4549
 
2852
4550
 
2853
4551
 
@@ -3021,15 +4719,13 @@
3021
4719
  .cn-detail-grid--grid[data-v-cf35e538] {
3022
4720
  display: grid;
3023
4721
  gap: calc(4 * var(--default-grid-baseline, 4px));
3024
- }
3025
-
4722
+ }
3026
4723
  /* ===== Horizontal layout ===== */
3027
4724
  .cn-detail-grid--horizontal[data-v-cf35e538] {
3028
4725
  display: flex;
3029
4726
  flex-direction: column;
3030
4727
  gap: calc(3 * var(--default-grid-baseline, 4px));
3031
- }
3032
-
4728
+ }
3033
4729
  /* ===== Item (card style) ===== */
3034
4730
  .cn-detail-grid__item[data-v-cf35e538] {
3035
4731
  display: flex;
@@ -3038,21 +4734,18 @@
3038
4734
  padding: calc(2 * var(--default-grid-baseline, 4px)) calc(3 * var(--default-grid-baseline, 4px));
3039
4735
  background: var(--color-background-hover);
3040
4736
  border-radius: 0 var(--border-radius) var(--border-radius) 0;
3041
- }
3042
-
4737
+ }
3043
4738
  /* Accent border */
3044
4739
  .cn-detail-grid--accent .cn-detail-grid__item[data-v-cf35e538] {
3045
4740
  border-left: 3px solid var(--color-primary-element);
3046
- }
3047
-
4741
+ }
3048
4742
  /* Horizontal item: row direction */
3049
4743
  .cn-detail-grid__item--horizontal[data-v-cf35e538] {
3050
4744
  flex-direction: row;
3051
4745
  align-items: center;
3052
4746
  gap: calc(4 * var(--default-grid-baseline, 4px));
3053
4747
  border-radius: var(--border-radius);
3054
- }
3055
-
4748
+ }
3056
4749
  /* ===== Label ===== */
3057
4750
  .cn-detail-grid__label[data-v-cf35e538] {
3058
4751
  font-size: 0.85em;
@@ -3062,8 +4755,7 @@
3062
4755
  .cn-detail-grid--horizontal .cn-detail-grid__label[data-v-cf35e538] {
3063
4756
  min-width: var(--cn-detail-grid-label-width, 150px);
3064
4757
  flex-shrink: 0;
3065
- }
3066
-
4758
+ }
3067
4759
  /* ===== Value ===== */
3068
4760
  .cn-detail-grid__value[data-v-cf35e538] {
3069
4761
  font-size: 1em;
@@ -3073,22 +4765,19 @@
3073
4765
  }
3074
4766
  .cn-detail-grid--horizontal .cn-detail-grid__value[data-v-cf35e538] {
3075
4767
  flex: 1;
3076
- }
3077
-
4768
+ }
3078
4769
  /* ===== Actions ===== */
3079
4770
  .cn-detail-grid__actions[data-v-cf35e538] {
3080
4771
  flex-shrink: 0;
3081
4772
  display: flex;
3082
4773
  align-items: center;
3083
- }
3084
-
4774
+ }
3085
4775
  /* ===== Empty state ===== */
3086
4776
  .cn-detail-grid__empty[data-v-cf35e538] {
3087
4777
  color: var(--color-text-maxcontrast);
3088
4778
  font-style: italic;
3089
4779
  padding: calc(2 * var(--default-grid-baseline, 4px));
3090
- }
3091
-
4780
+ }
3092
4781
  /* ===== Responsive ===== */
3093
4782
  @media (max-width: 600px) {
3094
4783
  .cn-detail-grid--grid[data-v-cf35e538] {
@@ -3432,8 +5121,7 @@ to { opacity: 1; max-height: 600px;
3432
5121
  color: var(--color-main-text);
3433
5122
  margin: 0;
3434
5123
  word-break: break-word;
3435
- }
3436
-
5124
+ }
3437
5125
  /* Responsive: single column on small screens */
3438
5126
  @media (max-width: 600px) {
3439
5127
  .cn-info-widget[data-v-fbcf1704] {
@@ -3579,8 +5267,7 @@ to { opacity: 1; max-height: 600px;
3579
5267
  color: var(--color-text-maxcontrast);
3580
5268
  font-style: italic;
3581
5269
  padding: calc(2 * var(--default-grid-baseline, 4px));
3582
- }
3583
-
5270
+ }
3584
5271
  /* Responsive: collapse to single column on narrow widths */
3585
5272
  @media (max-width: 600px) {
3586
5273
  .cn-object-data-widget__grid[data-v-64256460] {