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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +159 -0
- data/INTEGRATION.md +274 -35
- data/README.md +5 -1
- data/app/assets/javascripts/active_admin_prism/prism.js +1 -1
- data/app/assets/stylesheets/active_admin_prism/prism.css +1 -1
- data/app/views/layouts/active_admin_logged_out.html.erb +76 -0
- data/js-src/prism.js +565 -27
- data/lib/active_admin/views/action_items.rb +32 -0
- data/lib/active_admin/views/active_filters_bar.rb +94 -0
- data/lib/active_admin/views/filters_sidebar.rb +42 -13
- data/lib/active_admin/views/flash_messages.rb +40 -22
- data/lib/active_admin/views/prism_sidebar.rb +39 -6
- data/lib/active_admin/views/title_bar.rb +27 -0
- data/lib/active_admin_prism/configuration.rb +80 -0
- data/lib/active_admin_prism/version.rb +1 -1
- data/lib/active_admin_prism.rb +3 -0
- data/lib/prism_icons.rb +47 -1
- data/scss-src/_base.scss +161 -24
- data/scss-src/_buttons.scss +70 -0
- data/scss-src/_forms.scss +15 -0
- data/scss-src/_login.scss +5 -4
- data/scss-src/_panels.scss +189 -14
- data/scss-src/_select2.scss +85 -12
- data/scss-src/_sidebar.scss +145 -4
- data/scss-src/_tables.scss +102 -4
- data/scss-src/_variables.scss +3 -0
- metadata +7 -6
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
|
|
61
|
-
//
|
|
62
|
-
//
|
|
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
|
-
|
|
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:
|
|
87
|
-
background: $prism-bg-
|
|
119
|
+
gap: 10px;
|
|
120
|
+
background: $prism-bg-card;
|
|
88
121
|
border: 1px solid $prism-border-color;
|
|
89
|
-
border-
|
|
90
|
-
|
|
91
|
-
|
|
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.
|
|
129
|
+
font-size: 0.88em;
|
|
95
130
|
font-weight: 600;
|
|
96
131
|
line-height: 1.4;
|
|
97
|
-
padding
|
|
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:
|
|
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:
|
|
149
|
+
transform: translateX(24px) scale(0.98);
|
|
113
150
|
}
|
|
114
151
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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-
|
|
124
|
-
border-
|
|
125
|
-
color:
|
|
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:
|
|
146
|
-
opacity: 0.
|
|
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:
|
|
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
|
|
data/scss-src/_buttons.scss
CHANGED
|
@@ -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
|
-
|
|
76
|
-
|
|
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%;
|
data/scss-src/_panels.scss
CHANGED
|
@@ -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
|
|
57
|
-
// "prism-
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
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-
|
|
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
|
-
//
|
|
83
|
+
// Every sidebar section — collapses to a single icon button by default
|
|
84
84
|
// (ActiveAdminPrism::Configuration#collapsible_filters), expanding to
|
|
85
|
-
//
|
|
86
|
-
// lib/active_admin/views/filters_sidebar.rb for the icon + label-span
|
|
87
|
-
// markup this targets
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
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;
|