@oat-sa/tao-core-ui 3.23.0 → 3.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/figure/FigureStateActive.js +64 -32
  2. package/dist/image/ImgStateActive/initHelper.js +64 -32
  3. package/dist/image/ImgStateActive.js +64 -32
  4. package/dist/previewer.js +1 -1
  5. package/dist/resourcemgr/assetSearch.js +793 -0
  6. package/dist/resourcemgr/assetSearchContract.js +477 -0
  7. package/dist/resourcemgr/css/resourcemgr.css +1230 -97
  8. package/dist/resourcemgr/css/resourcemgr.css.map +1 -1
  9. package/dist/resourcemgr/fileBrowser.js +815 -83
  10. package/dist/resourcemgr/filePreview.js +82 -7
  11. package/dist/resourcemgr/fileSelector.js +377 -92
  12. package/dist/resourcemgr.js +314 -57
  13. package/dist/searchModal/advancedSearch.js +233 -31
  14. package/package.json +15 -6
  15. package/src/image/ImgStateActive/initHelper.js +69 -31
  16. package/src/previewer.js +1 -1
  17. package/src/resourcemgr/assetSearch.js +847 -0
  18. package/src/resourcemgr/assetSearchContract.js +489 -0
  19. package/src/resourcemgr/css/resourcemgr.css +1230 -97
  20. package/src/resourcemgr/css/resourcemgr.css.map +1 -1
  21. package/src/resourcemgr/fileBrowser.js +872 -92
  22. package/src/resourcemgr/filePreview.js +89 -8
  23. package/src/resourcemgr/fileSelector.js +356 -46
  24. package/src/resourcemgr/scss/resourcemgr.scss +1450 -89
  25. package/src/resourcemgr/tpl/advanced-search.tpl +10 -0
  26. package/src/resourcemgr/tpl/fileSelect.tpl +25 -28
  27. package/src/resourcemgr/tpl/folder.tpl +4 -1
  28. package/src/resourcemgr/tpl/layout.tpl +125 -54
  29. package/src/resourcemgr/tpl/rootFolder.tpl +3 -1
  30. package/src/resourcemgr.js +294 -47
  31. package/src/searchModal/advancedSearch.js +242 -31
@@ -2,73 +2,189 @@
2
2
 
3
3
  /* tooltip */
4
4
  .resourcemgr {
5
+ // Figma Resource Manager palette (Insert Media modal)
6
+ $rmDark: #222222;
7
+ $rmLight: #ffffff;
8
+ $rmMidGray: #dddfe2;
9
+ // Figma heading fill #F6F7F7; nearest global token $uiReviewPanelBg (#f2f2f2)
10
+ $rmHeaderBg: #f6f7f7;
11
+ $rmActive: #286d9c;
12
+ $rmDarkBar: #333333;
5
13
 
6
- $activeColor: whiten($uiClickableHoverBg, 0.9);
7
- $rmBrowserWidth: 260;
8
- $rmPreviewWidth: 300;
14
+ // Local palette aliases ($rm*) — do not shadow global theme token names
15
+ $rmText: $rmDark;
16
+ $rmSurface: $rmLight;
17
+ $rmBorder: $rmMidGray;
18
+ $rmChromeBg: $rmHeaderBg;
19
+ $rmClickableBg: $rmLight;
20
+ $rmInfo: $rmActive;
21
+ $rmClickableHover: $rmActive;
22
+ $rmClickableActive: $rmActive;
23
+ $rmActiveRow: mix($rmLight, $rmActive, 90%);
24
+ $rmSidePanelWidth: 300;
25
+ $rmBrowserWidth: $rmSidePanelWidth;
26
+ $rmPreviewWidth: $rmSidePanelWidth;
9
27
  $rmMaxContainerWidth: 1400;
10
28
  $rmSideMargin: 40;
11
29
 
30
+ $rmHeaderRadius: 4px;
31
+ // Top chrome row (Search | Assets | Preview): pad + small btn (25px) → shared bar height.
32
+ $rmPanelChromePadY: 8px;
33
+ $rmPanelChromePadX: 10px;
34
+ $rmPanelChromeMinHeight: 41px;
35
+ $rmControlRadius: 4px;
36
+
12
37
  width: 90%;
13
38
  height: 100%;
14
39
  max-width: $rmMaxContainerWidth * 1px;
40
+ color: $rmText;
41
+ background-color: $rmSurface;
42
+ border-color: $rmBorder;
15
43
 
44
+ // jQuery UI modal sets inline `top` — !important keeps RM vertically centered in viewport
16
45
  #mediaManager &.modal {
17
46
  max-height: 700px;
18
47
  top: 40px !important;
19
48
  bottom: 40px;
20
49
  padding: 0;
50
+ border: 1px solid $rmBorder;
51
+ background-color: $rmSurface;
52
+ border-radius: 0;
21
53
  }
22
54
 
23
55
  & > h2 {
24
56
  @include font-size(15);
25
57
  margin: 20px 40px 10px;
26
58
  height: 40px;
59
+ color: $rmText;
60
+ }
61
+
62
+ // Align global btn-info with Figma active blue inside RM
63
+ .btn-info {
64
+ color: $rmLight;
65
+ background-color: $rmActive;
66
+ border: 1px solid $rmActive;
67
+ text-shadow: none;
68
+ box-shadow: none;
69
+
70
+ &:hover,
71
+ &:focus,
72
+ &:active {
73
+ color: $rmLight;
74
+ background-color: $rmActive;
75
+ border-color: $rmActive;
76
+ text-shadow: none;
77
+ box-shadow: none;
78
+ opacity: 0.9;
79
+ }
80
+
81
+ &.btn-secondary,
82
+ &.btn-transparent {
83
+ color: $rmActive;
84
+ background-color: $rmLight;
85
+ border: 1px solid $rmActive;
86
+ text-shadow: none;
87
+ box-shadow: none;
88
+
89
+ &:hover,
90
+ &:focus,
91
+ &:active {
92
+ color: $rmActive;
93
+ background-color: $rmLight;
94
+ border-color: $rmActive;
95
+ text-shadow: none;
96
+ box-shadow: none;
97
+ opacity: 0.9;
98
+ }
99
+ }
100
+ }
101
+
102
+ .btn-success {
103
+ text-shadow: none;
104
+ box-shadow: none;
27
105
  }
28
106
 
29
107
  .file-wrapper {
30
108
  overflow-y: auto;
31
109
  margin: 0 #{$rmSideMargin * 1px};
110
+ // Keep in sync with .asset-search max-height chrome compensation below.
32
111
  height: calc(100% - 40px - 40px - 40px); // full height - h2.padding - h2.height - modal.bottom-padding
33
- @include flex-container();
112
+ display: flex;
113
+ flex-direction: column;
114
+ min-height: 0;
115
+ }
116
+
117
+ .file-panels {
118
+ @include flex-container;
119
+
120
+ flex: 1 1 auto;
121
+ min-height: 0;
122
+ height: 100%;
123
+ gap: 0;
34
124
  }
