@eeacms/volto-bise-policy 1.3.11 → 1.3.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/package.json +2 -1
  3. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyCard.jsx +404 -0
  4. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyCard.test.jsx +366 -0
  5. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyExplorerView.jsx +192 -91
  6. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyExplorerView.test.jsx +205 -58
  7. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyMap.jsx +329 -178
  8. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyMap.test.jsx +243 -123
  9. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyMapLazy.jsx +61 -0
  10. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyMapLazy.test.jsx +89 -0
  11. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyResults.jsx +128 -0
  12. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyResults.test.jsx +160 -0
  13. package/src/components/manage/Blocks/CaseStudyExplorer/FacetPopover.jsx +180 -0
  14. package/src/components/manage/Blocks/CaseStudyExplorer/FacetPopover.test.jsx +125 -0
  15. package/src/components/manage/Blocks/CaseStudyExplorer/FilterPanel.jsx +171 -0
  16. package/src/components/manage/Blocks/CaseStudyExplorer/FilterPanel.test.jsx +181 -0
  17. package/src/components/manage/Blocks/CaseStudyExplorer/Pagination.jsx +81 -0
  18. package/src/components/manage/Blocks/CaseStudyExplorer/filters.js +350 -0
  19. package/src/components/manage/Blocks/CaseStudyExplorer/filters.test.js +399 -0
  20. package/src/components/manage/Blocks/CaseStudyExplorer/hooks.js +28 -4
  21. package/src/components/manage/Blocks/CaseStudyExplorer/hooks.test.js +73 -0
  22. package/src/components/manage/Blocks/CaseStudyExplorer/messages.js +138 -0
  23. package/src/components/manage/Blocks/CaseStudyExplorer/styles.less +1157 -317
  24. package/src/components/manage/Blocks/CaseStudyExplorer/testUtils.js +44 -46
  25. package/src/components/manage/Blocks/CaseStudyExplorer/utils.js +68 -184
  26. package/src/components/manage/Blocks/CaseStudyExplorer/utils.test.js +91 -158
  27. package/src/index.js +39 -0
  28. package/src/openlayers.js +51 -0
  29. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyFilters.jsx +0 -383
  30. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyFilters.test.jsx +0 -90
  31. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyListing.jsx +0 -342
  32. package/src/components/manage/Blocks/CaseStudyExplorer/CaseStudyListing.test.jsx +0 -196
  33. package/src/components/manage/Blocks/CaseStudyExplorer/FeatureDisplay.jsx +0 -24
  34. package/src/components/manage/Blocks/CaseStudyExplorer/FeatureDisplay.test.jsx +0 -49
  35. package/src/components/manage/Blocks/CaseStudyExplorer/FeatureInteraction.jsx +0 -100
  36. package/src/components/manage/Blocks/CaseStudyExplorer/FeatureInteraction.test.jsx +0 -189
  37. package/src/components/manage/Blocks/CaseStudyExplorer/InfoOverlay.jsx +0 -111
  38. package/src/components/manage/Blocks/CaseStudyExplorer/InfoOverlay.test.jsx +0 -159
  39. package/src/components/manage/Blocks/CaseStudyExplorer/styles.less_old +0 -201
