active_admin_prism 0.1.2 → 0.1.4

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.
data/scss-src/_base.scss CHANGED
@@ -57,11 +57,44 @@ a {
57
57
 
58
58
  // Flash messages — ActiveAdmin renders these with a heavy full-width
59
59
  // gradient bar (padding: 13px 30px 11px, font-size: 1.1em); this reskins
60
- // them into a compact, inset, color-coded banner. ".flashes" itself gets
61
- // its grid placement from _sidebar.scss (must be explicit see comment
62
- // there on why leaving it to auto-placement broke the layout).
60
+ // them into a floating toast stack, pinned to the viewport rather than
61
+ // pushed into the page's own grid flow (a toast that shifted #main_content
62
+ // down every time one appeared, then snapped back up when it auto-hid,
63
+ // would be its own layout-jank bug). ".flashes" still gets a grid-row/
64
+ // grid-column from _sidebar.scss for its notional *static* position (some
65
+ // tooling/AT expects every grid child to have one), but `position: fixed`
66
+ // below is what actually places it — relative to the viewport, ignoring
67
+ // that grid area entirely.
63
68
  .flashes {
64
- padding: 10px 10px 0;
69
+ position: fixed;
70
+ top: 20px;
71
+ right: 20px;
72
+ z-index: 1000;
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: 12px;
76
+ width: 340px;
77
+ max-width: calc(100vw - 24px);
78
+ padding: 0;
79
+ pointer-events: none;
80
+
81
+ // Individual toasts opt back into being interactive (hoverable/
82
+ // clickable dismiss button) — the wrapper itself must stay
83
+ // non-interactive, or it would sit as an invisible 340px-wide click
84
+ // blocker over the top-right corner of every page even between toasts.
85
+ > * {
86
+ pointer-events: auto;
87
+ }
88
+ }
89
+
90
+ @media (max-width: 480px) {
91
+ .flashes {
92
+ top: 12px;
93
+ right: 12px;
94
+ left: 12px;
95
+ width: auto;
96
+ max-width: none;
97
+ }
65
98
  }
66
99
 
67
100
  // "body.active_admin .flash" (not a flat ".flash") on purpose: ActiveAdmin
@@ -83,21 +116,25 @@ body.active_admin .flash {
83
116
  position: relative;
84
117
  display: flex;
85
118
  align-items: flex-start;
86
- gap: 12px;
87
- background: $prism-bg-page;
119
+ gap: 10px;
120
+ background: $prism-bg-card;
88
121
  border: 1px solid $prism-border-color;
89
- border-left: 3px solid $prism-text-muted;
90
- border-radius: $prism-radius-sm;
91
- box-shadow: none;
122
+ border-radius: $prism-radius;
123
+ // overflow: hidden clips .prism-flash-progress's square corners to this
124
+ // card's own rounded ones.
125
+ overflow: hidden;
126
+ box-shadow: $prism-shadow-popover;
92
127
  text-shadow: none;
93
128
  color: $prism-text-heading;
94
- font-size: 0.9em;
129
+ font-size: 0.88em;
95
130
  font-weight: 600;
96
131
  line-height: 1.4;
97
- padding: 10px 16px;
132
+ // Right padding clears .prism-flash-dismiss, absolutely positioned in
133
+ // this corner rather than sitting inline — see below.
134
+ padding: 14px 34px 16px 14px;
98
135
  margin-bottom: 0;
99
136
  opacity: 1;
100
- transform: translateY(0) scale(1);
137
+ transform: translateX(0) scale(1);
101
138
  // 320ms/cubic-bezier here matches Configuration#flash_transition_ms's
102
139
  // default and is overridden inline by prism.js (transition-duration) if a
103
140
  // host configures a different value — see that file's flash-dismiss IIFE.
@@ -109,47 +146,147 @@ body.active_admin .flash {
109
146
  // outright once the transition finishes.
110
147
  &.prism-flash-hide {
111
148
  opacity: 0;
112
- transform: translateY(-6px) scale(0.98);
149
+ transform: translateX(24px) scale(0.98);
113
150
  }
114
151
 
115
- &.flash_notice {
116
- background: $prism-color-success-light;
117
- border-left-color: $prism-color-success;
118
- color: darken($prism-color-success, 20%);
152
+ // "notice"/"success" both read as the positive/affirmative case (Rails'
153
+ // own convention already treats :notice that way) — same color, same
154
+ // :check_circle icon (see flash_messages.rb#FLASH_ICONS).
155
+ //
156
+ // background/border/color are redeclared here (not just left to the
157
+ // base .flash rule above) because ActiveAdmin core itself carries a
158
+ // "body.logged_in .flash.flash_notice"/".flash_error" rule of its own
159
+ // (active_admin/components/_flash_messages.scss — a pale gradient +
160
+ // colored border-bottom), and THAT selector is one class more specific
161
+ // than the base ".flash" rule above (0,3,1 vs 0,2,1) — more specific
162
+ // than "body.active_admin .flash" even though this gem's own class list
163
+ // ties AA's elsewhere. Only ".flash_notice"/".flash_error" get this
164
+ // treatment because those are the only two AA core actually special-
165
+ // cases; every other type here already wins on the base rule alone.
166
+ &.flash_notice,
167
+ &.flash_success {
168
+ background: $prism-bg-card;
169
+ border-bottom-color: $prism-border-color;
170
+ color: $prism-text-heading;
171
+
172
+ .prism-flash-icon {
173
+ color: $prism-color-success;
174
+ }
175
+
176
+ .prism-flash-progress {
177
+ background: $prism-color-success;
178
+ }
119
179
  }
120
180
 
121
181
  &.flash_error,
122
182
  &.flash_alert {
123
- background: $prism-color-danger-light;
124
- border-left-color: $prism-color-danger;
125
- color: darken($prism-color-danger, 10%);
183
+ background: $prism-bg-card;
184
+ border-bottom-color: $prism-border-color;
185
+ color: $prism-text-heading;
186
+
187
+ .prism-flash-icon {
188
+ color: $prism-color-danger;
189
+ }
190
+
191
+ .prism-flash-progress {
192
+ background: $prism-color-danger;
193
+ }
194
+ }
195
+
196
+ &.flash_warning {
197
+ .prism-flash-icon {
198
+ color: $prism-color-warning;
199
+ }
200
+
201
+ .prism-flash-progress {
202
+ background: $prism-color-warning;
203
+ }
204
+ }
205
+
206
+ // Any other flash key (a host's own custom one) falls back here too —
207
+ // flash_messages.rb#flash_icon already defaults to the same :info icon
208
+ // for anything not in FLASH_ICONS, so this default color matches it.
209
+ &.flash_info,
210
+ &:not(.flash_notice):not(.flash_success):not(.flash_error):not(.flash_alert):not(.flash_warning) {
211
+ .prism-flash-icon {
212
+ color: $prism-color-info;
213
+ }
214
+
215
+ .prism-flash-progress {
216
+ background: $prism-color-info;
217
+ }
126
218
  }
127
219
  }
128
220
 
221
+ .prism-flash-icon {
222
+ flex: 0 0 auto;
223
+ margin-top: 1px;
224
+ }
225
+
129
226
  .prism-flash-message {
130
227
  flex: 1 1 auto;
228
+ padding-top: 1px;
131
229
  }
132
230
 
133
231
  .prism-flash-dismiss {
232
+ position: absolute;
233
+ top: 10px;
234
+ right: 10px;
134
235
  flex: 0 0 auto;
135
236
  display: inline-flex;
136
237
  align-items: center;
137
238
  justify-content: center;
138
239
  width: 22px;
139
240
  height: 22px;
140
- margin: -2px -4px -2px 0;
141
241
  padding: 0;
142
242
  border: none;
143
243
  border-radius: $prism-radius-sm;
144
244
  background: transparent !important;
145
- color: inherit !important;
146
- opacity: 0.6;
245
+ color: $prism-text-muted !important;
246
+ opacity: 0.8;
147
247
  cursor: pointer;
148
248
  transition: opacity $prism-transition-fast, background $prism-transition-fast;
149
249
 
150
250
  &:hover {
151
251
  opacity: 1;
152
- background: rgba(0, 0, 0, 0.06) !important;
252
+ background: $prism-bg-page !important;
253
+ }
254
+ }
255
+
256
+ // The countdown bar along the card's bottom edge — only rendered when
257
+ // ActiveAdminPrism::Configuration#flash_auto_dismiss is on (see
258
+ // flash_messages.rb), so its presence already implies a duration to
259
+ // animate against. "--prism-flash-duration" is set inline per-flash
260
+ // (flash_messages.rb) rather than read from js-src/prism.js's own
261
+ // "data-prism-auto-dismiss-ms" (rendered once on the whole ".flashes"
262
+ // wrapper, not per card) — CSS can't read a JS-parsed value, so the same
263
+ // number is rendered twice rather than having JS set the animation
264
+ // itself. scaleX (not animating `width` directly) is what lets the
265
+ // browser run this on the compositor instead of laying out every frame.
266
+ .prism-flash-progress {
267
+ position: absolute;
268
+ left: 0;
269
+ right: 0;
270
+ bottom: 0;
271
+ height: 3px;
272
+ transform-origin: left center;
273
+ animation: prism-flash-countdown var(--prism-flash-duration, 5000ms) linear forwards;
274
+
275
+ // Paused (not hidden) rather than reset to full width — a flash a
276
+ // visitor is actively reading (mouse over it) shouldn't keep silently
277
+ // ticking down and vanish out from under them.
278
+ body.active_admin .flash:hover & {
279
+ animation-play-state: paused;
280
+ }
281
+ }
282
+
283
+ @keyframes prism-flash-countdown {
284
+ from {
285
+ transform: scaleX(1);
286
+ }
287
+
288
+ to {
289
+ transform: scaleX(0);
153
290
  }
154
291
  }
155
292
 
@@ -43,6 +43,76 @@ form input[type="submit"].danger {
43
43
  margin: 0;
44
44
  }
45
45
 
46
+ // #prism-titlebar-actions-row (below) and this button are appended as
47
+ // plain DOM siblings inside .action_items via prismTitlebarActionsRow() in
48
+ // js-src/prism.js, with no whitespace text node between them — inline-flex
49
+ // elements packed that way sit flush with zero gap, so `gap` on the row
50
+ // itself (which only spaces *its own* children) can't create the visual
51
+ // separation on its own. Margin goes on this span itself, not its inner
52
+ // `<a>`, since the rule just above pins that `<a>`'s own margin to 0.
53
+ #title_bar .action_items span.action_item.prism-action-item-new {
54
+ margin-left: 10px;
55
+ }
56
+
57
+ // Shared row for this theme's own title-bar "jump menu" dropdowns —
58
+ // js-src/prism.js's prismTitlebarActionsRow() creates this once and both
59
+ // the consolidated action_items dropdown and the consolidated "More
60
+ // Actions" sidebar-panels dropdown (below) append themselves into it, so
61
+ // they render side by side rather than as two disconnected mechanisms in
62
+ // different parts of the page. The row as a whole (not each dropdown
63
+ // individually) is what a later IIFE aligns to the index table's right
64
+ // edge — see that file for why.
65
+ .prism-titlebar-actions-row {
66
+ display: inline-flex;
67
+ align-items: center;
68
+ gap: 10px;
69
+ }
70
+
71
+ // Consolidated "Actions" jump menu (ActiveAdminPrism::Configuration
72
+ // #action_items_dropdown/#action_items_dropdown_threshold) — see
73
+ // js-src/prism.js, which builds a real Select2-enhanced <select> here and
74
+ // moves the actual action_item elements (their <a>/<button> still fully
75
+ // live, just never shown) into .prism-action-items-holding, clicking the
76
+ // right one when an option is picked. The visible widget is entirely
77
+ // Select2's own generated markup, so none of the button-primary styling
78
+ // above ever reaches it — this only needs to size/align the wrapper
79
+ // itself, not fight any inherited button look.
80
+ .prism-action-items-dropdown {
81
+ display: inline-block;
82
+
83
+ .select2-container {
84
+ min-width: 220px;
85
+ }
86
+ }
87
+
88
+ .prism-action-items-holding {
89
+ display: none;
90
+ }
91
+
92
+ // Consolidated "Sidebar Actions" jump menu (every collapsible sidebar
93
+ // section besides Filters — see scss-src/_panels.scss and
94
+ // lib/active_admin/views/filters_sidebar.rb). Every link/button inside
95
+ // those sections' content is flattened into one option here, same
96
+ // click-and-reset flow as .prism-action-items-dropdown above — the two
97
+ // are styled identically (see scss-src/_select2.scss) since they're the
98
+ // same kind of "jump menu", not a persistent value.
99
+ .prism-sidebar-panel-select-wrapper {
100
+ display: inline-block;
101
+
102
+ .select2-container {
103
+ min-width: 220px;
104
+ }
105
+ }
106
+
107
+ // Same technique as .prism-action-items-holding above: the real
108
+ // links/buttons stay attached to the document (just hidden), rather than
109
+ // being fully removed, so Rails UJS's document-level click delegation
110
+ // (data-method/data-confirm) still reaches them when the dropdown clicks
111
+ // one on the option's behalf.
112
+ .prism-sidebar-panel-holding {
113
+ display: none;
114
+ }
115
+
46
116
  // Secondary / lower-emphasis buttons: batch actions trigger, pagination,
47
117
  // "clear filters", "cancel" form link.
48
118
  .dropdown_menu .dropdown_menu_button,
data/scss-src/_forms.scss CHANGED
@@ -20,6 +20,21 @@ form {
20
20
  font-weight: 600;
21
21
  font-size: 0.9em;
22
22
  }
23
+
24
+ // ActiveAdmin core's form layout floats each field row's <label>
25
+ // (float: left; width: 20% — active_admin's own _forms.scss) as its
26
+ // two-column label/input technique. Without a clearfix, a floated
27
+ // label's height doesn't count toward its own <li>'s box, so a short
28
+ // row right after one whose label this theme deliberately does NOT
29
+ // float (e.g. a boolean field, or `as: :prism_toggle` above) can let
30
+ // the *next* row's own floated label render up alongside the previous
31
+ // row instead of starting its own line below it. Same class of
32
+ // fragility the button row below already had (float has no effect on
33
+ // siblings once contained) — same fix here, kept to a plain clearfix
34
+ // rather than a full flex rewrite of every field row.
35
+ > ol > li {
36
+ overflow: hidden;
37
+ }
23
38
  }
24
39
 
25
40
  input[type="text"],
data/scss-src/_login.scss CHANGED
@@ -71,10 +71,11 @@ body.logged_out:has(.prism-login-brand) {
71
71
  margin: 0 auto;
72
72
  }
73
73
 
74
- .flashes {
75
- width: 100%;
76
- padding: 0 0 10px;
77
- }
74
+ // No login-specific ".flashes" override here (there used to be one,
75
+ // sizing it to the centered login card's own width) — .flashes is a
76
+ // fixed-position toast stack now (scss-src/_base.scss), anchored to the
77
+ // viewport corner rather than laid out inline above the card, so the
78
+ // same global sizing/position applies here unmodified too.
78
79
 
79
80
  #active_admin_content {
80
81
  width: 100%;
@@ -53,12 +53,12 @@
53
53
  }