35
125
 
36
126
  .file-browser {
37
127
  @include simple-flex-box($rmBrowserWidth * 1px);
128
+ width: $rmBrowserWidth * 1px;
129
+ max-width: $rmBrowserWidth * 1px;
130
+ min-width: 0;
131
+
132
+ // Keep select2 criteria dropdown usable (appended near control / body)
133
+ overflow: visible;
38
134
  }
39
135
 
40
136
  .file-preview {
41
137
  @include simple-flex-box($rmPreviewWidth * 1px);
138
+ width: $rmPreviewWidth * 1px;
139
+ max-width: $rmPreviewWidth * 1px;
140
+ min-width: 0;
42
141
  }
43
142
 
44
143
  .file-selector {
45
144
  @include simple-flex-box(auto);
46
- max-width: calc(100% - #{($rmBrowserWidth + $rmPreviewWidth) *1px});
145
+ max-width: calc(100% - #{($rmBrowserWidth + $rmPreviewWidth) *1px} - 20px);
146
+ // margin - border - padding: side separators only (no top border)
147
+ margin: 0 10px;
148
+ border: 0;
149
+ border-left: 1px solid $rmBorder;
150
+ border-right: 1px solid $rmBorder;
151
+ padding: 0 10px;
152
+ box-sizing: border-box;
47
153
  }
48
154
 
49
- .file-browser, .file-selector, .file-preview {
155
+ .file-panels .file-browser,
156
+ .file-panels .file-selector,
157
+ .file-panels .file-preview {
50
158
  position: relative;
51
159
  vertical-align: top;
52
- height: 100% !important;
53
- color: $textColor;
160
+ height: 100%;
161
+ min-height: 0;
162
+ color: $rmText;
163
+ border-radius: 0;
54
164
 
55
165
  h1 {
56
166
  @include font-size(16);
57
167
  line-height: 1.6;
58
168
 
59
- color: $textColor;
60
- margin-top: 1px;
61
- padding: 5px;
169
+ display: flex;
170
+ align-items: center;
171
+ box-sizing: border-box;
172
+ min-height: $rmPanelChromeMinHeight;
173
+ color: $rmText;
174
+ margin: 0;
175
+ padding: $rmPanelChromePadY $rmPanelChromePadX;
176
+ border-radius: $rmHeaderRadius $rmHeaderRadius 0 0;
62
177
  }
63
178
  h2 {
64
179
  @include font-size(13);
65
180
  line-height: 1.3;
66
- background-color: $uiHeaderBg;
67
- color: $textColor;
68
- margin-top: 1px;
181
+ background-color: $rmChromeBg;
182
+ color: $rmText;
183
+ margin: 0;
69
184
  padding: 6px;
70
185
  position: relative;
71
186
  clear: both;
187
+ border-radius: $rmHeaderRadius $rmHeaderRadius 0 0;
72
188
 
73
189
  &.toggler{
74
190
  cursor: pointer;
@@ -82,14 +198,793 @@
82
198
  }
83
199
 
84
200
  .file-browser{
85
- background-color: $uiClickableDefaultBg;
86
- & > h1 {
87
- background-color: $uiHeaderBg;
201
+ background-color: $rmClickableBg;
202
+ display: flex;
203
+ flex-direction: column;
204
+ min-height: 0;
205
+
206
+ & > h1.resources-title {
207
+ background-color: $rmChromeBg;
208
+ flex: 0 0 auto;
209
+ border-radius: $rmHeaderRadius $rmHeaderRadius 0 0;
210
+ }
211
+
212
+ .asset-search {
213
+ // Grow with filters; do not shrink under tree flex pressure until max-height.
214
+ flex: 0 0 auto;
215
+ min-width: 0;
216
+ max-width: 100%;
217
+ // Cap at 70% of the whole modal height (not the left column alone).
218
+ // file-browser height ≈ modal − 120px chrome → 0.7×modal = 70% + 84px of this parent.
219
+ max-height: calc(70% + 84px);
220
+ display: flex;
221
+ flex-direction: column;
222
+ min-height: 0;
223
+ color: $rmText;
224
+ padding: 0;
225
+ margin: 0 0 16px;
226
+ border: 0;
227
+ background-color: $rmChromeBg;
228
+ overflow: hidden;
229
+ position: relative;
230
+ z-index: 2;
231
+ border-radius: $rmHeaderRadius;
232
+
233
+ &.hidden,
234
+ &[hidden] {
235
+ display: none;
236
+ }
237
+
238
+ &.is-collapsed {
239
+ max-height: none;
240
+ overflow: visible;
241
+ margin-bottom: 16px;
242
+
243
+ .asset-search-body {
244
+ display: none;
245
+ }
246
+
247
+ .asset-search-header {
248
+ border-radius: $rmHeaderRadius;
249
+ outline: none;
250
+ }
251
+
252
+ .asset-search-toggle:focus:not(:focus-visible) {
253
+ outline: none;
254
+ }
255
+
256
+ .asset-search-toggle:focus-visible {
257
+ outline: 1px dotted $rmDarkBar;
258
+ }
259
+ }
260
+ }
261
+
262
+ .asset-search-header {
263
+ flex: 0 0 auto;
264
+ min-width: 0;
265
+ max-width: 100%;
266
+ background-color: $rmChromeBg;
267
+ padding: 0;
268
+ border-radius: $rmHeaderRadius $rmHeaderRadius 0 0;
269
+ overflow: hidden;
270
+ }
271
+
272
+ .asset-search-toggle {
273
+ display: flex;
274
+ // Search is the lead; scope/count/chevron share its baseline (bottom of glyphs).
275
+ align-items: baseline;
276
+ flex-wrap: nowrap;
277
+ gap: 8px;
278
+ width: 100%;
279
+ margin: 0;
280
+ padding: $rmPanelChromePadY $rmPanelChromePadX;
281
+ border: 0;
282
+ border-radius: 0;
283
+ background: transparent;
284
+ color: $rmText;
285
+ cursor: pointer;
286
+ text-align: left;
287
+ text-shadow: none;
288
+ box-shadow: none;
289
+ min-width: 0;
290
+ min-height: $rmPanelChromeMinHeight;
291
+ box-sizing: border-box;
292
+ font: inherit;
293
+ font-weight: normal;
294
+ line-height: 1.6;
295
+
296
+ &:hover,
297
+ &:active {
298
+ background: transparent;
299
+ color: $rmText;
300
+ opacity: 1;
301
+ text-shadow: none;
302
+ box-shadow: none;
303
+ }
304
+
305
+ &:focus {
306
+ outline: 1px dotted $rmDarkBar;
307
+ }
308
+ }
309
+
310
+ .asset-search-title {
311
+ @include font-size(16);
312
+
313
+ display: inline-block;
314
+ margin: 0;
315
+ padding: 0;
316
+ background: transparent;
317
+ color: $rmText;
318
+ line-height: 1.6;
319
+ flex: 0 0 auto;
320
+ white-space: nowrap;
321
+ font-weight: normal;
322
+ }
323
+
324
+ .asset-search-chevron {
325
+ @include font-size(12);
326
+
327
+ flex: 0 0 auto;
328
+ align-self: baseline;
329
+ margin-left: auto;
330
+ line-height: 1;
331
+ }
332
+
333
+ .asset-search-applied-count {
334
+ @include font-size(12);
335
+
336
+ display: inline-block;
337
+ margin: 0;
338
+ color: lighten($rmText, 25%);
339
+ font-weight: normal;
340
+ // Do not grow — keep count + chevron on the same line as Search.
341
+ flex: 0 1 auto;
342
+ min-width: 0;
343
+ white-space: nowrap;
344
+ overflow: hidden;
345
+ text-overflow: ellipsis;
346
+ line-height: 1.6;
347
+
348
+ &.hidden,
349
+ &[hidden] {
350
+ display: none;
351
+ }
352
+ }
353
+
354
+ .asset-search-scope {
355
+ @include font-size(12);
356
+
357
+ display: inline-flex;
358
+ align-items: baseline;
359
+ gap: 0.25em;
360
+ margin: 0;
361
+ min-width: 0;
362
+ max-width: 100%;
363
+ // Content width when the line fits; shrink (ellipsis on name) when it does not.
364
+ flex: 0 1 auto;
365
+ overflow: hidden;
366
+ color: lighten($rmText, 25%);
367
+ line-height: 1.6;
368
+ font-weight: normal;
369
+
370
+ &.hidden,
371
+ &[hidden] {
372
+ display: none;
373
+ }
374
+ }
375
+
376
+ .asset-search-scope-prefix {
377
+ flex: 0 0 auto;
378
+ white-space: nowrap;
379
+ }
380
+
381
+ .asset-search-scope-name {
382
+ flex: 0 1 auto;
383
+ min-width: 0;
384
+ overflow: hidden;
385
+ text-overflow: ellipsis;
386
+ white-space: nowrap;
387
+ color: $rmText;
388
+ font-weight: bold;
389
+ }
390
+
391
+ .asset-search-scope-subfolders {
392
+ flex: 0 0 auto;
393
+ white-space: nowrap;
394
+
395
+ &.hidden,
396
+ &[hidden] {
397
+ display: none;
398
+ }
399
+ }
400
+
401
+ .asset-search-body {
402
+ // Fill capped .asset-search so filters can scroll after max-height is hit.
403
+ flex: 1 1 auto;
404
+ min-height: 0;
405
+ display: flex;
406
+ flex-direction: column;
407
+ padding: 14px 12px 16px;
408
+ overflow: hidden;
409
+ background-color: $rmChromeBg;
410
+ }
411
+
412
+ .asset-search-field {
413
+ position: relative;
414
+ display: flex;
415
+ align-items: center;
416
+ flex: 0 0 auto;
417
+ padding: 0;
418
+ }
419
+
420
+ .asset-search-field .icon-find {
421
+ position: absolute;
422
+ left: 10px;
423
+ color: lighten($rmText, 40%);
424
+ pointer-events: none;
425
+
426
+ @include font-size(14);
427
+ }
428
+
429
+ .asset-search-input {
430
+ width: 100%;
431
+ height: 32px;
432
+ padding: 6px 10px 6px 30px;
433
+ border: 1px solid $rmBorder;
434
+ border-radius: $rmControlRadius;
435
+ background-color: $rmSurface;
436
+ box-sizing: border-box;
437
+
438
+ &:focus {
439
+ border-color: $rmInfo;
440
+ outline: none;
441
+ }
442
+ }
443
+
444
+ .asset-search-label {
445
+ @include visuallyHidden;
446
+ }
447
+
448
+ .asset-search-filters {
449
+ // Grow with filter chips; scroll only after .asset-search hits its modal-relative max-height.
450
+ flex: 1 1 auto;
451
+ min-height: 48px;
452
+ margin-top: 8px;
453
+ overflow-x: hidden;
454
+ overflow-y: auto;
455
+ position: relative;
456
+ z-index: 3;
457
+ }
458
+
459
+ .asset-search .advanced-search-container {
460
+ padding: 0;
461
+ }
462
+
463
+ .asset-search .add-criteria-container {
464
+ display: flex;
465
+ flex-wrap: wrap;
466
+ align-items: center;
467
+ position: relative;
468
+ padding: 0;
469
+ margin: 8px 0 0;
470
+ min-height: 24px;
471
+
472
+ // Must beat this block's `display: flex` (higher specificity than
473
+ // `.advanced-search-container .add-criteria-container.disabled`).
474
+ // Otherwise the global `.disabled, button[disabled]` chrome paints a
475
+ // gray non-working Add filter instead of hiding it.
476
+ &.disabled {
477
+ display: none;
478
+ }
479
+ }
480
+
481
+ .asset-search .add-criteria-container a.toggle-modal-button {
482
+ display: inline-flex;
483
+ align-items: center;
484
+ gap: 4px;
485
+ margin: 0;
486
+ padding: 0;
487
+ color: $rmInfo;
488
+ text-decoration: none;
489
+ font-weight: normal;
490
+ line-height: 1;
491
+ vertical-align: middle;
492
+
493
+ @include font-size(13);
494
+
495
+ &:hover {
496
+ text-decoration: underline;
497
+ }
498
+ }
499
+
500
+ .asset-search .add-criteria-container .icon-plus,
501
+ .asset-search .add-criteria-container .icon-add {
502
+ display: inline-flex;
503
+ align-items: center;
504
+ justify-content: center;
505
+ line-height: 1;
506
+ flex: 0 0 auto;
507
+ margin: 0;
508
+
509
+ @include font-size(12);
510
+
511
+ &:before {
512
+ line-height: 1;
513
+ vertical-align: middle;
514
+ }
515
+ }
516
+
517
+ .asset-search .applied-filters-summary {
518
+ border: 0;
519
+ border-radius: 0;
520
+ background: transparent;
521
+ height: auto;
522
+ padding: 0;
523
+ margin: 0;
524
+ color: lighten($rmText, 40%);
525
+ cursor: pointer;
526
+ font-weight: normal;
527
+ line-height: 1;
528
+ text-shadow: none;
529
+ box-shadow: none;
530
+
531
+ @include font-size(12);
532
+
533
+ &:not(.hidden)::before {
534
+ content: '\00b7';
535
+ display: inline-block;
536
+ margin: 0 6px;
537
+ color: lighten($rmText, 55%);
538
+ }
539
+
540
+ &.hidden {
541
+ display: none;
542
+ }
543
+
544
+ &:hover,
545
+ &:active {
546
+ color: $rmText;
547
+ text-decoration: underline;
548
+ background: transparent;
549
+ text-shadow: none;
550
+ box-shadow: none;
551
+ }
552
+
553
+ &:focus {
554
+ outline: 1px dotted $rmDarkBar;
555
+ }
556
+ }
557
+
558
+ .asset-search .criteria-select2 {
559
+ visibility: hidden;
560
+ position: absolute;
561
+ left: 0;
562
+ top: 0;
563
+ width: calc(100% - 8px);
564
+ }
565
+
566
+ .asset-search .advanced-criteria-container {
567
+ padding-right: 0;
568
+ max-height: none;
569
+ display: flex;
570
+ flex-direction: column;
571
+ gap: 8px;
572
+ }
573
+
574
+ .asset-search .filter-container {
575
+ margin-bottom: 0;
576
+ position: relative;
577
+ }
578
+
579
+ .asset-search .filter-spoiler-wrapper {
580
+ padding: 0;
581
+ border: 0;
582
+ background: transparent;
583
+ }
584
+
585
+ .asset-search .filter-spoiler {
586
+ border: 1px solid $rmBorder;
587
+ border-radius: $rmControlRadius;
588
+ background: $rmSurface;
589
+ overflow: hidden;
590
+ }
591
+
592
+ .asset-search .filter-spoiler.is-open .filter-spoiler-body {
593
+ display: block;
594
+ }
595
+
596
+ .asset-search .filter-spoiler.is-open .filter-spoiler-header {
597
+ border-bottom: 1px solid $rmBorder;
598
+ }
599
+
600
+ .asset-search .filter-spoiler:not(.is-open) .filter-spoiler-body {
601
+ display: none;
602
+ }
603
+
604
+ .asset-search .filter-spoiler:not(.is-open) .filter-spoiler-header {
605
+ border-bottom: 0;
606
+ }
607
+
608
+ .asset-search .filter-spoiler-header {
609
+ display: flex;
610
+ align-items: center;
611
+ gap: 8px;
612
+ padding: 10px;
613
+ background-color: $rmSurface;
614
+ outline: none;
615
+ box-shadow: none;
616
+
617
+ &:hover,
618
+ &:focus,
619
+ &:focus-within {
620
+ background-color: $rmSurface;
621
+ outline: none;
622
+ box-shadow: none;
623
+ }
624
+ }
625
+
626
+ .asset-search .filter-spoiler-toggle {
627
+ display: flex;
628
+ align-items: center;
629
+ justify-content: flex-start;
630
+ flex: 1 1 auto;
631
+ min-width: 0;
632
+ height: auto;
633
+ padding: 0;
634
+ border: 0;
635
+ border-radius: 0;
636
+ background: transparent;
637
+ color: $rmText;
638
+ font-weight: bold;
639
+ line-height: 1.3;
640
+ text-align: left;
641
+ text-shadow: none;
642
+ box-shadow: none;
643
+ cursor: pointer;
644
+
645
+ &:focus {
646
+ outline: none;
647
+ }
648
+
649
+ &:focus-visible {
650
+ outline: 1px dotted $rmDarkBar;
651
+ }
652
+
653
+ &:hover,
654
+ &:active {
655
+ background: transparent;
656
+ text-shadow: none;
657
+ box-shadow: none;
658
+ }
659
+ }
660
+
661
+ .asset-search .filter-spoiler-title {
662
+ @include font-size(13);
663
+
664
+ overflow: hidden;
665
+ text-overflow: ellipsis;
666
+ white-space: nowrap;
667
+ text-shadow: none;
668
+ }
669
+
670
+ .asset-search .filter-spoiler-icon {
671
+ display: none;
672
+ }
673
+
674
+ .asset-search .filter-spoiler-delete {
675
+ flex: 0 0 16px;
676
+ width: 16px;
677
+ height: 16px;
678
+ padding: 0;
679
+ border: 0;
680
+ border-radius: 0;
681
+ background: transparent;
682
+ color: lighten($rmText, 40%);
683
+ cursor: pointer;
684
+ line-height: 1;
685
+ text-shadow: none;
686
+ box-shadow: none;
687
+ visibility: hidden;
688
+
689
+ @include font-size(14);
690
+
691
+ &:hover,
692
+ &:active {
693
+ color: $rmText;
694
+ background: transparent;
695
+ text-shadow: none;
696
+ box-shadow: none;
697
+ }
698
+
699
+ &:focus {
700
+ outline: none;
701
+ }
702
+
703
+ &:focus-visible {
704
+ outline: 1px dotted $rmDarkBar;
705
+ visibility: visible;
706
+ }
707
+ }
708
+
709
+ .asset-search .filter-spoiler.is-open .filter-spoiler-delete,
710
+ .asset-search .filter-spoiler-header:hover .filter-spoiler-delete {
711
+ visibility: visible;
712
+ }
713
+
714
+ .asset-search .filter-spoiler-body {
715
+ padding: 10px;
716
+ box-sizing: border-box;
717
+
718
+ > label,
719
+ > .criterion-container,
720
+ > fieldset {
721
+ display: block;
722
+ width: 100%;
723
+ min-width: 0;
724
+ box-sizing: border-box;
725
+ margin: 0;
726
+ }
727
+ }
728
+
729
+ .asset-search .filter-spoiler-body > label > .filter-label-text,
730
+ .asset-search .filter-spoiler-body > .criterion-container > .filter-label-text,
731
+ .asset-search .filter-spoiler-body > fieldset > legend {
732
+ @include visuallyHidden;
733
+ }
734
+
735
+ .asset-search .filter-spoiler-body .criteria-alias,
736
+ .asset-search .filter-spoiler-body .class-path {
737
+ display: none;
738
+ }
739
+
740
+ // RM metadata search is AND-only; logic radios are backoffice-only noise here.
741
+ // advancedSearch.css loads after resourcemgr.css and sets display:flex on this block.
742
+ .asset-search .logic-radio-group {
743
+ display: none !important;
744
+ }
745
+
746
+ // select2 sets inline width on init — only !important overrides it
747
+ .asset-search .filter-spoiler-body .select2-container {
748
+ width: 100% !important;
749
+ }
750
+
751
+ .asset-search .filter-spoiler-body .select2-choices {
752
+ min-height: 30px;
753
+ border-radius: $rmControlRadius;
754
+ }
755
+
756
+ // Replace select2 PNG sprite close (hover background-position flicker / stray pixels).
757
+ .asset-search .filter-spoiler-body .select2-container-multi .select2-choices .select2-search-choice {
758
+ overflow: hidden;
759
+ padding: 4px 24px 4px 8px;
760
+ line-height: 1.3;
761
+
762
+ &.select2-search-choice-focus {
763
+ background-color: blacken($uiClickableDefaultBg, 0.1);
764
+ }
765
+
766
+ .select2-search-choice-close {
767
+ background-image: none !important;
768
+ left: auto;
769
+ right: 4px;
770
+ top: 50%;
771
+ width: 14px;
772
+ height: 14px;
773
+ margin-top: -7px;
774
+ font-size: 0;
775
+ line-height: 1;
776
+ color: lighten($rmText, 40%);
777
+ text-indent: 0;
778
+
779
+ &:hover,
780
+ &:focus,
781
+ &:active {
782
+ background-image: none !important;
783
+ background-position: 0 0;
784
+ color: $rmText;
785
+ }
786
+
787
+ &:before {
788
+ @include tao-icon-setup;
789
+ @include icon-close;
790
+ @include font-size(12);
791
+
792
+ display: block;
793
+ line-height: 14px;
794
+ text-align: center;
795
+ }
796
+ }
797
+ }
798
+
799
+ .asset-search .filter-spoiler-body input[type='text'],
800
+ .asset-search .filter-spoiler-body textarea {
801
+ display: block;
802
+ width: 100%;
803
+ max-width: 100%;
804
+ box-sizing: border-box;
805
+ border-radius: $rmControlRadius;
806
+ }
807
+
808
+ .asset-search-actions {
809
+ display: flex;
810
+ justify-content: flex-start;
811
+ align-items: center;
812
+ flex: 0 0 auto;
813
+ flex-wrap: nowrap;
814
+ gap: 8px;
815
+ margin-top: 16px;
816
+ }
817
+
818
+ .asset-search-actions .asset-search-clear {
819
+ margin: 0;
820
+ padding: 0;
821
+ border: 0;
822
+ border-radius: 0;
823
+ background: transparent;
824
+ color: $rmInfo;
825
+ cursor: pointer;
826
+ font-weight: normal;
827
+ line-height: 1.4;
828
+ text-decoration: none;
829
+ text-shadow: none;
830
+ box-shadow: none;
831
+ flex: 0 0 auto;
832
+
833
+ @include font-size(13);
834
+
835
+ &.hidden,
836
+ &[hidden] {
837
+ display: none;
838
+ }
839
+
840
+ &:hover,
841
+ &:focus,
842
+ &:active {
843
+ color: $rmInfo;
844
+ background: transparent;
845
+ text-decoration: underline;
846
+ text-shadow: none;
847
+ box-shadow: none;
848
+ }
849
+
850
+ &:focus {
851
+ outline: 1px dotted $rmDarkBar;
852
+ }
853
+ }
854
+
855
+ .asset-search-actions .asset-search-submit {
856
+ margin: 0 0 0 auto;
857
+ min-width: 88px;
858
+ flex: 0 0 auto;
859
+ display: inline-flex;
860
+ align-items: center;
861
+ justify-content: center;
862
+ gap: 6px;
863
+
864
+ .asset-search-submit-spinner {
865
+ display: none;
866
+ line-height: 1;
867
+
868
+ @include font-size(14);
869
+
870
+ &.hidden,
871
+ &[hidden] {
872
+ display: none;
873
+ }
874
+ }
875
+
876
+ &.is-searching .asset-search-submit-spinner:not(.hidden) {
877
+ display: inline-block;
878
+
879
+ &.icon-loop::before {
880
+ display: inline-block;
881
+ transform-origin: 50% 50%;
882
+ animation: rm-search-button-spin 1.4s linear infinite;
883
+ }
884
+ }
885
+
886
+ &:disabled,
887
+ &[disabled] {
888
+ color: $rmLight;
889
+ background-color: lighten($rmText, 55%);
890
+ border-color: lighten($rmText, 55%);
891
+ cursor: not-allowed;
892
+ opacity: 1;
893
+ text-shadow: none;
894
+ box-shadow: none;
895
+
896
+ &:hover,
897
+ &:focus,
898
+ &:active {
899
+ color: $rmLight;
900
+ background-color: lighten($rmText, 55%);
901
+ border-color: lighten($rmText, 55%);
902
+ opacity: 1;
903
+ }
904
+ }
905
+
906
+ &.is-searching,
907
+ &.is-searching:disabled,
908
+ &.is-searching[disabled] {
909
+ color: $rmLight;
910
+ background-color: $rmActive;
911
+ border-color: $rmActive;
912
+ cursor: wait;
913
+ opacity: 1;
914
+
915
+ &:hover,
916
+ &:focus,
917
+ &:active {
918
+ color: $rmLight;
919
+ background-color: $rmActive;
920
+ border-color: $rmActive;
921
+ opacity: 1;
922
+ }
923
+ }
924
+ }
925
+
926
+ @keyframes rm-search-button-spin {
927
+ from {
928
+ transform: rotate(0deg);
929
+ }
930
+
931
+ to {
932
+ transform: rotate(360deg);
933
+ }
88
934
  }
89
935
 
90
936
  & .file-browser-wrapper {
91
- overflow: auto;
92
- height: calc(100% - 50px);
937
+ position: relative;
938
+ display: flex;
939
+ flex-direction: column;
940
+ flex: 1 1 auto;
941
+ min-height: 0;
942
+ overflow: hidden;
943
+
944
+ &.is-tree-loading {
945
+ pointer-events: none;
946
+
947
+ .file-browser-scroll {
948
+ overflow: hidden;
949
+ }
950
+ }
951
+
952
+ .file-browser-scroll {
953
+ flex: 1 1 auto;
954
+ min-height: 0;
955
+ overflow: auto;
956
+ padding: 8px 4px 12px;
957
+ }
958
+
959
+ .file-browser-tree-loading {
960
+ position: absolute;
961
+ inset: 0;
962
+ z-index: 3;
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: center;
966
+ background-color: rgba($rmClickableBg, 0.75);
967
+
968
+ &.hidden {
969
+ display: none;
970
+ }
971
+
972
+ .icon-loop {
973
+ color: $rmActive;
974
+
975
+ @include font-size(22);
976
+
977
+ &::before {
978
+ display: inline-block;
979
+ transform-origin: 50% 50%;
980
+ animation: rm-search-button-spin 1.4s linear infinite;
981
+ }
982
+ }
983
+
984
+ .file-browser-tree-loading-status {
985
+ @include visuallyHidden;
986
+ }
987
+ }
93
988
  }
94
989
 
95
990
  ul {
@@ -100,37 +995,107 @@
100
995
  }
101
996
  li {
102
997
  a {
103
- color: $textColor;
998
+ color: $rmText;
104
999
  white-space: nowrap;
105
- &:before {
106
- @include tao-icon-setup;
107
- @include icon-folder;
108
- margin: 0 3px;
1000
+ display: flex;
1001
+ align-items: center;
1002
+ gap: 4px;
1003
+ box-sizing: border-box;
1004
+ width: 100%;
1005
+ padding: 3px 4px;
1006
+ line-height: 1.5;
1007
+ text-decoration: none;
1008
+ border: 0;
1009
+ outline: none;
1010
+ box-shadow: none;
1011
+
1012
+ &:hover,
1013
+ &:focus,
1014
+ &:focus-visible,
1015
+ &:active {
1016
+ text-decoration: none;
1017
+ color: $rmText;
1018
+ outline: none;
1019
+ box-shadow: none;
1020
+ }
1021
+
1022
+ > .tree-toggle,
1023
+ > .tree-folder {
1024
+ flex: 0 0 auto;
1025
+ line-height: 1;
1026
+
1027
+ @include font-size(12);
1028
+ }
1029
+
1030
+ > .tree-toggle {
1031
+ width: 1em;
1032
+ color: lighten($rmText, 25%);
1033
+
1034
+ &.is-leaf:before,
1035
+ &:not(.icon-right):not(.icon-down):before {
1036
+ content: none;
1037
+ }
1038
+ }
1039
+
1040
+ > .tree-folder {
1041
+ @include font-size(14);
1042
+ }
1043
+
1044
+ &.opened > .tree-toggle:before {
1045
+ @include icon-down;
1046
+ }
1047
+
1048
+ &.opened > .tree-folder:before {
1049
+ @include icon-folder-open;
109
1050
  }
110
1051
  }
111
1052
 
112
- a.opened:before {
113
- font-style: italic;
114
- @include tao-icon-setup;
1053
+ &.active > a > .tree-folder:before {
115
1054
  @include icon-folder-open;
116
1055
  }
117
1056
 
118
1057
  &.active > a {
119
- background-color: $activeColor;
120
-
1058
+ background-color: $rmActiveRow;
1059
+ border: 0;
1060
+ outline: none;
1061
+ box-shadow: none;
121
1062
  }
122
1063
  }
123
1064
  }
124
1065
  }
125
1066
 
126
1067
  .file-preview{
127
- background-color: $uiClickableDefaultBg;
1068
+ background-color: $rmClickableBg;
128
1069
  & > h1 {
129
- background-color: $uiHeaderBg;
1070
+ background-color: $rmChromeBg;
1071
+ border-radius: $rmHeaderRadius $rmHeaderRadius 0 0;
130
1072
  }
131
1073
 
132
1074
  .file-properties{
133
- padding: 0 5px;
1075
+ padding: 12px 14px;
1076
+
1077
+ .grid-row {
1078
+ margin-bottom: 10px;
1079
+ }
1080
+
1081
+ .prop-url .actions {
1082
+ text-align: left;
1083
+ margin: 8px 0 0;
1084
+
1085
+ a.download {
1086
+ text-decoration: none;
1087
+ color: $rmInfo;
1088
+
1089
+ .icon-download {
1090
+ margin-right: 4px;
1091
+ }
1092
+
1093
+ &:hover {
1094
+ text-decoration: underline;
1095
+ color: $rmInfo;
1096
+ }
1097
+ }
1098
+ }
134
1099
  }
135
1100
 
136
1101
  .previewer {
@@ -138,117 +1103,513 @@
138
1103
  overflow: hidden;
139
1104
  }
140
1105
 
141
- .actions {
1106
+ .actions.select-actions {
142
1107
  text-align: center;
143
- margin-bottom: 10px;
1108
+ margin: 12px 0 16px;
144
1109
  }
145
1110
  }
146
1111
 
147
1112
  .file-selector{
148
1113
  position: relative;
149
- border: solid 1px #fff;
150
- border-top: none;
151
- border-bottom: none;
152
1114
  display: flex;
153
1115
  flex-direction: column;
154
1116
 
155
- background-color: $uiGeneralContentBg;
1117
+ background-color: $rmSurface;
156
1118
  & > h1 {
157
1119
  position: relative;
158
- background-color: $uiClickableDefaultBg;
1120
+ background-color: $rmChromeBg;
1121
+ border-radius: $rmHeaderRadius $rmHeaderRadius 0 0;
1122
+ // Flex (shared h1) replaces .lft/.rgt floats so "Assets" shares baseline with Search/Preview.
1123
+ justify-content: space-between;
1124
+ gap: 10px;
159
1125
 
160
1126
  .title {
161
- margin-right: 10px;
1127
+ float: none;
1128
+ margin-right: 0;
162
1129
  }
163
1130
 
164
1131
  .upload-switcher {
1132
+ float: none;
1133
+ flex: 0 0 auto;
1134
+
165
1135
  a {
166
1136
  display: inline-block;
167
1137
  }
168
1138
  .listing {
169
1139
  display:none;
170
1140
  }
1141
+
1142
+ a.btn-info {
1143
+ color: $rmText;
1144
+ background-color: $rmSurface;
1145
+ border: 1px solid $rmBorder;
1146
+
1147
+ &:hover,
1148
+ &:focus,
1149
+ &:active {
1150
+ color: $rmText;
1151
+ background-color: $rmSurface;
1152
+ border-color: $rmBorder;
1153
+ opacity: 1;
1154
+ }
1155
+ }
171
1156
  }
172
1157
  }
173
1158
 
174
1159
  .empty {
175
- color: #666;
1160
+ display: none;
1161
+ color: lighten($rmText, 25%);
176
1162
  font-style: italic;
177
1163
  @include font-size(18);
1164
+
1165
+ text-align: center;
1166
+ padding: 24px 10px;
1167
+ }
1168
+
1169
+ .asset-search-error {
1170
+ padding: 10px 5px;
178
1171
  text-align: center;
1172
+ @include font-size(14);
1173
+
1174
+ &.hidden,
1175
+ &[hidden] {
1176
+ display: none;
1177
+ }
1178
+ }
1179
+
1180
+ .asset-search-error {
1181
+ color: $error;
1182
+ }
1183
+
1184
+ &.search-mode {
1185
+ .upload-switcher {
1186
+ display: none;
1187
+ }
1188
+ }
1189
+
1190
+ &.upload-mode {
1191
+ .pagination-bottom {
1192
+ display: none;
1193
+ }
179
1194
  }
180
1195
 
181
- ul.files {
1196
+ .files-wrapper {
182
1197
  position: relative;
183
- margin-bottom: 0;
184
- padding: 0;
185
- list-style-type: none;
1198
+ display: flex;
1199
+ flex-direction: column;
186
1200
  flex-grow: 1;
187
- overflow-y: auto;
188
- li {
189
- height: 35px;
190
- line-height: 35px;
191
- margin-bottom: 0;
192
- padding: 0 0 0 5px;
193
- position: relative;
1201
+ min-height: 0;
1202
+ overflow: hidden;
194
1203
 
195
- &:before {
196
- @include tao-icon-setup;
197
- @include icon-document;
198
- @include font-size(16);
199
- vertical-align: top;
200
- line-height: 2.2;
201
- position: absolute;
202
- left: 8px;
1204
+ &.is-files-loading {
1205
+ pointer-events: none;
1206
+
1207
+ .files-scroll {
1208
+ overflow-y: hidden;
203
1209
  }
204
- &[data-type='image']:before{
205
- @include icon-image;
1210
+ }
1211
+
1212
+ .files-scroll {
1213
+ flex: 1 1 auto;
1214
+ min-height: 0;
1215
+ overflow-y: auto;
1216
+ }
1217
+
1218
+ .files-list-loading {
1219
+ position: absolute;
1220
+ inset: 0;
1221
+ z-index: 2;
1222
+ display: flex;
1223
+ align-items: center;
1224
+ justify-content: center;
1225
+ background-color: rgba($rmSurface, 0.82);
1226
+
1227
+ &.hidden {
1228
+ display: none;
206
1229
  }
207
- &[data-type='audio']:before{
208
- @include icon-media;
1230
+
1231
+ .icon-loop {
1232
+ color: $rmActive;
1233
+
1234
+ @include font-size(22);
1235
+
1236
+ &::before {
1237
+ display: inline-block;
1238
+ transform-origin: 50% 50%;
1239
+ animation: rm-search-button-spin 1.4s linear infinite;
1240
+ }
209
1241
  }
210
- &[data-type='video']:before{
211
- @include icon-video;
1242
+
1243
+ .files-list-loading-status {
1244
+ @include visuallyHidden;
212
1245
  }
1246
+ }
1247
+ }
1248
+
1249
+ table.files {
1250
+ width: 100%;
1251
+ border-collapse: collapse;
1252
+ margin: 0;
1253
+ table-layout: fixed;
213
1254
 
214
- &.active, &:hover {
215
- background-color: $activeColor;
1255
+ thead th {
1256
+ text-align: left;
1257
+ font-weight: bold;
1258
+ padding: 12px 12px 10px;
1259
+ border-bottom: 1px solid mix($rmLight, $rmMidGray, 40%);
1260
+ background-color: transparent;
1261
+ color: $rmText;
1262
+ white-space: nowrap;
1263
+ user-select: none;
1264
+
1265
+ &.sortable {
216
1266
  cursor: pointer;
1267
+
1268
+ .sort-label {
1269
+ display: inline-flex;
1270
+ align-items: center;
1271
+ gap: 6px;
1272
+
1273
+ // Sort glyph sits beside the label text (not at the column edge).
1274
+ &:after {
1275
+ content: '';
1276
+ flex: 0 0 auto;
1277
+ width: 11px;
1278
+ height: 12px;
1279
+ opacity: 0.55;
1280
+ background-color: $rmText;
1281
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 14'%3E%3Cpath fill='black' d='M0 1h12v1.5H0zm0 3.5h9v1.5H0zm0 3.5h6v1.5H0z'/%3E%3Cpath fill='black' d='M9.5 8.5L12 12H7z'/%3E%3C/svg%3E")
1282
+ center / contain no-repeat;
1283
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 14'%3E%3Cpath fill='black' d='M0 1h12v1.5H0zm0 3.5h9v1.5H0zm0 3.5h6v1.5H0z'/%3E%3Cpath fill='black' d='M9.5 8.5L12 12H7z'/%3E%3C/svg%3E")
1284
+ center / contain no-repeat;
1285
+ }
1286
+ }
1287
+
1288
+ &:hover,
1289
+ &:focus {
1290
+ .sort-label:after {
1291
+ background-color: $rmText;
1292
+ opacity: 1;
1293
+ }
1294
+ }
1295
+ }
1296
+
1297
+ &.sorted.sorted_asc .sort-label:after {
1298
+ opacity: 1;
1299
+ transform: scaleY(-1);
1300
+ }
1301
+
1302
+ &.sorted.sorted_desc .sort-label:after {
1303
+ opacity: 1;
1304
+ transform: none;
1305
+ }
1306
+ }
1307
+
1308
+ tbody tr {
1309
+ cursor: pointer;
1310
+
1311
+ &.active,
1312
+ &:hover {
1313
+ background-color: $rmActiveRow;
1314
+ }
1315
+
1316
+ td {
1317
+ padding: 10px 12px;
1318
+ border-bottom: 0;
1319
+ vertical-align: middle;
1320
+ overflow: hidden;
1321
+ text-overflow: ellipsis;
1322
+ white-space: nowrap;
1323
+ max-width: 0;
1324
+
1325
+ .truncate,
1326
+ .desc,
1327
+ .meta {
1328
+ display: block;
1329
+ overflow: hidden;
1330
+ text-overflow: ellipsis;
1331
+ white-space: nowrap;
1332
+ max-width: 100%;
1333
+ }
1334
+ }
1335
+ }
1336
+
1337
+ .files-label {
1338
+ width: 44%;
1339
+
1340
+ // Flex lives on an inner wrapper — display:flex on td + max-width:0 collapses the column.
1341
+ .files-label-inner {
1342
+ display: flex;
1343
+ align-items: center;
1344
+ gap: 6px;
1345
+ min-width: 0;
1346
+ max-width: 100%;
1347
+ }
1348
+
1349
+ .file-icon {
1350
+ display: inline-flex;
1351
+ align-items: center;
1352
+ justify-content: center;
1353
+ width: 18px;
1354
+ flex-shrink: 0;
1355
+ line-height: 1;
1356
+
1357
+ &:before {
1358
+ @include tao-icon-setup;
1359
+ @include icon-document;
1360
+ @include font-size(16);
1361
+ }
217
1362
  }
218
1363
 
219
1364
  .desc {
220
- display: inline-block;
221
- max-width: calc(100% - 130px);// 130 = icon left + toolbar right + some air
222
- margin-left: 25px;
1365
+ display: block;
1366
+ flex: 1 1 auto;
1367
+ min-width: 0;
1368
+ overflow: hidden;
1369
+ text-overflow: ellipsis;
1370
+ white-space: nowrap;
223
1371
  }
1372
+ }
224
1373
 
225
- .actions {
226
- top: 0;
227
- right: 0;
228
- position: absolute;
229
- height: 35px;
230
- width: 100px;
231
- .tlb {
232
- display: inline-block;
233
- background: none;
234
- @include font-size(14);
235
- .tlb-top {
236
- background: none !important;
237
- border-width: 0 !important;
238
- @include box-shadow(0, 0, 0);
239
- }
1374
+ tr[data-type='image'] .file-icon:before {
1375
+ @include icon-image;
1376
+ }
1377
+ tr[data-type='audio'] .file-icon:before {
1378
+ @include icon-media;
1379
+ }
1380
+ tr[data-type='video'] .file-icon:before {
1381
+ @include icon-video;
1382
+ }
1383
+
1384
+ .files-location {
1385
+ width: 30%;
1386
+ }
1387
+
1388
+ .files-updated {
1389
+ // Date + delete slot; keep enough for "Last modified on" header, less empty gap.
1390
+ width: 26%;
1391
+ }
1392
+
1393
+ .files-updated-inner {
1394
+ display: flex;
1395
+ align-items: center;
1396
+ gap: 8px;
1397
+ min-width: 0;
1398
+ max-width: 100%;
1399
+
1400
+ .meta.updated {
1401
+ flex: 1 1 auto;
1402
+ min-width: 0;
1403
+ }
1404
+ }
1405
+
1406
+ .meta {
1407
+ @include font-size(12);
1408
+
1409
+ color: lighten($rmText, 25%);
1410
+ }
1411
+
1412
+ .row-actions {
1413
+ display: inline-flex;
1414
+ align-items: center;
1415
+ justify-content: center;
1416
+ flex: 0 0 18px;
1417
+ width: 18px;
1418
+ opacity: 0;
1419
+ pointer-events: none;
1420
+
1421
+ // Plain bin icon (same idea as filter-spoiler-delete) — no tlb chrome/border.
1422
+ a.delete {
1423
+ display: inline-flex;
1424
+ align-items: center;
1425
+ justify-content: center;
1426
+ padding: 0;
1427
+ border: 0;
1428
+ border-radius: 0;
1429
+ background: transparent;
1430
+ color: lighten($rmText, 40%);
1431
+ text-decoration: none;
1432
+ text-shadow: none;
1433
+ box-shadow: none;
1434
+ line-height: 1;
1435
+ cursor: pointer;
1436
+
1437
+ @include font-size(14);
1438
+
1439
+ &:hover,
1440
+ &:active {
1441
+ color: $rmText;
1442
+ background: transparent;
1443
+ text-shadow: none;
1444
+ box-shadow: none;
1445
+ }
1446
+
1447
+ &:focus {
1448
+ outline: 1px dotted $rmDarkBar;
1449
+ color: $rmText;
240
1450
  }
241
1451
  }
242
1452
  }
1453
+
1454
+ tbody tr:hover .row-actions,
1455
+ tbody tr:focus-within .row-actions {
1456
+ opacity: 1;
1457
+ pointer-events: auto;
1458
+ }
1459
+ }
1460
+ // Uploader wraps .file-upload-container in form.uploaderContainer (sibling of Assets h1).
1461
+ > .uploaderContainer {
1462
+ margin-top: 12px;
243
1463
  }
1464
+
244
1465
  .file-upload-container {
245
1466
  display: none;
246
1467
  padding: 0 5px;
247
1468
  }
248
- .pagination-bottom {
249
- align-self: flex-end;
1469
+ .pagination-bottom {
1470
+ align-self: stretch;
250
1471
  width: 100%;
251
- padding: 5px 10px 0;
1472
+ padding: 10px 2px 8px;
1473
+ box-sizing: border-box;
1474
+
1475
+ .pagination {
1476
+ display: flex;
1477
+ align-items: center;
1478
+ justify-content: space-between;
1479
+ gap: 16px;
1480
+ width: 100%;
1481
+ margin: 0;
1482
+ padding: 0;
1483
+ float: none;
1484
+ clear: none;
1485
+
1486
+ &::before,
1487
+ &::after {
1488
+ display: none;
1489
+ }
1490
+
1491
+ > .col-6 {
1492
+ float: none;
1493
+ width: auto;
1494
+ margin: 0;
1495
+ padding: 0;
1496
+ box-sizing: border-box;
1497
+ }
1498
+
1499
+ > .col-6:first-child {
1500
+ @include font-size(13);
1501
+
1502
+ flex: 0 1 auto;
1503
+ color: $rmText;
1504
+ font-weight: bold;
1505
+ line-height: 1.4;
1506
+ white-space: nowrap;
1507
+
1508
+ strong,
1509
+ .page,
1510
+ .total {
1511
+ font-weight: bold;
1512
+ }
1513
+ }
1514
+
1515
+ > .col-6.txt-rgt {
1516
+ display: flex;
1517
+ align-items: center;
1518
+ justify-content: flex-end;
1519
+ flex: 0 0 auto;
1520
+ gap: 16px;
1521
+ text-align: right;
1522
+ }
1523
+ }
1524
+
1525
+ // Text-link chrome for Previous/Next (scoped under .file-selector .pagination-bottom)
1526
+ .pagination .txt-rgt > button.btn-info,
1527
+ .pagination .pages > li > a,
1528
+ .pagination .pages > li > button {
1529
+ margin: 0;
1530
+ min-height: 0;
1531
+ padding: 0;
1532
+ border: 0;
1533
+ border-color: transparent;
1534
+ background: transparent;
1535
+ background-color: transparent;
1536
+ background-image: none;
1537
+ color: $rmInfo;
1538
+ font-weight: normal;
1539
+ line-height: 1.4;
1540
+ text-shadow: none;
1541
+ box-shadow: none;
1542
+ opacity: 1;
1543
+
1544
+ @include font-size(13);
1545
+
1546
+ .icon-backward,
1547
+ .icon-forward {
1548
+ display: none;
1549
+ }
1550
+
1551
+ &:hover,
1552
+ &:focus,
1553
+ &:active {
1554
+ color: $rmInfo;
1555
+ text-decoration: underline;
1556
+ background: transparent;
1557
+ background-color: transparent;
1558
+ background-image: none;
1559
+ border-color: transparent;
1560
+ opacity: 1;
1561
+ }
1562
+ }
1563
+
1564
+ // Simple provider: "< Previous" / "Next >" text links
1565
+ .pagination .txt-rgt > button:first-child::before {
1566
+ content: '< ';
1567
+ }
1568
+
1569
+ .pagination .txt-rgt > button:last-child::after {
1570
+ content: ' >';
1571
+ }
1572
+
1573
+ .pagination .txt-rgt > button.btn-info[disabled],
1574
+ .pagination .pages > .disabled > a,
1575
+ .pagination .pages > .disabled > span,
1576
+ .pagination .pages > .disabled > button {
1577
+ color: lighten($rmText, 45%);
1578
+ cursor: not-allowed;
1579
+ text-decoration: none;
1580
+ pointer-events: none;
1581
+
1582
+ &:hover,
1583
+ &:focus,
1584
+ &:active {
1585
+ color: lighten($rmText, 45%);
1586
+ text-decoration: none;
1587
+ background: transparent;
1588
+ background-color: transparent;
1589
+ }
1590
+
1591
+ // _buttons.scss `.disabled, button[disabled]` uses !important — override only there
1592
+ &,
1593
+ &:hover,
1594
+ &:focus,
1595
+ &:active {
1596
+ background-color: transparent !important;
1597
+ border: none !important;
1598
+ color: lighten($rmText, 45%) !important;
1599
+ cursor: not-allowed !important;
1600
+ opacity: 1 !important;
1601
+ text-shadow: none !important;
1602
+ }
1603
+ }
252
1604
  }
253
1605
  }
254
1606
  }
1607
+
1608
+ // select2 dropdown/mask are appended to body; item creator modal uses z-index 105002
1609
+ .criteria-dropdown-select2 {
1610
+ z-index: 105100 !important;
1611
+ }
1612
+
1613
+ #select2-drop-mask {
1614
+ z-index: 105090 !important;
1615
+ }