@@ -1,413 +1,1253 @@
1
- .nrr-case-study-map-container .listing .u-item:first-child .slot-top {
2
- padding-top: 2em;
1
+ /* Case Study Explorer
2
+ * EEA design system: Roboto, 8px grid, sharp corners, no decorative shadows.
3
+ * Tokens mirror theme/tokens/colors.less (component less files cannot import
4
+ * the Volto theme, so the BISE ramp is duplicated here — keep them in sync):
5
+ * BISE deep green @cse-green #0E5B54 (interactive, headers)
6
+ * BISE pine @cse-green-dark #005248 (hover / pressed, headings)
7
+ * BISE light green @cse-surface-tint #EAF4F2 (panels, filter bar, chips)
8
+ * BISE tint active @cse-surface-tint-strong #D3E9E4
9
+ * BISE lime @cse-lime #C8DEAA (highlight badges)
10
+ * plus @blue-4 #006BB8 (link), @yellow-5 #FF9933 (warning),
11
+ * @blue-grey-5 #3D5265 (text), @grey-2 #E6E7E8 (borders).
12
+ */
13
+
14
+ @cse-green: #0e5b54;
15
+ @cse-green-dark: #005248;
16
+ @cse-blue: #004b7f;
17
+ @cse-link: #006bb8;
18
+ @cse-warning: #ff9933;
19
+ @cse-text: #3d5265;
20
+ @cse-muted: #747678;
21
+ @cse-border: #e6e7e8;
22
+ @cse-surface: #ffffff;
23
+ @cse-surface-alt: #f9f9f9;
24
+ @cse-surface-tint: #eaf4f2;
25
+ @cse-surface-tint-strong: #d3e9e4;
26
+ @cse-lime: #c8deaa;
27
+ @cse-lime-text: #2a4112;
28
+ @cse-focus: #008ff5;
29
+
30
+ .cse-explorer {
31
+ color: @cse-text;
32
+ font-family: Roboto, Arial, 'Helvetica Neue', Helvetica, sans-serif;
33
+ font-size: 16px;
34
+
35
+ i.icon {
36
+ margin: 0;
37
+ }
38
+
39
+ a {
40
+ // color: @cse-link;
41
+ text-decoration: none;
42
+
43
+ // &:hover,
44
+ // &:focus {
45
+ // color: @cse-blue;
46
+ // text-decoration: underline;
47
+ // }
48
+
49
+ &:focus-visible {
50
+ outline: 2px solid @cse-focus;
51
+ outline-offset: 2px;
52
+ }
53
+ }
54
+
55
+ button {
56
+ cursor: pointer;
57
+ font-family: inherit;
58
+ font-size: 14px;
59
+ touch-action: manipulation;
60
+
61
+ &:focus-visible {
62
+ outline: 2px solid @cse-focus;
63
+ outline-offset: 2px;
64
+ }
65
+
66
+ &:disabled {
67
+ cursor: default;
68
+ opacity: 0.5;
69
+ }
70
+ }
71
+
72
+ @media (prefers-reduced-motion: reduce) {
73
+ *,
74
+ *::before,
75
+ *::after {
76
+ scroll-behavior: auto !important;
77
+ transition-duration: 0.01ms !important;
78
+ }
79
+ }
80
+ }
81
+
82
+ .cse-visually-hidden {
83
+ position: absolute;
84
+ overflow: hidden;
85
+ width: 1px;
86
+ height: 1px;
87
+ padding: 0;
88
+ border: 0;
89
+ margin: -1px;
90
+ clip: rect(0, 0, 0, 0);
91
+ white-space: nowrap;
92
+ }
93
+
94
+ /* ---------------------------------------------------------------- panel -- */
95
+
96
+ .cse-filter-panel {
97
+ /* Above the map column (z-index 30) so an open facet menu is not hidden
98
+ behind the map when it opens downwards over it. */
99
+ position: relative;
100
+ z-index: 31;
101
+ padding: 24px;
102
+ border: 1px solid @cse-border;
103
+ margin-bottom: 24px;
104
+ background: @cse-surface-tint;
3
105
  }
4
106
 
5
- .nrr-case-study-map-container .case-study-status-legend {
107
+ .cse-filter-header {
6
108
  display: flex;
7
109
  flex-wrap: wrap;
8
110
  align-items: center;
9
- justify-content: flex-end;
10
- margin: 0.75rem 0;
11
- font-size: 0.9rem;
12
- gap: 0.75rem;
111
+ justify-content: space-between;
112
+ margin-bottom: 16px;
113
+ gap: 16px;
13
114
  }
14
115
 
15
- .nrr-case-study-map-container .legend-title {
16
- font-weight: 600;
116
+ .cse-filter-heading {
117
+ display: flex;
118
+ flex-wrap: wrap;
119
+ align-items: baseline;
120
+ gap: 8px;
121
+ }
122
+
123
+ .cse-filter-icon {
124
+ align-self: center;
125
+ color: @cse-green;
126
+
127
+ .icon {
128
+ font-size: 20px;
129
+ }
17
130
  }
18
131
 
19
- .nrr-case-study-map-container .legend-item {
132
+ .cse-filter-title {
133
+ margin: 0;
134
+ color: @cse-green-dark;
135
+ font-size: 20px;
136
+ font-weight: 700;
137
+ letter-spacing: -0.015em;
138
+ line-height: 1.2;
139
+ }
140
+
141
+ .cse-filter-subtitle {
142
+ color: @cse-muted;
143
+ font-size: 14px;
144
+ }
145
+
146
+ .cse-filter-actions {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 16px;
150
+ }
151
+
152
+ .cse-reset-filters {
20
153
  display: inline-flex;
21
154
  align-items: center;
22
- gap: 0.3rem;
23
- text-transform: capitalize;
155
+ padding: 12px 16px;
156
+ border: 1px solid transparent;
157
+ border-radius: 0;
158
+ font-weight: 500;
159
+ gap: 8px;
160
+ line-height: 1;
24
161
  }
25
162
 
26
- .nrr-case-study-map-container .legend-dot {
27
- display: inline-block;
28
- width: 0.75rem;
29
- height: 0.75rem;
30
- border-radius: 50%;
163
+ .cse-reset-filters {
164
+ border-color: @cse-border;
165
+ background: transparent;
166
+ color: @cse-green-dark;
167
+
168
+ &:hover:not(:disabled) {
169
+ border-color: @cse-green;
170
+ color: @cse-green;
171
+ }
31
172
  }
32
173
 
33
- .nrr-case-study-map-container .filter-wrapper .facet-btn:disabled {
34
- cursor: not-allowed;
35
- opacity: 0.55;
174
+ .cse-filter-row {
175
+ display: flex;
176
+ flex-wrap: wrap;
177
+ margin-bottom: 16px;
178
+ gap: 16px;
179
+
180
+ &:last-of-type {
181
+ margin-bottom: 0;
182
+ }
36
183
  }
37
184
 
38
- .ol-overlaycontainer {
39
- z-index: 1 !important;
185
+ .cse-filter-row-primary {
186
+ align-items: flex-end;
40
187
  }
41
188
 
42
- .ol-viewport {
43
- overflow: visible !important;
189
+ .cse-search {
190
+ display: flex;
191
+ flex: 1 1 320px;
192
+ flex-direction: column;
193
+ gap: 6px;
44
194
  }
45
195
 
46
- #csepopup > span {
47
- display: 'block';
48
- margin-bottom: '10px';
49
- background-color: '#ddd';
196
+ .cse-search-label {
197
+ color: @cse-green-dark;
198
+ font-size: 14px;
199
+ font-weight: 500;
50
200
  }
51
201
 
52
- #csepopup {
53
- width: 300px;
54
- // height: 100%;
55
- padding: 1em;
56
- background-color: #f9f9f9;
57
- // border: 1px solid black;
58
- // line-height: initial;
59
- font-size: 1rem;
202
+ .cse-search-field {
203
+ display: flex;
204
+ min-height: 44px;
205
+ align-items: center;
206
+ padding: 0 12px;
207
+ border: 1px solid @cse-border;
208
+ background: @cse-surface;
209
+ gap: 8px;
210
+
211
+ &:focus-within {
212
+ border-color: @cse-green;
213
+ outline: 2px solid @cse-focus;
214
+ outline-offset: 0;
215
+ }
60
216
 
61
- .csepopup-image {
62
- display: block;
63
- width: 100%;
64
- max-width: 260px;
65
- max-height: 160px;
66
- margin-bottom: 10px;
67
- object-fit: cover;
217
+ .icon {
218
+ flex: 0 0 auto;
219
+ color: @cse-muted;
68
220
  }
221
+ }
222
+
223
+ .cse-search-input {
224
+ width: 100%;
225
+ padding: 12px 0;
226
+ border: 0;
227
+ background: transparent;
228
+ color: @cse-text;
229
+ font: inherit;
69
230
 
70
- a:hover {
71
- color: #289588;
231
+ &:focus {
232
+ outline: none;
72
233
  }
73
234
 
74
- h3 {
75
- margin: 0px;
76
- font-size: 1rem;
235
+ &::-webkit-search-cancel-button {
236
+ display: none;
77
237
  }
238
+ }
78
239
 
79
- h4 {
80
- margin: 0px;
240
+ .cse-search-clear {
241
+ display: inline-flex;
242
+ padding: 4px;
243
+ border: 0;
244
+ background: transparent;
245
+ color: @cse-muted;
246
+ cursor: pointer;
247
+
248
+ &:hover {
249
+ color: @cse-green;
81
250
  }
251
+ }
252
+
253
+ .cse-filter-row-secondary {
254
+ align-items: flex-end;
255
+ }
82
256
 
83
- div {
84
- margin-bottom: 16px;
257
+ /* ----------------------------------------------------------- facet menu -- */
258
+
259
+ .facet-popover {
260
+ position: relative;
261
+ min-width: 200px;
262
+ flex: 0 1 auto;
263
+ }
264
+
265
+ .facet-trigger {
266
+ display: flex;
267
+ width: 100%;
268
+ min-height: 44px;
269
+ align-items: center;
270
+ justify-content: space-between;
271
+ padding: 12px 16px;
272
+ border: 1px solid @cse-border;
273
+ border-radius: 0;
274
+ background: @cse-surface;
275
+ color: @cse-green;
276
+ gap: 8px;
277
+ text-align: left;
278
+
279
+ .icon {
280
+ flex: 0 0 auto;
281
+ color: @cse-muted;
85
282
  }
86
283
 
87
- ul {
88
- margin: 0px;
284
+ &:hover {
285
+ border-color: @cse-green;
286
+ }
89
287
 
90
- li {
91
- line-height: 22px;
92
- }
288
+ &.active {
289
+ border-color: @cse-green;
290
+ font-weight: 500;
93
291
  }
292
+ }
94
293
 
95
- p {
96
- font-size: 13px;
294
+ .facet-trigger-label {
295
+ overflow: hidden;
296
+ text-overflow: ellipsis;
297
+ white-space: nowrap;
298
+ }
97
299
 
98
- p {
99
- margin-bottom: 10px;
100
- }
300
+ .facet-panel {
301
+ position: absolute;
302
+ z-index: 20;
303
+ top: calc(100% + 4px);
304
+ left: 0;
305
+ width: 320px;
306
+ max-height: 420px;
307
+ padding: 16px;
308
+ border: 1px solid @cse-border;
309
+ background: @cse-surface;
310
+ box-shadow:
311
+ 0 2px 4px 0 rgba(34, 36, 38, 0.12),
312
+ 0 2px 10px 0 rgba(34, 36, 38, 0.15);
313
+ overflow-y: auto;
314
+ overscroll-behavior: contain;
315
+ }
316
+
317
+ .facet-search {
318
+ width: 100%;
319
+ padding: 12px 16px;
320
+ border: 1px solid @cse-border;
321
+ border-radius: 0;
322
+ margin-bottom: 16px;
323
+ color: @cse-text;
324
+
325
+ &:focus {
326
+ border-color: @cse-green;
327
+ outline: 2px solid @cse-focus;
328
+ outline-offset: 0;
101
329
  }
330
+ }
102
331
 
103
- span.blue {
104
- color: #069;
332
+ .facet-group {
333
+ padding: 0;
334
+ border: 0;
335
+ margin: 0 0 16px;
336
+
337
+ legend {
338
+ padding: 0 0 8px;
339
+ color: @cse-muted;
340
+ font-size: 12px;
341
+ font-weight: 500;
342
+ letter-spacing: 0.1em;
343
+ text-transform: uppercase;
105
344
  }
345
+ }
106
346
 
107
- span.img {
108
- display: block;
109
- margin-bottom: 10px;
110
- background-color: #ddd;
347
+ .facet-options {
348
+ display: flex;
349
+ flex-direction: column;
350
+ // gap: 4px;
351
+ }
352
+
353
+ .facet-option {
354
+ display: flex;
355
+ align-items: flex-start;
356
+ padding: 3px 0px;
357
+ cursor: pointer;
358
+ gap: 8px;
359
+
360
+ &:hover {
361
+ background: @cse-surface-tint;
362
+ }
111
363
 
112
- img {
113
- max-height: 133px;
364
+ input {
365
+ flex: 0 0 auto;
366
+ margin: 0;
367
+ margin-top: 2px;
368
+ accent-color: @cse-green;
369
+ }
370
+ }
371
+
372
+ .facet-option-label {
373
+ flex: 1 1 auto;
374
+ font-size: 14px;
375
+ line-height: 1.4;
376
+ }
377
+
378
+ .facet-option-count {
379
+ flex: 0 0 auto;
380
+ color: @cse-muted;
381
+ font-size: 12px;
382
+ font-variant-numeric: tabular-nums;
383
+ }
384
+
385
+ .facet-empty {
386
+ margin: 0;
387
+ color: @cse-muted;
388
+ font-size: 14px;
389
+ }
390
+
391
+ /* --------------------------------------------------------- status facet -- */
392
+
393
+ .facet-status {
394
+ display: flex;
395
+ min-width: 200px;
396
+ flex-direction: column;
397
+ gap: 8px;
398
+ }
399
+
400
+ .facet-status-label {
401
+ color: @cse-green-dark;
402
+ font-size: 14px;
403
+ font-weight: 500;
404
+ }
405
+
406
+ .facet-status-buttons {
407
+ display: flex;
408
+ flex-wrap: wrap;
409
+ gap: 8px;
410
+ }
411
+
412
+ .facet-status-button {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ padding: 12px 16px;
416
+ border: 1px solid @cse-border;
417
+ border-radius: 0;
418
+ background: @cse-surface;
419
+ color: @cse-green;
420
+ gap: 8px;
421
+
422
+ &:hover {
423
+ border-color: @cse-green;
424
+ }
425
+
426
+ &.active {
427
+ border-color: @cse-green;
428
+ background: @cse-green;
429
+ color: #ffffff;
430
+
431
+ .facet-status-count {
432
+ color: #ffffff;
433
+ opacity: 0.85;
114
434
  }
115
435
  }
436
+ }
437
+
438
+ .facet-status-dot {
439
+ width: 8px;
440
+ height: 8px;
441
+ flex: 0 0 auto;
442
+ border-radius: 50%;
443
+ }
444
+
445
+ .facet-status-count {
446
+ color: @cse-muted;
447
+ font-size: 12px;
448
+ font-variant-numeric: tabular-nums;
449
+ }
450
+
451
+ /* -------------------------------------------------------------- layout -- */
452
+
453
+ .cse-layout {
454
+ display: grid;
455
+ align-items: start;
456
+ gap: 16px;
457
+ /* 60% map / 40% results (approximate — gap and padding are subtracted
458
+ proportionally, so the 6:4 ratio is preserved). */
459
+ grid-template-columns: 3fr 2fr;
460
+ }
116
461
 
117
- .ri-external-link-line {
118
- margin-left: 0.25rem;
462
+ .cse-layout-map {
463
+ position: sticky;
464
+ /* A sticky element is its own stacking context, so the title popup of a pin
465
+ near the edge could never paint above the results column from inside it.
466
+ Lift the whole map column above the cards (their panels go up to 20); the
467
+ filter panel sits above both (see .cse-filter-panel). */
468
+ z-index: 30;
469
+ top: 24px;
470
+ }
471
+
472
+ .cse-layout-results {
473
+ min-width: 0;
474
+ /* The results column is at least as tall as the map column: the grid row is
475
+ sized by the tallest item and this one stretches to it, so a short result
476
+ list still lines up with the bottom of the (square) map. When the results
477
+ need more room the row simply grows and the page scrolls — the stretch
478
+ never shrinks them. */
479
+ align-self: stretch;
480
+ }
481
+
482
+ @media (max-width: 992px) {
483
+ .cse-layout {
484
+ grid-template-columns: 1fr;
485
+ }
486
+
487
+ .cse-layout-map {
488
+ position: static;
119
489
  }
120
490
  }
121
491
 
122
- #external-popup-overlay {
123
- width: 370px;
492
+ /* ----------------------------------------------------------------- map -- */
493
+
494
+ /* Reserves the map's height until it is near the viewport and mounts.
495
+ The slot is square: its height follows the grid column width (60% on
496
+ wide screens), so the map always fills a 1:1 box, capped at 730px (50px
497
+ shorter than the 780px square it used to render). */
498
+ .cse-map-slot {
499
+ /* Width stays tied to the grid column; the aspect ratio only derives the
500
+ height, which `max-height` then clamps. */
501
+ width: 100%;
502
+ /* Fallback for browsers without aspect-ratio support. */
503
+ min-height: 320px;
504
+ max-height: 730px;
505
+ aspect-ratio: 1 / 1;
506
+ }
507
+
508
+ .cse-map {
509
+ position: relative;
124
510
  height: 100%;
511
+ border: 1px solid @cse-border;
512
+ scroll-margin-top: 24px;
513
+
514
+ .ol-control button {
515
+ background-color: @cse-green;
516
+ opacity: 0.7;
517
+ }
125
518
 
126
- .ol-overlay-container {
127
- position: relative !important;
128
- // display: block !important;
519
+ /* `@eeacms/volto-openlayers-map` ships `.ol-map-wrapper` / `.ol-map` with a
520
+ fixed 500px height (map.variables). Let the map fill the square slot
521
+ instead — the ResizeObserver in CaseStudyMap calls map.updateSize() so
522
+ the canvas follows. */
523
+ .ol-map-wrapper,
524
+ .ol-map {
129
525
  width: 100%;
130
526
  height: 100%;
131
- background-color: #dae8f4;
132
-
133
- #popup-overlay {
134
- position: relative !important;
135
- display: flex;
136
- width: 100%;
137
- height: 100%;
138
- align-items: center;
139
- }
527
+ min-height: 0;
528
+ }
529
+
530
+ .ol-viewport {
531
+ height: 100%;
140
532
  }
141
533
  }
142
534
 
143
- #cse-filter {
535
+ .cse-loading {
144
536
  display: flex;
145
- flex-direction: row;
146
- margin-top: 1em;
147
- font-family: sans-serif;
148
- // gap: 3em;
149
-
150
- .filter-wrapper {
151
- // flex-grow: 1;
152
-
153
- &.active {
154
- button span {
155
- // box-shadow: 0 5px 0 #ffffff, 0 0 4px rgba(0, 0, 0, 0.25);
156
- color: #289588;
157
- }
158
-
159
- button {
160
- box-shadow:
161
- 0 5px 0 #ffffff,
162
- 0 0 4px rgba(0, 0, 0, 0.25) !important;
163
- }
164
-
165
- .filter-inputs-wrapper {
166
- display: block;
167
- }
168
- }
537
+ min-height: 520px;
538
+ flex-direction: column;
539
+ align-items: center;
540
+ justify-content: center;
541
+ padding: 24px;
542
+ border: 1px solid @cse-border;
543
+ background: @cse-surface-tint;
544
+ gap: 16px;
545
+ text-align: center;
546
+
547
+ @media (max-width: 600px) {
548
+ min-height: 360px;
549
+ }
550
+ }
169
551
 
170
- .ri-arrow-down-s-line:before {
171
- content: '\ea4e';
172
- }
552
+ .cse-loading-spinner {
553
+ width: 32px;
554
+ height: 32px;
555
+ border: 3px solid @cse-border;
556
+ border-radius: 50%;
557
+ border-top-color: @cse-green;
558
+ animation: cse-loading-spin 0.8s linear infinite;
559
+ }
173
560
 
174
- .ui.basic.button.facet-btn {
175
- position: relative !important;
176
- z-index: 99999;
177
- display: inline-block;
178
- overflow: hidden;
179
- padding: 0.5em 0em;
180
- margin: 0 0.25em 0.25em 0;
181
- background-color: white !important;
182
- color: #3d5265 !important;
183
-
184
- &:active {
185
- background: white !important;
186
- }
187
-
188
- // &:hover,
189
- // &:focus {
190
- // color: rgba(0, 0, 0, 0.6) !important;
191
- // }
192
- &:hover {
193
- box-shadow: none;
194
- }
195
-
196
- span {
197
- position: relative !important;
198
- z-index: 99999;
199
- display: inline-block;
200
- overflow: hidden;
201
- padding: 0.5em 1em;
202
- background-color: white;
203
- }
204
- }
561
+ .cse-loading-message {
562
+ margin: 0;
563
+ }
205
564
 
206
- .filter-inputs-wrapper {
207
- position: absolute;
208
- z-index: 1;
209
- display: none;
210
- padding: 1em;
211
- margin-top: -3px;
212
- background-color: #fff;
213
- box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.25);
214
- color: #4f4f4f;
215
-
216
- .filterInputText {
217
- padding: 6px;
218
- border: 0.5px solid #c4c4c4;
219
- border-radius: 0;
220
- margin-bottom: 0.7em;
221
- font-size: 14px;
222
- }
223
-
224
- .filter-inputs {
225
- overflow: auto;
226
- min-width: 200px;
227
- max-width: 400px;
228
- max-height: 200px;
229
-
230
- &::-webkit-scrollbar {
231
- width: 8px;
232
- height: 0.3rem !important;
233
- }
234
-
235
- &::-webkit-scrollbar-track {
236
- border-radius: 10px;
237
- background-color: #d9d9d9;
238
- }
239
-
240
- &::-webkit-scrollbar-thumb {
241
- border-radius: 10px;
242
- background: #004b7f;
243
- }
244
-
245
- .filter-input {
246
- display: flex;
247
- align-items: center;
248
- justify-content: flex-start;
249
- cursor: pointer;
250
- font-size: 14px;
251
-
252
- span {
253
- padding-right: 5px;
254
- }
255
-
256
- input {
257
- margin-right: 8px;
258
- cursor: pointer;
259
- }
260
- }
261
- }
262
- }
565
+ .cse-loading-retry {
566
+ padding: 8px 16px;
567
+ border: 1px solid @cse-green;
568
+ background: @cse-green;
569
+ color: @cse-surface;
570
+
571
+ &:hover {
572
+ background: @cse-green-dark;
573
+ }
574
+ }
575
+
576
+ @keyframes cse-loading-spin {
577
+ to {
578
+ transform: rotate(360deg);
263
579
  }
580
+ }
264
581
 
265
- h4 {
266
- position: relative;
267
- padding: 10px;
268
- border-bottom: 1px solid #d8d8d8;
269
- margin-bottom: 0 !important;
270
- background-color: #005c96;
271
- color: #fff;
272
- cursor: pointer;
273
- font-size: 14px;
582
+ @media (prefers-reduced-motion: reduce) {
583
+ .cse-loading-spinner {
584
+ animation: none;
274
585
  }
275
586
  }
276
587
 
277
- .active-filter-list {
278
- border: 1px solid #e6e7e8;
279
- background-color: #f9f9f9 !important;
588
+ .cse-map-loading {
589
+ position: absolute;
590
+ z-index: 7;
591
+ top: 0;
592
+ right: 0;
593
+ bottom: 0;
594
+ left: 0;
595
+ display: flex;
596
+ align-items: center;
597
+ justify-content: center;
598
+ background: @cse-surface-tint;
599
+ color: @cse-text;
600
+ gap: 16px;
601
+ }
280
602
 
281
- .filter-list-header {
282
- display: flex;
283
- align-items: center;
284
- gap: 1em;
603
+ .cse-map-reset {
604
+ position: absolute;
605
+ z-index: 5;
606
+ top: 8px;
607
+ right: 8px;
608
+ display: inline-flex;
609
+ align-items: center;
610
+ padding: 8px 12px;
611
+ border: 1px solid @cse-border;
612
+ border-radius: 0;
613
+ background: @cse-surface;
614
+ color: @cse-green;
615
+ gap: 8px;
285
616
 
286
- h4 {
287
- margin: 0;
288
- color: #3d5265;
289
- }
617
+ &.inactive {
618
+ opacity: 0.5;
619
+ }
620
+ }
621
+
622
+ .cse-map-legend {
623
+ position: absolute;
624
+ z-index: 5;
625
+ bottom: 8px;
626
+ left: 8px;
627
+ padding: 12px;
628
+ border: 1px solid @cse-border;
629
+ background: rgba(255, 255, 255, 0.95);
630
+ font-size: 12px;
631
+ }
632
+
633
+ .cse-map-legend-title {
634
+ display: block;
635
+ margin-bottom: 8px;
636
+ color: @cse-muted;
637
+ font-weight: 500;
638
+ letter-spacing: 0.1em;
639
+ text-transform: uppercase;
640
+ }
641
+
642
+ .cse-map-legend-items {
643
+ display: flex;
644
+ flex-direction: column;
645
+ padding: 0;
646
+ margin: 0;
647
+ gap: 4px;
648
+ list-style: none;
649
+ }
650
+
651
+ .cse-map-legend-item {
652
+ display: flex;
653
+ align-items: center;
654
+ gap: 8px;
655
+ }
656
+
657
+ .cse-map-legend-dot {
658
+ width: 10px;
659
+ height: 10px;
660
+ flex: 0 0 auto;
661
+ border-radius: 50%;
662
+ }
663
+
664
+ /* Title of the selected case study. The anchor is a zero-sized point placed
665
+ over the pin by CaseStudyMap (the map itself knows where features are), the
666
+ bubble hangs above it. Neither the map nor the column clip it, so a pin near
667
+ an edge still gets a readable bubble. */
668
+ .cse-map-popup-anchor {
669
+ position: absolute;
670
+ z-index: 6;
671
+ top: 0;
672
+ left: 0;
673
+ width: 0;
674
+ height: 0;
675
+ pointer-events: none;
676
+ transform: translate(-1000px, -1000px);
677
+ }
678
+
679
+ .cse-map-popup {
680
+ position: absolute;
681
+ bottom: 26px;
682
+ left: 0;
683
+ width: max-content;
684
+ max-width: 240px;
685
+ padding: 8px 12px;
686
+ border: 1px solid @cse-green-dark;
687
+ background: @cse-surface;
688
+ color: @cse-green-dark;
689
+ font-size: 14px;
690
+ font-weight: 500;
691
+ line-height: 1.35;
692
+ text-align: center;
693
+ transform: translateX(-50%);
694
+ }
695
+
696
+ /* ------------------------------------------------------------- results -- */
697
+
698
+ .cse-results {
699
+ /* Fill the results column, which is stretched to the map's height, so the
700
+ pagination can sit on the map's bottom edge. `min-height` (not `height`)
701
+ lets the pane grow past the map when it holds more cards. */
702
+ display: flex;
703
+ min-height: 100%;
704
+ flex-direction: column;
705
+ }
706
+
707
+ .cse-results-header {
708
+ display: flex;
709
+ flex-wrap: wrap;
710
+ align-items: center;
711
+ justify-content: space-between;
712
+ border-bottom: 1px solid @cse-border;
713
+ margin-bottom: 4px;
714
+ gap: 16px;
715
+ }
716
+
717
+ .cse-results-count {
718
+ margin: 0;
719
+ color: @cse-green-dark;
720
+ font-variant-numeric: tabular-nums;
721
+ font-weight: 500;
722
+ }
723
+
724
+ .cse-results-controls {
725
+ display: flex;
726
+ flex-wrap: wrap;
727
+ gap: 16px;
728
+ }
729
+
730
+ .cse-results-control {
731
+ display: flex;
732
+ align-items: center;
733
+ color: @cse-green;
734
+ font-size: 12px;
735
+ gap: 8px;
736
+
737
+ select {
738
+ padding: 2px 5px;
739
+ border: 1px solid @cse-border;
740
+ border-radius: 0;
741
+ background: @cse-surface;
742
+ color: @cse-text;
743
+ font-family: inherit;
744
+ font-size: 12px;
290
745
  }
746
+ }
747
+
748
+ .cse-results-list {
749
+ display: flex;
750
+ flex-direction: column;
751
+ padding: 0;
752
+ margin: 0;
753
+ // gap: 16px;
754
+ list-style: none;
755
+ }
291
756
 
292
- .filter-list-content {
293
- padding: 1em 0 0;
294
- background-color: transparent;
295
-
296
- .filter {
297
- display: flex;
298
- flex-wrap: wrap;
299
- font-size: 15px;
300
-
301
- .filter-wrapper {
302
- display: flex;
303
- flex-direction: row;
304
- flex-wrap: wrap;
305
- align-items: baseline;
306
- padding: 8px 15px;
307
- margin-top: 10px;
308
- margin-right: 11px;
309
- background-color: #ebebeb;
310
- gap: 1em;
311
-
312
- .filter-label {
313
- font-weight: 500;
314
- }
315
-
316
- .filter-value {
317
- position: relative;
318
- display: flex;
319
- align-items: center;
320
- padding: 0;
321
- border: none;
322
- margin: 0;
323
- background-color: transparent;
324
- font-size: 15px;
325
-
326
- .close.icon {
327
- position: relative;
328
- width: 16px;
329
- height: 16px;
330
- padding: 3px;
331
- border: 1px solid #004b7f !important;
332
- border-radius: 2px;
333
- color: #2e3e4c;
334
- opacity: 1;
335
-
336
- &:before,
337
- &:after {
338
- position: absolute;
339
- top: 2px;
340
- left: 7px;
341
- width: 1px;
342
- height: 9px;
343
- background-color: #004b7f !important;
344
- content: ' ';
345
- }
346
-
347
- &:before {
348
- transform: rotate(45deg);
349
- }
350
-
351
- &:after {
352
- transform: rotate(-45deg);
353
- }
354
- }
355
- }
356
- }
757
+ .cse-results-empty {
758
+ padding: 32px 24px;
759
+ border: 1px dashed @cse-surface-tint-strong;
760
+ background: @cse-surface-tint;
761
+ text-align: left;
762
+
763
+ h3 {
764
+ margin: 0 0 8px;
765
+ font-size: 20px;
766
+ line-height: 1.2;
767
+ }
768
+
769
+ p {
770
+ margin: 0 0 16px;
771
+ color: @cse-muted;
772
+ }
773
+ }
774
+
775
+ /* --------------------------------------------------------------- cards -- */
776
+
777
+ .cse-card.selected {
778
+ .cse-card-chip,
779
+ .cse-card-chip-more-trigger {
780
+ background: @cse-surface-tint-strong;
781
+ }
782
+ }
783
+
784
+ .cse-card {
785
+ position: relative;
786
+ display: grid;
787
+ padding: 14px 16px;
788
+ // border-top: 1px solid @cse-border;
789
+ border-bottom: 1px solid @cse-border;
790
+ /* border: 1px solid #e6e7e8; */
791
+ background: #ffffff;
792
+ border-collapse: collapse;
793
+ gap: 8px;
794
+ grid-template-areas:
795
+ 'media content'
796
+ 'measures measures';
797
+ grid-template-columns: 140px minmax(0, 1fr);
798
+ scroll-margin-top: 24px;
799
+
800
+ &.selected {
801
+ background: @cse-surface-tint;
802
+ }
803
+
804
+ /* Without an image there is no media column: the content starts at the
805
+ card's left edge and spans the full width. */
806
+ &.cse-card-no-media {
807
+ grid-template-areas:
808
+ 'content'
809
+ 'measures';
810
+ grid-template-columns: minmax(0, 1fr);
811
+ }
812
+
813
+ @media (max-width: 600px) {
814
+ grid-template-areas:
815
+ 'media'
816
+ 'content'
817
+ 'measures';
818
+ grid-template-columns: 1fr;
819
+
820
+ &.cse-card-no-media {
821
+ grid-template-areas:
822
+ 'content'
823
+ 'measures';
357
824
  }
358
825
  }
359
826
  }
360
827
 
361
- .sui-search-box .search-input .terms-box .terms-box-left .search-icon img {
362
- fill: #004b7f !important;
828
+ .cse-card-media {
829
+ display: block;
830
+ overflow: hidden;
831
+ align-self: start;
832
+ aspect-ratio: 4 / 3;
833
+ background: @cse-surface-alt;
834
+ grid-area: media;
835
+
836
+ img {
837
+ display: block;
838
+ width: 100%;
839
+ height: 100%;
840
+ object-fit: cover;
841
+ }
842
+ }
843
+
844
+ .cse-card-content {
845
+ display: flex;
846
+ min-width: 0;
847
+ flex-direction: column;
848
+ padding: 4px;
849
+ gap: 8px;
850
+ grid-area: content;
851
+ }
852
+
853
+ .cse-card-head {
854
+ display: flex;
855
+ align-items: flex-start;
856
+ gap: 8px;
363
857
  }
364
858
 
365
- .searchlib-block .ui.basic.button.clear-btn {
366
- color: #289588 !important;
859
+ .cse-card-title {
860
+ display: -webkit-box;
861
+ overflow: hidden;
862
+ min-width: 0;
863
+ flex: 1 1 auto;
864
+ margin: 0;
865
+ -webkit-box-orient: vertical;
866
+ font-size: 14px;
867
+ font-weight: 700;
868
+ letter-spacing: -0.015em;
869
+ -webkit-line-clamp: 2;
870
+ line-height: 1.3;
871
+ text-wrap: balance;
872
+
873
+ a {
874
+ color: @cse-text;
875
+ }
367
876
  }
368
877
 
369
- .searchlib-block .result-item .result-info {
878
+ .cse-card-open {
879
+ display: inline-flex;
880
+ width: 24px;
881
+ height: 24px;
882
+ flex: 0 0 auto;
370
883
  align-items: center;
884
+ justify-content: center;
885
+ border: 1px solid @cse-border;
886
+ margin-left: auto;
887
+ color: @cse-green;
371
888
 
372
- &.show-on-map {
373
- color: #289588 !important;
374
- cursor: pointer;
889
+ .icon {
890
+ font-size: 14px;
891
+ }
375
892
 
376
- .result-info-title {
377
- color: #289588 !important;
378
- }
893
+ &:hover {
894
+ border-color: @cse-green;
379
895
  }
380
896
  }
381
897
 
382
- .searchlib-block .search-body-footer {
383
- margin-top: 2em;
898
+ .cse-card-meta {
899
+ display: none; // flex
900
+ min-height: 32px;
901
+ flex-wrap: wrap;
902
+ align-items: center;
903
+ margin: 0;
904
+ font-size: 14px;
905
+ gap: 8px;
906
+ line-height: 1.4;
907
+
908
+ button {
909
+ font-size: 12px;
910
+ }
911
+ }
912
+
913
+ .cse-card-status {
914
+ display: inline-flex;
915
+ align-items: center;
916
+ margin-right: 5px;
917
+ gap: 8px;
384
918
  }
385
919
 
386
- .reset-map-button.ui.button.secondary {
920
+ .cse-card-status-dot {
921
+ width: 8px;
922
+ height: 8px;
923
+ flex: 0 0 auto;
924
+ border-radius: 50%;
925
+ }
926
+
927
+ .cse-card-separator {
928
+ color: @cse-border;
929
+ }
930
+
931
+ .cse-card-directives {
932
+ display: inline-flex;
933
+ flex-wrap: wrap;
934
+ gap: 4px;
935
+ }
936
+
937
+ .cse-card-ecosystems-wrap {
938
+ position: relative;
939
+ }
940
+
941
+ .cse-card-ecosystems {
942
+ display: flex;
943
+ flex-wrap: wrap;
944
+ padding: 0;
945
+ margin: 0;
946
+ gap: 8px;
947
+ list-style: none;
948
+ }
949
+
950
+ /* Mirrors the real chip list so the two-row fit can be measured. */
951
+ .cse-card-ecosystems-measure {
387
952
  position: absolute;
953
+ top: 0;
954
+ left: 0;
955
+ width: 100%;
956
+ pointer-events: none;
957
+ visibility: hidden;
958
+ }
959
+
960
+ .cse-card-chip,
961
+ .cse-card-chip-more-trigger,
962
+ .cse-card-chip-more-measure {
963
+ display: inline-flex;
964
+ align-items: center;
965
+ padding: 4px 8px;
966
+ border-radius: 0;
967
+ background: @cse-surface-tint;
968
+ color: @cse-green;
969
+ font-size: 12px;
970
+ font-weight: 500;
971
+ line-height: 1.2;
972
+ }
973
+
974
+ /* The trigger keeps the chip look but lives inside a padding-free pill. */
975
+ .cse-card-chip-more {
976
+ padding: 0;
977
+ background: none;
978
+ }
979
+
980
+ .cse-card-chip-more-trigger {
981
+ border: 0;
982
+ cursor: pointer;
983
+ font-family: inherit;
984
+ font-size: 12px !important;
985
+ gap: 4px;
986
+
987
+ &:hover {
988
+ background: @cse-surface-tint-strong;
989
+ }
990
+
991
+ &:focus-visible {
992
+ outline: 2px solid @cse-green;
993
+ outline-offset: 2px;
994
+ }
995
+ }
996
+
997
+ .cse-card-ecosystems-panel {
998
+ position: absolute;
999
+ z-index: 20;
1000
+ top: calc(100% + 4px);
1001
+ left: 0;
1002
+ width: 260px;
1003
+ max-height: 220px;
1004
+ padding: 8px;
1005
+ border: 1px solid @cse-border;
1006
+ background: @cse-surface;
1007
+ box-shadow:
1008
+ 0 2px 4px 0 rgba(34, 36, 38, 0.12),
1009
+ 0 2px 10px 0 rgba(34, 36, 38, 0.15);
1010
+ overflow-y: auto;
1011
+ overscroll-behavior: contain;
1012
+
1013
+ &:focus-visible {
1014
+ outline: 2px solid @cse-green;
1015
+ outline-offset: -2px;
1016
+ }
1017
+ }
1018
+
1019
+ .cse-card-ecosystems-panel-list {
1020
+ gap: 6px;
1021
+ }
1022
+
1023
+ /* Highlight badge ("Case study" style) — light foliage green. */
1024
+ .cse-badge-highlight {
1025
+ display: inline-flex;
1026
+ align-items: center;
1027
+ padding: 2px 8px;
1028
+ border-radius: 0;
1029
+ background: @cse-lime;
1030
+ color: @cse-lime-text;
1031
+ font-size: 12px;
1032
+ font-weight: 500;
1033
+ line-height: 1.4;
1034
+ }
1035
+
1036
+ .cse-card-measures {
1037
+ position: relative;
388
1038
  z-index: 2;
389
- top: 1.3em;
390
- right: 0.7em;
1039
+ min-width: 0;
1040
+ padding: 0px 16px 0;
1041
+ // border-top: 1px solid @cse-border;
1042
+ /* Bleed to the card edges so the divider reads as a full-width row rule. */
1043
+ margin: 0 -16px;
1044
+ grid-area: measures;
1045
+ }
1046
+
1047
+ .cse-card-measures-toggle {
391
1048
  display: flex;
392
- padding: 8px 6px 8px 12px;
393
- border: 4px solid #efefef;
394
- border-radius: 2px;
395
- background-color: #289588;
396
- gap: 0.5em;
397
- opacity: 0.6;
1049
+ width: 100%;
1050
+ min-height: 24px;
1051
+ align-items: baseline;
1052
+ padding: 0;
1053
+ border: 0;
1054
+ background: none;
1055
+ color: inherit;
1056
+ cursor: pointer;
1057
+ gap: 5px;
1058
+ text-align: left;
1059
+
1060
+ &:focus-visible {
1061
+ outline: 2px solid @cse-green;
1062
+ outline-offset: 2px;
1063
+ }
398
1064
 
399
- &.active {
400
- display: flex;
1065
+ &:hover .cse-card-measures-chevron {
1066
+ border-color: @cse-green;
401
1067
  }
402
1068
 
403
- &.inactive {
404
- display: none;
1069
+ @media (max-width: 600px) {
1070
+ min-height: 44px;
1071
+ }
1072
+ }
1073
+
1074
+ .cse-card-measures-title {
1075
+ margin: 0;
1076
+ color: @cse-green-dark;
1077
+ font-size: 14px;
1078
+ font-weight: 500;
1079
+ // letter-spacing: 0.1em;
1080
+ line-height: 1.3;
1081
+ // text-transform: uppercase;
1082
+ }
1083
+
1084
+ .cse-card-measures-count {
1085
+ color: @cse-green-dark;
1086
+ font-size: 14px;
1087
+ font-variant-numeric: tabular-nums;
1088
+ font-weight: 500;
1089
+ line-height: 1.3;
1090
+ }
1091
+
1092
+ .cse-card-measures-chevron {
1093
+ display: inline-flex;
1094
+ width: 24px;
1095
+ height: 24px;
1096
+ flex: 0 0 auto;
1097
+ align-items: center;
1098
+ justify-content: center;
1099
+ border: 1px solid @cse-border;
1100
+ margin-left: auto;
1101
+ color: @cse-green;
1102
+ transition: transform 200ms ease-out;
1103
+
1104
+ .icon {
1105
+ font-size: 16px;
1106
+ }
1107
+ }
1108
+
1109
+ .cse-card-measures-toggle[aria-expanded='true'] .cse-card-measures-chevron {
1110
+ transform: rotate(180deg);
1111
+ }
1112
+
1113
+ .cse-card-measures-panel {
1114
+ position: absolute;
1115
+ z-index: 5;
1116
+ top: 100%;
1117
+ right: 0;
1118
+ left: 0;
1119
+ display: grid;
1120
+ border: 1px solid transparent;
1121
+ background: #ffffff;
1122
+ box-shadow: none;
1123
+ grid-template-rows: 0fr;
1124
+ transition:
1125
+ grid-template-rows 200ms ease-out,
1126
+ visibility 0s linear 200ms;
1127
+ visibility: hidden;
1128
+
1129
+ &[data-open='true'] {
1130
+ border-color: @cse-border;
1131
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
1132
+ grid-template-rows: 1fr;
1133
+ transition:
1134
+ grid-template-rows 200ms ease-out,
1135
+ visibility 0s;
1136
+ visibility: visible;
1137
+ }
1138
+ }
1139
+
1140
+ .cse-card-measures-panel-inner {
1141
+ overflow: hidden;
1142
+ min-height: 0;
1143
+ padding: 8px 16px 8px;
1144
+ }
1145
+
1146
+ .cse-card-measures-list {
1147
+ display: flex;
1148
+ max-height: 40vh;
1149
+ flex-direction: column;
1150
+ padding: 0;
1151
+ margin: 0;
1152
+ gap: 4px;
1153
+ list-style: none;
1154
+ overflow-y: auto;
1155
+ }
1156
+
1157
+ @media (prefers-reduced-motion: reduce) {
1158
+ .cse-card-measures-panel,
1159
+ .cse-card-measures-chevron {
1160
+ transition: none;
1161
+ }
1162
+ }
1163
+
1164
+ .cse-card-measure-link {
1165
+ display: flex;
1166
+ max-width: 100%;
1167
+ align-items: center;
1168
+ padding: 4px 0;
1169
+ color: #289588;
1170
+ font-size: 12px;
1171
+ gap: 3px;
1172
+
1173
+ .icon {
1174
+ flex: 0 0 auto;
1175
+ color: @cse-green;
1176
+ font-size: 14px;
1177
+ }
1178
+
1179
+ .icon:last-child {
1180
+ margin-left: auto;
1181
+ color: @cse-muted;
1182
+ }
1183
+
1184
+ &:hover {
1185
+ color: @cse-green;
1186
+ text-decoration: underline;
405
1187
  }
406
1188
  }
407
1189
 
408
- .ol-zoom.ol-control {
409
- .ol-zoom-in,
410
- .ol-zoom-out {
411
- background-color: rgba(0, 131, 224, 0.5);
1190
+ .cse-card-measure-title {
1191
+ overflow: hidden;
1192
+ min-width: 0;
1193
+ flex: 1 1 auto;
1194
+ text-overflow: ellipsis;
1195
+ white-space: nowrap;
1196
+ }
1197
+
1198
+ .cse-card-show-on-map {
1199
+ display: inline-flex;
1200
+ min-height: 32px;
1201
+ align-items: center;
1202
+ padding: 0;
1203
+ border: 0;
1204
+ margin-left: auto;
1205
+ background: none;
1206
+ color: @cse-link;
1207
+ font-size: 14px;
1208
+ gap: 4px;
1209
+
1210
+ &:hover {
1211
+ text-decoration: underline;
412
1212
  }
413
1213
  }
1214
+
1215
+ /* ---------------------------------------------------------- pagination -- */
1216
+
1217
+ .cse-pagination {
1218
+ display: flex;
1219
+ align-items: center;
1220
+ justify-content: center;
1221
+ /* Push the pagination to the bottom of the results pane when the cards do
1222
+ not fill the height the pane shares with the map. */
1223
+ padding-top: 14px;
1224
+ margin-top: auto;
1225
+ gap: 4px;
1226
+ }
1227
+
1228
+ .cse-pagination-page,
1229
+ .cse-pagination-step {
1230
+ min-width: 24px;
1231
+ height: 24px;
1232
+ padding: 0 0px;
1233
+ border: 1px solid @cse-border;
1234
+ border-radius: 0;
1235
+ background: @cse-surface;
1236
+ color: @cse-text;
1237
+ font-variant-numeric: tabular-nums;
1238
+
1239
+ &[aria-current='page'] {
1240
+ border-color: @cse-green;
1241
+ background: @cse-green;
1242
+ color: #ffffff;
1243
+ }
1244
+
1245
+ &:hover:not(:disabled) {
1246
+ border-color: @cse-green;
1247
+ }
1248
+ }
1249
+
1250
+ .cse-pagination-ellipsis {
1251
+ padding: 0 8px;
1252
+ color: @cse-muted;
1253
+ }