54
54
 
55
55
  // Reflow #main_content (the table/grid) and #sidebar's own width to match
56
- // whether the collapsible Filters panel is expanded or not driven by a
57
- // "prism-filters-open" class prism.js toggles on <body> in lockstep with
58
- // #filters_sidebar_section's own ".open" (a body class is necessary since
59
- // #main_content is a *sibling* of #sidebar, not a descendant CSS can't
60
- // reach across siblings any other way). Both of ActiveAdmin's own rules
61
- // here are triple-ID-scoped / double-ID-scoped
56
+ // whether ANY collapsible sidebar section is currently expanded —
57
+ // ":has(.prism-collapsible-panel.open)" is what actually drives this
58
+ // (every section collapsed = squeeze to the icon gutter; any one of them
59
+ // open = back to full width), so #sidebar only needs to squeeze while
60
+ // every one of its sections agrees to collapse. Both of ActiveAdmin's own
61
+ // rules here are triple-ID-scoped / double-ID-scoped
62
62
  // (structure/_main_structure.scss), so matching that path (rather than a
63
63
  // flatter selector) is what lets this reliably win regardless of load order.
64
64
  $prism-filters-collapsed-gutter: 72px !default;
@@ -69,7 +69,7 @@ $prism-filters-collapsed-gutter: 72px !default;
69
69
  width 280ms cubic-bezier(0.4, 0, 0.2, 1), margin-left 280ms cubic-bezier(0.4, 0, 0.2, 1);
