PluginProbe
Hash Form – Drag & Drop Form Builder / trunk
Hash Form – Drag & Drop Form Builder vtrunk
1.4.4 1.4.3 1.4.2 1.4.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.6.1 1.2.7 1.2.8 1.2.9 1.3.0 All 47 releases
hash-form / css / admin-settings.css

admin-settings.css in Hash Form – Drag & Drop Form Builder trunk, at css/admin-settings.css

1,158 lines 31.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* Full screen, the way the form builder is.
2 *
3 * Same mechanism: the screen is laid over the whole viewport, which is what
4 * #hf-wrap does there. The admin menu and toolbar end up behind it rather than
5 * hidden, which comes to the same thing on screen.
6 *
7 * #wpcontent carries it rather than a wrapper of the plugin's own, because
8 * this screen's bar is printed on in_admin_header and so lands between
9 * #wpcontent and #wpbody - the bar and the panel are only siblings. The form
10 * builder has no such problem: its header is inside #hf-wrap.
11 *
12 * The form builder additionally sets the block editor's is-fullscreen-mode.
13 * Not here: that class arrives with wp-edit-post and its dependencies, and all
14 * it would do on this screen is hide two elements already covered over. This
15 * panel's rows and fields have never been under that sheet. Holding the page
16 * behind still is the one thing it was really buying, and the overflow below
17 * does that.
18 */
19 body.hf-style-builder-screen {
20 overflow: hidden;
21 }
22
23 body.hf-style-builder-screen #wpcontent {
24 /* The ground behind the panel, not a plugin surface: the tokens are scoped
25 to the plugin's own wrappers and this is wp-admin's element. */
26 background: #fff;
27 bottom: 0;
28 display: flex;
29 flex-direction: column;
30 left: 0;
31 margin: 0;
32 overflow: hidden;
33 padding: 0;
34 position: fixed;
35 right: 0;
36 top: 0;
37 z-index: 99999;
38 }
39
40 /*
41 * The admin bar goes, because on this screen it cannot be covered.
42 *
43 * The form builder leaves it in place and paints over it: #hf-wrap is fixed
44 * across the viewport with the same z-index the bar has and comes later in the
45 * document, so it wins the tie and the bar is simply never seen.
46 *
47 * That does not transfer here. wp-admin renders the bar on in_admin_header,
48 * which puts it *inside* #wpcontent - and #wpcontent is this screen's fixed
49 * full-viewport element, so it is a stacking context the bar sits within. No
50 * z-index on the parent can lift it over its own child, and the bar drew across
51 * the top of the header: the template name and the actions beside it lost their
52 * first 32 pixels.
53 */
54 body.hf-style-builder-screen #wpadminbar {
55 display: none;
56 }
57
58 /* The bar keeps its own height; everything under it takes the rest. */
59 body.hf-style-builder-screen .hf-list-header {
60 flex: 0 0 auto;
61 }
62
63 /* list-screens.css pulls the bar left by 20px and gives it that width back, to
64 cancel the padding wp-admin puts on #wpcontent. This screen takes that padding
65 off, so the correction had nothing left to correct: the bar hung 20px off the
66 left of the viewport and the actions on its right ran off the other edge. */
67 body.hf-style-builder-screen #wpcontent > .hf-list-header {
68 margin-left: 0;
69 width: 100%;
70 }
71
72 /* Every wrapper between the screen and the panel passes the height straight
73 through.
74 *
75 * Columns, not rows. #wpbody-content is not ours and does not hold the panel
76 * alone - the screen meta, the screen options tabs and any notice are printed
77 * into it first, and #wpbody closes with a clearing div - so a row would stand
78 * them beside the builder rather than above it.
79 *
80 * min-height:0 on each, because a flex item will not shrink below its content
81 * by default. Without it the sidebar sets the height of the screen and pushes
82 * the save bar off the bottom instead of scrolling inside itself.
83 */
84 body.hf-style-builder-screen #wpbody,
85 body.hf-style-builder-screen #wpbody-content,
86 body.hf-style-builder-screen .hf-style-builder,
87 body.hf-style-builder-screen .hf-style-panel {
88 display: flex;
89 flex: 1 1 auto;
90 flex-direction: column;
91 margin: 0;
92 min-height: 0;
93 padding: 0;
94 width: auto;
95 }
96
97 /* Only the height is this screen's business. The ground behind the columns, the
98 gutter around them and the gap between them are the form builder's, and come
99 from .hf-content .hf-body in builder.css - overriding them here was what left
100 the sidebar and the preview flush against the edges of the screen with no
101 surface under them. */
102 .hf-style-panel .hf-body {
103 flex: 1 1 auto;
104 height: auto;
105 margin: 0;
106 min-height: 0;
107 }
108
109 /* The screen meta and its toggles are the post editor's chrome, which is what
110 this screen was built to get out of the way; left in, they hold a strip of
111 empty height above the panel. */
112 body.hf-style-builder-screen #screen-meta,
113 body.hf-style-builder-screen #screen-meta-links {
114 display: none;
115 }
116
117 /* The save bar is the last row rather than something stuck over the content,
118 so it needs no sticky positioning and no pulling back out of a padding that
119 is no longer there. */
120 .hf-style-panel .hf-footer {
121 align-items: center;
122 flex: 0 0 auto;
123 gap: 20px;
124 }
125
126 body.hf-style-builder-screen .notice{
127 display: none !important;
128 }
129
130 /* Nothing of the admin's own chrome is on screen, and a hidden footer that
131 still reserved its height left a gap under the save bar. */
132 .hf-style-builder-screen #wpfooter {
133 display: none;
134 }
135
136 /* Settings Metabox */
137 #hashform-styles-metabox .postbox-header {
138 display: none;
139 }
140
141 #hashform-styles-metabox .inside {
142 padding: 0;
143 margin: 0;
144 }
145
146 /* Style groups
147 *
148 * Fifteen of these stack down the sidebar, and they were pale blue bars with
149 * ALL CAPS bold labels — a colour and a treatment used nowhere else in the
150 * plugin. Same accordion as the per-form settings panels now, so a style
151 * template is built in the same furniture a form is configured in. */
152 .hf-style-panel .hf-settings-heading {
153 align-items: center;
154 background: var(--hf-surface, #fff);
155 border: 1px solid var(--hf-border, #e2e5ea);
156 border-radius: var(--hf-radius, 8px);
157 color: var(--hf-text, #1e2327);
158 cursor: pointer;
159 display: flex;
160 font-size: var(--hf-font-md, 14px);
161 font-weight: 600;
162 justify-content: space-between;
163 letter-spacing: 0;
164 margin: 0 0 var(--hf-space-2, 8px);
165 padding: var(--hf-space-3, 12px) var(--hf-space-4, 16px);
166 text-transform: none;
167 transition: background-color var(--hf-transition, .15s ease), border-color var(--hf-transition, .15s ease);
168 }
169
170 .hf-style-panel .hf-settings-heading:hover {
171 background: var(--hf-surface-sunken, #fafbfc);
172 border-color: var(--hf-border-strong, #d3d8e0);
173 }
174
175 /* Open: the heading and its panel read as one block, so the seam between
176 them is closed up. */
177 .hf-style-panel .hf-settings-heading.hf-active {
178 border-bottom-color: transparent;
179 border-bottom-left-radius: 0;
180 border-bottom-right-radius: 0;
181 margin-bottom: 0;
182 }
183
184 .hf-style-panel .hf-settings-heading .mdi {
185 color: var(--hf-text-faint, #8c9196);
186 font-size: 20px;
187 line-height: 1;
188 transition: transform var(--hf-transition-slow, .25s ease);
189 }
190
191 .hf-style-panel .hf-settings-heading.hf-active .mdi {
192 color: var(--hf-accent, #dd823b);
193 transform: rotate(180deg);
194 }
195
196 .hf-style-panel .hf-form-settings {
197 background: var(--hf-surface, #fff);
198 border: 1px solid var(--hf-border, #e2e5ea);
199 border-radius: 0 0 var(--hf-radius, 8px) var(--hf-radius, 8px);
200 border-top: 0;
201 margin: 0 0 var(--hf-space-2, 8px);
202 padding: var(--hf-space-4, 16px);
203 }
204
205 .hf-form-settings {
206 display: none;
207 }
208
209 .hf-settings-row {
210 margin: 0 0 15px;
211 }
212
213 .hf-settings-row select,
214 .hf-settings-row input[type="text"],
215 .hf-settings-row input[type="email"] {
216 width: 100%;
217 }
218
219 /* Was bold, which put a setting's label at the same weight as the group
220 headings above it and left the sub-labels beneath looking like a third
221 tier. 500 sits where the rest of the plugin's labels sit. */
222 .hf-settings-row .hf-setting-label {
223 color: var(--hf-text, #1e2327);
224 display: block;
225 font-size: var(--hf-font-base, 13px);
226 font-weight: 500;
227 margin: 0 0 var(--hf-space-2, 8px);
228 }
229
230 .hf-setting-fields p.hf-desc {
231 margin: 8px 0 0;
232 font-size: 13px;
233 font-style: italic;
234 }
235
236 .hf-setting-fields select[multiple] {
237 width: 400px;
238 }
239
240 .hf-setting-fields input[type="number"] {
241 width: 80px;
242 }
243
244 .hf-style-form-panel .hf-form-wrap {
245 padding: 0;
246 width: 100%;
247 max-width: none;
248 height: 100%;
249 }
250
251 /* Tab */
252 .hf-tab-container {
253 margin: 0 0 10px;
254 }
255
256 .hf-tab-container .hf-setting-tab {
257 display: flex;
258 margin: 0;
259 padding: 0
260 }
261
262 .hf-setting-tab-panel {
263 border: 1px solid var(--hf-border, #e2e5ea);
264 border-radius: 0 0 var(--hf-radius-sm, 4px) var(--hf-radius-sm, 4px);
265 border-top: 0;
266 margin: 0;
267 padding: var(--hf-space-4, 16px);
268 }
269
270 .hf-setting-tab-panel .hf-settings-row {
271 margin: 0 0 10px;
272 }
273
274 /* Was a solid blue block with white ALL CAPS beside a grey one — a two tone
275 pair that matched nothing else. A segmented control on the tokens. */
276 .hf-tab-container .hf-setting-tab {
277 background: var(--hf-surface-sunken, #fafbfc);
278 border: 1px solid var(--hf-border, #e2e5ea);
279 border-radius: var(--hf-radius-sm, 4px);
280 gap: 2px;
281 padding: 2px;
282 }
283
284 .hf-setting-tab li {
285 background: none;
286 border-radius: 3px;
287 color: var(--hf-text-muted, #646970);
288 cursor: pointer;
289 flex-grow: 1;
290 font-size: var(--hf-font-sm, 12px);
291 font-weight: 500;
292 margin: 0;
293 padding: 6px 12px;
294 text-align: center;
295 text-transform: none;
296 transition: background-color var(--hf-transition, .15s ease), color var(--hf-transition, .15s ease);
297 }
298
299 .hf-setting-tab li:hover {
300 background: rgba(16, 24, 40, .05);
301 color: var(--hf-text, #1e2327);
302 }
303
304 .hf-setting-tab li.hf-tab-active {
305 background: var(--hf-surface, #fff);
306 box-shadow: var(--hf-shadow-sm, 0 1px 2px rgba(16, 24, 40, .05));
307 color: var(--hf-accent-text, #a3591b);
308 }
309
310 /* Icon Chooser
311 *
312 * Structure is fixed by admin-settings.js: .hf-selected-icon, then its
313 * sibling .hf-icon-box, then the hidden .hf-icon input. The script also
314 * slideToggles the box and show/hides individual <li> while filtering, so the
315 * list must not depend on its own display value — the icons lay themselves
316 * out as inline-flex items, which survives jQuery setting display:block on
317 * the <ul> during fadeIn.
318 */
319 .hf-icon-box-wrap {
320 max-width: 380px;
321 position: relative;
322 width: 100%;
323 }
324
325 /* The trigger. It used to be a 60px grey square with the caret hung off its
326 right edge by a negative offset, which read as a broken input rather than
327 a control, and showed nothing at all until an icon had been chosen. */
328 .hf-icon-box-wrap .hf-selected-icon {
329 align-items: center;
330 background: #fff;
331 border: 1px solid var(--hf-border-strong, #d3d8e0);
332 border-radius: var(--hf-radius-sm, 4px);
333 cursor: pointer;
334 display: flex;
335 gap: var(--hf-space-2, 8px);
336 min-height: 36px;
337 padding: 0 var(--hf-space-2, 8px) 0 var(--hf-space-3, 12px);
338 transition: border-color var(--hf-transition, .15s ease), box-shadow var(--hf-transition, .15s ease);
339 width: 100%;
340 }
341
342 .hf-icon-box-wrap .hf-selected-icon:hover {
343 border-color: var(--hf-text-faint, #8c9196);
344 }
345
346 .hf-icon-box-wrap .hf-selected-icon:focus-visible {
347 border-color: var(--hf-accent, #2271b1);
348 box-shadow: 0 0 0 3px rgba(34, 113, 177, .15);
349 outline: 0;
350 }
351
352 .hf-icon-box-wrap .hf-selected-icon > i {
353 color: var(--hf-text, #1e2327);
354 font-size: 18px;
355 line-height: 1;
356 }
357
358 /* Nothing chosen yet: the <i> carries no class, so it occupies no space and
359 the prompt shows in its place. */
360 .hf-icon-box-wrap .hf-icon-placeholder {
361 color: var(--hf-text-faint, #8c9196);
362 font-size: var(--hf-font-base, 13px);
363 }
364
365 .hf-icon-box-wrap .hf-selected-icon:not(:has(> i[class=""])) .hf-icon-placeholder {
366 display: none;
367 }
368
369 .hf-icon-box-wrap .hf-icon-caret {
370 color: var(--hf-text-faint, #8c9196);
371 font-size: 18px;
372 line-height: 1;
373 margin-left: auto;
374 }
375
376 /* The panel. It was a block in the flow, so opening it pushed every field
377 below it down the page. */
378 .hf-icon-box-wrap .hf-icon-box {
379 background: #fff;
380 border: 1px solid var(--hf-border, #e2e5ea);
381 border-radius: var(--hf-radius, 8px);
382 box-shadow: var(--hf-shadow-lg, 0 12px 28px -8px rgba(16, 24, 40, .18), 0 4px 10px -4px rgba(16, 24, 40, .1));
383 display: none;
384 left: 0;
385 overflow: hidden;
386 position: absolute;
387 right: 0;
388 top: calc(100% + 6px);
389 z-index: 20;
390 }
391
392 .hf-icon-box-wrap .hf-icon-search {
393 align-items: center;
394 background: var(--hf-surface-sunken, #fafbfc);
395 border: 0;
396 border-bottom: 1px solid var(--hf-border, #e2e5ea);
397 display: flex;
398 gap: var(--hf-space-2, 8px);
399 padding: var(--hf-space-2, 8px);
400 }
401
402 .hf-content .hf-icon-box-wrap .hf-icon-search select,
403 .hf-content .hf-icon-box-wrap .hf-icon-search input {
404 background-color: #fff;
405 border: 1px solid var(--hf-border-strong, #d3d8e0);
406 border-radius: var(--hf-radius-sm, 4px);
407 font-size: var(--hf-font-sm, 12px);
408 margin: 0;
409 min-height: 30px;
410 padding: 2px var(--hf-space-2, 8px);
411 }
412
413 /* The family names are long enough that 150px clipped them under the arrow. */
414 .hf-content .hf-icon-box-wrap .hf-icon-search select {
415 flex: 0 0 46%;
416 padding-right: 24px;
417 width: auto;
418 }
419
420 .hf-content .hf-icon-box-wrap .hf-icon-search input {
421 flex: 1 1 auto;
422 min-width: 0;
423 width: auto;
424 }
425
426 .hf-icon-box-wrap .hf-icon-list {
427 background: #fff;
428 border: 0;
429 display: none;
430 margin: 0;
431 max-height: 232px;
432 overflow-y: auto;
433 padding: var(--hf-space-2, 8px);
434 /* The scrollbar was hidden outright, so a list of two thousand icons gave
435 no sign that there was anything below the fold. */
436 scrollbar-width: thin;
437 }
438
439 .hf-icon-box-wrap .hf-icon-list::-webkit-scrollbar {
440 width: 8px;
441 }
442
443 .hf-icon-box-wrap .hf-icon-list::-webkit-scrollbar-thumb {
444 background: var(--hf-border-strong, #d3d8e0);
445 border-radius: var(--hf-radius-pill, 999px);
446 }
447
448 .hf-icon-box-wrap .hf-icon-list:first-of-type {
449 display: block;
450 }
451
452 /* inline-flex, not float: see the note at the top. */
453 .hf-icon-box-wrap .hf-icon-list li {
454 align-items: center;
455 border: 0;
456 border-radius: var(--hf-radius-sm, 4px);
457 color: var(--hf-text-muted, #646970);
458 cursor: pointer;
459 display: inline-flex;
460 font-size: 16px;
461 height: 32px;
462 justify-content: center;
463 margin: 1px;
464 transition: background-color var(--hf-transition, .15s ease), color var(--hf-transition, .15s ease);
465 width: 32px;
466 }
467
468 /* Scaling by 1.3 on hover made an icon overlap its neighbours, so the one
469 under the pointer was the hardest to see. */
470 .hf-icon-box-wrap .hf-icon-list li:hover {
471 background: var(--hf-accent-soft, #f0f6fc);
472 border: 0;
473 color: var(--hf-accent-text, #a3591b);
474 transform: none;
475 }
476
477 .hf-icon-box-wrap .hf-icon-list li.icon-active {
478 background: var(--hf-accent, #2271b1);
479 border: 0;
480 color: #fff;
481 }
482
483 /* Image Uploader
484 *
485 * Used by the custom open/close icons on the Popup Display panel. The script
486 * empties .hf-custom-menu-image-icon and clears .hf-upload-background-url on
487 * remove, and appends an <img> on upload, so "is something set?" is simply
488 * whether that box has an <img> in it.
489 */
490 .hf-icon-image-uploader {
491 align-items: center;
492 display: flex;
493 gap: var(--hf-space-2, 8px);
494 }
495
496 /* display:contents so the tile and Remove become items of the row above,
497 which lets Remove sit after the Upload button rather than wrapping
498 underneath the thumbnail. */
499 .hf-custom-img-icon-btn {
500 display: contents;
501 margin: 0;
502 position: relative;
503 width: auto;
504 }
505
506 .hf-custom-menu-image-icon {
507 align-items: center;
508 background: var(--hf-surface-sunken, #fafbfc);
509 border: 1px dashed var(--hf-border-strong, #d3d8e0);
510 border-radius: var(--hf-radius-sm, 4px);
511 display: flex;
512 height: 40px;
513 justify-content: center;
514 overflow: hidden;
515 width: 40px;
516 }
517
518 /* An empty tile said nothing; now it reads as somewhere an image goes.
519 :not(:has(img)) rather than :empty — the template leaves whitespace inside
520 the box, so it is never truly empty on first render. */
521 .hf-custom-menu-image-icon:not(:has(img)):before {
522 color: var(--hf-text-faint, #8c9196);
523 content: "\F0976";
524 font-family: "Material Design Icons";
525 font-size: 20px;
526 line-height: 1;
527 }
528
529 .hf-custom-menu-image-icon img {
530 height: 100%;
531 object-fit: contain;
532 width: 100%;
533 }
534
535 /* The upload control was an unstyled wp .button beside a red circle. */
536 .hf-content .hf-icon-image-uploader .hf-image-upload {
537 order: 2;
538 background: #fff;
539 border: 1px solid var(--hf-border-strong, #d3d8e0);
540 border-radius: var(--hf-radius-sm, 4px);
541 box-shadow: none;
542 color: var(--hf-text, #1e2327);
543 cursor: pointer;
544 font-size: var(--hf-font-base, 13px);
545 font-weight: 500;
546 line-height: inherit;
547 margin: 0;
548 padding: 9px var(--hf-space-3, 12px);
549 text-shadow: none;
550 transition: background-color var(--hf-transition, .15s ease), border-color var(--hf-transition, .15s ease);
551 }
552
553 .hf-content .hf-icon-image-uploader .hf-image-upload:hover {
554 background: var(--hf-surface-sunken, #fafbfc);
555 border-color: var(--hf-text-faint, #8c9196);
556 }
557
558 /* Was a 20px red circle with its label pushed off-screen by text-indent,
559 sitting over the corner of the thumbnail. */
560 .hf-image-remove {
561 background: none;
562 border-radius: var(--hf-radius-sm, 4px);
563 color: var(--hf-text-faint, #8c9196);
564 cursor: pointer;
565 font-size: var(--hf-font-sm, 12px);
566 height: auto;
567 opacity: 1;
568 padding: 4px var(--hf-space-2, 8px);
569 position: static;
570 text-indent: 0;
571 transition: background-color var(--hf-transition, .15s ease), color var(--hf-transition, .15s ease);
572 width: auto;
573 }
574
575 .hf-image-remove:hover {
576 background: #fdf2f2;
577 color: var(--hf-danger, #d3383c);
578 opacity: 1;
579 }
580
581 .hf-image-remove:before,
582 .hf-image-remove:after {
583 content: none;
584 }
585
586 /* After the Upload button rather than before it. */
587 .hf-image-remove {
588 order: 3;
589 }
590
591 /* Nothing to remove until an image has actually been chosen. */
592 .hf-icon-image-uploader:not(:has(.hf-custom-menu-image-icon img)) .hf-image-remove {
593 display: none;
594 }
595
596 /* Typography */
597 .hf-typography-fields {
598 display: grid;
599 grid-template-columns: repeat(2, 1fr);
600 gap: 10px;
601 margin: 10px 0 0;
602 }
603
604 .hf-typography-fields li {
605 margin: 0;
606 padding: 0;
607 }
608
609 .hf-typography-fields li.hf-typography-font-size-field,
610 .hf-typography-fields li.hf-typography-line-height-field,
611 .hf-typography-fields li.hf-typography-letter-spacing-field,
612 .hf-typography-fields li.hf-typography-color-field {
613 grid-column: span 2;
614 }
615
616 .hf-typography-fields li > label {
617 color: var(--hf-text-muted, #646970);
618 display: block;
619 font-size: var(--hf-font-sm, 12px);
620 margin-bottom: var(--hf-space-1, 4px);
621 }
622
623 /* The typography selects came out shorter than every other control on the
624 screen, so a row of them sat oddly against the sliders and number boxes
625 beside them. */
626 .hf-style-sidebar .hf-typography-fields select,
627 .hf-style-sidebar .hf-settings-row select {
628 min-height: 34px;
629 }
630
631 /* Slider rows: the number box, its unit and the track on one baseline. The
632 unit used to hang outside the field entirely. */
633 /* Slider takes the room that is left; the number box and its unit are fixed
634 and stay inside the panel. The unit used to sit a pixel or two past the
635 panel edge. */
636 .hf-style-sidebar .hf-range-slider-wrap {
637 align-items: center;
638 display: flex;
639 }
640
641 .hf-style-sidebar .hf-range-slider-wrap .hf-range-slider {
642 /* basis 0, so the track takes exactly what is left after the number box
643 and its unit rather than starting from its own width and shrinking
644 proportionally, which left the unit hanging off the panel. */
645 flex: 1 1 0;
646 min-width: 0;
647 }
648
649 .hf-style-sidebar .hf-range-slider-wrap .hf-range-input-selector {
650 flex: 0 0 auto;
651 }
652
653 /* The unit is absolutely positioned at left:100% of the track, which put it
654 outside the row — fine when the row was narrower than the panel, but it
655 now fills the panel and the unit landed past the edge. In flow instead. */
656 .hf-style-sidebar .hf-settings-row .hf-range-slider-wrap .hf-range-input-unit {
657 color: var(--hf-text-faint, #8c9196);
658 font-size: var(--hf-font-sm, 12px);
659 left: auto;
660 margin-left: var(--hf-space-1, 4px);
661 position: static;
662 top: auto;
663 transform: none;
664 }
665
666 .hf-style-sidebar .hf-settings-row .hf-range-slider-wrap .hf-range-slider + .hf-range-input-selector {
667 min-height: 32px;
668 }
669
670 /* Toggle Button
671 *
672 * Red for off and green for on read as an error state rather than a setting:
673 * a switch someone had never touched looked like something was wrong. Grey
674 * for off, accent for on — the same switch as the Pro Modules screen, which
675 * had already been corrected in isolation while every screen sharing this
676 * rule kept the old colours. */
677 .hf-toggle-input-field input[type=checkbox] {
678 background: #d5d9df;
679 border: 0;
680 border-radius: var(--hf-radius-pill, 999px);
681 box-shadow: none;
682 cursor: pointer;
683 height: 24px;
684 margin: 0;
685 min-width: 0;
686 position: relative;
687 transition: background-color var(--hf-transition-slow, .25s ease);
688 width: 42px;
689 }
690
691 .hf-toggle-input-field input[type=checkbox]:hover {
692 background: #c7ccd4;
693 }
694
695 .hf-toggle-input-field input[type=checkbox]:before {
696 background: #fff;
697 border: 0;
698 border-radius: 50%;
699 box-shadow: 0 1px 3px rgba(16, 24, 40, .3);
700 box-sizing: border-box;
701 content: "";
702 display: block;
703 height: 20px;
704 left: 2px;
705 margin: 0;
706 position: absolute;
707 top: 2px;
708 transition: transform .2s cubic-bezier(.34, 1.4, .64, 1);
709 width: 20px;
710 }
711
712 .hf-toggle-input-field input[type=checkbox]:checked {
713 background: var(--hf-accent, #2271b1);
714 }
715
716 .hf-toggle-input-field input[type=checkbox]:checked:hover {
717 background: var(--hf-accent-hover, #135e96);
718 }
719
720 .hf-toggle-input-field input[type=checkbox]:checked:before {
721 background: #fff;
722 transform: translateX(18px);
723 }
724
725 .hf-toggle-input-field input[type=checkbox]:focus-visible {
726 outline: 2px solid var(--hf-accent, #2271b1);
727 outline-offset: 2px;
728 }
729
730 /*Choosen Select*/
731 .hf-typography-fields .chosen-container-single .chosen-single {
732 min-height: 34px;
733 font-size: var(--hf-font-base);
734 line-height: 34px;
735 color: var(--hf-text);
736 border-color: var(--hf-border-strong);
737 box-shadow: none;
738 background: #fff url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E) no-repeat right 5px top 55%;
739 background-size: 16px 16px;
740 cursor: pointer;
741 padding: 0 0 0 10px;
742 border-radius: var(--hf-radius-sm);
743 }
744
745 .hf-typography-fields .chosen-container-single .chosen-single div {
746 display: none;
747 }
748
749 .hf-typography-fields .chosen-container-single .chosen-single span {
750 margin: 0 26px 0 0;
751 }
752
753 .hf-typography-fields .chosen-container-single .chosen-search input[type="text"] {
754 background: none !important;
755 padding: 5px;
756 box-shadow: none;
757 }
758
759 /* Range Slider */
760 .hf-settings-row .hf-range-slider-wrap {
761 width: 100%;
762 display: flex;
763 align-items: center;
764 position: relative;
765 }
766
767 .hf-settings-row .hf-range-slider-wrap .hf-range-slider {
768 position: relative;
769 flex-grow: 1;
770 height: 4px;
771 margin: 12px 0;
772 background: rgba(0, 0, 0, 0.15);
773 border: none;
774 border-radius: 5px;
775 cursor: pointer;
776 transition: background 0.5s;
777 }
778
779 .hf-settings-row .hf-range-slider-wrap .hf-range-slider:hover {
780 background: rgba(0, 0, 0, 0.2);
781 }
782
783 .hf-settings-row .hf-range-slider-wrap .hf-range-slider .ui-slider-range {
784 display: inline-block;
785 position: absolute;
786 top: 0;
787 height: 100%;
788 background: var(--hf-accent, #dd823b);
789 }
790
791 .hf-settings-row .hf-range-slider-wrap .hf-range-slider .ui-slider-handle {
792 height: 16px;
793 width: 16px;
794 background: #fff;
795 border: none;
796 display: inline-block;
797 position: absolute;
798 top: 50%;
799 margin: 0 0 0 -8px;
800 transform: translateY(-50%);
801 box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3);
802 border-radius: 50%;
803 cursor: pointer;
804 }
805
806 .hf-settings-row .hf-range-slider-wrap .hf-range-slider + .hf-range-input-selector {
807 margin-left: 10px;
808 width: 50px;
809 text-align: center;
810 padding-right: 0;
811 font-size: 14px;
812 font-weight: 600;
813 color: #555;
814 }
815
816 .hf-settings-row .hf-range-slider-wrap .hf-range-input-unit {
817 position: absolute;
818 left: 100%;
819 top: 50%;
820 transform: translateY(-50%);
821 margin-left: 5px;
822 }
823
824 .hf-editor-field-content .hf-range-slider-wrap {
825 width: 100%;
826 display: flex;
827 align-items: center;
828 }
829
830 .hf-editor-field-content .hf-range-slider-wrap .hf-range-slider {
831 position: relative;
832 flex-grow: 1;
833 height: 4px;
834 margin: 12px 0;
835 background: rgba(0, 0, 0, 0.15);
836 border: none;
837 border-radius: 5px;
838 cursor: pointer;
839 transition: background 0.5s;
840 }
841
842 .hf-editor-field-content .hf-range-slider-wrap .hf-range-slider:hover {
843 background: rgba(0, 0, 0, 0.2);
844 }
845
846 .hf-editor-field-content .hf-range-slider-wrap .hf-range-slider .ui-slider-range {
847 display: inline-block;
848 position: absolute;
849 top: 0;
850 height: 100%;
851 background: var(--hf-accent, #dd823b);
852 }
853
854 .hf-editor-field-content .hf-range-slider-wrap .hf-range-slider .ui-slider-handle {
855 height: 16px;
856 width: 16px;
857 background: #fff;
858 border: none;
859 display: inline-block;
860 position: absolute;
861 top: 50%;
862 margin: 0 0 0 -8px;
863 transform: translateY(-50%);
864 box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3);
865 border-radius: 50%;
866 cursor: pointer;
867 }
868
869 .hf-editor-field-content .hf-range-slider-wrap .hf-range-slider + .hf-range-input-selector {
870 margin-left: 10px;
871 margin-right: 5px;
872 width: 50px;
873 height: 28px;
874 text-align: center;
875 border-radius: 4px;
876 padding: 3px;
877 font-size: 12px;
878 font-weight: 600;
879 color: #555;
880 }
881
882 /* Shadow */
883
884 ul.hf-shadow-fields {
885 display: flex;
886 /* Shares the row with the colour swatch now, so it takes the space that
887 is left rather than a fixed 225px that pushed the swatch off the
888 panel. */
889 flex: 1 1 auto;
890 gap: 6px;
891 margin: 0;
892 min-width: 0;
893 padding: 0;
894 position: relative;
895 z-index: 9;
896 }
897
898 .hf-shadow-fields li {
899 flex: 1 1 0;
900 margin: 0;
901 min-width: 0;
902 }
903
904 .hf-shadow-fields li > label {
905 text-align: center;
906 display: block;
907 }
908
909 .hf-shadow-fields li input[type="number"] {
910 padding-left: 2px;
911 padding-right: 2px;
912 text-align: center;
913 width: 100%;
914 }
915
916 /* The four number boxes and the colour swatch are siblings, and the swatch
917 used to be dragged over them with a negative offset — far enough to land
918 on top of Blur and Spread. Laid out as a row instead. */
919 .hf-setting-fields:has(> .hf-shadow-fields) {
920 align-items: flex-start;
921 display: flex;
922 gap: var(--hf-space-2, 8px);
923 }
924
925 .hf-shadow-settings-field .hf-color-input-field {
926 margin-top: 0;
927 position: static;
928 }
929
930 /* The swatch keeps its size while the number boxes give way. */
931 .hf-setting-fields > .hf-shadow-settings-field {
932 flex: 0 0 auto;
933 }
934
935 .hf-setting-fields .hf-shadow-settings-field .wp-picker-open + .wp-picker-input-wrap {
936 margin-top: 30px;
937 }
938
939
940 /* Unit */
941
942 .hf-unit-fields {
943 display: flex;
944 gap: 6px;
945 margin: 0;
946 padding: 0;
947 }
948
949 .hf-unit-fields li {
950 display: flex;
951 flex-direction: column;
952 margin: 0;
953 min-width: 0;
954 }
955
956 .hf-unit-fields li input[type="number"] {
957 padding-left: 2px;
958 padding-right: 2px;
959 text-align: center;
960 width: 50px;
961 }
962
963 .hf-unit-fields li > label {
964 color: var(--hf-text-faint, #8c9196);
965 display: block;
966 font-size: var(--hf-font-xs, 11px);
967 margin-top: var(--hf-space-1, 4px);
968 text-align: center;
969 }
970
971 .hf-shadow-fields li > label {
972 color: var(--hf-text-faint, #8c9196);
973 display: block;
974 font-size: var(--hf-font-xs, 11px);
975 margin-top: var(--hf-space-1, 4px);
976 text-align: center;
977 }
978
979 /* Linked/unlinked is a toggle, not a filled button. It was a solid grey
980 block with a white chain — the heaviest thing in the panel, for the least
981 important control in the row. */
982 .hf-unit-fields .hf-link-button {
983 width: 50px;
984 display: flex;
985 align-items: center;
986 justify-content: center;
987 border: 1px solid var(--hf-border-strong, #d3d8e0);
988 border-radius: var(--hf-radius-sm, 4px);
989 color: var(--hf-accent, #dd823b);
990 cursor: pointer;
991 outline: none;
992 background: var(--hf-border-strong, #d3d8e0);
993 transition: background-color var(--hf-transition, .15s ease), border-color var(--hf-transition, .15s ease), color var(--hf-transition, .15s ease);
994 }
995
996 .hf-unit-fields .hf-link-button:hover {
997 border-color: var(--hf-text-faint, #8c9196);
998 }
999
1000 /* Unlinked is the quieter state: the sides are being set individually. */
1001 .hf-unit-fields.hf-not-linked .hf-link-button {
1002 background: var(--hf-surface, #fff);
1003 color: var(--hf-text-faint, #8c9196);
1004 }
1005
1006 .hf-unit-fields .hf-link-button span {
1007 align-items: center;
1008 font-size: 16px;
1009 height: 34px;
1010 justify-content: center;
1011 width: 34px;
1012 }
1013
1014 .hf-unit-fields .hf-link-button .hf-linked {
1015 display: flex;
1016 }
1017
1018 .hf-unit-fields .hf-link-button .hf-unlinked {
1019 display: none;
1020 }
1021
1022 .hf-unit-fields.hf-not-linked .hf-link-button .hf-linked {
1023 display: none;
1024 }
1025
1026 .hf-unit-fields.hf-not-linked .hf-link-button .hf-unlinked {
1027 display: flex;
1028 }
1029
1030
1031 /* Multiple Select */
1032 .hf-setting-fields .select2-container--default .select2-selection--multiple .select2-selection__clear {
1033 position: absolute;
1034 right: 0;
1035 top: 0;
1036 margin-top: 0;
1037 margin-right: 0;
1038 padding: 3px 5px;
1039 line-height: 1;
1040 }
1041
1042 .hf-setting-fields .select2-container--default .select2-selection--multiple .select2-selection__rendered {
1043 padding-right: 20px;
1044 }
1045
1046 .hf-setting-fields .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
1047 margin: 0;
1048 }
1049
1050 .hf-setting-fields .select2-container--default .select2-selection--multiple li.select2-selection__choice {
1051 background: #333;
1052 color: #FFF;
1053 border-radius: 2px;
1054 border: 0;
1055 padding: 3px 6px;
1056 margin: 5px 5px 0 0;
1057 }
1058
1059 .hf-setting-fields .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1060 color: #333;
1061 background: #FFF;
1062 border-radius: 10px;
1063 height: 14px;
1064 width: 14px;
1065 line-height: 12px;
1066 text-align: center;
1067 margin-right: 6px;
1068 }
1069
1070 .hf-setting-fields .select2-container--default .select2-search--inline .select2-search__field {
1071 min-height: 0;
1072 }
1073
1074 /* Color Picker */
1075 .hf-typography-color-field {
1076 position: relative;
1077 }
1078
1079
1080 .hf-typography-color-field .hf-typography-input-field,
1081 .hf-color-input-field {
1082 margin-top: -30px;
1083 min-width: 0;
1084 }
1085
1086 .hf-settings-row .hf-color-input-label {
1087 margin: 0 !important;
1088 padding: 5px 0 !important;
1089 }
1090
1091 /* The colour picker iris is a fixed ~257px widget sized by its own script,
1092 so it is left alone; the container just spans the row so the picker is
1093 laid out from the left rather than hung off the right edge of a 30px
1094 swatch, which pushed it past the panel. */
1095 .hf-setting-fields .wp-picker-container {
1096 align-items: flex-end;
1097 display: flex;
1098 flex-direction: column;
1099 width: 100%;
1100 }
1101
1102 .hf-setting-fields .wp-picker-container .wp-color-result.button {
1103 border: 1px solid var(--hf-border-strong, #d3d8e0);
1104 border-radius: 50%;
1105 box-shadow: none;
1106 height: 30px;
1107 margin: 0;
1108 overflow: hidden;
1109 padding: 0;
1110 width: 30px;
1111 }
1112
1113 .hf-setting-fields .wp-picker-container .wp-color-result.button:hover {
1114 border-color: var(--hf-text-faint, #8c9196);
1115 }
1116
1117 .hf-setting-fields .wp-picker-container .wp-color-result.button:focus {
1118 border-color: var(--hf-accent, #dd823b);
1119 box-shadow: 0 0 0 3px color-mix(in srgb, var(--hf-accent, #dd823b) 18%, transparent);
1120 outline: 0;
1121 }
1122
1123 /* Was a fixed 255px in a column narrower than that, so opening a picker
1124 pushed its input and Clear button out past the left edge of the panel. */
1125 .hf-setting-fields .wp-picker-open + .wp-picker-input-wrap {
1126 clear: both;
1127 display: flex;
1128 margin-top: var(--hf-space-2, 8px);
1129 min-width: 0;
1130 width: 258px;
1131 }
1132
1133 .hf-setting-fields .wp-picker-input-wrap label {
1134 flex-grow: 1;
1135 }
1136
1137 .hf-setting-fields .wp-picker-container input[type=text].wp-color-picker {
1138 width: 100% !important;
1139 }
1140
1141 .hf-setting-fields .wp-color-result-text {
1142 display: none;
1143 }
1144
1145 .hf-form-wrap .hf-form-preview {
1146 max-width: 100%;
1147 margin: 0;
1148 }
1149
1150 .hf-sticky-sidebar {
1151 padding: 15px;
1152 }
1153
1154 .hf-footer .hf-preview-close a {
1155 display: flex;
1156 align-items: center;
1157 gap: 4px;
1158 }