70
70
  }
71
71
 
72
- body:has(.prism-collapsible-panel):not(.prism-filters-open) {
72
+ body:has(.prism-collapsible-panel):not(:has(.prism-collapsible-panel.open)) {
73
73
  #active_admin_content:not(.without_sidebar) #main_content_wrapper #main_content {
74
74
  margin-right: $prism-filters-collapsed-gutter;
75
75
  }
@@ -80,14 +80,17 @@ body:has(.prism-collapsible-panel):not(.prism-filters-open) {
80
80
  }
81
81
  }
82
82
 
83
- // "Filters" sidebar panel — collapses to a single icon button by default
83
+ // Every sidebar section — collapses to a single icon button by default
84
84
  // (ActiveAdminPrism::Configuration#collapsible_filters), expanding to
85
- // the full form on click (see prism.js's filters-collapse handler, and
86
- // lib/active_admin/views/filters_sidebar.rb for the icon + label-span
87
- // markup this targets). AA gives this specific SidebarSection a stable id
88
- // ("#{name}_sidebar_section" => "filters_sidebar_section"), so this is
89
- // scoped to it alone any other panel (dashboard panels, custom sidebar
90
- // sections a host adds) is untouched.
85
+ // its full content on click (see prism.js's collapsible-panel handler,
86
+ // and lib/active_admin/views/filters_sidebar.rb for the icon + label-span
87
+ // markup this targets, and for how a section picks its own icon). Used to
88
+ // be scoped to the "Filters" section alone (AA gives it a stable id,
89
+ // "filters_sidebar_section")generalized to every section, including a
90
+ // host's own custom `sidebar "Title" do ... end` block, since one left
91
+ // out of this treatment still rendered at its full width/height inside
92
+ // the #sidebar column's own squeeze above instead of collapsing alongside
93
+ // it, wrapping or overflowing instead.
91
94
  .prism-collapsible-panel {
92
95
  // Collapsed (default): no floating white card — just the icon button —
93
96
  // so it doesn't read as a stray tiny panel. Restored in full under
@@ -204,6 +207,17 @@ body:has(.prism-collapsible-panel):not(.prism-filters-open) {
204
207
  }
205
208
  }
206
209
 
210
+ // The consolidated "Sidebar Actions" dropdown itself
211
+ // (.prism-sidebar-panel-select-wrapper + .prism-sidebar-panel-holding)
212
+ // lives in scss-src/_buttons.scss, next to .prism-action-items-dropdown —
213
+ // both render in the title bar's shared row (js-src/prism.js's
214
+ // prismTitlebarActionsRow), not here in #sidebar at all. Filters is
215
+ // excluded from this dropdown entirely and keeps living here, unchanged,
216
+ // with its own plain icon button — every *other* collapsible section has
217
+ // its links flattened into that dropdown and the section itself discarded
218
+ // outright (see buildOtherSectionsDropdown in that file), so #sidebar
219
+ // never has to make room for more than Filters alone.
220
+
207
221
  // Backstop for ActiveAdminPrism::Configuration#collapsible_filters =
208
222
  // false: always show the full panel, matching ActiveAdmin's own default
209
223
  // (prism.js also skips attaching the click handler in this case, and
@@ -236,6 +250,167 @@ body.prism-filters-collapsible-disabled .prism-collapsible-panel {
236
250
  }
237
251
  }
238
252
 
253
+ // AA core's own ".table_tools" (active_admin/views/pages/index.rb,
254
+ // styled by its components/_table_tools.scss) is a clearfixed block whose
255
+ // children (the Batch Actions dropdown, scope tabs) float left. Flexbox
256
+ // is what puts .prism-active-filters-bar below on the same row — floats
257
+ // have no effect on flex items regardless of specificity/load order, same
258
+ // rationale as the form actions row in _forms.scss.
259
+ .table_tools {
260
+ display: flex;
261
+ flex-wrap: wrap;
262
+ align-items: center;
263
+ // row-gap only (not the shorthand "gap", i.e. no column-gap) —
264
+ // .prism-active-filters-bar below is pushed to this row's far end via
265
+ // `margin-left: auto`, not `justify-content`, and a nonzero column-gap
266
+ // on the same axis as that auto margin gets double-counted by the auto
267
+ // margin's own free-space math, leaving exactly one gap's worth of
268
+ // unclaimed space *after* the last item instead of before it — the bar
269
+ // fell short of the table's own right edge by exactly 12px. row-gap
270
+ // still spaces .table_tools_actions from the bar vertically if they
271
+ // wrap onto separate lines on a narrow viewport, without that bug.
272
+ row-gap: 12px;
273
+ }
274
+
275
+ // New wrapper (not AA's own markup) around whatever .table_tools would
276
+ // have rendered directly before — see
277
+ // lib/active_admin/views/active_filters_bar.rb#build_table_tools. Only
278
+ // present when any_table_tools? is true.
279
+ .table_tools_actions {
280
+ display: flex;
281
+ flex-wrap: wrap;
282
+ align-items: center;
283
+ gap: 10px;
284
+ }
285
+
286
+ // Compact "current scope + active filters" bar, rendered beside the Batch
287
+ // Actions button/scope tabs instead of ActiveAdmin core's own
288
+ // #sidebar-based "Search status" panel — see
289
+ // lib/active_admin/views/active_filters_bar.rb (Ruby side,
290
+ // ActiveAdminPrism::Configuration#active_filters_bar) for why: that
291
+ // sidebar panel is a child of #sidebar, so it gets squeezed down to the
292
+ // same 72px icon gutter as the Filters form whenever collapsible_filters
293
+ // has it collapsed, and its content (one "field contains value" sentence
294
+ // per active filter) has nowhere to fit in 72px and overflows out over
295
+ // the table instead of shrinking cleanly. This reuses that same Ruby
296
+ // component's markup/i18n (ActiveAdmin::Views::ActiveFiltersSidebarContent)
297
+ // wholesale — restyled here as a single horizontal row of pill tags
298
+ // instead of a vertical sidebar list, rather than reimplemented.
299
+ //
300
+ // Given its own tinted background/border (the theme's primary color,
301
+ // same tokens as an active nav item or a focused input's ring) rather
302
+ // than a plain card, so it reads as a distinct, "something is filtered"
303
+ // signal at a glance next to the neutral Batch Actions button beside it —
304
+ // not just another gray panel a visitor could mistake for chrome.
305
+ .prism-active-filters-bar {
306
+ // inline-flex (not the plain block a bare `div` defaults to) sizes this
307
+ // to its own content instead of stretching to fill .table_tools's
308
+ // remaining width. margin-left: auto pushes it to the row's far end
309
+ // regardless of whether .table_tools_actions exists beside it (only
310
+ // rendered `if any_table_tools?` — a resource with filters active but
311
+ // no batch actions/scopes has nothing else in this row at all).
312
+ display: inline-flex;
313
+ max-width: 100%;
314
+ margin-left: auto;
315
+ padding: 8px 14px;
316
+ background: $prism-color-primary-light;
317
+ border: 1px solid rgba($prism-color-primary, 0.3);
318
+ border-left: 3px solid $prism-color-primary;
319
+ border-radius: $prism-radius;
320
+ font-size: 0.85em;
321
+ // Clicking it opens the Filters panel (js-src/prism.js) — a plain
322
+ // hover/focus cue rather than restyling the whole card on hover, so it
323
+ // doesn't fight with the already-deliberate "eye-catching" tinted look.
324
+ cursor: pointer;
325
+ transition: box-shadow $prism-transition-fast;
326
+
327
+ &:hover,
328
+ &:focus-visible {
329
+ box-shadow: 0 0 0 3px rgba($prism-color-primary, 0.15);
330
+ }
331
+
332
+ &:focus-visible {
333
+ outline: none;
334
+ }
335
+
336
+ // The builder_method wraps ActiveFiltersSidebarContent's own output in a
337
+ // ".active_filters_sidebar_content" div (Arbre::Component's own
338
+ // convention) — this, not .prism-active-filters-bar itself, is the
339
+ // direct parent of the "Scope:"/"Current filters:" markup below.
340
+ .active_filters_sidebar_content {
341
+ display: flex;
342
+ flex-wrap: wrap;
343
+ align-items: center;
344
+ gap: 8px 14px;
345
+ }
346
+
347
+ // ActiveFiltersSidebarContent#scope_block's "Scope:" <h4> (only present
348
+ // when a scope is active) + its value <b class="current_scope_name">.
349
+ > .active_filters_sidebar_content > h4 {
350
+ margin: 0;
351
+ font-size: 1em;
352
+ font-weight: 700;
353
+ text-transform: uppercase;
354
+ letter-spacing: 0.04em;
355
+ color: $prism-color-primary-dark;
356
+ }
357
+
358
+ .current_scope_name {
359
+ color: $prism-color-primary-dark;
360
+ font-weight: 700;
361
+ }
362
+
363
+ // #filters_list wraps its own "Current filters:" <h4> + <ul> in a
364
+ // `div style="margin-top: 10px"`, sized for stacking under the scope
365
+ // line in a vertical sidebar — reset that now that everything sits
366
+ // inline in the same row instead.
367
+ > .active_filters_sidebar_content > div {
368
+ display: flex;
369
+ flex-wrap: wrap;
370
+ align-items: center;
371
+ gap: 8px 14px;
372
+ margin-top: 0 !important;
373
+
374
+ > h4 {
375
+ margin: 0 !important;
376
+ font-size: 1em;
377
+ font-weight: 700;
378
+ text-transform: uppercase;
379
+ letter-spacing: 0.04em;
380
+ color: $prism-color-primary-dark;
381
+ }
382
+
383
+ > ul {
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ gap: 6px;
387
+ margin: 0;
388
+ padding: 0;
389
+ list-style: none;
390
+
391
+ li {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ gap: 4px;
395
+ padding: 4px 10px;
396
+ border-radius: $prism-radius-pill;
397
+ background: $prism-bg-card;
398
+ box-shadow: 0 1px 2px rgba(16, 24, 40, 0.06);
399
+ line-height: 1.4;
400
+
401
+ span {
402
+ color: $prism-text-muted;
403
+ }
404
+
405
+ b {
406
+ font-weight: 700;
407
+ color: $prism-color-primary-dark;
408
+ }
409
+ }
410
+ }
411
+ }
412
+ }
413
+
239
414
  .blank_slate_container {
240
415
  .blank_slate {
241
416
  background: $prism-bg-card;